Add software support for sd response codes

Polls the sd controller until the read flag is set, at which point it
reads 32 bits of data from the controller.

long response codes (such as CID) are not supported in hw or sw.
This commit is contained in:
Byron Lathi
2022-04-10 23:18:26 -05:00
parent f5f1d7ccc6
commit 9eaa6c49f9
3 changed files with 68 additions and 18 deletions

View File

@@ -9,6 +9,7 @@
int main() { int main() {
int i; int i;
uint8_t sw; uint8_t sw;
uint32_t resp;
char s[16]; char s[16];
s[15] = 0; s[15] = 0;
@@ -51,16 +52,40 @@ int main() {
// The RCA is hard coded for the one that I have on hand as responses // The RCA is hard coded for the one that I have on hand as responses
// are not implemented yet. // are not implemented yet.
sd_card_command(0, 0); sd_card_command(0, 0);
sd_card_command(0x000001aa, 8); sd_card_command(0x000001aa, 8);
sd_card_resp(&resp);
cprintf("CMD8: %lx\n", resp);
sd_card_command(0, 55); sd_card_command(0, 55);
sd_card_command(0x40180000, 41); sd_card_command(0x40180000, 41);
sd_card_resp(&resp);
cprintf("CMD41: %lx\n", resp);
sd_card_command(0, 55); sd_card_command(0, 55);
sd_card_command(0x40180000, 41); sd_card_command(0x40180000, 41);
sd_card_resp(&resp);
cprintf("CMD41: %lx\n", resp);
sd_card_command(0, 2); sd_card_command(0, 2);
sd_card_resp(&resp);
cprintf("CMD2: %lx\n", resp);
sd_card_command(0, 3); sd_card_command(0, 3);
sd_card_resp(&resp);
cprintf("CMD3: %lx\n", resp);
sd_card_command(0x59b40000, 7); sd_card_command(0x59b40000, 7);
sd_card_resp(&resp);
cprintf("CMD7: %lx\n", resp);
sd_card_command(0x59b41000, 13); sd_card_command(0x59b41000, 13);
sd_card_resp(&resp);
cprintf("CMD13: %lx\n", resp);
sd_card_command(0, 17); sd_card_command(0, 17);
sd_card_resp(&resp);
cprintf("CMD17: %lx\n", resp);
while (1) { while (1) {

View File

@@ -5,4 +5,6 @@
void sd_card_command(uint32_t arg, uint8_t cmd); void sd_card_command(uint32_t arg, uint8_t cmd);
void sd_card_resp(uint32_t* resp);
#endif #endif

View File

@@ -1,8 +1,9 @@
.include "io.inc65" .include "io.inc65"
.importzp sp, sreg .importzp sp, sreg, ptr1
.export _sd_card_command .export _sd_card_command
.export _sd_card_resp
.autoimport on .autoimport on
@@ -25,3 +26,25 @@ _sd_card_command:
pla pla
sta SD_CMD sta SD_CMD
rts rts
; void sd_card_resp(uint32_t* resp);
_sd_card_resp:
phy
sta ptr1 ; store pointer
stx ptr1+1
@1: lda SD_CMD ; wait for status flag
beq @1
lda SD_ARG
ldy #$0
sta (ptr1),y
lda SD_ARG+1
iny
sta (ptr1),y
lda SD_ARG+2
iny
sta (ptr1),y
lda SD_ARG+3
iny
sta (ptr1),y
ply
rts