Revision 5493e33f hw/ssi-sd.c
b/hw/ssi-sd.c | ||
---|---|---|
1 | 1 |
/* |
2 | 2 |
* SSI to SD card adapter. |
3 | 3 |
* |
4 |
* Copyright (c) 2007 CodeSourcery. |
|
4 |
* Copyright (c) 2007-2009 CodeSourcery.
|
|
5 | 5 |
* Written by Paul Brook |
6 | 6 |
* |
7 |
* This code is licenced under the GPL.
|
|
7 |
* This code is licenced under the GNU GPL v2.
|
|
8 | 8 |
*/ |
9 | 9 |
|
10 |
#include "hw.h"
|
|
10 |
#include "ssi.h"
|
|
11 | 11 |
#include "sd.h" |
12 |
#include "sysemu.h" |
|
12 | 13 |
|
13 | 14 |
//#define DEBUG_SSI_SD 1 |
14 | 15 |
|
... | ... | |
32 | 33 |
} ssi_sd_mode; |
33 | 34 |
|
34 | 35 |
typedef struct { |
36 |
SSISlave ssidev; |
|
35 | 37 |
ssi_sd_mode mode; |
36 | 38 |
int cmd; |
37 | 39 |
uint8_t cmdarg[4]; |
... | ... | |
59 | 61 |
#define SSI_SDR_ADDRESS_ERROR 0x2000 |
60 | 62 |
#define SSI_SDR_PARAMETER_ERROR 0x4000 |
61 | 63 |
|
62 |
int ssi_sd_xfer(void *opaque, int val)
|
|
64 |
static uint32_t ssi_sd_transfer(SSISlave *dev, uint32_t val)
|
|
63 | 65 |
{ |
64 |
ssi_sd_state *s = (ssi_sd_state *)opaque;
|
|
66 |
ssi_sd_state *s = FROM_SSI_SLAVE(ssi_sd_state, dev);
|
|
65 | 67 |
|
66 | 68 |
/* Special case: allow CMD12 (STOP TRANSMISSION) while reading data. */ |
67 | 69 |
if (s->mode == SSI_SD_DATA_READ && val == 0x4d) { |
... | ... | |
227 | 229 |
return 0; |
228 | 230 |
} |
229 | 231 |
|
230 |
void *ssi_sd_init(BlockDriverState *bs)
|
|
232 |
static void ssi_sd_init(SSISlave *dev)
|
|
231 | 233 |
{ |
232 |
ssi_sd_state *s; |
|
234 |
ssi_sd_state *s = FROM_SSI_SLAVE(ssi_sd_state, dev); |
|
235 |
BlockDriverState *bs; |
|
233 | 236 |
|
234 |
s = (ssi_sd_state *)qemu_mallocz(sizeof(ssi_sd_state)); |
|
235 | 237 |
s->mode = SSI_SD_CMD; |
238 |
bs = qdev_init_bdrv(&dev->qdev, IF_SD); |
|
236 | 239 |
s->sd = sd_init(bs, 1); |
237 | 240 |
register_savevm("ssi_sd", -1, 1, ssi_sd_save, ssi_sd_load, s); |
238 |
return s; |
|
239 | 241 |
} |
242 |
|
|
243 |
static SSISlaveInfo ssi_sd_info = { |
|
244 |
.init = ssi_sd_init, |
|
245 |
.transfer = ssi_sd_transfer |
|
246 |
}; |
|
247 |
|
|
248 |
static void ssi_sd_register_devices(void) |
|
249 |
{ |
|
250 |
ssi_register_slave("ssi-sd", sizeof(ssi_sd_state), &ssi_sd_info); |
|
251 |
} |
|
252 |
|
|
253 |
device_init(ssi_sd_register_devices) |
Also available in: Unified diff