r3736 - trunk/src/host/qemu-neo1973/hw

andrew at sita.openmoko.org andrew at sita.openmoko.org
Wed Dec 26 22:33:40 CET 2007


Author: andrew
Date: 2007-12-26 22:33:38 +0100 (Wed, 26 Dec 2007)
New Revision: 3736

Modified:
   trunk/src/host/qemu-neo1973/hw/ar6000.c
   trunk/src/host/qemu-neo1973/hw/s3c.h
   trunk/src/host/qemu-neo1973/hw/s3c2410.c
   trunk/src/host/qemu-neo1973/hw/s3c24xx_mmci.c
Log:
Add the S3C2440 register map for MMC/SD/SDIO host.
Set SDIO R4 Card-ready bit when card is ready.


Modified: trunk/src/host/qemu-neo1973/hw/ar6000.c
===================================================================
--- trunk/src/host/qemu-neo1973/hw/ar6000.c	2007-12-26 15:01:35 UTC (rev 3735)
+++ trunk/src/host/qemu-neo1973/hw/ar6000.c	2007-12-26 21:33:38 UTC (rev 3736)
@@ -156,6 +156,8 @@
     response[1] = (sd->ioocr >> 16) & 0xff;
     response[2] = (sd->ioocr >> 8) & 0xff;
     response[3] = (sd->ioocr >> 0) & 0xff;
+    if (sd->sdio_ok)
+        response[0] |= 1 << 7;
 }
 
 static void sd_response_r5_make(struct sdio_s *sd, uint8_t *response)

Modified: trunk/src/host/qemu-neo1973/hw/s3c.h
===================================================================
--- trunk/src/host/qemu-neo1973/hw/s3c.h	2007-12-26 15:01:35 UTC (rev 3735)
+++ trunk/src/host/qemu-neo1973/hw/s3c.h	2007-12-26 21:33:38 UTC (rev 3736)
@@ -157,7 +157,7 @@
 
 /* s3c24xx_mmci.c */
 struct s3c_mmci_state_s;
-struct s3c_mmci_state_s *s3c_mmci_init(target_phys_addr_t base,
+struct s3c_mmci_state_s *s3c_mmci_init(target_phys_addr_t base, uint16_t model,
                 struct sd_card_s *mmc, qemu_irq irq, qemu_irq *dma);
 void s3c_mmci_reset(struct s3c_mmci_state_s *s);
 

Modified: trunk/src/host/qemu-neo1973/hw/s3c2410.c
===================================================================
--- trunk/src/host/qemu-neo1973/hw/s3c2410.c	2007-12-26 15:01:35 UTC (rev 3735)
+++ trunk/src/host/qemu-neo1973/hw/s3c2410.c	2007-12-26 21:33:38 UTC (rev 3736)
@@ -2909,7 +2909,8 @@
                     s->irq[S3C_PIC_SPI0], s->drq[S3C_RQ_SPI0],
                     s->irq[S3C_PIC_SPI1], s->drq[S3C_RQ_SPI1], s->io);
 
-    s->mmci = s3c_mmci_init(0x5a000000, mmc, s->irq[S3C_PIC_SDI], s->drq);
+    s->mmci = s3c_mmci_init(0x5a000000, 0x2410, mmc,
+                    s->irq[S3C_PIC_SDI], s->drq);
 
     if (usb_enabled) {
         usb_ohci_init_memio(0x49000000, 3, -1, s->irq[S3C_PIC_USBH]);

Modified: trunk/src/host/qemu-neo1973/hw/s3c24xx_mmci.c
===================================================================
--- trunk/src/host/qemu-neo1973/hw/s3c24xx_mmci.c	2007-12-26 15:01:35 UTC (rev 3735)
+++ trunk/src/host/qemu-neo1973/hw/s3c24xx_mmci.c	2007-12-26 21:33:38 UTC (rev 3736)
@@ -37,6 +37,9 @@
     uint16_t dtimer;
     uint32_t mask;
     uint8_t prescaler;
+
+    uint16_t model;
+    const target_phys_addr_t *map;
 };
 
 void s3c_mmci_reset(struct s3c_mmci_state_s *s)
@@ -202,11 +205,16 @@
 #define S3C_SDIDAT	0x3c	/* SDI Data register */
 #define S3C_SDIMSK	0x40	/* SDI Interrupt Mask register */
 
