1
From 5ab88d616886f4903bcd32857cc7fb5528286686 Mon Sep 17 00:00:00 2001
2
From: =?UTF-8?q?Juha=20Riihim=C3=A4ki?= <juha.riihimaki@nokia.com>
3
Date: Mon, 18 Feb 2013 16:58:23 +0000
4
Subject: [PATCH 04/70] hw/sd.c: Add MMC emulation support
6
This patch is basically just adding actual implementation
7
of the mmc flag. It also has a few minor cleanups like
8
printf->fprintf (but should be DPRINTF)
10
hw/sd/sd.c | 275 +++++++++++++++++++++++++++++++++++++++++++++++---------
12
2 files changed, 233 insertions(+), 43 deletions(-)
14
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
15
index ce7f57f..3ec2c0d 100644
20
* Copyright (c) 2006 Andrzej Zaborowski <balrog@zabor.org>
21
* Copyright (c) 2007 CodeSourcery
22
+ * Copyright (c) 2009 Nokia Corporation
24
* Redistribution and use in source and binary forms, with or without
25
* modification, are permitted provided that the following conditions
26
@@ -83,6 +84,7 @@ struct SDState {
30
+ uint8_t ext_csd[512];
33
uint8_t sd_status[64];
34
@@ -98,7 +100,7 @@ struct SDState {
36
uint8_t function_group[6];
41
/* True if we will handle the next command as an ACMD. Note that this does
42
* *not* track the APP_CMD status bit!
43
@@ -114,6 +116,7 @@ struct SDState {
47
+ int buswidth, highspeed;
50
static void sd_set_mode(SDState *sd)
51
@@ -141,9 +144,9 @@ static void sd_set_mode(SDState *sd)
54
static const sd_cmd_type_t sd_cmd_type[64] = {
55
- sd_bc, sd_none, sd_bcr, sd_bcr, sd_none, sd_none, sd_none, sd_ac,
56
+ sd_bc, sd_none, sd_bcr, sd_bcr, sd_none, sd_ac, sd_none, sd_ac,
57
sd_bcr, sd_ac, sd_ac, sd_adtc, sd_ac, sd_ac, sd_none, sd_ac,
58
- sd_ac, sd_adtc, sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none,
59
+ sd_ac, sd_adtc, sd_adtc, sd_none, sd_adtc, sd_none, sd_none, sd_adtc,
60
sd_adtc, sd_adtc, sd_adtc, sd_adtc, sd_ac, sd_ac, sd_adtc, sd_none,
61
sd_ac, sd_ac, sd_none, sd_none, sd_none, sd_none, sd_ac, sd_none,
62
sd_none, sd_none, sd_bc, sd_none, sd_none, sd_none, sd_none, sd_none,
63
@@ -210,8 +213,8 @@ static void sd_set_ocr(SDState *sd)
65
static void sd_set_scr(SDState *sd)
67
- sd->scr[0] = 0x00; /* SCR Structure */
68
- sd->scr[1] = 0x2f; /* SD Security Support */
69
+ sd->scr[0] = 0x00; /* SCR v1.0, SD spec v1.0/1.01 */
70
+ sd->scr[1] = 0x25; /* erase=0, SD security v1.01, 1bit/4bit bus width */
74
@@ -222,7 +225,7 @@ static void sd_set_scr(SDState *sd)
83
@@ -237,14 +240,23 @@ static void sd_set_cid(SDState *sd)
87
- sd->cid[8] = PRV; /* Fake product revision (PRV) */
89
+ sd->cid[8] = PNM[5];
91
+ sd->cid[8] = PRV; /* Fake product revision (PRV) */
93
sd->cid[9] = 0xde; /* Fake serial number (PSN) */
97
- sd->cid[13] = 0x00 | /* Manufacture date (MDT) */
98
- ((MDT_YR - 2000) / 10);
99
- sd->cid[14] = ((MDT_YR % 10) << 4) | MDT_MON;
101
+ sd->cid[13] = 0x55;
102
+ sd->cid[14] = ((MDT_MON) << 4) | (MDT_YR - 1997);
104
+ sd->cid[13] = 0x00 | /* Manufacture date (MDT) */
105
+ ((MDT_YR - 2000) / 10);
106
+ sd->cid[14] = ((MDT_YR % 10) << 4) | MDT_MON;
108
sd->cid[15] = (sd_crc7(sd->cid, 15) << 1) | 1;
111
@@ -266,7 +278,12 @@ static void sd_set_csd(SDState *sd, uint64_t size)
112
uint32_t wpsize = (1 << (WPGROUP_SHIFT + 1)) - 1;
114
if (size <= 0x40000000) { /* Standard Capacity SD */
115
- sd->csd[0] = 0x00; /* CSD structure */
117
+ sd->csd[0] = 0x80 | /* CSD structure: v1.2 */
118
+ 0x0c; /* MMC v3.x */
120
+ sd->csd[0] = 0x00; /* CSD structure: v0 */
122
sd->csd[1] = 0x26; /* Data read access-time-1 */
123
sd->csd[2] = 0x00; /* Data read access-time-2 */
124
sd->csd[3] = 0x5a; /* Max. data transfer rate */
125
@@ -292,25 +309,52 @@ static void sd_set_csd(SDState *sd, uint64_t size)
126
sd->csd[14] = 0x00; /* File format group */
127
sd->csd[15] = (sd_crc7(sd->csd, 15) << 1) | 1;
129
- size /= 512 * 1024;
133
+ sd->csd[0] = 0x90; /* CSD structure v1.2, MMC v4.0/4.1 */
135
+ sd->csd[0] = 0x40; /* CSD structure v1 */
143
- sd->csd[7] = (size >> 16) & 0xff;
144
- sd->csd[8] = (size >> 8) & 0xff;
145
- sd->csd[9] = (size & 0xff);
146
- sd->csd[10] = 0x7f;
152
+ sd->csd[10] = 0xff;
154
+ size /= 512 * 1024;
157
+ sd->csd[7] = (size >> 16) & 0xff;
158
+ sd->csd[8] = (size >> 8) & 0xff;
159
+ sd->csd[9] = (size & 0xff);
160
+ sd->csd[10] = 0x7f;
167
sd->ocr |= 1 << 30; /* High Capacity SD Memory Card */
170
+ sd->buswidth = 1; /* 4bit mode */
172
+ memset(sd->ext_csd, 0, 512);
173
+ sd->ext_csd[183] = sd->buswidth;
174
+ sd->ext_csd[185] = sd->highspeed;
175
+ sd->ext_csd[192] = 0x03; /* EXT_CSD v3 */
176
+ sd->ext_csd[196] = 0x03; /* supports 26MHz and 52MHz */
177
+ sd->ext_csd[212] = (size & 0xff);
178
+ sd->ext_csd[213] = (size >> 8) & 0xff;
179
+ sd->ext_csd[214] = (size >> 16) & 0xff;
180
+ sd->ext_csd[215] = (size >> 24) & 0xff;
181
+ sd->ext_csd[217] = 0x00; /* sleep/awake timeout */
186
@@ -454,7 +498,7 @@ static const BlockDevOps sd_block_ops = {
188
static const VMStateDescription sd_vmstate = {
192
.minimum_version_id = 1,
193
.fields = (VMStateField[]) {
194
VMSTATE_UINT32(mode, SDState),
195
@@ -480,6 +524,7 @@ static const VMStateDescription sd_vmstate = {
196
VMSTATE_UINT8_ARRAY(data, SDState, 512),
197
VMSTATE_BUFFER_POINTER_UNSAFE(buf, SDState, 1, 512),
198
VMSTATE_BOOL(enable, SDState),
199
+ VMSTATE_UINT8_ARRAY_V(ext_csd, SDState, 512, 2),
200
VMSTATE_END_OF_LIST()
203
@@ -500,6 +545,7 @@ SDState *sd_init(BlockDriverState *bs, bool is_spi, bool is_mmc)
204
sd = (SDState *) g_malloc0(sizeof(SDState));
205
sd->buf = qemu_blockalign(bs, 512);
211
@@ -596,6 +642,46 @@ static void sd_function_switch(SDState *sd, uint32_t arg)
212
sd->data[66] = crc & 0xff;
215
+static void mmc_function_switch(SDState *sd, uint32_t arg)
224
+ } mode = (arg >> 24);
225
+ if (mode >= unknown) {
226
+ fprintf(stderr, "%s: unknown mode 0x%02x\n", __FUNCTION__, mode);
228
+ if (mode == cmd_set) {
229
+ fprintf(stderr, "%s: command set change not implemented!\n",
232
+ uint8_t index = (arg >> 16) & 0xff;
233
+ /* ignore writes to read-only fields */
234
+ if (index != 192 && index != 196 &&
235
+ (index < 212 || index > 215)) {
236
+ uint8_t value = (arg >> 8) & 0xff;
239
+ sd->ext_csd[index] |= value;
242
+ sd->ext_csd[index] &= ~value;
245
+ sd->ext_csd[index] = value;
255
static inline bool sd_wp_addr(SDState *sd, uint64_t addr)
257
return test_bit(sd_addr_to_wpnum(addr), sd->wp_groups);
258
@@ -696,9 +782,15 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
261
case 1: /* CMD1: SEND_OP_CMD */
263
+ if (sd->state == sd_idle_state) {
264
+ sd->state = sd_ready_state;
272
sd->state = sd_transfer_state;
275
@@ -720,8 +812,12 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
278
case sd_identification_state:
279
- case sd_standby_state:
280
sd->state = sd_standby_state;
281
+ case sd_standby_state:
283
+ sd->rca = req.arg >> 16;
289
@@ -735,14 +831,26 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
292
case sd_standby_state:
301
- case 5: /* CMD5: reserved for SDIO cards */
302
+ case 5: /* CMD5: reserved for SDIO cards / SLEEP_AWAKE (MMC) */
304
+ if (sd->rca != rca) {
307
+ if (req.arg & (1 << 15)) {
308
+ sd->state = sd_transfer_state;
310
+ sd->state = sd_standby_state;
314
+ sd->card_status |= ILLEGAL_COMMAND;
317
case 6: /* CMD6: SWITCH_FUNCTION */
318
@@ -750,11 +858,16 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
321
case sd_data_transfer_mode:
322
- sd_function_switch(sd, req.arg);
323
- sd->state = sd_sendingdata_state;
324
- sd->data_start = 0;
325
- sd->data_offset = 0;
328
+ mmc_function_switch(sd, req.arg);
331
+ sd_function_switch(sd, req.arg);
332
+ sd->state = sd_sendingdata_state;
333
+ sd->data_start = 0;
334
+ sd->data_offset = 0;
340
@@ -799,22 +912,30 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
344
- case 8: /* CMD8: SEND_IF_COND */
345
- /* Physical Layer Specification Version 2.00 command */
346
- switch (sd->state) {
347
- case sd_idle_state:
349
+ case 8: /* CMD8: SEND_IF_COND / SEND_EXT_CSD (MMC) */
351
+ sd->state = sd_sendingdata_state;
352
+ memcpy(sd->data, sd->ext_csd, 512);
353
+ sd->data_start = addr;
354
+ sd->data_offset = 0;
357
+ /* Physical Layer Specification Version 2.00 command */
358
+ switch (sd->state) {
359
+ case sd_idle_state:
362
- /* No response if not exactly one VHS bit is set. */
363
- if (!(req.arg >> 8) || (req.arg >> ffs(req.arg & ~0xff)))
364
- return sd->spi ? sd_r7 : sd_r0;
365
+ /* No response if not exactly one VHS bit is set. */
366
+ if (!(req.arg >> 8) || (req.arg >> ffs(req.arg & ~0xff)))
367
+ return sd->spi ? sd_r7 : sd_r0;
384
@@ -974,7 +1095,32 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
388
+ /* Block write commands (Class 3) */
389
+ case 20: /* CMD20: WRITE_DAT_UNTIL_STOP */
391
+ if (sd->state == sd_transfer_state) {
392
+ sd->state = sd_sendingdata_state;
393
+ sd->data_start = req.arg;
394
+ sd->data_offset = 0;
396
+ if (sd->data_start + sd->blk_len > sd->size) {
397
+ sd->card_status |= ADDRESS_ERROR;
405
/* Block write commands (Class 4) */
406
+ case 23: /* CMD23: SET_BLOCK_COUNT */
408
+ sd->card_status |= ILLEGAL_COMMAND;
409
+ fprintf(stderr, "%s: CMD23 not implemented\n", __FUNCTION__);
414
case 24: /* CMD24: WRITE_SINGLE_BLOCK */
416
goto unimplemented_cmd;
417
@@ -1112,6 +1258,11 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
419
/* Erase commands (Class 5) */
420
case 32: /* CMD32: ERASE_WR_BLK_START */
421
+ case 35: /* CMD35: ERASE_GROUP_START */
422
+ if ((req.cmd == 35 && !sd->mmc) ||
423
+ (req.cmd == 32 && sd->mmc)) {
427
case sd_transfer_state:
428
sd->erase_start = req.arg;
429
@@ -1123,6 +1274,11 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
432
case 33: /* CMD33: ERASE_WR_BLK_END */
433
+ case 36: /* CMD36: ERASE_GROUP_END */
434
+ if ((req.cmd == 36 && !sd->mmc) ||
435
+ (req.cmd == 33 && sd->mmc)) {
439
case sd_transfer_state:
440
sd->erase_end = req.arg;
441
@@ -1152,6 +1308,17 @@ static sd_rsp_type_t sd_normal_command(SDState *sd,
446
+ case 39: /* CMD39: FAST_IO */
447
+ case 40: /* CMD40: GO_IRQ_STATE */
449
+ sd->card_status |= ILLEGAL_COMMAND;
450
+ fprintf(stderr, "%s: CMD%d not implemented\n",
451
+ __FUNCTION__, req.cmd);
456
/* Lock card commands (Class 7) */
457
case 42: /* CMD42: LOCK_UNLOCK */
459
@@ -1550,6 +1717,11 @@ void sd_write_data(SDState *sd, uint8_t value)
463
+ case 20: /* CMD20: WRITE_DAT_UNTIL_STOP */
465
+ goto unknown_command;
468
case 25: /* CMD25: WRITE_MULTIPLE_BLOCK */
469
if (sd->data_offset == 0) {
470
/* Start of the block - let's check the address is valid */
471
@@ -1640,6 +1812,7 @@ void sd_write_data(SDState *sd, uint8_t value)
476
fprintf(stderr, "sd_write_data: unknown command\n");
479
@@ -1655,7 +1828,7 @@ uint8_t sd_read_data(SDState *sd)
482
if (sd->state != sd_sendingdata_state) {
483
- fprintf(stderr, "sd_read_data: not in Sending-Data state\n");
484
+ fprintf(stderr, "sd_read_data: not in Sending-Data state (state=%d)\n", sd->state);
488
@@ -1672,6 +1845,16 @@ uint8_t sd_read_data(SDState *sd)
489
sd->state = sd_transfer_state;
492
+ case 8: /* CMD8: SEND_EXT_CSD (MMC only) */
494
+ ret = sd->data[sd->data_offset++];
495
+ if (sd->data_offset >= 512) {
496
+ sd->state = sd_transfer_state;
499
+ goto unknown_command;
502
case 9: /* CMD9: SEND_CSD */
503
case 10: /* CMD10: SEND_CID */
504
ret = sd->data[sd->data_offset ++];
505
@@ -1757,6 +1940,7 @@ uint8_t sd_read_data(SDState *sd)
510
fprintf(stderr, "sd_read_data: unknown command\n");
513
@@ -1773,3 +1957,8 @@ void sd_enable(SDState *sd, bool enable)
518
+bool sd_is_mmc(SDState *sd)
522
diff --git a/include/hw/sd.h b/include/hw/sd.h
523
index 562eaa2..13ef5d3 100644
524
--- a/include/hw/sd.h
525
+++ b/include/hw/sd.h
526
@@ -77,5 +77,6 @@ uint8_t sd_read_data(SDState *sd);
527
void sd_set_cb(SDState *sd, qemu_irq readonly, qemu_irq insert);
528
bool sd_data_ready(SDState *sd);
529
void sd_enable(SDState *sd, bool enable);
530
+bool sd_is_mmc(SDState *sd);
532
#endif /* __hw_sd_h */