Statistics
| Branch: | Revision:

root / hw / sd.c @ bee8d684

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