Statistics
| Branch: | Revision:

root / hw / sd.c @ feef3102

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