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
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
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.
33 #include "sysemu/block-backend.h"
35 #include "qemu/bitmap.h"
40 #define DPRINTF(fmt, ...) \
41 do { fprintf(stderr, "SD: " fmt , ## __VA_ARGS__); } while (0)
43 #define DPRINTF(fmt, ...) do {} while(0)
46 #define ACMD41_ENQUIRY_MASK 0x00ffffff
49 sd_r0
= 0, /* no response */
50 sd_r1
, /* normal response command */
51 sd_r2_i
, /* CID register */
52 sd_r2_s
, /* CSD register */
53 sd_r3
, /* OCR register */
54 sd_r6
= 6, /* Published RCA response */
55 sd_r7
, /* Operating voltage */
62 sd_card_identification_mode
,
63 sd_data_transfer_mode
,
67 sd_inactive_state
= -1,
70 sd_identification_state
,
74 sd_receivingdata_state
,
80 uint32_t mode
; /* current card mode, one of SDCardModes */
81 int32_t state
; /* current card state, one of SDCardStates */
88 uint8_t sd_status
[64];
91 unsigned long *wp_groups
;
99 uint8_t function_group
[6];
103 /* True if we will handle the next command as an ACMD. Note that this does
104 * *not* track the APP_CMD status bit!
107 uint32_t blk_written
;
109 uint32_t data_offset
;
111 qemu_irq readonly_cb
;
112 qemu_irq inserted_cb
;
119 static void sd_set_mode(SDState
*sd
)
122 case sd_inactive_state
:
123 sd
->mode
= sd_inactive
;
128 case sd_identification_state
:
129 sd
->mode
= sd_card_identification_mode
;
132 case sd_standby_state
:
133 case sd_transfer_state
:
134 case sd_sendingdata_state
:
135 case sd_receivingdata_state
:
136 case sd_programming_state
:
137 case sd_disconnect_state
:
138 sd
->mode
= sd_data_transfer_mode
;
143 static const sd_cmd_type_t sd_cmd_type
[64] = {
144 sd_bc
, sd_none
, sd_bcr
, sd_bcr
, sd_none
, sd_none
, sd_none
, sd_ac
,
145 sd_bcr
, sd_ac
, sd_ac
, sd_adtc
, sd_ac
, sd_ac
, sd_none
, sd_ac
,
146 sd_ac
, sd_adtc
, sd_adtc
, sd_none
, sd_none
, sd_none
, sd_none
, sd_none
,
147 sd_adtc
, sd_adtc
, sd_adtc
, sd_adtc
, sd_ac
, sd_ac
, sd_adtc
, sd_none
,
148 sd_ac
, sd_ac
, sd_none
, sd_none
, sd_none
, sd_none
, sd_ac
, sd_none
,
149 sd_none
, sd_none
, sd_bc
, sd_none
, sd_none
, sd_none
, sd_none
, sd_none
,
150 sd_none
, sd_none
, sd_none
, sd_none
, sd_none
, sd_none
, sd_none
, sd_ac
,
151 sd_adtc
, sd_none
, sd_none
, sd_none
, sd_none
, sd_none
, sd_none
, sd_none
,
154 static const int sd_cmd_class
[64] = {
155 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 1, 0, 0, 0, 0,
156 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 6, 6, 6, 6,
157 5, 5, 10, 10, 10, 10, 5, 9, 9, 9, 7, 7, 7, 7, 7, 7,
158 7, 7, 10, 7, 9, 9, 9, 8, 8, 10, 8, 8, 8, 8, 8, 8,
161 static uint8_t sd_crc7(void *message
, size_t width
)
164 uint8_t shift_reg
= 0x00;
165 uint8_t *msg
= (uint8_t *) message
;
167 for (i
= 0; i
< width
; i
++, msg
++)
168 for (bit
= 7; bit
>= 0; bit
--) {
170 if ((shift_reg
>> 7) ^ ((*msg
>> bit
) & 1))
177 static uint16_t sd_crc16(void *message
, size_t width
)
180 uint16_t shift_reg
= 0x0000;
181 uint16_t *msg
= (uint16_t *) message
;
184 for (i
= 0; i
< width
; i
++, msg
++)
185 for (bit
= 15; bit
>= 0; bit
--) {
187 if ((shift_reg
>> 15) ^ ((*msg
>> bit
) & 1))
194 static void sd_set_ocr(SDState
*sd
)
196 /* All voltages OK, card power-up OK, Standard Capacity SD Memory Card */
197 sd
->ocr
= 0x80ffff00;
200 static void sd_set_scr(SDState
*sd
)
202 sd
->scr
[0] = 0x00; /* SCR Structure */
203 sd
->scr
[1] = 0x2f; /* SD Security Support */
219 static void sd_set_cid(SDState
*sd
)
221 sd
->cid
[0] = MID
; /* Fake card manufacturer ID (MID) */
222 sd
->cid
[1] = OID
[0]; /* OEM/Application ID (OID) */
224 sd
->cid
[3] = PNM
[0]; /* Fake product name (PNM) */
229 sd
->cid
[8] = PRV
; /* Fake product revision (PRV) */
230 sd
->cid
[9] = 0xde; /* Fake serial number (PSN) */
234 sd
->cid
[13] = 0x00 | /* Manufacture date (MDT) */
235 ((MDT_YR
- 2000) / 10);
236 sd
->cid
[14] = ((MDT_YR
% 10) << 4) | MDT_MON
;
237 sd
->cid
[15] = (sd_crc7(sd
->cid
, 15) << 1) | 1;
240 #define HWBLOCK_SHIFT 9 /* 512 bytes */
241 #define SECTOR_SHIFT 5 /* 16 kilobytes */
242 #define WPGROUP_SHIFT 7 /* 2 megs */
243 #define CMULT_SHIFT 9 /* 512 times HWBLOCK_SIZE */
244 #define WPGROUP_SIZE (1 << (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT))
246 static const uint8_t sd_csd_rw_mask
[16] = {
247 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
248 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfe,
251 static void sd_set_csd(SDState
*sd
, uint64_t size
)
253 uint32_t csize
= (size
>> (CMULT_SHIFT
+ HWBLOCK_SHIFT
)) - 1;
254 uint32_t sectsize
= (1 << (SECTOR_SHIFT
+ 1)) - 1;
255 uint32_t wpsize
= (1 << (WPGROUP_SHIFT
+ 1)) - 1;
257 if (size
<= 0x40000000) { /* Standard Capacity SD */
258 sd
->csd
[0] = 0x00; /* CSD structure */
259 sd
->csd
[1] = 0x26; /* Data read access-time-1 */
260 sd
->csd
[2] = 0x00; /* Data read access-time-2 */
261 sd
->csd
[3] = 0x5a; /* Max. data transfer rate */
262 sd
->csd
[4] = 0x5f; /* Card Command Classes */
263 sd
->csd
[5] = 0x50 | /* Max. read data block length */
265 sd
->csd
[6] = 0xe0 | /* Partial block for read allowed */
266 ((csize
>> 10) & 0x03);
267 sd
->csd
[7] = 0x00 | /* Device size */
268 ((csize
>> 2) & 0xff);
269 sd
->csd
[8] = 0x3f | /* Max. read current */
270 ((csize
<< 6) & 0xc0);
271 sd
->csd
[9] = 0xfc | /* Max. write current */
272 ((CMULT_SHIFT
- 2) >> 1);
273 sd
->csd
[10] = 0x40 | /* Erase sector size */
274 (((CMULT_SHIFT
- 2) << 7) & 0x80) | (sectsize
>> 1);
275 sd
->csd
[11] = 0x00 | /* Write protect group size */
276 ((sectsize
<< 7) & 0x80) | wpsize
;
277 sd
->csd
[12] = 0x90 | /* Write speed factor */
278 (HWBLOCK_SHIFT
>> 2);
279 sd
->csd
[13] = 0x20 | /* Max. write data block length */
280 ((HWBLOCK_SHIFT
<< 6) & 0xc0);
281 sd
->csd
[14] = 0x00; /* File format group */
282 sd
->csd
[15] = (sd_crc7(sd
->csd
, 15) << 1) | 1;
293 sd
->csd
[7] = (size
>> 16) & 0xff;
294 sd
->csd
[8] = (size
>> 8) & 0xff;
295 sd
->csd
[9] = (size
& 0xff);
302 sd
->ocr
|= 1 << 30; /* High Capacity SD Memory Card */
306 static void sd_set_rca(SDState
*sd
)
311 /* Card status bits, split by clear condition:
312 * A : According to the card current state
313 * B : Always related to the previous command
314 * C : Cleared by read
316 #define CARD_STATUS_A 0x02004100
317 #define CARD_STATUS_B 0x00c01e00
318 #define CARD_STATUS_C 0xfd39a028
320 static void sd_set_cardstatus(SDState
*sd
)
322 sd
->card_status
= 0x00000100;
325 static void sd_set_sdstatus(SDState
*sd
)
327 memset(sd
->sd_status
, 0, 64);
330 static int sd_req_crc_validate(SDRequest
*req
)
333 buffer
[0] = 0x40 | req
->cmd
;
334 buffer
[1] = (req
->arg
>> 24) & 0xff;
335 buffer
[2] = (req
->arg
>> 16) & 0xff;
336 buffer
[3] = (req
->arg
>> 8) & 0xff;
337 buffer
[4] = (req
->arg
>> 0) & 0xff;
339 return sd_crc7(buffer
, 5) != req
->crc
; /* TODO */
342 static void sd_response_r1_make(SDState
*sd
, uint8_t *response
)
344 uint32_t status
= sd
->card_status
;
345 /* Clear the "clear on read" status bits */
346 sd
->card_status
&= ~CARD_STATUS_C
;
348 response
[0] = (status
>> 24) & 0xff;
349 response
[1] = (status
>> 16) & 0xff;
350 response
[2] = (status
>> 8) & 0xff;
351 response
[3] = (status
>> 0) & 0xff;
354 static void sd_response_r3_make(SDState
*sd
, uint8_t *response
)
356 response
[0] = (sd
->ocr
>> 24) & 0xff;
357 response
[1] = (sd
->ocr
>> 16) & 0xff;
358 response
[2] = (sd
->ocr
>> 8) & 0xff;
359 response
[3] = (sd
->ocr
>> 0) & 0xff;
362 static void sd_response_r6_make(SDState
*sd
, uint8_t *response
)
368 status
= ((sd
->card_status
>> 8) & 0xc000) |
369 ((sd
->card_status
>> 6) & 0x2000) |
370 (sd
->card_status
& 0x1fff);
371 sd
->card_status
&= ~(CARD_STATUS_C
& 0xc81fff);
373 response
[0] = (arg
>> 8) & 0xff;
374 response
[1] = arg
& 0xff;
375 response
[2] = (status
>> 8) & 0xff;
376 response
[3] = status
& 0xff;
379 static void sd_response_r7_make(SDState
*sd
, uint8_t *response
)
381 response
[0] = (sd
->vhs
>> 24) & 0xff;
382 response
[1] = (sd
->vhs
>> 16) & 0xff;
383 response
[2] = (sd
->vhs
>> 8) & 0xff;
384 response
[3] = (sd
->vhs
>> 0) & 0xff;
387 static inline uint64_t sd_addr_to_wpnum(uint64_t addr
)
389 return addr
>> (HWBLOCK_SHIFT
+ SECTOR_SHIFT
+ WPGROUP_SHIFT
);
392 static void sd_reset(SDState
*sd
)
398 blk_get_geometry(sd
->blk
, §
);
404 sect
= sd_addr_to_wpnum(size
) + 1;
406 sd
->state
= sd_idle_state
;
411 sd_set_csd(sd
, size
);
412 sd_set_cardstatus(sd
);
415 g_free(sd
->wp_groups
);
416 sd
->wp_switch
= sd
->blk
? blk_is_read_only(sd
->blk
) : false;
417 sd
->wpgrps_size
= sect
;
418 sd
->wp_groups
= bitmap_new(sd
->wpgrps_size
);
419 memset(sd
->function_group
, 0, sizeof(sd
->function_group
));
425 sd
->expecting_acmd
= false;
428 static void sd_cardchange(void *opaque
, bool load
)
430 SDState
*sd
= opaque
;
432 qemu_set_irq(sd
->inserted_cb
, blk_is_inserted(sd
->blk
));
433 if (blk_is_inserted(sd
->blk
)) {
435 qemu_set_irq(sd
->readonly_cb
, sd
->wp_switch
);
439 static const BlockDevOps sd_block_ops
= {
440 .change_media_cb
= sd_cardchange
,
443 static const VMStateDescription sd_vmstate
= {
446 .minimum_version_id
= 1,
447 .fields
= (VMStateField
[]) {
448 VMSTATE_UINT32(mode
, SDState
),
449 VMSTATE_INT32(state
, SDState
),
450 VMSTATE_UINT8_ARRAY(cid
, SDState
, 16),
451 VMSTATE_UINT8_ARRAY(csd
, SDState
, 16),
452 VMSTATE_UINT16(rca
, SDState
),
453 VMSTATE_UINT32(card_status
, SDState
),
454 VMSTATE_PARTIAL_BUFFER(sd_status
, SDState
, 1),
455 VMSTATE_UINT32(vhs
, SDState
),
456 VMSTATE_BITMAP(wp_groups
, SDState
, 0, wpgrps_size
),
457 VMSTATE_UINT32(blk_len
, SDState
),
458 VMSTATE_UINT32(erase_start
, SDState
),
459 VMSTATE_UINT32(erase_end
, SDState
),
460 VMSTATE_UINT8_ARRAY(pwd
, SDState
, 16),
461 VMSTATE_UINT32(pwd_len
, SDState
),
462 VMSTATE_UINT8_ARRAY(function_group
, SDState
, 6),
463 VMSTATE_UINT8(current_cmd
, SDState
),
464 VMSTATE_BOOL(expecting_acmd
, SDState
),
465 VMSTATE_UINT32(blk_written
, SDState
),
466 VMSTATE_UINT64(data_start
, SDState
),
467 VMSTATE_UINT32(data_offset
, SDState
),
468 VMSTATE_UINT8_ARRAY(data
, SDState
, 512),
469 VMSTATE_BUFFER_POINTER_UNSAFE(buf
, SDState
, 1, 512),
470 VMSTATE_BOOL(enable
, SDState
),
471 VMSTATE_END_OF_LIST()
475 /* We do not model the chip select pin, so allow the board to select
476 whether card should be in SSI or MMC/SD mode. It is also up to the
477 board to ensure that ssi transfers only occur when the chip select
479 SDState
*sd_init(BlockBackend
*blk
, bool is_spi
)
483 if (blk
&& blk_is_read_only(blk
)) {
484 fprintf(stderr
, "sd_init: Cannot use read-only drive\n");
488 sd
= (SDState
*) g_malloc0(sizeof(SDState
));
489 sd
->buf
= blk_blockalign(blk
, 512);
495 /* Attach dev if not already attached. (This call ignores an
496 * error return code if sd->blk is already attached.) */
497 /* FIXME ignoring blk_attach_dev() failure is dangerously brittle */
498 blk_attach_dev(sd
->blk
, sd
);
499 blk_set_dev_ops(sd
->blk
, &sd_block_ops
, sd
);
501 vmstate_register(NULL
, -1, &sd_vmstate
, sd
);
505 void sd_set_cb(SDState
*sd
, qemu_irq readonly
, qemu_irq insert
)
507 sd
->readonly_cb
= readonly
;
508 sd
->inserted_cb
= insert
;
509 qemu_set_irq(readonly
, sd
->blk
? blk_is_read_only(sd
->blk
) : 0);
510 qemu_set_irq(insert
, sd
->blk
? blk_is_inserted(sd
->blk
) : 0);
513 static void sd_erase(SDState
*sd
)
516 uint64_t erase_start
= sd
->erase_start
;
517 uint64_t erase_end
= sd
->erase_end
;
519 if (!sd
->erase_start
|| !sd
->erase_end
) {
520 sd
->card_status
|= ERASE_SEQ_ERROR
;
524 if (extract32(sd
->ocr
, OCR_CCS_BITN
, 1)) {
525 /* High capacity memory card: erase units are 512 byte blocks */
530 erase_start
= sd_addr_to_wpnum(erase_start
);
531 erase_end
= sd_addr_to_wpnum(erase_end
);
536 for (i
= erase_start
; i
<= erase_end
; i
++) {
537 if (test_bit(i
, sd
->wp_groups
)) {
538 sd
->card_status
|= WP_ERASE_SKIP
;
543 static uint32_t sd_wpbits(SDState
*sd
, uint64_t addr
)
548 wpnum
= sd_addr_to_wpnum(addr
);
550 for (i
= 0; i
< 32; i
++, wpnum
++, addr
+= WPGROUP_SIZE
) {
551 if (addr
< sd
->size
&& test_bit(wpnum
, sd
->wp_groups
)) {
559 static void sd_function_switch(SDState
*sd
, uint32_t arg
)
561 int i
, mode
, new_func
, crc
;
562 mode
= !!(arg
& 0x80000000);
564 sd
->data
[0] = 0x00; /* Maximum current consumption */
566 sd
->data
[2] = 0x80; /* Supported group 6 functions */
568 sd
->data
[4] = 0x80; /* Supported group 5 functions */
570 sd
->data
[6] = 0x80; /* Supported group 4 functions */
572 sd
->data
[8] = 0x80; /* Supported group 3 functions */
574 sd
->data
[10] = 0x80; /* Supported group 2 functions */
576 sd
->data
[12] = 0x80; /* Supported group 1 functions */
578 for (i
= 0; i
< 6; i
++) {
579 new_func
= (arg
>> (i
* 4)) & 0x0f;
580 if (mode
&& new_func
!= 0x0f)
581 sd
->function_group
[i
] = new_func
;
582 sd
->data
[14 + (i
>> 1)] = new_func
<< ((i
* 4) & 4);
584 memset(&sd
->data
[17], 0, 47);
585 crc
= sd_crc16(sd
->data
, 64);
586 sd
->data
[65] = crc
>> 8;
587 sd
->data
[66] = crc
& 0xff;
590 static inline bool sd_wp_addr(SDState
*sd
, uint64_t addr
)
592 return test_bit(sd_addr_to_wpnum(addr
), sd
->wp_groups
);
595 static void sd_lock_command(SDState
*sd
)
597 int erase
, lock
, clr_pwd
, set_pwd
, pwd_len
;
598 erase
= !!(sd
->data
[0] & 0x08);
599 lock
= sd
->data
[0] & 0x04;
600 clr_pwd
= sd
->data
[0] & 0x02;
601 set_pwd
= sd
->data
[0] & 0x01;
604 pwd_len
= sd
->data
[1];
609 if (!(sd
->card_status
& CARD_IS_LOCKED
) || sd
->blk_len
> 1 ||
610 set_pwd
|| clr_pwd
|| lock
|| sd
->wp_switch
||
611 (sd
->csd
[14] & 0x20)) {
612 sd
->card_status
|= LOCK_UNLOCK_FAILED
;
615 bitmap_zero(sd
->wp_groups
, sd
->wpgrps_size
);
616 sd
->csd
[14] &= ~0x10;
617 sd
->card_status
&= ~CARD_IS_LOCKED
;
619 /* Erasing the entire card here! */
620 fprintf(stderr
, "SD: Card force-erased by CMD42\n");
624 if (sd
->blk_len
< 2 + pwd_len
||
625 pwd_len
<= sd
->pwd_len
||
626 pwd_len
> sd
->pwd_len
+ 16) {
627 sd
->card_status
|= LOCK_UNLOCK_FAILED
;
631 if (sd
->pwd_len
&& memcmp(sd
->pwd
, sd
->data
+ 2, sd
->pwd_len
)) {
632 sd
->card_status
|= LOCK_UNLOCK_FAILED
;
636 pwd_len
-= sd
->pwd_len
;
637 if ((pwd_len
&& !set_pwd
) ||
638 (clr_pwd
&& (set_pwd
|| lock
)) ||
639 (lock
&& !sd
->pwd_len
&& !set_pwd
) ||
640 (!set_pwd
&& !clr_pwd
&&
641 (((sd
->card_status
& CARD_IS_LOCKED
) && lock
) ||
642 (!(sd
->card_status
& CARD_IS_LOCKED
) && !lock
)))) {
643 sd
->card_status
|= LOCK_UNLOCK_FAILED
;
648 memcpy(sd
->pwd
, sd
->data
+ 2 + sd
->pwd_len
, pwd_len
);
649 sd
->pwd_len
= pwd_len
;
657 sd
->card_status
|= CARD_IS_LOCKED
;
659 sd
->card_status
&= ~CARD_IS_LOCKED
;
662 static sd_rsp_type_t
sd_normal_command(SDState
*sd
,
665 uint32_t rca
= 0x0000;
666 uint64_t addr
= (sd
->ocr
& (1 << 30)) ? (uint64_t) req
.arg
<< 9 : req
.arg
;
668 /* Not interpreting this as an app command */
669 sd
->card_status
&= ~APP_CMD
;
671 if (sd_cmd_type
[req
.cmd
] == sd_ac
|| sd_cmd_type
[req
.cmd
] == sd_adtc
)
674 DPRINTF("CMD%d 0x%08x state %d\n", req
.cmd
, req
.arg
, sd
->state
);
676 /* Basic commands (Class 0 and Class 1) */
677 case 0: /* CMD0: GO_IDLE_STATE */
679 case sd_inactive_state
:
680 return sd
->spi
? sd_r1
: sd_r0
;
683 sd
->state
= sd_idle_state
;
685 return sd
->spi
? sd_r1
: sd_r0
;
689 case 1: /* CMD1: SEND_OP_CMD */
693 sd
->state
= sd_transfer_state
;
696 case 2: /* CMD2: ALL_SEND_CID */
701 sd
->state
= sd_identification_state
;
709 case 3: /* CMD3: SEND_RELATIVE_ADDR */
713 case sd_identification_state
:
714 case sd_standby_state
:
715 sd
->state
= sd_standby_state
;
724 case 4: /* CMD4: SEND_DSR */
728 case sd_standby_state
:
736 case 5: /* CMD5: reserved for SDIO cards */
739 case 6: /* CMD6: SWITCH_FUNCTION */
743 case sd_data_transfer_mode
:
744 sd_function_switch(sd
, req
.arg
);
745 sd
->state
= sd_sendingdata_state
;
755 case 7: /* CMD7: SELECT/DESELECT_CARD */
759 case sd_standby_state
:
763 sd
->state
= sd_transfer_state
;
766 case sd_transfer_state
:
767 case sd_sendingdata_state
:
771 sd
->state
= sd_standby_state
;
774 case sd_disconnect_state
:
778 sd
->state
= sd_programming_state
;
781 case sd_programming_state
:
785 sd
->state
= sd_disconnect_state
;
793 case 8: /* CMD8: SEND_IF_COND */
794 /* Physical Layer Specification Version 2.00 command */
799 /* No response if not exactly one VHS bit is set. */
800 if (!(req
.arg
>> 8) || (req
.arg
>> (ctz32(req
.arg
& ~0xff) + 1))) {
801 return sd
->spi
? sd_r7
: sd_r0
;
813 case 9: /* CMD9: SEND_CSD */
815 case sd_standby_state
:
821 case sd_transfer_state
:
824 sd
->state
= sd_sendingdata_state
;
825 memcpy(sd
->data
, sd
->csd
, 16);
826 sd
->data_start
= addr
;
835 case 10: /* CMD10: SEND_CID */
837 case sd_standby_state
:
843 case sd_transfer_state
:
846 sd
->state
= sd_sendingdata_state
;
847 memcpy(sd
->data
, sd
->cid
, 16);
848 sd
->data_start
= addr
;
857 case 11: /* CMD11: READ_DAT_UNTIL_STOP */
861 case sd_transfer_state
:
862 sd
->state
= sd_sendingdata_state
;
863 sd
->data_start
= req
.arg
;
866 if (sd
->data_start
+ sd
->blk_len
> sd
->size
)
867 sd
->card_status
|= ADDRESS_ERROR
;
875 case 12: /* CMD12: STOP_TRANSMISSION */
877 case sd_sendingdata_state
:
878 sd
->state
= sd_transfer_state
;
881 case sd_receivingdata_state
:
882 sd
->state
= sd_programming_state
;
883 /* Bzzzzzzztt .... Operation complete. */
884 sd
->state
= sd_transfer_state
;
892 case 13: /* CMD13: SEND_STATUS */
894 case sd_data_transfer_mode
:
905 case 15: /* CMD15: GO_INACTIVE_STATE */
909 case sd_data_transfer_mode
:
913 sd
->state
= sd_inactive_state
;
921 /* Block read commands (Classs 2) */
922 case 16: /* CMD16: SET_BLOCKLEN */
924 case sd_transfer_state
:
925 if (req
.arg
> (1 << HWBLOCK_SHIFT
))
926 sd
->card_status
|= BLOCK_LEN_ERROR
;
928 sd
->blk_len
= req
.arg
;
937 case 17: /* CMD17: READ_SINGLE_BLOCK */
939 case sd_transfer_state
:
940 sd
->state
= sd_sendingdata_state
;
941 sd
->data_start
= addr
;
944 if (sd
->data_start
+ sd
->blk_len
> sd
->size
)
945 sd
->card_status
|= ADDRESS_ERROR
;
953 case 18: /* CMD18: READ_MULTIPLE_BLOCK */
955 case sd_transfer_state
:
956 sd
->state
= sd_sendingdata_state
;
957 sd
->data_start
= addr
;
960 if (sd
->data_start
+ sd
->blk_len
> sd
->size
)
961 sd
->card_status
|= ADDRESS_ERROR
;
969 /* Block write commands (Class 4) */
970 case 24: /* CMD24: WRITE_SINGLE_BLOCK */
972 goto unimplemented_cmd
;
974 case sd_transfer_state
:
975 /* Writing in SPI mode not implemented. */
978 sd
->state
= sd_receivingdata_state
;
979 sd
->data_start
= addr
;
983 if (sd
->data_start
+ sd
->blk_len
> sd
->size
)
984 sd
->card_status
|= ADDRESS_ERROR
;
985 if (sd_wp_addr(sd
, sd
->data_start
))
986 sd
->card_status
|= WP_VIOLATION
;
987 if (sd
->csd
[14] & 0x30)
988 sd
->card_status
|= WP_VIOLATION
;
996 case 25: /* CMD25: WRITE_MULTIPLE_BLOCK */
998 goto unimplemented_cmd
;
1000 case sd_transfer_state
:
1001 /* Writing in SPI mode not implemented. */
1004 sd
->state
= sd_receivingdata_state
;
1005 sd
->data_start
= addr
;
1006 sd
->data_offset
= 0;
1007 sd
->blk_written
= 0;
1009 if (sd
->data_start
+ sd
->blk_len
> sd
->size
)
1010 sd
->card_status
|= ADDRESS_ERROR
;
1011 if (sd_wp_addr(sd
, sd
->data_start
))
1012 sd
->card_status
|= WP_VIOLATION
;
1013 if (sd
->csd
[14] & 0x30)
1014 sd
->card_status
|= WP_VIOLATION
;
1022 case 26: /* CMD26: PROGRAM_CID */
1025 switch (sd
->state
) {
1026 case sd_transfer_state
:
1027 sd
->state
= sd_receivingdata_state
;
1029 sd
->data_offset
= 0;
1037 case 27: /* CMD27: PROGRAM_CSD */
1039 goto unimplemented_cmd
;
1040 switch (sd
->state
) {
1041 case sd_transfer_state
:
1042 sd
->state
= sd_receivingdata_state
;
1044 sd
->data_offset
= 0;
1052 /* Write protection (Class 6) */
1053 case 28: /* CMD28: SET_WRITE_PROT */
1054 switch (sd
->state
) {
1055 case sd_transfer_state
:
1056 if (addr
>= sd
->size
) {
1057 sd
->card_status
|= ADDRESS_ERROR
;
1061 sd
->state
= sd_programming_state
;
1062 set_bit(sd_addr_to_wpnum(addr
), sd
->wp_groups
);
1063 /* Bzzzzzzztt .... Operation complete. */
1064 sd
->state
= sd_transfer_state
;
1072 case 29: /* CMD29: CLR_WRITE_PROT */
1073 switch (sd
->state
) {
1074 case sd_transfer_state
:
1075 if (addr
>= sd
->size
) {
1076 sd
->card_status
|= ADDRESS_ERROR
;
1080 sd
->state
= sd_programming_state
;
1081 clear_bit(sd_addr_to_wpnum(addr
), sd
->wp_groups
);
1082 /* Bzzzzzzztt .... Operation complete. */
1083 sd
->state
= sd_transfer_state
;
1091 case 30: /* CMD30: SEND_WRITE_PROT */
1092 switch (sd
->state
) {
1093 case sd_transfer_state
:
1094 sd
->state
= sd_sendingdata_state
;
1095 *(uint32_t *) sd
->data
= sd_wpbits(sd
, req
.arg
);
1096 sd
->data_start
= addr
;
1097 sd
->data_offset
= 0;
1105 /* Erase commands (Class 5) */
1106 case 32: /* CMD32: ERASE_WR_BLK_START */
1107 switch (sd
->state
) {
1108 case sd_transfer_state
:
1109 sd
->erase_start
= req
.arg
;
1117 case 33: /* CMD33: ERASE_WR_BLK_END */
1118 switch (sd
->state
) {
1119 case sd_transfer_state
:
1120 sd
->erase_end
= req
.arg
;
1128 case 38: /* CMD38: ERASE */
1129 switch (sd
->state
) {
1130 case sd_transfer_state
:
1131 if (sd
->csd
[14] & 0x30) {
1132 sd
->card_status
|= WP_VIOLATION
;
1136 sd
->state
= sd_programming_state
;
1138 /* Bzzzzzzztt .... Operation complete. */
1139 sd
->state
= sd_transfer_state
;
1147 /* Lock card commands (Class 7) */
1148 case 42: /* CMD42: LOCK_UNLOCK */
1150 goto unimplemented_cmd
;
1151 switch (sd
->state
) {
1152 case sd_transfer_state
:
1153 sd
->state
= sd_receivingdata_state
;
1155 sd
->data_offset
= 0;
1165 /* CMD52, CMD53: reserved for SDIO cards
1166 * (see the SDIO Simplified Specification V2.0)
1167 * Handle as illegal command but do not complain
1168 * on stderr, as some OSes may use these in their
1169 * probing for presence of an SDIO card.
1173 /* Application specific commands (Class 8) */
1174 case 55: /* CMD55: APP_CMD */
1178 sd
->expecting_acmd
= true;
1179 sd
->card_status
|= APP_CMD
;
1182 case 56: /* CMD56: GEN_CMD */
1183 fprintf(stderr
, "SD: GEN_CMD 0x%08x\n", req
.arg
);
1185 switch (sd
->state
) {
1186 case sd_transfer_state
:
1187 sd
->data_offset
= 0;
1189 sd
->state
= sd_sendingdata_state
;
1191 sd
->state
= sd_receivingdata_state
;
1201 fprintf(stderr
, "SD: Unknown CMD%i\n", req
.cmd
);
1205 /* Commands that are recognised but not yet implemented in SPI mode. */
1206 fprintf(stderr
, "SD: CMD%i not implemented in SPI mode\n", req
.cmd
);
1210 fprintf(stderr
, "SD: CMD%i in a wrong state\n", req
.cmd
);
1214 static sd_rsp_type_t
sd_app_command(SDState
*sd
,
1217 DPRINTF("ACMD%d 0x%08x\n", req
.cmd
, req
.arg
);
1218 sd
->card_status
|= APP_CMD
;
1220 case 6: /* ACMD6: SET_BUS_WIDTH */
1221 switch (sd
->state
) {
1222 case sd_transfer_state
:
1223 sd
->sd_status
[0] &= 0x3f;
1224 sd
->sd_status
[0] |= (req
.arg
& 0x03) << 6;
1232 case 13: /* ACMD13: SD_STATUS */
1233 switch (sd
->state
) {
1234 case sd_transfer_state
:
1235 sd
->state
= sd_sendingdata_state
;
1237 sd
->data_offset
= 0;
1245 case 22: /* ACMD22: SEND_NUM_WR_BLOCKS */
1246 switch (sd
->state
) {
1247 case sd_transfer_state
:
1248 *(uint32_t *) sd
->data
= sd
->blk_written
;
1250 sd
->state
= sd_sendingdata_state
;
1252 sd
->data_offset
= 0;
1260 case 23: /* ACMD23: SET_WR_BLK_ERASE_COUNT */
1261 switch (sd
->state
) {
1262 case sd_transfer_state
:
1270 case 41: /* ACMD41: SD_APP_OP_COND */
1273 sd
->state
= sd_transfer_state
;
1276 switch (sd
->state
) {
1278 /* We accept any voltage. 10000 V is nothing.
1280 * We don't model init delay so just advance straight to ready state
1281 * unless it's an enquiry ACMD41 (bits 23:0 == 0).
1283 if (req
.arg
& ACMD41_ENQUIRY_MASK
) {
1284 sd
->state
= sd_ready_state
;
1294 case 42: /* ACMD42: SET_CLR_CARD_DETECT */
1295 switch (sd
->state
) {
1296 case sd_transfer_state
:
1297 /* Bringing in the 50KOhm pull-up resistor... Done. */
1305 case 51: /* ACMD51: SEND_SCR */
1306 switch (sd
->state
) {
1307 case sd_transfer_state
:
1308 sd
->state
= sd_sendingdata_state
;
1310 sd
->data_offset
= 0;
1319 /* Fall back to standard commands. */
1320 return sd_normal_command(sd
, req
);
1323 fprintf(stderr
, "SD: ACMD%i in a wrong state\n", req
.cmd
);
1327 static int cmd_valid_while_locked(SDState
*sd
, SDRequest
*req
)
1329 /* Valid commands in locked state:
1331 * lock card class (7)
1333 * implicitly, the ACMD prefix CMD55
1335 * Anything else provokes an "illegal command" response.
1337 if (sd
->expecting_acmd
) {
1338 return req
->cmd
== 41 || req
->cmd
== 42;
1340 if (req
->cmd
== 16 || req
->cmd
== 55) {
1343 return sd_cmd_class
[req
->cmd
] == 0 || sd_cmd_class
[req
->cmd
] == 7;
1346 int sd_do_command(SDState
*sd
, SDRequest
*req
,
1347 uint8_t *response
) {
1349 sd_rsp_type_t rtype
;
1352 if (!sd
->blk
|| !blk_is_inserted(sd
->blk
) || !sd
->enable
) {
1356 if (sd_req_crc_validate(req
)) {
1357 sd
->card_status
|= COM_CRC_ERROR
;
1362 if (sd
->card_status
& CARD_IS_LOCKED
) {
1363 if (!cmd_valid_while_locked(sd
, req
)) {
1364 sd
->card_status
|= ILLEGAL_COMMAND
;
1365 sd
->expecting_acmd
= false;
1366 fprintf(stderr
, "SD: Card is locked\n");
1372 last_state
= sd
->state
;
1375 if (sd
->expecting_acmd
) {
1376 sd
->expecting_acmd
= false;
1377 rtype
= sd_app_command(sd
, *req
);
1379 rtype
= sd_normal_command(sd
, *req
);
1382 if (rtype
== sd_illegal
) {
1383 sd
->card_status
|= ILLEGAL_COMMAND
;
1385 /* Valid command, we can update the 'state before command' bits.
1386 * (Do this now so they appear in r1 responses.)
1388 sd
->current_cmd
= req
->cmd
;
1389 sd
->card_status
&= ~CURRENT_STATE
;
1390 sd
->card_status
|= (last_state
<< 9);
1397 sd_response_r1_make(sd
, response
);
1402 memcpy(response
, sd
->cid
, sizeof(sd
->cid
));
1407 memcpy(response
, sd
->csd
, sizeof(sd
->csd
));
1412 sd_response_r3_make(sd
, response
);
1417 sd_response_r6_make(sd
, response
);
1422 sd_response_r7_make(sd
, response
);
1433 if (rtype
!= sd_illegal
) {
1434 /* Clear the "clear on valid command" status bits now we've
1437 sd
->card_status
&= ~CARD_STATUS_B
;
1443 DPRINTF("Response:");
1444 for (i
= 0; i
< rsplen
; i
++)
1445 fprintf(stderr
, " %02x", response
[i
]);
1446 fprintf(stderr
, " state %d\n", sd
->state
);
1448 DPRINTF("No response %d\n", sd
->state
);
1455 static void sd_blk_read(SDState
*sd
, uint64_t addr
, uint32_t len
)
1457 uint64_t end
= addr
+ len
;
1459 DPRINTF("sd_blk_read: addr = 0x%08llx, len = %d\n",
1460 (unsigned long long) addr
, len
);
1461 if (!sd
->blk
|| blk_read(sd
->blk
, addr
>> 9, sd
->buf
, 1) < 0) {
1462 fprintf(stderr
, "sd_blk_read: read error on host side\n");
1466 if (end
> (addr
& ~511) + 512) {
1467 memcpy(sd
->data
, sd
->buf
+ (addr
& 511), 512 - (addr
& 511));
1469 if (blk_read(sd
->blk
, end
>> 9, sd
->buf
, 1) < 0) {
1470 fprintf(stderr
, "sd_blk_read: read error on host side\n");
1473 memcpy(sd
->data
+ 512 - (addr
& 511), sd
->buf
, end
& 511);
1475 memcpy(sd
->data
, sd
->buf
+ (addr
& 511), len
);
1478 static void sd_blk_write(SDState
*sd
, uint64_t addr
, uint32_t len
)
1480 uint64_t end
= addr
+ len
;
1482 if ((addr
& 511) || len
< 512)
1483 if (!sd
->blk
|| blk_read(sd
->blk
, addr
>> 9, sd
->buf
, 1) < 0) {
1484 fprintf(stderr
, "sd_blk_write: read error on host side\n");
1488 if (end
> (addr
& ~511) + 512) {
1489 memcpy(sd
->buf
+ (addr
& 511), sd
->data
, 512 - (addr
& 511));
1490 if (blk_write(sd
->blk
, addr
>> 9, sd
->buf
, 1) < 0) {
1491 fprintf(stderr
, "sd_blk_write: write error on host side\n");
1495 if (blk_read(sd
->blk
, end
>> 9, sd
->buf
, 1) < 0) {
1496 fprintf(stderr
, "sd_blk_write: read error on host side\n");
1499 memcpy(sd
->buf
, sd
->data
+ 512 - (addr
& 511), end
& 511);
1500 if (blk_write(sd
->blk
, end
>> 9, sd
->buf
, 1) < 0) {
1501 fprintf(stderr
, "sd_blk_write: write error on host side\n");
1504 memcpy(sd
->buf
+ (addr
& 511), sd
->data
, len
);
1505 if (!sd
->blk
|| blk_write(sd
->blk
, addr
>> 9, sd
->buf
, 1) < 0) {
1506 fprintf(stderr
, "sd_blk_write: write error on host side\n");
1511 #define BLK_READ_BLOCK(a, len) sd_blk_read(sd, a, len)
1512 #define BLK_WRITE_BLOCK(a, len) sd_blk_write(sd, a, len)
1513 #define APP_READ_BLOCK(a, len) memset(sd->data, 0xec, len)
1514 #define APP_WRITE_BLOCK(a, len)
1516 void sd_write_data(SDState
*sd
, uint8_t value
)
1520 if (!sd
->blk
|| !blk_is_inserted(sd
->blk
) || !sd
->enable
)
1523 if (sd
->state
!= sd_receivingdata_state
) {
1524 fprintf(stderr
, "sd_write_data: not in Receiving-Data state\n");
1528 if (sd
->card_status
& (ADDRESS_ERROR
| WP_VIOLATION
))
1531 switch (sd
->current_cmd
) {
1532 case 24: /* CMD24: WRITE_SINGLE_BLOCK */
1533 sd
->data
[sd
->data_offset
++] = value
;
1534 if (sd
->data_offset
>= sd
->blk_len
) {
1535 /* TODO: Check CRC before committing */
1536 sd
->state
= sd_programming_state
;
1537 BLK_WRITE_BLOCK(sd
->data_start
, sd
->data_offset
);
1539 sd
->csd
[14] |= 0x40;
1540 /* Bzzzzzzztt .... Operation complete. */
1541 sd
->state
= sd_transfer_state
;
1545 case 25: /* CMD25: WRITE_MULTIPLE_BLOCK */
1546 if (sd
->data_offset
== 0) {
1547 /* Start of the block - let's check the address is valid */
1548 if (sd
->data_start
+ sd
->blk_len
> sd
->size
) {
1549 sd
->card_status
|= ADDRESS_ERROR
;
1552 if (sd_wp_addr(sd
, sd
->data_start
)) {
1553 sd
->card_status
|= WP_VIOLATION
;
1557 sd
->data
[sd
->data_offset
++] = value
;
1558 if (sd
->data_offset
>= sd
->blk_len
) {
1559 /* TODO: Check CRC before committing */
1560 sd
->state
= sd_programming_state
;
1561 BLK_WRITE_BLOCK(sd
->data_start
, sd
->data_offset
);
1563 sd
->data_start
+= sd
->blk_len
;
1564 sd
->data_offset
= 0;
1565 sd
->csd
[14] |= 0x40;
1567 /* Bzzzzzzztt .... Operation complete. */
1568 sd
->state
= sd_receivingdata_state
;
1572 case 26: /* CMD26: PROGRAM_CID */
1573 sd
->data
[sd
->data_offset
++] = value
;
1574 if (sd
->data_offset
>= sizeof(sd
->cid
)) {
1575 /* TODO: Check CRC before committing */
1576 sd
->state
= sd_programming_state
;
1577 for (i
= 0; i
< sizeof(sd
->cid
); i
++)
1578 if ((sd
->cid
[i
] | 0x00) != sd
->data
[i
])
1579 sd
->card_status
|= CID_CSD_OVERWRITE
;
1581 if (!(sd
->card_status
& CID_CSD_OVERWRITE
))
1582 for (i
= 0; i
< sizeof(sd
->cid
); i
++) {
1584 sd
->cid
[i
] &= sd
->data
[i
];
1586 /* Bzzzzzzztt .... Operation complete. */
1587 sd
->state
= sd_transfer_state
;
1591 case 27: /* CMD27: PROGRAM_CSD */
1592 sd
->data
[sd
->data_offset
++] = value
;
1593 if (sd
->data_offset
>= sizeof(sd
->csd
)) {
1594 /* TODO: Check CRC before committing */
1595 sd
->state
= sd_programming_state
;
1596 for (i
= 0; i
< sizeof(sd
->csd
); i
++)
1597 if ((sd
->csd
[i
] | sd_csd_rw_mask
[i
]) !=
1598 (sd
->data
[i
] | sd_csd_rw_mask
[i
]))
1599 sd
->card_status
|= CID_CSD_OVERWRITE
;
1601 /* Copy flag (OTP) & Permanent write protect */
1602 if (sd
->csd
[14] & ~sd
->data
[14] & 0x60)
1603 sd
->card_status
|= CID_CSD_OVERWRITE
;
1605 if (!(sd
->card_status
& CID_CSD_OVERWRITE
))
1606 for (i
= 0; i
< sizeof(sd
->csd
); i
++) {
1607 sd
->csd
[i
] |= sd_csd_rw_mask
[i
];
1608 sd
->csd
[i
] &= sd
->data
[i
];
1610 /* Bzzzzzzztt .... Operation complete. */
1611 sd
->state
= sd_transfer_state
;
1615 case 42: /* CMD42: LOCK_UNLOCK */
1616 sd
->data
[sd
->data_offset
++] = value
;
1617 if (sd
->data_offset
>= sd
->blk_len
) {
1618 /* TODO: Check CRC before committing */
1619 sd
->state
= sd_programming_state
;
1620 sd_lock_command(sd
);
1621 /* Bzzzzzzztt .... Operation complete. */
1622 sd
->state
= sd_transfer_state
;
1626 case 56: /* CMD56: GEN_CMD */
1627 sd
->data
[sd
->data_offset
++] = value
;
1628 if (sd
->data_offset
>= sd
->blk_len
) {
1629 APP_WRITE_BLOCK(sd
->data_start
, sd
->data_offset
);
1630 sd
->state
= sd_transfer_state
;
1635 fprintf(stderr
, "sd_write_data: unknown command\n");
1640 uint8_t sd_read_data(SDState
*sd
)
1642 /* TODO: Append CRCs */
1646 if (!sd
->blk
|| !blk_is_inserted(sd
->blk
) || !sd
->enable
)
1649 if (sd
->state
!= sd_sendingdata_state
) {
1650 fprintf(stderr
, "sd_read_data: not in Sending-Data state\n");
1654 if (sd
->card_status
& (ADDRESS_ERROR
| WP_VIOLATION
))
1657 io_len
= (sd
->ocr
& (1 << 30)) ? 512 : sd
->blk_len
;
1659 switch (sd
->current_cmd
) {
1660 case 6: /* CMD6: SWITCH_FUNCTION */
1661 ret
= sd
->data
[sd
->data_offset
++];
1663 if (sd
->data_offset
>= 64)
1664 sd
->state
= sd_transfer_state
;
1667 case 9: /* CMD9: SEND_CSD */
1668 case 10: /* CMD10: SEND_CID */
1669 ret
= sd
->data
[sd
->data_offset
++];
1671 if (sd
->data_offset
>= 16)
1672 sd
->state
= sd_transfer_state
;
1675 case 11: /* CMD11: READ_DAT_UNTIL_STOP */
1676 if (sd
->data_offset
== 0)
1677 BLK_READ_BLOCK(sd
->data_start
, io_len
);
1678 ret
= sd
->data
[sd
->data_offset
++];
1680 if (sd
->data_offset
>= io_len
) {
1681 sd
->data_start
+= io_len
;
1682 sd
->data_offset
= 0;
1683 if (sd
->data_start
+ io_len
> sd
->size
) {
1684 sd
->card_status
|= ADDRESS_ERROR
;
1690 case 13: /* ACMD13: SD_STATUS */
1691 ret
= sd
->sd_status
[sd
->data_offset
++];
1693 if (sd
->data_offset
>= sizeof(sd
->sd_status
))
1694 sd
->state
= sd_transfer_state
;
1697 case 17: /* CMD17: READ_SINGLE_BLOCK */
1698 if (sd
->data_offset
== 0)
1699 BLK_READ_BLOCK(sd
->data_start
, io_len
);
1700 ret
= sd
->data
[sd
->data_offset
++];
1702 if (sd
->data_offset
>= io_len
)
1703 sd
->state
= sd_transfer_state
;
1706 case 18: /* CMD18: READ_MULTIPLE_BLOCK */
1707 if (sd
->data_offset
== 0)
1708 BLK_READ_BLOCK(sd
->data_start
, io_len
);
1709 ret
= sd
->data
[sd
->data_offset
++];
1711 if (sd
->data_offset
>= io_len
) {
1712 sd
->data_start
+= io_len
;
1713 sd
->data_offset
= 0;
1714 if (sd
->data_start
+ io_len
> sd
->size
) {
1715 sd
->card_status
|= ADDRESS_ERROR
;
1721 case 22: /* ACMD22: SEND_NUM_WR_BLOCKS */
1722 ret
= sd
->data
[sd
->data_offset
++];
1724 if (sd
->data_offset
>= 4)
1725 sd
->state
= sd_transfer_state
;
1728 case 30: /* CMD30: SEND_WRITE_PROT */
1729 ret
= sd
->data
[sd
->data_offset
++];
1731 if (sd
->data_offset
>= 4)
1732 sd
->state
= sd_transfer_state
;
1735 case 51: /* ACMD51: SEND_SCR */
1736 ret
= sd
->scr
[sd
->data_offset
++];
1738 if (sd
->data_offset
>= sizeof(sd
->scr
))
1739 sd
->state
= sd_transfer_state
;
1742 case 56: /* CMD56: GEN_CMD */
1743 if (sd
->data_offset
== 0)
1744 APP_READ_BLOCK(sd
->data_start
, sd
->blk_len
);
1745 ret
= sd
->data
[sd
->data_offset
++];
1747 if (sd
->data_offset
>= sd
->blk_len
)
1748 sd
->state
= sd_transfer_state
;
1752 fprintf(stderr
, "sd_read_data: unknown command\n");
1759 bool sd_data_ready(SDState
*sd
)
1761 return sd
->state
== sd_sendingdata_state
;
1764 void sd_enable(SDState
*sd
, bool enable
)
1766 sd
->enable
= enable
;