+#define S3C_SDIMAX	0x40
+
 static uint32_t s3c_mmci_read(void *opaque, target_phys_addr_t addr)
 {
     struct s3c_mmci_state_s *s = (struct s3c_mmci_state_s *) opaque;
     uint32_t ret;
     addr -= s->base;
+    if (addr > S3C_SDIMAX)
+        goto bad_reg;
+    addr = s->map[addr];
 
     switch (addr) {
     case S3C_SDICON:
@@ -274,6 +282,7 @@
     case S3C_SDIMSK:
         return s->mask;
     default:
+    bad_reg:
         printf("%s: Bad register 0x%lx\n", __FUNCTION__, addr);
         break;
     }
@@ -285,6 +294,9 @@
 {
     struct s3c_mmci_state_s *s = (struct s3c_mmci_state_s *) opaque;
     addr -= s->base;
+    if (addr > S3C_SDIMAX)
+        goto bad_reg;
+    addr = s->map[addr];
 
     switch (addr) {
     case S3C_SDICON:
@@ -344,6 +356,7 @@
         s->mask = value & 0x3ffff;
         break;
     default:
+    bad_reg:
         printf("%s: Bad register 0x%lx\n", __FUNCTION__, addr);
     }
 }
@@ -401,6 +414,48 @@
     qemu_put_8s(f, &s->prescaler);
 }
 
+static const target_phys_addr_t s3c2410_regmap[S3C_SDIMAX + 1] = {
+    [0 ... S3C_SDIMAX] = -1,
+    [0x00] = S3C_SDICON,
+    [0x04] = S3C_SDIPRE,
+    [0x08] = S3C_SDICARG,
+    [0x0c] = S3C_SDICCON,
+    [0x10] = S3C_SDICSTA,
+    [0x14] = S3C_SDIRSP0,
+    [0x18] = S3C_SDIRSP1,
+    [0x1c] = S3C_SDIRSP2,
+    [0x20] = S3C_SDIRSP3,
+    [0x24] = S3C_SDIDTIMER,
+    [0x28] = S3C_SDIBSIZE,
+    [0x2c] = S3C_SDIDCON,
+    [0x30] = S3C_SDICNT,
+    [0x34] = S3C_SDIDSTA,
+    [0x38] = S3C_SDIFSTA,
+    [0x3c] = S3C_SDIDAT,
+    [0x40] = S3C_SDIMSK,
+};
+
+static const target_phys_addr_t s3c2440_regmap[S3C_SDIMAX + 1] = {
+    [0 ... S3C_SDIMAX] = -1,
+    [0x00] = S3C_SDICON,
+    [0x04] = S3C_SDIPRE,
+    [0x08] = S3C_SDICARG,
+    [0x0c] = S3C_SDICCON,
+    [0x10] = S3C_SDICSTA,
+    [0x14] = S3C_SDIRSP0,
+    [0x18] = S3C_SDIRSP1,
+    [0x1c] = S3C_SDIRSP2,
+    [0x20] = S3C_SDIRSP3,
+    [0x24] = S3C_SDIDTIMER,
+    [0x28] = S3C_SDIBSIZE,
+    [0x2c] = S3C_SDIDCON,
+    [0x30] = S3C_SDICNT,
+    [0x34] = S3C_SDIDSTA,
+    [0x38] = S3C_SDIFSTA,
+    [0x3c] = S3C_SDIMSK,
+    [0x40] = S3C_SDIDAT,
+};
+
 static int s3c_mmci_load(QEMUFile *f, void *opaque, int version_id)
 {
     struct s3c_mmci_state_s *s = (struct s3c_mmci_state_s *) opaque;
@@ -430,7 +485,7 @@
     return 0;
 }
 
-struct s3c_mmci_state_s *s3c_mmci_init(target_phys_addr_t base,
+struct s3c_mmci_state_s *s3c_mmci_init(target_phys_addr_t base, uint16_t model,
                 struct sd_card_s *mmc, qemu_irq irq, qemu_irq *dma)
 {
     int iomemtype;
@@ -445,6 +500,19 @@
     s->irq = irq;
     s->dma = dma;
     s->card = mmc;
+    s->model = model;
+    switch (model) {
+    case 0x2410:
+        s->map = s3c2410_regmap;
+        break;
+    case 0x2440:
+        s->map = s3c2440_regmap;
+        break;
+    default:
+        fprintf(stderr, "%s: unknown MMC/SD/SDIO HC model %04x\n",
+                        __FUNCTION__, model);
+        exit(-1);
+    }
 
     mmc->irq = qemu_allocate_irqs(s3c_mmci_cardirq, s, 1)[0];
 





More information about the commitlog mailing list