Add statics and missing #includes for prototypes.
[qemu/mini2440.git] / hw / sd.c
blob8b481e6f0c95ded0b7cfa2ef4373d0c9e50936fb
1 /*
2 * SD Memory Card emulation as defined in the "SD Memory Card Physical
3 * layer specification, Version 1.10."
5 * Copyright (c) 2006 Andrzej Zaborowski <balrog@zabor.org>
6 * Copyright (c) 2007 CodeSourcery
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in
16 * the documentation and/or other materials provided with the
17 * distribution.
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''
20 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
22 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
27 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 #include "hw.h"
33 #include "block.h"
34 #include "sd.h"
36 //#define DEBUG_SD 1
38 #ifdef DEBUG_SD
39 #define DPRINTF(fmt, args...) \
40 do { printf("SD: " fmt , ##args); } while (0)
41 #else
42 #define DPRINTF(fmt, args...) do {} while(0)
43 #endif
45 typedef enum {
46 sd_r0 = 0, /* no response */
47 sd_r1, /* normal response command */
48 sd_r2_i, /* CID register */
49 sd_r2_s, /* CSD register */
50 sd_r3, /* OCR register */
51 sd_r6 = 6, /* Published RCA response */
52 sd_r1b = -1,
53 } sd_rsp_type_t;
55 struct SDState {
56 enum {
57 sd_inactive,
58 sd_card_identification_mode,
59 sd_data_transfer_mode,
60 } mode;
61 enum {
62 sd_inactive_state = -1,
63 sd_idle_state = 0,
64 sd_ready_state,
65 sd_identification_state,
66 sd_standby_state,
67 sd_transfer_state,
68 sd_sendingdata_state,
69 sd_receivingdata_state,
70 sd_programming_state,
71 sd_disconnect_state,
72 } state;
73 uint32_t ocr;
74 uint8_t scr[8];
75 uint8_t cid[16];
76 uint8_t csd[16];
77 uint16_t rca;
78 uint32_t card_status;
79 uint8_t sd_status[64];
80 int wp_switch;
81 int *wp_groups;
82 uint32_t size;
83 int blk_len;
84 uint32_t erase_start;
85 uint32_t erase_end;
86 uint8_t pwd[16];
87 int pwd_len;
88 int function_group[6];
90 int current_cmd;
91 int blk_written;
92 uint32_t data_start;
93 uint32_t data_offset;
94 uint8_t data[512];
95 qemu_irq readonly_cb;
96 qemu_irq inserted_cb;
97 BlockDriverState *bdrv;
100 static void sd_set_status(SDState *sd)
102 switch (sd->state) {
103 case sd_inactive_state:
104 sd->mode = sd_inactive;
105 break;
107 case sd_idle_state:
108 case sd_ready_state:
109 case sd_identification_state:
110 sd->mode = sd_card_identification_mode;
111 break;
113 case sd_standby_state:
114 case sd_transfer_state:
115 case sd_sendingdata_state:
116 case sd_receivingdata_state:
117 case sd_programming_state:
118 case sd_disconnect_state:
119 sd->mode = sd_data_transfer_mode;
120 break;
123 sd->card_status &= ~CURRENT_STATE;
124 sd->card_status |= sd->state << 9;
127 const sd_cmd_type_t sd_cmd_type[64] = {
128 sd_bc, sd_none, sd_bcr, sd_bcr, sd_none, sd_none, sd_none, sd_ac,
129 sd_none, sd_ac, sd_ac, sd_adtc, sd_ac, sd_ac, sd_none, sd_ac,
130 sd_ac, sd_adtc, sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none,
131 sd_adtc, sd_adtc, sd_adtc, sd_adtc, sd_ac, sd_ac, sd_adtc, sd_none,
132 sd_ac, sd_ac, sd_none, sd_none, sd_none, sd_none, sd_ac, sd_none,
133 sd_none, sd_none, sd_bc, sd_none, sd_none, sd_none, sd_none, sd_none,
134 sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_ac,
135 sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none,
138 const sd_cmd_type_t sd_acmd_type[64] = {
139 sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_ac, sd_none,
140 sd_none, sd_none, sd_none, sd_none, sd_none, sd_adtc, sd_none, sd_none,
141 sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_adtc, sd_ac,
142 sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none,
143 sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none,
144 sd_none, sd_bcr, sd_ac, sd_none, sd_none, sd_none, sd_none, sd_none,
145 sd_none, sd_none, sd_none, sd_adtc, sd_none, sd_none, sd_none, sd_none,
146 sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none,
149 static const int sd_cmd_class[64] = {
150 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 1, 0, 0, 0, 0,
151 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 6, 6, 6, 6,
152 5, 5, 10, 10, 10, 10, 5, 9, 9, 9, 7, 7, 7, 7, 7, 7,
153 7, 7, 10, 7, 9, 9, 9, 8, 8, 10, 8, 8, 8, 8, 8, 8,
156 static uint8_t sd_crc7(void *message, size_t width)
158 int i, bit;
159 uint8_t shift_reg = 0x00;
160 uint8_t *msg = (uint8_t *) message;
162 for (i = 0; i < width; i ++, msg ++)
163 for (bit = 7; bit >= 0; bit --) {
164 shift_reg <<= 1;
165 if ((shift_reg >> 7) ^ ((*msg >> bit) & 1))
166 shift_reg ^= 0x89;
169 return shift_reg;
172 static uint16_t sd_crc16(void *message, size_t width)
174 int i, bit;
175 uint16_t shift_reg = 0x0000;
176 uint16_t *msg = (uint16_t *) message;
177 width <<= 1;
179 for (i = 0; i < width; i ++, msg ++)
180 for (bit = 15; bit >= 0; bit --) {
181 shift_reg <<= 1;
182 if ((shift_reg >> 15) ^ ((*msg >> bit) & 1))
183 shift_reg ^= 0x1011;
186 return shift_reg;
189 static void sd_set_ocr(SDState *sd)
191 sd->ocr = 0x80fffff0;
194 static void sd_set_scr(SDState *sd)
196 sd->scr[0] = 0x00; /* SCR Structure */
197 sd->scr[1] = 0x2f; /* SD Security Support */
198 sd->scr[2] = 0x00;
199 sd->scr[3] = 0x00;
200 sd->scr[4] = 0x00;
201 sd->scr[5] = 0x00;
202 sd->scr[6] = 0x00;
203 sd->scr[7] = 0x00;
206 #define MID 0xaa
207 #define OID "XY"
208 #define PNM "QEMU!"
209 #define PRV 0x01
210 #define MDT_YR 2006
211 #define MDT_MON 2
213 static void sd_set_cid(SDState *sd)
215 sd->cid[0] = MID; /* Fake card manufacturer ID (MID) */
216 sd->cid[1] = OID[0]; /* OEM/Application ID (OID) */
217 sd->cid[2] = OID[1];
218 sd->cid[3] = PNM[0]; /* Fake product name (PNM) */
219 sd->cid[4] = PNM[1];
220 sd->cid[5] = PNM[2];
221 sd->cid[6] = PNM[3];
222 sd->cid[7] = PNM[4];
223 sd->cid[8] = PRV; /* Fake product revision (PRV) */
224 sd->cid[9] = 0xde; /* Fake serial number (PSN) */
225 sd->cid[10] = 0xad;
226 sd->cid[11] = 0xbe;
227 sd->cid[12] = 0xef;
228 sd->cid[13] = 0x00 | /* Manufacture date (MDT) */
229 ((MDT_YR - 2000) / 10);
230 sd->cid[14] = ((MDT_YR % 10) << 4) | MDT_MON;
231 sd->cid[15] = (sd_crc7(sd->cid, 15) << 1) | 1;
234 #define HWBLOCK_SHIFT 9 /* 512 bytes */
235 #define SECTOR_SHIFT 5 /* 16 kilobytes */
236 #define WPGROUP_SHIFT 7 /* 2 megs */
237 #define CMULT_SHIFT 9 /* 512 times HWBLOCK_SIZE */
238 #define BLOCK_SIZE (1 << (HWBLOCK_SHIFT))
239 #define SECTOR_SIZE (1 << (HWBLOCK_SHIFT + SECTOR_SHIFT))
240 #define WPGROUP_SIZE (1 << (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT))
242 static const uint8_t sd_csd_rw_mask[16] = {
243 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
244 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfe,
247 static void sd_set_csd(SDState *sd, uint32_t size)
249 uint32_t csize = (size >> (CMULT_SHIFT + HWBLOCK_SHIFT)) - 1;
250 uint32_t sectsize = (1 << (SECTOR_SHIFT + 1)) - 1;
251 uint32_t wpsize = (1 << (WPGROUP_SHIFT + 1)) - 1;
253 sd->csd[0] = 0x00; /* CSD structure */
254 sd->csd[1] = 0x26; /* Data read access-time-1 */
255 sd->csd[2] = 0x00; /* Data read access-time-2 */
256 sd->csd[3] = 0x5a; /* Max. data transfer rate */
257 sd->csd[4] = 0x5f; /* Card Command Classes */
258 sd->csd[5] = 0x50 | /* Max. read data block length */
259 HWBLOCK_SHIFT;
260 sd->csd[6] = 0xe0 | /* Partial block for read allowed */
261 ((csize >> 10) & 0x03);
262 sd->csd[7] = 0x00 | /* Device size */
263 ((csize >> 2) & 0xff);
264 sd->csd[8] = 0x3f | /* Max. read current */
265 ((csize << 6) & 0xc0);
266 sd->csd[9] = 0xfc | /* Max. write current */
267 ((CMULT_SHIFT - 2) >> 1);
268 sd->csd[10] = 0x40 | /* Erase sector size */
269 (((CMULT_SHIFT - 2) << 7) & 0x80) | (sectsize >> 1);
270 sd->csd[11] = 0x00 | /* Write protect group size */
271 ((sectsize << 7) & 0x80) | wpsize;
272 sd->csd[12] = 0x90 | /* Write speed factor */
273 (HWBLOCK_SHIFT >> 2);
274 sd->csd[13] = 0x20 | /* Max. write data block length */
275 ((HWBLOCK_SHIFT << 6) & 0xc0);
276 sd->csd[14] = 0x00; /* File format group */
277 sd->csd[15] = (sd_crc7(sd->csd, 15) << 1) | 1;
280 static void sd_set_rca(SDState *sd)
282 sd->rca += 0x4567;
285 #define CARD_STATUS_A 0x02004100
286 #define CARD_STATUS_B 0x00c01e00
287 #define CARD_STATUS_C 0xfd39a028
289 static void sd_set_cardstatus(SDState *sd)
291 sd->card_status = 0x00000100;
294 static void sd_set_sdstatus(SDState *sd)
296 memset(sd->sd_status, 0, 64);
299 static int sd_req_crc_validate(struct sd_request_s *req)
301 uint8_t buffer[5];
302 buffer[0] = 0x40 | req->cmd;
303 buffer[1] = (req->arg >> 24) & 0xff;
304 buffer[2] = (req->arg >> 16) & 0xff;
305 buffer[3] = (req->arg >> 8) & 0xff;
306 buffer[4] = (req->arg >> 0) & 0xff;
307 return 0;
308 return sd_crc7(buffer, 5) != req->crc; /* TODO */
311 static void sd_response_r1_make(SDState *sd,
312 uint8_t *response, uint32_t last_status)
314 uint32_t mask = CARD_STATUS_B ^ ILLEGAL_COMMAND;
315 uint32_t status;
317 status = (sd->card_status & ~mask) | (last_status & mask);
318 sd->card_status &= ~CARD_STATUS_C | APP_CMD;
320 response[0] = (status >> 24) & 0xff;
321 response[1] = (status >> 16) & 0xff;
322 response[2] = (status >> 8) & 0xff;
323 response[3] = (status >> 0) & 0xff;
326 static void sd_response_r3_make(SDState *sd, uint8_t *response)
328 response[0] = (sd->ocr >> 24) & 0xff;
329 response[1] = (sd->ocr >> 16) & 0xff;
330 response[2] = (sd->ocr >> 8) & 0xff;
331 response[3] = (sd->ocr >> 0) & 0xff;
334 static void sd_response_r6_make(SDState *sd, uint8_t *response)
336 uint16_t arg;
337 uint16_t status;
339 arg = sd->rca;
340 status = ((sd->card_status >> 8) & 0xc000) |
341 ((sd->card_status >> 6) & 0x2000) |
342 (sd->card_status & 0x1fff);
344 response[0] = (arg >> 8) & 0xff;
345 response[1] = arg & 0xff;
346 response[2] = (status >> 8) & 0xff;
347 response[3] = status & 0xff;
350 static void sd_reset(SDState *sd, BlockDriverState *bdrv)
352 uint32_t size;
353 uint64_t sect;
355 bdrv_get_geometry(bdrv, &sect);
356 sect <<= 9;
358 if (sect > 0x40000000)
359 size = 0x40000000; /* 1 gig */
360 else
361 size = sect + 1;
363 sect = (size >> (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT)) + 1;
365 sd->state = sd_idle_state;
366 sd->rca = 0x0000;
367 sd_set_ocr(sd);
368 sd_set_scr(sd);
369 sd_set_cid(sd);
370 sd_set_csd(sd, size);
371 sd_set_cardstatus(sd);
372 sd_set_sdstatus(sd);
374 sd->bdrv = bdrv;
376 if (sd->wp_groups)
377 qemu_free(sd->wp_groups);
378 sd->wp_switch = bdrv_is_read_only(bdrv);
379 sd->wp_groups = (int *) qemu_mallocz(sizeof(int) * sect);
380 memset(sd->function_group, 0, sizeof(int) * 6);
381 sd->erase_start = 0;
382 sd->erase_end = 0;
383 sd->size = size;
384 sd->blk_len = 0x200;
385 sd->pwd_len = 0;
388 static void sd_cardchange(void *opaque)
390 SDState *sd = opaque;
391 qemu_set_irq(sd->inserted_cb, bdrv_is_inserted(sd->bdrv));
392 if (bdrv_is_inserted(sd->bdrv)) {
393 sd_reset(sd, sd->bdrv);
394 qemu_set_irq(sd->readonly_cb, sd->wp_switch);
398 SDState *sd_init(BlockDriverState *bs)
400 SDState *sd;
402 sd = (SDState *) qemu_mallocz(sizeof(SDState));
403 sd_reset(sd, bs);
404 bdrv_set_change_cb(sd->bdrv, sd_cardchange, sd);
405 return sd;
408 void sd_set_cb(SDState *sd, qemu_irq readonly, qemu_irq insert)
410 sd->readonly_cb = readonly;
411 sd->inserted_cb = insert;
412 qemu_set_irq(readonly, bdrv_is_read_only(sd->bdrv));
413 qemu_set_irq(insert, bdrv_is_inserted(sd->bdrv));
416 static void sd_erase(SDState *sd)
418 int i, start, end;
419 if (!sd->erase_start || !sd->erase_end) {
420 sd->card_status |= ERASE_SEQ_ERROR;
421 return;
424 start = sd->erase_start >>
425 (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT);
426 end = sd->erase_end >>
427 (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT);
428 sd->erase_start = 0;
429 sd->erase_end = 0;
430 sd->csd[14] |= 0x40;
432 for (i = start; i <= end; i ++)
433 if (sd->wp_groups[i])
434 sd->card_status |= WP_ERASE_SKIP;
437 static uint32_t sd_wpbits(SDState *sd, uint32_t addr)
439 uint32_t i, wpnum;
440 uint32_t ret = 0;
442 wpnum = addr >> (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT);
444 for (i = 0; i < 32; i ++, wpnum ++, addr += WPGROUP_SIZE)
445 if (addr < sd->size && sd->wp_groups[wpnum])
446 ret |= (1 << i);
448 return ret;
451 static void sd_function_switch(SDState *sd, uint32_t arg)
453 int i, mode, new_func, crc;
454 mode = !!(arg & 0x80000000);
456 sd->data[0] = 0x00; /* Maximum current consumption */
457 sd->data[1] = 0x01;
458 sd->data[2] = 0x80; /* Supported group 6 functions */
459 sd->data[3] = 0x01;
460 sd->data[4] = 0x80; /* Supported group 5 functions */
461 sd->data[5] = 0x01;
462 sd->data[6] = 0x80; /* Supported group 4 functions */
463 sd->data[7] = 0x01;
464 sd->data[8] = 0x80; /* Supported group 3 functions */
465 sd->data[9] = 0x01;
466 sd->data[10] = 0x80; /* Supported group 2 functions */
467 sd->data[11] = 0x43;
468 sd->data[12] = 0x80; /* Supported group 1 functions */
469 sd->data[13] = 0x03;
470 for (i = 0; i < 6; i ++) {
471 new_func = (arg >> (i * 4)) & 0x0f;
472 if (mode && new_func != 0x0f)
473 sd->function_group[i] = new_func;
474 sd->data[14 + (i >> 1)] = new_func << ((i * 4) & 4);
476 memset(&sd->data[17], 0, 47);
477 crc = sd_crc16(sd->data, 64);
478 sd->data[65] = crc >> 8;
479 sd->data[66] = crc & 0xff;
482 static inline int sd_wp_addr(SDState *sd, uint32_t addr)
484 return sd->wp_groups[addr >>
485 (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT)];
488 static void sd_lock_command(SDState *sd)
490 int erase, lock, clr_pwd, set_pwd, pwd_len;
491 erase = !!(sd->data[0] & 0x08);
492 lock = sd->data[0] & 0x04;
493 clr_pwd = sd->data[0] & 0x02;
494 set_pwd = sd->data[0] & 0x01;
496 if (sd->blk_len > 1)
497 pwd_len = sd->data[1];
498 else
499 pwd_len = 0;
501 if (erase) {
502 if (!(sd->card_status & CARD_IS_LOCKED) || sd->blk_len > 1 ||
503 set_pwd || clr_pwd || lock || sd->wp_switch ||
504 (sd->csd[14] & 0x20)) {
505 sd->card_status |= LOCK_UNLOCK_FAILED;
506 return;
508 memset(sd->wp_groups, 0, sizeof(int) * (sd->size >>
509 (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT)));
510 sd->csd[14] &= ~0x10;
511 sd->card_status &= ~CARD_IS_LOCKED;
512 sd->pwd_len = 0;
513 /* Erasing the entire card here! */
514 printf("SD: Card force-erased by CMD42\n");
515 return;
518 if (sd->blk_len < 2 + pwd_len ||
519 pwd_len <= sd->pwd_len ||
520 pwd_len > sd->pwd_len + 16) {
521 sd->card_status |= LOCK_UNLOCK_FAILED;
522 return;
525 if (sd->pwd_len && memcmp(sd->pwd, sd->data + 2, sd->pwd_len)) {
526 sd->card_status |= LOCK_UNLOCK_FAILED;
527 return;
530 pwd_len -= sd->pwd_len;
531 if ((pwd_len && !set_pwd) ||
532 (clr_pwd && (set_pwd || lock)) ||
533 (lock && !sd->pwd_len && !set_pwd) ||
534 (!set_pwd && !clr_pwd &&
535 (((sd->card_status & CARD_IS_LOCKED) && lock) ||
536 (!(sd->card_status & CARD_IS_LOCKED) && !lock)))) {
537 sd->card_status |= LOCK_UNLOCK_FAILED;
538 return;
541 if (set_pwd) {
542 memcpy(sd->pwd, sd->data + 2 + sd->pwd_len, pwd_len);
543 sd->pwd_len = pwd_len;
546 if (clr_pwd) {
547 sd->pwd_len = 0;
550 if (lock)
551 sd->card_status |= CARD_IS_LOCKED;
552 else
553 sd->card_status &= ~CARD_IS_LOCKED;
556 static sd_rsp_type_t sd_normal_command(SDState *sd,
557 struct sd_request_s req)
559 uint32_t rca = 0x0000;
561 if (sd_cmd_type[req.cmd] == sd_ac || sd_cmd_type[req.cmd] == sd_adtc)
562 rca = req.arg >> 16;
564 DPRINTF("CMD%d 0x%08x state %d\n", req.cmd, req.arg, sd->state);
565 switch (req.cmd) {
566 /* Basic commands (Class 0 and Class 1) */
567 case 0: /* CMD0: GO_IDLE_STATE */
568 switch (sd->state) {
569 case sd_inactive_state:
570 return sd_r0;
572 default:
573 sd->state = sd_idle_state;
574 sd_reset(sd, sd->bdrv);
575 return sd_r0;
577 break;
579 case 2: /* CMD2: ALL_SEND_CID */
580 switch (sd->state) {
581 case sd_ready_state:
582 sd->state = sd_identification_state;
583 return sd_r2_i;
585 default:
586 break;
588 break;
590 case 3: /* CMD3: SEND_RELATIVE_ADDR */
591 switch (sd->state) {
592 case sd_identification_state:
593 case sd_standby_state:
594 sd->state = sd_standby_state;
595 sd_set_rca(sd);
596 return sd_r6;
598 default:
599 break;
601 break;
603 case 4: /* CMD4: SEND_DSR */
604 switch (sd->state) {
605 case sd_standby_state:
606 break;
608 default:
609 break;
611 break;
613 case 6: /* CMD6: SWITCH_FUNCTION */
614 switch (sd->mode) {
615 case sd_data_transfer_mode:
616 sd_function_switch(sd, req.arg);
617 sd->state = sd_sendingdata_state;
618 sd->data_start = 0;
619 sd->data_offset = 0;
620 return sd_r1;
622 default:
623 break;
625 break;
627 case 7: /* CMD7: SELECT/DESELECT_CARD */
628 switch (sd->state) {
629 case sd_standby_state:
630 if (sd->rca != rca)
631 return sd_r0;
633 sd->state = sd_transfer_state;
634 return sd_r1b;
636 case sd_transfer_state:
637 case sd_sendingdata_state:
638 if (sd->rca == rca)
639 break;
641 sd->state = sd_standby_state;
642 return sd_r1b;
644 case sd_disconnect_state:
645 if (sd->rca != rca)
646 return sd_r0;
648 sd->state = sd_programming_state;
649 return sd_r1b;
651 case sd_programming_state:
652 if (sd->rca == rca)
653 break;
655 sd->state = sd_disconnect_state;
656 return sd_r1b;
658 default:
659 break;
661 break;
663 case 9: /* CMD9: SEND_CSD */
664 switch (sd->state) {
665 case sd_standby_state:
666 if (sd->rca != rca)
667 return sd_r0;
669 return sd_r2_s;
671 default:
672 break;
674 break;
676 case 10: /* CMD10: SEND_CID */
677 switch (sd->state) {
678 case sd_standby_state:
679 if (sd->rca != rca)
680 return sd_r0;
682 return sd_r2_i;
684 default:
685 break;
687 break;
689 case 11: /* CMD11: READ_DAT_UNTIL_STOP */
690 switch (sd->state) {
691 case sd_transfer_state:
692 sd->state = sd_sendingdata_state;
693 sd->data_start = req.arg;
694 sd->data_offset = 0;
696 if (sd->data_start + sd->blk_len > sd->size)
697 sd->card_status |= ADDRESS_ERROR;
698 return sd_r0;
700 default:
701 break;
703 break;
705 case 12: /* CMD12: STOP_TRANSMISSION */
706 switch (sd->state) {
707 case sd_sendingdata_state:
708 sd->state = sd_transfer_state;
709 return sd_r1b;
711 case sd_receivingdata_state:
712 sd->state = sd_programming_state;
713 /* Bzzzzzzztt .... Operation complete. */
714 sd->state = sd_transfer_state;
715 return sd_r1b;
717 default:
718 break;
720 break;
722 case 13: /* CMD13: SEND_STATUS */
723 switch (sd->mode) {
724 case sd_data_transfer_mode:
725 if (sd->rca != rca)
726 return sd_r0;
728 return sd_r1;
730 default:
731 break;
733 break;
735 case 15: /* CMD15: GO_INACTIVE_STATE */
736 switch (sd->mode) {
737 case sd_data_transfer_mode:
738 if (sd->rca != rca)
739 return sd_r0;
741 sd->state = sd_inactive_state;
742 return sd_r0;
744 default:
745 break;
747 break;
749 /* Block read commands (Classs 2) */
750 case 16: /* CMD16: SET_BLOCKLEN */
751 switch (sd->state) {
752 case sd_transfer_state:
753 if (req.arg > (1 << HWBLOCK_SHIFT))
754 sd->card_status |= BLOCK_LEN_ERROR;
755 else
756 sd->blk_len = req.arg;
758 return sd_r1;
760 default:
761 break;
763 break;
765 case 17: /* CMD17: READ_SINGLE_BLOCK */
766 switch (sd->state) {
767 case sd_transfer_state:
768 sd->state = sd_sendingdata_state;
769 sd->data_start = req.arg;
770 sd->data_offset = 0;
772 if (sd->data_start + sd->blk_len > sd->size)
773 sd->card_status |= ADDRESS_ERROR;
774 return sd_r1;
776 default:
777 break;
779 break;
781 case 18: /* CMD18: READ_MULTIPLE_BLOCK */
782 switch (sd->state) {
783 case sd_transfer_state:
784 sd->state = sd_sendingdata_state;
785 sd->data_start = req.arg;
786 sd->data_offset = 0;
788 if (sd->data_start + sd->blk_len > sd->size)
789 sd->card_status |= ADDRESS_ERROR;
790 return sd_r1;
792 default:
793 break;
795 break;
797 /* Block write commands (Class 4) */
798 case 24: /* CMD24: WRITE_SINGLE_BLOCK */
799 switch (sd->state) {
800 case sd_transfer_state:
801 sd->state = sd_receivingdata_state;
802 sd->data_start = req.arg;
803 sd->data_offset = 0;
804 sd->blk_written = 0;
806 if (sd->data_start + sd->blk_len > sd->size)
807 sd->card_status |= ADDRESS_ERROR;
808 if (sd_wp_addr(sd, sd->data_start))
809 sd->card_status |= WP_VIOLATION;
810 if (sd->csd[14] & 0x30)
811 sd->card_status |= WP_VIOLATION;
812 return sd_r1;
814 default:
815 break;
817 break;
819 case 25: /* CMD25: WRITE_MULTIPLE_BLOCK */
820 switch (sd->state) {
821 case sd_transfer_state:
822 sd->state = sd_receivingdata_state;
823 sd->data_start = req.arg;
824 sd->data_offset = 0;
825 sd->blk_written = 0;
827 if (sd->data_start + sd->blk_len > sd->size)
828 sd->card_status |= ADDRESS_ERROR;
829 if (sd_wp_addr(sd, sd->data_start))
830 sd->card_status |= WP_VIOLATION;
831 if (sd->csd[14] & 0x30)
832 sd->card_status |= WP_VIOLATION;
833 return sd_r1;
835 default:
836 break;
838 break;
840 case 26: /* CMD26: PROGRAM_CID */
841 switch (sd->state) {
842 case sd_transfer_state:
843 sd->state = sd_receivingdata_state;
844 sd->data_start = 0;
845 sd->data_offset = 0;
846 return sd_r1;
848 default:
849 break;
851 break;
853 case 27: /* CMD27: PROGRAM_CSD */
854 switch (sd->state) {
855 case sd_transfer_state:
856 sd->state = sd_receivingdata_state;
857 sd->data_start = 0;
858 sd->data_offset = 0;
859 return sd_r1;
861 default:
862 break;
864 break;
866 /* Write protection (Class 6) */
867 case 28: /* CMD28: SET_WRITE_PROT */
868 switch (sd->state) {
869 case sd_transfer_state:
870 if (req.arg >= sd->size) {
871 sd->card_status = ADDRESS_ERROR;
872 return sd_r1b;
875 sd->state = sd_programming_state;
876 sd->wp_groups[req.arg >> (HWBLOCK_SHIFT +
877 SECTOR_SHIFT + WPGROUP_SHIFT)] = 1;
878 /* Bzzzzzzztt .... Operation complete. */
879 sd->state = sd_transfer_state;
880 return sd_r1b;
882 default:
883 break;
885 break;
887 case 29: /* CMD29: CLR_WRITE_PROT */
888 switch (sd->state) {
889 case sd_transfer_state:
890 if (req.arg >= sd->size) {
891 sd->card_status = ADDRESS_ERROR;
892 return sd_r1b;
895 sd->state = sd_programming_state;
896 sd->wp_groups[req.arg >> (HWBLOCK_SHIFT +
897 SECTOR_SHIFT + WPGROUP_SHIFT)] = 0;
898 /* Bzzzzzzztt .... Operation complete. */
899 sd->state = sd_transfer_state;
900 return sd_r1b;
902 default:
903 break;
905 break;
907 case 30: /* CMD30: SEND_WRITE_PROT */
908 switch (sd->state) {
909 case sd_transfer_state:
910 sd->state = sd_sendingdata_state;
911 *(uint32_t *) sd->data = sd_wpbits(sd, req.arg);
912 sd->data_start = req.arg;
913 sd->data_offset = 0;
914 return sd_r1b;
916 default:
917 break;
919 break;
921 /* Erase commands (Class 5) */
922 case 32: /* CMD32: ERASE_WR_BLK_START */
923 switch (sd->state) {
924 case sd_transfer_state:
925 sd->erase_start = req.arg;
926 return sd_r1;
928 default:
929 break;
931 break;
933 case 33: /* CMD33: ERASE_WR_BLK_END */
934 switch (sd->state) {
935 case sd_transfer_state:
936 sd->erase_end = req.arg;
937 return sd_r1;
939 default:
940 break;
942 break;
944 case 38: /* CMD38: ERASE */
945 switch (sd->state) {
946 case sd_transfer_state:
947 if (sd->csd[14] & 0x30) {
948 sd->card_status |= WP_VIOLATION;
949 return sd_r1b;
952 sd->state = sd_programming_state;
953 sd_erase(sd);
954 /* Bzzzzzzztt .... Operation complete. */
955 sd->state = sd_transfer_state;
956 return sd_r1b;
958 default:
959 break;
961 break;
963 /* Lock card commands (Class 7) */
964 case 42: /* CMD42: LOCK_UNLOCK */
965 switch (sd->state) {
966 case sd_transfer_state:
967 sd->state = sd_receivingdata_state;
968 sd->data_start = 0;
969 sd->data_offset = 0;
970 return sd_r1;
972 default:
973 break;
975 break;
977 /* Application specific commands (Class 8) */
978 case 55: /* CMD55: APP_CMD */
979 if (sd->rca != rca)
980 return sd_r0;
982 sd->card_status |= APP_CMD;
983 return sd_r1;
985 case 56: /* CMD56: GEN_CMD */
986 printf("SD: GEN_CMD 0x%08x\n", req.arg);
988 switch (sd->state) {
989 case sd_transfer_state:
990 sd->data_offset = 0;
991 if (req.arg & 1)
992 sd->state = sd_sendingdata_state;
993 else
994 sd->state = sd_receivingdata_state;
995 return sd_r1;
997 default:
998 break;
1000 break;
1002 default:
1003 sd->card_status |= ILLEGAL_COMMAND;
1005 printf("SD: Unknown CMD%i\n", req.cmd);
1006 return sd_r0;
1009 sd->card_status |= ILLEGAL_COMMAND;
1010 printf("SD: CMD%i in a wrong state\n", req.cmd);
1011 return sd_r0;
1014 static sd_rsp_type_t sd_app_command(SDState *sd,
1015 struct sd_request_s req) {
1016 uint32_t rca;
1018 if (sd_cmd_type[req.cmd] == sd_ac || sd_cmd_type[req.cmd] == sd_adtc)
1019 rca = req.arg >> 16;
1021 DPRINTF("ACMD%d 0x%08x\n", req.cmd, req.arg);
1022 switch (req.cmd) {
1023 case 6: /* ACMD6: SET_BUS_WIDTH */
1024 switch (sd->state) {
1025 case sd_transfer_state:
1026 sd->sd_status[0] &= 0x3f;
1027 sd->sd_status[0] |= (req.arg & 0x03) << 6;
1028 return sd_r1;
1030 default:
1031 break;
1033 break;
1035 case 13: /* ACMD13: SD_STATUS */
1036 switch (sd->state) {
1037 case sd_transfer_state:
1038 sd->data_start = 0;
1039 sd->data_offset = 0;
1040 return sd_r1;
1042 default:
1043 break;
1045 break;
1047 case 22: /* ACMD22: SEND_NUM_WR_BLOCKS */
1048 switch (sd->state) {
1049 case sd_transfer_state:
1050 *(uint32_t *) sd->data = sd->blk_written;
1052 sd->data_start = 0;
1053 sd->data_offset = 0;
1054 return sd_r1;
1056 default:
1057 break;
1059 break;
1061 case 23: /* ACMD23: SET_WR_BLK_ERASE_COUNT */
1062 switch (sd->state) {
1063 case sd_transfer_state:
1064 return sd_r1;
1066 default:
1067 break;
1069 break;
1071 case 41: /* ACMD41: SD_APP_OP_COND */
1072 switch (sd->state) {
1073 case sd_idle_state:
1074 /* We accept any voltage. 10000 V is nothing. */
1075 if (req.arg)
1076 sd->state = sd_ready_state;
1078 return sd_r3;
1080 default:
1081 break;
1083 break;
1085 case 42: /* ACMD42: SET_CLR_CARD_DETECT */
1086 switch (sd->state) {
1087 case sd_transfer_state:
1088 /* Bringing in the 50KOhm pull-up resistor... Done. */
1089 return sd_r1;
1091 default:
1092 break;
1094 break;
1096 case 51: /* ACMD51: SEND_SCR */
1097 switch (sd->state) {
1098 case sd_transfer_state:
1099 sd->state = sd_sendingdata_state;
1100 sd->data_start = 0;
1101 sd->data_offset = 0;
1102 return sd_r1;
1104 default:
1105 break;
1107 break;
1109 default:
1110 /* Fall back to standard commands. */
1111 sd->card_status &= ~APP_CMD;
1112 return sd_normal_command(sd, req);
1115 printf("SD: ACMD%i in a wrong state\n", req.cmd);
1116 return sd_r0;
1119 int sd_do_command(SDState *sd, struct sd_request_s *req,
1120 uint8_t *response) {
1121 uint32_t last_status = sd->card_status;
1122 sd_rsp_type_t rtype;
1123 int rsplen;
1125 if (!bdrv_is_inserted(sd->bdrv)) {
1126 return 0;
1129 if (sd_req_crc_validate(req)) {
1130 sd->card_status &= ~COM_CRC_ERROR;
1131 return 0;
1134 sd->card_status &= ~CARD_STATUS_B;
1135 sd_set_status(sd);
1137 if (last_status & CARD_IS_LOCKED)
1138 if (((last_status & APP_CMD) &&
1139 req->cmd == 41) ||
1140 (!(last_status & APP_CMD) &&
1141 (sd_cmd_class[req->cmd] == 0 ||
1142 sd_cmd_class[req->cmd] == 7 ||
1143 req->cmd == 16 || req->cmd == 55))) {
1144 sd->card_status |= ILLEGAL_COMMAND;
1145 printf("SD: Card is locked\n");
1146 return 0;
1149 if (last_status & APP_CMD) {
1150 rtype = sd_app_command(sd, *req);
1151 sd->card_status &= ~APP_CMD;
1152 } else
1153 rtype = sd_normal_command(sd, *req);
1155 sd->current_cmd = req->cmd;
1157 switch (rtype) {
1158 case sd_r1:
1159 case sd_r1b:
1160 sd_response_r1_make(sd, response, last_status);
1161 rsplen = 4;
1162 break;
1164 case sd_r2_i:
1165 memcpy(response, sd->cid, sizeof(sd->cid));
1166 response[7] |= 1;
1167 rsplen = 16;
1168 break;
1170 case sd_r2_s:
1171 memcpy(response, sd->csd, sizeof(sd->csd));
1172 response[7] |= 1;
1173 rsplen = 16;
1174 break;
1176 case sd_r3:
1177 sd_response_r3_make(sd, response);
1178 rsplen = 4;
1179 break;
1181 case sd_r6:
1182 sd_response_r6_make(sd, response);
1183 rsplen = 4;
1184 break;
1186 case sd_r0:
1187 default:
1188 rsplen = 0;
1189 break;
1192 if (sd->card_status & ILLEGAL_COMMAND)
1193 rsplen = 0;
1195 #ifdef DEBUG_SD
1196 if (rsplen) {
1197 int i;
1198 DPRINTF("Response:");
1199 for (i = 0; i < rsplen; i++)
1200 printf(" %02x", response[i]);
1201 printf(" state %d\n", sd->state);
1202 } else {
1203 DPRINTF("No response %d\n", sd->state);
1205 #endif
1207 return rsplen;
1210 /* No real need for 64 bit addresses here */
1211 static void sd_blk_read(BlockDriverState *bdrv,
1212 void *data, uint32_t addr, uint32_t len)
1214 uint8_t buf[512];
1215 uint32_t end = addr + len;
1217 if (!bdrv || bdrv_read(bdrv, addr >> 9, buf, 1) == -1) {
1218 printf("sd_blk_read: read error on host side\n");
1219 return;
1222 if (end > (addr & ~511) + 512) {
1223 memcpy(data, buf + (addr & 511), 512 - (addr & 511));
1225 if (bdrv_read(bdrv, end >> 9, buf, 1) == -1) {
1226 printf("sd_blk_read: read error on host side\n");
1227 return;
1229 memcpy(data + 512 - (addr & 511), buf, end & 511);
1230 } else
1231 memcpy(data, buf + (addr & 511), len);
1234 static void sd_blk_write(BlockDriverState *bdrv,
1235 void *data, uint32_t addr, uint32_t len)
1237 uint8_t buf[512];
1238 uint32_t end = addr + len;
1240 if ((addr & 511) || len < 512)
1241 if (!bdrv || bdrv_read(bdrv, addr >> 9, buf, 1) == -1) {
1242 printf("sd_blk_write: read error on host side\n");
1243 return;
1246 if (end > (addr & ~511) + 512) {
1247 memcpy(buf + (addr & 511), data, 512 - (addr & 511));
1248 if (bdrv_write(bdrv, addr >> 9, buf, 1) == -1) {
1249 printf("sd_blk_write: write error on host side\n");
1250 return;
1253 if (bdrv_read(bdrv, end >> 9, buf, 1) == -1) {
1254 printf("sd_blk_write: read error on host side\n");
1255 return;
1257 memcpy(buf, data + 512 - (addr & 511), end & 511);
1258 if (bdrv_write(bdrv, end >> 9, buf, 1) == -1)
1259 printf("sd_blk_write: write error on host side\n");
1260 } else {
1261 memcpy(buf + (addr & 511), data, len);
1262 if (!bdrv || bdrv_write(bdrv, addr >> 9, buf, 1) == -1)
1263 printf("sd_blk_write: write error on host side\n");
1267 #define BLK_READ_BLOCK(a, len) sd_blk_read(sd->bdrv, sd->data, a, len)
1268 #define BLK_WRITE_BLOCK(a, len) sd_blk_write(sd->bdrv, sd->data, a, len)
1269 #define APP_READ_BLOCK(a, len) memset(sd->data, 0xec, len)
1270 #define APP_WRITE_BLOCK(a, len)
1272 void sd_write_data(SDState *sd, uint8_t value)
1274 int i;
1276 if (!sd->bdrv || !bdrv_is_inserted(sd->bdrv))
1277 return;
1279 if (sd->state != sd_receivingdata_state) {
1280 printf("sd_write_data: not in Receiving-Data state\n");
1281 return;
1284 if (sd->card_status & (ADDRESS_ERROR | WP_VIOLATION))
1285 return;
1287 switch (sd->current_cmd) {
1288 case 24: /* CMD24: WRITE_SINGLE_BLOCK */
1289 sd->data[sd->data_offset ++] = value;
1290 if (sd->data_offset >= sd->blk_len) {
1291 /* TODO: Check CRC before committing */
1292 sd->state = sd_programming_state;
1293 BLK_WRITE_BLOCK(sd->data_start, sd->data_offset);
1294 sd->blk_written ++;
1295 sd->csd[14] |= 0x40;
1296 /* Bzzzzzzztt .... Operation complete. */
1297 sd->state = sd_transfer_state;
1299 break;
1301 case 25: /* CMD25: WRITE_MULTIPLE_BLOCK */
1302 sd->data[sd->data_offset ++] = value;
1303 if (sd->data_offset >= sd->blk_len) {
1304 /* TODO: Check CRC before committing */
1305 sd->state = sd_programming_state;
1306 BLK_WRITE_BLOCK(sd->data_start, sd->data_offset);
1307 sd->blk_written ++;
1308 sd->data_start += sd->blk_len;
1309 sd->data_offset = 0;
1310 if (sd->data_start + sd->blk_len > sd->size) {
1311 sd->card_status |= ADDRESS_ERROR;
1312 break;
1314 if (sd_wp_addr(sd, sd->data_start)) {
1315 sd->card_status |= WP_VIOLATION;
1316 break;
1318 sd->csd[14] |= 0x40;
1320 /* Bzzzzzzztt .... Operation complete. */
1321 sd->state = sd_receivingdata_state;
1323 break;
1325 case 26: /* CMD26: PROGRAM_CID */
1326 sd->data[sd->data_offset ++] = value;
1327 if (sd->data_offset >= sizeof(sd->cid)) {
1328 /* TODO: Check CRC before committing */
1329 sd->state = sd_programming_state;
1330 for (i = 0; i < sizeof(sd->cid); i ++)
1331 if ((sd->cid[i] | 0x00) != sd->data[i])
1332 sd->card_status |= CID_CSD_OVERWRITE;
1334 if (!(sd->card_status & CID_CSD_OVERWRITE))
1335 for (i = 0; i < sizeof(sd->cid); i ++) {
1336 sd->cid[i] |= 0x00;
1337 sd->cid[i] &= sd->data[i];
1339 /* Bzzzzzzztt .... Operation complete. */
1340 sd->state = sd_transfer_state;
1342 break;
1344 case 27: /* CMD27: PROGRAM_CSD */
1345 sd->data[sd->data_offset ++] = value;
1346 if (sd->data_offset >= sizeof(sd->csd)) {
1347 /* TODO: Check CRC before committing */
1348 sd->state = sd_programming_state;
1349 for (i = 0; i < sizeof(sd->csd); i ++)
1350 if ((sd->csd[i] | sd_csd_rw_mask[i]) !=
1351 (sd->data[i] | sd_csd_rw_mask[i]))
1352 sd->card_status |= CID_CSD_OVERWRITE;
1354 /* Copy flag (OTP) & Permanent write protect */
1355 if (sd->csd[14] & ~sd->data[14] & 0x60)
1356 sd->card_status |= CID_CSD_OVERWRITE;
1358 if (!(sd->card_status & CID_CSD_OVERWRITE))
1359 for (i = 0; i < sizeof(sd->csd); i ++) {
1360 sd->csd[i] |= sd_csd_rw_mask[i];
1361 sd->csd[i] &= sd->data[i];
1363 /* Bzzzzzzztt .... Operation complete. */
1364 sd->state = sd_transfer_state;
1366 break;
1368 case 42: /* CMD42: LOCK_UNLOCK */
1369 sd->data[sd->data_offset ++] = value;
1370 if (sd->data_offset >= sd->blk_len) {
1371 /* TODO: Check CRC before committing */
1372 sd->state = sd_programming_state;
1373 sd_lock_command(sd);
1374 /* Bzzzzzzztt .... Operation complete. */
1375 sd->state = sd_transfer_state;
1377 break;
1379 case 56: /* CMD56: GEN_CMD */
1380 sd->data[sd->data_offset ++] = value;
1381 if (sd->data_offset >= sd->blk_len) {
1382 APP_WRITE_BLOCK(sd->data_start, sd->data_offset);
1383 sd->state = sd_transfer_state;
1385 break;
1387 default:
1388 printf("sd_write_data: unknown command\n");
1389 break;
1393 uint8_t sd_read_data(SDState *sd)
1395 /* TODO: Append CRCs */
1396 uint8_t ret;
1398 if (!sd->bdrv || !bdrv_is_inserted(sd->bdrv))
1399 return 0x00;
1401 if (sd->state != sd_sendingdata_state) {
1402 printf("sd_read_data: not in Sending-Data state\n");
1403 return 0x00;
1406 if (sd->card_status & (ADDRESS_ERROR | WP_VIOLATION))
1407 return 0x00;
1409 switch (sd->current_cmd) {
1410 case 6: /* CMD6: SWITCH_FUNCTION */
1411 ret = sd->data[sd->data_offset ++];
1413 if (sd->data_offset >= 64)
1414 sd->state = sd_transfer_state;
1415 break;
1417 case 11: /* CMD11: READ_DAT_UNTIL_STOP */
1418 if (sd->data_offset == 0)
1419 BLK_READ_BLOCK(sd->data_start, sd->blk_len);
1420 ret = sd->data[sd->data_offset ++];
1422 if (sd->data_offset >= sd->blk_len) {
1423 sd->data_start += sd->blk_len;
1424 sd->data_offset = 0;
1425 if (sd->data_start + sd->blk_len > sd->size) {
1426 sd->card_status |= ADDRESS_ERROR;
1427 break;
1430 break;
1432 case 13: /* ACMD13: SD_STATUS */
1433 ret = sd->sd_status[sd->data_offset ++];
1435 if (sd->data_offset >= sizeof(sd->sd_status))
1436 sd->state = sd_transfer_state;
1437 break;
1439 case 17: /* CMD17: READ_SINGLE_BLOCK */
1440 if (sd->data_offset == 0)
1441 BLK_READ_BLOCK(sd->data_start, sd->blk_len);
1442 ret = sd->data[sd->data_offset ++];
1444 if (sd->data_offset >= sd->blk_len)
1445 sd->state = sd_transfer_state;
1446 break;
1448 case 18: /* CMD18: READ_MULTIPLE_BLOCK */
1449 if (sd->data_offset == 0)
1450 BLK_READ_BLOCK(sd->data_start, sd->blk_len);
1451 ret = sd->data[sd->data_offset ++];
1453 if (sd->data_offset >= sd->blk_len) {
1454 sd->data_start += sd->blk_len;
1455 sd->data_offset = 0;
1456 if (sd->data_start + sd->blk_len > sd->size) {
1457 sd->card_status |= ADDRESS_ERROR;
1458 break;
1461 break;
1463 case 22: /* ACMD22: SEND_NUM_WR_BLOCKS */
1464 ret = sd->data[sd->data_offset ++];
1466 if (sd->data_offset >= 4)
1467 sd->state = sd_transfer_state;
1468 break;
1470 case 30: /* CMD30: SEND_WRITE_PROT */
1471 ret = sd->data[sd->data_offset ++];
1473 if (sd->data_offset >= 4)
1474 sd->state = sd_transfer_state;
1475 break;
1477 case 51: /* ACMD51: SEND_SCR */
1478 ret = sd->scr[sd->data_offset ++];
1480 if (sd->data_offset >= sizeof(sd->scr))
1481 sd->state = sd_transfer_state;
1482 break;
1484 case 56: /* CMD56: GEN_CMD */
1485 if (sd->data_offset == 0)
1486 APP_READ_BLOCK(sd->data_start, sd->blk_len);
1487 ret = sd->data[sd->data_offset ++];
1489 if (sd->data_offset >= sd->blk_len)
1490 sd->state = sd_transfer_state;
1491 break;
1493 default:
1494 printf("sd_read_data: unknown command\n");
1495 return 0x00;
1498 return ret;
1501 int sd_data_ready(SDState *sd)
1503 return sd->state == sd_sendingdata_state;