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