Statistics
| Branch: | Revision:

root / hw / sd.c @ 4e4fa398

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