All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 2/2] Provide basic emulation for Sharp SL-6000 PDA (Tosa)
@ 2008-05-27 21:40 Dmitry Baryshkov
  0 siblings, 0 replies; only message in thread
From: Dmitry Baryshkov @ 2008-05-27 21:40 UTC (permalink / raw)
  To: qemu-devel

This adds basic support for emulating Sharp Zaurus SL-6000 PDA (tosa).
Currently it provides only basic support: no kbd/lcd, sound, ts, etc.
But it's able at least to boot Linux from CF.

Signed-off-by: Dmitry Baryshkov <dbaryshkov@gmail.com>
---
 Makefile.target      |    1 +
 hw/boards.h          |    3 +
 hw/tosa.c            |  159 ++++++++++++++++++++++++++++++++++++++++++++++++++
 target-arm/machine.c |    1 +
 4 files changed, 164 insertions(+), 0 deletions(-)
 create mode 100644 hw/tosa.c

diff --git a/Makefile.target b/Makefile.target
index 553b7f0..645afaa 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -628,6 +628,7 @@ OBJS+= nseries.o blizzard.o onenand.o vga.o cbus.o tusb6010.o usb-musb.o
 OBJS+= tsc2005.o
 OBJS+= mst_fpga.o mainstone.o
 OBJS+= musicpal.o pflash_cfi02.o
+OBJS+= tosa.o
 CPPFLAGS += -DHAS_AUDIO
 endif
 ifeq ($(TARGET_BASE_ARCH), sh4)
diff --git a/hw/boards.h b/hw/boards.h
index 2d67a70..eacd324 100644
--- a/hw/boards.h
+++ b/hw/boards.h
@@ -111,4 +111,7 @@ extern QEMUMachine mainstone2_machine;
 /* musicpal.c */
 extern QEMUMachine musicpal_machine;
 
+/* tosa.c */
+extern QEMUMachine tosapda_machine;
+
 #endif
