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 49 sd_r2_s, /* CSD register */
50 50 sd_r3, /* OCR register */
51 51 sd_r6 = 6, /* Published RCA response */
  52 + sd_r7, /* Operating voltage */
52 53 sd_r1b = -1,
53 54 } sd_rsp_type_t;
54 55  
... ... @@ -77,6 +78,7 @@ struct SDState {
77 78 uint16_t rca;
78 79 uint32_t card_status;
79 80 uint8_t sd_status[64];
  81 + uint32_t vhs;
80 82 int wp_switch;
81 83 int *wp_groups;
82 84 uint32_t size;
... ... @@ -126,9 +128,9 @@ static void sd_set_status(SDState *sd)
126 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 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 134 sd_ac, sd_adtc, sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none,
133 135 sd_adtc, sd_adtc, sd_adtc, sd_adtc, sd_ac, sd_ac, sd_adtc, sd_none,
134 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 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 143 sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_ac, sd_none,
142 144 sd_none, sd_none, sd_none, sd_none, sd_none, sd_adtc, sd_none, sd_none,
143 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 192  
191 193 static void sd_set_ocr(SDState *sd)
192 194 {
  195 + /* All voltages OK, card power-up OK, Standard Capacity SD Memory Card */
193 196 sd->ocr = 0x80ffff80;
194 197 }
195 198  
... ... @@ -349,6 +352,14 @@ static void sd_response_r6_make(SDState *sd, uint8_t *response)
349 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 363 static void sd_reset(SDState *sd, BlockDriverState *bdrv)
353 364 {
354 365 uint32_t size;
... ... @@ -685,6 +696,25 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
685 696 }
686 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 718 case 9: /* CMD9: SEND_CSD */
689 719 switch (sd->state) {
690 720 case sd_standby_state:
... ... @@ -1238,13 +1268,11 @@ int sd_do_command(SDState *sd, struct sd_request_s *req,
1238 1268  
1239 1269 case sd_r2_i:
1240 1270 memcpy(response, sd->cid, sizeof(sd->cid));
1241   - response[7] |= 1;
1242 1271 rsplen = 16;
1243 1272 break;
1244 1273  
1245 1274 case sd_r2_s:
1246 1275 memcpy(response, sd->csd, sizeof(sd->csd));
1247   - response[7] |= 1;
1248 1276 rsplen = 16;
1249 1277 break;
1250 1278  
... ... @@ -1258,6 +1286,11 @@ int sd_do_command(SDState *sd, struct sd_request_s *req,
1258 1286 rsplen = 4;
1259 1287 break;
1260 1288  
  1289 + case sd_r7:
  1290 + sd_response_r7_make(sd, response);
  1291 + rsplen = 4;
  1292 + break;
  1293 +
1261 1294 case sd_r0:
1262 1295 default:
1263 1296 rsplen = 0;
... ...