All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/6] hw/arm: add initial support for Canon DIGIC SoC
@ 2013-12-16 10:02 Antony Pavlov
  2013-12-16 10:02 ` [Qemu-devel] [PATCH 1/6] hw/arm: add very " Antony Pavlov
                   ` (6 more replies)
  0 siblings, 7 replies; 8+ messages in thread
From: Antony Pavlov @ 2013-12-16 10:02 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Maydell, Peter Crosthwaite, Giovanni Condello, g3gg0,
	Alex Dumitrache, Paul Brook, Paolo Bonzini, Andreas Färber,
	Antony Pavlov

Changes since v9:
 1. rebase over Peter Crosthwaite's "Fix Support for ARM CBAR and
    reset-hivecs" v5 patch series
 2. qom-test: add "canon-a1100" to arm machines list
 3. include a diffstat in the cover letter (--cover-letter option)
 4. fix patches timestamp

Changes since v8:
 1. digic-timer: move hardware-related macros to the header file
 2. digic-timer: use extract32 instead of & >> logic
 3. digic-timer, digic-uart: move header files to include/hw/...
 4. digic-timer, digic-uart: fix other trivial stuff
    fix emptyline; also add "/*< private >*/" and "/*< public >*/"
 5. fix patches timestamp

Changes since v7:
 1. change "fprintf(stderr," -> "error_report("
    (thanks to Peter Crosthwaite)
 2. fix digic_timer
    * use ptimer in continuous mode according to Peter Crosthwaite's
      recommendations;
    * implement the 'control' and 'reload value' registers.
 3. fix patches timestamp

Changes since v6:
 1. rebase over Peter Crosthwaite's "Fix Support for ARM CBAR and
    reset-hivecs" v4 patch series
 2. digic_boards: drop start_addr
    so the line 's->digic->cpu.env.regs[15] = board->start_addr;' has gone
 3. hw/arc/digic: use "reset-hivecs" ARM CPU property
 4. add a record to the MAINTAINERS file

Changes since v5:
 1. rebase over latest master
 2. digic_timer: add a reset function
 3. digic_timer: add a VMStateDescription
 4. digic_timer: fix whitespaces
 5. digic_boards: fix whitespaces
 6. move misplaced DIGIC_ROM* definitions
    to the "hw/arm/digic: add NOR ROM support" patch

Changes since v4:
 1. digic.h: parent_obj: change type Object -> DeviceState
 2. digic-uart: drop reg array
 3. digic_boards: fix K8P3215UQB comment
 4. Makefile: place digic stuff in own line
 5. drop cpu-qom.h inclusion
 6. digic.h: add private/public labels
 7. digic.h: fix guard macro
 8. move base address macros to digic.c
 9. fix header comments

Changes since v3:
 1. fix typos and formatting
 2. digic-timer: drop DPRINTF
 3. digic-timer: fix DIGIC4_TIMER_BASE() macro
 4. digic.c: fix max timer device string

Changes since v2:
 1. rebase over latest master;
   * pass available size to object_initialize().
 2. digic-uart: qemu_log: use LOG_UNIMP instead LOG_GUEST_ERROR;
 3. digic-boards: update rom image load code: introduce digic_load_rom().

Changes since v1:
 0. drop the "add ARM946E-S CPU" patch;
 1. convert to QOM, split DIGIC SoC code and board code
    (thanks to Andreas Fa:rber, Peter Maydell and Peter Crosthwaite);
 2. fix digic-uart (many thanks to Peter Crosthwaite
    for his comments);
 3. digic-boards: digic4_add_k8p3215uqb_rom(): update
    rom image load code: use the '-bios' option.

DIGIC is Canon Inc.'s name for a family of SoC
for digital cameras and camcorders.

See http://en.wikipedia.org/wiki/DIGIC for details.

