collapseos/recipes/rc2014/sdcard/sdinit.asm
2019-05-07 16:38:08 -04:00

82 lines
1.4 KiB
NASM

#include "jumptable.inc"
.org 0x9000
call JUMP_SDCWAKEUP
; We expect a 0x01 R1 response
ld hl, sCmd0
call JUMP_PRINTSTR
ld a, 0b01000000 ; CMD0
ld hl, 0
ld de, 0
ld c, 0x95
call JUMP_SDCCMDR1
cp 0x01
jr nz, .error
ld hl, sOk
call JUMP_PRINTSTR
; We expect a 0x01 R1 response followed by 0x0001aa R7 response
ld hl, sCmd8
call JUMP_PRINTSTR
ld a, 0b01001000 ; CMD8
ld hl, 0
ld de, 0x01aa
ld c, 0x87
call JUMP_SDCCMDR7
ld a, h
cp 0
jr nz, .error
ld a, l
cp 0
jr nz, .error
ld a, d
cp 0x01
jr nz, .error
ld a, e
cp 0xaa
jr nz, .error
ld hl, sOk
call JUMP_PRINTSTR
; Now we need to repeatedly run CMD55+CMD41 (0x40000000) until we
; the card goes out of idle mode, that is, when it stops sending us
; 0x01 response and send us 0x00 instead. Any other response means that
; initialization failed.
ld hl, sCmd41
call JUMP_PRINTSTR
.loop:
ld a, 0b01110111 ; CMD55
ld hl, 0
ld de, 0
call JUMP_SDCCMDR1
cp 0x01
jr nz, .error
ld a, 0b01101001 ; CMD41 (0x40000000)
ld hl, 0x4000
ld de, 0x0000
call JUMP_SDCCMDR1
cp 0x01
jr z, .loop
cp 0
jr nz, .error
; Success! out of idle mode!
ld hl, sOk
call JUMP_PRINTSTR
ret
.error:
ld hl, sErr
call JUMP_PRINTSTR
ret
sCmd0:
.db "Sending CMD0", 0xa, 0xd, 0
sCmd8:
.db "Sending CMD8", 0xa, 0xd, 0
sCmd41:
.db "Sending CMD41", 0xa, 0xd, 0
sOk:
.db "Ok", 0xa, 0xd, 0
sErr:
.db "Err", 0xa, 0xd, 0