Generate PCI hotplug interrupt only if corespondent EN bit is set. (Gleb Natapov)
[qemu] / 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  <balrog@zabor.org>
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 { fprintf(stderr, "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     int enable;
104 };
105
106 static void sd_set_status(SDState *sd)
107 {
108     switch (sd->state) {
109     case sd_inactive_state:
110         sd->mode = sd_inactive;
111         break;
112
113     case sd_idle_state:
114     case sd_ready_state:
115     case sd_identification_state:
116         sd->mode = sd_card_identification_mode;
117         break;
118
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;
126         break;
127     }
128
129     sd->card_status &= ~CURRENT_STATE;
130     sd->card_status |= sd->state << 9;
131 }
132
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,
142 };
143
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,
153 };
154
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,
160 };
161
162 static uint8_t sd_crc7(void *message, size_t width)
163 {
164     int i, bit;
165     uint8_t shift_reg = 0x00;
166     uint8_t *msg = (uint8_t *) message;
167
168     for (i = 0; i < width; i ++, msg ++)
169         for (bit = 7; bit >= 0; bit --) {
170             shift_reg <<= 1;
171             if ((shift_reg >> 7) ^ ((*msg >> bit) & 1))
172                 shift_reg ^= 0x89;
173         }
174
175     return shift_reg;
176 }
177
178 static uint16_t sd_crc16(void *message, size_t width)
179 {
180     int i, bit;
181     uint16_t shift_reg = 0x0000;
182     uint16_t *msg = (uint16_t *) message;
183     width <<= 1;
184
185     for (i = 0; i < width; i ++, msg ++)
186         for (bit = 15; bit >= 0; bit --) {
187             shift_reg <<= 1;
188             if ((shift_reg >> 15) ^ ((*msg >> bit) & 1))
189                 shift_reg ^= 0x1011;
190         }
191
192     return shift_reg;
193 }
194
195 static void sd_set_ocr(SDState *sd)
196 {
197     /* All voltages OK, card power-up OK, Standard Capacity SD Memory Card */
198     sd->ocr = 0x80ffff80;
199 }
200
201 static void sd_set_scr(SDState *sd)
202 {
203     sd->scr[0] = 0x00;          /* SCR Structure */
204     sd->scr[1] = 0x2f;          /* SD Security Support */
205     sd->scr[2] = 0x00;
206     sd->scr[3] = 0x00;
207     sd->scr[4] = 0x00;
208     sd->scr[5] = 0x00;
209     sd->scr[6] = 0x00;
210     sd->scr[7] = 0x00;
211 }
212
213 #define MID     0xaa
214 #define OID     "XY"
215 #define PNM     "QEMU!"
216 #define PRV     0x01
217 #define MDT_YR  2006
218 #define MDT_MON 2
219
220 static void sd_set_cid(SDState *sd)
221 {
222     sd->cid[0] = MID;           /* Fake card manufacturer ID (MID) */
223     sd->cid[1] = OID[0];        /* OEM/Application ID (OID) */
224     sd->cid[2] = OID[1];
225     sd->cid[3] = PNM[0];        /* Fake product name (PNM) */
226     sd->cid[4] = PNM[1];
227     sd->cid[5] = PNM[2];
228     sd->cid[6] = PNM[3];
229     sd->cid[7] = PNM[4];
230     sd->cid[8] = PRV;           /* Fake product revision (PRV) */
231     sd->cid[9] = 0xde;          /* Fake serial number (PSN) */
232     sd->cid[10] = 0xad;
233     sd->cid[11] = 0xbe;
234     sd->cid[12] = 0xef;
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;
239 }
240
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))
248
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,
252 };
253
254 static void sd_set_csd(SDState *sd, uint32_t size)
255 {
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;
259
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 */
266         HWBLOCK_SHIFT;
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;
285 }
286
287 static void sd_set_rca(SDState *sd)
288 {
289     sd->rca += 0x4567;
290 }
291
292 #define CARD_STATUS_A   0x02004100
293 #define CARD_STATUS_B   0x00c01e00
294 #define CARD_STATUS_C   0xfd39a028
295
296 static void sd_set_cardstatus(SDState *sd)
297 {
298     sd->card_status = 0x00000100;
299 }
300
301 static void sd_set_sdstatus(SDState *sd)
302 {
303     memset(sd->sd_status, 0, 64);
304 }
305
306 static int sd_req_crc_validate(struct sd_request_s *req)
307 {
308     uint8_t buffer[5];
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;
314     return 0;
315     return sd_crc7(buffer, 5) != req->crc;      /* TODO */
316 }
317
318 static void sd_response_r1_make(SDState *sd,
319                                 uint8_t *response, uint32_t last_status)
320 {
321     uint32_t mask = CARD_STATUS_B ^ ILLEGAL_COMMAND;
322     uint32_t status;
323
324     status = (sd->card_status & ~mask) | (last_status & mask);
325     sd->card_status &= ~CARD_STATUS_C | APP_CMD;
326
327     response[0] = (status >> 24) & 0xff;
328     response[1] = (status >> 16) & 0xff;
329     response[2] = (status >> 8) & 0xff;
330     response[3] = (status >> 0) & 0xff;
331 }
332
333 static void sd_response_r3_make(SDState *sd, uint8_t *response)
334 {
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;
339 }
340
341 static void sd_response_r6_make(SDState *sd, uint8_t *response)
342 {
343     uint16_t arg;
344     uint16_t status;
345
346     arg = sd->rca;
347     status = ((sd->card_status >> 8) & 0xc000) |
348              ((sd->card_status >> 6) & 0x2000) |
349               (sd->card_status & 0x1fff);
350
351     response[0] = (arg >> 8) & 0xff;
352     response[1] = arg & 0xff;
353     response[2] = (status >> 8) & 0xff;
354     response[3] = status & 0xff;
355 }
356
357 static void sd_response_r7_make(SDState *sd, uint8_t *response)
358 {
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;
363 }
364
365 static void sd_reset(SDState *sd, BlockDriverState *bdrv)
366 {
367     uint32_t size;
368     uint64_t sect;
369
370     bdrv_get_geometry(bdrv, &sect);
371     sect <<= 9;
372
373     if (sect > 0x40000000)
374         size = 0x40000000;      /* 1 gig */
375     else
376         size = sect + 1;
377
378     sect = (size >> (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT)) + 1;
379
380     sd->state = sd_idle_state;
381     sd->rca = 0x0000;
382     sd_set_ocr(sd);
383     sd_set_scr(sd);
384     sd_set_cid(sd);
385     sd_set_csd(sd, size);
386     sd_set_cardstatus(sd);
387     sd_set_sdstatus(sd);
388
389     sd->bdrv = bdrv;
390
391     if (sd->wp_groups)
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);
396     sd->erase_start = 0;
397     sd->erase_end = 0;
398     sd->size = size;
399     sd->blk_len = 0x200;
400     sd->pwd_len = 0;
401 }
402
403 static void sd_cardchange(void *opaque)
404 {
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);
410     }
411 }
412
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
416    is asserted.  */
417 SDState *sd_init(BlockDriverState *bs, int is_spi)
418 {
419     SDState *sd;
420
421     sd = (SDState *) qemu_mallocz(sizeof(SDState));
422     sd->buf = qemu_memalign(512, 512);
423     sd->spi = is_spi;
424     sd->enable = 1;
425     sd_reset(sd, bs);
426     bdrv_set_change_cb(sd->bdrv, sd_cardchange, sd);
427     return sd;
428 }
429
430 void sd_set_cb(SDState *sd, qemu_irq readonly, qemu_irq insert)
431 {
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));
436 }
437
438 static void sd_erase(SDState *sd)
439 {
440     int i, start, end;
441     if (!sd->erase_start || !sd->erase_end) {
442         sd->card_status |= ERASE_SEQ_ERROR;
443         return;
444     }
445
446     start = sd->erase_start >>
447             (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT);
448     end = sd->erase_end >>
449             (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT);
450     sd->erase_start = 0;
451     sd->erase_end = 0;
452     sd->csd[14] |= 0x40;
453
454     for (i = start; i <= end; i ++)
455         if (sd->wp_groups[i])
456             sd->card_status |= WP_ERASE_SKIP;
457 }
458
459 static uint32_t sd_wpbits(SDState *sd, uint32_t addr)
460 {
461     uint32_t i, wpnum;
462     uint32_t ret = 0;
463
464     wpnum = addr >> (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT);
465
466     for (i = 0; i < 32; i ++, wpnum ++, addr += WPGROUP_SIZE)
467         if (addr < sd->size && sd->wp_groups[wpnum])
468             ret |= (1 << i);
469
470     return ret;
471 }
472
473 static void sd_function_switch(SDState *sd, uint32_t arg)
474 {
475     int i, mode, new_func, crc;
476     mode = !!(arg & 0x80000000);
477
478     sd->data[0] = 0x00;         /* Maximum current consumption */
479     sd->data[1] = 0x01;
480     sd->data[2] = 0x80;         /* Supported group 6 functions */
481     sd->data[3] = 0x01;
482     sd->data[4] = 0x80;         /* Supported group 5 functions */
483     sd->data[5] = 0x01;
484     sd->data[6] = 0x80;         /* Supported group 4 functions */
485     sd->data[7] = 0x01;
486     sd->data[8] = 0x80;         /* Supported group 3 functions */
487     sd->data[9] = 0x01;
488     sd->data[10] = 0x80;        /* Supported group 2 functions */
489     sd->data[11] = 0x43;
490     sd->data[12] = 0x80;        /* Supported group 1 functions */
491     sd->data[13] = 0x03;
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);
497     }
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;
502 }
503
504 static inline int sd_wp_addr(SDState *sd, uint32_t addr)
505 {
506     return sd->wp_groups[addr >>
507             (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT)];
508 }
509
510 static void sd_lock_command(SDState *sd)
511 {
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;
517
518     if (sd->blk_len > 1)
519         pwd_len = sd->data[1];
520     else
521         pwd_len = 0;
522
523     if (erase) {
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;
528             return;
529         }
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;
534         sd->pwd_len = 0;
535         /* Erasing the entire card here! */
536         fprintf(stderr, "SD: Card force-erased by CMD42\n");
537         return;
538     }
539
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;
544         return;
545     }
546
547     if (sd->pwd_len && memcmp(sd->pwd, sd->data + 2, sd->pwd_len)) {
548         sd->card_status |= LOCK_UNLOCK_FAILED;
549         return;
550     }
551
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;
560         return;
561     }
562
563     if (set_pwd) {
564         memcpy(sd->pwd, sd->data + 2 + sd->pwd_len, pwd_len);
565         sd->pwd_len = pwd_len;
566     }
567
568     if (clr_pwd) {
569         sd->pwd_len = 0;
570     }
571
572     if (lock)
573         sd->card_status |= CARD_IS_LOCKED;
574     else
575         sd->card_status &= ~CARD_IS_LOCKED;
576 }
577
578 static sd_rsp_type_t sd_normal_command(SDState *sd,
579                                        struct sd_request_s req)
580 {
581     uint32_t rca = 0x0000;
582
583     if (sd_cmd_type[req.cmd] == sd_ac || sd_cmd_type[req.cmd] == sd_adtc)
584         rca = req.arg >> 16;
585
586     DPRINTF("CMD%d 0x%08x state %d\n", req.cmd, req.arg, sd->state);
587     switch (req.cmd) {
588     /* Basic commands (Class 0 and Class 1) */
589     case 0:     /* CMD0:   GO_IDLE_STATE */
590         switch (sd->state) {
591         case sd_inactive_state:
592             return sd->spi ? sd_r1 : sd_r0;
593
594         default:
595             sd->state = sd_idle_state;
596             sd_reset(sd, sd->bdrv);
597             return sd->spi ? sd_r1 : sd_r0;
598         }
599         break;
600
601     case 1:     /* CMD1:   SEND_OP_CMD */
602         if (!sd->spi)
603             goto bad_cmd;
604
605         sd->state = sd_transfer_state;
606         return sd_r1;
607
608     case 2:     /* CMD2:   ALL_SEND_CID */
609         if (sd->spi)
610             goto bad_cmd;
611         switch (sd->state) {
612         case sd_ready_state:
613             sd->state = sd_identification_state;
614             return sd_r2_i;
615
616         default:
617             break;
618         }
619         break;
620
621     case 3:     /* CMD3:   SEND_RELATIVE_ADDR */
622         if (sd->spi)
623             goto bad_cmd;
624         switch (sd->state) {
625         case sd_identification_state:
626         case sd_standby_state:
627             sd->state = sd_standby_state;
628             sd_set_rca(sd);
629             return sd_r6;
630
631         default:
632             break;
633         }
634         break;
635
636     case 4:     /* CMD4:   SEND_DSR */
637         if (sd->spi)
638             goto bad_cmd;
639         switch (sd->state) {
640         case sd_standby_state:
641             break;
642
643         default:
644             break;
645         }
646         break;
647
648     case 6:     /* CMD6:   SWITCH_FUNCTION */
649         if (sd->spi)
650             goto bad_cmd;
651         switch (sd->mode) {
652         case sd_data_transfer_mode:
653             sd_function_switch(sd, req.arg);
654             sd->state = sd_sendingdata_state;
655             sd->data_start = 0;
656             sd->data_offset = 0;
657             return sd_r1;
658
659         default:
660             break;
661         }
662         break;
663
664     case 7:     /* CMD7:   SELECT/DESELECT_CARD */
665         if (sd->spi)
666             goto bad_cmd;
667         switch (sd->state) {
668         case sd_standby_state:
669             if (sd->rca != rca)
670                 return sd_r0;
671
672             sd->state = sd_transfer_state;
673             return sd_r1b;
674
675         case sd_transfer_state:
676         case sd_sendingdata_state:
677             if (sd->rca == rca)
678                 break;
679
680             sd->state = sd_standby_state;
681             return sd_r1b;
682
683         case sd_disconnect_state:
684             if (sd->rca != rca)
685                 return sd_r0;
686
687             sd->state = sd_programming_state;
688             return sd_r1b;
689
690         case sd_programming_state:
691             if (sd->rca == rca)
692                 break;
693
694             sd->state = sd_disconnect_state;
695             return sd_r1b;
696
697         default:
698             break;
699         }
700         break;
701
702     case 8:     /* CMD8:   SEND_IF_COND */
703         /* Physical Layer Specification Version 2.00 command */
704         switch (sd->state) {
705         case sd_idle_state:
706             sd->vhs = 0;
707
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;
711
712             /* Accept.  */
713             sd->vhs = req.arg;
714             return sd_r7;
715
716         default:
717             break;
718         }
719         break;
720
721     case 9:     /* CMD9:   SEND_CSD */
722         switch (sd->state) {
723         case sd_standby_state:
724             if (sd->rca != rca)
725                 return sd_r0;
726
727             return sd_r2_s;
728
729         case sd_transfer_state:
730             if (!sd->spi)
731                 break;
732             sd->state = sd_sendingdata_state;
733             memcpy(sd->data, sd->csd, 16);
734             sd->data_start = req.arg;
735             sd->data_offset = 0;
736             return sd_r1;
737
738         default:
739             break;
740         }
741         break;
742
743     case 10:    /* CMD10:  SEND_CID */
744         switch (sd->state) {
745         case sd_standby_state:
746             if (sd->rca != rca)
747                 return sd_r0;
748
749             return sd_r2_i;
750
751         case sd_transfer_state:
752             if (!sd->spi)
753                 break;
754             sd->state = sd_sendingdata_state;
755             memcpy(sd->data, sd->cid, 16);
756             sd->data_start = req.arg;
757             sd->data_offset = 0;
758             return sd_r1;
759
760         default:
761             break;
762         }
763         break;
764
765     case 11:    /* CMD11:  READ_DAT_UNTIL_STOP */
766         if (sd->spi)
767             goto bad_cmd;
768         switch (sd->state) {
769         case sd_transfer_state:
770             sd->state = sd_sendingdata_state;
771             sd->data_start = req.arg;
772             sd->data_offset = 0;
773
774             if (sd->data_start + sd->blk_len > sd->size)
775                 sd->card_status |= ADDRESS_ERROR;
776             return sd_r0;
777
778         default:
779             break;
780         }
781         break;
782
783     case 12:    /* CMD12:  STOP_TRANSMISSION */
784         switch (sd->state) {
785         case sd_sendingdata_state:
786             sd->state = sd_transfer_state;
787             return sd_r1b;
788
789         case sd_receivingdata_state:
790             sd->state = sd_programming_state;
791             /* Bzzzzzzztt .... Operation complete.  */
792             sd->state = sd_transfer_state;
793             return sd_r1b;
794
795         default:
796             break;
797         }
798         break;
799
800     case 13:    /* CMD13:  SEND_STATUS */
801         switch (sd->mode) {
802         case sd_data_transfer_mode:
803             if (sd->rca != rca)
804                 return sd_r0;
805
806             return sd_r1;
807
808         default:
809             break;
810         }
811         break;
812
813     case 15:    /* CMD15:  GO_INACTIVE_STATE */
814         if (sd->spi)
815             goto bad_cmd;
816         switch (sd->mode) {
817         case sd_data_transfer_mode:
818             if (sd->rca != rca)
819                 return sd_r0;
820
821             sd->state = sd_inactive_state;
822             return sd_r0;
823
824         default:
825             break;
826         }
827         break;
828
829     /* Block read commands (Classs 2) */
830     case 16:    /* CMD16:  SET_BLOCKLEN */
831         switch (sd->state) {
832         case sd_transfer_state:
833             if (req.arg > (1 << HWBLOCK_SHIFT))
834                 sd->card_status |= BLOCK_LEN_ERROR;
835             else
836                 sd->blk_len = req.arg;
837
838             return sd_r1;
839
840         default:
841             break;
842         }
843         break;
844
845     case 17:    /* CMD17:  READ_SINGLE_BLOCK */
846         switch (sd->state) {
847         case sd_transfer_state:
848             sd->state = sd_sendingdata_state;
849             sd->data_start = req.arg;
850             sd->data_offset = 0;
851
852             if (sd->data_start + sd->blk_len > sd->size)
853                 sd->card_status |= ADDRESS_ERROR;
854             return sd_r1;
855
856         default:
857             break;
858         }
859         break;
860
861     case 18:    /* CMD18:  READ_MULTIPLE_BLOCK */
862         switch (sd->state) {
863         case sd_transfer_state:
864             sd->state = sd_sendingdata_state;
865             sd->data_start = req.arg;
866             sd->data_offset = 0;
867
868             if (sd->data_start + sd->blk_len > sd->size)
869                 sd->card_status |= ADDRESS_ERROR;
870             return sd_r1;
871
872         default:
873             break;
874         }
875         break;
876
877     /* Block write commands (Class 4) */
878     case 24:    /* CMD24:  WRITE_SINGLE_BLOCK */
879         if (sd->spi)
880             goto unimplemented_cmd;
881         switch (sd->state) {
882         case sd_transfer_state:
883             /* Writing in SPI mode not implemented.  */
884             if (sd->spi)
885                 break;
886             sd->state = sd_receivingdata_state;
887             sd->data_start = req.arg;
888             sd->data_offset = 0;
889             sd->blk_written = 0;
890
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;
897             return sd_r1;
898
899         default:
900             break;
901         }
902         break;
903
904     case 25:    /* CMD25:  WRITE_MULTIPLE_BLOCK */
905         if (sd->spi)
906             goto unimplemented_cmd;
907         switch (sd->state) {
908         case sd_transfer_state:
909             /* Writing in SPI mode not implemented.  */
910             if (sd->spi)
911                 break;
912             sd->state = sd_receivingdata_state;
913             sd->data_start = req.arg;
914             sd->data_offset = 0;
915             sd->blk_written = 0;
916
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;
923             return sd_r1;
924
925         default:
926             break;
927         }
928         break;
929
930     case 26:    /* CMD26:  PROGRAM_CID */
931         if (sd->spi)
932             goto bad_cmd;
933         switch (sd->state) {
934         case sd_transfer_state:
935             sd->state = sd_receivingdata_state;
936             sd->data_start = 0;
937             sd->data_offset = 0;
938             return sd_r1;
939
940         default:
941             break;
942         }
943         break;
944
945     case 27:    /* CMD27:  PROGRAM_CSD */
946         if (sd->spi)
947             goto unimplemented_cmd;
948         switch (sd->state) {
949         case sd_transfer_state:
950             sd->state = sd_receivingdata_state;
951             sd->data_start = 0;
952             sd->data_offset = 0;
953             return sd_r1;
954
955         default:
956             break;
957         }
958         break;
959
960     /* Write protection (Class 6) */
961     case 28:    /* CMD28:  SET_WRITE_PROT */
962         switch (sd->state) {
963         case sd_transfer_state:
964             if (req.arg >= sd->size) {
965                 sd->card_status = ADDRESS_ERROR;
966                 return sd_r1b;
967             }
968
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;
974             return sd_r1b;
975
976         default:
977             break;
978         }
979         break;
980
981     case 29:    /* CMD29:  CLR_WRITE_PROT */
982         switch (sd->state) {
983         case sd_transfer_state:
984             if (req.arg >= sd->size) {
985                 sd->card_status = ADDRESS_ERROR;
986                 return sd_r1b;
987             }
988
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;
994             return sd_r1b;
995
996         default:
997             break;
998         }
999         break;
1000
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;
1008             return sd_r1b;
1009
1010         default:
1011             break;
1012         }
1013         break;
1014
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;
1020             return sd_r1;
1021
1022         default:
1023             break;
1024         }
1025         break;
1026
1027     case 33:    /* CMD33:  ERASE_WR_BLK_END */
1028         switch (sd->state) {
1029         case sd_transfer_state:
1030             sd->erase_end = req.arg;
1031             return sd_r1;
1032
1033         default:
1034             break;
1035         }
1036         break;
1037
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;
1043                 return sd_r1b;
1044             }
1045
1046             sd->state = sd_programming_state;
1047             sd_erase(sd);
1048             /* Bzzzzzzztt .... Operation complete.  */
1049             sd->state = sd_transfer_state;
1050             return sd_r1b;
1051
1052         default:
1053             break;
1054         }
1055         break;
1056
1057     /* Lock card commands (Class 7) */
1058     case 42:    /* CMD42:  LOCK_UNLOCK */
1059         if (sd->spi)
1060             goto unimplemented_cmd;
1061         switch (sd->state) {
1062         case sd_transfer_state:
1063             sd->state = sd_receivingdata_state;
1064             sd->data_start = 0;
1065             sd->data_offset = 0;
1066             return sd_r1;
1067
1068         default:
1069             break;
1070         }
1071         break;
1072
1073     /* Application specific commands (Class 8) */
1074     case 55:    /* CMD55:  APP_CMD */
1075         if (sd->rca != rca)
1076             return sd_r0;
1077
1078         sd->card_status |= APP_CMD;
1079         return sd_r1;
1080
1081     case 56:    /* CMD56:  GEN_CMD */
1082         fprintf(stderr, "SD: GEN_CMD 0x%08x\n", req.arg);
1083
1084         switch (sd->state) {
1085         case sd_transfer_state:
1086             sd->data_offset = 0;
1087             if (req.arg & 1)
1088                 sd->state = sd_sendingdata_state;
1089             else
1090                 sd->state = sd_receivingdata_state;
1091             return sd_r1;
1092
1093         default:
1094             break;
1095         }
1096         break;
1097
1098     default:
1099     bad_cmd:
1100         sd->card_status |= ILLEGAL_COMMAND;
1101
1102         fprintf(stderr, "SD: Unknown CMD%i\n", req.cmd);
1103         return sd_r0;
1104
1105     unimplemented_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);
1109         return sd_r0;
1110     }
1111
1112     sd->card_status |= ILLEGAL_COMMAND;
1113     fprintf(stderr, "SD: CMD%i in a wrong state\n", req.cmd);
1114     return sd_r0;
1115 }
1116
1117 static sd_rsp_type_t sd_app_command(SDState *sd,
1118                                     struct sd_request_s req) {
1119     uint32_t rca;
1120
1121     if (sd_cmd_type[req.cmd] == sd_ac || sd_cmd_type[req.cmd] == sd_adtc)
1122         rca = req.arg >> 16;
1123
1124     DPRINTF("ACMD%d 0x%08x\n", req.cmd, req.arg);
1125     switch (req.cmd) {
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;
1131             return sd_r1;
1132
1133         default:
1134             break;
1135         }
1136         break;
1137
1138     case 13:    /* ACMD13: SD_STATUS */
1139         switch (sd->state) {
1140         case sd_transfer_state:
1141             sd->data_start = 0;
1142             sd->data_offset = 0;
1143             return sd_r1;
1144
1145         default:
1146             break;
1147         }
1148         break;
1149
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;
1154
1155             sd->data_start = 0;
1156             sd->data_offset = 0;
1157             return sd_r1;
1158
1159         default:
1160             break;
1161         }
1162         break;
1163
1164     case 23:    /* ACMD23: SET_WR_BLK_ERASE_COUNT */
1165         switch (sd->state) {
1166         case sd_transfer_state:
1167             return sd_r1;
1168
1169         default:
1170             break;
1171         }
1172         break;
1173
1174     case 41:    /* ACMD41: SD_APP_OP_COND */
1175         if (sd->spi) {
1176             /* SEND_OP_CMD */
1177             sd->state = sd_transfer_state;
1178             return sd_r1;
1179         }
1180         switch (sd->state) {
1181         case sd_idle_state:
1182             /* We accept any voltage.  10000 V is nothing.  */
1183             if (req.arg)
1184                 sd->state = sd_ready_state;
1185
1186             return sd_r3;
1187
1188         default:
1189             break;
1190         }
1191         break;
1192
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.  */
1197             return sd_r1;
1198
1199         default:
1200             break;
1201         }
1202         break;
1203
1204     case 51:    /* ACMD51: SEND_SCR */
1205         switch (sd->state) {
1206         case sd_transfer_state:
1207             sd->state = sd_sendingdata_state;
1208             sd->data_start = 0;
1209             sd->data_offset = 0;
1210             return sd_r1;
1211
1212         default:
1213             break;
1214         }
1215         break;
1216
1217     default:
1218         /* Fall back to standard commands.  */
1219         sd->card_status &= ~APP_CMD;
1220         return sd_normal_command(sd, req);
1221     }
1222
1223     fprintf(stderr, "SD: ACMD%i in a wrong state\n", req.cmd);
1224     return sd_r0;
1225 }
1226
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;
1231     int rsplen;
1232
1233     if (!bdrv_is_inserted(sd->bdrv) || !sd->enable) {
1234         return 0;
1235     }
1236
1237     if (sd_req_crc_validate(req)) {
1238         sd->card_status &= ~COM_CRC_ERROR;
1239         return 0;
1240     }
1241
1242     sd->card_status &= ~CARD_STATUS_B;
1243     sd_set_status(sd);
1244
1245     if (last_status & CARD_IS_LOCKED)
1246         if (((last_status & APP_CMD) &&
1247                                  req->cmd == 41) ||
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");
1254             return 0;
1255         }
1256
1257     if (last_status & APP_CMD) {
1258         rtype = sd_app_command(sd, *req);
1259         sd->card_status &= ~APP_CMD;
1260     } else
1261         rtype = sd_normal_command(sd, *req);
1262
1263     sd->current_cmd = req->cmd;
1264
1265     switch (rtype) {
1266     case sd_r1:
1267     case sd_r1b:
1268         sd_response_r1_make(sd, response, last_status);
1269         rsplen = 4;
1270         break;
1271
1272     case sd_r2_i:
1273         memcpy(response, sd->cid, sizeof(sd->cid));
1274         rsplen = 16;
1275         break;
1276
1277     case sd_r2_s:
1278         memcpy(response, sd->csd, sizeof(sd->csd));
1279         rsplen = 16;
1280         break;
1281
1282     case sd_r3:
1283         sd_response_r3_make(sd, response);
1284         rsplen = 4;
1285         break;
1286
1287     case sd_r6:
1288         sd_response_r6_make(sd, response);
1289         rsplen = 4;
1290         break;
1291
1292     case sd_r7:
1293         sd_response_r7_make(sd, response);
1294         rsplen = 4;
1295         break;
1296
1297     case sd_r0:
1298     default:
1299         rsplen = 0;
1300         break;
1301     }
1302
1303     if (sd->card_status & ILLEGAL_COMMAND)
1304         rsplen = 0;
1305
1306 #ifdef DEBUG_SD
1307     if (rsplen) {
1308         int i;
1309         DPRINTF("Response:");
1310         for (i = 0; i < rsplen; i++)
1311             printf(" %02x", response[i]);
1312         printf(" state %d\n", sd->state);
1313     } else {
1314         DPRINTF("No response %d\n", sd->state);
1315     }
1316 #endif
1317
1318     return rsplen;
1319 }
1320
1321 /* No real need for 64 bit addresses here */
1322 static void sd_blk_read(SDState *sd, uint32_t addr, uint32_t len)
1323 {
1324     uint32_t end = addr + len;
1325
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");
1328         return;
1329     }
1330
1331     if (end > (addr & ~511) + 512) {
1332         memcpy(sd->data, sd->buf + (addr & 511), 512 - (addr & 511));
1333
1334         if (bdrv_read(sd->bdrv, end >> 9, sd->buf, 1) == -1) {
1335             fprintf(stderr, "sd_blk_read: read error on host side\n");
1336             return;
1337         }
1338         memcpy(sd->data + 512 - (addr & 511), sd->buf, end & 511);
1339     } else
1340         memcpy(sd->data, sd->buf + (addr & 511), len);
1341 }
1342
1343 static void sd_blk_write(SDState *sd, uint32_t addr, uint32_t len)
1344 {
1345     uint32_t end = addr + len;
1346
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");
1350             return;
1351         }
1352
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");
1357             return;
1358         }
1359
1360         if (bdrv_read(sd->bdrv, end >> 9, sd->buf, 1) == -1) {
1361             fprintf(stderr, "sd_blk_write: read error on host side\n");
1362             return;
1363         }
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");
1367     } else {
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");
1371     }
1372 }
1373
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)
1378
1379 void sd_write_data(SDState *sd, uint8_t value)
1380 {
1381     int i;
1382
1383     if (!sd->bdrv || !bdrv_is_inserted(sd->bdrv) || !sd->enable)
1384         return;
1385
1386     if (sd->state != sd_receivingdata_state) {
1387         fprintf(stderr, "sd_write_data: not in Receiving-Data state\n");
1388         return;
1389     }
1390
1391     if (sd->card_status & (ADDRESS_ERROR | WP_VIOLATION))
1392         return;
1393
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);
1401             sd->blk_written ++;
1402             sd->csd[14] |= 0x40;
1403             /* Bzzzzzzztt .... Operation complete.  */
1404             sd->state = sd_transfer_state;
1405         }
1406         break;
1407
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);
1414             sd->blk_written ++;
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;
1419                 break;
1420             }
1421             if (sd_wp_addr(sd, sd->data_start)) {
1422                 sd->card_status |= WP_VIOLATION;
1423                 break;
1424             }
1425             sd->csd[14] |= 0x40;
1426
1427             /* Bzzzzzzztt .... Operation complete.  */
1428             sd->state = sd_receivingdata_state;
1429         }
1430         break;
1431
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;
1440
1441             if (!(sd->card_status & CID_CSD_OVERWRITE))
1442                 for (i = 0; i < sizeof(sd->cid); i ++) {
1443                     sd->cid[i] |= 0x00;
1444                     sd->cid[i] &= sd->data[i];
1445                 }
1446             /* Bzzzzzzztt .... Operation complete.  */
1447             sd->state = sd_transfer_state;
1448         }
1449         break;
1450
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;
1460
1461             /* Copy flag (OTP) & Permanent write protect */
1462             if (sd->csd[14] & ~sd->data[14] & 0x60)
1463                 sd->card_status |= CID_CSD_OVERWRITE;
1464
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];
1469                 }
1470             /* Bzzzzzzztt .... Operation complete.  */
1471             sd->state = sd_transfer_state;
1472         }
1473         break;
1474
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;
1483         }
1484         break;
1485
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;
1491         }
1492         break;
1493
1494     default:
1495         fprintf(stderr, "sd_write_data: unknown command\n");
1496         break;
1497     }
1498 }
1499
1500 uint8_t sd_read_data(SDState *sd)
1501 {
1502     /* TODO: Append CRCs */
1503     uint8_t ret;
1504
1505     if (!sd->bdrv || !bdrv_is_inserted(sd->bdrv) || !sd->enable)
1506         return 0x00;
1507
1508     if (sd->state != sd_sendingdata_state) {
1509         fprintf(stderr, "sd_read_data: not in Sending-Data state\n");
1510         return 0x00;
1511     }
1512
1513     if (sd->card_status & (ADDRESS_ERROR | WP_VIOLATION))
1514         return 0x00;
1515
1516     switch (sd->current_cmd) {
1517     case 6:     /* CMD6:   SWITCH_FUNCTION */
1518         ret = sd->data[sd->data_offset ++];
1519
1520         if (sd->data_offset >= 64)
1521             sd->state = sd_transfer_state;
1522         break;
1523
1524     case 9:     /* CMD9:   SEND_CSD */
1525     case 10:    /* CMD10:  SEND_CID */
1526         ret = sd->data[sd->data_offset ++];
1527
1528         if (sd->data_offset >= 16)
1529             sd->state = sd_transfer_state;
1530         break;
1531
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 ++];
1536
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;
1542                 break;
1543             }
1544         }
1545         break;
1546
1547     case 13:    /* ACMD13: SD_STATUS */
1548         ret = sd->sd_status[sd->data_offset ++];
1549
1550         if (sd->data_offset >= sizeof(sd->sd_status))
1551             sd->state = sd_transfer_state;
1552         break;
1553
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 ++];
1558
1559         if (sd->data_offset >= sd->blk_len)
1560             sd->state = sd_transfer_state;
1561         break;
1562
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 ++];
1567
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;
1573                 break;
1574             }
1575         }
1576         break;
1577
1578     case 22:    /* ACMD22: SEND_NUM_WR_BLOCKS */
1579         ret = sd->data[sd->data_offset ++];
1580
1581         if (sd->data_offset >= 4)
1582             sd->state = sd_transfer_state;
1583         break;
1584
1585     case 30:    /* CMD30:  SEND_WRITE_PROT */
1586         ret = sd->data[sd->data_offset ++];
1587
1588         if (sd->data_offset >= 4)
1589             sd->state = sd_transfer_state;
1590         break;
1591
1592     case 51:    /* ACMD51: SEND_SCR */
1593         ret = sd->scr[sd->data_offset ++];
1594
1595         if (sd->data_offset >= sizeof(sd->scr))
1596             sd->state = sd_transfer_state;
1597         break;
1598
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 ++];
1603
1604         if (sd->data_offset >= sd->blk_len)
1605             sd->state = sd_transfer_state;
1606         break;
1607
1608     default:
1609         fprintf(stderr, "sd_read_data: unknown command\n");
1610         return 0x00;
1611     }
1612
1613     return ret;
1614 }
1615
1616 int sd_data_ready(SDState *sd)
1617 {
1618     return sd->state == sd_sendingdata_state;
1619 }
1620
1621 void sd_enable(SDState *sd, int enable)
1622 {
1623     sd->enable = enable;
1624 }