Patchwork [v6,5/5] FreeSCALE i.MX31 support: KZM-ARM11-01 evaluation board

login
register
mail settings
Submitter Peter Chubb
Date April 22, 2012, 11:31 p.m.
Message ID <20120422234101.066878707@nicta.com.au>
Download mbox | patch
Permalink /patch/154309/
State New
Headers show

Comments

Peter Chubb - April 22, 2012, 11:31 p.m.
Board support for Kyoto Micro's KZM-ARM11-01, an evaluation board built
around the FreeScale i.MX31.


Signed-off-by: Philip O'Sullivan <philipo@ok-labs.com>
Signed-off-by: Peter Chubb <peter.chubb@nicta.com.au>

---
 Makefile.target |    2 
 hw/kzm.c        |  161 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 162 insertions(+), 1 deletion(-)
 create mode 100644 hw/kzm.c
Peter Maydell - April 23, 2012, 3:58 p.m.
On 23 April 2012 00:31, Peter Chubb <peter.chubb@nicta.com.au> wrote:
> Board support for Kyoto Micro's KZM-ARM11-01, an evaluation board built
> around the FreeScale i.MX31.

> +    if (serial_hds[3]) {
> +        serial_mm_init(address_space_mem, KZM_FPGA, 0,
> +                       qdev_get_gpio_in(dev, 52),
> +                       14745600, serial_hds[3],
> +                       DEVICE_NATIVE_ENDIAN);
> +    }
> +    if (serial_hds[2]) { /* touchscreen */
> +        serial_mm_init(address_space_mem, KZM_FPGA+0x10, 0,
> +                       qdev_get_gpio_in(dev, 52),
> +                       14745600, serial_hds[2],
> +                       DEVICE_NATIVE_ENDIAN);
> +    }

Are these two devices really on the same IRQ?

-- PMM
Peter Chubb - April 23, 2012, 10:21 p.m.
>>>>> "Peter" == Peter Maydell <peter.maydell@linaro.org> writes:

Peter> On 23 April 2012 00:31, Peter Chubb <peter.chubb@nicta.com.au>
Peter> wrote:
>> Board support for Kyoto Micro's KZM-ARM11-01, an evaluation board
>> built around the FreeScale i.MX31.

>> +    if (serial_hds[3]) { 
>> +         serial_mm_init(address_space_mem, KZM_FPGA, 0, 
>> +                        qdev_get_gpio_in(dev, 52), 
>> +                       14745600, serial_hds[3], 
>> +                       DEVICE_NATIVE_ENDIAN); 
>> +     } 
>> +    if (serial_hds[2]) { /* touchscreen */ 
>> +        serial_mm_init(address_space_mem, KZM_FPGA+0x10, 0, 
>> +                       qdev_get_gpio_in(dev, 52), 
>> +                       14745600, serial_hds[2], 
>> +                       DEVICE_NATIVE_ENDIAN); 
>> +    }

Peter> Are these two devices really on the same IRQ?

Yes.  A single interrupt line comes from the FPGA into the AVIC.
Inside the FPGA the interrupts for the UARTs, SD card and NAND flash
are connected to that single interrupt line.
The non-touchscreen FPGA UART isn't mentioned in the KZM manual, but
is available on the board as a debug port.

To avoid confusion I think I'll just get rid of it.


--
Dr Peter Chubb				        peter.chubb AT nicta.com.au
http://www.ssrg.nicta.com.au          Software Systems Research Group/NICTA
Peter Maydell - April 24, 2012, 1:48 p.m.
On 23 April 2012 23:21, Peter Chubb <peter.chubb@nicta.com.au> wrote:
> Peter> Are these two devices really on the same IRQ?
>
> Yes.  A single interrupt line comes from the FPGA into the AVIC.
> Inside the FPGA the interrupts for the UARTs, SD card and NAND flash
> are connected to that single interrupt line.
> The non-touchscreen FPGA UART isn't mentioned in the KZM manual, but
> is available on the board as a debug port.
>
> To avoid confusion I think I'll just get rid of it.

Up to you. A comment would be fine if you'd rather keep the device.

-- PMM
Paul Brook - April 25, 2012, 1:09 p.m.
> On 23 April 2012 23:21, Peter Chubb <peter.chubb@nicta.com.au> wrote:
> > Peter> Are these two devices really on the same IRQ?
> > 
> > Yes.  A single interrupt line comes from the FPGA into the AVIC.
> > Inside the FPGA the interrupts for the UARTs, SD card and NAND flash
> > are connected to that single interrupt line.
> > The non-touchscreen FPGA UART isn't mentioned in the KZM manual, but
> > is available on the board as a debug port.
> > 
> > To avoid confusion I think I'll just get rid of it.
> 
> Up to you. A comment would be fine if you'd rather keep the device.

