Commit 1b0889958e875df85c7b2353498ed2cac16415ce

Authored by balrog
1 parent a1daafd8

Implement SD CMD8 and R7 from the newer SD Physical Spec Version 2.00.

Remove bogus setting of bits 63 of R2 type responses.
Make some constants static to allow definitions by the same name for SDIO.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3850 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 38 additions and 5 deletions
@@ -49,6 +49,7 @@ typedef enum { @@ -49,6 +49,7 @@ typedef enum {
49 sd_r2_s, /* CSD register */ 49 sd_r2_s, /* CSD register */
50 sd_r3, /* OCR register */ 50 sd_r3, /* OCR register */
51 sd_r6 = 6, /* Published RCA response */ 51 sd_r6 = 6, /* Published RCA response */
  52 + sd_r7, /* Operating voltage */
52 sd_r1b = -1, 53 sd_r1b = -1,
53 } sd_rsp_type_t; 54 } sd_rsp_type_t;
54 55
@@ -77,6 +78,7 @@ struct SDState { @@ -77,6 +78,7 @@ struct SDState {
77 uint16_t rca; 78 uint16_t rca;
78 uint32_t card_status; 79 uint32_t card_status;
79 uint8_t sd_status[64]; 80 uint8_t sd_status[64];
  81 + uint32_t vhs;
80 int wp_switch; 82 int wp_switch;
81 int *wp_groups; 83 int *wp_groups;
82 uint32_t size; 84 uint32_t size;
@@ -126,9 +128,9 @@ static void sd_set_status(SDState *sd) @@ -126,9 +128,9 @@ static void sd_set_status(SDState *sd)
126 sd->card_status |= sd->state << 9; 128 sd->card_status |= sd->state << 9;
127 } 129 }
128 130
129 -const sd_cmd_type_t sd_cmd_type[64] = { 131 +static const sd_cmd_type_t sd_cmd_type[64] = {
130 sd_bc, sd_none, sd_bcr, sd_bcr, sd_none, sd_none, sd_none, sd_ac, 132 sd_bc, sd_none, sd_bcr, sd_bcr, sd_none, sd_none, sd_none, sd_ac,
131 - sd_none, sd_ac, sd_ac, sd_adtc, sd_ac, sd_ac, sd_none, sd_ac, 133 + sd_bcr, sd_ac, sd_ac, sd_adtc, sd_ac, sd_ac, sd_none, sd_ac,
132 sd_ac, sd_adtc, sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none, 134 sd_ac, sd_adtc, sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none,
133 sd_adtc, sd_adtc, sd_adtc, sd_adtc, sd_ac, sd_ac, sd_adtc, sd_none, 135 sd_adtc, sd_adtc, sd_adtc, sd_adtc, sd_ac, sd_ac, sd_adtc, sd_none,
134 sd_ac, sd_ac, sd_none, sd_none, sd_none, sd_none, sd_ac, sd_none, 136 sd_ac, sd_ac, sd_none, sd_none, sd_none, sd_none, sd_ac, sd_none,
@@ -137,7 +139,7 @@ const sd_cmd_type_t sd_cmd_type[64] = { @@ -137,7 +139,7 @@ const sd_cmd_type_t sd_cmd_type[64] = {
137 sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, 139 sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none,
138 }; 140 };
139 141
140 -const sd_cmd_type_t sd_acmd_type[64] = { 142 +static const sd_cmd_type_t sd_acmd_type[64] = {
141 sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_ac, sd_none, 143 sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_ac, sd_none,
142 sd_none, sd_none, sd_none, sd_none, sd_none, sd_adtc, sd_none, sd_none, 144 sd_none, sd_none, sd_none, sd_none, sd_none, sd_adtc, sd_none, sd_none,
143 sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_adtc, sd_ac, 145 sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_adtc, sd_ac,
@@ -190,6 +192,7 @@ static uint16_t sd_crc16(void *message, size_t width) @@ -190,6 +192,7 @@ static uint16_t sd_crc16(void *message, size_t width)
190 192
191 static void sd_set_ocr(SDState *sd) 193 static void sd_set_ocr(SDState *sd)
192 { 194 {
  195 + /* All voltages OK, card power-up OK, Standard Capacity SD Memory Card */
193 sd->ocr = 0x80ffff80; 196 sd->ocr = 0x80ffff80;
194 } 197 }
195 198
@@ -349,6 +352,14 @@ static void sd_response_r6_make(SDState *sd, uint8_t *response) @@ -349,6 +352,14 @@ static void sd_response_r6_make(SDState *sd, uint8_t *response)
349 response[3] = status & 0xff; 352 response[3] = status & 0xff;
350 } 353 }
351 354
  355 +static void sd_response_r7_make(SDState *sd, uint8_t *response)
  356 +{
  357 + response[0] = (sd->vhs >> 24) & 0xff;
  358 + response[1] = (sd->vhs >> 16) & 0xff;
  359 + response[2] = (sd->vhs >> 8) & 0xff;
  360 + response[3] = (sd->vhs >> 0) & 0xff;
  361 +}
  362 +
352 static void sd_reset(SDState *sd, BlockDriverState *bdrv) 363 static void sd_reset(SDState *sd, BlockDriverState *bdrv)
353 { 364 {
354 uint32_t size; 365 uint32_t size;
@@ -685,6 +696,25 @@ static sd_rsp_type_t sd_normal_command(SDState *sd, @@ -685,6 +696,25 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
685 } 696 }
686 break; 697 break;
687 698
  699 + case 8: /* CMD8: SEND_IF_COND */
  700 + /* Physical Layer Specification Version 2.00 command */
  701 + switch (sd->state) {
  702 + case sd_idle_state:
  703 + sd->vhs = 0;
  704 +
  705 + /* No response if not exactly one VHS bit is set. */
  706 + if (!(req.arg >> 8) || (req.arg >> ffs(req.arg & ~0xff)))
  707 + return sd->spi ? sd_r7 : sd_r0;
  708 +
  709 + /* Accept. */
  710 + sd->vhs = req.arg;
  711 + return sd_r7;
  712 +
  713 + default:
  714 + break;
  715 + }
  716 + break;
  717 +
688 case 9: /* CMD9: SEND_CSD */ 718 case 9: /* CMD9: SEND_CSD */
689 switch (sd->state) { 719 switch (sd->state) {
690 case sd_standby_state: 720 case sd_standby_state:
@@ -1238,13 +1268,11 @@ int sd_do_command(SDState *sd, struct sd_request_s *req, @@ -1238,13 +1268,11 @@ int sd_do_command(SDState *sd, struct sd_request_s *req,
1238 1268
1239 case sd_r2_i: 1269 case sd_r2_i:
1240 memcpy(response, sd->cid, sizeof(sd->cid)); 1270 memcpy(response, sd->cid, sizeof(sd->cid));
1241 - response[7] |= 1;  
1242 rsplen = 16; 1271 rsplen = 16;
1243 break; 1272 break;
1244 1273
1245 case sd_r2_s: 1274 case sd_r2_s:
1246 memcpy(response, sd->csd, sizeof(sd->csd)); 1275 memcpy(response, sd->csd, sizeof(sd->csd));
1247 - response[7] |= 1;  
1248 rsplen = 16; 1276 rsplen = 16;
1249 break; 1277 break;
1250 1278
@@ -1258,6 +1286,11 @@ int sd_do_command(SDState *sd, struct sd_request_s *req, @@ -1258,6 +1286,11 @@ int sd_do_command(SDState *sd, struct sd_request_s *req,
1258 rsplen = 4; 1286 rsplen = 4;
1259 break; 1287 break;
1260 1288
  1289 + case sd_r7:
  1290 + sd_response_r7_make(sd, response);
  1291 + rsplen = 4;
  1292 + break;
  1293 +
1261 case sd_r0: 1294 case sd_r0:
1262 default: 1295 default:
1263 rsplen = 0; 1296 rsplen = 0;