;------------------
sdmmc_init_device:
push r0-r12,lr
ldr r0,=sdmmc_sha1_cid ;dst ;\
ldr r1,=2FFD7BCh ;cid ;src ; SHA1 init+update+fin
mov r2,10h ;len ;
swi 27h shl 16 ;sha1 ;/
;---
ldr r9,=4004800h ;-base
ldrh r0,[r9,0e0h] ;\
bic r0,3 ; SD_SOFT_RESET clear bit0-1
strh r0,[r9,0e0h] ;/
ldrh r0,[r9,0e0h] ;\
orr r0,3 ; SD_SOFT_RESET set bit0-1
strh r0,[r9,0e0h] ;/
ldrh r0,[r9,008h] ;\
bic r0,1 ; SD_STOP_INTERNAL clear bit0
orr r0,100h ;autostop ;
strh r0,[r9,008h] ;/
ldrb r0,[sdmmc_curr_device] ;\
orr r0,400h ;bit0: 0=sd slot, 1=eMMC ; SD_CARD_PORT_SELECT
strh r0,[r9,002h] ;/
mov r0,0040h ;\SD_CARD_CLK_CTL = 0040h
;mov r0,0020h ;try affect timer...?
;mov r0,002h
mov r0,0
strh r0,[r9,024h] ;/
ldr r0,=00d0h ;\SD_CARD_OPTION = 80D0h (timeouts, buswidth)
strh r0,[r9,028h] ;/
ldrh r0,[r9,028h] ;\
orr r0,8000h ; SD_CARD_OPTION set bit15
bic r0,8000h ;clear --> want 4bit DATA mode !!!
strh r0,[r9,028h] ;/
;---part2b
ldrh r0,[r9,028h] ;\
orr r0,0100h ; SD_CARD_OPTION set bit8
strh r0,[r9,028h] ;/
ldrh r0,[r9,028h] ;\
bic r0,0100h ; SD_CARD_OPTION clear bit8
strh r0,[r9,028h] ;/
;---part3a
ldrh r0,[r9,024h] ;\
orr r0,0100h ; SD_CARD_CLK_CTL set bit8
mov r0,100h ;<-- this works, unlike ORing zero by 100h ???
;;;;add r0,40h
strh r0,[r9,024h] ;/
mov r0,002h ;\want data32 mode, step 1
strh r0,[r9,0d8h] ;SD_DATA_CTL ;/
ldr r0,=402h ;clear fifo, data32 mode ;\want data32 mode, step 2
str r0,[r9,100h] ;SD_IRQ32 ;/
pop r0-r12,pc
;------------------
sdmmc_load_sector: ;in: r0=sector, r1=dest
mov r2,200h ;len
;- - - - - --------
sdmmc_load_sectors: ;in: r0=sector, r1=dest, r2=len
push r0-r12,lr
mov r10,r0 ;sector
mov r11,r1 ;dest
mov r12,r2 ;len
ldr r9,=4004800h ;\
mov r0,r12,lsr 9 ;num_blk's = len/200h ; apply num blk's
strh r0,[r9,00ah] ;SD_NUMBLK16 ;
str r0,[r9,108h] ;SD_NUMBLK32 ;/
mov r0,200h ;\
strh r0,[r9,026h] ;SD_BLKLEN16 ; apply blk_len
str r0,[r9,104h] ;SD_BLKLEN32 ;/
ldrb r0,[sdmmc_curr_is_sdhc] ;\
cmp r0,0 ;
moveq r0,r10,lsl 9 ;sector*200h (SDSC) ; issue READ_MULTIPLE
movne r0,r10 ;sector (SDHC/SDXC) ;
mov r1,12h ;CMD18 READ_MULTIPLE ;
bl sdmmc_read_register ;/
@@blk_lop: ;-lop blk's...
mov r1,r11 ;dest ;\
mov r2,200h ;len ; read sector
bl sdmmc_read_data ;/
ldrb r0,[sdmmc_curr_device] ;\
cmp r0,1 ;1=eMMC (need decrypt) ; decrypt (if eMMC)
mov r0,r10 ;sector ;
mov r1,r11 ;src/dst ;
bleq sdmmc_decrypt_sector ;/
add r10,1 ;sector ;\
add r11,200h ;dest ; lop next blk
subs r12,200h ;len ;
bne @@blk_lop ;/
; mov r0,0001h shl 16 ;XXX RCA ;\
; mov r1,0dh ;CMD13 SEND_STATUS ; issue GET_STATUS
; bl sdmmc_read_register ;/ XXX for SD: need other RCA?
pop r0-r12,pc
;------------------
sdmmc_write_sector: ;in: r0=sector, r1=src
mov r2,200h ;len
;- - - - - --------
sdmmc_write_sectors: ;in: r0=sector, r1=src, r2=len
push r0-r12,lr
mov r10,r0 ;sector
mov r11,r1 ;src
mov r12,r2 ;len
ldr r9,=4004800h ;\
mov r0,r12,lsr 9 ;num_blk's = len/200h ; apply num blk's
strh r0,[r9,00ah] ;SD_NUMBLK16 ;
str r0,[r9,108h] ;SD_NUMBLK32 ;/
mov r0,200h ;\
strh r0,[r9,026h] ;SD_BLKLEN16 ; apply blk_len
str r0,[r9,104h] ;SD_BLKLEN32 ;/
ldrb r0,[sdmmc_curr_is_sdhc] ;\
cmp r0,0 ;
moveq r0,r10,lsl 9 ;sector*200h (SDSC) ; issue WRITE_MULTIPLE
movne r0,r10 ;sector (SDHC/SDXC) ;
mov r1,19h ;CMD25 WRITE_MULTIPLE ;
bl sdmmc_read_register ;/
@@blk_lop: ;-lop blk's...
ldrb r0,[sdmmc_curr_device] ;\
cmp r0,1 ;1=eMMC (need decrypt) ; encrypt (if eMMC)
mov r0,r10 ;sector ;
mov r1,r11 ;src/dst ;
bleq sdmmc_encrypt_sector ;/
mov r1,r11 ;src ;\
mov r2,200h ;len ; write sector
bl sdmmc_write_data ;/
add r10,1 ;sector ;\
add r11,200h ;dest ; lop next blk
subs r12,200h ;len ;
bne @@blk_lop ;/
; mov r0,0001h shl 16 ;XXX RCA ;\
; mov r1,0dh ;CMD13 SEND_STATUS ; issue GET_STATUS
; bl sdmmc_read_register ;/ XXX for SD: need other RCA?
pop r0-r12,pc