There is no publicly available specification for
DIGIC chips. All information about DIGIC chip
internals is based on reverse engineering efforts
made by CHDK (http://chdk.wikia.com) and
Magic Lantern (http://www.magiclantern.fm) projects
contributors.

Also this patch series adds initial support for Canon
PowerShot A1100 IS compact camera (it is my only camera
with connected UART interface). As the DIGIC-based cameras
differences mostly are insignificant (e.g. RAM-size,
ROM type and size, GPIO usage) the other compact
and DSLR cameras support can be easily added.

This DIGIC support patch series is inspired
by EOS QEMU from Magic Lantern project.
The main differences:
 * EOS QEMU uses home-brew all-in-one monolith design;
 this patch series uses conventional QEMU object-centric design;
 * EOS QEMU tries provide simplest emulation for most
 controllers inside SoC to run Magic Lantern firmware;
 this patch series provide more complete support
 only for core devices to run barebox bootloader.
  ** EOS QEMU does not support timer counting
  (this patch series emulate 1 MHz counting);
  ** EOS QEMU support DIGIC UART only for output
  character to stderr; (this patch series emulate
  introduces full blown UART interface);
  ** EOS QEMU has incomplete ROM support;
  (this patch series uses conventional QEMU pflash).

This initial DIGIC support can't be used to run
the original camera firmware, but it can successfully
run experimental version of barebox bootloader
(see http://www.barebox.org).

The last sources of barebox for PowerShot A1100 can be
obtained here:
  https://github.com/frantony/barebox/tree/next.digic.20131213

The precompiled ROM image usable with QEMU can be
obtained here:
  https://github.com/frantony/barebox/raw/next.digic.20131213/canon-a1100-rom1.bin
Download this ROM image and just run QEMU:
  qemu-system-arm -M canon-a1100 -serial stdio

Short build instruction for QEMU bios image (canon-a1100-rom1.bin):
  $ git clone https://github.com/frantony/barebox -b next.digic.20131213
  $ cd barebox
  $ export ARCH=arm
  $ export CROSS_COMPILE=<your ARM cross-compiler prefix>
  $ make canon-a1100_defconfig
  $ make
  $ ./mk-canon-a1100-rom1.sh

This ROM image (after "dancing bit" encoding) can be run on
real Canon A1100 camera.

The short build instruction for __previous__ DIGIC barebox
version (it can be used with more recent sources too) can
be obtained here:
  http://lists.infradead.org/pipermail/barebox/2013-August/016007.html

Antony Pavlov (6):
  hw/arm: add very initial support for Canon DIGIC SoC
  hw/arm/digic: prepare DIGIC-based boards support
  hw/arm/digic: add timer support
  hw/arm/digic: add UART support
  hw/arm/digic: add NOR ROM support
  MAINTAINERS: Document 'Canon DIGIC' machine

 MAINTAINERS                     |   6 ++
 default-configs/arm-softmmu.mak |   1 +
 hw/arm/Makefile.objs            |   2 +
 hw/arm/digic.c                  | 115 ++++++++++++++++++++++++
 hw/arm/digic_boards.c           | 154 +++++++++++++++++++++++++++++++
 hw/char/Makefile.objs           |   1 +
 hw/char/digic-uart.c            | 195 ++++++++++++++++++++++++++++++++++++++++
 hw/timer/Makefile.objs          |   1 +
 hw/timer/digic-timer.c          | 163 +++++++++++++++++++++++++++++++++
 include/hw/arm/digic.h          |  43 +++++++++
 include/hw/char/digic-uart.h    |  47 ++++++++++
 include/hw/timer/digic-timer.h  |  46 ++++++++++
 tests/qom-test.c                |   1 +
 13 files changed, 775 insertions(+)
 create mode 100644 hw/arm/digic.c
 create mode 100644 hw/arm/digic_boards.c
 create mode 100644 hw/char/digic-uart.c
 create mode 100644 hw/timer/digic-timer.c
 create mode 100644 include/hw/arm/digic.h
 create mode 100644 include/hw/char/digic-uart.h
 create mode 100644 include/hw/timer/digic-timer.h

-- 
1.8.5

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Qemu-devel] [PATCH 1/6] hw/arm: add very initial support for Canon DIGIC SoC
  2013-12-16 10:02 [Qemu-devel] [PATCH 0/6] hw/arm: add initial support for Canon DIGIC SoC Antony Pavlov
@ 2013-12-16 10:02 ` Antony Pavlov
  2013-12-16 10:02 ` [Qemu-devel] [PATCH 2/6] hw/arm/digic: prepare DIGIC-based boards support Antony Pavlov
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Antony Pavlov @ 2013-12-16 10:02 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Maydell, Peter Crosthwaite, Giovanni Condello, g3gg0,
	Alex Dumitrache, Paul Brook, Paolo Bonzini, Andreas Färber,
	Antony Pavlov

DIGIC is Canon Inc.'s name for a family of SoC
for digital cameras and camcorders.

There is no publicly available specification for
DIGIC chips. All information about DIGIC chip
internals is based on reverse engineering efforts
made by CHDK (http://chdk.wikia.com) and
Magic Lantern (http://www.magiclantern.fm) projects
contributors.

Signed-off-by: Antony Pavlov <antonynpavlov@gmail.com>
Reviewed-by: Andreas Färber <afaerber@suse.de>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
---
 default-configs/arm-softmmu.mak |  1 +
 hw/arm/Makefile.objs            |  1 +
 hw/arm/digic.c                  | 71 +++++++++++++++++++++++++++++++++++++++++
 include/hw/arm/digic.h          | 35 ++++++++++++++++++++
 4 files changed, 108 insertions(+)
 create mode 100644 hw/arm/digic.c
 create mode 100644 include/hw/arm/digic.h

diff --git a/default-configs/arm-softmmu.mak b/default-configs/arm-softmmu.mak
index e48f102..2135be3 100644
--- a/default-configs/arm-softmmu.mak
+++ b/default-configs/arm-softmmu.mak
@@ -64,6 +64,7 @@ CONFIG_XILINX_SPIPS=y
 
 CONFIG_ARM11SCU=y
 CONFIG_A9SCU=y
+CONFIG_DIGIC=y
 CONFIG_MARVELL_88W8618=y
 CONFIG_OMAP=y
 CONFIG_TSC210X=y
diff --git a/hw/arm/Makefile.objs b/hw/arm/Makefile.objs
index 78b5614..8789807 100644
--- a/hw/arm/Makefile.objs
+++ b/hw/arm/Makefile.objs
@@ -4,4 +4,5 @@ obj-y += omap_sx1.o palm.o realview.o spitz.o stellaris.o
 obj-y += tosa.o versatilepb.o vexpress.o virt.o xilinx_zynq.o z2.o
 
 obj-y += armv7m.o exynos4210.o pxa2xx.o pxa2xx_gpio.o pxa2xx_pic.o
+obj-$(CONFIG_DIGIC) += digic.o
 obj-y += omap1.o omap2.o strongarm.o
diff --git a/hw/arm/digic.c b/hw/arm/digic.c
new file mode 100644
index 0000000..2620262
--- /dev/null
+++ b/hw/arm/digic.c
@@ -0,0 +1,71 @@
+/*
+ * QEMU model of the Canon DIGIC SoC.
+ *
+ * Copyright (C) 2013 Antony Pavlov <antonynpavlov@gmail.com>
+ *
+ * This model is based on reverse engineering efforts
+ * made by CHDK (http://chdk.wikia.com) and
+ * Magic Lantern (http://www.magiclantern.fm) projects
+ * contributors.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include "hw/arm/digic.h"
+
+static void digic_init(Object *obj)
+{
+    DigicState *s = DIGIC(obj);
+
+    object_initialize(&s->cpu, sizeof(s->cpu), "arm946-" TYPE_ARM_CPU);
+    object_property_add_child(obj, "cpu", OBJECT(&s->cpu), NULL);
+}
+
+static void digic_realize(DeviceState *dev, Error **errp)
+{
+    DigicState *s = DIGIC(dev);
+    Error *err = NULL;
+
+    object_property_set_bool(OBJECT(&s->cpu), true, "reset-hivecs", &err);
+    if (err != NULL) {
+        error_propagate(errp, err);
+        return;
+    }
+
+    object_property_set_bool(OBJECT(&s->cpu), true, "realized", &err);
+    if (err != NULL) {
+        error_propagate(errp, err);
+        return;
+    }
+}
+
+static void digic_class_init(ObjectClass *oc, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(oc);
+
+    dc->realize = digic_realize;
+}
+
+static const TypeInfo digic_type_info = {
+    .name = TYPE_DIGIC,
+    .parent = TYPE_DEVICE,
+    .instance_size = sizeof(DigicState),
+    .instance_init = digic_init,
+    .class_init = digic_class_init,
+};
+
+static void digic_register_types(void)
+{
+    type_register_static(&digic_type_info);
+}
+
+type_init(digic_register_types)
diff --git a/include/hw/arm/digic.h b/include/hw/arm/digic.h
new file mode 100644
index 0000000..b7d16fb
--- /dev/null
+++ b/include/hw/arm/digic.h
@@ -0,0 +1,35 @@
+/*
+ * Misc Canon DIGIC declarations.
+ *
+ * Copyright (C) 2013 Antony Pavlov <antonynpavlov@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#ifndef HW_ARM_DIGIC_H
+#define HW_ARM_DIGIC_H
+
+#include "cpu.h"
+
+#define TYPE_DIGIC "digic"
+
+#define DIGIC(obj) OBJECT_CHECK(DigicState, (obj), TYPE_DIGIC)
+
+typedef struct DigicState {
+    /*< private >*/
+    DeviceState parent_obj;
+    /*< public >*/
+
+    ARMCPU cpu;
+} DigicState;
+
+#endif /* HW_ARM_DIGIC_H */
-- 
1.8.5

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [Qemu-devel] [PATCH 2/6] hw/arm/digic: prepare DIGIC-based boards support
  2013-12-16 10:02 [Qemu-devel] [PATCH 0/6] hw/arm: add initial support for Canon DIGIC SoC Antony Pavlov
  2013-12-16 10:02 ` [Qemu-devel] [PATCH 1/6] hw/arm: add very " Antony Pavlov
@ 2013-12-16 10:02 ` Antony Pavlov
  2013-12-16 10:03 ` [Qemu-devel] [PATCH 3/6] hw/arm/digic: add timer support Antony Pavlov
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Antony Pavlov @ 2013-12-16 10:02 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Maydell, Peter Crosthwaite, Giovanni Condello, g3gg0,
	Alex Dumitrache, Paul Brook, Paolo Bonzini, Andreas Färber,
	Antony Pavlov

Also this patch adds initial support for Canon
PowerShot A1100 IS compact camera.

Signed-off-by: Antony Pavlov <antonynpavlov@gmail.com>
---
 hw/arm/Makefile.objs  |  1 +
 hw/arm/digic_boards.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/qom-test.c      |  1 +
 3 files changed, 86 insertions(+)
 create mode 100644 hw/arm/digic_boards.c

diff --git a/hw/arm/Makefile.objs b/hw/arm/Makefile.objs
index 8789807..d7d37f2 100644
--- a/hw/arm/Makefile.objs
+++ b/hw/arm/Makefile.objs
@@ -1,4 +1,5 @@
 obj-y += boot.o collie.o exynos4_boards.o gumstix.o highbank.o
+obj-$(CONFIG_DIGIC) += digic_boards.o
 obj-y += integratorcp.o kzm.o mainstone.o musicpal.o nseries.o
 obj-y += omap_sx1.o palm.o realview.o spitz.o stellaris.o
 obj-y += tosa.o versatilepb.o vexpress.o virt.o xilinx_zynq.o z2.o
diff --git a/hw/arm/digic_boards.c b/hw/arm/digic_boards.c
new file mode 100644
index 0000000..87a9c4b
--- /dev/null
+++ b/hw/arm/digic_boards.c
@@ -0,0 +1,84 @@
+/*
+ * QEMU model of the Canon DIGIC boards (cameras indeed :).
+ *
+ * Copyright (C) 2013 Antony Pavlov <antonynpavlov@gmail.com>
+ *
+ * This model is based on reverse engineering efforts
+ * made by CHDK (http://chdk.wikia.com) and
+ * Magic Lantern (http://www.magiclantern.fm) projects
+ * contributors.
+ *
+ * See docs here:
+ *   http://magiclantern.wikia.com/wiki/Register_Map
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include "hw/boards.h"
+#include "exec/address-spaces.h"
+#include "qemu/error-report.h"
+#include "hw/arm/digic.h"
+
+typedef struct DigicBoardState {
+    DigicState *digic;
+    MemoryRegion ram;
+} DigicBoardState;
+
+typedef struct DigicBoard {
+    hwaddr ram_size;
+} DigicBoard;
+
+static void digic4_board_setup_ram(DigicBoardState *s, hwaddr ram_size)
+{
+    memory_region_init_ram(&s->ram, NULL, "ram", ram_size);
+    memory_region_add_subregion(get_system_memory(), 0, &s->ram);
+    vmstate_register_ram_global(&s->ram);
+}
+
+static void digic4_board_init(DigicBoard *board)
+{
+    Error *err = NULL;
+
+    DigicBoardState *s = g_new(DigicBoardState, 1);
+
+    s->digic = DIGIC(object_new(TYPE_DIGIC));
+    object_property_set_bool(OBJECT(s->digic), true, "realized", &err);
+    if (err != NULL) {
+        error_report("Couldn't realize DIGIC SoC: %s\n",
+                     error_get_pretty(err));
+        exit(1);
+    }
+
+    digic4_board_setup_ram(s, board->ram_size);
+}
+
+static DigicBoard digic4_board_canon_a1100 = {
+    .ram_size = 64 * 1024 * 1024,
+};
+
+static void canon_a1100_init(QEMUMachineInitArgs *args)
+{
+    digic4_board_init(&digic4_board_canon_a1100);
+}
+
+static QEMUMachine canon_a1100 = {
+    .name = "canon-a1100",
+    .desc = "Canon PowerShot A1100 IS",
+    .init = &canon_a1100_init,
+};
+
+static void digic_register_machines(void)
+{
+    qemu_register_machine(&canon_a1100);
+}
+
+machine_init(digic_register_machines)
diff --git a/tests/qom-test.c b/tests/qom-test.c
index 499be40..f67f7c2 100644
--- a/tests/qom-test.c
+++ b/tests/qom-test.c
@@ -70,6 +70,7 @@ static const char *arm_machines[] = {
     "xilinx-zynq-a9",
     "highbank",
     "midway",
+    "canon-a1100",
 };
 
 static const char *cris_machines[] = {
-- 
1.8.5

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [Qemu-devel] [PATCH 3/6] hw/arm/digic: add timer support
  2013-12-16 10:02 [Qemu-devel] [PATCH 0/6] hw/arm: add initial support for Canon DIGIC SoC Antony Pavlov
  2013-12-16 10:02 ` [Qemu-devel] [PATCH 1/6] hw/arm: add very " Antony Pavlov
  2013-12-16 10:02 ` [Qemu-devel] [PATCH 2/6] hw/arm/digic: prepare DIGIC-based boards support Antony Pavlov
@ 2013-12-16 10:03 ` Antony Pavlov
  2013-12-16 10:03 ` [Qemu-devel] [PATCH 4/6] hw/arm/digic: add UART support Antony Pavlov
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Antony Pavlov @ 2013-12-16 10:03 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Maydell, Peter Crosthwaite, Giovanni Condello, g3gg0,
	Alex Dumitrache, Paul Brook, Paolo Bonzini, Andreas Färber,
	Antony Pavlov

Signed-off-by: Antony Pavlov <antonynpavlov@gmail.com>
Reviewed-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
---
 hw/arm/digic.c                 |  28 +++++++
 hw/timer/Makefile.objs         |   1 +
 hw/timer/digic-timer.c         | 163 +++++++++++++++++++++++++++++++++++++++++
 include/hw/arm/digic.h         |   6 ++
 include/hw/timer/digic-timer.h |  46 ++++++++++++
 5 files changed, 244 insertions(+)
 create mode 100644 hw/timer/digic-timer.c
 create mode 100644 include/hw/timer/digic-timer.h

diff --git a/hw/arm/digic.c b/hw/arm/digic.c
index 2620262..e8eb0de 100644
--- a/hw/arm/digic.c
+++ b/hw/arm/digic.c
@@ -22,18 +22,35 @@
 
 #include "hw/arm/digic.h"
 
+#define DIGIC4_TIMER_BASE(n)    (0xc0210000 + (n) * 0x100)
+
 static void digic_init(Object *obj)
 {
     DigicState *s = DIGIC(obj);
+    DeviceState *dev;
+    int i;
 
     object_initialize(&s->cpu, sizeof(s->cpu), "arm946-" TYPE_ARM_CPU);
     object_property_add_child(obj, "cpu", OBJECT(&s->cpu), NULL);
+
+    for (i = 0; i < DIGIC4_NB_TIMERS; i++) {
+#define DIGIC_TIMER_NAME_MLEN    11
+        char name[DIGIC_TIMER_NAME_MLEN];
+
+        object_initialize(&s->timer[i], sizeof(s->timer[i]), TYPE_DIGIC_TIMER);
+        dev = DEVICE(&s->timer[i]);
+        qdev_set_parent_bus(dev, sysbus_get_default());
+        snprintf(name, DIGIC_TIMER_NAME_MLEN, "timer[%d]", i);
+        object_property_add_child(obj, name, OBJECT(&s->timer[i]), NULL);
+    }
 }
 
 static void digic_realize(DeviceState *dev, Error **errp)
 {
     DigicState *s = DIGIC(dev);
     Error *err = NULL;
+    SysBusDevice *sbd;
+    int i;
 
     object_property_set_bool(OBJECT(&s->cpu), true, "reset-hivecs", &err);
     if (err != NULL) {
@@ -46,6 +63,17 @@ static void digic_realize(DeviceState *dev, Error **errp)
         error_propagate(errp, err);
         return;
     }
+
+    for (i = 0; i < DIGIC4_NB_TIMERS; i++) {
+        object_property_set_bool(OBJECT(&s->timer[i]), true, "realized", &err);
+        if (err != NULL) {
+            error_propagate(errp, err);
+            return;
+        }
+
+        sbd = SYS_BUS_DEVICE(&s->timer[i]);
+        sysbus_mmio_map(sbd, 0, DIGIC4_TIMER_BASE(i));
+    }
 }
 
 static void digic_class_init(ObjectClass *oc, void *data)
diff --git a/hw/timer/Makefile.objs b/hw/timer/Makefile.objs
index 3ae091c..ea9f11f 100644
--- a/hw/timer/Makefile.objs
+++ b/hw/timer/Makefile.objs
@@ -26,5 +26,6 @@ obj-$(CONFIG_OMAP) += omap_synctimer.o
 obj-$(CONFIG_PXA2XX) += pxa2xx_timer.o
 obj-$(CONFIG_SH4) += sh_timer.o
 obj-$(CONFIG_TUSB6010) += tusb6010.o
+obj-$(CONFIG_DIGIC) += digic-timer.o
 
 obj-$(CONFIG_MC146818RTC) += mc146818rtc.o
diff --git a/hw/timer/digic-timer.c b/hw/timer/digic-timer.c
new file mode 100644
index 0000000..1fde22c
--- /dev/null
+++ b/hw/timer/digic-timer.c
@@ -0,0 +1,163 @@
+/*
+ * QEMU model of the Canon DIGIC timer block.
+ *
+ * Copyright (C) 2013 Antony Pavlov <antonynpavlov@gmail.com>
+ *
+ * This model is based on reverse engineering efforts
+ * made by CHDK (http://chdk.wikia.com) and
+ * Magic Lantern (http://www.magiclantern.fm) projects
+ * contributors.
+ *
+ * See "Timer/Clock Module" docs here:
+ *   http://magiclantern.wikia.com/wiki/Register_Map
+ *
+ * The QEMU model of the OSTimer in PKUnity SoC by Guan Xuetao
+ * is used as a template.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include "hw/sysbus.h"
+#include "hw/ptimer.h"
+#include "qemu/main-loop.h"
+
+#include "hw/timer/digic-timer.h"
+
+static const VMStateDescription vmstate_digic_timer = {
+    .name = "digic.timer",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .minimum_version_id_old = 1,
+    .fields = (VMStateField[]) {
+        VMSTATE_PTIMER(ptimer, DigicTimerState),
+        VMSTATE_UINT32(control, DigicTimerState),
+        VMSTATE_UINT32(relvalue, DigicTimerState),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
+static void digic_timer_reset(DeviceState *dev)
+{
+    DigicTimerState *s = DIGIC_TIMER(dev);
+
+    ptimer_stop(s->ptimer);
+    s->control = 0;
+    s->relvalue = 0;
+}
+
+static uint64_t digic_timer_read(void *opaque, hwaddr offset, unsigned size)
+{
+    DigicTimerState *s = opaque;
+    uint64_t ret = 0;
+
+    switch (offset) {
+    case DIGIC_TIMER_CONTROL:
+        ret = s->control;
+        break;
+    case DIGIC_TIMER_RELVALUE:
+        ret = s->relvalue;
+        break;
+    case DIGIC_TIMER_VALUE:
+        ret = ptimer_get_count(s->ptimer) & 0xffff;
+        break;
+    default:
+        qemu_log_mask(LOG_UNIMP,
+                      "digic-timer: read access to unknown register 0x"
+                      TARGET_FMT_plx, offset);
+    }
+
+    return ret;
+}
+
+static void digic_timer_write(void *opaque, hwaddr offset,
+                              uint64_t value, unsigned size)
+{
+    DigicTimerState *s = opaque;
+
+    switch (offset) {
+    case DIGIC_TIMER_CONTROL:
+        if (value & DIGIC_TIMER_CONTROL_RST) {
+            digic_timer_reset((DeviceState *)s);
+            break;
+        }
+
+        if (value & DIGIC_TIMER_CONTROL_EN) {
+            ptimer_run(s->ptimer, 0);
+        }
+
+        s->control = (uint32_t)value;
+        break;
+
+    case DIGIC_TIMER_RELVALUE:
+        s->relvalue = extract32(value, 0, 16);
+        ptimer_set_limit(s->ptimer, s->relvalue, 1);
+        break;
+
+    case DIGIC_TIMER_VALUE:
+        break;
+
+    default:
+        qemu_log_mask(LOG_UNIMP,
+                      "digic-timer: read access to unknown register 0x"
+                      TARGET_FMT_plx, offset);
+    }
+}
+
+static const MemoryRegionOps digic_timer_ops = {
+    .read = digic_timer_read,
+    .write = digic_timer_write,
+    .impl = {
+        .min_access_size = 4,
+        .max_access_size = 4,
+    },
+    .endianness = DEVICE_NATIVE_ENDIAN,
+};
+
+static void digic_timer_init(Object *obj)
+{
+    DigicTimerState *s = DIGIC_TIMER(obj);
+
+    s->ptimer = ptimer_init(NULL);
+
+    /*
+     * FIXME: there is no documentation on Digic timer
+     * frequency setup so let it always run at 1 MHz
+     */
+    ptimer_set_freq(s->ptimer, 1 * 1000 * 1000);
+
+    memory_region_init_io(&s->iomem, OBJECT(s), &digic_timer_ops, s,
+                          TYPE_DIGIC_TIMER, 0x100);
+    sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->iomem);
+}
+
+static void digic_timer_class_init(ObjectClass *klass, void *class_data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+
+    dc->reset = digic_timer_reset;
+    dc->vmsd = &vmstate_digic_timer;
+}
+
+static const TypeInfo digic_timer_info = {
+    .name = TYPE_DIGIC_TIMER,
+    .parent = TYPE_SYS_BUS_DEVICE,
+    .instance_size = sizeof(DigicTimerState),
+    .instance_init = digic_timer_init,
+    .class_init = digic_timer_class_init,
+};
+
+static void digic_timer_register_type(void)
+{
+    type_register_static(&digic_timer_info);
+}
+
+type_init(digic_timer_register_type)
diff --git a/include/hw/arm/digic.h b/include/hw/arm/digic.h
index b7d16fb..177a06d 100644
--- a/include/hw/arm/digic.h
+++ b/include/hw/arm/digic.h
@@ -20,16 +20,22 @@
 
 #include "cpu.h"
 
+#include "hw/timer/digic-timer.h"
+
 #define TYPE_DIGIC "digic"
 
 #define DIGIC(obj) OBJECT_CHECK(DigicState, (obj), TYPE_DIGIC)
 
+#define DIGIC4_NB_TIMERS 3
+
 typedef struct DigicState {
     /*< private >*/
     DeviceState parent_obj;
     /*< public >*/
 
     ARMCPU cpu;
+
+    DigicTimerState timer[DIGIC4_NB_TIMERS];
 } DigicState;
 
 #endif /* HW_ARM_DIGIC_H */
diff --git a/include/hw/timer/digic-timer.h b/include/hw/timer/digic-timer.h
new file mode 100644
index 0000000..ae91348
--- /dev/null
+++ b/include/hw/timer/digic-timer.h
@@ -0,0 +1,46 @@
+/*
+ * Canon DIGIC timer block declarations.
+ *
+ * Copyright (C) 2013 Antony Pavlov <antonynpavlov@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#ifndef HW_TIMER_DIGIC_TIMER_H
+#define HW_TIMER_DIGIC_TIMER_H
+
+#include "hw/sysbus.h"
+#include "qemu/typedefs.h"
+#include "hw/ptimer.h"
+
+#define TYPE_DIGIC_TIMER "digic-timer"
+#define DIGIC_TIMER(obj) OBJECT_CHECK(DigicTimerState, (obj), TYPE_DIGIC_TIMER)
+
+#define DIGIC_TIMER_CONTROL 0x00
+#define DIGIC_TIMER_CONTROL_RST 0x80000000
+#define DIGIC_TIMER_CONTROL_EN 0x00000001
+#define DIGIC_TIMER_RELVALUE 0x08
+#define DIGIC_TIMER_VALUE 0x0c
+
+typedef struct DigicTimerState {
+    /*< private >*/
+    SysBusDevice parent_obj;
+    /*< public >*/
+
+    MemoryRegion iomem;
+    ptimer_state *ptimer;
+
+    uint32_t control;
+    uint32_t relvalue;
+} DigicTimerState;
+
+#endif /* HW_TIMER_DIGIC_TIMER_H */
-- 
1.8.5

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [Qemu-devel] [PATCH 4/6] hw/arm/digic: add UART support
  2013-12-16 10:02 [Qemu-devel] [PATCH 0/6] hw/arm: add initial support for Canon DIGIC SoC Antony Pavlov
                   ` (2 preceding siblings ...)
  2013-12-16 10:03 ` [Qemu-devel] [PATCH 3/6] hw/arm/digic: add timer support Antony Pavlov
@ 2013-12-16 10:03 ` Antony Pavlov
  2013-12-16 10:03 ` [Qemu-devel] [PATCH 5/6] hw/arm/digic: add NOR ROM support Antony Pavlov
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: Antony Pavlov @ 2013-12-16 10:03 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Maydell, Peter Crosthwaite, Giovanni Condello, g3gg0,
	Alex Dumitrache, Paul Brook, Paolo Bonzini, Andreas Färber,
	Antony Pavlov

Signed-off-by: Antony Pavlov <antonynpavlov@gmail.com>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
---
 hw/arm/digic.c               |  16 ++++
 hw/char/Makefile.objs        |   1 +
 hw/char/digic-uart.c         | 195 +++++++++++++++++++++++++++++++++++++++++++
 include/hw/arm/digic.h       |   2 +
 include/hw/char/digic-uart.h |  47 +++++++++++
 5 files changed, 261 insertions(+)
 create mode 100644 hw/char/digic-uart.c
 create mode 100644 include/hw/char/digic-uart.h

diff --git a/hw/arm/digic.c b/hw/arm/digic.c
index e8eb0de..ec8c330 100644
--- a/hw/arm/digic.c
+++ b/hw/arm/digic.c
@@ -24,6 +24,8 @@
 
 #define DIGIC4_TIMER_BASE(n)    (0xc0210000 + (n) * 0x100)
 
+#define DIGIC_UART_BASE          0xc0800000
+
 static void digic_init(Object *obj)
 {
     DigicState *s = DIGIC(obj);
@@ -43,6 +45,11 @@ static void digic_init(Object *obj)
         snprintf(name, DIGIC_TIMER_NAME_MLEN, "timer[%d]", i);
         object_property_add_child(obj, name, OBJECT(&s->timer[i]), NULL);
     }
+
+    object_initialize(&s->uart, sizeof(s->uart), TYPE_DIGIC_UART);
+    dev = DEVICE(&s->uart);
+    qdev_set_parent_bus(dev, sysbus_get_default());
+    object_property_add_child(obj, "uart", OBJECT(&s->uart), NULL);
 }
 
 static void digic_realize(DeviceState *dev, Error **errp)
@@ -74,6 +81,15 @@ static void digic_realize(DeviceState *dev, Error **errp)
         sbd = SYS_BUS_DEVICE(&s->timer[i]);
         sysbus_mmio_map(sbd, 0, DIGIC4_TIMER_BASE(i));
     }
+
+    object_property_set_bool(OBJECT(&s->uart), true, "realized", &err);
+    if (err != NULL) {
+        error_propagate(errp, err);
+        return;
+    }
+
+    sbd = SYS_BUS_DEVICE(&s->uart);
+    sysbus_mmio_map(sbd, 0, DIGIC_UART_BASE);
 }
 
 static void digic_class_init(ObjectClass *oc, void *data)
diff --git a/hw/char/Makefile.objs b/hw/char/Makefile.objs
index cbd6a00..be2a7d9 100644
--- a/hw/char/Makefile.objs
+++ b/hw/char/Makefile.objs
@@ -14,6 +14,7 @@ obj-$(CONFIG_COLDFIRE) += mcf_uart.o
 obj-$(CONFIG_OMAP) += omap_uart.o
 obj-$(CONFIG_SH4) += sh_serial.o
 obj-$(CONFIG_PSERIES) += spapr_vty.o
+obj-$(CONFIG_DIGIC) += digic-uart.o
 
 common-obj-$(CONFIG_ETRAXFS) += etraxfs_ser.o
 common-obj-$(CONFIG_ISA_DEBUG) += debugcon.o
diff --git a/hw/char/digic-uart.c b/hw/char/digic-uart.c
new file mode 100644
index 0000000..fd8e077
--- /dev/null
+++ b/hw/char/digic-uart.c
@@ -0,0 +1,195 @@
+/*
+ * QEMU model of the Canon DIGIC UART block.
+ *
+ * Copyright (C) 2013 Antony Pavlov <antonynpavlov@gmail.com>
+ *
+ * This model is based on reverse engineering efforts
+ * made by CHDK (http://chdk.wikia.com) and
+ * Magic Lantern (http://www.magiclantern.fm) projects
+ * contributors.
+ *
+ * See "Serial terminal" docs here:
+ *   http://magiclantern.wikia.com/wiki/Register_Map#Misc_Registers
+ *
+ * The QEMU model of the Milkymist UART block by Michael Walle
+ * is used as a template.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include "hw/hw.h"
+#include "hw/sysbus.h"
+#include "sysemu/char.h"
+
+#include "hw/char/digic-uart.h"
+
+enum {
+    ST_RX_RDY = (1 << 0),
+    ST_TX_RDY = (1 << 1),
+};
+
+static uint64_t digic_uart_read(void *opaque, hwaddr addr,
+                                unsigned size)
+{
+    DigicUartState *s = opaque;
+    uint64_t ret = 0;
+
+    addr >>= 2;
+
+    switch (addr) {
+    case R_RX:
+        s->reg_st &= ~(ST_RX_RDY);
+        ret = s->reg_rx;
+        break;
+
+    case R_ST:
+        ret = s->reg_st;
+        break;
+
+    default:
+        qemu_log_mask(LOG_UNIMP,
+                      "digic-uart: read access to unknown register 0x"
+                      TARGET_FMT_plx, addr << 2);
+    }
+
+    return ret;
+}
+
+static void digic_uart_write(void *opaque, hwaddr addr, uint64_t value,
+                             unsigned size)
+{
+    DigicUartState *s = opaque;
+    unsigned char ch = value;
+
+    addr >>= 2;
+
+    switch (addr) {
+    case R_TX:
+        if (s->chr) {
+            qemu_chr_fe_write_all(s->chr, &ch, 1);
+        }
+        break;
+
+    case R_ST:
+        /*
+         * Ignore write to R_ST.
+         *
+         * The point is that this register is actively used
+         * during receiving and transmitting symbols,
+         * but we don't know the function of most of bits.
+         *
+         * Ignoring writes to R_ST is only a simplification
+         * of the model. It has no perceptible side effects
+         * for existing guests.
+         */
+        break;
+
+    default:
+        qemu_log_mask(LOG_UNIMP,
+                      "digic-uart: write access to unknown register 0x"
+                      TARGET_FMT_plx, addr << 2);
+    }
+}
+
+static const MemoryRegionOps uart_mmio_ops = {
+    .read = digic_uart_read,
+    .write = digic_uart_write,
+    .valid = {
+        .min_access_size = 4,
+        .max_access_size = 4,
+    },
+    .endianness = DEVICE_NATIVE_ENDIAN,
+};
+
+static int uart_can_rx(void *opaque)
+{
+    DigicUartState *s = opaque;
+
+    return !(s->reg_st & ST_RX_RDY);
+}
+
+static void uart_rx(void *opaque, const uint8_t *buf, int size)
+{
+    DigicUartState *s = opaque;
+
+    assert(uart_can_rx(opaque));
+
+    s->reg_st |= ST_RX_RDY;
+    s->reg_rx = *buf;
+}
+
+static void uart_event(void *opaque, int event)
+{
+}
+
+static void digic_uart_reset(DeviceState *d)
+{
+    DigicUartState *s = DIGIC_UART(d);
+
+    s->reg_rx = 0;
+    s->reg_st = ST_TX_RDY;
+}
+
+static void digic_uart_realize(DeviceState *dev, Error **errp)
+{
+    DigicUartState *s = DIGIC_UART(dev);
+
+    s->chr = qemu_char_get_next_serial();
+    if (s->chr) {
+        qemu_chr_add_handlers(s->chr, uart_can_rx, uart_rx, uart_event, s);
+    }
+}
+
+static void digic_uart_init(Object *obj)
+{
+    DigicUartState *s = DIGIC_UART(obj);
+
+    memory_region_init_io(&s->regs_region, OBJECT(s), &uart_mmio_ops, s,
+                          TYPE_DIGIC_UART, 0x18);
+    sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->regs_region);
+}
+
+static const VMStateDescription vmstate_digic_uart = {
+    .name = "digic-uart",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .minimum_version_id_old = 1,
+    .fields = (VMStateField[]) {
+        VMSTATE_UINT32(reg_rx, DigicUartState),
+        VMSTATE_UINT32(reg_st, DigicUartState),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
+static void digic_uart_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+
+    dc->realize = digic_uart_realize;
+    dc->reset = digic_uart_reset;
+    dc->vmsd = &vmstate_digic_uart;
+}
+
+static const TypeInfo digic_uart_info = {
+    .name = TYPE_DIGIC_UART,
+    .parent = TYPE_SYS_BUS_DEVICE,
+    .instance_size = sizeof(DigicUartState),
+    .instance_init = digic_uart_init,
+    .class_init = digic_uart_class_init,
+};
+
+static void digic_uart_register_types(void)
+{
+    type_register_static(&digic_uart_info);
+}
+
+type_init(digic_uart_register_types)
diff --git a/include/hw/arm/digic.h b/include/hw/arm/digic.h
index 177a06d..a739d6a 100644
--- a/include/hw/arm/digic.h
+++ b/include/hw/arm/digic.h
@@ -21,6 +21,7 @@
 #include "cpu.h"
 
 #include "hw/timer/digic-timer.h"
+#include "hw/char/digic-uart.h"
 
 #define TYPE_DIGIC "digic"
 
@@ -36,6 +37,7 @@ typedef struct DigicState {
     ARMCPU cpu;
 
     DigicTimerState timer[DIGIC4_NB_TIMERS];
+    DigicUartState uart;
 } DigicState;
 
 #endif /* HW_ARM_DIGIC_H */
diff --git a/include/hw/char/digic-uart.h b/include/hw/char/digic-uart.h
new file mode 100644
index 0000000..ef83a30
--- /dev/null
+++ b/include/hw/char/digic-uart.h
@@ -0,0 +1,47 @@
+/*
+ * Canon DIGIC UART block declarations.
+ *
+ * Copyright (C) 2013 Antony Pavlov <antonynpavlov@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#ifndef HW_CHAR_DIGIC_UART_H
+#define HW_CHAR_DIGIC_UART_H
+
+#include "hw/sysbus.h"
+#include "qemu/typedefs.h"
+
+#define TYPE_DIGIC_UART "digic-uart"
+#define DIGIC_UART(obj) \
+    OBJECT_CHECK(DigicUartState, (obj), TYPE_DIGIC_UART)
+
+enum {
+    R_TX = 0x00,
+    R_RX,
+    R_ST = (0x14 >> 2),
+    R_MAX
+};
+
+typedef struct DigicUartState {
+    /*< private >*/
+    SysBusDevice parent_obj;
+    /*< public >*/
+
+    MemoryRegion regs_region;
+    CharDriverState *chr;
+
+    uint32_t reg_rx;
+    uint32_t reg_st;
+} DigicUartState;
+
+#endif /* HW_CHAR_DIGIC_UART_H */
-- 
1.8.5

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [Qemu-devel] [PATCH 5/6] hw/arm/digic: add NOR ROM support
  2013-12-16 10:02 [Qemu-devel] [PATCH 0/6] hw/arm: add initial support for Canon DIGIC SoC Antony Pavlov
                   ` (3 preceding siblings ...)
  2013-12-16 10:03 ` [Qemu-devel] [PATCH 4/6] hw/arm/digic: add UART support Antony Pavlov
@ 2013-12-16 10:03 ` Antony Pavlov
  2013-12-16 10:03 ` [Qemu-devel] [PATCH 6/6] MAINTAINERS: Document 'Canon DIGIC' machine Antony Pavlov
  2013-12-16 10:05 ` [Qemu-devel] [PATCH 0/6] hw/arm: add initial support for Canon DIGIC SoC Antony Pavlov
  6 siblings, 0 replies; 8+ messages in thread
From: Antony Pavlov @ 2013-12-16 10:03 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Maydell, Peter Crosthwaite, Giovanni Condello, g3gg0,
	Alex Dumitrache, Paul Brook, Paolo Bonzini, Andreas Färber,
	Antony Pavlov

Signed-off-by: Antony Pavlov <antonynpavlov@gmail.com>
---
 hw/arm/digic_boards.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 70 insertions(+)

diff --git a/hw/arm/digic_boards.c b/hw/arm/digic_boards.c
index 87a9c4b..217c506 100644
--- a/hw/arm/digic_boards.c
+++ b/hw/arm/digic_boards.c
@@ -27,6 +27,13 @@
 #include "exec/address-spaces.h"
 #include "qemu/error-report.h"
 #include "hw/arm/digic.h"
+#include "hw/block/flash.h"
+#include "hw/loader.h"
+#include "sysemu/sysemu.h"
+
+#define DIGIC4_ROM0_BASE      0xf0000000
+#define DIGIC4_ROM1_BASE      0xf8000000
+#define DIGIC4_ROM_MAX_SIZE   0x08000000
 
 typedef struct DigicBoardState {
     DigicState *digic;
@@ -35,6 +42,10 @@ typedef struct DigicBoardState {
 
 typedef struct DigicBoard {
     hwaddr ram_size;
+    void (*add_rom0)(DigicBoardState *, hwaddr, const char *);
+    const char *rom0_def_filename;
+    void (*add_rom1)(DigicBoardState *, hwaddr, const char *);
+    const char *rom1_def_filename;
 } DigicBoard;
 
 static void digic4_board_setup_ram(DigicBoardState *s, hwaddr ram_size)
@@ -59,10 +70,69 @@ static void digic4_board_init(DigicBoard *board)
     }
 
     digic4_board_setup_ram(s, board->ram_size);
+
+    if (board->add_rom0) {
+        board->add_rom0(s, DIGIC4_ROM0_BASE, board->rom0_def_filename);
+    }
+
+    if (board->add_rom1) {
+        board->add_rom1(s, DIGIC4_ROM1_BASE, board->rom1_def_filename);
+    }
+}
+
+static void digic_load_rom(DigicBoardState *s, hwaddr addr,
+                           hwaddr max_size, const char *def_filename)
+{
+    target_long rom_size;
+    const char *filename;
+
+    if (bios_name) {
+        filename = bios_name;
+    } else {
+        filename = def_filename;
+    }
+
+    if (filename) {
+        char *fn = qemu_find_file(QEMU_FILE_TYPE_BIOS, filename);
+
+        if (!fn) {
+            error_report("Couldn't find rom image '%s'.\n", filename);
+            exit(1);
+        }
+
+        rom_size = load_image_targphys(fn, addr, max_size);
+        if (rom_size < 0 || rom_size > max_size) {
+            error_report("Couldn't load rom image '%s'.\n", filename);
+            exit(1);
+        }
+    }
+}
+
+/*
+ * Samsung K8P3215UQB
+ * 64M Bit (4Mx16) Page Mode / Multi-Bank NOR Flash Memory
+ */
+static void digic4_add_k8p3215uqb_rom(DigicBoardState *s, hwaddr addr,
+                                      const char *def_filename)
+{
+#define FLASH_K8P3215UQB_SIZE (4 * 1024 * 1024)
+#define FLASH_K8P3215UQB_SECTOR_SIZE (64 * 1024)
+
+    pflash_cfi02_register(addr, NULL, "pflash", FLASH_K8P3215UQB_SIZE,
+                          NULL, FLASH_K8P3215UQB_SECTOR_SIZE,
+                          FLASH_K8P3215UQB_SIZE / FLASH_K8P3215UQB_SECTOR_SIZE,
+                          DIGIC4_ROM_MAX_SIZE / FLASH_K8P3215UQB_SIZE,
+                          4,
+                          0x00EC, 0x007E, 0x0003, 0x0001,
+                          0x0555, 0x2aa, 0);
+
+    digic_load_rom(s, addr, FLASH_K8P3215UQB_SIZE, def_filename);
 }
 
 static DigicBoard digic4_board_canon_a1100 = {
     .ram_size = 64 * 1024 * 1024,
+    .add_rom1 = digic4_add_k8p3215uqb_rom,
+    .rom1_def_filename = "canon-a1100-rom1.bin",
 };
 
 static void canon_a1100_init(QEMUMachineInitArgs *args)
-- 
1.8.5

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [Qemu-devel] [PATCH 6/6] MAINTAINERS: Document 'Canon DIGIC' machine
  2013-12-16 10:02 [Qemu-devel] [PATCH 0/6] hw/arm: add initial support for Canon DIGIC SoC Antony Pavlov
                   ` (4 preceding siblings ...)
  2013-12-16 10:03 ` [Qemu-devel] [PATCH 5/6] hw/arm/digic: add NOR ROM support Antony Pavlov
@ 2013-12-16 10:03 ` Antony Pavlov
  2013-12-16 10:05 ` [Qemu-devel] [PATCH 0/6] hw/arm: add initial support for Canon DIGIC SoC Antony Pavlov
  6 siblings, 0 replies; 8+ messages in thread
From: Antony Pavlov @ 2013-12-16 10:03 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Maydell, Peter Crosthwaite, Giovanni Condello, g3gg0,
	Alex Dumitrache, Paul Brook, Paolo Bonzini, Andreas Färber,
	Antony Pavlov

Signed-off-by: Antony Pavlov <antonynpavlov@gmail.com>
---
 MAINTAINERS | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index 7f45d1d..1fce9a5 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -233,6 +233,12 @@ S: Supported
 F: hw/arm/highbank.c
 F: hw/net/xgmac.c
 
+Canon DIGIC
+M: Antony Pavlov <antonynpavlov@gmail.com>
+S: Maintained
+F: include/hw/arm/digic.h
+F: hw/*/digic*
+
 Gumstix
 M: qemu-devel@nongnu.org
 S: Orphan
-- 
1.8.5

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH 0/6] hw/arm: add initial support for Canon DIGIC SoC
  2013-12-16 10:02 [Qemu-devel] [PATCH 0/6] hw/arm: add initial support for Canon DIGIC SoC Antony Pavlov
                   ` (5 preceding siblings ...)
  2013-12-16 10:03 ` [Qemu-devel] [PATCH 6/6] MAINTAINERS: Document 'Canon DIGIC' machine Antony Pavlov
@ 2013-12-16 10:05 ` Antony Pavlov
  6 siblings, 0 replies; 8+ messages in thread
From: Antony Pavlov @ 2013-12-16 10:05 UTC (permalink / raw)
  To: Antony Pavlov
  Cc: Peter Maydell, Peter Crosthwaite, qemu-devel, Paul Brook,
	Paolo Bonzini, Andreas Färber

On Mon, 16 Dec 2013 14:02:57 +0400
Antony Pavlov <antonynpavlov@gmail.com> wrote:

Sorry!
I have added --cover-letter option but I have forgot add "v10". 

> Changes since v9:
>  1. rebase over Peter Crosthwaite's "Fix Support for ARM CBAR and
>     reset-hivecs" v5 patch series
>  2. qom-test: add "canon-a1100" to arm machines list
>  3. include a diffstat in the cover letter (--cover-letter option)
>  4. fix patches timestamp
> 
> Changes since v8:
>  1. digic-timer: move hardware-related macros to the header file
>  2. digic-timer: use extract32 instead of & >> logic
>  3. digic-timer, digic-uart: move header files to include/hw/...
>  4. digic-timer, digic-uart: fix other trivial stuff
>     fix emptyline; also add "/*< private >*/" and "/*< public >*/"
>  5. fix patches timestamp
> 
> Changes since v7:
>  1. change "fprintf(stderr," -> "error_report("
>     (thanks to Peter Crosthwaite)
>  2. fix digic_timer
>     * use ptimer in continuous mode according to Peter Crosthwaite's
>       recommendations;
>     * implement the 'control' and 'reload value' registers.
>  3. fix patches timestamp
> 
> Changes since v6:
>  1. rebase over Peter Crosthwaite's "Fix Support for ARM CBAR and
>     reset-hivecs" v4 patch series
>  2. digic_boards: drop start_addr
>     so the line 's->digic->cpu.env.regs[15] = board->start_addr;' has gone
>  3. hw/arc/digic: use "reset-hivecs" ARM CPU property
>  4. add a record to the MAINTAINERS file
> 
> Changes since v5:
>  1. rebase over latest master
>  2. digic_timer: add a reset function
>  3. digic_timer: add a VMStateDescription
>  4. digic_timer: fix whitespaces
>  5. digic_boards: fix whitespaces
>  6. move misplaced DIGIC_ROM* definitions
>     to the "hw/arm/digic: add NOR ROM support" patch
> 
> Changes since v4:
>  1. digic.h: parent_obj: change type Object -> DeviceState
>  2. digic-uart: drop reg array
>  3. digic_boards: fix K8P3215UQB comment
>  4. Makefile: place digic stuff in own line
>  5. drop cpu-qom.h inclusion
>  6. digic.h: add private/public labels
>  7. digic.h: fix guard macro
>  8. move base address macros to digic.c
>  9. fix header comments
> 
> Changes since v3:
>  1. fix typos and formatting
>  2. digic-timer: drop DPRINTF
>  3. digic-timer: fix DIGIC4_TIMER_BASE() macro
>  4. digic.c: fix max timer device string
> 
> Changes since v2:
>  1. rebase over latest master;
>    * pass available size to object_initialize().
>  2. digic-uart: qemu_log: use LOG_UNIMP instead LOG_GUEST_ERROR;
>  3. digic-boards: update rom image load code: introduce digic_load_rom().
> 
> Changes since v1:
>  0. drop the "add ARM946E-S CPU" patch;
>  1. convert to QOM, split DIGIC SoC code and board code
>     (thanks to Andreas Fa:rber, Peter Maydell and Peter Crosthwaite);
>  2. fix digic-uart (many thanks to Peter Crosthwaite
>     for his comments);
>  3. digic-boards: digic4_add_k8p3215uqb_rom(): update
>     rom image load code: use the '-bios' option.
> 
> DIGIC is Canon Inc.'s name for a family of SoC
> for digital cameras and camcorders.
> 
> See http://en.wikipedia.org/wiki/DIGIC for details.
> 
> There is no publicly available specification for
> DIGIC chips. All information about DIGIC chip
> internals is based on reverse engineering efforts
> made by CHDK (http://chdk.wikia.com) and
> Magic Lantern (http://www.magiclantern.fm) projects
> contributors.
> 
> Also this patch series adds initial support for Canon
> PowerShot A1100 IS compact camera (it is my only camera
> with connected UART interface). As the DIGIC-based cameras
> differences mostly are insignificant (e.g. RAM-size,
> ROM type and size, GPIO usage) the other compact
> and DSLR cameras support can be easily added.
> 
> This DIGIC support patch series is inspired
> by EOS QEMU from Magic Lantern project.
> The main differences:
>  * EOS QEMU uses home-brew all-in-one monolith design;
>  this patch series uses conventional QEMU object-centric design;
>  * EOS QEMU tries provide simplest emulation for most
>  controllers inside SoC to run Magic Lantern firmware;
>  this patch series provide more complete support
>  only for core devices to run barebox bootloader.
>   ** EOS QEMU does not support timer counting
>   (this patch series emulate 1 MHz counting);
>   ** EOS QEMU support DIGIC UART only for output
>   character to stderr; (this patch series emulate
>   introduces full blown UART interface);
>   ** EOS QEMU has incomplete ROM support;
>   (this patch series uses conventional QEMU pflash).
> 
> This initial DIGIC support can't be used to run
> the original camera firmware, but it can successfully
> run experimental version of barebox bootloader
> (see http://www.barebox.org).
> 
> The last sources of barebox for PowerShot A1100 can be
> obtained here:
>   https://github.com/frantony/barebox/tree/next.digic.20131213
> 
> The precompiled ROM image usable with QEMU can be
> obtained here:
>   https://github.com/frantony/barebox/raw/next.digic.20131213/canon-a1100-rom1.bin
> Download this ROM image and just run QEMU:
>   qemu-system-arm -M canon-a1100 -serial stdio
> 
> Short build instruction for QEMU bios image (canon-a1100-rom1.bin):
>   $ git clone https://github.com/frantony/barebox -b next.digic.20131213
>   $ cd barebox
>   $ export ARCH=arm
>   $ export CROSS_COMPILE=<your ARM cross-compiler prefix>
>   $ make canon-a1100_defconfig
>   $ make
>   $ ./mk-canon-a1100-rom1.sh
> 
> This ROM image (after "dancing bit" encoding) can be run on
> real Canon A1100 camera.
> 
> The short build instruction for __previous__ DIGIC barebox
> version (it can be used with more recent sources too) can
> be obtained here:
>   http://lists.infradead.org/pipermail/barebox/2013-August/016007.html
> 
> Antony Pavlov (6):
>   hw/arm: add very initial support for Canon DIGIC SoC
>   hw/arm/digic: prepare DIGIC-based boards support
>   hw/arm/digic: add timer support
>   hw/arm/digic: add UART support
>   hw/arm/digic: add NOR ROM support
>   MAINTAINERS: Document 'Canon DIGIC' machine
> 
>  MAINTAINERS                     |   6 ++
>  default-configs/arm-softmmu.mak |   1 +
>  hw/arm/Makefile.objs            |   2 +
>  hw/arm/digic.c                  | 115 ++++++++++++++++++++++++
>  hw/arm/digic_boards.c           | 154 +++++++++++++++++++++++++++++++
>  hw/char/Makefile.objs           |   1 +
>  hw/char/digic-uart.c            | 195 ++++++++++++++++++++++++++++++++++++++++
>  hw/timer/Makefile.objs          |   1 +
>  hw/timer/digic-timer.c          | 163 +++++++++++++++++++++++++++++++++
>  include/hw/arm/digic.h          |  43 +++++++++
>  include/hw/char/digic-uart.h    |  47 ++++++++++
>  include/hw/timer/digic-timer.h  |  46 ++++++++++
>  tests/qom-test.c                |   1 +
>  13 files changed, 775 insertions(+)
>  create mode 100644 hw/arm/digic.c
>  create mode 100644 hw/arm/digic_boards.c
>  create mode 100644 hw/char/digic-uart.c
>  create mode 100644 hw/timer/digic-timer.c
>  create mode 100644 include/hw/arm/digic.h
>  create mode 100644 include/hw/char/digic-uart.h
>  create mode 100644 include/hw/timer/digic-timer.h
> 
> -- 
> 1.8.5
> 


-- 
-- 
Best regards,
  Antony Pavlov

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2013-12-16  9:57 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-12-16 10:02 [Qemu-devel] [PATCH 0/6] hw/arm: add initial support for Canon DIGIC SoC Antony Pavlov
2013-12-16 10:02 ` [Qemu-devel] [PATCH 1/6] hw/arm: add very " Antony Pavlov
2013-12-16 10:02 ` [Qemu-devel] [PATCH 2/6] hw/arm/digic: prepare DIGIC-based boards support Antony Pavlov
2013-12-16 10:03 ` [Qemu-devel] [PATCH 3/6] hw/arm/digic: add timer support Antony Pavlov
2013-12-16 10:03 ` [Qemu-devel] [PATCH 4/6] hw/arm/digic: add UART support Antony Pavlov
2013-12-16 10:03 ` [Qemu-devel] [PATCH 5/6] hw/arm/digic: add NOR ROM support Antony Pavlov
2013-12-16 10:03 ` [Qemu-devel] [PATCH 6/6] MAINTAINERS: Document 'Canon DIGIC' machine Antony Pavlov
2013-12-16 10:05 ` [Qemu-devel] [PATCH 0/6] hw/arm: add initial support for Canon DIGIC SoC Antony Pavlov

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.