diff --git a/hw/tosa.c b/hw/tosa.c
new file mode 100644
index 0000000..0531263
--- /dev/null
+++ b/hw/tosa.c
@@ -0,0 +1,159 @@
+/* vim:set shiftwidth=4 ts=4 et: */
+/*
+ * PXA255 Sharp Zaurus SL-6000 PDA platform
+ *
+ * Copyright (c) 2008 Dmitry Baryshkov
+ *
+ * Code based on spitz platform by Andrzej Zaborowski <balrog@zabor.org>
+ * This code is licensed under the GNU GPL v2.
+ */
+
+#include "hw.h"
+#include "pxa.h"
+#include "arm-misc.h"
+#include "sysemu.h"
+#include "sharpsl.h"
+#include "pcmcia.h"
+#include "block.h"
+#include "boards.h"
+
+#define TOSA_RAM    0x04000000
+#define TOSA_ROM	0x00800000
+
+#define TOSA_GPIO_nSD_DETECT		(9)
+#define TOSA_GPIO_ON_RESET		(19)
+#define TOSA_GPIO_CF_IRQ		(21)	/* CF slot0 Ready */
+#define TOSA_GPIO_CF_CD			(13)
+#define TOSA_GPIO_JC_CF_IRQ		(36)	/* CF slot1 Ready */
+
+#define TOSA_SCOOP_GPIO_BASE		0
+#define TOSA_GPIO_IR_POWERDWN		(TOSA_SCOOP_GPIO_BASE + 2)
+#define TOSA_GPIO_SD_WP			(TOSA_SCOOP_GPIO_BASE + 3)
+#define TOSA_GPIO_PWR_ON		(TOSA_SCOOP_GPIO_BASE + 4)
+
+struct tc6393xb_s {
+    target_phys_addr_t target_base;
+};
+
+static uint32_t tc6393xb_readb(void *opaque, target_phys_addr_t addr)
+{
+    return 3;
+}
+static void tc6393xb_writeb(void *opaque, target_phys_addr_t addr, uint32_t value)
+{
+}
+static void tosa_tc6393xb_register(struct pxa2xx_state_s *cpu)
+{
+    int iomemtype;
+    struct tc6393xb_s *s;
+    CPUReadMemoryFunc *tc6393xb_readfn[] = {
+        tc6393xb_readb,
+        tc6393xb_readb,
+        tc6393xb_readb,
+    };
+    CPUWriteMemoryFunc *tc6393xb_writefn[] = {
+        tc6393xb_writeb,
+        tc6393xb_writeb,
+        tc6393xb_writeb,
+    };
+
+    s = (struct tc6393xb_s *) qemu_mallocz(sizeof(struct tc6393xb_s));
+    s->target_base = 0x10000000;
+
+    iomemtype = cpu_register_io_memory(0, tc6393xb_readfn,
+                    tc6393xb_writefn, s);
+    cpu_register_physical_memory(s->target_base, 0x200000, iomemtype);
+}
+
+static void tosa_microdrive_attach(struct pxa2xx_state_s *cpu)
+{
+    struct pcmcia_card_s *md;
+    int index;
+    BlockDriverState *bs;
+
+    index = drive_get_index(IF_IDE, 0, 0);
+    if (index == -1)
+        return;
+    bs = drives_table[index].bdrv;
+    if (bdrv_is_inserted(bs) && !bdrv_is_removable(bs)) {
+        md = dscm1xxxx_init(bs);
+        pxa2xx_pcmcia_attach(cpu->pcmcia[0], md);
+    }
+}
+
+static void tosa_gpio_setup(struct pxa2xx_state_s *cpu,
+                struct scoop_info_s *scp0,
+                struct scoop_info_s *scp1)
+{
+    /* MMC/SD host */
+    pxa2xx_mmci_handlers(cpu->mmc,
+                    scoop_gpio_in_get(scp0)[TOSA_GPIO_SD_WP],
+                    qemu_irq_invert(pxa2xx_gpio_in_get(cpu->gpio)[TOSA_GPIO_nSD_DETECT]));
+
+    /* Handle reset */
+    pxa2xx_gpio_out_set(cpu->gpio, TOSA_GPIO_ON_RESET, cpu->reset);
+
+    /* PCMCIA signals: card's IRQ and Card-Detect */
+    pxa2xx_pcmcia_set_irq_cb(cpu->pcmcia[0],
+                        pxa2xx_gpio_in_get(cpu->gpio)[TOSA_GPIO_CF_IRQ],
+                        pxa2xx_gpio_in_get(cpu->gpio)[TOSA_GPIO_CF_CD]);
+
+    pxa2xx_pcmcia_set_irq_cb(cpu->pcmcia[1],
+                        pxa2xx_gpio_in_get(cpu->gpio)[TOSA_GPIO_JC_CF_IRQ],
+                        NULL);
+
+}
+
+static struct arm_boot_info tosa_binfo = {
+    .loader_start = PXA2XX_SDRAM_BASE,
+    .ram_size = 0x04000000,
+};
+
+static void tosa_init(ram_addr_t ram_size, int vga_ram_size,
+                const char *boot_device, DisplayState *ds,
+                const char *kernel_filename, const char *kernel_cmdline,
+                const char *initrd_filename, const char *cpu_model)
+{
+    struct pxa2xx_state_s *cpu;
+    struct scoop_info_s *scp0, *scp1;
+
+    if (ram_size < (TOSA_RAM + TOSA_ROM + PXA2XX_INTERNAL_SIZE)) {
+        fprintf(stderr, "This platform requires %i bytes of memory\n",
+                TOSA_RAM + TOSA_ROM + PXA2XX_INTERNAL_SIZE);
+        exit(1);
+    }
+
+    if (!cpu_model)
+        cpu_model = "pxa255";
+
+    cpu = pxa255_init(tosa_binfo.ram_size, ds);
+
+    cpu_register_physical_memory(0, TOSA_ROM,
+                    qemu_ram_alloc(TOSA_ROM) | IO_MEM_ROM);
+
+    tosa_tc6393xb_register(cpu);
+
+    scp0 = scoop_init(cpu, 0, 0x08800000);
+    scp1 = scoop_init(cpu, 1, 0x14800040);
+
+    tosa_gpio_setup(cpu, scp0, scp1);
+
+    tosa_microdrive_attach(cpu);
+
+    /* Setup initial (reset) machine state */
+    cpu->env->regs[15] = tosa_binfo.loader_start;
+
+    tosa_binfo.kernel_filename = kernel_filename;
+    tosa_binfo.kernel_cmdline = kernel_cmdline;
+    tosa_binfo.initrd_filename = initrd_filename;
+    tosa_binfo.board_id = 0x208;
+    arm_load_kernel(cpu->env, &tosa_binfo);
+    sl_bootparam_write(SL_PXA_PARAM_BASE - PXA2XX_SDRAM_BASE);
+}
+
+QEMUMachine tosapda_machine = {
+    "tosa",
+    "Tosa PDA (PXA255)",
+    tosa_init,
+    TOSA_RAM + TOSA_ROM + PXA2XX_INTERNAL_SIZE + RAMSIZE_FIXED,
+};
diff --git a/target-arm/machine.c b/target-arm/machine.c
index 5a5ed70..6637e72 100644
--- a/target-arm/machine.c
+++ b/target-arm/machine.c
@@ -20,6 +20,7 @@ void register_machines(void)
     qemu_register_machine(&verdex_machine);
     qemu_register_machine(&mainstone2_machine);
     qemu_register_machine(&musicpal_machine);
+    qemu_register_machine(&tosapda_machine);
 }
 
 void cpu_save(QEMUFile *f, void *opaque)
-- 
1.5.5.1


-- 
With best wishes
Dmitry

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2008-05-29 10:23 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-05-27 21:40 [Qemu-devel] [PATCH 2/2] Provide basic emulation for Sharp SL-6000 PDA (Tosa) Dmitry Baryshkov

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.