@@ -87,6 +87,7 @@ struct SDState {
8787 int pwd_len ;
8888 int function_group [6 ];
8989
90+ int spi ;
9091 int current_cmd ;
9192 int blk_written ;
9293 uint32_t data_start ;
@@ -395,11 +396,16 @@ static void sd_cardchange(void *opaque)
395396 }
396397}
397398
398- SDState * sd_init (BlockDriverState * bs )
399+ /* We do not model the chip select pin, so allow the board to select
400+ whether card should be in SSI ot MMC/SD mode. It is also up to the
401+ board to ensure that ssi transfers only occur when the chip select
402+ is asserted. */
403+ SDState * sd_init (BlockDriverState * bs , int is_spi )
399404{
400405 SDState * sd ;
401406
402407 sd = (SDState * ) qemu_mallocz (sizeof (SDState ));
408+ sd -> spi = is_spi ;
403409 sd_reset (sd , bs );
404410 bdrv_set_change_cb (sd -> bdrv , sd_cardchange , sd );
405411 return sd ;
@@ -567,16 +573,25 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
567573 case 0 : /* CMD0: GO_IDLE_STATE */
568574 switch (sd -> state ) {
569575 case sd_inactive_state :
570- return sd_r0 ;
576+ return sd -> spi ? sd_r1 : sd_r0 ;
571577
572578 default :
573579 sd -> state = sd_idle_state ;
574580 sd_reset (sd , sd -> bdrv );
575- return sd_r0 ;
581+ return sd -> spi ? sd_r1 : sd_r0 ;
576582 }
577583 break ;
578584
585+ case 1 : /* CMD1: SEND_OP_CMD */
586+ if (!sd -> spi )
587+ goto bad_cmd ;
588+
589+ sd -> state = sd_transfer_state ;
590+ return sd_r1 ;
591+
579592 case 2 : /* CMD2: ALL_SEND_CID */
593+ if (sd -> spi )
594+ goto bad_cmd ;
580595 switch (sd -> state ) {
581596 case sd_ready_state :
582597 sd -> state = sd_identification_state ;
@@ -588,6 +603,8 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
588603 break ;
589604
590605 case 3 : /* CMD3: SEND_RELATIVE_ADDR */
606+ if (sd -> spi )
607+ goto bad_cmd ;
591608 switch (sd -> state ) {
592609 case sd_identification_state :
593610 case sd_standby_state :
@@ -601,6 +618,8 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
601618 break ;
602619
603620 case 4 : /* CMD4: SEND_DSR */
621+ if (sd -> spi )
622+ goto bad_cmd ;
604623 switch (sd -> state ) {
605624 case sd_standby_state :
606625 break ;
@@ -611,6 +630,8 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
611630 break ;
612631
613632 case 6 : /* CMD6: SWITCH_FUNCTION */
633+ if (sd -> spi )
634+ goto bad_cmd ;
614635 switch (sd -> mode ) {
615636 case sd_data_transfer_mode :
616637 sd_function_switch (sd , req .arg );
@@ -625,6 +646,8 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
625646 break ;
626647
627648 case 7 : /* CMD7: SELECT/DESELECT_CARD */
649+ if (sd -> spi )
650+ goto bad_cmd ;
628651 switch (sd -> state ) {
629652 case sd_standby_state :
630653 if (sd -> rca != rca )
@@ -668,6 +691,15 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
668691
669692 return sd_r2_s ;
670693
694+ case sd_transfer_state :
695+ if (!sd -> spi )
696+ break ;
697+ sd -> state = sd_sendingdata_state ;
698+ memcpy (sd -> data , sd -> csd , 16 );
699+ sd -> data_start = req .arg ;
700+ sd -> data_offset = 0 ;
701+ return sd_r1 ;
702+
671703 default :
672704 break ;
673705 }
@@ -681,12 +713,23 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
681713
682714 return sd_r2_i ;
683715
716+ case sd_transfer_state :
717+ if (!sd -> spi )
718+ break ;
719+ sd -> state = sd_sendingdata_state ;
720+ memcpy (sd -> data , sd -> cid , 16 );
721+ sd -> data_start = req .arg ;
722+ sd -> data_offset = 0 ;
723+ return sd_r1 ;
724+
684725 default :
685726 break ;
686727 }
687728 break ;
688729
689730 case 11 : /* CMD11: READ_DAT_UNTIL_STOP */
731+ if (sd -> spi )
732+ goto bad_cmd ;
690733 switch (sd -> state ) {
691734 case sd_transfer_state :
692735 sd -> state = sd_sendingdata_state ;
@@ -733,6 +776,8 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
733776 break ;
734777
735778 case 15 : /* CMD15: GO_INACTIVE_STATE */
779+ if (sd -> spi )
780+ goto bad_cmd ;
736781 switch (sd -> mode ) {
737782 case sd_data_transfer_mode :
738783 if (sd -> rca != rca )
@@ -796,8 +841,13 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
796841
797842 /* Block write commands (Class 4) */
798843 case 24 : /* CMD24: WRITE_SINGLE_BLOCK */
844+ if (sd -> spi )
845+ goto unimplemented_cmd ;
799846 switch (sd -> state ) {
800847 case sd_transfer_state :
848+ /* Writing in SPI mode not implemented. */
849+ if (sd -> spi )
850+ break ;
801851 sd -> state = sd_receivingdata_state ;
802852 sd -> data_start = req .arg ;
803853 sd -> data_offset = 0 ;
@@ -817,8 +867,13 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
817867 break ;
818868
819869 case 25 : /* CMD25: WRITE_MULTIPLE_BLOCK */
870+ if (sd -> spi )
871+ goto unimplemented_cmd ;
820872 switch (sd -> state ) {
821873 case sd_transfer_state :
874+ /* Writing in SPI mode not implemented. */
875+ if (sd -> spi )
876+ break ;
822877 sd -> state = sd_receivingdata_state ;
823878 sd -> data_start = req .arg ;
824879 sd -> data_offset = 0 ;
@@ -838,6 +893,8 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
838893 break ;
839894
840895 case 26 : /* CMD26: PROGRAM_CID */
896+ if (sd -> spi )
897+ goto bad_cmd ;
841898 switch (sd -> state ) {
842899 case sd_transfer_state :
843900 sd -> state = sd_receivingdata_state ;
@@ -851,6 +908,8 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
851908 break ;
852909
853910 case 27 : /* CMD27: PROGRAM_CSD */
911+ if (sd -> spi )
912+ goto unimplemented_cmd ;
854913 switch (sd -> state ) {
855914 case sd_transfer_state :
856915 sd -> state = sd_receivingdata_state ;
@@ -962,6 +1021,8 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
9621021
9631022 /* Lock card commands (Class 7) */
9641023 case 42 : /* CMD42: LOCK_UNLOCK */
1024+ if (sd -> spi )
1025+ goto unimplemented_cmd ;
9651026 switch (sd -> state ) {
9661027 case sd_transfer_state :
9671028 sd -> state = sd_receivingdata_state ;
@@ -1000,10 +1061,17 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
10001061 break ;
10011062
10021063 default :
1064+ bad_cmd :
10031065 sd -> card_status |= ILLEGAL_COMMAND ;
10041066
10051067 printf ("SD: Unknown CMD%i\n" , req .cmd );
10061068 return sd_r0 ;
1069+
1070+ unimplemented_cmd :
1071+ /* Commands that are recognised but not yet implemented in SPI mode. */
1072+ sd -> card_status |= ILLEGAL_COMMAND ;
1073+ printf ("SD: CMD%i not implemented in SPI mode\n" , req .cmd );
1074+ return sd_r0 ;
10071075 }
10081076
10091077 sd -> card_status |= ILLEGAL_COMMAND ;
@@ -1069,6 +1137,11 @@ static sd_rsp_type_t sd_app_command(SDState *sd,
10691137 break ;
10701138
10711139 case 41 : /* ACMD41: SD_APP_OP_COND */
1140+ if (sd -> spi ) {
1141+ /* SEND_OP_CMD */
1142+ sd -> state = sd_transfer_state ;
1143+ return sd_r1 ;
1144+ }
10721145 switch (sd -> state ) {
10731146 case sd_idle_state :
10741147 /* We accept any voltage. 10000 V is nothing. */
@@ -1414,6 +1487,14 @@ uint8_t sd_read_data(SDState *sd)
14141487 sd -> state = sd_transfer_state ;
14151488 break ;
14161489
1490+ case 9 : /* CMD9: SEND_CSD */
1491+ case 10 : /* CMD10: SEND_CID */
1492+ ret = sd -> data [sd -> data_offset ++ ];
1493+
1494+ if (sd -> data_offset >= 16 )
1495+ sd -> state = sd_transfer_state ;
1496+ break ;
1497+
14171498 case 11 : /* CMD11: READ_DAT_UNTIL_STOP */
14181499 if (sd -> data_offset == 0 )
14191500 BLK_READ_BLOCK (sd -> data_start , sd -> blk_len );
0 commit comments