No it's not.  You must never connect multiple devices to the same IRQ.  You 
need an explicit mux in between.

Paul

Patch

Index: qemu-working/hw/kzm.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ qemu-working/hw/kzm.c	2012-04-23 08:24:56.380974317 +1000
@@ -0,0 +1,161 @@ 
+/*
+ * KZM Board System emulation.
+ *
+ * Copyright (c) 2008 OKL and 2011 NICTA
+ * Written by Hans
+ * Updated by Peter Chubb.
+ *
+ * This code is licenced under the GPL, version 2 or later.
+ * See the file `COPYING' in the top level directory.
+ *
+ * It (partially) emulates a Kyoto Microcomputer
+ * KZM-ARM11-01 evaluation board, with a FreeScale
+ * I.MX31 SoC
+ */
+
+#include "sysbus.h"
+#include "exec-memory.h"
+#include "hw.h"
+#include "arm-misc.h"
+#include "devices.h"
+#include "net.h"
+#include "sysemu.h"
+#include "boards.h"
+#include "pc.h" /* for the FPGA UART that emulates a 16550 */
+#include "imx.h"
+
+    /* Memory map for Kzm Emulation Baseboard:
+     * 0x00000000-0x00003fff 16k secure ROM       IGNORED
+     * 0x00004000-0x00407fff Reserved             IGNORED
+     * 0x00404000-0x00407fff ROM                  IGNORED
+     * 0x00408000-0x0fffffff Reserved             IGNORED
+     * 0x10000000-0x1fffbfff RAM aliasing         IGNORED
+     * 0x1fffc000-0x1fffffff RAM                  EMULATED
+     * 0x20000000-0x2fffffff Reserved             IGNORED
+     * 0x30000000-0x7fffffff I.MX31 Internal Register Space
+     *   0x43f00000 IO_AREA0
+     *   0x43f90000 UART1                         EMULATED
+     *   0x43f94000 UART2                         EMULATED
+     *   0x68000000 AVIC                          EMULATED
+     *   0x53f80000 CCM                           EMULATED
+     *   0x53f94000 PIT 1                         EMULATED
+     *   0x53f98000 PIT 2                         EMULATED
+     *   0x53f90000 GPT                           EMULATED
+     * 0x80000000-0x87ffffff RAM                  EMULATED
+     * 0x88000000-0x8fffffff RAM Aliasing         EMULATED
+     * 0xa0000000-0xafffffff NAND Flash           IGNORED
+     * 0xb0000000-0xb3ffffff Unavailable          IGNORED
+     * 0xb4000000-0xb4000fff 8-bit free space     IGNORED
+     * 0xb4001000-0xb400100f Board control        IGNORED
+     *  0xb4001003           DIP switch
+     * 0xb4001010-0xb400101f 7-segment LED        IGNORED
+     * 0xb4001020-0xb400102f LED                  IGNORED
+     * 0xb4001030-0xb400103f LED                  IGNORED
+     * 0xb4001040-0xb400104f FPGA, UART           EMULATED
+     * 0xb4001050-0xb400105f FPGA, UART           EMULATED
+     * 0xb4001060-0xb40fffff FPGA                 IGNORED
+     * 0xb6000000-0xb61fffff LAN controller       EMULATED
+     * 0xb6200000-0xb62fffff FPGA NAND Controller IGNORED
+     * 0xb6300000-0xb7ffffff Free                 IGNORED
+     * 0xb8000000-0xb8004fff Memory control registers IGNORED
+     * 0xc0000000-0xc3ffffff PCMCIA/CF            IGNORED
+     * 0xc4000000-0xffffffff Reserved             IGNORED
+     */
+
+#define KZM_RAMADDRESS (0x80000000)
+#define KZM_FPGA       (0xb4001040)
+
+static struct arm_boot_info kzm_binfo = {
+    .loader_start = KZM_RAMADDRESS,
+    .board_id = 1722,
+};
+
+static void kzm_init(ram_addr_t ram_size,
+                     const char *boot_device,
+                     const char *kernel_filename, const char *kernel_cmdline,
+                     const char *initrd_filename, const char *cpu_model)
+{
+    CPUARMState *env;
+    MemoryRegion *address_space_mem = get_system_memory();
+    MemoryRegion *ram = g_new(MemoryRegion, 1);
+    MemoryRegion *sram = g_new(MemoryRegion, 1);
+    MemoryRegion *ram_alias = g_new(MemoryRegion, 1);
+    qemu_irq *cpu_pic;
+    DeviceState *dev;
+    DeviceState *ccm;
+
+    if (!cpu_model) {
+        cpu_model = "arm1136";
+    }
+
+    env = cpu_init(cpu_model);
+    if (!env) {
+        fprintf(stderr, "Unable to find CPU definition\n");
+        exit(1);
+    }
+
+    /* On a real system, the first 16k is a `secure boot rom' */
+
+    memory_region_init_ram(ram, "kzm.ram", ram_size);
+    vmstate_register_ram_global(ram);
+    memory_region_add_subregion(address_space_mem, KZM_RAMADDRESS, ram);
+
+    memory_region_init_alias(ram_alias, "ram.alias", ram, 0, ram_size);
+    memory_region_add_subregion(address_space_mem, 0x88000000, ram_alias);
+
+    memory_region_init_ram(sram, "kzm.sram", 0x4000);
+    memory_region_add_subregion(address_space_mem, 0x1FFFC000, sram);
+
+
+    cpu_pic = arm_pic_init_cpu(env);
+    dev = sysbus_create_varargs("imx_avic", 0x68000000,
+                               cpu_pic[ARM_PIC_CPU_IRQ],
+                               cpu_pic[ARM_PIC_CPU_FIQ], NULL);
+
+
+    imx_serial_create(0,  0x43f90000, qdev_get_gpio_in(dev, 45));
+    imx_serial_create(1,  0x43f94000, qdev_get_gpio_in(dev, 32));
+
+    ccm = sysbus_create_simple("imx_ccm", 0x53f80000, NULL);
+
+    imx_timerp_create(0x53f94000, qdev_get_gpio_in(dev, 28), ccm);
+    imx_timerp_create(0x53f98000, qdev_get_gpio_in(dev, 27), ccm);
+    imx_timerg_create(0x53f90000, qdev_get_gpio_in(dev, 29), ccm);
+
+    if (nd_table[0].vlan) {
+        lan9118_init(&nd_table[0], 0xb6000000, qdev_get_gpio_in(dev, 52));
+    }
+
+    if (serial_hds[3]) {
+        serial_mm_init(address_space_mem, KZM_FPGA, 0,
+                       qdev_get_gpio_in(dev, 52),
+                       14745600, serial_hds[3],
+                       DEVICE_NATIVE_ENDIAN);
+    }
+    if (serial_hds[2]) { /* touchscreen */
+        serial_mm_init(address_space_mem, KZM_FPGA+0x10, 0,
+                       qdev_get_gpio_in(dev, 52),
+                       14745600, serial_hds[2],
+                       DEVICE_NATIVE_ENDIAN);
+    }
+
+    kzm_binfo.ram_size = ram_size;
+    kzm_binfo.kernel_filename = kernel_filename;
+    kzm_binfo.kernel_cmdline = kernel_cmdline;
+    kzm_binfo.initrd_filename = initrd_filename;
+    kzm_binfo.nb_cpus = 1;
+    arm_load_kernel(first_cpu, &kzm_binfo);
+}
+
+static QEMUMachine kzm_machine = {
+    .name = "kzm",
+    .desc = "ARM KZM Emulation Baseboard (ARM1136)",
+    .init = kzm_init,
+};
+
+static void kzm_machine_init(void)
+{
+    qemu_register_machine(&kzm_machine);
+}
+
+machine_init(kzm_machine_init);
Index: qemu-working/Makefile.target
===================================================================
--- qemu-working.orig/Makefile.target	2012-04-23 08:24:55.545184409 +1000
+++ qemu-working/Makefile.target	2012-04-23 08:24:56.380974317 +1000
@@ -399,7 +399,7 @@  obj-arm-y += vexpress.o
 obj-arm-y += strongarm.o
 obj-arm-y += collie.o
 obj-arm-y += pl041.o lm4549.o
-obj-arm-y += imx_serial.o imx_ccm.o imx_timer.o imx_avic.o
+obj-arm-y += imx_serial.o imx_ccm.o imx_timer.o imx_avic.o kzm.o
 obj-arm-$(CONFIG_FDT) += device_tree.o
 
 obj-sh4-y = shix.o r2d.o sh7750.o sh7750_regnames.o tc58128.o