r3554 - trunk/src/host/qemu-neo1973/hw
andrew at sita.openmoko.org
andrew at sita.openmoko.org
Tue Dec 4 00:16:10 CET 2007
Author: andrew
Date: 2007-12-04 00:16:08 +0100 (Tue, 04 Dec 2007)
New Revision: 3554
Modified:
trunk/src/host/qemu-neo1973/hw/omap_mmc.c
trunk/src/host/qemu-neo1973/hw/pl181.c
trunk/src/host/qemu-neo1973/hw/pxa2xx_mmci.c
trunk/src/host/qemu-neo1973/hw/s3c24xx_mmci.c
trunk/src/host/qemu-neo1973/hw/sd.c
trunk/src/host/qemu-neo1973/hw/sd.h
trunk/src/host/qemu-neo1973/hw/ssi-sd.c
Log:
Genericise SD bus to allow cards other than SD flash storage.
Modified: trunk/src/host/qemu-neo1973/hw/omap_mmc.c
===================================================================
--- trunk/src/host/qemu-neo1973/hw/omap_mmc.c 2007-12-03 14:49:48 UTC (rev 3553)
+++ trunk/src/host/qemu-neo1973/hw/omap_mmc.c 2007-12-03 23:16:08 UTC (rev 3554)
@@ -27,7 +27,7 @@
qemu_irq irq;
qemu_irq *dma;
omap_clk clk;
- SDState *card;
+ struct sd_card_s *card;
uint16_t last_cmd;
uint16_t sdio;
uint16_t rsp[8];
Modified: trunk/src/host/qemu-neo1973/hw/pl181.c
===================================================================
--- trunk/src/host/qemu-neo1973/hw/pl181.c 2007-12-03 14:49:48 UTC (rev 3553)
+++ trunk/src/host/qemu-neo1973/hw/pl181.c 2007-12-03 23:16:08 UTC (rev 3554)
@@ -23,7 +23,7 @@
#define PL181_FIFO_LEN 16
typedef struct {
- SDState *card;
+ sd_card *card;
uint32_t base;
uint32_t clock;
uint32_t power;
Modified: trunk/src/host/qemu-neo1973/hw/pxa2xx_mmci.c
===================================================================
--- trunk/src/host/qemu-neo1973/hw/pxa2xx_mmci.c 2007-12-03 14:49:48 UTC (rev 3553)
+++ trunk/src/host/qemu-neo1973/hw/pxa2xx_mmci.c 2007-12-03 23:16:08 UTC (rev 3554)
@@ -16,7 +16,7 @@
qemu_irq irq;
void *dma;
- SDState *card;
+ struct sd_card_s *card;
uint32_t status;
uint32_t clkrt;
Modified: trunk/src/host/qemu-neo1973/hw/s3c24xx_mmci.c
===================================================================
--- trunk/src/host/qemu-neo1973/hw/s3c24xx_mmci.c 2007-12-03 14:49:48 UTC (rev 3553)
+++ trunk/src/host/qemu-neo1973/hw/s3c24xx_mmci.c 2007-12-03 23:16:08 UTC (rev 3554)
@@ -16,7 +16,7 @@
qemu_irq irq;
qemu_irq *dma;
- SDState *card;
+ struct sd_card_s *card;
int blklen;
int blknum;
Modified: trunk/src/host/qemu-neo1973/hw/sd.c
===================================================================
--- trunk/src/host/qemu-neo1973/hw/sd.c 2007-12-03 14:49:48 UTC (rev 3553)
+++ trunk/src/host/qemu-neo1973/hw/sd.c 2007-12-03 23:16:08 UTC (rev 3554)
@@ -42,6 +42,8 @@
#define DPRINTF(fmt, args...) do {} while(0)
#endif
+typedef struct SDState SDState;
+
typedef enum {
sd_r0 = 0, /* no response */
sd_r1, /* normal response command */
@@ -96,6 +98,7 @@
qemu_irq readonly_cb;
qemu_irq inserted_cb;
BlockDriverState *bdrv;
+ struct sd_card_s card;
};
static void sd_set_status(SDState *sd)
@@ -396,29 +399,6 @@
}
}
-/* We do not model the chip select pin, so allow the board to select
- whether card should be in SSI or MMC/SD mode. It is also up to the
- board to ensure that ssi transfers only occur when the chip select
- is asserted. */
-SDState *sd_init(BlockDriverState *bs, int is_spi)
-{
- SDState *sd;
-
- sd = (SDState *) qemu_mallocz(sizeof(SDState));
- sd->spi = is_spi;
- sd_reset(sd, bs);
- bdrv_set_change_cb(sd->bdrv, sd_cardchange, sd);
- return sd;
-}
-
-void sd_set_cb(SDState *sd, qemu_irq readonly, qemu_irq insert)
-{
- sd->readonly_cb = readonly;
- sd->inserted_cb = insert;
- qemu_set_irq(readonly, bdrv_is_read_only(sd->bdrv));
- qemu_set_irq(insert, bdrv_is_inserted(sd->bdrv));
-}
-
static void sd_erase(SDState *sd)
{
int i, start, end;
@@ -559,8 +539,7 @@
sd->card_status &= ~CARD_IS_LOCKED;
}
-static sd_rsp_type_t sd_normal_command(SDState *sd,
- struct sd_request_s req)
+static sd_rsp_type_t sd_normal_command(SDState *sd, struct sd_request_s req)
{
uint32_t rca = 0x0000;
@@ -1079,8 +1058,8 @@
return sd_r0;
}
-static sd_rsp_type_t sd_app_command(SDState *sd,
- struct sd_request_s req) {
+static sd_rsp_type_t sd_app_command(SDState *sd, struct sd_request_s req)
+{
uint32_t rca;
if (sd_cmd_type[req.cmd] == sd_ac || sd_cmd_type[req.cmd] == sd_adtc)
@@ -1189,8 +1168,9 @@
return sd_r0;
}
-int sd_do_command(SDState *sd, struct sd_request_s *req,
- uint8_t *response) {
+static int _sd_do_command(SDState *sd, struct sd_request_s *req,
+ uint8_t *response)
+{
uint32_t last_status = sd->card_status;
sd_rsp_type_t rtype;
int rsplen;
@@ -1342,7 +1322,7 @@
#define APP_READ_BLOCK(a, len) memset(sd->data, 0xec, len)
#define APP_WRITE_BLOCK(a, len)
-void sd_write_data(SDState *sd, uint8_t value)
+static void _sd_write_data(SDState *sd, uint8_t value)
{
int i;
@@ -1463,7 +1443,7 @@
}
}
-uint8_t sd_read_data(SDState *sd)
+static uint8_t _sd_read_data(SDState *sd)
{
/* TODO: Append CRCs */
uint8_t ret;
@@ -1579,7 +1559,38 @@
return ret;
}
-int sd_data_ready(SDState *sd)
+static int _sd_data_ready(SDState *sd)
{
return sd->state == sd_sendingdata_state;
}
+
+/* We do not model the chip select pin, so allow the board to select
+ whether card should be in SSI or MMC/SD mode. It is also up to the
+ board to ensure that ssi transfers only occur when the chip select
+ is asserted. */
+struct sd_card_s *sd_init(BlockDriverState *bs, int is_spi)
+{
+ SDState *sd;
+
+ sd = (SDState *) qemu_mallocz(sizeof(SDState));
+ sd->spi = is_spi;
+ sd_reset(sd, bs);
+ bdrv_set_change_cb(sd->bdrv, sd_cardchange, sd);
+
+ sd->card.opaque = sd;
+ sd->card.do_command = (void *) _sd_do_command;
+ sd->card.write_data = (void *) _sd_write_data;
+ sd->card.read_data = (void *) _sd_read_data;
+ sd->card.data_ready = (void *) _sd_data_ready;
+ return &sd->card;
+}
+
+void sd_set_cb(struct sd_card_s *card, qemu_irq readonly, qemu_irq insert)
+{
+ SDState *sd = (SDState *) card->opaque;
+
+ sd->readonly_cb = readonly;
+ sd->inserted_cb = insert;
+ qemu_set_irq(readonly, bdrv_is_read_only(sd->bdrv));
+ qemu_set_irq(insert, bdrv_is_inserted(sd->bdrv));
+}
Modified: trunk/src/host/qemu-neo1973/hw/sd.h
===================================================================
--- trunk/src/host/qemu-neo1973/hw/sd.h 2007-12-03 14:49:48 UTC (rev 3553)
+++ trunk/src/host/qemu-neo1973/hw/sd.h 2007-12-03 23:16:08 UTC (rev 3554)
@@ -1,7 +1,7 @@
/*
- * SD Memory Card emulation. Mostly correct for MMC too.
+ * MMC bus cards emulation. Used for MMC/SD/SDIO.
*
- * Copyright (c) 2006 Andrzej Zaborowski <balrog at zabor.org>
+ * Copyright (c) 2006-2007 Andrzej Zaborowski <balrog at zabor.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -65,16 +65,41 @@
uint8_t crc;
};
-typedef struct SDState SDState;
+typedef struct sd_card_s {
+ void *opaque;
+ int (*do_command)(void *opaque, struct sd_request_s *req,
+ uint8_t *response);
+ void (*write_data)(void *opaque, uint8_t value);
+ uint8_t (*read_data)(void *opaque);
+ int (*data_ready)(void *opaque);
+ qemu_irq irq;
+} sd_card;
-SDState *sd_init(BlockDriverState *bs, int is_spi);
-int sd_do_command(SDState *sd, struct sd_request_s *req,
- uint8_t *response);
-void sd_write_data(SDState *sd, uint8_t value);
-uint8_t sd_read_data(SDState *sd);
-void sd_set_cb(SDState *sd, qemu_irq readonly, qemu_irq insert);
-int sd_data_ready(SDState *sd);
+static inline int sd_do_command(struct sd_card_s *sd, struct sd_request_s *req,
+ uint8_t *response)
+{
+ return sd->do_command(sd->opaque, req, response);
+}
+static inline void sd_write_data(struct sd_card_s *sd, uint8_t value)
+{
+ sd->write_data(sd->opaque, value);
+}
+
+static inline uint8_t sd_read_data(struct sd_card_s *sd)
+{
+ return sd->read_data(sd->opaque);
+}
+
+static inline int sd_data_ready(struct sd_card_s *sd)
+{
+ return sd->data_ready(sd->opaque);
+}
+
+/* sd.c */
+struct sd_card_s *sd_init(BlockDriverState *bs, int is_spi);
+void sd_set_cb(struct sd_card_s *sd, qemu_irq readonly, qemu_irq insert);
+
/* ssi-sd.c */
int ssi_sd_xfer(void *opaque, int val);
void *ssi_sd_init(BlockDriverState *bs);
Modified: trunk/src/host/qemu-neo1973/hw/ssi-sd.c
===================================================================
--- trunk/src/host/qemu-neo1973/hw/ssi-sd.c 2007-12-03 14:49:48 UTC (rev 3553)
+++ trunk/src/host/qemu-neo1973/hw/ssi-sd.c 2007-12-03 23:16:08 UTC (rev 3554)
@@ -39,7 +39,7 @@
int arglen;
int response_pos;
int stopping;
- SDState *sd;
+ sd_card *sd;
} ssi_sd_state;
/* State word bits. */
More information about the commitlog
mailing list