Statistics
| Branch: | Revision:

root / hw / sd.c @ 5fafdf24

History | View | Annotate | Download (41.1 kB)

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 "sd.h"
33

    
34
//#define DEBUG_SD 1
35

    
36
#ifdef DEBUG_SD
37
#define DPRINTF(fmt, args...) \
38
do { printf("SD: " fmt , ##args); } while (0)
39
#else
40
#define DPRINTF(fmt, args...) do {} while(0)
41
#endif
42

    
43
typedef enum {
44
    sd_r0 = 0,    /* no response */
45
    sd_r1,        /* normal response command */
46
    sd_r2_i,      /* CID register */
47
    sd_r2_s,      /* CSD register */
48
    sd_r3,        /* OCR register */
49
    sd_r6 = 6,    /* Published RCA response */
50
    sd_r1b = -1,
51
} sd_rsp_type_t;
52

    
53
struct SDState {
54
    enum {
55
        sd_inactive,
56
        sd_card_identification_mode,
57
        sd_data_transfer_mode,
58
    } mode;
59
    enum {
60
        sd_inactive_state = -1,
61
        sd_idle_state = 0,
62
        sd_ready_state,
63
        sd_identification_state,
64
        sd_standby_state,
65
        sd_transfer_state,
66
        sd_sendingdata_state,
67
        sd_receivingdata_state,
68
        sd_programming_state,
69
        sd_disconnect_state,
70
    } state;
71
    uint32_t ocr;
72
    uint8_t scr[8];
73
    uint8_t cid[16];
74
    uint8_t csd[16];
75
    uint16_t rca;
76
    uint32_t card_status;
77
    uint8_t sd_status[64];
78
    int wp_switch;
79
    int *wp_groups;
80
    uint32_t size;
81
    int blk_len;
82
    uint32_t erase_start;
83
    uint32_t erase_end;
84
    uint8_t pwd[16];
85
    int pwd_len;
86
    int function_group[6];
87

    
88
    int current_cmd;
89
    int blk_written;
90
    uint32_t data_start;
91
    uint32_t data_offset;
92
    uint8_t data[512];
93
    void (*readonly_cb)(void *, int);
94
    void (*inserted_cb)(void *, int);
95
    void *opaque;
96
    BlockDriverState *bdrv;
97
};
98

    
99
static void sd_set_status(SDState *sd)
100
{
101
    switch (sd->state) {
102
    case sd_inactive_state:
103
        sd->mode = sd_inactive;
104
        break;
105

    
106
    case sd_idle_state:
107
    case sd_ready_state:
108
    case sd_identification_state:
109
        sd->mode = sd_card_identification_mode;
110
        break;
111

    
112
    case sd_standby_state:
113
    case sd_transfer_state:
114
    case sd_sendingdata_state:
115
    case sd_receivingdata_state:
116
    case sd_programming_state:
117
    case sd_disconnect_state:
118
        sd->mode = sd_data_transfer_mode;
119
        break;
120
    }
121

    
122
    sd->card_status &= ~CURRENT_STATE;
123
    sd->card_status |= sd->state << 9;
124
}
125

    
126
const sd_cmd_type_t sd_cmd_type[64] = {
127
    sd_bc,   sd_none, sd_bcr,  sd_bcr,  sd_none, sd_none, sd_none, sd_ac,
128
    sd_none, sd_ac,   sd_ac,   sd_adtc, sd_ac,   sd_ac,   sd_none, sd_ac,
129
    sd_ac,   sd_adtc, sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none,
130
    sd_adtc, sd_adtc, sd_adtc, sd_adtc, sd_ac,   sd_ac,   sd_adtc, sd_none,
131
    sd_ac,   sd_ac,   sd_none, sd_none, sd_none, sd_none, sd_ac,   sd_none,
132
    sd_none, sd_none, sd_bc,   sd_none, sd_none, sd_none, sd_none, sd_none,
133
    sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_ac,
134
    sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none,
135
};
136

    
137
const sd_cmd_type_t sd_acmd_type[64] = {
138
    sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_ac,   sd_none,
139
    sd_none, sd_none, sd_none, sd_none, sd_none, sd_adtc, sd_none, sd_none,
140
    sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_adtc, sd_ac,
141
    sd_none, sd_none, sd_none, 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_none,
143
    sd_none, sd_bcr,  sd_ac,   sd_none, sd_none, sd_none, sd_none, sd_none,
144
    sd_none, sd_none, sd_none, sd_adtc, sd_none, sd_none, sd_none, sd_none,
145
    sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none,
146
};
147

    
148
static const int sd_cmd_class[64] = {
149
    0,  0,  0,  0,  0,  9, 10,  0,  0,  0,  0,  1,  0,  0,  0,  0,
150
    2,  2,  2,  2,  3,  3,  3,  3,  4,  4,  4,  4,  6,  6,  6,  6,
151
    5,  5, 10, 10, 10, 10,  5,  9,  9,  9,  7,  7,  7,  7,  7,  7,
152
    7,  7, 10,  7,  9,  9,  9,  8,  8, 10,  8,  8,  8,  8,  8,  8,
153
};
154

    
155
static uint8_t sd_crc7(void *message, size_t width)
156
{
157
    int i, bit;
158
    uint8_t shift_reg = 0x00;
159
    uint8_t *msg = (uint8_t *) message;
160

    
161
    for (i = 0; i < width; i ++, msg ++)
162
        for (bit = 7; bit >= 0; bit --) {
163
            shift_reg <<= 1;
164
            if ((shift_reg >> 7) ^ ((*msg >> bit) & 1))
165
                shift_reg ^= 0x89;
166
        }
167

    
168
    return shift_reg;
169
}
170

    
171
static uint16_t sd_crc16(void *message, size_t width)
172
{
173
    int i, bit;
174
    uint16_t shift_reg = 0x0000;
175
    uint16_t *msg = (uint16_t *) message;
176
    width <<= 1;
177

    
178
    for (i = 0; i < width; i ++, msg ++)
179
        for (bit = 15; bit >= 0; bit --) {
180
            shift_reg <<= 1;
181
            if ((shift_reg >> 15) ^ ((*msg >> bit) & 1))
182
                shift_reg ^= 0x1011;
183
        }
184

    
185
    return shift_reg;
186
}
187

    
188
static void sd_set_ocr(SDState *sd)
189
{
190
    sd->ocr = 0x80fffff0;
191
}
192

    
193
static void sd_set_scr(SDState *sd)
194
{
195
    sd->scr[0] = 0x00;                /* SCR Structure */
196
    sd->scr[1] = 0x2f;                /* SD Security Support */
197
    sd->scr[2] = 0x00;
198
    sd->scr[3] = 0x00;
199
    sd->scr[4] = 0x00;
200
    sd->scr[5] = 0x00;
201
    sd->scr[6] = 0x00;
202
    sd->scr[7] = 0x00;
203
}
204

    
205
#define MID        0xaa
206
#define OID        "XY"
207
#define PNM        "QEMU!"
208
#define PRV        0x01
209
#define MDT_YR        2006
210
#define MDT_MON        2
211

    
212
static void sd_set_cid(SDState *sd)
213
{
214
    sd->cid[0] = MID;                /* Fake card manufacturer ID (MID) */
215
    sd->cid[1] = OID[0];        /* OEM/Application ID (OID) */
216
    sd->cid[2] = OID[1];
217
    sd->cid[3] = PNM[0];        /* Fake product name (PNM) */
218
    sd->cid[4] = PNM[1];
219
    sd->cid[5] = PNM[2];
220
    sd->cid[6] = PNM[3];
221
    sd->cid[7] = PNM[4];
222
    sd->cid[8] = PRV;                /* Fake product revision (PRV) */
223
    sd->cid[9] = 0xde;                /* Fake serial number (PSN) */
224
    sd->cid[10] = 0xad;
225
    sd->cid[11] = 0xbe;
226
    sd->cid[12] = 0xef;
227
    sd->cid[13] = 0x00 |        /* Manufacture date (MDT) */
228
        ((MDT_YR - 2000) / 10);
229
    sd->cid[14] = ((MDT_YR % 10) << 4) | MDT_MON;
230
    sd->cid[15] = (sd_crc7(sd->cid, 15) << 1) | 1;
231
}
232

    
233
#define HWBLOCK_SHIFT        9                        /* 512 bytes */
234
#define SECTOR_SHIFT        5                        /* 16 kilobytes */
235
#define WPGROUP_SHIFT        7                        /* 2 megs */
236
#define CMULT_SHIFT        9                        /* 512 times HWBLOCK_SIZE */
237
#define BLOCK_SIZE        (1 << (HWBLOCK_SHIFT))
238
#define SECTOR_SIZE        (1 << (HWBLOCK_SHIFT + SECTOR_SHIFT))
239
#define WPGROUP_SIZE        (1 << (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT))
240

    
241
static const uint8_t sd_csd_rw_mask[16] = {
242
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
243
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfe,
244
};
245

    
246
static void sd_set_csd(SDState *sd, uint32_t size)
247
{
248
    uint32_t csize = (size >> (CMULT_SHIFT + HWBLOCK_SHIFT)) - 1;
249
    uint32_t sectsize = (1 << (SECTOR_SHIFT + 1)) - 1;
250
    uint32_t wpsize = (1 << (WPGROUP_SHIFT + 1)) - 1;
251

    
252
    sd->csd[0] = 0x00;                /* CSD structure */
253
    sd->csd[1] = 0x26;                /* Data read access-time-1 */
254
    sd->csd[2] = 0x00;                /* Data read access-time-2 */
255
    sd->csd[3] = 0x5a;                /* Max. data transfer rate */
256
    sd->csd[4] = 0x5f;                /* Card Command Classes */
257
    sd->csd[5] = 0x50 |                /* Max. read data block length */
258
        HWBLOCK_SHIFT;
259
    sd->csd[6] = 0xe0 |                /* Partial block for read allowed */
260
        ((csize >> 10) & 0x03);
261
    sd->csd[7] = 0x00 |                /* Device size */
262
        ((csize >> 2) & 0xff);
263
    sd->csd[8] = 0x3f |                /* Max. read current */
264
        ((csize << 6) & 0xc0);
265
    sd->csd[9] = 0xfc |                /* Max. write current */
266
        ((CMULT_SHIFT - 2) >> 1);
267
    sd->csd[10] = 0x40 |        /* Erase sector size */
268
        (((CMULT_SHIFT - 2) << 7) & 0x80) | (sectsize >> 1);
269
    sd->csd[11] = 0x00 |        /* Write protect group size */
270
        ((sectsize << 7) & 0x80) | wpsize;
271
    sd->csd[12] = 0x90 |        /* Write speed factor */
272
        (HWBLOCK_SHIFT >> 2);
273
    sd->csd[13] = 0x20 |        /* Max. write data block length */
274
        ((HWBLOCK_SHIFT << 6) & 0xc0);
275
    sd->csd[14] = 0x00;                /* File format group */
276
    sd->csd[15] = (sd_crc7(sd->csd, 15) << 1) | 1;
277
}
278

    
279
static void sd_set_rca(SDState *sd)
280
{
281
    sd->rca += 0x4567;
282
}
283

    
284
#define CARD_STATUS_A        0x02004100
285
#define CARD_STATUS_B        0x00c01e00
286
#define CARD_STATUS_C        0xfd39a028
287

    
288
static void sd_set_cardstatus(SDState *sd)
289
{
290
    sd->card_status = 0x00000100;
291
}
292

    
293
static void sd_set_sdstatus(SDState *sd)
294
{
295
    memset(sd->sd_status, 0, 64);
296
}
297

    
298
static int sd_req_crc_validate(struct sd_request_s *req)
299
{
300
    uint8_t buffer[5];
301
    buffer[0] = 0x40 | req->cmd;
302
    buffer[1] = (req->arg >> 24) & 0xff;
303
    buffer[2] = (req->arg >> 16) & 0xff;
304
    buffer[3] = (req->arg >> 8) & 0xff;
305
    buffer[4] = (req->arg >> 0) & 0xff;
306
    return 0;
307
    return sd_crc7(buffer, 5) != req->crc;        /* TODO */
308
}
309

    
310
void sd_response_r1_make(SDState *sd,
311
                         uint8_t *response, uint32_t last_status)
312
{
313
    uint32_t mask = CARD_STATUS_B ^ ILLEGAL_COMMAND;
314
    uint32_t status;
315

    
316
    status = (sd->card_status & ~mask) | (last_status & mask);
317
    sd->card_status &= ~CARD_STATUS_C | APP_CMD;
318

    
319
    response[0] = (status >> 24) & 0xff;
320
    response[1] = (status >> 16) & 0xff;
321
    response[2] = (status >> 8) & 0xff;
322
    response[3] = (status >> 0) & 0xff;
323
}
324

    
325
void sd_response_r3_make(SDState *sd, uint8_t *response)
326
{
327
    response[0] = (sd->ocr >> 24) & 0xff;
328
    response[1] = (sd->ocr >> 16) & 0xff;
329
    response[2] = (sd->ocr >> 8) & 0xff;
330
    response[3] = (sd->ocr >> 0) & 0xff;
331
}
332

    
333
void sd_response_r6_make(SDState *sd, uint8_t *response)
334
{
335
    uint16_t arg;
336
    uint16_t status;
337

    
338
    arg = sd->rca;
339
    status = ((sd->card_status >> 8) & 0xc000) |
340
             ((sd->card_status >> 6) & 0x2000) |
341
              (sd->card_status & 0x1fff);
342

    
343
    response[0] = (arg >> 8) & 0xff;
344
    response[1] = arg & 0xff;
345
    response[2] = (status >> 8) & 0xff;
346
    response[3] = status & 0xff;
347
}
348

    
349
static void sd_reset(SDState *sd, BlockDriverState *bdrv)
350
{
351
    uint32_t size;
352
    uint64_t sect;
353

    
354
    bdrv_get_geometry(bdrv, &sect);
355
    sect <<= 9;
356

    
357
    if (sect > 0x40000000)
358
        size = 0x40000000;        /* 1 gig */
359
    else
360
        size = sect + 1;
361

    
362
    sect = (size >> (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT)) + 1;
363

    
364
    sd->state = sd_idle_state;
365
    sd->rca = 0x0000;
366
    sd_set_ocr(sd);
367
    sd_set_scr(sd);
368
    sd_set_cid(sd);
369
    sd_set_csd(sd, size);
370
    sd_set_cardstatus(sd);
371
    sd_set_sdstatus(sd);
372

    
373
    sd->bdrv = bdrv;
374

    
375
    sd->wp_switch = bdrv_is_read_only(bdrv);
376
    sd->wp_groups = (int *) qemu_mallocz(sizeof(int) * sect);
377
    memset(sd->wp_groups, 0, sizeof(int) * sect);
378
    memset(sd->function_group, 0, sizeof(int) * 6);
379
    sd->erase_start = 0;
380
    sd->erase_end = 0;
381
    sd->size = size;
382
    sd->blk_len = 0x200;
383
    sd->pwd_len = 0;
384
}
385

    
386
static void sd_cardchange(void *opaque)
387
{
388
    SDState *sd = opaque;
389
    if (sd->inserted_cb)
390
        sd->inserted_cb(sd->opaque, bdrv_is_inserted(sd->bdrv));
391
    if (bdrv_is_inserted(sd->bdrv)) {
392
        sd_reset(sd, sd->bdrv);
393
        if (sd->readonly_cb)
394
            sd->readonly_cb(sd->opaque, sd->wp_switch);
395
    }
396
}
397

    
398
SDState *sd_init(BlockDriverState *bs)
399
{
400
    SDState *sd;
401

    
402
    sd = (SDState *) qemu_mallocz(sizeof(SDState));
403
    sd_reset(sd, bs);
404
    return sd;
405
}
406

    
407
void sd_set_cb(SDState *sd, void *opaque,
408
                void (*readonly_cb)(void *, int),
409
                void (*inserted_cb)(void *, int))
410
{
411
    sd->opaque = opaque;
412
    sd->readonly_cb = readonly_cb;
413
    sd->inserted_cb = inserted_cb;
414
    if (sd->readonly_cb)
415
        sd->readonly_cb(sd->opaque, bdrv_is_read_only(sd->bdrv));
416
    if (sd->inserted_cb)
417
        sd->inserted_cb(sd->opaque, bdrv_is_inserted(sd->bdrv));
418
    bdrv_set_change_cb(sd->bdrv, sd_cardchange, sd);
419
}
420

    
421
static void sd_erase(SDState *sd)
422
{
423
    int i, start, end;
424
    if (!sd->erase_start || !sd->erase_end) {
425
        sd->card_status |= ERASE_SEQ_ERROR;
426
        return;
427
    }
428

    
429
    start = sd->erase_start >>
430
            (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT);
431
    end = sd->erase_end >>
432
            (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT);
433
    sd->erase_start = 0;
434
    sd->erase_end = 0;
435
    sd->csd[14] |= 0x40;
436

    
437
    for (i = start; i <= end; i ++)
438
        if (sd->wp_groups[i])
439
            sd->card_status |= WP_ERASE_SKIP;
440
}
441

    
442
static uint32_t sd_wpbits(SDState *sd, uint32_t addr)
443
{
444
    uint32_t i, wpnum;
445
    uint32_t ret = 0;
446

    
447
    wpnum = addr >> (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT);
448

    
449
    for (i = 0; i < 32; i ++, wpnum ++, addr += WPGROUP_SIZE)
450
        if (addr < sd->size && sd->wp_groups[wpnum])
451
            ret |= (1 << i);
452

    
453
    return ret;
454
}
455

    
456
static void sd_function_switch(SDState *sd, uint32_t arg)
457
{
458
    int i, mode, new_func, crc;
459
    mode = !!(arg & 0x80000000);
460

    
461
    sd->data[0] = 0x00;                /* Maximum current consumption */
462
    sd->data[1] = 0x01;
463
    sd->data[2] = 0x80;                /* Supported group 6 functions */
464
    sd->data[3] = 0x01;
465
    sd->data[4] = 0x80;                /* Supported group 5 functions */
466
    sd->data[5] = 0x01;
467
    sd->data[6] = 0x80;                /* Supported group 4 functions */
468
    sd->data[7] = 0x01;
469
    sd->data[8] = 0x80;                /* Supported group 3 functions */
470
    sd->data[9] = 0x01;
471
    sd->data[10] = 0x80;        /* Supported group 2 functions */
472
    sd->data[11] = 0x43;
473
    sd->data[12] = 0x80;        /* Supported group 1 functions */
474
    sd->data[13] = 0x03;
475
    for (i = 0; i < 6; i ++) {
476
        new_func = (arg >> (i * 4)) & 0x0f;
477
        if (mode && new_func != 0x0f)
478
            sd->function_group[i] = new_func;
479
        sd->data[14 + (i >> 1)] = new_func << ((i * 4) & 4);
480
    }
481
    memset(&sd->data[17], 0, 47);
482
    crc = sd_crc16(sd->data, 64);
483
    sd->data[65] = crc >> 8;
484
    sd->data[66] = crc & 0xff;
485
}
486

    
487
static inline int sd_wp_addr(SDState *sd, uint32_t addr)
488
{
489
    return sd->wp_groups[addr >>
490
            (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT)];
491
}
492

    
493
static void sd_lock_command(SDState *sd)
494
{
495
    int erase, lock, clr_pwd, set_pwd, pwd_len;
496
    erase = !!(sd->data[0] & 0x08);
497
    lock = sd->data[0] & 0x04;
498
    clr_pwd = sd->data[0] & 0x02;
499
    set_pwd = sd->data[0] & 0x01;
500

    
501
    if (sd->blk_len > 1)
502
        pwd_len = sd->data[1];
503
    else
504
        pwd_len = 0;
505

    
506
    if (erase) {
507
        if (!(sd->card_status & CARD_IS_LOCKED) || sd->blk_len > 1 ||
508
                        set_pwd || clr_pwd || lock || sd->wp_switch ||
509
                        (sd->csd[14] & 0x20)) {
510
            sd->card_status |= LOCK_UNLOCK_FAILED;
511
            return;
512
        }
513
        memset(sd->wp_groups, 0, sizeof(int) * (sd->size >>
514
                        (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT)));
515
        sd->csd[14] &= ~0x10;
516
        sd->card_status &= ~CARD_IS_LOCKED;
517
        sd->pwd_len = 0;
518
        /* Erasing the entire card here! */
519
        printf("SD: Card force-erased by CMD42\n");
520
        return;
521
    }
522

    
523
    if (sd->blk_len < 2 + pwd_len ||
524
                    pwd_len <= sd->pwd_len ||
525
                    pwd_len > sd->pwd_len + 16) {
526
        sd->card_status |= LOCK_UNLOCK_FAILED;
527
        return;
528
    }
529

    
530
    if (sd->pwd_len && memcmp(sd->pwd, sd->data + 2, sd->pwd_len)) {
531
        sd->card_status |= LOCK_UNLOCK_FAILED;
532
        return;
533
    }
534

    
535
    pwd_len -= sd->pwd_len;
536
    if ((pwd_len && !set_pwd) ||
537
                    (clr_pwd && (set_pwd || lock)) ||
538
                    (lock && !sd->pwd_len && !set_pwd) ||
539
                    (!set_pwd && !clr_pwd &&
540
                     (((sd->card_status & CARD_IS_LOCKED) && lock) ||
541
                      (!(sd->card_status & CARD_IS_LOCKED) && !lock)))) {
542
        sd->card_status |= LOCK_UNLOCK_FAILED;
543
        return;
544
    }
545

    
546
    if (set_pwd) {
547
        memcpy(sd->pwd, sd->data + 2 + sd->pwd_len, pwd_len);
548
        sd->pwd_len = pwd_len;
549
    }
550

    
551
    if (clr_pwd) {
552
        sd->pwd_len = 0;
553
    }
554

    
555
    if (lock)
556
        sd->card_status |= CARD_IS_LOCKED;
557
    else
558
        sd->card_status &= ~CARD_IS_LOCKED;
559
}
560

    
561
static sd_rsp_type_t sd_normal_command(SDState *sd,
562
                                       struct sd_request_s req)
563
{
564
    uint32_t rca = 0x0000;
565

    
566
    if (sd_cmd_type[req.cmd] == sd_ac || sd_cmd_type[req.cmd] == sd_adtc)
567
        rca = req.arg >> 16;
568

    
569
    DPRINTF("CMD%d 0x%08x state %d\n", req.cmd, req.arg, sd->state);
570
    switch (req.cmd) {
571
    /* Basic commands (Class 0 and Class 1) */
572
    case 0:        /* CMD0:   GO_IDLE_STATE */
573
        switch (sd->state) {
574
        case sd_inactive_state:
575
            return sd_r0;
576

    
577
        default:
578
            sd->state = sd_idle_state;
579
            sd_reset(sd, sd->bdrv);
580
            return sd_r0;
581
        }
582
        break;
583

    
584
    case 2:        /* CMD2:   ALL_SEND_CID */
585
        switch (sd->state) {
586
        case sd_ready_state:
587
            sd->state = sd_identification_state;
588
            return sd_r2_i;
589

    
590
        default:
591
            break;
592
        }
593
        break;
594

    
595
    case 3:        /* CMD3:   SEND_RELATIVE_ADDR */
596
        switch (sd->state) {
597
        case sd_identification_state:
598
        case sd_standby_state:
599
            sd->state = sd_standby_state;
600
            sd_set_rca(sd);
601
            return sd_r6;
602

    
603
        default:
604
            break;
605
        }
606
        break;
607

    
608
    case 4:        /* CMD4:   SEND_DSR */
609
        switch (sd->state) {
610
        case sd_standby_state:
611
            break;
612

    
613
        default:
614
            break;
615
        }
616
        break;
617

    
618
    case 6:        /* CMD6:   SWITCH_FUNCTION */
619
        switch (sd->mode) {
620
        case sd_data_transfer_mode:
621
            sd_function_switch(sd, req.arg);
622
            sd->state = sd_sendingdata_state;
623
            sd->data_start = 0;
624
            sd->data_offset = 0;
625
            return sd_r1;
626

    
627
        default:
628
            break;
629
        }
630
        break;
631

    
632
    case 7:        /* CMD7:   SELECT/DESELECT_CARD */
633
        switch (sd->state) {
634
        case sd_standby_state:
635
            if (sd->rca != rca)
636
                return sd_r0;
637

    
638
            sd->state = sd_transfer_state;
639
            return sd_r1b;
640

    
641
        case sd_transfer_state:
642
        case sd_sendingdata_state:
643
            if (sd->rca == rca)
644
                break;
645

    
646
            sd->state = sd_standby_state;
647
            return sd_r1b;
648

    
649
        case sd_disconnect_state:
650
            if (sd->rca != rca)
651
                return sd_r0;
652

    
653
            sd->state = sd_programming_state;
654
            return sd_r1b;
655

    
656
        case sd_programming_state:
657
            if (sd->rca == rca)
658
                break;
659

    
660
            sd->state = sd_disconnect_state;
661
            return sd_r1b;
662

    
663
        default:
664
            break;
665
        }
666
        break;
667

    
668
    case 9:        /* CMD9:   SEND_CSD */
669
        switch (sd->state) {
670
        case sd_standby_state:
671
            if (sd->rca != rca)
672
                return sd_r0;
673

    
674
            return sd_r2_s;
675

    
676
        default:
677
            break;
678
        }
679
        break;
680

    
681
    case 10:        /* CMD10:  SEND_CID */
682
        switch (sd->state) {
683
        case sd_standby_state:
684
            if (sd->rca != rca)
685
                return sd_r0;
686

    
687
            return sd_r2_i;
688

    
689
        default:
690
            break;
691
        }
692
        break;
693

    
694
    case 11:        /* CMD11:  READ_DAT_UNTIL_STOP */
695
        switch (sd->state) {
696
        case sd_transfer_state:
697
            sd->state = sd_sendingdata_state;
698
            sd->data_start = req.arg;
699
            sd->data_offset = 0;
700

    
701
            if (sd->data_start + sd->blk_len > sd->size)
702
                sd->card_status |= ADDRESS_ERROR;
703
            return sd_r0;
704

    
705
        default:
706
            break;
707
        }
708
        break;
709

    
710
    case 12:        /* CMD12:  STOP_TRANSMISSION */
711
        switch (sd->state) {
712
        case sd_sendingdata_state:
713
            sd->state = sd_transfer_state;
714
            return sd_r1b;
715

    
716
        case sd_receivingdata_state:
717
            sd->state = sd_programming_state;
718
            /* Bzzzzzzztt .... Operation complete.  */
719
            sd->state = sd_transfer_state;
720
            return sd_r1b;
721

    
722
        default:
723
            break;
724
        }
725
        break;
726

    
727
    case 13:        /* CMD13:  SEND_STATUS */
728
        switch (sd->mode) {
729
        case sd_data_transfer_mode:
730
            if (sd->rca != rca)
731
                return sd_r0;
732

    
733
            return sd_r1;
734

    
735
        default:
736
            break;
737
        }
738
        break;
739

    
740
    case 15:        /* CMD15:  GO_INACTIVE_STATE */
741
        switch (sd->mode) {
742
        case sd_data_transfer_mode:
743
            if (sd->rca != rca)
744
                return sd_r0;
745

    
746
            sd->state = sd_inactive_state;
747
            return sd_r0;
748

    
749
        default:
750
            break;
751
        }
752
        break;
753

    
754
    /* Block read commands (Classs 2) */
755
    case 16:        /* CMD16:  SET_BLOCKLEN */
756
        switch (sd->state) {
757
        case sd_transfer_state:
758
            if (req.arg > (1 << HWBLOCK_SHIFT))
759
                sd->card_status |= BLOCK_LEN_ERROR;
760
            else
761
                sd->blk_len = req.arg;
762

    
763
            return sd_r1;
764

    
765
        default:
766
            break;
767
        }
768
        break;
769

    
770
    case 17:        /* CMD17:  READ_SINGLE_BLOCK */
771
        switch (sd->state) {
772
        case sd_transfer_state:
773
            sd->state = sd_sendingdata_state;
774
            sd->data_start = req.arg;
775
            sd->data_offset = 0;
776

    
777
            if (sd->data_start + sd->blk_len > sd->size)
778
                sd->card_status |= ADDRESS_ERROR;
779
            return sd_r1;
780

    
781
        default:
782
            break;
783
        }
784
        break;
785

    
786
    case 18:        /* CMD18:  READ_MULTIPLE_BLOCK */
787
        switch (sd->state) {
788
        case sd_transfer_state:
789
            sd->state = sd_sendingdata_state;
790
            sd->data_start = req.arg;
791
            sd->data_offset = 0;
792

    
793
            if (sd->data_start + sd->blk_len > sd->size)
794
                sd->card_status |= ADDRESS_ERROR;
795
            return sd_r1;
796

    
797
        default:
798
            break;
799
        }
800
        break;
801

    
802
    /* Block write commands (Class 4) */
803
    case 24:        /* CMD24:  WRITE_SINGLE_BLOCK */
804
        switch (sd->state) {
805
        case sd_transfer_state:
806
            sd->state = sd_receivingdata_state;
807
            sd->data_start = req.arg;
808
            sd->data_offset = 0;
809
            sd->blk_written = 0;
810

    
811
            if (sd->data_start + sd->blk_len > sd->size)
812
                sd->card_status |= ADDRESS_ERROR;
813
            if (sd_wp_addr(sd, sd->data_start))
814
                sd->card_status |= WP_VIOLATION;
815
            if (sd->csd[14] & 0x30)
816
                sd->card_status |= WP_VIOLATION;
817
            return sd_r1;
818

    
819
        default:
820
            break;
821
        }
822
        break;
823

    
824
    case 25:        /* CMD25:  WRITE_MULTIPLE_BLOCK */
825
        switch (sd->state) {
826
        case sd_transfer_state:
827
            sd->state = sd_receivingdata_state;
828
            sd->data_start = req.arg;
829
            sd->data_offset = 0;
830
            sd->blk_written = 0;
831

    
832
            if (sd->data_start + sd->blk_len > sd->size)
833
                sd->card_status |= ADDRESS_ERROR;
834
            if (sd_wp_addr(sd, sd->data_start))
835
                sd->card_status |= WP_VIOLATION;
836
            if (sd->csd[14] & 0x30)
837
                sd->card_status |= WP_VIOLATION;
838
            return sd_r1;
839

    
840
        default:
841
            break;
842
        }
843
        break;
844

    
845
    case 26:        /* CMD26:  PROGRAM_CID */
846
        switch (sd->state) {
847
        case sd_transfer_state:
848
            sd->state = sd_receivingdata_state;
849
            sd->data_start = 0;
850
            sd->data_offset = 0;
851
            return sd_r1;
852

    
853
        default:
854
            break;
855
        }
856
        break;
857

    
858
    case 27:        /* CMD27:  PROGRAM_CSD */
859
        switch (sd->state) {
860
        case sd_transfer_state:
861
            sd->state = sd_receivingdata_state;
862
            sd->data_start = 0;
863
            sd->data_offset = 0;
864
            return sd_r1;
865

    
866
        default:
867
            break;
868
        }
869
        break;
870

    
871
    /* Write protection (Class 6) */
872
    case 28:        /* CMD28:  SET_WRITE_PROT */
873
        switch (sd->state) {
874
        case sd_transfer_state:
875
            if (req.arg >= sd->size) {
876
                sd->card_status = ADDRESS_ERROR;
877
                return sd_r1b;
878
            }
879

    
880
            sd->state = sd_programming_state;
881
            sd->wp_groups[req.arg >> (HWBLOCK_SHIFT +
882
                            SECTOR_SHIFT + WPGROUP_SHIFT)] = 1;
883
            /* Bzzzzzzztt .... Operation complete.  */
884
            sd->state = sd_transfer_state;
885
            return sd_r1b;
886

    
887
        default:
888
            break;
889
        }
890
        break;
891

    
892
    case 29:        /* CMD29:  CLR_WRITE_PROT */
893
        switch (sd->state) {
894
        case sd_transfer_state:
895
            if (req.arg >= sd->size) {
896
                sd->card_status = ADDRESS_ERROR;
897
                return sd_r1b;
898
            }
899

    
900
            sd->state = sd_programming_state;
901
            sd->wp_groups[req.arg >> (HWBLOCK_SHIFT +
902
                            SECTOR_SHIFT + WPGROUP_SHIFT)] = 0;
903
            /* Bzzzzzzztt .... Operation complete.  */
904
            sd->state = sd_transfer_state;
905
            return sd_r1b;
906

    
907
        default:
908
            break;
909
        }
910
        break;
911

    
912
    case 30:        /* CMD30:  SEND_WRITE_PROT */
913
        switch (sd->state) {
914
        case sd_transfer_state:
915
            sd->state = sd_sendingdata_state;
916
            *(uint32_t *) sd->data = sd_wpbits(sd, req.arg);
917
            sd->data_start = req.arg;
918
            sd->data_offset = 0;
919
            return sd_r1b;
920

    
921
        default:
922
            break;
923
        }
924
        break;
925

    
926
    /* Erase commands (Class 5) */
927
    case 32:        /* CMD32:  ERASE_WR_BLK_START */
928
        switch (sd->state) {
929
        case sd_transfer_state:
930
            sd->erase_start = req.arg;
931
            return sd_r1;
932

    
933
        default:
934
            break;
935
        }
936
        break;
937

    
938
    case 33:        /* CMD33:  ERASE_WR_BLK_END */
939
        switch (sd->state) {
940
        case sd_transfer_state:
941
            sd->erase_end = req.arg;
942
            return sd_r1;
943

    
944
        default:
945
            break;
946
        }
947
        break;
948

    
949
    case 38:        /* CMD38:  ERASE */
950
        switch (sd->state) {
951
        case sd_transfer_state:
952
            if (sd->csd[14] & 0x30) {
953
                sd->card_status |= WP_VIOLATION;
954
                return sd_r1b;
955
            }
956

    
957
            sd->state = sd_programming_state;
958
            sd_erase(sd);
959
            /* Bzzzzzzztt .... Operation complete.  */
960
            sd->state = sd_transfer_state;
961
            return sd_r1b;
962

    
963
        default:
964
            break;
965
        }
966
        break;
967

    
968
    /* Lock card commands (Class 7) */
969
    case 42:        /* CMD42:  LOCK_UNLOCK */
970
        switch (sd->state) {
971
        case sd_transfer_state:
972
            sd->state = sd_receivingdata_state;
973
            sd->data_start = 0;
974
            sd->data_offset = 0;
975
            return sd_r1;
976

    
977
        default:
978
            break;
979
        }
980
        break;
981

    
982
    /* Application specific commands (Class 8) */
983
    case 55:        /* CMD55:  APP_CMD */
984
        if (sd->rca != rca)
985
            return sd_r0;
986

    
987
        sd->card_status |= APP_CMD;
988
        return sd_r1;
989

    
990
    case 56:        /* CMD56:  GEN_CMD */
991
        printf("SD: GEN_CMD 0x%08x\n", req.arg);
992

    
993
        switch (sd->state) {
994
        case sd_transfer_state:
995
            sd->data_offset = 0;
996
            if (req.arg & 1)
997
                sd->state = sd_sendingdata_state;
998
            else
999
                sd->state = sd_receivingdata_state;
1000
            return sd_r1;
1001

    
1002
        default:
1003
            break;
1004
        }
1005
        break;
1006

    
1007
    default:
1008
        sd->card_status |= ILLEGAL_COMMAND;
1009

    
1010
        printf("SD: Unknown CMD%i\n", req.cmd);
1011
        return sd_r0;
1012
    }
1013

    
1014
    sd->card_status |= ILLEGAL_COMMAND;
1015
    printf("SD: CMD%i in a wrong state\n", req.cmd);
1016
    return sd_r0;
1017
}
1018

    
1019
static sd_rsp_type_t sd_app_command(SDState *sd,
1020
                                    struct sd_request_s req) {
1021
    uint32_t rca;
1022

    
1023
    if (sd_cmd_type[req.cmd] == sd_ac || sd_cmd_type[req.cmd] == sd_adtc)
1024
        rca = req.arg >> 16;
1025

    
1026
    DPRINTF("ACMD%d 0x%08x\n", req.cmd, req.arg);
1027
    switch (req.cmd) {
1028
    case 6:        /* ACMD6:  SET_BUS_WIDTH */
1029
        switch (sd->state) {
1030
        case sd_transfer_state:
1031
            sd->sd_status[0] &= 0x3f;
1032
            sd->sd_status[0] |= (req.arg & 0x03) << 6;
1033
            return sd_r1;
1034

    
1035
        default:
1036
            break;
1037
        }
1038
        break;
1039

    
1040
    case 13:        /* ACMD13: SD_STATUS */
1041
        switch (sd->state) {
1042
        case sd_transfer_state:
1043
            sd->data_start = 0;
1044
            sd->data_offset = 0;
1045
            return sd_r1;
1046

    
1047
        default:
1048
            break;
1049
        }
1050
        break;
1051

    
1052
    case 22:        /* ACMD22: SEND_NUM_WR_BLOCKS */
1053
        switch (sd->state) {
1054
        case sd_transfer_state:
1055
            *(uint32_t *) sd->data = sd->blk_written;
1056

    
1057
            sd->data_start = 0;
1058
            sd->data_offset = 0;
1059
            return sd_r1;
1060

    
1061
        default:
1062
            break;
1063
        }
1064
        break;
1065

    
1066
    case 23:        /* ACMD23: SET_WR_BLK_ERASE_COUNT */
1067
        switch (sd->state) {
1068
        case sd_transfer_state:
1069
            return sd_r1;
1070

    
1071
        default:
1072
            break;
1073
        }
1074
        break;
1075

    
1076
    case 41:        /* ACMD41: SD_APP_OP_COND */
1077
        switch (sd->state) {
1078
        case sd_idle_state:
1079
            /* We accept any voltage.  10000 V is nothing.  */
1080
            if (req.arg)
1081
                sd->state = sd_ready_state;
1082

    
1083
            return sd_r3;
1084

    
1085
        default:
1086
            break;
1087
        }
1088
        break;
1089

    
1090
    case 42:        /* ACMD42: SET_CLR_CARD_DETECT */
1091
        switch (sd->state) {
1092
        case sd_transfer_state:
1093
            /* Bringing in the 50KOhm pull-up resistor... Done.  */
1094
            return sd_r1;
1095

    
1096
        default:
1097
            break;
1098
        }
1099
        break;
1100

    
1101
    case 51:        /* ACMD51: SEND_SCR */
1102
        switch (sd->state) {
1103
        case sd_transfer_state:
1104
            sd->state = sd_sendingdata_state;
1105
            sd->data_start = 0;
1106
            sd->data_offset = 0;
1107
            return sd_r1;
1108

    
1109
        default:
1110
            break;
1111
        }
1112
        break;
1113

    
1114
    default:
1115
        /* Fall back to standard commands.  */
1116
        sd->card_status &= ~APP_CMD;
1117
        return sd_normal_command(sd, req);
1118
    }
1119

    
1120
    printf("SD: ACMD%i in a wrong state\n", req.cmd);
1121
    return sd_r0;
1122
}
1123

    
1124
int sd_do_command(SDState *sd, struct sd_request_s *req,
1125
                  uint8_t *response) {
1126
    uint32_t last_status = sd->card_status;
1127
    sd_rsp_type_t rtype;
1128
    int rsplen;
1129

    
1130
    if (!bdrv_is_inserted(sd->bdrv)) {
1131
        return 0;
1132
    }
1133

    
1134
    if (sd_req_crc_validate(req)) {
1135
        sd->card_status &= ~COM_CRC_ERROR;
1136
        return 0;
1137
    }
1138

    
1139
    sd->card_status &= ~CARD_STATUS_B;
1140
    sd_set_status(sd);
1141

    
1142
    if (last_status & CARD_IS_LOCKED)
1143
        if (((last_status & APP_CMD) &&
1144
                                 req->cmd == 41) ||
1145
                        (!(last_status & APP_CMD) &&
1146
                         (sd_cmd_class[req->cmd] == 0 ||
1147
                          sd_cmd_class[req->cmd] == 7 ||
1148
                          req->cmd == 16 || req->cmd == 55))) {
1149
            sd->card_status |= ILLEGAL_COMMAND;
1150
            printf("SD: Card is locked\n");
1151
            return 0;
1152
        }
1153

    
1154
    if (last_status & APP_CMD) {
1155
        rtype = sd_app_command(sd, *req);
1156
        sd->card_status &= ~APP_CMD;
1157
    } else
1158
        rtype = sd_normal_command(sd, *req);
1159

    
1160
    sd->current_cmd = req->cmd;
1161

    
1162
    switch (rtype) {
1163
    case sd_r1:
1164
    case sd_r1b:
1165
        sd_response_r1_make(sd, response, last_status);
1166
        rsplen = 4;
1167
        break;
1168

    
1169
    case sd_r2_i:
1170
        memcpy(response, sd->cid, sizeof(sd->cid));
1171
        response[7] |= 1;
1172
        rsplen = 16;
1173
        break;
1174

    
1175
    case sd_r2_s:
1176
        memcpy(response, sd->csd, sizeof(sd->csd));
1177
        response[7] |= 1;
1178
        rsplen = 16;
1179
        break;
1180

    
1181
    case sd_r3:
1182
        sd_response_r3_make(sd, response);
1183
        rsplen = 4;
1184
        break;
1185

    
1186
    case sd_r6:
1187
        sd_response_r6_make(sd, response);
1188
        rsplen = 4;
1189
        break;
1190

    
1191
    case sd_r0:
1192
    default:
1193
        rsplen = 0;
1194
        break;
1195
    }
1196

    
1197
    if (sd->card_status & ILLEGAL_COMMAND)
1198
        rsplen = 0;
1199

    
1200
#ifdef DEBUG_SD
1201
    if (rsplen) {
1202
        int i;
1203
        DPRINTF("Response:");
1204
        for (i = 0; i < rsplen; i++)
1205
            printf(" %02x", response[i]);
1206
        printf(" state %d\n", sd->state);
1207
    } else {
1208
        DPRINTF("No response %d\n", sd->state);
1209
    }
1210
#endif
1211

    
1212
    return rsplen;
1213
}
1214

    
1215
/* No real need for 64 bit addresses here */
1216
static void sd_blk_read(BlockDriverState *bdrv,
1217
                void *data, uint32_t addr, uint32_t len)
1218
{
1219
    uint8_t buf[512];
1220
    uint32_t end = addr + len;
1221

    
1222
    if (!bdrv || bdrv_read(bdrv, addr >> 9, buf, 1) == -1) {
1223
        printf("sd_blk_read: read error on host side\n");
1224
        return;
1225
    }
1226

    
1227
    if (end > (addr & ~511) + 512) {
1228
        memcpy(data, buf + (addr & 511), 512 - (addr & 511));
1229

    
1230
        if (bdrv_read(bdrv, end >> 9, buf, 1) == -1) {
1231
            printf("sd_blk_read: read error on host side\n");
1232
            return;
1233
        }
1234
        memcpy(data + 512 - (addr & 511), buf, end & 511);
1235
    } else
1236
        memcpy(data, buf + (addr & 511), len);
1237
}
1238

    
1239
static void sd_blk_write(BlockDriverState *bdrv,
1240
                void *data, uint32_t addr, uint32_t len)
1241
{
1242
    uint8_t buf[512];
1243
    uint32_t end = addr + len;
1244

    
1245
    if ((addr & 511) || len < 512)
1246
        if (!bdrv || bdrv_read(bdrv, addr >> 9, buf, 1) == -1) {
1247
            printf("sd_blk_write: read error on host side\n");
1248
            return;
1249
        }
1250

    
1251
    if (end > (addr & ~511) + 512) {
1252
        memcpy(buf + (addr & 511), data, 512 - (addr & 511));
1253
        if (bdrv_write(bdrv, addr >> 9, buf, 1) == -1) {
1254
            printf("sd_blk_write: write error on host side\n");
1255
            return;
1256
        }
1257

    
1258
        if (bdrv_read(bdrv, end >> 9, buf, 1) == -1) {
1259
            printf("sd_blk_write: read error on host side\n");
1260
            return;
1261
        }
1262
        memcpy(buf, data + 512 - (addr & 511), end & 511);
1263
        if (bdrv_write(bdrv, end >> 9, buf, 1) == -1)
1264
            printf("sd_blk_write: write error on host side\n");
1265
    } else {
1266
        memcpy(buf + (addr & 511), data, len);
1267
        if (!bdrv || bdrv_write(bdrv, addr >> 9, buf, 1) == -1)
1268
            printf("sd_blk_write: write error on host side\n");
1269
    }
1270
}
1271

    
1272
#define BLK_READ_BLOCK(a, len)        sd_blk_read(sd->bdrv, sd->data, a, len)
1273
#define BLK_WRITE_BLOCK(a, len)        sd_blk_write(sd->bdrv, sd->data, a, len)
1274
#define APP_READ_BLOCK(a, len)        memset(sd->data, 0xec, len)
1275
#define APP_WRITE_BLOCK(a, len)
1276

    
1277
void sd_write_data(SDState *sd, uint8_t value)
1278
{
1279
    int i;
1280

    
1281
    if (!sd->bdrv || !bdrv_is_inserted(sd->bdrv))
1282
        return;
1283

    
1284
    if (sd->state != sd_receivingdata_state) {
1285
        printf("sd_write_data: not in Receiving-Data state\n");
1286
        return;
1287
    }
1288

    
1289
    if (sd->card_status & (ADDRESS_ERROR | WP_VIOLATION))
1290
        return;
1291

    
1292
    switch (sd->current_cmd) {
1293
    case 24:        /* CMD24:  WRITE_SINGLE_BLOCK */
1294
        sd->data[sd->data_offset ++] = value;
1295
        if (sd->data_offset >= sd->blk_len) {
1296
            /* TODO: Check CRC before committing */
1297
            sd->state = sd_programming_state;
1298
            BLK_WRITE_BLOCK(sd->data_start, sd->data_offset);
1299
            sd->blk_written ++;
1300
            sd->csd[14] |= 0x40;
1301
            /* Bzzzzzzztt .... Operation complete.  */
1302
            sd->state = sd_transfer_state;
1303
        }
1304
        break;
1305

    
1306
    case 25:        /* CMD25:  WRITE_MULTIPLE_BLOCK */
1307
        sd->data[sd->data_offset ++] = value;
1308
        if (sd->data_offset >= sd->blk_len) {
1309
            /* TODO: Check CRC before committing */
1310
            sd->state = sd_programming_state;
1311
            BLK_WRITE_BLOCK(sd->data_start, sd->data_offset);
1312
            sd->blk_written ++;
1313
            sd->data_start += sd->blk_len;
1314
            sd->data_offset = 0;
1315
            if (sd->data_start + sd->blk_len > sd->size) {
1316
                sd->card_status |= ADDRESS_ERROR;
1317
                break;
1318
            }
1319
            if (sd_wp_addr(sd, sd->data_start)) {
1320
                sd->card_status |= WP_VIOLATION;
1321
                break;
1322
            }
1323
            sd->csd[14] |= 0x40;
1324

    
1325
            /* Bzzzzzzztt .... Operation complete.  */
1326
            sd->state = sd_receivingdata_state;
1327
        }
1328
        break;
1329

    
1330
    case 26:        /* CMD26:  PROGRAM_CID */
1331
        sd->data[sd->data_offset ++] = value;
1332
        if (sd->data_offset >= sizeof(sd->cid)) {
1333
            /* TODO: Check CRC before committing */
1334
            sd->state = sd_programming_state;
1335
            for (i = 0; i < sizeof(sd->cid); i ++)
1336
                if ((sd->cid[i] | 0x00) != sd->data[i])
1337
                    sd->card_status |= CID_CSD_OVERWRITE;
1338

    
1339
            if (!(sd->card_status & CID_CSD_OVERWRITE))
1340
                for (i = 0; i < sizeof(sd->cid); i ++) {
1341
                    sd->cid[i] |= 0x00;
1342
                    sd->cid[i] &= sd->data[i];
1343
                }
1344
            /* Bzzzzzzztt .... Operation complete.  */
1345
            sd->state = sd_transfer_state;
1346
        }
1347
        break;
1348

    
1349
    case 27:        /* CMD27:  PROGRAM_CSD */
1350
        sd->data[sd->data_offset ++] = value;
1351
        if (sd->data_offset >= sizeof(sd->csd)) {
1352
            /* TODO: Check CRC before committing */
1353
            sd->state = sd_programming_state;
1354
            for (i = 0; i < sizeof(sd->csd); i ++)
1355
                if ((sd->csd[i] | sd_csd_rw_mask[i]) !=
1356
                    (sd->data[i] | sd_csd_rw_mask[i]))
1357
                    sd->card_status |= CID_CSD_OVERWRITE;
1358

    
1359
            /* Copy flag (OTP) & Permanent write protect */
1360
            if (sd->csd[14] & ~sd->data[14] & 0x60)
1361
                sd->card_status |= CID_CSD_OVERWRITE;
1362

    
1363
            if (!(sd->card_status & CID_CSD_OVERWRITE))
1364
                for (i = 0; i < sizeof(sd->csd); i ++) {
1365
                    sd->csd[i] |= sd_csd_rw_mask[i];
1366
                    sd->csd[i] &= sd->data[i];
1367
                }
1368
            /* Bzzzzzzztt .... Operation complete.  */
1369
            sd->state = sd_transfer_state;
1370
        }
1371
        break;
1372

    
1373
    case 42:        /* CMD42:  LOCK_UNLOCK */
1374
        sd->data[sd->data_offset ++] = value;
1375
        if (sd->data_offset >= sd->blk_len) {
1376
            /* TODO: Check CRC before committing */
1377
            sd->state = sd_programming_state;
1378
            sd_lock_command(sd);
1379
            /* Bzzzzzzztt .... Operation complete.  */
1380
            sd->state = sd_transfer_state;
1381
        }
1382
        break;
1383

    
1384
    case 56:        /* CMD56:  GEN_CMD */
1385
        sd->data[sd->data_offset ++] = value;
1386
        if (sd->data_offset >= sd->blk_len) {
1387
            APP_WRITE_BLOCK(sd->data_start, sd->data_offset);
1388
            sd->state = sd_transfer_state;
1389
        }
1390
        break;
1391

    
1392
    default:
1393
        printf("sd_write_data: unknown command\n");
1394
        break;
1395
    }
1396
}
1397

    
1398
uint8_t sd_read_data(SDState *sd)
1399
{
1400
    /* TODO: Append CRCs */
1401
    uint8_t ret;
1402

    
1403
    if (!sd->bdrv || !bdrv_is_inserted(sd->bdrv))
1404
        return 0x00;
1405

    
1406
    if (sd->state != sd_sendingdata_state) {
1407
        printf("sd_read_data: not in Sending-Data state\n");
1408
        return 0x00;
1409
    }
1410

    
1411
    if (sd->card_status & (ADDRESS_ERROR | WP_VIOLATION))
1412
        return 0x00;
1413

    
1414
    switch (sd->current_cmd) {
1415
    case 6:        /* CMD6:   SWITCH_FUNCTION */
1416
        ret = sd->data[sd->data_offset ++];
1417

    
1418
        if (sd->data_offset >= 64)
1419
            sd->state = sd_transfer_state;
1420
        break;
1421

    
1422
    case 11:        /* CMD11:  READ_DAT_UNTIL_STOP */
1423
        if (sd->data_offset == 0)
1424
            BLK_READ_BLOCK(sd->data_start, sd->blk_len);
1425
        ret = sd->data[sd->data_offset ++];
1426

    
1427
        if (sd->data_offset >= sd->blk_len) {
1428
            sd->data_start += sd->blk_len;
1429
            sd->data_offset = 0;
1430
            if (sd->data_start + sd->blk_len > sd->size) {
1431
                sd->card_status |= ADDRESS_ERROR;
1432
                break;
1433
            }
1434
        }
1435
        break;
1436

    
1437
    case 13:        /* ACMD13: SD_STATUS */
1438
        ret = sd->sd_status[sd->data_offset ++];
1439

    
1440
        if (sd->data_offset >= sizeof(sd->sd_status))
1441
            sd->state = sd_transfer_state;
1442
        break;
1443

    
1444
    case 17:        /* CMD17:  READ_SINGLE_BLOCK */
1445
        if (sd->data_offset == 0)
1446
            BLK_READ_BLOCK(sd->data_start, sd->blk_len);
1447
        ret = sd->data[sd->data_offset ++];
1448

    
1449
        if (sd->data_offset >= sd->blk_len)
1450
            sd->state = sd_transfer_state;
1451
        break;
1452

    
1453
    case 18:        /* CMD18:  READ_MULTIPLE_BLOCK */
1454
        if (sd->data_offset == 0)
1455
            BLK_READ_BLOCK(sd->data_start, sd->blk_len);
1456
        ret = sd->data[sd->data_offset ++];
1457

    
1458
        if (sd->data_offset >= sd->blk_len) {
1459
            sd->data_start += sd->blk_len;
1460
            sd->data_offset = 0;
1461
            if (sd->data_start + sd->blk_len > sd->size) {
1462
                sd->card_status |= ADDRESS_ERROR;
1463
                break;
1464
            }
1465
        }
1466
        break;
1467

    
1468
    case 22:        /* ACMD22: SEND_NUM_WR_BLOCKS */
1469
        ret = sd->data[sd->data_offset ++];
1470

    
1471
        if (sd->data_offset >= 4)
1472
            sd->state = sd_transfer_state;
1473
        break;
1474

    
1475
    case 30:        /* CMD30:  SEND_WRITE_PROT */
1476
        ret = sd->data[sd->data_offset ++];
1477

    
1478
        if (sd->data_offset >= 4)
1479
            sd->state = sd_transfer_state;
1480
        break;
1481

    
1482
    case 51:        /* ACMD51: SEND_SCR */
1483
        ret = sd->scr[sd->data_offset ++];
1484

    
1485
        if (sd->data_offset >= sizeof(sd->scr))
1486
            sd->state = sd_transfer_state;
1487
        break;
1488

    
1489
    case 56:        /* CMD56:  GEN_CMD */
1490
        if (sd->data_offset == 0)
1491
            APP_READ_BLOCK(sd->data_start, sd->blk_len);
1492
        ret = sd->data[sd->data_offset ++];
1493

    
1494
        if (sd->data_offset >= sd->blk_len)
1495
            sd->state = sd_transfer_state;
1496
        break;
1497

    
1498
    default:
1499
        printf("sd_read_data: unknown command\n");
1500
        return 0x00;
1501
    }
1502

    
1503
    return ret;
1504
}
1505

    
1506
int sd_data_ready(SDState *sd)
1507
{
1508
    return sd->state == sd_sendingdata_state;
1509
}