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