]> Git Repo - qemu.git/blob - hw/sd.c
update from latest Bochs BIOS
[qemu.git] / hw / sd.c
1 /*
2  * SD Memory Card emulation as defined in the "SD Memory Card Physical
3  * layer specification, Version 1.10."
4  *
5  * Copyright (c) 2006 Andrzej Zaborowski  <[email protected]>
6  * Copyright (c) 2007 CodeSourcery
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
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.
18  *
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.
30  */
31
32 #include "hw.h"
33 #include "block.h"
34 #include "sd.h"
35
36 //#define DEBUG_SD 1
37
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
44
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_r7,        /* Operating voltage */
53     sd_r1b = -1,
54 } sd_rsp_type_t;
55
56 struct SDState {
57     enum {
58         sd_inactive,
59         sd_card_identification_mode,
60         sd_data_transfer_mode,
61     } mode;
62     enum {
63         sd_inactive_state = -1,
64         sd_idle_state = 0,
65         sd_ready_state,
66         sd_identification_state,
67         sd_standby_state,
68         sd_transfer_state,
69         sd_sendingdata_state,
70         sd_receivingdata_state,
71         sd_programming_state,
72         sd_disconnect_state,
73     } state;
74     uint32_t ocr;
75     uint8_t scr[8];
76     uint8_t cid[16];
77     uint8_t csd[16];
78     uint16_t rca;
79     uint32_t card_status;
80     uint8_t sd_status[64];
81     uint32_t vhs;
82     int wp_switch;
83     int *wp_groups;
84     uint32_t size;
85     int blk_len;
86     uint32_t erase_start;
87     uint32_t erase_end;
88     uint8_t pwd[16];
89     int pwd_len;
90     int function_group[6];
91
92     int spi;
93     int current_cmd;
94     int blk_written;
95     uint32_t data_start;
96     uint32_t data_offset;
97     uint8_t data[512];
98     qemu_irq readonly_cb;
99     qemu_irq inserted_cb;
100     BlockDriverState *bdrv;
101     uint8_t *buf;
102 };
103
104 static void sd_set_status(SDState *sd)
105 {
106     switch (sd->state) {
107     case sd_inactive_state:
108         sd->mode = sd_inactive;
109         break;
110
111     case sd_idle_state:
112     case sd_ready_state:
113     case sd_identification_state:
114         sd->mode = sd_card_identification_mode;
115         break;
116
117     case sd_standby_state:
118     case sd_transfer_state:
119     case sd_sendingdata_state:
120     case sd_receivingdata_state:
121     case sd_programming_state:
122     case sd_disconnect_state:
123         sd->mode = sd_data_transfer_mode;
124         break;
125     }
126
127     sd->card_status &= ~CURRENT_STATE;
128     sd->card_status |= sd->state << 9;
129 }
130
131 static const sd_cmd_type_t sd_cmd_type[64] = {
132     sd_bc,   sd_none, sd_bcr,  sd_bcr,  sd_none, sd_none, sd_none, sd_ac,
133     sd_bcr,  sd_ac,   sd_ac,   sd_adtc, sd_ac,   sd_ac,   sd_none, sd_ac,
134     sd_ac,   sd_adtc, sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none,
135     sd_adtc, sd_adtc, sd_adtc, sd_adtc, sd_ac,   sd_ac,   sd_adtc, sd_none,
136     sd_ac,   sd_ac,   sd_none, sd_none, sd_none, sd_none, sd_ac,   sd_none,
137     sd_none, sd_none, sd_bc,   sd_none, sd_none, sd_none, sd_none, sd_none,
138     sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_ac,
139     sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none,
140 };
141
142 static const sd_cmd_type_t sd_acmd_type[64] = {
143     sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_ac,   sd_none,
144     sd_none, sd_none, sd_none, sd_none, sd_none, sd_adtc, sd_none, sd_none,
145     sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_adtc, sd_ac,
146     sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none,
147     sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none,
148     sd_none, sd_bcr,  sd_ac,   sd_none, sd_none, sd_none, sd_none, sd_none,
149     sd_none, sd_none, sd_none, sd_adtc, sd_none, sd_none, sd_none, sd_none,
150     sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none,
151 };
152
153 static const int sd_cmd_class[64] = {
154     0,  0,  0,  0,  0,  9, 10,  0,  0,  0,  0,  1,  0,  0,  0,  0,
155     2,  2,  2,  2,  3,  3,  3,  3,  4,  4,  4,  4,  6,  6,  6,  6,
156     5,  5, 10, 10, 10, 10,  5,  9,  9,  9,  7,  7,  7,  7,  7,  7,
157     7,  7, 10,  7,  9,  9,  9,  8,  8, 10,  8,  8,  8,  8,  8,  8,
158 };
159
160 static uint8_t sd_crc7(void *message, size_t width)
161 {
162     int i, bit;
163     uint8_t shift_reg = 0x00;
164     uint8_t *msg = (uint8_t *) message;
165
166     for (i = 0; i < width; i ++, msg ++)
167         for (bit = 7; bit >= 0; bit --) {
168             shift_reg <<= 1;
169             if ((shift_reg >> 7) ^ ((*msg >> bit) & 1))
170                 shift_reg ^= 0x89;
171         }
172
173     return shift_reg;
174 }
175
176 static uint16_t sd_crc16(void *message, size_t width)
177 {
178     int i, bit;
179     uint16_t shift_reg = 0x0000;
180     uint16_t *msg = (uint16_t *) message;
181     width <<= 1;
182
183     for (i = 0; i < width; i ++, msg ++)
184         for (bit = 15; bit >= 0; bit --) {
185             shift_reg <<= 1;
186             if ((shift_reg >> 15) ^ ((*msg >> bit) & 1))
187                 shift_reg ^= 0x1011;
188         }
189
190     return shift_reg;
191 }
192
193 static void sd_set_ocr(SDState *sd)
194 {
195     /* All voltages OK, card power-up OK, Standard Capacity SD Memory Card */
196     sd->ocr = 0x80ffff80;
197 }
198
199 static void sd_set_scr(SDState *sd)
200 {
201     sd->scr[0] = 0x00;          /* SCR Structure */
202     sd->scr[1] = 0x2f;          /* SD Security Support */
203     sd->scr[2] = 0x00;
204     sd->scr[3] = 0x00;
205     sd->scr[4] = 0x00;
206     sd->scr[5] = 0x00;
207     sd->scr[6] = 0x00;
208     sd->scr[7] = 0x00;
209 }
210
211 #define MID     0xaa
212 #define OID     "XY"
213 #define PNM     "QEMU!"
214 #define PRV     0x01
215 #define MDT_YR  2006
216 #define MDT_MON 2
217
218 static void sd_set_cid(SDState *sd)
219 {
220     sd->cid[0] = MID;           /* Fake card manufacturer ID (MID) */
221     sd->cid[1] = OID[0];        /* OEM/Application ID (OID) */
222     sd->cid[2] = OID[1];
223     sd->cid[3] = PNM[0];        /* Fake product name (PNM) */
224     sd->cid[4] = PNM[1];
225     sd->cid[5] = PNM[2];
226     sd->cid[6] = PNM[3];
227     sd->cid[7] = PNM[4];
228     sd->cid[8] = PRV;           /* Fake product revision (PRV) */
229     sd->cid[9] = 0xde;          /* Fake serial number (PSN) */
230     sd->cid[10] = 0xad;
231     sd->cid[11] = 0xbe;
232     sd->cid[12] = 0xef;
233     sd->cid[13] = 0x00 |        /* Manufacture date (MDT) */
234         ((MDT_YR - 2000) / 10);
235     sd->cid[14] = ((MDT_YR % 10) << 4) | MDT_MON;
236     sd->cid[15] = (sd_crc7(sd->cid, 15) << 1) | 1;
237 }
238
239 #define HWBLOCK_SHIFT   9                       /* 512 bytes */
240 #define SECTOR_SHIFT    5                       /* 16 kilobytes */
241 #define WPGROUP_SHIFT   7                       /* 2 megs */
242 #define CMULT_SHIFT     9                       /* 512 times HWBLOCK_SIZE */
243 #define BLOCK_SIZE      (1 << (HWBLOCK_SHIFT))
244 #define SECTOR_SIZE     (1 << (HWBLOCK_SHIFT + SECTOR_SHIFT))
245 #define WPGROUP_SIZE    (1 << (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT))
246
247 static const uint8_t sd_csd_rw_mask[16] = {
248     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
249     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfe,
250 };
251
252 static void sd_set_csd(SDState *sd, uint32_t size)
253 {
254     uint32_t csize = (size >> (CMULT_SHIFT + HWBLOCK_SHIFT)) - 1;
255     uint32_t sectsize = (1 << (SECTOR_SHIFT + 1)) - 1;
256     uint32_t wpsize = (1 << (WPGROUP_SHIFT + 1)) - 1;
257
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 */
264         HWBLOCK_SHIFT;
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;
283 }
284
285 static void sd_set_rca(SDState *sd)
286 {
287     sd->rca += 0x4567;
288 }
289
290 #define CARD_STATUS_A   0x02004100
291 #define CARD_STATUS_B   0x00c01e00
292 #define CARD_STATUS_C   0xfd39a028
293
294 static void sd_set_cardstatus(SDState *sd)
295 {
296     sd->card_status = 0x00000100;
297 }
298
299 static void sd_set_sdstatus(SDState *sd)
300 {
301     memset(sd->sd_status, 0, 64);
302 }
303
304 static int sd_req_crc_validate(struct sd_request_s *req)
305 {
306     uint8_t buffer[5];
307     buffer[0] = 0x40 | req->cmd;
308     buffer[1] = (req->arg >> 24) & 0xff;
309     buffer[2] = (req->arg >> 16) & 0xff;
310     buffer[3] = (req->arg >> 8) & 0xff;
311     buffer[4] = (req->arg >> 0) & 0xff;
312     return 0;
313     return sd_crc7(buffer, 5) != req->crc;      /* TODO */
314 }
315
316 static void sd_response_r1_make(SDState *sd,
317                                 uint8_t *response, uint32_t last_status)
318 {
319     uint32_t mask = CARD_STATUS_B ^ ILLEGAL_COMMAND;
320     uint32_t status;
321
322     status = (sd->card_status & ~mask) | (last_status & mask);
323     sd->card_status &= ~CARD_STATUS_C | APP_CMD;
324
325     response[0] = (status >> 24) & 0xff;
326     response[1] = (status >> 16) & 0xff;
327     response[2] = (status >> 8) & 0xff;
328     response[3] = (status >> 0) & 0xff;
329 }
330
331 static void sd_response_r3_make(SDState *sd, uint8_t *response)
332 {
333     response[0] = (sd->ocr >> 24) & 0xff;
334     response[1] = (sd->ocr >> 16) & 0xff;
335     response[2] = (sd->ocr >> 8) & 0xff;
336     response[3] = (sd->ocr >> 0) & 0xff;
337 }
338
339 static void sd_response_r6_make(SDState *sd, uint8_t *response)
340 {
341     uint16_t arg;
342     uint16_t status;
343
344     arg = sd->rca;
345     status = ((sd->card_status >> 8) & 0xc000) |
346              ((sd->card_status >> 6) & 0x2000) |
347               (sd->card_status & 0x1fff);
348
349     response[0] = (arg >> 8) & 0xff;
350     response[1] = arg & 0xff;
351     response[2] = (status >> 8) & 0xff;
352     response[3] = status & 0xff;
353 }
354
355 static void sd_response_r7_make(SDState *sd, uint8_t *response)
356 {
357     response[0] = (sd->vhs >> 24) & 0xff;
358     response[1] = (sd->vhs >> 16) & 0xff;
359     response[2] = (sd->vhs >>  8) & 0xff;
360     response[3] = (sd->vhs >>  0) & 0xff;
361 }
362
363 static void sd_reset(SDState *sd, BlockDriverState *bdrv)
364 {
365     uint32_t size;
366     uint64_t sect;
367
368     bdrv_get_geometry(bdrv, &sect);
369     sect <<= 9;
370
371     if (sect > 0x40000000)
372         size = 0x40000000;      /* 1 gig */
373     else
374         size = sect + 1;
375
376     sect = (size >> (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT)) + 1;
377
378     sd->state = sd_idle_state;
379     sd->rca = 0x0000;
380     sd_set_ocr(sd);
381     sd_set_scr(sd);
382     sd_set_cid(sd);
383     sd_set_csd(sd, size);
384     sd_set_cardstatus(sd);
385     sd_set_sdstatus(sd);
386
387     sd->bdrv = bdrv;
388
389     if (sd->wp_groups)
390         qemu_free(sd->wp_groups);
391     sd->wp_switch = bdrv_is_read_only(bdrv);
392     sd->wp_groups = (int *) qemu_mallocz(sizeof(int) * sect);
393     memset(sd->function_group, 0, sizeof(int) * 6);
394     sd->erase_start = 0;
395     sd->erase_end = 0;
396     sd->size = size;
397     sd->blk_len = 0x200;
398     sd->pwd_len = 0;
399 }
400
401 static void sd_cardchange(void *opaque)
402 {
403     SDState *sd = opaque;
404     qemu_set_irq(sd->inserted_cb, bdrv_is_inserted(sd->bdrv));
405     if (bdrv_is_inserted(sd->bdrv)) {
406         sd_reset(sd, sd->bdrv);
407         qemu_set_irq(sd->readonly_cb, sd->wp_switch);
408     }
409 }
410
411 /* We do not model the chip select pin, so allow the board to select
412    whether card should be in SSI or MMC/SD mode.  It is also up to the
413    board to ensure that ssi transfers only occur when the chip select
414    is asserted.  */
415 SDState *sd_init(BlockDriverState *bs, int is_spi)
416 {
417     SDState *sd;
418
419     sd = (SDState *) qemu_mallocz(sizeof(SDState));
420     sd->buf = qemu_memalign(512, 512);
421     sd->spi = is_spi;
422     sd_reset(sd, bs);
423     bdrv_set_change_cb(sd->bdrv, sd_cardchange, sd);
424     return sd;
425 }
426
427 void sd_set_cb(SDState *sd, qemu_irq readonly, qemu_irq insert)
428 {
429     sd->readonly_cb = readonly;
430     sd->inserted_cb = insert;
431     qemu_set_irq(readonly, bdrv_is_read_only(sd->bdrv));
432     qemu_set_irq(insert, bdrv_is_inserted(sd->bdrv));
433 }
434
435 static void sd_erase(SDState *sd)
436 {
437     int i, start, end;
438     if (!sd->erase_start || !sd->erase_end) {
439         sd->card_status |= ERASE_SEQ_ERROR;
440         return;
441     }
442
443     start = sd->erase_start >>
444             (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT);
445     end = sd->erase_end >>
446             (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT);
447     sd->erase_start = 0;
448     sd->erase_end = 0;
449     sd->csd[14] |= 0x40;
450
451     for (i = start; i <= end; i ++)
452         if (sd->wp_groups[i])
453             sd->card_status |= WP_ERASE_SKIP;
454 }
455
456 static uint32_t sd_wpbits(SDState *sd, uint32_t addr)
457 {
458     uint32_t i, wpnum;
459     uint32_t ret = 0;
460
461     wpnum = addr >> (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT);
462
463     for (i = 0; i < 32; i ++, wpnum ++, addr += WPGROUP_SIZE)
464         if (addr < sd->size && sd->wp_groups[wpnum])
465             ret |= (1 << i);
466
467     return ret;
468 }
469
470 static void sd_function_switch(SDState *sd, uint32_t arg)
471 {
472     int i, mode, new_func, crc;
473     mode = !!(arg & 0x80000000);
474
475     sd->data[0] = 0x00;         /* Maximum current consumption */
476     sd->data[1] = 0x01;
477     sd->data[2] = 0x80;         /* Supported group 6 functions */
478     sd->data[3] = 0x01;
479     sd->data[4] = 0x80;         /* Supported group 5 functions */
480     sd->data[5] = 0x01;
481     sd->data[6] = 0x80;         /* Supported group 4 functions */
482     sd->data[7] = 0x01;
483     sd->data[8] = 0x80;         /* Supported group 3 functions */
484     sd->data[9] = 0x01;
485     sd->data[10] = 0x80;        /* Supported group 2 functions */
486     sd->data[11] = 0x43;
487     sd->data[12] = 0x80;        /* Supported group 1 functions */
488     sd->data[13] = 0x03;
489     for (i = 0; i < 6; i ++) {
490         new_func = (arg >> (i * 4)) & 0x0f;
491         if (mode && new_func != 0x0f)
492             sd->function_group[i] = new_func;
493         sd->data[14 + (i >> 1)] = new_func << ((i * 4) & 4);
494     }
495     memset(&sd->data[17], 0, 47);
496     crc = sd_crc16(sd->data, 64);
497     sd->data[65] = crc >> 8;
498     sd->data[66] = crc & 0xff;
499 }
500
501 static inline int sd_wp_addr(SDState *sd, uint32_t addr)
502 {
503     return sd->wp_groups[addr >>
504             (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT)];
505 }
506
507 static void sd_lock_command(SDState *sd)
508 {
509     int erase, lock, clr_pwd, set_pwd, pwd_len;
510     erase = !!(sd->data[0] & 0x08);
511     lock = sd->data[0] & 0x04;
512     clr_pwd = sd->data[0] & 0x02;
513     set_pwd = sd->data[0] & 0x01;
514
515     if (sd->blk_len > 1)
516         pwd_len = sd->data[1];
517     else
518         pwd_len = 0;
519
520     if (erase) {
521         if (!(sd->card_status & CARD_IS_LOCKED) || sd->blk_len > 1 ||
522                         set_pwd || clr_pwd || lock || sd->wp_switch ||
523                         (sd->csd[14] & 0x20)) {
524             sd->card_status |= LOCK_UNLOCK_FAILED;
525             return;
526         }
527         memset(sd->wp_groups, 0, sizeof(int) * (sd->size >>
528                         (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT)));
529         sd->csd[14] &= ~0x10;
530         sd->card_status &= ~CARD_IS_LOCKED;
531         sd->pwd_len = 0;
532         /* Erasing the entire card here! */
533         printf("SD: Card force-erased by CMD42\n");
534         return;
535     }
536
537     if (sd->blk_len < 2 + pwd_len ||
538                     pwd_len <= sd->pwd_len ||
539                     pwd_len > sd->pwd_len + 16) {
540         sd->card_status |= LOCK_UNLOCK_FAILED;
541         return;
542     }
543
544     if (sd->pwd_len && memcmp(sd->pwd, sd->data + 2, sd->pwd_len)) {
545         sd->card_status |= LOCK_UNLOCK_FAILED;
546         return;
547     }
548
549     pwd_len -= sd->pwd_len;
550     if ((pwd_len && !set_pwd) ||
551                     (clr_pwd && (set_pwd || lock)) ||
552                     (lock && !sd->pwd_len && !set_pwd) ||
553                     (!set_pwd && !clr_pwd &&
554                      (((sd->card_status & CARD_IS_LOCKED) && lock) ||
555                       (!(sd->card_status & CARD_IS_LOCKED) && !lock)))) {
556         sd->card_status |= LOCK_UNLOCK_FAILED;
557         return;
558     }
559
560     if (set_pwd) {
561         memcpy(sd->pwd, sd->data + 2 + sd->pwd_len, pwd_len);
562         sd->pwd_len = pwd_len;
563     }
564
565     if (clr_pwd) {
566         sd->pwd_len = 0;
567     }
568
569     if (lock)
570         sd->card_status |= CARD_IS_LOCKED;
571     else
572         sd->card_status &= ~CARD_IS_LOCKED;
573 }
574
575 static sd_rsp_type_t sd_normal_command(SDState *sd,
576                                        struct sd_request_s req)
577 {
578     uint32_t rca = 0x0000;
579
580     if (sd_cmd_type[req.cmd] == sd_ac || sd_cmd_type[req.cmd] == sd_adtc)
581         rca = req.arg >> 16;
582
583     DPRINTF("CMD%d 0x%08x state %d\n", req.cmd, req.arg, sd->state);
584     switch (req.cmd) {
585     /* Basic commands (Class 0 and Class 1) */
586     case 0:     /* CMD0:   GO_IDLE_STATE */
587         switch (sd->state) {
588         case sd_inactive_state:
589             return sd->spi ? sd_r1 : sd_r0;
590
591         default:
592             sd->state = sd_idle_state;
593             sd_reset(sd, sd->bdrv);
594             return sd->spi ? sd_r1 : sd_r0;
595         }
596         break;
597
598     case 1:     /* CMD1:   SEND_OP_CMD */
599         if (!sd->spi)
600             goto bad_cmd;
601
602         sd->state = sd_transfer_state;
603         return sd_r1;
604
605     case 2:     /* CMD2:   ALL_SEND_CID */
606         if (sd->spi)
607             goto bad_cmd;
608         switch (sd->state) {
609         case sd_ready_state:
610             sd->state = sd_identification_state;
611             return sd_r2_i;
612
613         default:
614             break;
615         }
616         break;
617
618     case 3:     /* CMD3:   SEND_RELATIVE_ADDR */
619         if (sd->spi)
620             goto bad_cmd;
621         switch (sd->state) {
622         case sd_identification_state:
623         case sd_standby_state:
624             sd->state = sd_standby_state;
625             sd_set_rca(sd);
626             return sd_r6;
627
628         default:
629             break;
630         }
631         break;
632
633     case 4:     /* CMD4:   SEND_DSR */
634         if (sd->spi)
635             goto bad_cmd;
636         switch (sd->state) {
637         case sd_standby_state:
638             break;
639
640         default:
641             break;
642         }
643         break;
644
645     case 6:     /* CMD6:   SWITCH_FUNCTION */
646         if (sd->spi)
647             goto bad_cmd;
648         switch (sd->mode) {
649         case sd_data_transfer_mode:
650             sd_function_switch(sd, req.arg);
651             sd->state = sd_sendingdata_state;
652             sd->data_start = 0;
653             sd->data_offset = 0;
654             return sd_r1;
655
656         default:
657             break;
658         }
659         break;
660
661     case 7:     /* CMD7:   SELECT/DESELECT_CARD */
662         if (sd->spi)
663             goto bad_cmd;
664         switch (sd->state) {
665         case sd_standby_state:
666             if (sd->rca != rca)
667                 return sd_r0;
668
669             sd->state = sd_transfer_state;
670             return sd_r1b;
671
672         case sd_transfer_state:
673         case sd_sendingdata_state:
674             if (sd->rca == rca)
675                 break;
676
677             sd->state = sd_standby_state;
678             return sd_r1b;
679
680         case sd_disconnect_state:
681             if (sd->rca != rca)
682                 return sd_r0;
683
684             sd->state = sd_programming_state;
685             return sd_r1b;
686
687         case sd_programming_state:
688             if (sd->rca == rca)
689                 break;
690
691             sd->state = sd_disconnect_state;
692             return sd_r1b;
693
694         default:
695             break;
696         }
697         break;
698
699     case 8:     /* CMD8:   SEND_IF_COND */
700         /* Physical Layer Specification Version 2.00 command */
701         switch (sd->state) {
702         case sd_idle_state:
703             sd->vhs = 0;
704
705             /* No response if not exactly one VHS bit is set.  */
706             if (!(req.arg >> 8) || (req.arg >> ffs(req.arg & ~0xff)))
707                 return sd->spi ? sd_r7 : sd_r0;
708
709             /* Accept.  */
710             sd->vhs = req.arg;
711             return sd_r7;
712
713         default:
714             break;
715         }
716         break;
717
718     case 9:     /* CMD9:   SEND_CSD */
719         switch (sd->state) {
720         case sd_standby_state:
721             if (sd->rca != rca)
722                 return sd_r0;
723
724             return sd_r2_s;
725
726         case sd_transfer_state:
727             if (!sd->spi)
728                 break;
729             sd->state = sd_sendingdata_state;
730             memcpy(sd->data, sd->csd, 16);
731             sd->data_start = req.arg;
732             sd->data_offset = 0;
733             return sd_r1;
734
735         default:
736             break;
737         }
738         break;
739
740     case 10:    /* CMD10:  SEND_CID */
741         switch (sd->state) {
742         case sd_standby_state:
743             if (sd->rca != rca)
744                 return sd_r0;
745
746             return sd_r2_i;
747
748         case sd_transfer_state:
749             if (!sd->spi)
750                 break;
751             sd->state = sd_sendingdata_state;
752             memcpy(sd->data, sd->cid, 16);
753             sd->data_start = req.arg;
754             sd->data_offset = 0;
755             return sd_r1;
756
757         default:
758             break;
759         }
760         break;
761
762     case 11:    /* CMD11:  READ_DAT_UNTIL_STOP */
763         if (sd->spi)
764             goto bad_cmd;
765         switch (sd->state) {
766         case sd_transfer_state:
767             sd->state = sd_sendingdata_state;
768             sd->data_start = req.arg;
769             sd->data_offset = 0;
770
771             if (sd->data_start + sd->blk_len > sd->size)
772                 sd->card_status |= ADDRESS_ERROR;
773             return sd_r0;
774
775         default:
776             break;
777         }
778         break;
779
780     case 12:    /* CMD12:  STOP_TRANSMISSION */
781         switch (sd->state) {
782         case sd_sendingdata_state:
783             sd->state = sd_transfer_state;
784             return sd_r1b;
785
786         case sd_receivingdata_state:
787             sd->state = sd_programming_state;
788             /* Bzzzzzzztt .... Operation complete.  */
789             sd->state = sd_transfer_state;
790             return sd_r1b;
791
792         default:
793             break;
794         }
795         break;
796
797     case 13:    /* CMD13:  SEND_STATUS */
798         switch (sd->mode) {
799         case sd_data_transfer_mode:
800             if (sd->rca != rca)
801                 return sd_r0;
802
803             return sd_r1;
804
805         default:
806             break;
807         }
808         break;
809
810     case 15:    /* CMD15:  GO_INACTIVE_STATE */
811         if (sd->spi)
812             goto bad_cmd;
813         switch (sd->mode) {
814         case sd_data_transfer_mode:
815             if (sd->rca != rca)
816                 return sd_r0;
817
818             sd->state = sd_inactive_state;
819             return sd_r0;
820
821         default:
822             break;
823         }
824         break;
825
826     /* Block read commands (Classs 2) */
827     case 16:    /* CMD16:  SET_BLOCKLEN */
828         switch (sd->state) {
829         case sd_transfer_state:
830             if (req.arg > (1 << HWBLOCK_SHIFT))
831                 sd->card_status |= BLOCK_LEN_ERROR;
832             else
833                 sd->blk_len = req.arg;
834
835             return sd_r1;
836
837         default:
838             break;
839         }
840         break;
841
842     case 17:    /* CMD17:  READ_SINGLE_BLOCK */
843         switch (sd->state) {
844         case sd_transfer_state:
845             sd->state = sd_sendingdata_state;
846             sd->data_start = req.arg;
847             sd->data_offset = 0;
848
849             if (sd->data_start + sd->blk_len > sd->size)
850                 sd->card_status |= ADDRESS_ERROR;
851             return sd_r1;
852
853         default:
854             break;
855         }
856         break;
857
858     case 18:    /* CMD18:  READ_MULTIPLE_BLOCK */
859         switch (sd->state) {
860         case sd_transfer_state:
861             sd->state = sd_sendingdata_state;
862             sd->data_start = req.arg;
863             sd->data_offset = 0;
864
865             if (sd->data_start + sd->blk_len > sd->size)
866                 sd->card_status |= ADDRESS_ERROR;
867             return sd_r1;
868
869         default:
870             break;
871         }
872         break;
873
874     /* Block write commands (Class 4) */
875     case 24:    /* CMD24:  WRITE_SINGLE_BLOCK */
876         if (sd->spi)
877             goto unimplemented_cmd;
878         switch (sd->state) {
879         case sd_transfer_state:
880             /* Writing in SPI mode not implemented.  */
881             if (sd->spi)
882                 break;
883             sd->state = sd_receivingdata_state;
884             sd->data_start = req.arg;
885             sd->data_offset = 0;
886             sd->blk_written = 0;
887
888             if (sd->data_start + sd->blk_len > sd->size)
889                 sd->card_status |= ADDRESS_ERROR;
890             if (sd_wp_addr(sd, sd->data_start))
891                 sd->card_status |= WP_VIOLATION;
892             if (sd->csd[14] & 0x30)
893                 sd->card_status |= WP_VIOLATION;
894             return sd_r1;
895
896         default:
897             break;
898         }
899         break;
900
901     case 25:    /* CMD25:  WRITE_MULTIPLE_BLOCK */
902         if (sd->spi)
903             goto unimplemented_cmd;
904         switch (sd->state) {
905         case sd_transfer_state:
906             /* Writing in SPI mode not implemented.  */
907             if (sd->spi)
908                 break;
909             sd->state = sd_receivingdata_state;
910             sd->data_start = req.arg;
911             sd->data_offset = 0;
912             sd->blk_written = 0;
913
914             if (sd->data_start + sd->blk_len > sd->size)
915                 sd->card_status |= ADDRESS_ERROR;
916             if (sd_wp_addr(sd, sd->data_start))
917                 sd->card_status |= WP_VIOLATION;
918             if (sd->csd[14] & 0x30)
919                 sd->card_status |= WP_VIOLATION;
920             return sd_r1;
921
922         default:
923             break;
924         }
925         break;
926
927     case 26:    /* CMD26:  PROGRAM_CID */
928         if (sd->spi)
929             goto bad_cmd;
930         switch (sd->state) {
931         case sd_transfer_state:
932             sd->state = sd_receivingdata_state;
933             sd->data_start = 0;
934             sd->data_offset = 0;
935             return sd_r1;
936
937         default:
938             break;
939         }
940         break;
941
942     case 27:    /* CMD27:  PROGRAM_CSD */
943         if (sd->spi)
944             goto unimplemented_cmd;
945         switch (sd->state) {
946         case sd_transfer_state:
947             sd->state = sd_receivingdata_state;
948             sd->data_start = 0;
949             sd->data_offset = 0;
950             return sd_r1;
951
952         default:
953             break;
954         }
955         break;
956
957     /* Write protection (Class 6) */
958     case 28:    /* CMD28:  SET_WRITE_PROT */
959         switch (sd->state) {
960         case sd_transfer_state:
961             if (req.arg >= sd->size) {
962                 sd->card_status = ADDRESS_ERROR;
963                 return sd_r1b;
964             }
965
966             sd->state = sd_programming_state;
967             sd->wp_groups[req.arg >> (HWBLOCK_SHIFT +
968                             SECTOR_SHIFT + WPGROUP_SHIFT)] = 1;
969             /* Bzzzzzzztt .... Operation complete.  */
970             sd->state = sd_transfer_state;
971             return sd_r1b;
972
973         default:
974             break;
975         }
976         break;
977
978     case 29:    /* CMD29:  CLR_WRITE_PROT */
979         switch (sd->state) {
980         case sd_transfer_state:
981             if (req.arg >= sd->size) {
982                 sd->card_status = ADDRESS_ERROR;
983                 return sd_r1b;
984             }
985
986             sd->state = sd_programming_state;
987             sd->wp_groups[req.arg >> (HWBLOCK_SHIFT +
988                             SECTOR_SHIFT + WPGROUP_SHIFT)] = 0;
989             /* Bzzzzzzztt .... Operation complete.  */
990             sd->state = sd_transfer_state;
991             return sd_r1b;
992
993         default:
994             break;
995         }
996         break;
997
998     case 30:    /* CMD30:  SEND_WRITE_PROT */
999         switch (sd->state) {
1000         case sd_transfer_state:
1001             sd->state = sd_sendingdata_state;
1002             *(uint32_t *) sd->data = sd_wpbits(sd, req.arg);
1003             sd->data_start = req.arg;
1004             sd->data_offset = 0;
1005             return sd_r1b;
1006
1007         default:
1008             break;
1009         }
1010         break;
1011
1012     /* Erase commands (Class 5) */
1013     case 32:    /* CMD32:  ERASE_WR_BLK_START */
1014         switch (sd->state) {
1015         case sd_transfer_state:
1016             sd->erase_start = req.arg;
1017             return sd_r1;
1018
1019         default:
1020             break;
1021         }
1022         break;
1023
1024     case 33:    /* CMD33:  ERASE_WR_BLK_END */
1025         switch (sd->state) {
1026         case sd_transfer_state:
1027             sd->erase_end = req.arg;
1028             return sd_r1;
1029
1030         default:
1031             break;
1032         }
1033         break;
1034
1035     case 38:    /* CMD38:  ERASE */
1036         switch (sd->state) {
1037         case sd_transfer_state:
1038             if (sd->csd[14] & 0x30) {
1039                 sd->card_status |= WP_VIOLATION;
1040                 return sd_r1b;
1041             }
1042
1043             sd->state = sd_programming_state;
1044             sd_erase(sd);
1045             /* Bzzzzzzztt .... Operation complete.  */
1046             sd->state = sd_transfer_state;
1047             return sd_r1b;
1048
1049         default:
1050             break;
1051         }
1052         break;
1053
1054     /* Lock card commands (Class 7) */
1055     case 42:    /* CMD42:  LOCK_UNLOCK */
1056         if (sd->spi)
1057             goto unimplemented_cmd;
1058         switch (sd->state) {
1059         case sd_transfer_state:
1060             sd->state = sd_receivingdata_state;
1061             sd->data_start = 0;
1062             sd->data_offset = 0;
1063             return sd_r1;
1064
1065         default:
1066             break;
1067         }
1068         break;
1069
1070     /* Application specific commands (Class 8) */
1071     case 55:    /* CMD55:  APP_CMD */
1072         if (sd->rca != rca)
1073             return sd_r0;
1074
1075         sd->card_status |= APP_CMD;
1076         return sd_r1;
1077
1078     case 56:    /* CMD56:  GEN_CMD */
1079         printf("SD: GEN_CMD 0x%08x\n", req.arg);
1080
1081         switch (sd->state) {
1082         case sd_transfer_state:
1083             sd->data_offset = 0;
1084             if (req.arg & 1)
1085                 sd->state = sd_sendingdata_state;
1086             else
1087                 sd->state = sd_receivingdata_state;
1088             return sd_r1;
1089
1090         default:
1091             break;
1092         }
1093         break;
1094
1095     default:
1096     bad_cmd:
1097         sd->card_status |= ILLEGAL_COMMAND;
1098
1099         printf("SD: Unknown CMD%i\n", req.cmd);
1100         return sd_r0;
1101
1102     unimplemented_cmd:
1103         /* Commands that are recognised but not yet implemented in SPI mode.  */
1104         sd->card_status |= ILLEGAL_COMMAND;
1105         printf ("SD: CMD%i not implemented in SPI mode\n", req.cmd);
1106         return sd_r0;
1107     }
1108
1109     sd->card_status |= ILLEGAL_COMMAND;
1110     printf("SD: CMD%i in a wrong state\n", req.cmd);
1111     return sd_r0;
1112 }
1113
1114 static sd_rsp_type_t sd_app_command(SDState *sd,
1115                                     struct sd_request_s req) {
1116     uint32_t rca;
1117
1118     if (sd_cmd_type[req.cmd] == sd_ac || sd_cmd_type[req.cmd] == sd_adtc)
1119         rca = req.arg >> 16;
1120
1121     DPRINTF("ACMD%d 0x%08x\n", req.cmd, req.arg);
1122     switch (req.cmd) {
1123     case 6:     /* ACMD6:  SET_BUS_WIDTH */
1124         switch (sd->state) {
1125         case sd_transfer_state:
1126             sd->sd_status[0] &= 0x3f;
1127             sd->sd_status[0] |= (req.arg & 0x03) << 6;
1128             return sd_r1;
1129
1130         default:
1131             break;
1132         }
1133         break;
1134
1135     case 13:    /* ACMD13: SD_STATUS */
1136         switch (sd->state) {
1137         case sd_transfer_state:
1138             sd->data_start = 0;
1139             sd->data_offset = 0;
1140             return sd_r1;
1141
1142         default:
1143             break;
1144         }
1145         break;
1146
1147     case 22:    /* ACMD22: SEND_NUM_WR_BLOCKS */
1148         switch (sd->state) {
1149         case sd_transfer_state:
1150             *(uint32_t *) sd->data = sd->blk_written;
1151
1152             sd->data_start = 0;
1153             sd->data_offset = 0;
1154             return sd_r1;
1155
1156         default:
1157             break;
1158         }
1159         break;
1160
1161     case 23:    /* ACMD23: SET_WR_BLK_ERASE_COUNT */
1162         switch (sd->state) {
1163         case sd_transfer_state:
1164             return sd_r1;
1165
1166         default:
1167             break;
1168         }
1169         break;
1170
1171     case 41:    /* ACMD41: SD_APP_OP_COND */
1172         if (sd->spi) {
1173             /* SEND_OP_CMD */
1174             sd->state = sd_transfer_state;
1175             return sd_r1;
1176         }
1177         switch (sd->state) {
1178         case sd_idle_state:
1179             /* We accept any voltage.  10000 V is nothing.  */
1180             if (req.arg)
1181                 sd->state = sd_ready_state;
1182
1183             return sd_r3;
1184
1185         default:
1186             break;
1187         }
1188         break;
1189
1190     case 42:    /* ACMD42: SET_CLR_CARD_DETECT */
1191         switch (sd->state) {
1192         case sd_transfer_state:
1193             /* Bringing in the 50KOhm pull-up resistor... Done.  */
1194             return sd_r1;
1195
1196         default:
1197             break;
1198         }
1199         break;
1200
1201     case 51:    /* ACMD51: SEND_SCR */
1202         switch (sd->state) {
1203         case sd_transfer_state:
1204             sd->state = sd_sendingdata_state;
1205             sd->data_start = 0;
1206             sd->data_offset = 0;
1207             return sd_r1;
1208
1209         default:
1210             break;
1211         }
1212         break;
1213
1214     default:
1215         /* Fall back to standard commands.  */
1216         sd->card_status &= ~APP_CMD;
1217         return sd_normal_command(sd, req);
1218     }
1219
1220     printf("SD: ACMD%i in a wrong state\n", req.cmd);
1221     return sd_r0;
1222 }
1223
1224 int sd_do_command(SDState *sd, struct sd_request_s *req,
1225                   uint8_t *response) {
1226     uint32_t last_status = sd->card_status;
1227     sd_rsp_type_t rtype;
1228     int rsplen;
1229
1230     if (!bdrv_is_inserted(sd->bdrv)) {
1231         return 0;
1232     }
1233
1234     if (sd_req_crc_validate(req)) {
1235         sd->card_status &= ~COM_CRC_ERROR;
1236         return 0;
1237     }
1238
1239     sd->card_status &= ~CARD_STATUS_B;
1240     sd_set_status(sd);
1241
1242     if (last_status & CARD_IS_LOCKED)
1243         if (((last_status & APP_CMD) &&
1244                                  req->cmd == 41) ||
1245                         (!(last_status & APP_CMD) &&
1246                          (sd_cmd_class[req->cmd] == 0 ||
1247                           sd_cmd_class[req->cmd] == 7 ||
1248                           req->cmd == 16 || req->cmd == 55))) {
1249             sd->card_status |= ILLEGAL_COMMAND;
1250             printf("SD: Card is locked\n");
1251             return 0;
1252         }
1253
1254     if (last_status & APP_CMD) {
1255         rtype = sd_app_command(sd, *req);
1256         sd->card_status &= ~APP_CMD;
1257     } else
1258         rtype = sd_normal_command(sd, *req);
1259
1260     sd->current_cmd = req->cmd;
1261
1262     switch (rtype) {
1263     case sd_r1:
1264     case sd_r1b:
1265         sd_response_r1_make(sd, response, last_status);
1266         rsplen = 4;
1267         break;
1268
1269     case sd_r2_i:
1270         memcpy(response, sd->cid, sizeof(sd->cid));
1271         rsplen = 16;
1272         break;
1273
1274     case sd_r2_s:
1275         memcpy(response, sd->csd, sizeof(sd->csd));
1276         rsplen = 16;
1277         break;
1278
1279     case sd_r3:
1280         sd_response_r3_make(sd, response);
1281         rsplen = 4;
1282         break;
1283
1284     case sd_r6:
1285         sd_response_r6_make(sd, response);
1286         rsplen = 4;
1287         break;
1288
1289     case sd_r7:
1290         sd_response_r7_make(sd, response);
1291         rsplen = 4;
1292         break;
1293
1294     case sd_r0:
1295     default:
1296         rsplen = 0;
1297         break;
1298     }
1299
1300     if (sd->card_status & ILLEGAL_COMMAND)
1301         rsplen = 0;
1302
1303 #ifdef DEBUG_SD
1304     if (rsplen) {
1305         int i;
1306         DPRINTF("Response:");
1307         for (i = 0; i < rsplen; i++)
1308             printf(" %02x", response[i]);
1309         printf(" state %d\n", sd->state);
1310     } else {
1311         DPRINTF("No response %d\n", sd->state);
1312     }
1313 #endif
1314
1315     return rsplen;
1316 }
1317
1318 /* No real need for 64 bit addresses here */
1319 static void sd_blk_read(SDState *sd, uint32_t addr, uint32_t len)
1320 {
1321     uint32_t end = addr + len;
1322
1323     if (!sd->bdrv || bdrv_read(sd->bdrv, addr >> 9, sd->buf, 1) == -1) {
1324         printf("sd_blk_read: read error on host side\n");
1325         return;
1326     }
1327
1328     if (end > (addr & ~511) + 512) {
1329         memcpy(sd->data, sd->buf + (addr & 511), 512 - (addr & 511));
1330
1331         if (bdrv_read(sd->bdrv, end >> 9, sd->buf, 1) == -1) {
1332             printf("sd_blk_read: read error on host side\n");
1333             return;
1334         }
1335         memcpy(sd->data + 512 - (addr & 511), sd->buf, end & 511);
1336     } else
1337         memcpy(sd->data, sd->buf + (addr & 511), len);
1338 }
1339
1340 static void sd_blk_write(SDState *sd, uint32_t addr, uint32_t len)
1341 {
1342     uint32_t end = addr + len;
1343
1344     if ((addr & 511) || len < 512)
1345         if (!sd->bdrv || bdrv_read(sd->bdrv, addr >> 9, sd->buf, 1) == -1) {
1346             printf("sd_blk_write: read error on host side\n");
1347             return;
1348         }
1349
1350     if (end > (addr & ~511) + 512) {
1351         memcpy(sd->buf + (addr & 511), sd->data, 512 - (addr & 511));
1352         if (bdrv_write(sd->bdrv, addr >> 9, sd->buf, 1) == -1) {
1353             printf("sd_blk_write: write error on host side\n");
1354             return;
1355         }
1356
1357         if (bdrv_read(sd->bdrv, end >> 9, sd->buf, 1) == -1) {
1358             printf("sd_blk_write: read error on host side\n");
1359             return;
1360         }
1361         memcpy(sd->buf, sd->data + 512 - (addr & 511), end & 511);
1362         if (bdrv_write(sd->bdrv, end >> 9, sd->buf, 1) == -1)
1363             printf("sd_blk_write: write error on host side\n");
1364     } else {
1365         memcpy(sd->buf + (addr & 511), sd->data, len);
1366         if (!sd->bdrv || bdrv_write(sd->bdrv, addr >> 9, sd->buf, 1) == -1)
1367             printf("sd_blk_write: write error on host side\n");
1368     }
1369 }
1370
1371 #define BLK_READ_BLOCK(a, len)  sd_blk_read(sd, a, len)
1372 #define BLK_WRITE_BLOCK(a, len) sd_blk_write(sd, a, len)
1373 #define APP_READ_BLOCK(a, len)  memset(sd->data, 0xec, len)
1374 #define APP_WRITE_BLOCK(a, len)
1375
1376 void sd_write_data(SDState *sd, uint8_t value)
1377 {
1378     int i;
1379
1380     if (!sd->bdrv || !bdrv_is_inserted(sd->bdrv))
1381         return;
1382
1383     if (sd->state != sd_receivingdata_state) {
1384         printf("sd_write_data: not in Receiving-Data state\n");
1385         return;
1386     }
1387
1388     if (sd->card_status & (ADDRESS_ERROR | WP_VIOLATION))
1389         return;
1390
1391     switch (sd->current_cmd) {
1392     case 24:    /* CMD24:  WRITE_SINGLE_BLOCK */
1393         sd->data[sd->data_offset ++] = value;
1394         if (sd->data_offset >= sd->blk_len) {
1395             /* TODO: Check CRC before committing */
1396             sd->state = sd_programming_state;
1397             BLK_WRITE_BLOCK(sd->data_start, sd->data_offset);
1398             sd->blk_written ++;
1399             sd->csd[14] |= 0x40;
1400             /* Bzzzzzzztt .... Operation complete.  */
1401             sd->state = sd_transfer_state;
1402         }
1403         break;
1404
1405     case 25:    /* CMD25:  WRITE_MULTIPLE_BLOCK */
1406         sd->data[sd->data_offset ++] = value;
1407         if (sd->data_offset >= sd->blk_len) {
1408             /* TODO: Check CRC before committing */
1409             sd->state = sd_programming_state;
1410             BLK_WRITE_BLOCK(sd->data_start, sd->data_offset);
1411             sd->blk_written ++;
1412             sd->data_start += sd->blk_len;
1413             sd->data_offset = 0;
1414             if (sd->data_start + sd->blk_len > sd->size) {
1415                 sd->card_status |= ADDRESS_ERROR;
1416                 break;
1417             }
1418             if (sd_wp_addr(sd, sd->data_start)) {
1419                 sd->card_status |= WP_VIOLATION;
1420                 break;
1421             }
1422             sd->csd[14] |= 0x40;
1423
1424             /* Bzzzzzzztt .... Operation complete.  */
1425             sd->state = sd_receivingdata_state;
1426         }
1427         break;
1428
1429     case 26:    /* CMD26:  PROGRAM_CID */
1430         sd->data[sd->data_offset ++] = value;
1431         if (sd->data_offset >= sizeof(sd->cid)) {
1432             /* TODO: Check CRC before committing */
1433             sd->state = sd_programming_state;
1434             for (i = 0; i < sizeof(sd->cid); i ++)
1435                 if ((sd->cid[i] | 0x00) != sd->data[i])
1436                     sd->card_status |= CID_CSD_OVERWRITE;
1437
1438             if (!(sd->card_status & CID_CSD_OVERWRITE))
1439                 for (i = 0; i < sizeof(sd->cid); i ++) {
1440                     sd->cid[i] |= 0x00;
1441                     sd->cid[i] &= sd->data[i];
1442                 }
1443             /* Bzzzzzzztt .... Operation complete.  */
1444             sd->state = sd_transfer_state;
1445         }
1446         break;
1447
1448     case 27:    /* CMD27:  PROGRAM_CSD */
1449         sd->data[sd->data_offset ++] = value;
1450         if (sd->data_offset >= sizeof(sd->csd)) {
1451             /* TODO: Check CRC before committing */
1452             sd->state = sd_programming_state;
1453             for (i = 0; i < sizeof(sd->csd); i ++)
1454                 if ((sd->csd[i] | sd_csd_rw_mask[i]) !=
1455                     (sd->data[i] | sd_csd_rw_mask[i]))
1456                     sd->card_status |= CID_CSD_OVERWRITE;
1457
1458             /* Copy flag (OTP) & Permanent write protect */
1459             if (sd->csd[14] & ~sd->data[14] & 0x60)
1460                 sd->card_status |= CID_CSD_OVERWRITE;
1461
1462             if (!(sd->card_status & CID_CSD_OVERWRITE))
1463                 for (i = 0; i < sizeof(sd->csd); i ++) {
1464                     sd->csd[i] |= sd_csd_rw_mask[i];
1465                     sd->csd[i] &= sd->data[i];
1466                 }
1467             /* Bzzzzzzztt .... Operation complete.  */
1468             sd->state = sd_transfer_state;
1469         }
1470         break;
1471
1472     case 42:    /* CMD42:  LOCK_UNLOCK */
1473         sd->data[sd->data_offset ++] = value;
1474         if (sd->data_offset >= sd->blk_len) {
1475             /* TODO: Check CRC before committing */
1476             sd->state = sd_programming_state;
1477             sd_lock_command(sd);
1478             /* Bzzzzzzztt .... Operation complete.  */
1479             sd->state = sd_transfer_state;
1480         }
1481         break;
1482
1483     case 56:    /* CMD56:  GEN_CMD */
1484         sd->data[sd->data_offset ++] = value;
1485         if (sd->data_offset >= sd->blk_len) {
1486             APP_WRITE_BLOCK(sd->data_start, sd->data_offset);
1487             sd->state = sd_transfer_state;
1488         }
1489         break;
1490
1491     default:
1492         printf("sd_write_data: unknown command\n");
1493         break;
1494     }
1495 }
1496
1497 uint8_t sd_read_data(SDState *sd)
1498 {
1499     /* TODO: Append CRCs */
1500     uint8_t ret;
1501
1502     if (!sd->bdrv || !bdrv_is_inserted(sd->bdrv))
1503         return 0x00;
1504
1505     if (sd->state != sd_sendingdata_state) {
1506         printf("sd_read_data: not in Sending-Data state\n");
1507         return 0x00;
1508     }
1509
1510     if (sd->card_status & (ADDRESS_ERROR | WP_VIOLATION))
1511         return 0x00;
1512
1513     switch (sd->current_cmd) {
1514     case 6:     /* CMD6:   SWITCH_FUNCTION */
1515         ret = sd->data[sd->data_offset ++];
1516
1517         if (sd->data_offset >= 64)
1518             sd->state = sd_transfer_state;
1519         break;
1520
1521     case 9:     /* CMD9:   SEND_CSD */
1522     case 10:    /* CMD10:  SEND_CID */
1523         ret = sd->data[sd->data_offset ++];
1524
1525         if (sd->data_offset >= 16)
1526             sd->state = sd_transfer_state;
1527         break;
1528
1529     case 11:    /* CMD11:  READ_DAT_UNTIL_STOP */
1530         if (sd->data_offset == 0)
1531             BLK_READ_BLOCK(sd->data_start, sd->blk_len);
1532         ret = sd->data[sd->data_offset ++];
1533
1534         if (sd->data_offset >= sd->blk_len) {
1535             sd->data_start += sd->blk_len;
1536             sd->data_offset = 0;
1537             if (sd->data_start + sd->blk_len > sd->size) {
1538                 sd->card_status |= ADDRESS_ERROR;
1539                 break;
1540             }
1541         }
1542         break;
1543
1544     case 13:    /* ACMD13: SD_STATUS */
1545         ret = sd->sd_status[sd->data_offset ++];
1546
1547         if (sd->data_offset >= sizeof(sd->sd_status))
1548             sd->state = sd_transfer_state;
1549         break;
1550
1551     case 17:    /* CMD17:  READ_SINGLE_BLOCK */
1552         if (sd->data_offset == 0)
1553             BLK_READ_BLOCK(sd->data_start, sd->blk_len);
1554         ret = sd->data[sd->data_offset ++];
1555
1556         if (sd->data_offset >= sd->blk_len)
1557             sd->state = sd_transfer_state;
1558         break;
1559
1560     case 18:    /* CMD18:  READ_MULTIPLE_BLOCK */
1561         if (sd->data_offset == 0)
1562             BLK_READ_BLOCK(sd->data_start, sd->blk_len);
1563         ret = sd->data[sd->data_offset ++];
1564
1565         if (sd->data_offset >= sd->blk_len) {
1566             sd->data_start += sd->blk_len;
1567             sd->data_offset = 0;
1568             if (sd->data_start + sd->blk_len > sd->size) {
1569                 sd->card_status |= ADDRESS_ERROR;
1570                 break;
1571             }
1572         }
1573         break;
1574
1575     case 22:    /* ACMD22: SEND_NUM_WR_BLOCKS */
1576         ret = sd->data[sd->data_offset ++];
1577
1578         if (sd->data_offset >= 4)
1579             sd->state = sd_transfer_state;
1580         break;
1581
1582     case 30:    /* CMD30:  SEND_WRITE_PROT */
1583         ret = sd->data[sd->data_offset ++];
1584
1585         if (sd->data_offset >= 4)
1586             sd->state = sd_transfer_state;
1587         break;
1588
1589     case 51:    /* ACMD51: SEND_SCR */
1590         ret = sd->scr[sd->data_offset ++];
1591
1592         if (sd->data_offset >= sizeof(sd->scr))
1593             sd->state = sd_transfer_state;
1594         break;
1595
1596     case 56:    /* CMD56:  GEN_CMD */
1597         if (sd->data_offset == 0)
1598             APP_READ_BLOCK(sd->data_start, sd->blk_len);
1599         ret = sd->data[sd->data_offset ++];
1600
1601         if (sd->data_offset >= sd->blk_len)
1602             sd->state = sd_transfer_state;
1603         break;
1604
1605     default:
1606         printf("sd_read_data: unknown command\n");
1607         return 0x00;
1608     }
1609
1610     return ret;
1611 }
1612
1613 int sd_data_ready(SDState *sd)
1614 {
1615     return sd->state == sd_sendingdata_state;
1616 }
This page took 0.111098 seconds and 4 git commands to generate.