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.
39
#define DPRINTF(fmt, args...) \
40
do { fprintf(stderr, "SD: " fmt , ##args); } while (0)
42
#define DPRINTF(fmt, args...) do {} while(0)
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_r7, /* Operating voltage */
59
sd_card_identification_mode,
60
sd_data_transfer_mode,
63
sd_inactive_state = -1,
66
sd_identification_state,
70
sd_receivingdata_state,
80
uint8_t sd_status[64];
90
int function_group[6];
100
BlockDriverState *bdrv;
106
static void sd_set_status(SDState *sd)
109
case sd_inactive_state:
110
sd->mode = sd_inactive;
115
case sd_identification_state:
116
sd->mode = sd_card_identification_mode;
119
case sd_standby_state:
120
case sd_transfer_state:
121
case sd_sendingdata_state:
122
case sd_receivingdata_state:
123
case sd_programming_state:
124
case sd_disconnect_state:
125
sd->mode = sd_data_transfer_mode;
129
sd->card_status &= ~CURRENT_STATE;
130
sd->card_status |= sd->state << 9;
133
static const sd_cmd_type_t sd_cmd_type[64] = {
134
sd_bc, sd_none, sd_bcr, sd_bcr, sd_none, sd_none, sd_none, sd_ac,
135
sd_bcr, sd_ac, sd_ac, sd_adtc, sd_ac, sd_ac, sd_none, sd_ac,
136
sd_ac, sd_adtc, sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none,
137
sd_adtc, sd_adtc, sd_adtc, sd_adtc, sd_ac, sd_ac, sd_adtc, sd_none,
138
sd_ac, sd_ac, sd_none, sd_none, sd_none, sd_none, sd_ac, sd_none,
139
sd_none, sd_none, sd_bc, sd_none, sd_none, sd_none, sd_none, sd_none,
140
sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_ac,
141
sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none,
144
static const sd_cmd_type_t sd_acmd_type[64] = {
145
sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_ac, sd_none,
146
sd_none, sd_none, sd_none, sd_none, sd_none, sd_adtc, sd_none, sd_none,
147
sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_adtc, sd_ac,
148
sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none,
149
sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none,
150
sd_none, sd_bcr, sd_ac, sd_none, sd_none, sd_none, sd_none, sd_none,
151
sd_none, sd_none, sd_none, sd_adtc, sd_none, sd_none, sd_none, sd_none,
152
sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none,
155
static const int sd_cmd_class[64] = {
156
0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 1, 0, 0, 0, 0,
157
2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 6, 6, 6, 6,
158
5, 5, 10, 10, 10, 10, 5, 9, 9, 9, 7, 7, 7, 7, 7, 7,
159
7, 7, 10, 7, 9, 9, 9, 8, 8, 10, 8, 8, 8, 8, 8, 8,
162
static uint8_t sd_crc7(void *message, size_t width)
165
uint8_t shift_reg = 0x00;
166
uint8_t *msg = (uint8_t *) message;
168
for (i = 0; i < width; i ++, msg ++)
169
for (bit = 7; bit >= 0; bit --) {
171
if ((shift_reg >> 7) ^ ((*msg >> bit) & 1))
178
static uint16_t sd_crc16(void *message, size_t width)
181
uint16_t shift_reg = 0x0000;
182
uint16_t *msg = (uint16_t *) message;
185
for (i = 0; i < width; i ++, msg ++)
186
for (bit = 15; bit >= 0; bit --) {
188
if ((shift_reg >> 15) ^ ((*msg >> bit) & 1))
195
static void sd_set_ocr(SDState *sd)
197
/* All voltages OK, card power-up OK, Standard Capacity SD Memory Card */
198
sd->ocr = 0x80ffff80;
201
static void sd_set_scr(SDState *sd)
203
sd->scr[0] = 0x00; /* SCR Structure */
204
sd->scr[1] = 0x2f; /* SD Security Support */
220
static void sd_set_cid(SDState *sd)
222
sd->cid[0] = MID; /* Fake card manufacturer ID (MID) */
223
sd->cid[1] = OID[0]; /* OEM/Application ID (OID) */
225
sd->cid[3] = PNM[0]; /* Fake product name (PNM) */
230
sd->cid[8] = PRV; /* Fake product revision (PRV) */
231
sd->cid[9] = 0xde; /* Fake serial number (PSN) */
235
sd->cid[13] = 0x00 | /* Manufacture date (MDT) */
236
((MDT_YR - 2000) / 10);
237
sd->cid[14] = ((MDT_YR % 10) << 4) | MDT_MON;
238
sd->cid[15] = (sd_crc7(sd->cid, 15) << 1) | 1;
241
#define HWBLOCK_SHIFT 9 /* 512 bytes */
242
#define SECTOR_SHIFT 5 /* 16 kilobytes */
243
#define WPGROUP_SHIFT 7 /* 2 megs */
244
#define CMULT_SHIFT 9 /* 512 times HWBLOCK_SIZE */
245
#define BLOCK_SIZE (1 << (HWBLOCK_SHIFT))
246
#define SECTOR_SIZE (1 << (HWBLOCK_SHIFT + SECTOR_SHIFT))
247
#define WPGROUP_SIZE (1 << (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT))
249
static const uint8_t sd_csd_rw_mask[16] = {
250
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
251
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfe,
254
static void sd_set_csd(SDState *sd, uint32_t size)
256
uint32_t csize = (size >> (CMULT_SHIFT + HWBLOCK_SHIFT)) - 1;
257
uint32_t sectsize = (1 << (SECTOR_SHIFT + 1)) - 1;
258
uint32_t wpsize = (1 << (WPGROUP_SHIFT + 1)) - 1;
260
sd->csd[0] = 0x00; /* CSD structure */
261
sd->csd[1] = 0x26; /* Data read access-time-1 */
262
sd->csd[2] = 0x00; /* Data read access-time-2 */
263
sd->csd[3] = 0x5a; /* Max. data transfer rate */
264
sd->csd[4] = 0x5f; /* Card Command Classes */
265
sd->csd[5] = 0x50 | /* Max. read data block length */
267
sd->csd[6] = 0xe0 | /* Partial block for read allowed */
268
((csize >> 10) & 0x03);
269
sd->csd[7] = 0x00 | /* Device size */
270
((csize >> 2) & 0xff);
271
sd->csd[8] = 0x3f | /* Max. read current */
272
((csize << 6) & 0xc0);
273
sd->csd[9] = 0xfc | /* Max. write current */
274
((CMULT_SHIFT - 2) >> 1);
275
sd->csd[10] = 0x40 | /* Erase sector size */
276
(((CMULT_SHIFT - 2) << 7) & 0x80) | (sectsize >> 1);
277
sd->csd[11] = 0x00 | /* Write protect group size */
278
((sectsize << 7) & 0x80) | wpsize;
279
sd->csd[12] = 0x90 | /* Write speed factor */
280
(HWBLOCK_SHIFT >> 2);
281
sd->csd[13] = 0x20 | /* Max. write data block length */
282
((HWBLOCK_SHIFT << 6) & 0xc0);
283
sd->csd[14] = 0x00; /* File format group */
284
sd->csd[15] = (sd_crc7(sd->csd, 15) << 1) | 1;
287
static void sd_set_rca(SDState *sd)
292
#define CARD_STATUS_A 0x02004100
293
#define CARD_STATUS_B 0x00c01e00
294
#define CARD_STATUS_C 0xfd39a028
296
static void sd_set_cardstatus(SDState *sd)
298
sd->card_status = 0x00000100;
301
static void sd_set_sdstatus(SDState *sd)
303
memset(sd->sd_status, 0, 64);
306
static int sd_req_crc_validate(struct sd_request_s *req)
309
buffer[0] = 0x40 | req->cmd;
310
buffer[1] = (req->arg >> 24) & 0xff;
311
buffer[2] = (req->arg >> 16) & 0xff;
312
buffer[3] = (req->arg >> 8) & 0xff;
313
buffer[4] = (req->arg >> 0) & 0xff;
315
return sd_crc7(buffer, 5) != req->crc; /* TODO */
318
static void sd_response_r1_make(SDState *sd,
319
uint8_t *response, uint32_t last_status)
321
uint32_t mask = CARD_STATUS_B ^ ILLEGAL_COMMAND;
324
status = (sd->card_status & ~mask) | (last_status & mask);
325
sd->card_status &= ~CARD_STATUS_C | APP_CMD;
327
response[0] = (status >> 24) & 0xff;
328
response[1] = (status >> 16) & 0xff;
329
response[2] = (status >> 8) & 0xff;
330
response[3] = (status >> 0) & 0xff;
333
static void sd_response_r3_make(SDState *sd, uint8_t *response)
335
response[0] = (sd->ocr >> 24) & 0xff;
336
response[1] = (sd->ocr >> 16) & 0xff;
337
response[2] = (sd->ocr >> 8) & 0xff;
338
response[3] = (sd->ocr >> 0) & 0xff;
341
static void sd_response_r6_make(SDState *sd, uint8_t *response)
347
status = ((sd->card_status >> 8) & 0xc000) |
348
((sd->card_status >> 6) & 0x2000) |
349
(sd->card_status & 0x1fff);
351
response[0] = (arg >> 8) & 0xff;
352
response[1] = arg & 0xff;
353
response[2] = (status >> 8) & 0xff;
354
response[3] = status & 0xff;
357
static void sd_response_r7_make(SDState *sd, uint8_t *response)
359
response[0] = (sd->vhs >> 24) & 0xff;
360
response[1] = (sd->vhs >> 16) & 0xff;
361
response[2] = (sd->vhs >> 8) & 0xff;
362
response[3] = (sd->vhs >> 0) & 0xff;
365
static void sd_reset(SDState *sd, BlockDriverState *bdrv)
370
bdrv_get_geometry(bdrv, §);
373
if (sect > 0x40000000)
374
size = 0x40000000; /* 1 gig */
378
sect = (size >> (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT)) + 1;
380
sd->state = sd_idle_state;
385
sd_set_csd(sd, size);
386
sd_set_cardstatus(sd);
392
qemu_free(sd->wp_groups);
393
sd->wp_switch = bdrv_is_read_only(bdrv);
394
sd->wp_groups = (int *) qemu_mallocz(sizeof(int) * sect);
395
memset(sd->function_group, 0, sizeof(int) * 6);
403
static void sd_cardchange(void *opaque)
405
SDState *sd = opaque;
406
qemu_set_irq(sd->inserted_cb, bdrv_is_inserted(sd->bdrv));
407
if (bdrv_is_inserted(sd->bdrv)) {
408
sd_reset(sd, sd->bdrv);
409
qemu_set_irq(sd->readonly_cb, sd->wp_switch);
413
/* We do not model the chip select pin, so allow the board to select
414
whether card should be in SSI or MMC/SD mode. It is also up to the
415
board to ensure that ssi transfers only occur when the chip select
417
SDState *sd_init(BlockDriverState *bs, int is_spi)
421
sd = (SDState *) qemu_mallocz(sizeof(SDState));
422
sd->buf = qemu_memalign(512, 512);
426
bdrv_set_change_cb(sd->bdrv, sd_cardchange, sd);
430
void sd_set_cb(SDState *sd, qemu_irq readonly, qemu_irq insert)
432
sd->readonly_cb = readonly;
433
sd->inserted_cb = insert;
434
qemu_set_irq(readonly, bdrv_is_read_only(sd->bdrv));
435
qemu_set_irq(insert, bdrv_is_inserted(sd->bdrv));
438
static void sd_erase(SDState *sd)
441
if (!sd->erase_start || !sd->erase_end) {
442
sd->card_status |= ERASE_SEQ_ERROR;
446
start = sd->erase_start >>
447
(HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT);
448
end = sd->erase_end >>
449
(HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT);
454
for (i = start; i <= end; i ++)
455
if (sd->wp_groups[i])
456
sd->card_status |= WP_ERASE_SKIP;
459
static uint32_t sd_wpbits(SDState *sd, uint32_t addr)
464
wpnum = addr >> (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT);
466
for (i = 0; i < 32; i ++, wpnum ++, addr += WPGROUP_SIZE)
467
if (addr < sd->size && sd->wp_groups[wpnum])
473
static void sd_function_switch(SDState *sd, uint32_t arg)
475
int i, mode, new_func, crc;
476
mode = !!(arg & 0x80000000);
478
sd->data[0] = 0x00; /* Maximum current consumption */
480
sd->data[2] = 0x80; /* Supported group 6 functions */
482
sd->data[4] = 0x80; /* Supported group 5 functions */
484
sd->data[6] = 0x80; /* Supported group 4 functions */
486
sd->data[8] = 0x80; /* Supported group 3 functions */
488
sd->data[10] = 0x80; /* Supported group 2 functions */
490
sd->data[12] = 0x80; /* Supported group 1 functions */
492
for (i = 0; i < 6; i ++) {
493
new_func = (arg >> (i * 4)) & 0x0f;
494
if (mode && new_func != 0x0f)
495
sd->function_group[i] = new_func;
496
sd->data[14 + (i >> 1)] = new_func << ((i * 4) & 4);
498
memset(&sd->data[17], 0, 47);
499
crc = sd_crc16(sd->data, 64);
500
sd->data[65] = crc >> 8;
501
sd->data[66] = crc & 0xff;
504
static inline int sd_wp_addr(SDState *sd, uint32_t addr)
506
return sd->wp_groups[addr >>
507
(HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT)];
510
static void sd_lock_command(SDState *sd)
512
int erase, lock, clr_pwd, set_pwd, pwd_len;
513
erase = !!(sd->data[0] & 0x08);
514
lock = sd->data[0] & 0x04;
515
clr_pwd = sd->data[0] & 0x02;
516
set_pwd = sd->data[0] & 0x01;
519
pwd_len = sd->data[1];
524
if (!(sd->card_status & CARD_IS_LOCKED) || sd->blk_len > 1 ||
525
set_pwd || clr_pwd || lock || sd->wp_switch ||
526
(sd->csd[14] & 0x20)) {
527
sd->card_status |= LOCK_UNLOCK_FAILED;
530
memset(sd->wp_groups, 0, sizeof(int) * (sd->size >>
531
(HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT)));
532
sd->csd[14] &= ~0x10;
533
sd->card_status &= ~CARD_IS_LOCKED;
535
/* Erasing the entire card here! */
536
fprintf(stderr, "SD: Card force-erased by CMD42\n");
540
if (sd->blk_len < 2 + pwd_len ||
541
pwd_len <= sd->pwd_len ||
542
pwd_len > sd->pwd_len + 16) {
543
sd->card_status |= LOCK_UNLOCK_FAILED;
547
if (sd->pwd_len && memcmp(sd->pwd, sd->data + 2, sd->pwd_len)) {
548
sd->card_status |= LOCK_UNLOCK_FAILED;
552
pwd_len -= sd->pwd_len;
553
if ((pwd_len && !set_pwd) ||
554
(clr_pwd && (set_pwd || lock)) ||
555
(lock && !sd->pwd_len && !set_pwd) ||
556
(!set_pwd && !clr_pwd &&
557
(((sd->card_status & CARD_IS_LOCKED) && lock) ||
558
(!(sd->card_status & CARD_IS_LOCKED) && !lock)))) {
559
sd->card_status |= LOCK_UNLOCK_FAILED;
564
memcpy(sd->pwd, sd->data + 2 + sd->pwd_len, pwd_len);
565
sd->pwd_len = pwd_len;
573
sd->card_status |= CARD_IS_LOCKED;
575
sd->card_status &= ~CARD_IS_LOCKED;
578
static sd_rsp_type_t sd_normal_command(SDState *sd,
579
struct sd_request_s req)
581
uint32_t rca = 0x0000;
583
if (sd_cmd_type[req.cmd] == sd_ac || sd_cmd_type[req.cmd] == sd_adtc)
586
DPRINTF("CMD%d 0x%08x state %d\n", req.cmd, req.arg, sd->state);
588
/* Basic commands (Class 0 and Class 1) */
589
case 0: /* CMD0: GO_IDLE_STATE */
591
case sd_inactive_state:
592
return sd->spi ? sd_r1 : sd_r0;
595
sd->state = sd_idle_state;
596
sd_reset(sd, sd->bdrv);
597
return sd->spi ? sd_r1 : sd_r0;
601
case 1: /* CMD1: SEND_OP_CMD */
605
sd->state = sd_transfer_state;
608
case 2: /* CMD2: ALL_SEND_CID */
613
sd->state = sd_identification_state;
621
case 3: /* CMD3: SEND_RELATIVE_ADDR */
625
case sd_identification_state:
626
case sd_standby_state:
627
sd->state = sd_standby_state;
636
case 4: /* CMD4: SEND_DSR */
640
case sd_standby_state:
648
case 6: /* CMD6: SWITCH_FUNCTION */
652
case sd_data_transfer_mode:
653
sd_function_switch(sd, req.arg);
654
sd->state = sd_sendingdata_state;
664
case 7: /* CMD7: SELECT/DESELECT_CARD */
668
case sd_standby_state:
672
sd->state = sd_transfer_state;
675
case sd_transfer_state:
676
case sd_sendingdata_state:
680
sd->state = sd_standby_state;
683
case sd_disconnect_state:
687
sd->state = sd_programming_state;
690
case sd_programming_state:
694
sd->state = sd_disconnect_state;
702
case 8: /* CMD8: SEND_IF_COND */
703
/* Physical Layer Specification Version 2.00 command */
708
/* No response if not exactly one VHS bit is set. */
709
if (!(req.arg >> 8) || (req.arg >> ffs(req.arg & ~0xff)))
710
return sd->spi ? sd_r7 : sd_r0;
721
case 9: /* CMD9: SEND_CSD */
723
case sd_standby_state:
729
case sd_transfer_state:
732
sd->state = sd_sendingdata_state;
733
memcpy(sd->data, sd->csd, 16);
734
sd->data_start = req.arg;
743
case 10: /* CMD10: SEND_CID */
745
case sd_standby_state:
751
case sd_transfer_state:
754
sd->state = sd_sendingdata_state;
755
memcpy(sd->data, sd->cid, 16);
756
sd->data_start = req.arg;
765
case 11: /* CMD11: READ_DAT_UNTIL_STOP */
769
case sd_transfer_state:
770
sd->state = sd_sendingdata_state;
771
sd->data_start = req.arg;
774
if (sd->data_start + sd->blk_len > sd->size)
775
sd->card_status |= ADDRESS_ERROR;
783
case 12: /* CMD12: STOP_TRANSMISSION */
785
case sd_sendingdata_state:
786
sd->state = sd_transfer_state;
789
case sd_receivingdata_state:
790
sd->state = sd_programming_state;
791
/* Bzzzzzzztt .... Operation complete. */
792
sd->state = sd_transfer_state;
800
case 13: /* CMD13: SEND_STATUS */
802
case sd_data_transfer_mode:
813
case 15: /* CMD15: GO_INACTIVE_STATE */
817
case sd_data_transfer_mode:
821
sd->state = sd_inactive_state;
829
/* Block read commands (Classs 2) */
830
case 16: /* CMD16: SET_BLOCKLEN */
832
case sd_transfer_state:
833
if (req.arg > (1 << HWBLOCK_SHIFT))
834
sd->card_status |= BLOCK_LEN_ERROR;
836
sd->blk_len = req.arg;
845
case 17: /* CMD17: READ_SINGLE_BLOCK */
847
case sd_transfer_state:
848
sd->state = sd_sendingdata_state;
849
sd->data_start = req.arg;
852
if (sd->data_start + sd->blk_len > sd->size)
853
sd->card_status |= ADDRESS_ERROR;
861
case 18: /* CMD18: READ_MULTIPLE_BLOCK */
863
case sd_transfer_state:
864
sd->state = sd_sendingdata_state;
865
sd->data_start = req.arg;
868
if (sd->data_start + sd->blk_len > sd->size)
869
sd->card_status |= ADDRESS_ERROR;
877
/* Block write commands (Class 4) */
878
case 24: /* CMD24: WRITE_SINGLE_BLOCK */
880
goto unimplemented_cmd;
882
case sd_transfer_state:
883
/* Writing in SPI mode not implemented. */
886
sd->state = sd_receivingdata_state;
887
sd->data_start = req.arg;
891
if (sd->data_start + sd->blk_len > sd->size)
892
sd->card_status |= ADDRESS_ERROR;
893
if (sd_wp_addr(sd, sd->data_start))
894
sd->card_status |= WP_VIOLATION;
895
if (sd->csd[14] & 0x30)
896
sd->card_status |= WP_VIOLATION;
904
case 25: /* CMD25: WRITE_MULTIPLE_BLOCK */
906
goto unimplemented_cmd;
908
case sd_transfer_state:
909
/* Writing in SPI mode not implemented. */
912
sd->state = sd_receivingdata_state;
913
sd->data_start = req.arg;
917
if (sd->data_start + sd->blk_len > sd->size)
918
sd->card_status |= ADDRESS_ERROR;
919
if (sd_wp_addr(sd, sd->data_start))
920
sd->card_status |= WP_VIOLATION;
921
if (sd->csd[14] & 0x30)
922
sd->card_status |= WP_VIOLATION;
930
case 26: /* CMD26: PROGRAM_CID */
934
case sd_transfer_state:
935
sd->state = sd_receivingdata_state;
945
case 27: /* CMD27: PROGRAM_CSD */
947
goto unimplemented_cmd;
949
case sd_transfer_state:
950
sd->state = sd_receivingdata_state;
960
/* Write protection (Class 6) */
961
case 28: /* CMD28: SET_WRITE_PROT */
963
case sd_transfer_state:
964
if (req.arg >= sd->size) {
965
sd->card_status = ADDRESS_ERROR;
969
sd->state = sd_programming_state;
970
sd->wp_groups[req.arg >> (HWBLOCK_SHIFT +
971
SECTOR_SHIFT + WPGROUP_SHIFT)] = 1;
972
/* Bzzzzzzztt .... Operation complete. */
973
sd->state = sd_transfer_state;
981
case 29: /* CMD29: CLR_WRITE_PROT */
983
case sd_transfer_state:
984
if (req.arg >= sd->size) {
985
sd->card_status = ADDRESS_ERROR;
989
sd->state = sd_programming_state;
990
sd->wp_groups[req.arg >> (HWBLOCK_SHIFT +
991
SECTOR_SHIFT + WPGROUP_SHIFT)] = 0;
992
/* Bzzzzzzztt .... Operation complete. */
993
sd->state = sd_transfer_state;
1001
case 30: /* CMD30: SEND_WRITE_PROT */
1002
switch (sd->state) {
1003
case sd_transfer_state:
1004
sd->state = sd_sendingdata_state;
1005
*(uint32_t *) sd->data = sd_wpbits(sd, req.arg);
1006
sd->data_start = req.arg;
1007
sd->data_offset = 0;
1015
/* Erase commands (Class 5) */
1016
case 32: /* CMD32: ERASE_WR_BLK_START */
1017
switch (sd->state) {
1018
case sd_transfer_state:
1019
sd->erase_start = req.arg;
1027
case 33: /* CMD33: ERASE_WR_BLK_END */
1028
switch (sd->state) {
1029
case sd_transfer_state:
1030
sd->erase_end = req.arg;
1038
case 38: /* CMD38: ERASE */
1039
switch (sd->state) {
1040
case sd_transfer_state:
1041
if (sd->csd[14] & 0x30) {
1042
sd->card_status |= WP_VIOLATION;
1046
sd->state = sd_programming_state;
1048
/* Bzzzzzzztt .... Operation complete. */
1049
sd->state = sd_transfer_state;
1057
/* Lock card commands (Class 7) */
1058
case 42: /* CMD42: LOCK_UNLOCK */
1060
goto unimplemented_cmd;
1061
switch (sd->state) {
1062
case sd_transfer_state:
1063
sd->state = sd_receivingdata_state;
1065
sd->data_offset = 0;
1073
/* Application specific commands (Class 8) */
1074
case 55: /* CMD55: APP_CMD */
1078
sd->card_status |= APP_CMD;
1081
case 56: /* CMD56: GEN_CMD */
1082
fprintf(stderr, "SD: GEN_CMD 0x%08x\n", req.arg);
1084
switch (sd->state) {
1085
case sd_transfer_state:
1086
sd->data_offset = 0;
1088
sd->state = sd_sendingdata_state;
1090
sd->state = sd_receivingdata_state;
1100
sd->card_status |= ILLEGAL_COMMAND;
1102
fprintf(stderr, "SD: Unknown CMD%i\n", req.cmd);
1106
/* Commands that are recognised but not yet implemented in SPI mode. */
1107
sd->card_status |= ILLEGAL_COMMAND;
1108
fprintf(stderr, "SD: CMD%i not implemented in SPI mode\n", req.cmd);
1112
sd->card_status |= ILLEGAL_COMMAND;
1113
fprintf(stderr, "SD: CMD%i in a wrong state\n", req.cmd);
1117
static sd_rsp_type_t sd_app_command(SDState *sd,
1118
struct sd_request_s req) {
1121
if (sd_cmd_type[req.cmd] == sd_ac || sd_cmd_type[req.cmd] == sd_adtc)
1122
rca = req.arg >> 16;
1124
DPRINTF("ACMD%d 0x%08x\n", req.cmd, req.arg);
1126
case 6: /* ACMD6: SET_BUS_WIDTH */
1127
switch (sd->state) {
1128
case sd_transfer_state:
1129
sd->sd_status[0] &= 0x3f;
1130
sd->sd_status[0] |= (req.arg & 0x03) << 6;
1138
case 13: /* ACMD13: SD_STATUS */
1139
switch (sd->state) {
1140
case sd_transfer_state:
1142
sd->data_offset = 0;
1150
case 22: /* ACMD22: SEND_NUM_WR_BLOCKS */
1151
switch (sd->state) {
1152
case sd_transfer_state:
1153
*(uint32_t *) sd->data = sd->blk_written;
1156
sd->data_offset = 0;
1164
case 23: /* ACMD23: SET_WR_BLK_ERASE_COUNT */
1165
switch (sd->state) {
1166
case sd_transfer_state:
1174
case 41: /* ACMD41: SD_APP_OP_COND */
1177
sd->state = sd_transfer_state;
1180
switch (sd->state) {
1182
/* We accept any voltage. 10000 V is nothing. */
1184
sd->state = sd_ready_state;
1193
case 42: /* ACMD42: SET_CLR_CARD_DETECT */
1194
switch (sd->state) {
1195
case sd_transfer_state:
1196
/* Bringing in the 50KOhm pull-up resistor... Done. */
1204
case 51: /* ACMD51: SEND_SCR */
1205
switch (sd->state) {
1206
case sd_transfer_state:
1207
sd->state = sd_sendingdata_state;
1209
sd->data_offset = 0;
1218
/* Fall back to standard commands. */
1219
sd->card_status &= ~APP_CMD;
1220
return sd_normal_command(sd, req);
1223
fprintf(stderr, "SD: ACMD%i in a wrong state\n", req.cmd);
1227
int sd_do_command(SDState *sd, struct sd_request_s *req,
1228
uint8_t *response) {
1229
uint32_t last_status = sd->card_status;
1230
sd_rsp_type_t rtype;
1233
if (!bdrv_is_inserted(sd->bdrv) || !sd->enable) {
1237
if (sd_req_crc_validate(req)) {
1238
sd->card_status &= ~COM_CRC_ERROR;
1242
sd->card_status &= ~CARD_STATUS_B;
1245
if (last_status & CARD_IS_LOCKED)
1246
if (((last_status & APP_CMD) &&
1248
(!(last_status & APP_CMD) &&
1249
(sd_cmd_class[req->cmd] == 0 ||
1250
sd_cmd_class[req->cmd] == 7 ||
1251
req->cmd == 16 || req->cmd == 55))) {
1252
sd->card_status |= ILLEGAL_COMMAND;
1253
fprintf(stderr, "SD: Card is locked\n");
1257
if (last_status & APP_CMD) {
1258
rtype = sd_app_command(sd, *req);
1259
sd->card_status &= ~APP_CMD;
1261
rtype = sd_normal_command(sd, *req);
1263
sd->current_cmd = req->cmd;
1268
sd_response_r1_make(sd, response, last_status);
1273
memcpy(response, sd->cid, sizeof(sd->cid));
1278
memcpy(response, sd->csd, sizeof(sd->csd));
1283
sd_response_r3_make(sd, response);
1288
sd_response_r6_make(sd, response);
1293
sd_response_r7_make(sd, response);
1303
if (sd->card_status & ILLEGAL_COMMAND)
1309
DPRINTF("Response:");
1310
for (i = 0; i < rsplen; i++)
1311
printf(" %02x", response[i]);
1312
printf(" state %d\n", sd->state);
1314
DPRINTF("No response %d\n", sd->state);
1321
/* No real need for 64 bit addresses here */
1322
static void sd_blk_read(SDState *sd, uint32_t addr, uint32_t len)
1324
uint32_t end = addr + len;
1326
if (!sd->bdrv || bdrv_read(sd->bdrv, addr >> 9, sd->buf, 1) == -1) {
1327
fprintf(stderr, "sd_blk_read: read error on host side\n");
1331
if (end > (addr & ~511) + 512) {
1332
memcpy(sd->data, sd->buf + (addr & 511), 512 - (addr & 511));
1334
if (bdrv_read(sd->bdrv, end >> 9, sd->buf, 1) == -1) {
1335
fprintf(stderr, "sd_blk_read: read error on host side\n");
1338
memcpy(sd->data + 512 - (addr & 511), sd->buf, end & 511);
1340
memcpy(sd->data, sd->buf + (addr & 511), len);
1343
static void sd_blk_write(SDState *sd, uint32_t addr, uint32_t len)
1345
uint32_t end = addr + len;
1347
if ((addr & 511) || len < 512)
1348
if (!sd->bdrv || bdrv_read(sd->bdrv, addr >> 9, sd->buf, 1) == -1) {
1349
fprintf(stderr, "sd_blk_write: read error on host side\n");
1353
if (end > (addr & ~511) + 512) {
1354
memcpy(sd->buf + (addr & 511), sd->data, 512 - (addr & 511));
1355
if (bdrv_write(sd->bdrv, addr >> 9, sd->buf, 1) == -1) {
1356
fprintf(stderr, "sd_blk_write: write error on host side\n");
1360
if (bdrv_read(sd->bdrv, end >> 9, sd->buf, 1) == -1) {
1361
fprintf(stderr, "sd_blk_write: read error on host side\n");
1364
memcpy(sd->buf, sd->data + 512 - (addr & 511), end & 511);
1365
if (bdrv_write(sd->bdrv, end >> 9, sd->buf, 1) == -1)
1366
fprintf(stderr, "sd_blk_write: write error on host side\n");
1368
memcpy(sd->buf + (addr & 511), sd->data, len);
1369
if (!sd->bdrv || bdrv_write(sd->bdrv, addr >> 9, sd->buf, 1) == -1)
1370
fprintf(stderr, "sd_blk_write: write error on host side\n");
1374
#define BLK_READ_BLOCK(a, len) sd_blk_read(sd, a, len)
1375
#define BLK_WRITE_BLOCK(a, len) sd_blk_write(sd, a, len)
1376
#define APP_READ_BLOCK(a, len) memset(sd->data, 0xec, len)
1377
#define APP_WRITE_BLOCK(a, len)
1379
void sd_write_data(SDState *sd, uint8_t value)
1383
if (!sd->bdrv || !bdrv_is_inserted(sd->bdrv) || !sd->enable)
1386
if (sd->state != sd_receivingdata_state) {
1387
fprintf(stderr, "sd_write_data: not in Receiving-Data state\n");
1391
if (sd->card_status & (ADDRESS_ERROR | WP_VIOLATION))
1394
switch (sd->current_cmd) {
1395
case 24: /* CMD24: WRITE_SINGLE_BLOCK */
1396
sd->data[sd->data_offset ++] = value;
1397
if (sd->data_offset >= sd->blk_len) {
1398
/* TODO: Check CRC before committing */
1399
sd->state = sd_programming_state;
1400
BLK_WRITE_BLOCK(sd->data_start, sd->data_offset);
1402
sd->csd[14] |= 0x40;
1403
/* Bzzzzzzztt .... Operation complete. */
1404
sd->state = sd_transfer_state;
1408
case 25: /* CMD25: WRITE_MULTIPLE_BLOCK */
1409
sd->data[sd->data_offset ++] = value;
1410
if (sd->data_offset >= sd->blk_len) {
1411
/* TODO: Check CRC before committing */
1412
sd->state = sd_programming_state;
1413
BLK_WRITE_BLOCK(sd->data_start, sd->data_offset);
1415
sd->data_start += sd->blk_len;
1416
sd->data_offset = 0;
1417
if (sd->data_start + sd->blk_len > sd->size) {
1418
sd->card_status |= ADDRESS_ERROR;
1421
if (sd_wp_addr(sd, sd->data_start)) {
1422
sd->card_status |= WP_VIOLATION;
1425
sd->csd[14] |= 0x40;
1427
/* Bzzzzzzztt .... Operation complete. */
1428
sd->state = sd_receivingdata_state;
1432
case 26: /* CMD26: PROGRAM_CID */
1433
sd->data[sd->data_offset ++] = value;
1434
if (sd->data_offset >= sizeof(sd->cid)) {
1435
/* TODO: Check CRC before committing */
1436
sd->state = sd_programming_state;
1437
for (i = 0; i < sizeof(sd->cid); i ++)
1438
if ((sd->cid[i] | 0x00) != sd->data[i])
1439
sd->card_status |= CID_CSD_OVERWRITE;
1441
if (!(sd->card_status & CID_CSD_OVERWRITE))
1442
for (i = 0; i < sizeof(sd->cid); i ++) {
1444
sd->cid[i] &= sd->data[i];
1446
/* Bzzzzzzztt .... Operation complete. */
1447
sd->state = sd_transfer_state;
1451
case 27: /* CMD27: PROGRAM_CSD */
1452
sd->data[sd->data_offset ++] = value;
1453
if (sd->data_offset >= sizeof(sd->csd)) {
1454
/* TODO: Check CRC before committing */
1455
sd->state = sd_programming_state;
1456
for (i = 0; i < sizeof(sd->csd); i ++)
1457
if ((sd->csd[i] | sd_csd_rw_mask[i]) !=
1458
(sd->data[i] | sd_csd_rw_mask[i]))
1459
sd->card_status |= CID_CSD_OVERWRITE;
1461
/* Copy flag (OTP) & Permanent write protect */
1462
if (sd->csd[14] & ~sd->data[14] & 0x60)
1463
sd->card_status |= CID_CSD_OVERWRITE;
1465
if (!(sd->card_status & CID_CSD_OVERWRITE))
1466
for (i = 0; i < sizeof(sd->csd); i ++) {
1467
sd->csd[i] |= sd_csd_rw_mask[i];
1468
sd->csd[i] &= sd->data[i];
1470
/* Bzzzzzzztt .... Operation complete. */
1471
sd->state = sd_transfer_state;
1475
case 42: /* CMD42: LOCK_UNLOCK */
1476
sd->data[sd->data_offset ++] = value;
1477
if (sd->data_offset >= sd->blk_len) {
1478
/* TODO: Check CRC before committing */
1479
sd->state = sd_programming_state;
1480
sd_lock_command(sd);
1481
/* Bzzzzzzztt .... Operation complete. */
1482
sd->state = sd_transfer_state;
1486
case 56: /* CMD56: GEN_CMD */
1487
sd->data[sd->data_offset ++] = value;
1488
if (sd->data_offset >= sd->blk_len) {
1489
APP_WRITE_BLOCK(sd->data_start, sd->data_offset);
1490
sd->state = sd_transfer_state;
1495
fprintf(stderr, "sd_write_data: unknown command\n");
1500
uint8_t sd_read_data(SDState *sd)
1502
/* TODO: Append CRCs */
1505
if (!sd->bdrv || !bdrv_is_inserted(sd->bdrv) || !sd->enable)
1508
if (sd->state != sd_sendingdata_state) {
1509
fprintf(stderr, "sd_read_data: not in Sending-Data state\n");
1513
if (sd->card_status & (ADDRESS_ERROR | WP_VIOLATION))
1516
switch (sd->current_cmd) {
1517
case 6: /* CMD6: SWITCH_FUNCTION */
1518
ret = sd->data[sd->data_offset ++];
1520
if (sd->data_offset >= 64)
1521
sd->state = sd_transfer_state;
1524
case 9: /* CMD9: SEND_CSD */
1525
case 10: /* CMD10: SEND_CID */
1526
ret = sd->data[sd->data_offset ++];
1528
if (sd->data_offset >= 16)
1529
sd->state = sd_transfer_state;
1532
case 11: /* CMD11: READ_DAT_UNTIL_STOP */
1533
if (sd->data_offset == 0)
1534
BLK_READ_BLOCK(sd->data_start, sd->blk_len);
1535
ret = sd->data[sd->data_offset ++];
1537
if (sd->data_offset >= sd->blk_len) {
1538
sd->data_start += sd->blk_len;
1539
sd->data_offset = 0;
1540
if (sd->data_start + sd->blk_len > sd->size) {
1541
sd->card_status |= ADDRESS_ERROR;
1547
case 13: /* ACMD13: SD_STATUS */
1548
ret = sd->sd_status[sd->data_offset ++];
1550
if (sd->data_offset >= sizeof(sd->sd_status))
1551
sd->state = sd_transfer_state;
1554
case 17: /* CMD17: READ_SINGLE_BLOCK */
1555
if (sd->data_offset == 0)
1556
BLK_READ_BLOCK(sd->data_start, sd->blk_len);
1557
ret = sd->data[sd->data_offset ++];
1559
if (sd->data_offset >= sd->blk_len)
1560
sd->state = sd_transfer_state;
1563
case 18: /* CMD18: READ_MULTIPLE_BLOCK */
1564
if (sd->data_offset == 0)
1565
BLK_READ_BLOCK(sd->data_start, sd->blk_len);
1566
ret = sd->data[sd->data_offset ++];
1568
if (sd->data_offset >= sd->blk_len) {
1569
sd->data_start += sd->blk_len;
1570
sd->data_offset = 0;
1571
if (sd->data_start + sd->blk_len > sd->size) {
1572
sd->card_status |= ADDRESS_ERROR;
1578
case 22: /* ACMD22: SEND_NUM_WR_BLOCKS */
1579
ret = sd->data[sd->data_offset ++];
1581
if (sd->data_offset >= 4)
1582
sd->state = sd_transfer_state;
1585
case 30: /* CMD30: SEND_WRITE_PROT */
1586
ret = sd->data[sd->data_offset ++];
1588
if (sd->data_offset >= 4)
1589
sd->state = sd_transfer_state;
1592
case 51: /* ACMD51: SEND_SCR */
1593
ret = sd->scr[sd->data_offset ++];
1595
if (sd->data_offset >= sizeof(sd->scr))
1596
sd->state = sd_transfer_state;
1599
case 56: /* CMD56: GEN_CMD */
1600
if (sd->data_offset == 0)
1601
APP_READ_BLOCK(sd->data_start, sd->blk_len);
1602
ret = sd->data[sd->data_offset ++];
1604
if (sd->data_offset >= sd->blk_len)
1605
sd->state = sd_transfer_state;
1609
fprintf(stderr, "sd_read_data: unknown command\n");
1616
int sd_data_ready(SDState *sd)
1618
return sd->state == sd_sendingdata_state;
1621
void sd_enable(SDState *sd, int enable)
1623
sd->enable = enable;