Message ID | 20181025005052.27661-3-jusual@mail.ru |
---|---|
State | New |
Headers | show |
Series | arm: Add nRF51 SoC UART support | expand |
On Thu, Oct 25, 2018 at 1:56 AM Julia Suvorova via Qemu-devel <qemu-devel@nongnu.org> wrote: > > Wire up nRF51 UART in the corresponding SoC. > > Signed-off-by: Julia Suvorova <jusual@mail.ru> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Alistair > --- > hw/arm/microbit.c | 2 ++ > hw/arm/nrf51_soc.c | 20 ++++++++++++++++++++ > include/hw/arm/nrf51_soc.h | 3 +++ > 3 files changed, 25 insertions(+) > > diff --git a/hw/arm/microbit.c b/hw/arm/microbit.c > index e7d74116a5..a734e7f650 100644 > --- a/hw/arm/microbit.c > +++ b/hw/arm/microbit.c > @@ -12,6 +12,7 @@ > #include "qapi/error.h" > #include "hw/boards.h" > #include "hw/arm/arm.h" > +#include "sysemu/sysemu.h" > #include "exec/address-spaces.h" > > #include "hw/arm/nrf51_soc.h" > @@ -35,6 +36,7 @@ static void microbit_init(MachineState *machine) > > sysbus_init_child_obj(OBJECT(machine), "nrf51", soc, sizeof(s->nrf51), > TYPE_NRF51_SOC); > + qdev_prop_set_chr(DEVICE(&s->nrf51), "serial0", serial_hd(0)); > object_property_set_link(soc, OBJECT(system_memory), "memory", > &error_fatal); > object_property_set_bool(soc, true, "realized", &error_fatal); > diff --git a/hw/arm/nrf51_soc.c b/hw/arm/nrf51_soc.c > index 1a59ef4552..b89c1bdea0 100644 > --- a/hw/arm/nrf51_soc.c > +++ b/hw/arm/nrf51_soc.c > @@ -43,9 +43,12 @@ > #define NRF51822_FLASH_SIZE (256 * 1024) > #define NRF51822_SRAM_SIZE (16 * 1024) > > +#define BASE_TO_IRQ(base) ((base >> 12) & 0x1F) > + > static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp) > { > NRF51State *s = NRF51_SOC(dev_soc); > + MemoryRegion *mr; > Error *err = NULL; > > if (!s->board_memory) { > @@ -82,6 +85,18 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp) > } > memory_region_add_subregion(&s->container, SRAM_BASE, &s->sram); > > + /* UART */ > + object_property_set_bool(OBJECT(&s->uart), true, "realized", &err); > + if (err) { > + error_propagate(errp, err); > + return; > + } > + mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->uart), 0); > + memory_region_add_subregion_overlap(&s->container, UART_BASE, mr, 0); > + sysbus_connect_irq(SYS_BUS_DEVICE(&s->uart), 0, > + qdev_get_gpio_in(DEVICE(&s->cpu), > + BASE_TO_IRQ(UART_BASE))); > + > create_unimplemented_device("nrf51_soc.io", IOMEM_BASE, IOMEM_SIZE); > create_unimplemented_device("nrf51_soc.ficr", FICR_BASE, FICR_SIZE); > create_unimplemented_device("nrf51_soc.private", > @@ -99,6 +114,11 @@ static void nrf51_soc_init(Object *obj) > qdev_prop_set_string(DEVICE(&s->cpu), "cpu-type", > ARM_CPU_TYPE_NAME("cortex-m0")); > qdev_prop_set_uint32(DEVICE(&s->cpu), "num-irq", 32); > + > + sysbus_init_child_obj(obj, "uart", &s->uart, sizeof(s->uart), > + TYPE_NRF51_UART); > + object_property_add_alias(obj, "serial0", OBJECT(&s->uart), "chardev", > + &error_abort); > } > > static Property nrf51_soc_properties[] = { > diff --git a/include/hw/arm/nrf51_soc.h b/include/hw/arm/nrf51_soc.h > index f4e092b554..73fc92e9a8 100644 > --- a/include/hw/arm/nrf51_soc.h > +++ b/include/hw/arm/nrf51_soc.h > @@ -12,6 +12,7 @@ > > #include "hw/sysbus.h" > #include "hw/arm/armv7m.h" > +#include "hw/char/nrf51_uart.h" > > #define TYPE_NRF51_SOC "nrf51-soc" > #define NRF51_SOC(obj) \ > @@ -24,6 +25,8 @@ typedef struct NRF51State { > /*< public >*/ > ARMv7MState cpu; > > + NRF51UARTState uart; > + > MemoryRegion iomem; > MemoryRegion sram; > MemoryRegion flash; > -- > 2.17.1 > >
diff --git a/hw/arm/microbit.c b/hw/arm/microbit.c index e7d74116a5..a734e7f650 100644 --- a/hw/arm/microbit.c +++ b/hw/arm/microbit.c @@ -12,6 +12,7 @@ #include "qapi/error.h" #include "hw/boards.h" #include "hw/arm/arm.h" +#include "sysemu/sysemu.h" #include "exec/address-spaces.h" #include "hw/arm/nrf51_soc.h" @@ -35,6 +36,7 @@ static void microbit_init(MachineState *machine) sysbus_init_child_obj(OBJECT(machine), "nrf51", soc, sizeof(s->nrf51), TYPE_NRF51_SOC); + qdev_prop_set_chr(DEVICE(&s->nrf51), "serial0", serial_hd(0)); object_property_set_link(soc, OBJECT(system_memory), "memory", &error_fatal); object_property_set_bool(soc, true, "realized", &error_fatal); diff --git a/hw/arm/nrf51_soc.c b/hw/arm/nrf51_soc.c index 1a59ef4552..b89c1bdea0 100644 --- a/hw/arm/nrf51_soc.c +++ b/hw/arm/nrf51_soc.c @@ -43,9 +43,12 @@ #define NRF51822_FLASH_SIZE (256 * 1024) #define NRF51822_SRAM_SIZE (16 * 1024) +#define BASE_TO_IRQ(base) ((base >> 12) & 0x1F) + static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp) { NRF51State *s = NRF51_SOC(dev_soc); + MemoryRegion *mr; Error *err = NULL; if (!s->board_memory) { @@ -82,6 +85,18 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error **errp) } memory_region_add_subregion(&s->container, SRAM_BASE, &s->sram); + /* UART */ + object_property_set_bool(OBJECT(&s->uart), true, "realized", &err); + if (err) { + error_propagate(errp, err); + return; + } + mr = sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->uart), 0); + memory_region_add_subregion_overlap(&s->container, UART_BASE, mr, 0); + sysbus_connect_irq(SYS_BUS_DEVICE(&s->uart), 0, + qdev_get_gpio_in(DEVICE(&s->cpu), + BASE_TO_IRQ(UART_BASE))); + create_unimplemented_device("nrf51_soc.io", IOMEM_BASE, IOMEM_SIZE); create_unimplemented_device("nrf51_soc.ficr", FICR_BASE, FICR_SIZE); create_unimplemented_device("nrf51_soc.private", @@ -99,6 +114,11 @@ static void nrf51_soc_init(Object *obj) qdev_prop_set_string(DEVICE(&s->cpu), "cpu-type", ARM_CPU_TYPE_NAME("cortex-m0")); qdev_prop_set_uint32(DEVICE(&s->cpu), "num-irq", 32); + + sysbus_init_child_obj(obj, "uart", &s->uart, sizeof(s->uart), + TYPE_NRF51_UART); + object_property_add_alias(obj, "serial0", OBJECT(&s->uart), "chardev", + &error_abort); } static Property nrf51_soc_properties[] = { diff --git a/include/hw/arm/nrf51_soc.h b/include/hw/arm/nrf51_soc.h index f4e092b554..73fc92e9a8 100644 --- a/include/hw/arm/nrf51_soc.h +++ b/include/hw/arm/nrf51_soc.h @@ -12,6 +12,7 @@ #include "hw/sysbus.h" #include "hw/arm/armv7m.h" +#include "hw/char/nrf51_uart.h" #define TYPE_NRF51_SOC "nrf51-soc" #define NRF51_SOC(obj) \ @@ -24,6 +25,8 @@ typedef struct NRF51State { /*< public >*/ ARMv7MState cpu; + NRF51UARTState uart; + MemoryRegion iomem; MemoryRegion sram; MemoryRegion flash;
Wire up nRF51 UART in the corresponding SoC. Signed-off-by: Julia Suvorova <jusual@mail.ru> --- hw/arm/microbit.c | 2 ++ hw/arm/nrf51_soc.c | 20 ++++++++++++++++++++ include/hw/arm/nrf51_soc.h | 3 +++ 3 files changed, 25 insertions(+)