Statistics
| Branch: | Revision:

root / hw / sd.c @ 5fafdf24

History | View | Annotate | Download (41.1 kB)

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