From 97bd4bd67f0a05f0b263fd92e82da4c3c1cd1d23 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Sun, 9 Aug 2020 17:52:31 +0200 Subject: [PATCH 01/15] Update gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 0c5af83aa7454..74bb71abe2635 100644 --- a/.gitignore +++ b/.gitignore @@ -161,3 +161,6 @@ trace-dtrace-root.dtrace trace-ust-all.h trace-ust-all.c /target/arm/decode-sve.inc.c +storage-daemon/ +qemu-storage-daemon +roms From 92cf571f2503646195154f4361eec91e6bb9a1ef Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Mon, 10 Aug 2020 16:56:53 +0200 Subject: [PATCH 02/15] WIP --- CMakeLists.txt | 10 +++ hw/arm/Makefile.objs | 2 + hw/arm/amazfit.c | 40 ++++++++++++ hw/arm/stm32l467_soc.c | 111 +++++++++++++++++++++++++++++++++ include/hw/arm/stm32l467_soc.h | 26 ++++++++ mem.bin | Bin 0 -> 262144 bytes 6 files changed, 189 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 hw/arm/amazfit.c create mode 100644 hw/arm/stm32l467_soc.c create mode 100644 include/hw/arm/stm32l467_soc.h create mode 100644 mem.bin diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000000000..60ea50e2a0a56 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 3.3) +project(qemu_dev) + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + +file(GLOB_RECURSE src "*.c" "*.h") + +set(SOURCES ${src}) +add_library(qemu_dev ${SOURCES}) +target_include_directories(qemu_dev PUBLIC "include" "target/arm" "") diff --git a/hw/arm/Makefile.objs b/hw/arm/Makefile.objs index 534a6a119e5d7..c9676608fd527 100644 --- a/hw/arm/Makefile.objs +++ b/hw/arm/Makefile.objs @@ -54,3 +54,5 @@ obj-$(CONFIG_FSL_IMX7) += fsl-imx7.o mcimx7d-sabre.o obj-$(CONFIG_ARM_SMMUV3) += smmu-common.o smmuv3.o obj-$(CONFIG_FSL_IMX6UL) += fsl-imx6ul.o mcimx6ul-evk.o obj-$(CONFIG_NRF51_SOC) += nrf51_soc.o +obj-y += amazfit.o +obj-y += stm32l467_soc.o diff --git a/hw/arm/amazfit.c b/hw/arm/amazfit.c new file mode 100644 index 0000000000000..b8749039d2794 --- /dev/null +++ b/hw/arm/amazfit.c @@ -0,0 +1,40 @@ + +#include "qemu/osdep.h" +#include "qapi/error.h" +#include "hw/boards.h" +#include "hw/qdev-properties.h" +#include "hw/arm/stm32l467_soc.h" +#include "hw/arm/boot.h" +#include "hw/loader.h" + +static uint32_t readu32(hwaddr addr) { + uint32_t ret; + ARMCPU *cpu = ARM_CPU(first_cpu); + cpu_memory_rw_debug(cpu, addr, &ret, 4, false); + + return ret; +} + +static void bip_init(MachineState *machine) { + DeviceState *dev; + + dev = qdev_create(NULL, TYPE_STM32L467_SOC); + object_property_set_bool(OBJECT(dev), true, "realized", &error_fatal); + + load_image_targphys("/Users/Marijn/temp/chaohu_bootloader.fw", + 0, + 0x200); + + load_image_targphys("/Users/Marijn/Downloads/chaohu_1.1.6.44_ft9_0/chaohu_v1.1.6.44.fw", + FLASH_BASE_ADDRESS + 0x8000, + FLASH_SIZE); + + armv7m_load_kernel(ARM_CPU(first_cpu), NULL, 0); +} + +static void bip_machine_init(MachineClass *mc) { + mc->desc = "Amazfit Bip"; + mc->init = bip_init; +} + +DEFINE_MACHINE("amazfitbip", bip_machine_init) diff --git a/hw/arm/stm32l467_soc.c b/hw/arm/stm32l467_soc.c new file mode 100644 index 0000000000000..11bc7ebaba0de --- /dev/null +++ b/hw/arm/stm32l467_soc.c @@ -0,0 +1,111 @@ + +#include "qemu/osdep.h" +#include "hw/misc/unimp.h" +#include "hw/sysbus.h" +#include "hw/arm/armv7m.h" +#include "qapi/error.h" +#include "hw/boards.h" +#include "hw/arm/boot.h" +#include "sysemu/sysemu.h" +#include "exec/address-spaces.h" +#include "hw/loader.h" +#include "qemu/log.h" + +#include "hw/arm/stm32l467_soc.h" + +static uint64_t mv88w8618_wlan_read(void *opaque, hwaddr offset, + unsigned size) { + printf("read @ 0x%x\n", offset); + return 0; +} + +static void mv88w8618_wlan_write(void *opaque, hwaddr offset, + uint64_t value, unsigned size) { + printf("write @ 0x%x\n", offset); +} + +static const MemoryRegionOps mv88w8618_wlan_ops = { + .read = mv88w8618_wlan_read, + .write =mv88w8618_wlan_write, + .endianness = DEVICE_NATIVE_ENDIAN, +}; + +static inline void create_unimplemented_layer(const char *name, hwaddr base, hwaddr size) { + DeviceState *dev = qdev_create(NULL, TYPE_UNIMPLEMENTED_DEVICE); + + qdev_prop_set_string(dev, "name", name); + qdev_prop_set_uint64(dev, "size", size); + qdev_init_nofail(dev); + + sysbus_mmio_map_overlap(SYS_BUS_DEVICE(dev), 0, base, -900); +} + +static void stm32l467_soc_initfn(Object *obj) { + STM32L467State *s = STM32L467_SOC(obj); + + sysbus_init_child_obj(obj, "armv7m", &s->armv7m, sizeof(s->armv7m), + TYPE_ARMV7M); + +} + +static void stm32l467_soc_realize(DeviceState *dev_soc, Error **errp) { + STM32L467State *s = STM32L467_SOC(dev_soc); + Error *err = NULL; + + MemoryRegion *system_memory = get_system_memory(); + + create_unimplemented_layer("IO", 0, 0xFFFFFFFF); + + memory_region_init_rom(&s->flash, OBJECT(dev_soc), "STM32L467.flash", + FLASH_SIZE, &error_fatal); + memory_region_add_subregion(system_memory, FLASH_BASE_ADDRESS, &s->flash); + + memory_region_init_ram(&s->sram1, OBJECT(dev_soc), "STM32F205.sram1", 96 * 1024, &error_fatal); + memory_region_add_subregion(system_memory, 0x20000000, &s->sram1); + + memory_region_init_ram(&s->sram2, OBJECT(dev_soc), "STM32F205.sram2", 32 * 1024, &error_fatal); + memory_region_add_subregion(system_memory, 0x10000000, &s->sram2); + + // alias memory so correct interrupt vector gets loaded + memory_region_init_io(&s->ivt_alias, NULL, &mv88w8618_wlan_ops, NULL, + "musicpal-wlan", 0x100); + memory_region_init_alias(&s->ivt_alias,OBJECT(dev_soc), "alias", system_memory, FLASH_BASE_ADDRESS+0x11000, 0x100); + memory_region_add_subregion(system_memory, 0, &s->ivt_alias); + + DeviceState *armv7m = DEVICE(&s->armv7m); + qdev_prop_set_string(armv7m, "cpu-type", ARM_CPU_TYPE_NAME("cortex-m4")); + object_property_set_link(OBJECT(&s->armv7m), OBJECT(system_memory), + "memory", &error_abort); + object_property_set_bool(OBJECT(&s->armv7m), true, "realized", &err); + if (err != NULL) { + error_propagate(errp, err); + return; + } + +} + +static Property stm32l467_soc_properties[] = { + DEFINE_PROP_STRING("cpu-type", STM32L467State, cpu_type), + DEFINE_PROP_END_OF_LIST(), +}; + +static void stm32l467_soc_class_init(ObjectClass *klass, void *data) { + DeviceClass *dc = DEVICE_CLASS(klass); + + dc->realize = stm32l467_soc_realize; + device_class_set_props(dc, stm32l467_soc_properties); +} + +static const TypeInfo stm32l467_soc_info = { + .name = TYPE_STM32L467_SOC, + .parent = TYPE_SYS_BUS_DEVICE, + .instance_size = sizeof(STM32L467State), + .instance_init = stm32l467_soc_initfn, + .class_init = stm32l467_soc_class_init, +}; + +static void stm32l467_soc_types(void) { + type_register_static(&stm32l467_soc_info); +} + +type_init(stm32l467_soc_types) \ No newline at end of file diff --git a/include/hw/arm/stm32l467_soc.h b/include/hw/arm/stm32l467_soc.h new file mode 100644 index 0000000000000..46633c238fd84 --- /dev/null +++ b/include/hw/arm/stm32l467_soc.h @@ -0,0 +1,26 @@ +#ifndef HW_ARM_STM32L467_SOC_H +#define HW_ARM_STM32L467_SOC_H + +#include "hw/arm/armv7m.h" + +#define TYPE_STM32L467_SOC "stm32l467-soc" +#define STM32L467_SOC(obj) \ + OBJECT_CHECK(STM32L467State, (obj), TYPE_STM32L467_SOC) + +#define FLASH_BASE_ADDRESS 0x8000000 +#define FLASH_SIZE (1024 * 1024) + + +typedef struct STM32L467State { + SysBusDevice parent_obj; + + char *cpu_type; + + ARMv7MState armv7m; + MemoryRegion ivt_alias; + MemoryRegion flash; + MemoryRegion sram1; + MemoryRegion sram2; +} STM32L467State; + +#endif diff --git a/mem.bin b/mem.bin new file mode 100644 index 0000000000000000000000000000000000000000..42e35c00e6f99fb643e08d3068c18131de14709b GIT binary patch literal 262144 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 Date: Tue, 11 Aug 2020 16:58:50 +0200 Subject: [PATCH 03/15] Continue --- hw/arm/amazfit.c | 6 +----- hw/arm/stm32l467_soc.c | 17 ++++++++++------- include/hw/arm/stm32l467_soc.h | 4 ++-- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/hw/arm/amazfit.c b/hw/arm/amazfit.c index b8749039d2794..f179791d06cbf 100644 --- a/hw/arm/amazfit.c +++ b/hw/arm/amazfit.c @@ -21,12 +21,8 @@ static void bip_init(MachineState *machine) { dev = qdev_create(NULL, TYPE_STM32L467_SOC); object_property_set_bool(OBJECT(dev), true, "realized", &error_fatal); - load_image_targphys("/Users/Marijn/temp/chaohu_bootloader.fw", + load_image_targphys("/Users/Marijn/Downloads/bip/image.bin", 0, - 0x200); - - load_image_targphys("/Users/Marijn/Downloads/chaohu_1.1.6.44_ft9_0/chaohu_v1.1.6.44.fw", - FLASH_BASE_ADDRESS + 0x8000, FLASH_SIZE); armv7m_load_kernel(ARM_CPU(first_cpu), NULL, 0); diff --git a/hw/arm/stm32l467_soc.c b/hw/arm/stm32l467_soc.c index 11bc7ebaba0de..041573b2346c2 100644 --- a/hw/arm/stm32l467_soc.c +++ b/hw/arm/stm32l467_soc.c @@ -58,7 +58,15 @@ static void stm32l467_soc_realize(DeviceState *dev_soc, Error **errp) { memory_region_init_rom(&s->flash, OBJECT(dev_soc), "STM32L467.flash", FLASH_SIZE, &error_fatal); - memory_region_add_subregion(system_memory, FLASH_BASE_ADDRESS, &s->flash); + + memory_region_init_alias(&s->flash_alias, + OBJECT(dev_soc), + "alias", + &s->flash, + 0, + FLASH_SIZE); + memory_region_add_subregion(system_memory, 0, &s->flash); + memory_region_add_subregion(system_memory, FLASH_BASE_ADDRESS, &s->flash_alias); memory_region_init_ram(&s->sram1, OBJECT(dev_soc), "STM32F205.sram1", 96 * 1024, &error_fatal); memory_region_add_subregion(system_memory, 0x20000000, &s->sram1); @@ -66,12 +74,6 @@ static void stm32l467_soc_realize(DeviceState *dev_soc, Error **errp) { memory_region_init_ram(&s->sram2, OBJECT(dev_soc), "STM32F205.sram2", 32 * 1024, &error_fatal); memory_region_add_subregion(system_memory, 0x10000000, &s->sram2); - // alias memory so correct interrupt vector gets loaded - memory_region_init_io(&s->ivt_alias, NULL, &mv88w8618_wlan_ops, NULL, - "musicpal-wlan", 0x100); - memory_region_init_alias(&s->ivt_alias,OBJECT(dev_soc), "alias", system_memory, FLASH_BASE_ADDRESS+0x11000, 0x100); - memory_region_add_subregion(system_memory, 0, &s->ivt_alias); - DeviceState *armv7m = DEVICE(&s->armv7m); qdev_prop_set_string(armv7m, "cpu-type", ARM_CPU_TYPE_NAME("cortex-m4")); object_property_set_link(OBJECT(&s->armv7m), OBJECT(system_memory), @@ -82,6 +84,7 @@ static void stm32l467_soc_realize(DeviceState *dev_soc, Error **errp) { return; } + system_clock_scale = 1000; } static Property stm32l467_soc_properties[] = { diff --git a/include/hw/arm/stm32l467_soc.h b/include/hw/arm/stm32l467_soc.h index 46633c238fd84..69d8d51d8ba87 100644 --- a/include/hw/arm/stm32l467_soc.h +++ b/include/hw/arm/stm32l467_soc.h @@ -8,7 +8,7 @@ OBJECT_CHECK(STM32L467State, (obj), TYPE_STM32L467_SOC) #define FLASH_BASE_ADDRESS 0x8000000 -#define FLASH_SIZE (1024 * 1024) +#define FLASH_SIZE (512 * 1024) typedef struct STM32L467State { @@ -17,7 +17,7 @@ typedef struct STM32L467State { char *cpu_type; ARMv7MState armv7m; - MemoryRegion ivt_alias; + MemoryRegion flash_alias; MemoryRegion flash; MemoryRegion sram1; MemoryRegion sram2; From a1978b3e75f73015ae37e520bf7ecb0313830848 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Fri, 14 Aug 2020 16:09:59 +0200 Subject: [PATCH 04/15] Add Flash register that blocked boot --- hw/arm/Makefile.objs | 1 + hw/arm/stm32l467_soc.c | 15 +++++ hw/arm/stm32l476_flash.c | 101 +++++++++++++++++++++++++++++++ include/hw/arm/stm32l467_soc.h | 2 + include/hw/arm/stm32l476_flash.h | 19 ++++++ 5 files changed, 138 insertions(+) create mode 100644 hw/arm/stm32l476_flash.c create mode 100644 include/hw/arm/stm32l476_flash.h diff --git a/hw/arm/Makefile.objs b/hw/arm/Makefile.objs index c9676608fd527..f0f75862adc4b 100644 --- a/hw/arm/Makefile.objs +++ b/hw/arm/Makefile.objs @@ -56,3 +56,4 @@ obj-$(CONFIG_FSL_IMX6UL) += fsl-imx6ul.o mcimx6ul-evk.o obj-$(CONFIG_NRF51_SOC) += nrf51_soc.o obj-y += amazfit.o obj-y += stm32l467_soc.o +obj-y += stm32l476_flash.o diff --git a/hw/arm/stm32l467_soc.c b/hw/arm/stm32l467_soc.c index 041573b2346c2..2a712a8e66e16 100644 --- a/hw/arm/stm32l467_soc.c +++ b/hw/arm/stm32l467_soc.c @@ -13,6 +13,14 @@ #include "hw/arm/stm32l467_soc.h" +#define PERIPH_BASE 0x40000000UL +#define APB1PERIPH_BASE PERIPH_BASE +#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000UL) +#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000UL) +#define AHB2PERIPH_BASE (PERIPH_BASE + 0x08000000UL) + +#define FLASH_R_BASE (AHB1PERIPH_BASE + 0x2000UL) + static uint64_t mv88w8618_wlan_read(void *opaque, hwaddr offset, unsigned size) { printf("read @ 0x%x\n", offset); @@ -46,6 +54,8 @@ static void stm32l467_soc_initfn(Object *obj) { sysbus_init_child_obj(obj, "armv7m", &s->armv7m, sizeof(s->armv7m), TYPE_ARMV7M); + sysbus_init_child_obj(obj, "flash", &s->flash_r, sizeof(s->flash_r), + TYPE_STM32L476_FLASH); } static void stm32l467_soc_realize(DeviceState *dev_soc, Error **errp) { @@ -84,6 +94,11 @@ static void stm32l467_soc_realize(DeviceState *dev_soc, Error **errp) { return; } + /* FLASH registers */ + object_property_set_bool(OBJECT(&s->flash_r), true, "realized", &err); + SysBusDevice *busdev = SYS_BUS_DEVICE(&s->flash_r); + sysbus_mmio_map(busdev, 0, FLASH_R_BASE); + system_clock_scale = 1000; } diff --git a/hw/arm/stm32l476_flash.c b/hw/arm/stm32l476_flash.c new file mode 100644 index 0000000000000..a04f3309b8893 --- /dev/null +++ b/hw/arm/stm32l476_flash.c @@ -0,0 +1,101 @@ +#include "qemu/osdep.h" +#include "hw/sysbus.h" +#include "hw/arm/boot.h" +#include "sysemu/sysemu.h" +#include "exec/address-spaces.h" +#include "qemu/log.h" + +#include "hw/arm/stm32l476_flash.h" + +#define ACR 0x00 +#define PDKEYR 0x04 +#define KEYR 0x08 +#define OPTKEYR 0x0C +#define SR 0x10 +#define CR 0x14 +#define ECCR 0x18 +#define RESERVED1 0x1C +#define OPTR 0x20 +#define PCROP1SR 0x24 +#define PCROP1ER 0x28 +#define WRP1AR 0x2C +#define WRP1BR 0x30 +#define PCROP2SR 0x44 +#define PCROP2ER 0x48 +#define WRP2AR 0x4C +#define WRP2BR 0x50 + +static void stm32l476_flash_reset(DeviceState *dev) { + STM32L476FlashState *s = STM32L476_FLASH(dev); + s->acr_latency = 0; +} + +static uint64_t stm32l476_flash_read(void *opaque, hwaddr offset, + unsigned int size) { + STM32L476FlashState *s = opaque; + + switch (offset) { + case ACR: + return s->acr_latency; + break; + + default: + qemu_log_mask(LOG_UNIMP, "%s: unimplemented device read " + "(size %d, offset 0x%" HWADDR_PRIx ")\n", + __func__, size, offset); + break; + } + return 0; +} + +static void stm32l476_flash_write(void *opaque, hwaddr offset, + uint64_t val64, unsigned int size) { + STM32L476FlashState *s = opaque; + + switch (offset) { + case ACR: + s->acr_latency = val64 & 0x7; + break; + + default: + qemu_log_mask(LOG_UNIMP, "%s: unimplemented device write " + "(size %d, value 0x%" PRIx64 + ", offset 0x%" HWADDR_PRIx ")\n", + __func__, size, val64, offset); + break; + } +} + +static const MemoryRegionOps stm32l476_flash_ops = { + .read = stm32l476_flash_read, + .write = stm32l476_flash_write, + .endianness = DEVICE_NATIVE_ENDIAN, +}; + +static void stm32l476_flash_init(Object *obj) { + STM32L476FlashState *s = STM32L476_FLASH(obj); + + memory_region_init_io(&s->mmio, obj, &stm32l476_flash_ops, s, + TYPE_STM32L476_FLASH, 0x400); + sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->mmio); +} + +static void stm32l476_flash_class_init(ObjectClass *klass, void *data) { + DeviceClass *dc = DEVICE_CLASS(klass); + + dc->reset = stm32l476_flash_reset; +} + +static const TypeInfo stm32l476_flash_info = { + .name = TYPE_STM32L476_FLASH, + .parent = TYPE_SYS_BUS_DEVICE, + .instance_size = sizeof(STM32L476FlashState), + .instance_init = stm32l476_flash_init, + .class_init = stm32l476_flash_class_init, +}; + +static void stm32l476_flash_register_types(void) { + type_register_static(&stm32l476_flash_info); +} + +type_init(stm32l476_flash_register_types) diff --git a/include/hw/arm/stm32l467_soc.h b/include/hw/arm/stm32l467_soc.h index 69d8d51d8ba87..8d5d14d91cf28 100644 --- a/include/hw/arm/stm32l467_soc.h +++ b/include/hw/arm/stm32l467_soc.h @@ -2,6 +2,7 @@ #define HW_ARM_STM32L467_SOC_H #include "hw/arm/armv7m.h" +#include "hw/arm/stm32l476_flash.h" #define TYPE_STM32L467_SOC "stm32l467-soc" #define STM32L467_SOC(obj) \ @@ -17,6 +18,7 @@ typedef struct STM32L467State { char *cpu_type; ARMv7MState armv7m; + STM32L476FlashState flash_r; MemoryRegion flash_alias; MemoryRegion flash; MemoryRegion sram1; diff --git a/include/hw/arm/stm32l476_flash.h b/include/hw/arm/stm32l476_flash.h new file mode 100644 index 0000000000000..1f17be684082e --- /dev/null +++ b/include/hw/arm/stm32l476_flash.h @@ -0,0 +1,19 @@ +#ifndef HW_ARM_STM32L476_FLASH_H +#define HW_ARM_STM32L476_FLASH_H + +#include "hw/arm/armv7m.h" + +#define TYPE_STM32L476_FLASH "stm32l476-flash" +#define STM32L476_FLASH(obj) \ + OBJECT_CHECK(STM32L476FlashState, (obj), TYPE_STM32L476_FLASH) + +typedef struct { + /* */ + SysBusDevice parent_obj; + + /* */ + MemoryRegion mmio; + uint8_t acr_latency; +} STM32L476FlashState; + +#endif From 0a0f15f40b916c32432cfb61c9180289fb5c1803 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Tue, 18 Aug 2020 18:30:52 +0200 Subject: [PATCH 05/15] Progress further into boot process --- hw/arm/Makefile.objs | 3 + hw/arm/stm32l467_soc.c | 167 ++++++++++++++++++++++++++++++- hw/arm/stm32l476_lptim.c | 119 ++++++++++++++++++++++ hw/arm/stm32l476_pwr.c | 123 +++++++++++++++++++++++ hw/arm/stm32l476_rcc.c | 155 ++++++++++++++++++++++++++++ include/hw/arm/stm32l467_soc.h | 6 ++ include/hw/arm/stm32l476_lptim.h | 29 ++++++ include/hw/arm/stm32l476_pwr.h | 34 +++++++ include/hw/arm/stm32l476_rcc.h | 26 +++++ 9 files changed, 661 insertions(+), 1 deletion(-) create mode 100644 hw/arm/stm32l476_lptim.c create mode 100644 hw/arm/stm32l476_pwr.c create mode 100644 hw/arm/stm32l476_rcc.c create mode 100644 include/hw/arm/stm32l476_lptim.h create mode 100644 include/hw/arm/stm32l476_pwr.h create mode 100644 include/hw/arm/stm32l476_rcc.h diff --git a/hw/arm/Makefile.objs b/hw/arm/Makefile.objs index f0f75862adc4b..c574e26de0997 100644 --- a/hw/arm/Makefile.objs +++ b/hw/arm/Makefile.objs @@ -57,3 +57,6 @@ obj-$(CONFIG_NRF51_SOC) += nrf51_soc.o obj-y += amazfit.o obj-y += stm32l467_soc.o obj-y += stm32l476_flash.o +obj-y += stm32l476_lptim.o +obj-y += stm32l476_pwr.o +obj-y += stm32l476_rcc.o diff --git a/hw/arm/stm32l467_soc.c b/hw/arm/stm32l467_soc.c index 2a712a8e66e16..244e60f899787 100644 --- a/hw/arm/stm32l467_soc.c +++ b/hw/arm/stm32l467_soc.c @@ -19,7 +19,147 @@ #define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000UL) #define AHB2PERIPH_BASE (PERIPH_BASE + 0x08000000UL) +/*!< APB1 peripherals */ +#define TIM2_BASE (APB1PERIPH_BASE + 0x0000UL) +#define TIM3_BASE (APB1PERIPH_BASE + 0x0400UL) +#define TIM4_BASE (APB1PERIPH_BASE + 0x0800UL) +#define TIM5_BASE (APB1PERIPH_BASE + 0x0C00UL) +#define TIM6_BASE (APB1PERIPH_BASE + 0x1000UL) +#define TIM7_BASE (APB1PERIPH_BASE + 0x1400UL) +#define LCD_BASE (APB1PERIPH_BASE + 0x2400UL) +#define RTC_BASE (APB1PERIPH_BASE + 0x2800UL) +#define WWDG_BASE (APB1PERIPH_BASE + 0x2C00UL) +#define IWDG_BASE (APB1PERIPH_BASE + 0x3000UL) +#define SPI2_BASE (APB1PERIPH_BASE + 0x3800UL) +#define SPI3_BASE (APB1PERIPH_BASE + 0x3C00UL) +#define USART2_BASE (APB1PERIPH_BASE + 0x4400UL) +#define USART3_BASE (APB1PERIPH_BASE + 0x4800UL) +#define UART4_BASE (APB1PERIPH_BASE + 0x4C00UL) +#define UART5_BASE (APB1PERIPH_BASE + 0x5000UL) +#define I2C1_BASE (APB1PERIPH_BASE + 0x5400UL) +#define I2C2_BASE (APB1PERIPH_BASE + 0x5800UL) +#define I2C3_BASE (APB1PERIPH_BASE + 0x5C00UL) +#define CAN1_BASE (APB1PERIPH_BASE + 0x6400UL) +#define PWR_BASE (APB1PERIPH_BASE + 0x7000UL) +#define DAC_BASE (APB1PERIPH_BASE + 0x7400UL) +#define DAC1_BASE (APB1PERIPH_BASE + 0x7400UL) +#define OPAMP_BASE (APB1PERIPH_BASE + 0x7800UL) +#define OPAMP1_BASE (APB1PERIPH_BASE + 0x7800UL) +#define OPAMP2_BASE (APB1PERIPH_BASE + 0x7810UL) +#define LPTIM1_BASE (APB1PERIPH_BASE + 0x7C00UL) +#define LPUART1_BASE (APB1PERIPH_BASE + 0x8000UL) +#define SWPMI1_BASE (APB1PERIPH_BASE + 0x8800UL) +#define LPTIM2_BASE (APB1PERIPH_BASE + 0x9400UL) + + +/*!< APB2 peripherals */ +#define SYSCFG_BASE (APB2PERIPH_BASE + 0x0000UL) +#define VREFBUF_BASE (APB2PERIPH_BASE + 0x0030UL) +#define COMP1_BASE (APB2PERIPH_BASE + 0x0200UL) +#define COMP2_BASE (APB2PERIPH_BASE + 0x0204UL) +#define EXTI_BASE (APB2PERIPH_BASE + 0x0400UL) +#define FIREWALL_BASE (APB2PERIPH_BASE + 0x1C00UL) +#define SDMMC1_BASE (APB2PERIPH_BASE + 0x2800UL) +#define TIM1_BASE (APB2PERIPH_BASE + 0x2C00UL) +#define SPI1_BASE (APB2PERIPH_BASE + 0x3000UL) +#define TIM8_BASE (APB2PERIPH_BASE + 0x3400UL) +#define USART1_BASE (APB2PERIPH_BASE + 0x3800UL) +#define TIM15_BASE (APB2PERIPH_BASE + 0x4000UL) +#define TIM16_BASE (APB2PERIPH_BASE + 0x4400UL) +#define TIM17_BASE (APB2PERIPH_BASE + 0x4800UL) +#define SAI1_BASE (APB2PERIPH_BASE + 0x5400UL) +#define SAI1_Block_A_BASE (SAI1_BASE + 0x0004UL) +#define SAI1_Block_B_BASE (SAI1_BASE + 0x0024UL) +#define SAI2_BASE (APB2PERIPH_BASE + 0x5800UL) +#define SAI2_Block_A_BASE (SAI2_BASE + 0x0004UL) +#define SAI2_Block_B_BASE (SAI2_BASE + 0x0024UL) +#define DFSDM1_BASE (APB2PERIPH_BASE + 0x6000UL) +#define DFSDM1_Channel0_BASE (DFSDM1_BASE + 0x0000UL) +#define DFSDM1_Channel1_BASE (DFSDM1_BASE + 0x0020UL) +#define DFSDM1_Channel2_BASE (DFSDM1_BASE + 0x0040UL) +#define DFSDM1_Channel3_BASE (DFSDM1_BASE + 0x0060UL) +#define DFSDM1_Channel4_BASE (DFSDM1_BASE + 0x0080UL) +#define DFSDM1_Channel5_BASE (DFSDM1_BASE + 0x00A0UL) +#define DFSDM1_Channel6_BASE (DFSDM1_BASE + 0x00C0UL) +#define DFSDM1_Channel7_BASE (DFSDM1_BASE + 0x00E0UL) +#define DFSDM1_Filter0_BASE (DFSDM1_BASE + 0x0100UL) +#define DFSDM1_Filter1_BASE (DFSDM1_BASE + 0x0180UL) +#define DFSDM1_Filter2_BASE (DFSDM1_BASE + 0x0200UL) +#define DFSDM1_Filter3_BASE (DFSDM1_BASE + 0x0280UL) + +/*!< AHB1 peripherals */ +#define DMA1_BASE (AHB1PERIPH_BASE) +#define DMA2_BASE (AHB1PERIPH_BASE + 0x0400UL) +#define RCC_BASE (AHB1PERIPH_BASE + 0x1000UL) #define FLASH_R_BASE (AHB1PERIPH_BASE + 0x2000UL) +#define CRC_BASE (AHB1PERIPH_BASE + 0x3000UL) +#define TSC_BASE (AHB1PERIPH_BASE + 0x4000UL) + + +#define DMA1_Channel1_BASE (DMA1_BASE + 0x0008UL) +#define DMA1_Channel2_BASE (DMA1_BASE + 0x001CUL) +#define DMA1_Channel3_BASE (DMA1_BASE + 0x0030UL) +#define DMA1_Channel4_BASE (DMA1_BASE + 0x0044UL) +#define DMA1_Channel5_BASE (DMA1_BASE + 0x0058UL) +#define DMA1_Channel6_BASE (DMA1_BASE + 0x006CUL) +#define DMA1_Channel7_BASE (DMA1_BASE + 0x0080UL) +#define DMA1_CSELR_BASE (DMA1_BASE + 0x00A8UL) + + +#define DMA2_Channel1_BASE (DMA2_BASE + 0x0008UL) +#define DMA2_Channel2_BASE (DMA2_BASE + 0x001CUL) +#define DMA2_Channel3_BASE (DMA2_BASE + 0x0030UL) +#define DMA2_Channel4_BASE (DMA2_BASE + 0x0044UL) +#define DMA2_Channel5_BASE (DMA2_BASE + 0x0058UL) +#define DMA2_Channel6_BASE (DMA2_BASE + 0x006CUL) +#define DMA2_Channel7_BASE (DMA2_BASE + 0x0080UL) +#define DMA2_CSELR_BASE (DMA2_BASE + 0x00A8UL) + + +/*!< AHB2 peripherals */ +#define GPIOA_BASE (AHB2PERIPH_BASE + 0x0000UL) +#define GPIOB_BASE (AHB2PERIPH_BASE + 0x0400UL) +#define GPIOC_BASE (AHB2PERIPH_BASE + 0x0800UL) +#define GPIOD_BASE (AHB2PERIPH_BASE + 0x0C00UL) +#define GPIOE_BASE (AHB2PERIPH_BASE + 0x1000UL) +#define GPIOF_BASE (AHB2PERIPH_BASE + 0x1400UL) +#define GPIOG_BASE (AHB2PERIPH_BASE + 0x1800UL) +#define GPIOH_BASE (AHB2PERIPH_BASE + 0x1C00UL) + +#define USBOTG_BASE (AHB2PERIPH_BASE + 0x08000000UL) + +#define ADC1_BASE (AHB2PERIPH_BASE + 0x08040000UL) +#define ADC2_BASE (AHB2PERIPH_BASE + 0x08040100UL) +#define ADC3_BASE (AHB2PERIPH_BASE + 0x08040200UL) +#define ADC123_COMMON_BASE (AHB2PERIPH_BASE + 0x08040300UL) + + +#define RNG_BASE (AHB2PERIPH_BASE + 0x08060800UL) + + +/*!< FMC Banks registers base address */ +#define FMC_Bank1_R_BASE (FMC_R_BASE + 0x0000UL) +#define FMC_Bank1E_R_BASE (FMC_R_BASE + 0x0104UL) +#define FMC_Bank3_R_BASE (FMC_R_BASE + 0x0080UL) + +/* Debug MCU registers base address */ +#define DBGMCU_BASE (0xE0042000UL) + +/*!< USB registers base address */ +#define USB_OTG_FS_PERIPH_BASE (0x50000000UL) + +#define USB_OTG_GLOBAL_BASE (0x00000000UL) +#define USB_OTG_DEVICE_BASE (0x00000800UL) +#define USB_OTG_IN_ENDPOINT_BASE (0x00000900UL) +#define USB_OTG_OUT_ENDPOINT_BASE (0x00000B00UL) +#define USB_OTG_EP_REG_SIZE (0x00000020UL) +#define USB_OTG_HOST_BASE (0x00000400UL) +#define USB_OTG_HOST_PORT_BASE (0x00000440UL) +#define USB_OTG_HOST_CHANNEL_BASE (0x00000500UL) +#define USB_OTG_HOST_CHANNEL_SIZE (0x00000020UL) +#define USB_OTG_PCGCCTL_BASE (0x00000E00UL) +#define USB_OTG_FIFO_BASE (0x00001000UL) +#define USB_OTG_FIFO_SIZE (0x00001000UL) static uint64_t mv88w8618_wlan_read(void *opaque, hwaddr offset, unsigned size) { @@ -54,6 +194,15 @@ static void stm32l467_soc_initfn(Object *obj) { sysbus_init_child_obj(obj, "armv7m", &s->armv7m, sizeof(s->armv7m), TYPE_ARMV7M); + sysbus_init_child_obj(obj, "pwr", &s->pwr, sizeof(s->pwr), + TYPE_STM32L476_PWR); + + sysbus_init_child_obj(obj, "lptim1", &s->lptim1, sizeof(s->lptim1), + TYPE_STM32L476_LPTIM); + + sysbus_init_child_obj(obj, "rcc", &s->rcc, sizeof(s->rcc), + TYPE_STM32L476_RCC); + sysbus_init_child_obj(obj, "flash", &s->flash_r, sizeof(s->flash_r), TYPE_STM32L476_FLASH); } @@ -61,6 +210,7 @@ static void stm32l467_soc_initfn(Object *obj) { static void stm32l467_soc_realize(DeviceState *dev_soc, Error **errp) { STM32L467State *s = STM32L467_SOC(dev_soc); Error *err = NULL; + SysBusDevice *busdev; MemoryRegion *system_memory = get_system_memory(); @@ -94,9 +244,24 @@ static void stm32l467_soc_realize(DeviceState *dev_soc, Error **errp) { return; } + /* PWR registers */ + object_property_set_bool(OBJECT(&s->pwr), true, "realized", &err); + busdev = SYS_BUS_DEVICE(&s->pwr); + sysbus_mmio_map(busdev, 0, PWR_BASE); + + /* LPTIM1 registers */ + object_property_set_bool(OBJECT(&s->lptim1), true, "realized", &err); + busdev = SYS_BUS_DEVICE(&s->lptim1); + sysbus_mmio_map(busdev, 0, LPTIM1_BASE); + + /* RCC registers */ + object_property_set_bool(OBJECT(&s->rcc), true, "realized", &err); + busdev = SYS_BUS_DEVICE(&s->rcc); + sysbus_mmio_map(busdev, 0, RCC_BASE); + /* FLASH registers */ object_property_set_bool(OBJECT(&s->flash_r), true, "realized", &err); - SysBusDevice *busdev = SYS_BUS_DEVICE(&s->flash_r); + busdev = SYS_BUS_DEVICE(&s->flash_r); sysbus_mmio_map(busdev, 0, FLASH_R_BASE); system_clock_scale = 1000; diff --git a/hw/arm/stm32l476_lptim.c b/hw/arm/stm32l476_lptim.c new file mode 100644 index 0000000000000..1a170c381fe48 --- /dev/null +++ b/hw/arm/stm32l476_lptim.c @@ -0,0 +1,119 @@ +#include "qemu/osdep.h" +#include "hw/sysbus.h" +#include "hw/arm/boot.h" +#include "sysemu/sysemu.h" +#include "exec/address-spaces.h" +#include "qemu/log.h" + +#include "hw/arm/stm32l476_lptim.h" + +#define ISR 0x00 +#define ICR 0x04 +#define IER 0x08 +#define CFGR 0x0C +#define CR 0x10 +#define CMP 0x14 +#define LPTIM_ARR 0x18 +#define CNT 0x1C +#define OR 0x20 + +static void stm32l476_lptim_reset(DeviceState *dev) { + STM32L476LPTimState *s = STM32L476_LPTIM(dev); +} + +static uint64_t stm32l476_lptim_read(void *opaque, hwaddr offset, + unsigned int size) { + STM32L476LPTimState *s = opaque; + + switch (offset) { + case ISR: { + uint32_t out = 0; + out |= s->CMPM << 0; + out |= s->ARRM << 1; + out |= s->EXTTRIG << 2; + out |= s->CMPOK << 3; + out |= s->ARROK << 4; + out |= s->UP << 5; + out |= s->DOWN << 6; + return out; + } + default: + qemu_log_mask(LOG_UNIMP, "%s: unimplemented device read " + "(size %d, offset 0x%" HWADDR_PRIx ")\n", + __func__, size, offset); + break; + } + return 0; +} + +static void stm32l476_lptim_write(void *opaque, hwaddr offset, + uint64_t val64, unsigned int size) { + STM32L476LPTimState *s = opaque; + + switch (offset) { + case ICR: { + if ((val64 >> 0) & 1) + s->CMPM = false; + if ((val64 >> 1) & 1) + s->ARRM = false; + if ((val64 >> 2) & 1) + s->EXTTRIG = false; + if ((val64 >> 3) & 1) + s->CMPOK = false; + if ((val64 >> 4) & 1) + s->ARROK = false; + if ((val64 >> 5) & 1) + s->UP = false; + if ((val64 >> 6) & 1) + s->DOWN = false; + break; + } + + case LPTIM_ARR: { + s->ARR = val64 & 0xFFFF; + s->ARROK = true; + break; + } + + default: + qemu_log_mask(LOG_UNIMP, "%s: unimplemented device write " + "(size %d, value 0x%" PRIx64 + ", offset 0x%" HWADDR_PRIx ")\n", + __func__, size, val64, offset); + break; + } +} + +static const MemoryRegionOps stm32l476_lptim_ops = { + .read = stm32l476_lptim_read, + .write = stm32l476_lptim_write, + .endianness = DEVICE_NATIVE_ENDIAN, +}; + +static void stm32l476_lptim_init(Object *obj) { + STM32L476LPTimState *s = STM32L476_LPTIM(obj); + + memory_region_init_io(&s->mmio, obj, &stm32l476_lptim_ops, s, + TYPE_STM32L476_LPTIM, 0x400); + sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->mmio); +} + +static void stm32l476_lptim_class_init(ObjectClass *klass, void *data) { + DeviceClass *dc = DEVICE_CLASS(klass); + + dc->reset = stm32l476_lptim_reset; +} + +static const TypeInfo stm32l476_lptim_info = { + .name = TYPE_STM32L476_LPTIM, + .parent = TYPE_SYS_BUS_DEVICE, + .instance_size = sizeof(STM32L476LPTimState), + .instance_init = stm32l476_lptim_init, + .class_init = stm32l476_lptim_class_init, +}; + +static void stm32l476_lptim_register_types(void) { + type_register_static(&stm32l476_lptim_info); +} + +type_init(stm32l476_lptim_register_types) diff --git a/hw/arm/stm32l476_pwr.c b/hw/arm/stm32l476_pwr.c new file mode 100644 index 0000000000000..62fa31cd4eabd --- /dev/null +++ b/hw/arm/stm32l476_pwr.c @@ -0,0 +1,123 @@ +#include "qemu/osdep.h" +#include "hw/sysbus.h" +#include "hw/arm/boot.h" +#include "sysemu/sysemu.h" +#include "exec/address-spaces.h" +#include "qemu/log.h" + +#include "hw/arm/stm32l476_pwr.h" + +#define CR1 0x00 +#define SR2 0x14 + +static void stm32l476_pwr_reset(DeviceState *dev) { + STM32L476PwrState *s = STM32L476_PWR(dev); + + // CR1 + s->LPMS = 0; + s->LPMS = 0; + s->LPMS = 0; + s->LPMS = 0; + + // SR2 + s->REGLPS = 0; + s->REGLPF = 0; + s->VOSF = 0; + s->PVDO = 0; + s->PVMO1 = 0; + s->PVMO2 = 0; + s->PVMO3 = 0; + s->PVMO4 = 0; +} + +static uint64_t stm32l476_pwr_read(void *opaque, hwaddr offset, + unsigned int size) { + STM32L476PwrState *s = opaque; + + switch (offset) { + case CR1: { + uint32_t out = 0; + + out |= s->LPMS << 0; + out |= s->DBP << 8; + out |= s->VOS << 9; + out |= s->LPR << 14; + return out; + } + case SR2: { + uint32_t out = 0; + + out |= s->REGLPS << 8; + out |= s->REGLPF << 9; + out |= s->VOSF << 10; + out |= s->PVDO << 11; + out |= s->PVMO1 << 12; + out |= s->PVMO2 << 13; + out |= s->PVMO3 << 14; + out |= s->PVMO4 << 15; + return out; + } + default: + qemu_log_mask(LOG_UNIMP, "%s: unimplemented device read " + "(size %d, offset 0x%" HWADDR_PRIx ")\n", + __func__, size, offset); + break; + } + return 0; +} + +static void stm32l476_pwr_write(void *opaque, hwaddr offset, + uint64_t val64, unsigned int size) { + STM32L476PwrState *s = opaque; + + switch (offset) { + case CR1: { + s->LPMS = (val64 >> 0) & 0b111; + s->DBP = (val64 >> 8) & 0b1; + // TODO: disallow writing 0b00/0b11 to VOS + s->VOS = (val64 >> 9) & 0b11; + s->LPR = (val64 >> 14) & 0b1; + break; + } + default: + qemu_log_mask(LOG_UNIMP, "%s: unimplemented device write " + "(size %d, value 0x%" PRIx64 + ", offset 0x%" HWADDR_PRIx ")\n", + __func__, size, val64, offset); + break; + } +} + +static const MemoryRegionOps stm32l476_pwr_ops = { + .read = stm32l476_pwr_read, + .write = stm32l476_pwr_write, + .endianness = DEVICE_NATIVE_ENDIAN, +}; + +static void stm32l476_pwr_init(Object *obj) { + STM32L476PwrState *s = STM32L476_PWR(obj); + + memory_region_init_io(&s->mmio, obj, &stm32l476_pwr_ops, s, + TYPE_STM32L476_PWR, 0x400); + sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->mmio); +} + +static void stm32l476_pwr_class_init(ObjectClass *klass, void *data) { + DeviceClass *dc = DEVICE_CLASS(klass); + + dc->reset = stm32l476_pwr_reset; +} + +static const TypeInfo stm32l476_pwr_info = { + .name = TYPE_STM32L476_PWR, + .parent = TYPE_SYS_BUS_DEVICE, + .instance_size = sizeof(STM32L476PwrState), + .instance_init = stm32l476_pwr_init, + .class_init = stm32l476_pwr_class_init, +}; + +static void stm32l476_pwr_register_types(void) { + type_register_static(&stm32l476_pwr_info); +} + +type_init(stm32l476_pwr_register_types) diff --git a/hw/arm/stm32l476_rcc.c b/hw/arm/stm32l476_rcc.c new file mode 100644 index 0000000000000..2ef355ec535a8 --- /dev/null +++ b/hw/arm/stm32l476_rcc.c @@ -0,0 +1,155 @@ +#include "qemu/osdep.h" +#include "hw/sysbus.h" +#include "hw/arm/boot.h" +#include "sysemu/sysemu.h" +#include "exec/address-spaces.h" +#include "qemu/log.h" + +#include "hw/arm/stm32l476_rcc.h" + +#define CR 0x00 +#define ICSCR 0x04 +#define CFGR 0x08 +#define PLLCFGR 0x0C +#define PLLSAI1CFGR 0x10 +#define PLLSAI2CFGR 0x14 +#define CIER 0x18 +#define CIFR 0x1C +#define CICR 0x20 +#define RESERVED0 0x24 +#define AHB1RSTR 0x28 +#define AHB2RSTR 0x2C +#define AHB3RSTR 0x30 +#define RESERVED1 0x34 +#define APB1RSTR1 0x38 +#define APB1RSTR2 0x3C +#define APB2RSTR 0x40 +#define RESERVED2 0x44 +#define AHB1ENR 0x48 +#define AHB2ENR 0x4C +#define AHB3ENR 0x50 +#define RESERVED3 0x54 +#define APB1ENR1 0x58 +#define APB1ENR2 0x5C +#define APB2ENR 0x60 +#define RESERVED4 0x64 +#define AHB1SMENR 0x68 +#define AHB2SMENR 0x6C +#define AHB3SMENR 0x70 +#define RESERVED5 0x74 +#define APB1SMENR1 0x78 +#define APB1SMENR2 0x7C +#define APB2SMENR 0x80 +#define RESERVED6 0x84 +#define CCIPR 0x88 +#define RESERVED7 0x8C +#define BDCR 0x90 +#define CSR 0x94 + +static void stm32l476_rcc_reset(DeviceState *dev) { + STM32L476RccState *s = STM32L476_RCC(dev); + s->acr_latency = 0; + + // + s->LSEON = false; + s->LSEBYP = false; +} + +static uint64_t stm32l476_rcc_read(void *opaque, hwaddr offset, + unsigned int size) { + STM32L476RccState *s = opaque; + + switch (offset) { + case CR: { + uint32_t out = 0; + out |= 1 << 17; // HSERDY + out |= 1 << 16; // HSEON + out |= 1 << 10; // HSIRDY + out |= 1 << 8; // HSION + out |= 1 << 1; // MSIRDY + return out; + } + + case CFGR: { + uint32_t out = 0; + out |= s->SW << 2; + return out; + } + + case BDCR: { + uint32_t out = 0; + out |= s->LSEON << 0; + if (s->LSEON) + out |= 0b1 << 1; + out |= s->LSEBYP << 2; + return out; + } + + default: + qemu_log_mask(LOG_UNIMP, "%s: unimplemented device read " + "(size %d, offset 0x%" HWADDR_PRIx ")\n", + __func__, size, offset); + break; + } + return 0; +} + +static void stm32l476_rcc_write(void *opaque, hwaddr offset, + uint64_t val64, unsigned int size) { + STM32L476RccState *s = opaque; + + switch (offset) { + + case CFGR: { + s->SW = (val64 >> 0) & 0b11; + break; + } + + case BDCR: { + s->LSEON = (val64 >> 0) & 0b1; + s->LSEBYP = (val64 >> 2) & 0b1; + break; + } + + default: + qemu_log_mask(LOG_UNIMP, "%s: unimplemented device write " + "(size %d, value 0x%" PRIx64 + ", offset 0x%" HWADDR_PRIx ")\n", + __func__, size, val64, offset); + break; + } +} + +static const MemoryRegionOps stm32l476_rcc_ops = { + .read = stm32l476_rcc_read, + .write = stm32l476_rcc_write, + .endianness = DEVICE_NATIVE_ENDIAN, +}; + +static void stm32l476_rcc_init(Object *obj) { + STM32L476RccState *s = STM32L476_RCC(obj); + + memory_region_init_io(&s->mmio, obj, &stm32l476_rcc_ops, s, + TYPE_STM32L476_RCC, 0x400); + sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->mmio); +} + +static void stm32l476_rcc_class_init(ObjectClass *klass, void *data) { + DeviceClass *dc = DEVICE_CLASS(klass); + + dc->reset = stm32l476_rcc_reset; +} + +static const TypeInfo stm32l476_rcc_info = { + .name = TYPE_STM32L476_RCC, + .parent = TYPE_SYS_BUS_DEVICE, + .instance_size = sizeof(STM32L476RccState), + .instance_init = stm32l476_rcc_init, + .class_init = stm32l476_rcc_class_init, +}; + +static void stm32l476_rcc_register_types(void) { + type_register_static(&stm32l476_rcc_info); +} + +type_init(stm32l476_rcc_register_types) diff --git a/include/hw/arm/stm32l467_soc.h b/include/hw/arm/stm32l467_soc.h index 8d5d14d91cf28..7999dce797c30 100644 --- a/include/hw/arm/stm32l467_soc.h +++ b/include/hw/arm/stm32l467_soc.h @@ -3,6 +3,9 @@ #include "hw/arm/armv7m.h" #include "hw/arm/stm32l476_flash.h" +#include "hw/arm/stm32l476_lptim.h" +#include "hw/arm/stm32l476_pwr.h" +#include "hw/arm/stm32l476_rcc.h" #define TYPE_STM32L467_SOC "stm32l467-soc" #define STM32L467_SOC(obj) \ @@ -18,6 +21,9 @@ typedef struct STM32L467State { char *cpu_type; ARMv7MState armv7m; + STM32L476PwrState pwr; + STM32L476LPTimState lptim1; + STM32L476RccState rcc; STM32L476FlashState flash_r; MemoryRegion flash_alias; MemoryRegion flash; diff --git a/include/hw/arm/stm32l476_lptim.h b/include/hw/arm/stm32l476_lptim.h new file mode 100644 index 0000000000000..19f35bb378dd8 --- /dev/null +++ b/include/hw/arm/stm32l476_lptim.h @@ -0,0 +1,29 @@ +#ifndef HW_ARM_STM32L476_LPTIM_H +#define HW_ARM_STM32L476_LPTIM_H + +#include "hw/arm/armv7m.h" + +#define TYPE_STM32L476_LPTIM "stm32l476-lptim" +#define STM32L476_LPTIM(obj) \ + OBJECT_CHECK(STM32L476LPTimState, (obj), TYPE_STM32L476_LPTIM) + +typedef struct { + /* */ + SysBusDevice parent_obj; + + /* */ + MemoryRegion mmio; + + // ISR + bool CMPM; + bool ARRM; + bool EXTTRIG; + bool CMPOK; + bool ARROK; + bool UP; + bool DOWN; + + uint16_t ARR; +} STM32L476LPTimState; + +#endif diff --git a/include/hw/arm/stm32l476_pwr.h b/include/hw/arm/stm32l476_pwr.h new file mode 100644 index 0000000000000..be28154559775 --- /dev/null +++ b/include/hw/arm/stm32l476_pwr.h @@ -0,0 +1,34 @@ +#ifndef HW_ARM_STM32L476_PWR_H +#define HW_ARM_STM32L476_PWR_H + +#include "hw/arm/armv7m.h" + +#define TYPE_STM32L476_PWR "stm32l476-pwr" +#define STM32L476_PWR(obj) \ + OBJECT_CHECK(STM32L476PwrState, (obj), TYPE_STM32L476_PWR) + +typedef struct { + /* */ + SysBusDevice parent_obj; + + /* */ + MemoryRegion mmio; + + // CR1 + uint8_t LPMS; + bool DBP; + uint8_t VOS; + bool LPR; + + // SR2 + bool REGLPS; + bool REGLPF; + bool VOSF; + bool PVDO; + bool PVMO1; + bool PVMO2; + bool PVMO3; + bool PVMO4; +} STM32L476PwrState; + +#endif diff --git a/include/hw/arm/stm32l476_rcc.h b/include/hw/arm/stm32l476_rcc.h new file mode 100644 index 0000000000000..e0c887843e811 --- /dev/null +++ b/include/hw/arm/stm32l476_rcc.h @@ -0,0 +1,26 @@ +#ifndef HW_ARM_STM32L476_RCC_H +#define HW_ARM_STM32L476_RCC_H + +#include "hw/arm/armv7m.h" + +#define TYPE_STM32L476_RCC "stm32l476-rcc" +#define STM32L476_RCC(obj) \ + OBJECT_CHECK(STM32L476RccState, (obj), TYPE_STM32L476_RCC) + +typedef struct { + /* */ + SysBusDevice parent_obj; + + /* */ + MemoryRegion mmio; + uint8_t acr_latency; + + // CFGR + uint8_t SW; + + // BDCR + bool LSEON; + bool LSEBYP; +} STM32L476RccState; + +#endif From 4c66e5cdba08423532554b12a7fac6ab77cbbb7d Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Thu, 20 Aug 2020 10:44:30 +0200 Subject: [PATCH 06/15] HACK configure NVIC for stm32l476xx "16 programmable priority levels (4 bits of interrupt priority are used)" --- hw/intc/armv7m_nvic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c index 1ad35e55292b7..00d03411eddd3 100644 --- a/hw/intc/armv7m_nvic.c +++ b/hw/intc/armv7m_nvic.c @@ -2638,7 +2638,7 @@ static void armv7m_nvic_realize(DeviceState *dev, Error **errp) /* include space for internal exception vectors */ s->num_irq += NVIC_FIRST_IRQ; - s->num_prio_bits = arm_feature(&s->cpu->env, ARM_FEATURE_V7) ? 8 : 2; + s->num_prio_bits = 4; object_property_set_bool(OBJECT(&s->systick[M_REG_NS]), true, "realized", &err); From 714ed6499890b73c78565fc1b51ea7b6c7a65572 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Thu, 20 Aug 2020 21:23:02 +0200 Subject: [PATCH 07/15] Continue implementing LPTIM --- hw/arm/stm32l467_soc.c | 4 + hw/arm/stm32l476_lptim.c | 124 +++++++++++++++++++++++++++++-- include/hw/arm/stm32l476_lptim.h | 37 ++++++--- 3 files changed, 149 insertions(+), 16 deletions(-) diff --git a/hw/arm/stm32l467_soc.c b/hw/arm/stm32l467_soc.c index 244e60f899787..9d9913c703e7d 100644 --- a/hw/arm/stm32l467_soc.c +++ b/hw/arm/stm32l467_soc.c @@ -161,6 +161,8 @@ #define USB_OTG_FIFO_BASE (0x00001000UL) #define USB_OTG_FIFO_SIZE (0x00001000UL) +#define LPTIM1_IRQn 65 + static uint64_t mv88w8618_wlan_read(void *opaque, hwaddr offset, unsigned size) { printf("read @ 0x%x\n", offset); @@ -236,6 +238,7 @@ static void stm32l467_soc_realize(DeviceState *dev_soc, Error **errp) { DeviceState *armv7m = DEVICE(&s->armv7m); qdev_prop_set_string(armv7m, "cpu-type", ARM_CPU_TYPE_NAME("cortex-m4")); + qdev_prop_set_uint32(armv7m, "num-irq", 82); object_property_set_link(OBJECT(&s->armv7m), OBJECT(system_memory), "memory", &error_abort); object_property_set_bool(OBJECT(&s->armv7m), true, "realized", &err); @@ -253,6 +256,7 @@ static void stm32l467_soc_realize(DeviceState *dev_soc, Error **errp) { object_property_set_bool(OBJECT(&s->lptim1), true, "realized", &err); busdev = SYS_BUS_DEVICE(&s->lptim1); sysbus_mmio_map(busdev, 0, LPTIM1_BASE); + sysbus_connect_irq(busdev, 0, qdev_get_gpio_in(armv7m, LPTIM1_IRQn)); /* RCC registers */ object_property_set_bool(OBJECT(&s->rcc), true, "realized", &err); diff --git a/hw/arm/stm32l476_lptim.c b/hw/arm/stm32l476_lptim.c index 1a170c381fe48..789d816c64a38 100644 --- a/hw/arm/stm32l476_lptim.c +++ b/hw/arm/stm32l476_lptim.c @@ -4,21 +4,51 @@ #include "sysemu/sysemu.h" #include "exec/address-spaces.h" #include "qemu/log.h" +#include "hw/irq.h" #include "hw/arm/stm32l476_lptim.h" + +// NOTE: The usleep() helps the MacOS stdout from freezing when we have a lot of print out +#define DPRINTF(fmt, ...) \ + do { \ + qemu_log_mask(LOG_GUEST_ERROR,"LPTIM %s: " fmt , __func__, ## __VA_ARGS__); \ + usleep(100); \ + } while (0) + #define ISR 0x00 -#define ICR 0x04 -#define IER 0x08 -#define CFGR 0x0C -#define CR 0x10 +#define LPTIM_ICR 0x04 +#define LPTIM_IER 0x08 +#define LPTIM_CFGR 0x0C +#define LPTIM_CR 0x10 #define CMP 0x14 #define LPTIM_ARR 0x18 -#define CNT 0x1C -#define OR 0x20 +#define LPTIM_CNT 0x1C +#define LPTIM_OR 0x20 + +#define TIMER_NS (1000000000/32768) + +static int64_t stm32l47xx_lptim_next_transition(STM32L476LPTimState *s, int64_t current_time) { + return current_time + TIMER_NS * s->ARR ; +} + +static void stm32l476_lptim_interrupt(void *opaque) { + STM32L476LPTimState *s = opaque; + + int64_t now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); + s->start = now; + timer_mod(s->timer, stm32l47xx_lptim_next_transition(s, now)); + + if (s->ARRMIE && s->ARRM == false) { + s->ARRM = true; + qemu_set_irq(s->irq, 1); + } + +} static void stm32l476_lptim_reset(DeviceState *dev) { STM32L476LPTimState *s = STM32L476_LPTIM(dev); + s->CNT = 0; } static uint64_t stm32l476_lptim_read(void *opaque, hwaddr offset, @@ -37,6 +67,39 @@ static uint64_t stm32l476_lptim_read(void *opaque, hwaddr offset, out |= s->DOWN << 6; return out; } + case LPTIM_CNT: { + int64_t now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); + int64_t delta = now - s->start; + + int16_t ticks = delta / TIMER_NS; + return ticks; + } + + case LPTIM_IER: { + uint32_t out = 0; + out |= s->CMPMIE << 0; + out |= s->ARRMIE << 1; + out |= s->EXTTRIGIE << 2; + out |= s->CMPOKIE << 3; + out |= s->ARROKIE << 4; + out |= s->UPIE << 5; + out |= s->DOWNIE << 6; + return out; + } + + case LPTIM_ICR: + case LPTIM_CFGR: + case LPTIM_ARR: + break; + + case LPTIM_CR: { + uint32_t out = 0; + out |= s->ENABLE << 0; + out |= s->SNGSTRT << 1; + out |= s->CNTSTRT << 2; + return out; + } + default: qemu_log_mask(LOG_UNIMP, "%s: unimplemented device read " "(size %d, offset 0x%" HWADDR_PRIx ")\n", @@ -51,7 +114,7 @@ static void stm32l476_lptim_write(void *opaque, hwaddr offset, STM32L476LPTimState *s = opaque; switch (offset) { - case ICR: { + case LPTIM_ICR: { if ((val64 >> 0) & 1) s->CMPM = false; if ((val64 >> 1) & 1) @@ -69,6 +132,46 @@ static void stm32l476_lptim_write(void *opaque, hwaddr offset, break; } + case LPTIM_CR: { + bool ENABLE = (val64 >> 0) & 1; + bool SNGSTRT = (val64 >> 1) & 1; + bool CNTSTRT = (val64 >> 2) & 1; + if (CNTSTRT == true && s->CNTSTRT == false) { + DPRINTF("started\n"); + int64_t now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); + s->start = now; + timer_mod(s->timer, stm32l47xx_lptim_next_transition(s, now)); + } else if (CNTSTRT == false && s->CNTSTRT == true) { + DPRINTF("stopped\n"); + timer_del(s->timer); + } + + s->ENABLE = ENABLE; + s->SNGSTRT = SNGSTRT; + s->CNTSTRT = CNTSTRT; + DPRINTF("ENABLE:%d SNGSTRT:%d CNTSTRT:%d\n", ENABLE, SNGSTRT, CNTSTRT); + break; + } + + case LPTIM_IER: { + if (s->ENABLE) { + qemu_log_mask(LOG_GUEST_ERROR, + "The LPTIM_IER register must only be modified when the LPTIM is disabled"); + return; + } + s->CMPMIE = (val64 >> 0) & 1; + s->ARRMIE = (val64 >> 1) & 1; + s->EXTTRIGIE = (val64 >> 2) & 1; + s->CMPOKIE = (val64 >> 3) & 1; + s->ARROKIE = (val64 >> 4) & 1; + s->UPIE = (val64 >> 5) & 1; + s->DOWNIE = (val64 >> 6) & 1; + } + +// case LPTIM_CFGR : +// case LPTIM_OR: +// break; + case LPTIM_ARR: { s->ARR = val64 & 0xFFFF; s->ARROK = true; @@ -96,12 +199,19 @@ static void stm32l476_lptim_init(Object *obj) { memory_region_init_io(&s->mmio, obj, &stm32l476_lptim_ops, s, TYPE_STM32L476_LPTIM, 0x400); sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->mmio); + sysbus_init_irq(SYS_BUS_DEVICE(obj), &s->irq); +} + +static void stm32l476_lptim_realize(DeviceState *dev, Error **errp) { + STM32L476LPTimState *s = STM32L476_LPTIM(dev); + s->timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, stm32l476_lptim_interrupt, s); } static void stm32l476_lptim_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); dc->reset = stm32l476_lptim_reset; + dc->realize = stm32l476_lptim_realize; } static const TypeInfo stm32l476_lptim_info = { diff --git a/include/hw/arm/stm32l476_lptim.h b/include/hw/arm/stm32l476_lptim.h index 19f35bb378dd8..baa5918717389 100644 --- a/include/hw/arm/stm32l476_lptim.h +++ b/include/hw/arm/stm32l476_lptim.h @@ -13,17 +13,36 @@ typedef struct { /* */ MemoryRegion mmio; + qemu_irq irq; + + int64_t start; + QEMUTimer *timer; // ISR - bool CMPM; - bool ARRM; - bool EXTTRIG; - bool CMPOK; - bool ARROK; - bool UP; - bool DOWN; - - uint16_t ARR; + bool CMPM; + bool ARRM; + bool EXTTRIG; + bool CMPOK; + bool ARROK; + bool UP; + bool DOWN; + + // IER: + bool CMPMIE; + bool ARRMIE; + bool EXTTRIGIE; + bool CMPOKIE; + bool ARROKIE; + bool UPIE; + bool DOWNIE; + + // CR + bool ENABLE; + bool SNGSTRT; + bool CNTSTRT; + + uint16_t CNT; + uint16_t ARR; } STM32L476LPTimState; #endif From 2bef9b0844f8fb236639406dff135e7e64809490 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Wed, 9 Sep 2020 18:57:30 +0200 Subject: [PATCH 08/15] Progress into boot --- .gitignore | 1 + hw/arm/stm32l467_soc.c | 22 ++++++++++-- hw/arm/stm32l476_lptim.c | 58 +++++++++++++++++++++++--------- hw/arm/stm32l476_rcc.c | 31 ++++++++++++----- include/hw/arm/stm32l467_soc.h | 1 + include/hw/arm/stm32l476_lptim.h | 2 ++ 6 files changed, 88 insertions(+), 27 deletions(-) diff --git a/.gitignore b/.gitignore index 74bb71abe2635..4e3eed1653f86 100644 --- a/.gitignore +++ b/.gitignore @@ -164,3 +164,4 @@ trace-ust-all.c storage-daemon/ qemu-storage-daemon roms +/build diff --git a/hw/arm/stm32l467_soc.c b/hw/arm/stm32l467_soc.c index 9d9913c703e7d..958961e3646fe 100644 --- a/hw/arm/stm32l467_soc.c +++ b/hw/arm/stm32l467_soc.c @@ -161,6 +161,9 @@ #define USB_OTG_FIFO_BASE (0x00001000UL) #define USB_OTG_FIFO_SIZE (0x00001000UL) +#define QSPI_BASE (0x90000000UL) /*!< QUADSPI memories accessible over AHB base address */ +#define QSPI_R_BASE (0xA0001000UL) /*!< QUADSPI control registers base address */ + #define LPTIM1_IRQn 65 static uint64_t mv88w8618_wlan_read(void *opaque, hwaddr offset, @@ -218,6 +221,21 @@ static void stm32l467_soc_realize(DeviceState *dev_soc, Error **errp) { create_unimplemented_layer("IO", 0, 0xFFFFFFFF); + create_unimplemented_layer("SYSCFG", SYSCFG_BASE, 0x30); + create_unimplemented_layer("TIM2", TIM2_BASE, 0x400); + create_unimplemented_layer("IWDG", IWDG_BASE, 0x400); + create_unimplemented_layer("ADC1", ADC1_BASE, 0x100); + create_unimplemented_layer("ADC2", ADC2_BASE, 0x100); + create_unimplemented_layer("ADC3", ADC3_BASE, 0x100); + create_unimplemented_layer("ADC123_COMMON", ADC123_COMMON_BASE, 0x100); + + create_unimplemented_layer("GPIOA", GPIOA_BASE, 0x400); + create_unimplemented_layer("GPIOB", GPIOB_BASE, 0x400); + create_unimplemented_layer("GPIOC", GPIOC_BASE, 0x400); + create_unimplemented_layer("EXTI", EXTI_BASE, 0x400); + create_unimplemented_layer("QUADSPI", QSPI_R_BASE, 0x400); + + memory_region_init_rom(&s->flash, OBJECT(dev_soc), "STM32L467.flash", FLASH_SIZE, &error_fatal); @@ -231,10 +249,10 @@ static void stm32l467_soc_realize(DeviceState *dev_soc, Error **errp) { memory_region_add_subregion(system_memory, FLASH_BASE_ADDRESS, &s->flash_alias); memory_region_init_ram(&s->sram1, OBJECT(dev_soc), "STM32F205.sram1", 96 * 1024, &error_fatal); - memory_region_add_subregion(system_memory, 0x20000000, &s->sram1); + memory_region_add_subregion(system_memory, 0x20000000, &s->sram1); // 0x18000 memory_region_init_ram(&s->sram2, OBJECT(dev_soc), "STM32F205.sram2", 32 * 1024, &error_fatal); - memory_region_add_subregion(system_memory, 0x10000000, &s->sram2); + memory_region_add_subregion(system_memory, 0x10000000, &s->sram2); // 0x8000 DeviceState *armv7m = DEVICE(&s->armv7m); qdev_prop_set_string(armv7m, "cpu-type", ARM_CPU_TYPE_NAME("cortex-m4")); diff --git a/hw/arm/stm32l476_lptim.c b/hw/arm/stm32l476_lptim.c index 789d816c64a38..10abc3659fab9 100644 --- a/hw/arm/stm32l476_lptim.c +++ b/hw/arm/stm32l476_lptim.c @@ -33,17 +33,27 @@ static int64_t stm32l47xx_lptim_next_transition(STM32L476LPTimState *s, int64_t } static void stm32l476_lptim_interrupt(void *opaque) { - STM32L476LPTimState *s = opaque; +// STM32L476LPTimState *s = opaque; +// +// int64_t now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); +// s->start = now; +// timer_mod(s->timer, stm32l47xx_lptim_next_transition(s, now)); +// +// if (s->ARRMIE && s->ARRM == false) { +// s->ARRM = true; +// qemu_set_irq(s->irq, 1); +// } - int64_t now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); - s->start = now; - timer_mod(s->timer, stm32l47xx_lptim_next_transition(s, now)); +} + +static void stm32l476_lptim_timer_cb(void *opaque) { + STM32L476LPTimState *s = opaque; + printf("TICK\n"); if (s->ARRMIE && s->ARRM == false) { s->ARRM = true; qemu_set_irq(s->irq, 1); } - } static void stm32l476_lptim_reset(DeviceState *dev) { @@ -68,11 +78,14 @@ static uint64_t stm32l476_lptim_read(void *opaque, hwaddr offset, return out; } case LPTIM_CNT: { - int64_t now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); - int64_t delta = now - s->start; - - int16_t ticks = delta / TIMER_NS; - return ticks; +// int64_t now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); +// int64_t delta = now - s->start; +// +// int16_t ticks = delta / TIMER_NS; + ptimer_transaction_begin(s->ptimer); + uint64_t kI = ptimer_get_limit(s->ptimer) - ptimer_get_count(s->ptimer)-1; + ptimer_transaction_commit(s->ptimer); + return kI; } case LPTIM_IER: { @@ -140,10 +153,18 @@ static void stm32l476_lptim_write(void *opaque, hwaddr offset, DPRINTF("started\n"); int64_t now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); s->start = now; - timer_mod(s->timer, stm32l47xx_lptim_next_transition(s, now)); +// timer_mod(s->timer, stm32l47xx_lptim_next_transition(s, now)); + + ptimer_transaction_begin(s->ptimer); + ptimer_set_limit(s->ptimer, s->ARR, true); + ptimer_run(s->ptimer, 0); + ptimer_transaction_commit(s->ptimer); } else if (CNTSTRT == false && s->CNTSTRT == true) { DPRINTF("stopped\n"); - timer_del(s->timer); +// timer_del(s->timer); + ptimer_transaction_begin(s->ptimer); + ptimer_stop(s->ptimer); + ptimer_transaction_commit(s->ptimer); } s->ENABLE = ENABLE; @@ -168,9 +189,9 @@ static void stm32l476_lptim_write(void *opaque, hwaddr offset, s->DOWNIE = (val64 >> 6) & 1; } -// case LPTIM_CFGR : -// case LPTIM_OR: -// break; + case LPTIM_CFGR : + case LPTIM_OR: + break; case LPTIM_ARR: { s->ARR = val64 & 0xFFFF; @@ -202,9 +223,14 @@ static void stm32l476_lptim_init(Object *obj) { sysbus_init_irq(SYS_BUS_DEVICE(obj), &s->irq); } + static void stm32l476_lptim_realize(DeviceState *dev, Error **errp) { STM32L476LPTimState *s = STM32L476_LPTIM(dev); - s->timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, stm32l476_lptim_interrupt, s); +// s->timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, stm32l476_lptim_interrupt, s); + s->ptimer = ptimer_init(stm32l476_lptim_timer_cb, s, PTIMER_POLICY_DEFAULT); + ptimer_transaction_begin(s->ptimer); + ptimer_set_freq(s->ptimer, 40); + ptimer_transaction_commit(s->ptimer); } static void stm32l476_lptim_class_init(ObjectClass *klass, void *data) { diff --git a/hw/arm/stm32l476_rcc.c b/hw/arm/stm32l476_rcc.c index 2ef355ec535a8..0daa17071df07 100644 --- a/hw/arm/stm32l476_rcc.c +++ b/hw/arm/stm32l476_rcc.c @@ -7,13 +7,13 @@ #include "hw/arm/stm32l476_rcc.h" -#define CR 0x00 -#define ICSCR 0x04 +#define RCC_CR 0x00 +#define RCC_ICSCR 0x04 #define CFGR 0x08 -#define PLLCFGR 0x0C +#define RCC_PLLCFGR 0x0C #define PLLSAI1CFGR 0x10 #define PLLSAI2CFGR 0x14 -#define CIER 0x18 +#define RCC_CIER 0x18 #define CIFR 0x1C #define CICR 0x20 #define RESERVED0 0x24 @@ -21,7 +21,7 @@ #define AHB2RSTR 0x2C #define AHB3RSTR 0x30 #define RESERVED1 0x34 -#define APB1RSTR1 0x38 +#define RCC_APB1RSTR1 0x38 #define APB1RSTR2 0x3C #define APB2RSTR 0x40 #define RESERVED2 0x44 @@ -29,9 +29,9 @@ #define AHB2ENR 0x4C #define AHB3ENR 0x50 #define RESERVED3 0x54 -#define APB1ENR1 0x58 +#define RCC_APB1ENR1 0x58 #define APB1ENR2 0x5C -#define APB2ENR 0x60 +#define RCC_APB2ENR 0x60 #define RESERVED4 0x64 #define AHB1SMENR 0x68 #define AHB2SMENR 0x6C @@ -41,7 +41,7 @@ #define APB1SMENR2 0x7C #define APB2SMENR 0x80 #define RESERVED6 0x84 -#define CCIPR 0x88 +#define RCC_CCIPR 0x88 #define RESERVED7 0x8C #define BDCR 0x90 #define CSR 0x94 @@ -60,7 +60,7 @@ static uint64_t stm32l476_rcc_read(void *opaque, hwaddr offset, STM32L476RccState *s = opaque; switch (offset) { - case CR: { + case RCC_CR: { uint32_t out = 0; out |= 1 << 17; // HSERDY out |= 1 << 16; // HSEON @@ -99,6 +99,19 @@ static void stm32l476_rcc_write(void *opaque, hwaddr offset, STM32L476RccState *s = opaque; switch (offset) { + case RCC_CR: + case RCC_ICSCR: + case RCC_PLLCFGR: + case RCC_CIER: + case RCC_APB1RSTR1: + case RCC_APB1ENR1: + case RCC_APB2ENR: + break; + case RCC_CCIPR: + { + printf("CCIPR: 0x%08X\n", val64); + break; + } case CFGR: { s->SW = (val64 >> 0) & 0b11; diff --git a/include/hw/arm/stm32l467_soc.h b/include/hw/arm/stm32l467_soc.h index 7999dce797c30..33db7b67f9640 100644 --- a/include/hw/arm/stm32l467_soc.h +++ b/include/hw/arm/stm32l467_soc.h @@ -25,6 +25,7 @@ typedef struct STM32L467State { STM32L476LPTimState lptim1; STM32L476RccState rcc; STM32L476FlashState flash_r; +// STM32L476TimState tim2; MemoryRegion flash_alias; MemoryRegion flash; MemoryRegion sram1; diff --git a/include/hw/arm/stm32l476_lptim.h b/include/hw/arm/stm32l476_lptim.h index baa5918717389..82efd2a04d0d6 100644 --- a/include/hw/arm/stm32l476_lptim.h +++ b/include/hw/arm/stm32l476_lptim.h @@ -2,6 +2,7 @@ #define HW_ARM_STM32L476_LPTIM_H #include "hw/arm/armv7m.h" +#include "hw/ptimer.h" #define TYPE_STM32L476_LPTIM "stm32l476-lptim" #define STM32L476_LPTIM(obj) \ @@ -17,6 +18,7 @@ typedef struct { int64_t start; QEMUTimer *timer; + ptimer_state * ptimer; // ISR bool CMPM; From 64f4d6655d6a5f4f080010819f08d19818fa1639 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Wed, 16 Sep 2020 23:53:50 +0200 Subject: [PATCH 09/15] Add display and dma --- hw/arm/Makefile.objs | 2 + hw/arm/amazfit.c | 8 +- hw/arm/stm32l467_soc.c | 20 ++++ hw/arm/stm32l476_dma.c | 145 ++++++++++++++++++++++++ hw/arm/stm32l476_lptim.c | 5 +- hw/arm/stm32l476_spi.c | 106 +++++++++++++++++ hw/display/Makefile.objs | 2 + hw/display/jdi-lpm013m126c.c | 200 +++++++++++++++++++++++++++++++++ include/hw/arm/stm32l467_soc.h | 4 + include/hw/arm/stm32l476_dma.h | 29 +++++ include/hw/arm/stm32l476_spi.h | 23 ++++ 11 files changed, 539 insertions(+), 5 deletions(-) create mode 100644 hw/arm/stm32l476_dma.c create mode 100644 hw/arm/stm32l476_spi.c create mode 100644 hw/display/jdi-lpm013m126c.c create mode 100644 include/hw/arm/stm32l476_dma.h create mode 100644 include/hw/arm/stm32l476_spi.h diff --git a/hw/arm/Makefile.objs b/hw/arm/Makefile.objs index c574e26de0997..0afa51c18ad5e 100644 --- a/hw/arm/Makefile.objs +++ b/hw/arm/Makefile.objs @@ -60,3 +60,5 @@ obj-y += stm32l476_flash.o obj-y += stm32l476_lptim.o obj-y += stm32l476_pwr.o obj-y += stm32l476_rcc.o +obj-y += stm32l476_dma.o +obj-y += stm32l476_spi.o diff --git a/hw/arm/amazfit.c b/hw/arm/amazfit.c index f179791d06cbf..73dc83a8fb116 100644 --- a/hw/arm/amazfit.c +++ b/hw/arm/amazfit.c @@ -6,6 +6,7 @@ #include "hw/arm/stm32l467_soc.h" #include "hw/arm/boot.h" #include "hw/loader.h" +#include "hw/ssi/ssi.h" static uint32_t readu32(hwaddr addr) { uint32_t ret; @@ -16,11 +17,14 @@ static uint32_t readu32(hwaddr addr) { } static void bip_init(MachineState *machine) { - DeviceState *dev; - dev = qdev_create(NULL, TYPE_STM32L467_SOC); + STM32L467State *dev = STM32L467_SOC(qdev_create(NULL, TYPE_STM32L467_SOC)); object_property_set_bool(OBJECT(dev), true, "realized", &error_fatal); + SSIBus* spi_bus = (SSIBus *)qdev_get_child_bus(&dev->spi[2], "ssi"); // SPI3 + DeviceState * display = ssi_create_slave_no_init(spi_bus, "jdi-lpm013m126c"); + qdev_init_nofail(display); + load_image_targphys("/Users/Marijn/Downloads/bip/image.bin", 0, FLASH_SIZE); diff --git a/hw/arm/stm32l467_soc.c b/hw/arm/stm32l467_soc.c index 958961e3646fe..735dfa6a97096 100644 --- a/hw/arm/stm32l467_soc.c +++ b/hw/arm/stm32l467_soc.c @@ -210,6 +210,12 @@ static void stm32l467_soc_initfn(Object *obj) { sysbus_init_child_obj(obj, "flash", &s->flash_r, sizeof(s->flash_r), TYPE_STM32L476_FLASH); + + sysbus_init_child_obj(obj, "DMA2", &s->dma, sizeof(s->dma), + TYPE_STM32L476_DMA); + + sysbus_init_child_obj(obj, "SPI3", &s->spi[2], sizeof(s->spi[2]), + TYPE_STM32L476_SPI); } static void stm32l467_soc_realize(DeviceState *dev_soc, Error **errp) { @@ -228,10 +234,14 @@ static void stm32l467_soc_realize(DeviceState *dev_soc, Error **errp) { create_unimplemented_layer("ADC2", ADC2_BASE, 0x100); create_unimplemented_layer("ADC3", ADC3_BASE, 0x100); create_unimplemented_layer("ADC123_COMMON", ADC123_COMMON_BASE, 0x100); + create_unimplemented_layer("SPI1", SPI1_BASE, 0x400); + create_unimplemented_layer("GPIOA", GPIOA_BASE, 0x400); create_unimplemented_layer("GPIOB", GPIOB_BASE, 0x400); create_unimplemented_layer("GPIOC", GPIOC_BASE, 0x400); + create_unimplemented_layer("GPIOG", GPIOG_BASE, 0x400); + create_unimplemented_layer("EXTI", EXTI_BASE, 0x400); create_unimplemented_layer("QUADSPI", QSPI_R_BASE, 0x400); @@ -286,6 +296,16 @@ static void stm32l467_soc_realize(DeviceState *dev_soc, Error **errp) { busdev = SYS_BUS_DEVICE(&s->flash_r); sysbus_mmio_map(busdev, 0, FLASH_R_BASE); + /* DMA registers */ + object_property_set_bool(OBJECT(&s->dma), true, "realized", &err); + busdev = SYS_BUS_DEVICE(&s->dma); + sysbus_mmio_map(busdev, 0, DMA2_BASE); + + /* SPI registers */ + object_property_set_bool(OBJECT(&s->spi[2]), true, "realized", &err); + busdev = SYS_BUS_DEVICE(&s->spi[2]); + sysbus_mmio_map(busdev, 0, SPI3_BASE); + system_clock_scale = 1000; } diff --git a/hw/arm/stm32l476_dma.c b/hw/arm/stm32l476_dma.c new file mode 100644 index 0000000000000..bd1a55d12e70d --- /dev/null +++ b/hw/arm/stm32l476_dma.c @@ -0,0 +1,145 @@ +#include "qemu/osdep.h" +#include "hw/sysbus.h" +#include "hw/arm/boot.h" +#include "sysemu/sysemu.h" +#include "exec/address-spaces.h" +#include "qemu/log.h" + +#include "hw/arm/stm32l476_dma.h" + +#define DMA_IFCR 0x04 +#define DMA_CCRx 0x08 + +#define DMA_CCR2 0x1C +#define DMA_CNDTR2 0x20 +#define DMA_CPAR2 0x24 +#define DMA_CMAR2 0x28 + +#define DMA_CSELR 0xA8 + +static void stm32l476_dma_reset(DeviceState *dev) { + STM32L476DmaState *s = STM32L476_DMA(dev); +} + +static uint64_t stm32l476_dma_read(void *opaque, hwaddr offset, + unsigned int size) { + STM32L476DmaState *s = opaque; + + switch (offset) { + case DMA_CCR2: + break; + + case DMA_CSELR: { + uint32_t out = 0; + out |= s->channels[0].CxS << 0; + out |= s->channels[1].CxS << 4; + out |= s->channels[2].CxS << 8; + out |= s->channels[3].CxS << 12; + out |= s->channels[4].CxS << 16; + out |= s->channels[5].CxS << 20; + out |= s->channels[6].CxS << 24; + return out; + } + + default: + qemu_log_mask(LOG_UNIMP, "%s: unimplemented device read " + "(size %d, offset 0x%" HWADDR_PRIx ")\n", + __func__, size, offset); + break; + } + return 0; +} + +static void stm32l476_dma_write(void *opaque, hwaddr offset, + uint64_t val64, unsigned int size) { + STM32L476DmaState *s = opaque; + + if (offset >= DMA_CCRx) { + hwaddr pos = offset - DMA_CCRx; + int channel = pos / 0x14; + int reg = pos % 0x14; + + } + + switch (offset) { + case DMA_IFCR: + for (int c = 0; c < 7; c++) { + if (extract64(val64, c * 4 + 0, 1) == 1) { + // CGIF1 + } + if (extract64(val64, c * 4 + 1, 1) == 1) { + // CTCIF1 + } + if (extract64(val64, c * 4 + 2, 1) == 1) { + // CHTIF1 + } + if (extract64(val64, c * 4 + 3, 1) == 1) { + // CTEIF1 + } + } + break; + + case DMA_CCR2: + break; + case DMA_CNDTR2: + s->channels[1].NDTR = extract64(val64, 0, 16); + break; + case DMA_CPAR2: + s->channels[1].PA = extract64(val64, 0, 32); + break; + case DMA_CMAR2: + s->channels[1].MA = extract64(val64, 0, 32); + break; + + case DMA_CSELR: + s->channels[0].CxS = extract64(val64, 0, 4); + s->channels[1].CxS = extract64(val64, 4, 4); + s->channels[2].CxS = extract64(val64, 8, 4); + s->channels[3].CxS = extract64(val64, 12, 4); + s->channels[4].CxS = extract64(val64, 16, 4); + s->channels[5].CxS = extract64(val64, 20, 4); + s->channels[6].CxS = extract64(val64, 24, 4); + break; + + default: + qemu_log_mask(LOG_UNIMP, "%s: unimplemented device write " + "(size %d, value 0x%" PRIx64 + ", offset 0x%" HWADDR_PRIx ")\n", + __func__, size, val64, offset); + break; + } +} + +static const MemoryRegionOps stm32l476_dma_ops = { + .read = stm32l476_dma_read, + .write = stm32l476_dma_write, + .endianness = DEVICE_NATIVE_ENDIAN, +}; + +static void stm32l476_dma_init(Object *obj) { + STM32L476DmaState *s = STM32L476_DMA(obj); + + memory_region_init_io(&s->mmio, obj, &stm32l476_dma_ops, s, + TYPE_STM32L476_DMA, 0x400); + sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->mmio); +} + +static void stm32l476_dma_class_init(ObjectClass *klass, void *data) { + DeviceClass *dc = DEVICE_CLASS(klass); + + dc->reset = stm32l476_dma_reset; +} + +static const TypeInfo stm32l476_dma_info = { + .name = TYPE_STM32L476_DMA, + .parent = TYPE_SYS_BUS_DEVICE, + .instance_size = sizeof(STM32L476DmaState), + .instance_init = stm32l476_dma_init, + .class_init = stm32l476_dma_class_init, +}; + +static void stm32l476_dma_register_types(void) { + type_register_static(&stm32l476_dma_info); +} + +type_init(stm32l476_dma_register_types) diff --git a/hw/arm/stm32l476_lptim.c b/hw/arm/stm32l476_lptim.c index 10abc3659fab9..cdcea7f9dceff 100644 --- a/hw/arm/stm32l476_lptim.c +++ b/hw/arm/stm32l476_lptim.c @@ -48,11 +48,10 @@ static void stm32l476_lptim_interrupt(void *opaque) { static void stm32l476_lptim_timer_cb(void *opaque) { STM32L476LPTimState *s = opaque; - printf("TICK\n"); if (s->ARRMIE && s->ARRM == false) { s->ARRM = true; - qemu_set_irq(s->irq, 1); + qemu_irq_pulse(s->irq); } } @@ -229,7 +228,7 @@ static void stm32l476_lptim_realize(DeviceState *dev, Error **errp) { // s->timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, stm32l476_lptim_interrupt, s); s->ptimer = ptimer_init(stm32l476_lptim_timer_cb, s, PTIMER_POLICY_DEFAULT); ptimer_transaction_begin(s->ptimer); - ptimer_set_freq(s->ptimer, 40); + ptimer_set_freq(s->ptimer, 32768); ptimer_transaction_commit(s->ptimer); } diff --git a/hw/arm/stm32l476_spi.c b/hw/arm/stm32l476_spi.c new file mode 100644 index 0000000000000..a12bf67613531 --- /dev/null +++ b/hw/arm/stm32l476_spi.c @@ -0,0 +1,106 @@ +#include "qemu/osdep.h" +#include "hw/sysbus.h" +#include "hw/arm/boot.h" +#include "sysemu/sysemu.h" +#include "exec/address-spaces.h" +#include "qemu/log.h" +#include "hw/ssi/ssi.h" +#include "hw/arm/stm32l476_spi.h" + +#define SPIx_CR1 0x00 +#define SPIx_CR2 0x04 +#define SPIx_SR 0x08 +#define SPIx_DR 0x0C + +static void stm32l476_spi_reset(DeviceState *dev) { + STM32L476SpiState *s = STM32L476_SPI(dev); +} + +static uint64_t stm32l476_spi_read(void *opaque, hwaddr offset, + unsigned int size) { + STM32L476SpiState *s = opaque; + + switch (offset) { + case SPIx_CR1: + case SPIx_CR2: + break; + + case SPIx_SR: { + uint32_t out = 0; + out |= 0 << 0; //RXNE + out |= 1 << 1; // TXE + out |= 0 << 4; // CRCERR + out |= 0 << 5; // MODF + out |= 0 << 6; // OVR + out |= 0 << 7; // BSY + out |= 0 << 8; // FRE + out |= 0 << 9; // FRLVL + out |= 0 << 11; // FTLVL + return out; + } + + default: + qemu_log_mask(LOG_UNIMP, "%s: unimplemented device read " + "(size %d, offset 0x%" HWADDR_PRIx ")\n", + __func__, size, offset); + break; + } + return 0; +} + +static void stm32l476_spi_write(void *opaque, hwaddr offset, + uint64_t val64, unsigned int size) { + STM32L476SpiState *s = opaque; + + switch (offset) { + case SPIx_CR1: + case SPIx_CR2: + break; + case SPIx_DR: + ssi_transfer(s->spi, val64); + break; + + default: + qemu_log_mask(LOG_UNIMP, "%s: unimplemented device write " + "(size %d, value 0x%" PRIx64 + ", offset 0x%" HWADDR_PRIx ")\n", + __func__, size, val64, offset); + break; + } +} + +static const MemoryRegionOps stm32l476_spi_ops = { + .read = stm32l476_spi_read, + .write = stm32l476_spi_write, + .endianness = DEVICE_NATIVE_ENDIAN, +}; + +static void stm32l476_spi_init(Object *obj) { + STM32L476SpiState *s = STM32L476_SPI(obj); + + memory_region_init_io(&s->mmio, obj, &stm32l476_spi_ops, s, + TYPE_STM32L476_SPI, 0x400); + sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->mmio); + + s->spi = ssi_create_bus(DEVICE(obj), "ssi"); +} + +static void stm32l476_spi_class_init(ObjectClass *klass, void *data) { + DeviceClass *dc = DEVICE_CLASS(klass); + + dc->reset = stm32l476_spi_reset; +} + +static const TypeInfo stm32l476_spi_info = { + .name = TYPE_STM32L476_SPI, + .parent = TYPE_SYS_BUS_DEVICE, + .instance_size = sizeof(STM32L476SpiState), + .instance_init = stm32l476_spi_init, + .class_init = stm32l476_spi_class_init, +}; + +static void stm32l476_spi_register_types(void) { + type_register_static(&stm32l476_spi_info); +} + +type_init(stm32l476_spi_register_types) diff --git a/hw/display/Makefile.objs b/hw/display/Makefile.objs index 77a7d622bd2da..a7763d3ca252b 100644 --- a/hw/display/Makefile.objs +++ b/hw/display/Makefile.objs @@ -60,3 +60,5 @@ common-obj-$(CONFIG_DPCD) += dpcd.o common-obj-$(CONFIG_XLNX_ZYNQMP_ARM) += xlnx_dp.o common-obj-$(CONFIG_ATI_VGA) += ati.o ati_2d.o ati_dbg.o + +obj-y += jdi-lpm013m126c.o \ No newline at end of file diff --git a/hw/display/jdi-lpm013m126c.c b/hw/display/jdi-lpm013m126c.c new file mode 100644 index 0000000000000..bbdfac3a43112 --- /dev/null +++ b/hw/display/jdi-lpm013m126c.c @@ -0,0 +1,200 @@ +#include "qemu/osdep.h" +#include "hw/sysbus.h" +#include "hw/arm/boot.h" +#include "sysemu/sysemu.h" +#include "exec/address-spaces.h" +#include "qemu/log.h" +#include "hw/ssi/ssi.h" +#include "ui/console.h" +#include "ui/pixel_ops.h" + +typedef struct { + uint8_t r; + uint8_t g; + uint8_t b; +} rgb; + +typedef struct { + SSISlave ssidev; + QemuConsole *con; + + int state; + uint16_t header; + + rgb buffer[176][176]; + uint32_t fifo; + uint32_t fifo_len; + uint32_t bpp; + int cur_x; + int line; +} lcd_state; + +#define TYPE_LCD "jdi-lpm013m126c" +#define LCD(obj) \ + OBJECT_CHECK(lcd_state, (obj), TYPE_LCD) + +#define M0_HI(x) ((((x) >> 0) & 1) != 0) +#define M1_HI(x) ((((x) >> 1) & 1) != 0) +#define M2_HI(x) ((((x) >> 2) & 1) != 0) +#define M3_HI(x) ((((x) >> 3) & 1) != 0) +#define M4_HI(x) ((((x) >> 4) & 1) != 0) +#define M5_HI(x) ((((x) >> 5) & 1) != 0) + +#define M0_LOW(x) ((((x) >> 0) & 1) == 0) +#define M1_LOW(x) ((((x) >> 1) & 1) == 0) +#define M2_LOW(x) ((((x) >> 2) & 1) == 0) +#define M3_LOW(x) ((((x) >> 3) & 1) == 0) +#define M4_LOW(x) ((((x) >> 4) & 1) == 0) +#define M5_LOW(x) ((((x) >> 5) & 1) == 0) + +static uint8_t bitswap8(uint8_t val) { + return ((val * 0x0802LU & 0x22110LU) | (val * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16; +} + +uint32_t parse_header(lcd_state *s, uint16_t header) { + if (M0_LOW(header) && M2_HI(header)) { + printf("all clear"); + for (int x = 0; x < 176; x++) { + for (int y = 0; y < 176; y++) { + s->buffer[y][x].r = x % 2; + s->buffer[y][x].g = y % 2; + s->buffer[y][x].b = 0; + } + } + s->state = 0; + return 0; + } + + if (M0_HI(header) && M2_LOW(header) && M3_HI(header)) { + // Update + + s->state = 2; + s->line = bitswap8(header >> 8) - 1; + s->cur_x = 0; + if (M3_HI(header)) { + s->bpp = 4; + } else if (M4_HI(header)) { + s->bpp = 1; + } else { + s->bpp = 3; + } + + return 0; + } + + s->state = 0; + return 0; +} + +uint32_t jdi_lpm013m126c_transfer(SSISlave *bus, uint32_t val32) { + lcd_state *s = LCD(bus); + uint8_t val = bitswap8(val32 & 0xFF); + + if (s->state == -1) { + return 0; + } + + if (s->state == 0) { + s->header = val; + s->state = 1; + return 0; + } + + if (s->state == 1) { + s->header |= val << 8; + + s->state = -1; + parse_header(s, s->header); +// assert(s->state != -1); + return 0; + } + + if (s->state == 2) { + s->fifo |= val << s->fifo_len; + s->fifo_len += 8; + + while (s->fifo_len >= s->bpp) { + + int r, g, b; + if (s->bpp == 1) { + r = g = b = s->fifo & 1; + } else { + r = (s->fifo >> 0) & 1; + g = (s->fifo >> 1) & 1; + b = (s->fifo >> 2) & 1; + } + + s->buffer[s->line][s->cur_x].r = r; + s->buffer[s->line][s->cur_x].g = g; + s->buffer[s->line][s->cur_x].b = b; + s->fifo = s->fifo >> s->bpp; + s->fifo_len -= s->bpp; + + s->cur_x++; + if (s->cur_x == 176) { + s->state = 0; + return 0; + } + } + } +} + +static void sm_lcd_update_display(void *arg) { + lcd_state *s = arg; + + DisplaySurface *surface = qemu_console_surface(s->con); + int bpp = surface_bits_per_pixel(surface); + void *d = surface_data(surface); + + assert(bpp == 32); + + for (int y = 0; y < 176; y++) { + for (int x = 0; x < 176; x++) { + + *((uint32_t *) d) = rgb_to_pixel32( + s->buffer[y][x].r * 255, + s->buffer[y][x].g * 255, + s->buffer[y][x].b * 255); + d += 4; + } + } + dpy_gfx_update(s->con, 0, 0, 176, 176); +} + +static void sm_lcd_invalidate_display(void *arg) { + lcd_state *s = arg; +} + +static const GraphicHwOps sm_lcd_ops = { + .gfx_update = sm_lcd_update_display, + .invalidate = sm_lcd_invalidate_display, +}; + +static void jdi_lpm013m126c_realize(SSISlave *d, Error **errp) { + + DeviceState *dev = DEVICE(d); + lcd_state *s = LCD(dev); + + s->con = graphic_console_init(dev, 0, &sm_lcd_ops, s); + qemu_console_resize(s->con, 176, 176); +} + +static void jdi_lpm013m126c_class_init(ObjectClass *klass, void *data) { + SSISlaveClass *k = SSI_SLAVE_CLASS(klass); + k->transfer = jdi_lpm013m126c_transfer; + k->realize = jdi_lpm013m126c_realize; + k->cs_polarity = SSI_CS_LOW; +} + +static const TypeInfo jdi_lpm013m126c_info = { + .name = TYPE_LCD, + .parent = TYPE_SSI_SLAVE, + .instance_size = sizeof(lcd_state), + .class_init = jdi_lpm013m126c_class_init, +}; + +static void jdi_lpm013m126c_register_types(void) { + type_register_static(&jdi_lpm013m126c_info); +} + +type_init(jdi_lpm013m126c_register_types) diff --git a/include/hw/arm/stm32l467_soc.h b/include/hw/arm/stm32l467_soc.h index 33db7b67f9640..1fba0557f11af 100644 --- a/include/hw/arm/stm32l467_soc.h +++ b/include/hw/arm/stm32l467_soc.h @@ -6,6 +6,8 @@ #include "hw/arm/stm32l476_lptim.h" #include "hw/arm/stm32l476_pwr.h" #include "hw/arm/stm32l476_rcc.h" +#include "hw/arm/stm32l476_dma.h" +#include "hw/arm/stm32l476_spi.h" #define TYPE_STM32L467_SOC "stm32l467-soc" #define STM32L467_SOC(obj) \ @@ -25,6 +27,8 @@ typedef struct STM32L467State { STM32L476LPTimState lptim1; STM32L476RccState rcc; STM32L476FlashState flash_r; + STM32L476DmaState dma; + STM32L476SpiState spi[3]; // STM32L476TimState tim2; MemoryRegion flash_alias; MemoryRegion flash; diff --git a/include/hw/arm/stm32l476_dma.h b/include/hw/arm/stm32l476_dma.h new file mode 100644 index 0000000000000..c378efa597da7 --- /dev/null +++ b/include/hw/arm/stm32l476_dma.h @@ -0,0 +1,29 @@ +#ifndef HW_ARM_STM32L476_DMA_H +#define HW_ARM_STM32L476_DMA_H + +#include "hw/arm/armv7m.h" + +#define TYPE_STM32L476_DMA "stm32l476-dma" +#define STM32L476_DMA(obj) \ + OBJECT_CHECK(STM32L476DmaState, (obj), TYPE_STM32L476_DMA) + + +typedef struct STM32L476DmaChannelState { + uint8_t CxS; + uint16_t NDTR; + uint32_t PA; + uint32_t MA; +} STM32L476DmaChannelState; + +typedef struct { + /* */ + SysBusDevice parent_obj; + + /* */ + MemoryRegion mmio; + qemu_irq irq; + STM32L476DmaChannelState channels[7]; + +} STM32L476DmaState; + +#endif diff --git a/include/hw/arm/stm32l476_spi.h b/include/hw/arm/stm32l476_spi.h new file mode 100644 index 0000000000000..ab4cc178b6ff2 --- /dev/null +++ b/include/hw/arm/stm32l476_spi.h @@ -0,0 +1,23 @@ +#ifndef HW_ARM_STM32L476_SPI_H +#define HW_ARM_STM32L476_SPI_H + +#include "hw/arm/armv7m.h" + +#define TYPE_STM32L476_SPI "stm32l476-spi" +#define STM32L476_SPI(obj) \ + OBJECT_CHECK(STM32L476SpiState, (obj), TYPE_STM32L476_SPI) + + +typedef struct { + /* */ + SysBusDevice parent_obj; + + /* */ + MemoryRegion mmio; + qemu_irq irq; + + SSIBus *spi; + +} STM32L476SpiState; + +#endif From 5aa67b7fbee1b44dc7fdcce263a47e8c8a5c67f2 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Tue, 22 Sep 2020 19:50:21 +0200 Subject: [PATCH 10/15] Transfer display cmd using dma --- hw/arm/stm32l467_soc.c | 24 ++++++- hw/arm/stm32l476_dma.c | 119 ++++++++++++++++++++++++++++++++- hw/arm/stm32l476_spi.c | 19 +++++- include/hw/arm/stm32l476_dma.h | 25 ++++++- include/hw/arm/stm32l476_spi.h | 4 ++ 5 files changed, 183 insertions(+), 8 deletions(-) diff --git a/hw/arm/stm32l467_soc.c b/hw/arm/stm32l467_soc.c index 735dfa6a97096..08f52a341a9e1 100644 --- a/hw/arm/stm32l467_soc.c +++ b/hw/arm/stm32l467_soc.c @@ -164,7 +164,18 @@ #define QSPI_BASE (0x90000000UL) /*!< QUADSPI memories accessible over AHB base address */ #define QSPI_R_BASE (0xA0001000UL) /*!< QUADSPI control registers base address */ -#define LPTIM1_IRQn 65 +enum { + DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */ + DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */ + DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */ + DMA2_Channel4_IRQn = 59, /*!< DMA2 Channel 4 global Interrupt */ + DMA2_Channel5_IRQn = 60, /*!< DMA2 Channel 5 global Interrupt */ + + LPTIM1_IRQn = 65, /*!< LP TIM1 interrupt */ + + DMA2_Channel6_IRQn = 68, /*!< DMA2 Channel 6 global interrupt */ + DMA2_Channel7_IRQn = 69, /*!< DMA2 Channel 7 global interrupt */ +}; static uint64_t mv88w8618_wlan_read(void *opaque, hwaddr offset, unsigned size) { @@ -216,6 +227,8 @@ static void stm32l467_soc_initfn(Object *obj) { sysbus_init_child_obj(obj, "SPI3", &s->spi[2], sizeof(s->spi[2]), TYPE_STM32L476_SPI); + s->spi[2].rxdrq = s->dma.channels[0].drq[0b0011]; // RX + s->spi[2].txdrq = s->dma.channels[1].drq[0b0011]; // TX } static void stm32l467_soc_realize(DeviceState *dev_soc, Error **errp) { @@ -260,9 +273,11 @@ static void stm32l467_soc_realize(DeviceState *dev_soc, Error **errp) { memory_region_init_ram(&s->sram1, OBJECT(dev_soc), "STM32F205.sram1", 96 * 1024, &error_fatal); memory_region_add_subregion(system_memory, 0x20000000, &s->sram1); // 0x18000 + // memsave 0x20000000 0x18000 ../sram1.bin memory_region_init_ram(&s->sram2, OBJECT(dev_soc), "STM32F205.sram2", 32 * 1024, &error_fatal); memory_region_add_subregion(system_memory, 0x10000000, &s->sram2); // 0x8000 + // memsave 0x10000000 0x8000 ../sram2.bin DeviceState *armv7m = DEVICE(&s->armv7m); qdev_prop_set_string(armv7m, "cpu-type", ARM_CPU_TYPE_NAME("cortex-m4")); @@ -300,6 +315,13 @@ static void stm32l467_soc_realize(DeviceState *dev_soc, Error **errp) { object_property_set_bool(OBJECT(&s->dma), true, "realized", &err); busdev = SYS_BUS_DEVICE(&s->dma); sysbus_mmio_map(busdev, 0, DMA2_BASE); + sysbus_connect_irq(busdev, 0, qdev_get_gpio_in(armv7m, DMA2_Channel1_IRQn)); + sysbus_connect_irq(busdev, 1, qdev_get_gpio_in(armv7m, DMA2_Channel2_IRQn)); + sysbus_connect_irq(busdev, 2, qdev_get_gpio_in(armv7m, DMA2_Channel3_IRQn)); + sysbus_connect_irq(busdev, 3, qdev_get_gpio_in(armv7m, DMA2_Channel4_IRQn)); + sysbus_connect_irq(busdev, 4, qdev_get_gpio_in(armv7m, DMA2_Channel5_IRQn)); + sysbus_connect_irq(busdev, 5, qdev_get_gpio_in(armv7m, DMA2_Channel6_IRQn)); + sysbus_connect_irq(busdev, 6, qdev_get_gpio_in(armv7m, DMA2_Channel7_IRQn)); /* SPI registers */ object_property_set_bool(OBJECT(&s->spi[2]), true, "realized", &err); diff --git a/hw/arm/stm32l476_dma.c b/hw/arm/stm32l476_dma.c index bd1a55d12e70d..f82e4da86a108 100644 --- a/hw/arm/stm32l476_dma.c +++ b/hw/arm/stm32l476_dma.c @@ -4,9 +4,11 @@ #include "sysemu/sysemu.h" #include "exec/address-spaces.h" #include "qemu/log.h" +#include "hw/irq.h" #include "hw/arm/stm32l476_dma.h" +#define DMA_ISR 0x00 #define DMA_IFCR 0x04 #define DMA_CCRx 0x08 @@ -21,13 +23,63 @@ static void stm32l476_dma_reset(DeviceState *dev) { STM32L476DmaState *s = STM32L476_DMA(dev); } +static void update_interrupt(STM32L476DmaState *s) { + for (int c = 0; c < 7; c++) { + int state = 0; + if (s->channels[c].HTIE && s->channels[c].HTIF) + state = 1; + if (s->channels[c].TCIE && s->channels[c].TCIF) + state = 1; + if (s->channels[c].TEIE && s->channels[c].TEIF) + state = 1; + + qemu_set_irq(s->irq[c], state); + } + +} + +static void enable_channel(STM32L476DmaState *s, int c, bool enabled) { + STM32L476DmaChannelState *channel = &s->channels[c]; + if (enabled == channel->EN) + return; + + channel->EN = enabled; + +} + static uint64_t stm32l476_dma_read(void *opaque, hwaddr offset, unsigned int size) { STM32L476DmaState *s = opaque; switch (offset) { - case DMA_CCR2: - break; + case DMA_ISR: { + uint32_t out = 0; + for (int i = 0; i < 7; i++) { + out |= (s->channels[i].TCIF || s->channels[i].HTIF || s->channels[i].TEIF) << (0 + 4 * i); + out |= s->channels[i].TCIF << (1 + 4 * i); + out |= s->channels[i].HTIF << (2 + 4 * i); + out |= s->channels[i].TEIF << (3 + 4 * i); + } + return out; + } + + case DMA_CCR2: { + STM32L476DmaChannelState *channel = &s->channels[1]; + uint32_t out = 0; + out |= channel->EN << 0; + out |= channel->TCIE << 1; + out |= channel->HTIE << 2; + out |= channel->TEIE << 3; + out |= channel->DIR << 4; + out |= channel->CIRC << 5; + out |= channel->PINC << 6; + out |= channel->MINC << 7; + out |= channel->PSIZE << 8; + out |= channel->MSIZE << 10; + out |= channel->PL << 12; + out |= channel->MEM2MEM << 14; + return out; + } case DMA_CSELR: { uint32_t out = 0; @@ -80,14 +132,37 @@ static void stm32l476_dma_write(void *opaque, hwaddr offset, break; case DMA_CCR2: + enable_channel(s, 1, extract64(val64, 0, 1)); + + // not read-only, should warn + s->channels[1].TCIE = extract64(val64, 1, 1); + s->channels[1].HTIE = extract64(val64, 2, 1); + s->channels[1].TEIE = extract64(val64, 3, 1); + s->channels[1].CIRC = extract64(val64, 5, 1); + + // read only, should probably error on difference + if (s->channels[1].EN == false) { + s->channels[1].DIR = extract64(val64, 4, 1); + s->channels[1].PINC = extract64(val64, 6, 1); + s->channels[1].MINC = extract64(val64, 7, 1); + s->channels[1].PSIZE = extract64(val64, 8, 2); + s->channels[1].MSIZE = extract64(val64, 10, 2); + s->channels[1].PL = extract64(val64, 12, 2); + s->channels[1].MEM2MEM = extract64(val64, 14, 1); + } break; case DMA_CNDTR2: - s->channels[1].NDTR = extract64(val64, 0, 16); + // read only, should probably error on difference + if (s->channels[1].EN == false) { + s->channels[1].NDTR = extract64(val64, 0, 16); + } break; case DMA_CPAR2: + // not read-only, should warn s->channels[1].PA = extract64(val64, 0, 32); break; case DMA_CMAR2: + // not read-only, should warn s->channels[1].MA = extract64(val64, 0, 32); break; @@ -116,12 +191,50 @@ static const MemoryRegionOps stm32l476_dma_ops = { .endianness = DEVICE_NATIVE_ENDIAN, }; +static void omap_dma_request(void *opaque, int drq, int req) { + if (req == 0) + return; + + STM32L476DmaChannelState *channel = opaque; + if (channel->CxS != drq) + return; + + assert(channel->EN); + + assert(channel->DIR == 1); + assert(channel->PSIZE == channel->MSIZE); + assert(channel->PSIZE == 0); + assert(channel->PINC == false); + assert(channel->MINC == true); + + uint8_t *buffer = malloc(channel->NDTR); + cpu_physical_memory_read(channel->MA, buffer, channel->NDTR); + for (int i = 0; i < channel->NDTR; i++) { + cpu_physical_memory_write(channel->PA, &buffer[i], 1); + } + + free(buffer); + + channel->TCIF = true; + update_interrupt(channel->parent); +} + static void stm32l476_dma_init(Object *obj) { STM32L476DmaState *s = STM32L476_DMA(obj); memory_region_init_io(&s->mmio, obj, &stm32l476_dma_ops, s, TYPE_STM32L476_DMA, 0x400); sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->mmio); + + for (int i = 0; i < 7; i++) { + sysbus_init_irq(SYS_BUS_DEVICE(obj), &s->irq[i]); + } + + for (int c = 0; c < 7; c++) { + s->channels[c].parent = s; + s->channels[c].id = c; + s->channels[c].drq = qemu_allocate_irqs(omap_dma_request, &s->channels[c], 8); + } } static void stm32l476_dma_class_init(ObjectClass *klass, void *data) { diff --git a/hw/arm/stm32l476_spi.c b/hw/arm/stm32l476_spi.c index a12bf67613531..c25b7352196a4 100644 --- a/hw/arm/stm32l476_spi.c +++ b/hw/arm/stm32l476_spi.c @@ -6,12 +6,19 @@ #include "qemu/log.h" #include "hw/ssi/ssi.h" #include "hw/arm/stm32l476_spi.h" +#include "hw/qdev-properties.h" +#include "hw/irq.h" #define SPIx_CR1 0x00 #define SPIx_CR2 0x04 #define SPIx_SR 0x08 #define SPIx_DR 0x0C +static void stm32l476_spi_set_txdmaen(STM32L476SpiState *s, bool enabled) { + s->txdmaen = enabled; + qemu_set_irq(s->txdrq, enabled); +} + static void stm32l476_spi_reset(DeviceState *dev) { STM32L476SpiState *s = STM32L476_SPI(dev); } @@ -22,8 +29,12 @@ static uint64_t stm32l476_spi_read(void *opaque, hwaddr offset, switch (offset) { case SPIx_CR1: - case SPIx_CR2: break; + case SPIx_CR2: { + uint32_t out = 0; + out |= s->txdmaen << 1; + return out; + } case SPIx_SR: { uint32_t out = 0; @@ -55,6 +66,7 @@ static void stm32l476_spi_write(void *opaque, hwaddr offset, switch (offset) { case SPIx_CR1: case SPIx_CR2: + stm32l476_spi_set_txdmaen(s, extract64(val64, 1, 1)); break; case SPIx_DR: ssi_transfer(s->spi, val64); @@ -85,10 +97,15 @@ static void stm32l476_spi_init(Object *obj) { s->spi = ssi_create_bus(DEVICE(obj), "ssi"); } +static Property intel_hda_properties[] = { + DEFINE_PROP_END_OF_LIST(), +}; + static void stm32l476_spi_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); dc->reset = stm32l476_spi_reset; + device_class_set_props(dc, intel_hda_properties); } static const TypeInfo stm32l476_spi_info = { diff --git a/include/hw/arm/stm32l476_dma.h b/include/hw/arm/stm32l476_dma.h index c378efa597da7..3d68d8125703b 100644 --- a/include/hw/arm/stm32l476_dma.h +++ b/include/hw/arm/stm32l476_dma.h @@ -7,23 +7,42 @@ #define STM32L476_DMA(obj) \ OBJECT_CHECK(STM32L476DmaState, (obj), TYPE_STM32L476_DMA) +typedef struct _STM32L476DmaState STM32L476DmaState; typedef struct STM32L476DmaChannelState { + STM32L476DmaState *parent; uint8_t CxS; uint16_t NDTR; uint32_t PA; uint32_t MA; + qemu_irq *drq; + bool EN; + bool TCIE; + bool HTIE; + bool TEIE; + bool CIRC; + bool PINC; + bool MINC; + bool MEM2MEM; + uint64_t DIR; + uint64_t PSIZE; + uint64_t MSIZE; + uint64_t PL; + int id; + bool TCIF; + bool HTIF; + bool TEIF; } STM32L476DmaChannelState; -typedef struct { +struct _STM32L476DmaState { /* */ SysBusDevice parent_obj; /* */ MemoryRegion mmio; - qemu_irq irq; + qemu_irq irq[7]; STM32L476DmaChannelState channels[7]; -} STM32L476DmaState; +}; #endif diff --git a/include/hw/arm/stm32l476_spi.h b/include/hw/arm/stm32l476_spi.h index ab4cc178b6ff2..269583da55bc0 100644 --- a/include/hw/arm/stm32l476_spi.h +++ b/include/hw/arm/stm32l476_spi.h @@ -18,6 +18,10 @@ typedef struct { SSIBus *spi; + qemu_irq rxdrq; + qemu_irq txdrq; + + bool txdmaen; } STM32L476SpiState; #endif From 52e8eacdb918a4f2b975491896078065fa1a9353 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Tue, 22 Sep 2020 19:53:30 +0200 Subject: [PATCH 11/15] del mem --- mem.bin | Bin 262144 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 mem.bin diff --git a/mem.bin b/mem.bin deleted file mode 100644 index 42e35c00e6f99fb643e08d3068c18131de14709b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262144 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 Date: Wed, 30 Sep 2020 23:48:58 +0200 Subject: [PATCH 12/15] Progress onto boot --- CMakeLists.txt | 7 +- hw/arm/Makefile.objs | 3 + hw/arm/amazfit.c | 17 ++ hw/arm/it7259.c | 74 +++++ hw/arm/stm32l467_soc.c | 28 ++ hw/arm/stm32l476_dma.c | 7 + hw/arm/stm32l476_i2c.c | 184 ++++++++++++ hw/arm/stm32l476_qspi.c | 513 ++++++++++++++++++++++++++++++++ hw/arm/stm32l476_spi.c | 19 +- hw/block/m25p80.c | 9 + hw/display/jdi-lpm013m126c.c | 45 ++- include/hw/arm/stm32l467_soc.h | 4 + include/hw/arm/stm32l476_i2c.h | 38 +++ include/hw/arm/stm32l476_qspi.h | 56 ++++ sram1.bin | Bin 0 -> 98304 bytes sram2.bin | Bin 0 -> 32768 bytes 16 files changed, 989 insertions(+), 15 deletions(-) create mode 100644 hw/arm/it7259.c create mode 100644 hw/arm/stm32l476_i2c.c create mode 100644 hw/arm/stm32l476_qspi.c create mode 100644 include/hw/arm/stm32l476_i2c.h create mode 100644 include/hw/arm/stm32l476_qspi.h create mode 100644 sram1.bin create mode 100644 sram2.bin diff --git a/CMakeLists.txt b/CMakeLists.txt index 60ea50e2a0a56..f14c2cc6f1436 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,5 +6,10 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") file(GLOB_RECURSE src "*.c" "*.h") set(SOURCES ${src}) -add_library(qemu_dev ${SOURCES}) +add_executable(qemu_dev ${SOURCES} ) target_include_directories(qemu_dev PUBLIC "include" "target/arm" "") + +add_custom_target(qemu ALL + make -j4 + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/build" + ) diff --git a/hw/arm/Makefile.objs b/hw/arm/Makefile.objs index 0afa51c18ad5e..b65847cef3497 100644 --- a/hw/arm/Makefile.objs +++ b/hw/arm/Makefile.objs @@ -62,3 +62,6 @@ obj-y += stm32l476_pwr.o obj-y += stm32l476_rcc.o obj-y += stm32l476_dma.o obj-y += stm32l476_spi.o +obj-y += stm32l476_qspi.o +obj-y += stm32l476_i2c.o +obj-y += it7259.o diff --git a/hw/arm/amazfit.c b/hw/arm/amazfit.c index 73dc83a8fb116..5b8102fd554bf 100644 --- a/hw/arm/amazfit.c +++ b/hw/arm/amazfit.c @@ -7,6 +7,7 @@ #include "hw/arm/boot.h" #include "hw/loader.h" #include "hw/ssi/ssi.h" +#include "hw/i2c/i2c.h" static uint32_t readu32(hwaddr addr) { uint32_t ret; @@ -24,11 +25,27 @@ static void bip_init(MachineState *machine) { SSIBus* spi_bus = (SSIBus *)qdev_get_child_bus(&dev->spi[2], "ssi"); // SPI3 DeviceState * display = ssi_create_slave_no_init(spi_bus, "jdi-lpm013m126c"); qdev_init_nofail(display); + + /* --- QSPI Flash --------------------------------------------- */ + SSIBus * qspi = (SSIBus *)qdev_get_child_bus(&dev->qspi, "qspi"); + DeviceState *qspi_flash = ssi_create_slave_no_init(qspi, "w25q64fw"); + + DriveInfo *dinfo = drive_get(IF_MTD, 0, 0); + BlockBackend *blk = dinfo ? blk_by_legacy_dinfo(dinfo) : NULL; + qdev_prop_set_drive(qspi_flash, "drive", blk, &error_fatal); + qdev_init_nofail(qspi_flash); + + qemu_irq mx25u_cs = qdev_get_gpio_in_named(qspi_flash, SSI_GPIO_CS, 0); + sysbus_connect_irq(SYS_BUS_DEVICE(&dev->qspi), 1, mx25u_cs); load_image_targphys("/Users/Marijn/Downloads/bip/image.bin", +// load_image_targphys("/Users/Marijn/Projects/_pebble/Amazfitbip-FreeRTOS/bin/lcd_test.bin", 0, FLASH_SIZE); + I2CBus *i2c = (I2CBus *) qdev_get_child_bus(&dev->i2c[0], "i2c"); + i2c_create_slave(i2c, "it7259", 0x46); + armv7m_load_kernel(ARM_CPU(first_cpu), NULL, 0); } diff --git a/hw/arm/it7259.c b/hw/arm/it7259.c new file mode 100644 index 0000000000000..7b57a44e0f0a1 --- /dev/null +++ b/hw/arm/it7259.c @@ -0,0 +1,74 @@ +#include "qemu/osdep.h" +#include "hw/i2c/i2c.h" +#include "hw/irq.h" +#include "migration/vmstate.h" +#include "qemu/module.h" +#include "qemu/timer.h" +#include "ui/console.h" + +#define TYPE_IT7259 "it7259" +#define IT7259(obj) OBJECT_CHECK(IT7259State, (obj), TYPE_IT7259) + +typedef struct +{ + I2CSlave parent_obj; + +} IT7259State; + +static int +it7259_event(I2CSlave *i2c, enum i2c_event event) +{ + IT7259State *s = IT7259(i2c); + + return 0; +} + +static uint8_t +it7259_rx(I2CSlave *i2c) +{ + IT7259State *s = IT7259(i2c); + + return 0; +} + +static int +it7259_tx(I2CSlave *i2c, uint8_t data) +{ + IT7259State *s = IT7259(i2c); + printf("I2C: 0x%02X\n", data); + + return 0; +} + +static void +it7259_realize(DeviceState *dev, Error **errp) +{ + IT7259State *s = IT7259(dev); +} + +static void +it7259_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + I2CSlaveClass *k = I2C_SLAVE_CLASS(klass); + + dc->realize = it7259_realize; + k->event = it7259_event; + k->recv = it7259_rx; + k->send = it7259_tx; +} + +static const TypeInfo it7259_info = { + .name = TYPE_IT7259, + .parent = TYPE_I2C_SLAVE, + .instance_size = sizeof(IT7259State), + .class_init = it7259_class_init, +}; + +static void +it7259_register_types(void) +{ + type_register_static(&it7259_info); +} + +type_init(it7259_register_types) diff --git a/hw/arm/stm32l467_soc.c b/hw/arm/stm32l467_soc.c index 08f52a341a9e1..0c4c9cf96e537 100644 --- a/hw/arm/stm32l467_soc.c +++ b/hw/arm/stm32l467_soc.c @@ -225,6 +225,15 @@ static void stm32l467_soc_initfn(Object *obj) { sysbus_init_child_obj(obj, "DMA2", &s->dma, sizeof(s->dma), TYPE_STM32L476_DMA); + sysbus_init_child_obj(obj, "QSPI", &s->qspi, sizeof(s->qspi), + TYPE_STM32L476_QSPI); + + for (int i = 0; i < 3; i++) { + sysbus_init_child_obj(obj, "I2C[*]", &s->i2c[i], sizeof(s->i2c[i]), TYPE_STM32L476_I2C); + char *name = g_strdup_printf("I2C%d", i+1); + qdev_prop_set_string(DEVICE(&s->i2c[i]), "name", name); + } + sysbus_init_child_obj(obj, "SPI3", &s->spi[2], sizeof(s->spi[2]), TYPE_STM32L476_SPI); s->spi[2].rxdrq = s->dma.channels[0].drq[0b0011]; // RX @@ -242,6 +251,11 @@ static void stm32l467_soc_realize(DeviceState *dev_soc, Error **errp) { create_unimplemented_layer("SYSCFG", SYSCFG_BASE, 0x30); create_unimplemented_layer("TIM2", TIM2_BASE, 0x400); + create_unimplemented_layer("TIM3", TIM3_BASE, 0x400); + create_unimplemented_layer("RTC", RTC_BASE, 0x400); + create_unimplemented_layer("RNG", RNG_BASE, 0x400); + create_unimplemented_layer("USART1", USART1_BASE, 0x400); + create_unimplemented_layer("DMA1", DMA1_BASE, 0x400); create_unimplemented_layer("IWDG", IWDG_BASE, 0x400); create_unimplemented_layer("ADC1", ADC1_BASE, 0x100); create_unimplemented_layer("ADC2", ADC2_BASE, 0x100); @@ -328,6 +342,20 @@ static void stm32l467_soc_realize(DeviceState *dev_soc, Error **errp) { busdev = SYS_BUS_DEVICE(&s->spi[2]); sysbus_mmio_map(busdev, 0, SPI3_BASE); + /* QSPI registers */ + object_property_set_bool(OBJECT(&s->qspi), true, "realized", &err); + busdev = SYS_BUS_DEVICE(&s->qspi); + sysbus_mmio_map(busdev, 0, QSPI_BASE); + sysbus_mmio_map(busdev, 1, QSPI_R_BASE); + + /* I2C registers */ + for (int i = 0; i < 3; i++) { + object_property_set_bool(OBJECT(&s->i2c[i]), true, "realized", &err); + } + sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c[0]), 0, I2C1_BASE); + sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c[1]), 0, I2C2_BASE); + sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c[2]), 0, I2C3_BASE); + system_clock_scale = 1000; } diff --git a/hw/arm/stm32l476_dma.c b/hw/arm/stm32l476_dma.c index f82e4da86a108..a732091378da7 100644 --- a/hw/arm/stm32l476_dma.c +++ b/hw/arm/stm32l476_dma.c @@ -118,17 +118,24 @@ static void stm32l476_dma_write(void *opaque, hwaddr offset, for (int c = 0; c < 7; c++) { if (extract64(val64, c * 4 + 0, 1) == 1) { // CGIF1 + s->channels[c].TCIF = false; + s->channels[c].HTIF = false; + s->channels[c].TEIF = false; } if (extract64(val64, c * 4 + 1, 1) == 1) { // CTCIF1 + s->channels[c].TCIF = false; } if (extract64(val64, c * 4 + 2, 1) == 1) { // CHTIF1 + s->channels[c].HTIF = false; } if (extract64(val64, c * 4 + 3, 1) == 1) { // CTEIF1 + s->channels[c].TEIF = false; } } + update_interrupt(s); break; case DMA_CCR2: diff --git a/hw/arm/stm32l476_i2c.c b/hw/arm/stm32l476_i2c.c new file mode 100644 index 0000000000000..3393e3642a762 --- /dev/null +++ b/hw/arm/stm32l476_i2c.c @@ -0,0 +1,184 @@ +#include "qemu/osdep.h" +#include "hw/sysbus.h" +#include "hw/arm/boot.h" +#include "sysemu/sysemu.h" +#include "exec/address-spaces.h" +#include "qemu/log.h" +#include "hw/i2c/i2c.h" + +#include "hw/arm/stm32l476_i2c.h" +#include "hw/qdev-properties.h" + +#include "qapi/error.h" + +#define I2C_CR1 0x00 +#define I2C_CR2 0x04 +#define I2C_OAR1 0x08 +#define I2C_OAR2 0x0C +#define I2C_TIMINGR 0x10 +#define I2C_ISR 0x18 +#define I2C_TXDR 0x28 + +static void +stm32l476_i2c_reset(DeviceState *dev) +{ + STM32L476I2CState *s = STM32L476_I2C(dev); +} + +static uint64_t +stm32l476_i2c_read(void *opaque, hwaddr offset, + unsigned int size) +{ + STM32L476I2CState *s = opaque; + + switch (offset) + { + case I2C_CR2: + { + uint32_t out = 0; + out |= s->SADD << 0; + out |= s->RD_WRN << 10; + out |= s->ADD10 << 11; + out |= s->HEAD10R << 12; + out |= s->START << 13; + out |= s->STOP << 14; + out |= s->NACK << 15; + + out |= s->NBYTES << 16; + out |= s->RELOAD << 24; + out |= s->AUTOEND << 25; + out |= s->PECBYTE << 26; + return out; + } + + break; +// case I2C_CR1: +// case I2C_OAR1: +// case I2C_OAR2: + case I2C_ISR: + { + uint32_t out = 0; + out |= s->TXIS << 1; + out |= s->BUSY << 15; + return out; + } +// break; + default:qemu_log_mask(LOG_UNIMP, "%s: unimplemented device read " + "(size %d, offset 0x%" HWADDR_PRIx ")\n", + __func__, size, offset); + break; + } + return 0; +} + +static void +stm32l476_i2c_write(void *opaque, hwaddr offset, + uint64_t val64, unsigned int size) +{ + STM32L476I2CState *s = opaque; + assert(size == 4); + + switch (offset) + { + case I2C_CR2: + { + s->SADD = extract64(val64, 0, 10); + s->RD_WRN = extract64(val64, 10, 1); + s->ADD10 = extract64(val64, 11, 1); + s->HEAD10R = extract64(val64, 12, 1); + + if (extract64(val64, 13, 1) == true) + s->START = true; + if (extract64(val64, 14, 1) == true) + s->STOP = true; + if (extract64(val64, 15, 1) == true) + s->NACK = true; + + s->NBYTES = extract64(val64, 16, 8); + s->RELOAD = extract64(val64, 24, 1); + s->AUTOEND = extract64(val64, 25, 1); + + if (extract64(val64, 26, 1) == true) + s->PECBYTE = true; + + if (s->START && !s->BUSY) + { + s->BUSY = true; + i2c_start_transfer(s->bus, (s->SADD & 0b0011111110) >> 1, s->RD_WRN == 1); + } + s->TXIS = true; + break; + } + + case I2C_TXDR: + { + printf("[%s] Send data to 0x%X: 0x%02X\n", s->name, (s->SADD & 0b0011111110) >> 1, val64); + i2c_send(s->bus, val64 & 0xFF); + break; + } + + case I2C_CR1: + case I2C_OAR1: + case I2C_OAR2: + case I2C_TIMINGR:break; + default:qemu_log_mask(LOG_UNIMP, "%s: unimplemented device write " + "(size %d, value 0x%" PRIx64 + ", offset 0x%" HWADDR_PRIx ")\n", + __func__, size, val64, offset); + break; + } +} + +static const MemoryRegionOps stm32l476_i2c_ops = { + .read = stm32l476_i2c_read, + .write = stm32l476_i2c_write, + .endianness = DEVICE_NATIVE_ENDIAN, +}; + +static void +stm32l476_i2c_realize(DeviceState *dev, Error **errp) +{ + STM32L476I2CState *s = STM32L476_I2C(dev); + + if (s->name == NULL) + { + error_setg(errp, "property 'name' not specified"); + return; + } + + memory_region_init_io(&s->mmio, OBJECT(s), &stm32l476_i2c_ops, s, + TYPE_STM32L476_I2C, 0x400); + sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->mmio); + + s->bus = i2c_init_bus(dev, "i2c"); +} + +static Property stm32l476_i2c_properties[] = { + DEFINE_PROP_STRING("name", STM32L476I2CState, name), + DEFINE_PROP_END_OF_LIST(), +}; + +static void +stm32l476_i2c_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + + dc->reset = stm32l476_i2c_reset; + dc->realize = stm32l476_i2c_realize; + device_class_set_props(dc, stm32l476_i2c_properties); +} + +static const TypeInfo stm32l476_i2c_info = { + .name = TYPE_STM32L476_I2C, + .parent = TYPE_SYS_BUS_DEVICE, + .instance_size = sizeof(STM32L476I2CState), + .class_init = stm32l476_i2c_class_init, +}; + +static void +stm32l476_i2c_register_types(void) +{ + type_register_static(&stm32l476_i2c_info); +} + +type_init(stm32l476_i2c_register_types) diff --git a/hw/arm/stm32l476_qspi.c b/hw/arm/stm32l476_qspi.c new file mode 100644 index 0000000000000..fb0c3a23debb8 --- /dev/null +++ b/hw/arm/stm32l476_qspi.c @@ -0,0 +1,513 @@ +#include "qemu/osdep.h" +#include "hw/sysbus.h" +#include "hw/arm/boot.h" +#include "sysemu/sysemu.h" +#include "exec/address-spaces.h" +#include "qemu/log.h" +#include "hw/irq.h" + +#include "hw/arm/stm32l476_qspi.h" + +#define QUADSPI_CR 0x00 +#define QUADSPI_DCR 0x04 +#define QUADSPI_SR 0x08 +#define QUADSPI_FCR 0x0C +#define QUADSPI_DLR 0x10 +#define QUADSPI_CCR 0x14 +#define QUADSPI_AR 0x18 +#define QUADSPI_DR 0x20 +#define QUADSPI_PSMKR 0x24 +#define QUADSPI_PSMAR 0x28 +#define QUADSPI_PIR 0x2C + +#ifndef DEBUG_QSPI +#define DEBUG_QSPI 0 +#endif + +#define DPRINTF(fmt, ...) do { \ + if (DEBUG_QSPI) { \ + qemu_log("qspi: " fmt , ## __VA_ARGS__); \ + } \ +} while (0) + +typedef enum +{ + Unknown, + + OnWriteCCR, + OnWriteAR, + OnWriteDR, +} StartMode; + +static StartMode +getStart(STM32L476QspiState *s) +{ + if (s->FMODE == 0b00 || s->FMODE == 0b01) + { + // Indirect mode + if (s->ADMODE == 0b00 && s->DMODE == 0b00) + return OnWriteCCR; + if (s->FMODE == 0b01 && s->ADMODE == 0b00) + return OnWriteCCR; + + if (s->ADMODE != 0b00) + { + if (s->FMODE == 0b01 || s->DMODE == 0b00) + return OnWriteAR; + } + + if (s->FMODE == 0b00 && s->DMODE != 0b00) + return OnWriteDR; + } + else if (s->FMODE == 0b10) + { + if (s->ADMODE == 0b00) + return OnWriteCCR; + + return OnWriteAR; + } + else + { + assert(false); + } + + return Unknown; +} + +static void +do_transfer(STM32L476QspiState *s) +{ + // Instruction phase + qemu_irq_lower(s->cs); + DPRINTF("Instruction: 0x%02X\n", s->INSTRUCTION); + ssi_transfer(s->qspi, s->INSTRUCTION); + + // Address phase + if (s->ADMODE != 0b00) + { + switch (s->ADSIZE) + { + case 0b10: + { + DPRINTF("Address: 0x%06X\n", s->ADDRESS & 0xFFFFFF); + ssi_transfer(s->qspi, (s->ADDRESS >> 16) & 0xFF); + ssi_transfer(s->qspi, (s->ADDRESS >> 8) & 0xFF); + ssi_transfer(s->qspi, (s->ADDRESS >> 0) & 0xFF); + break; + } + default:assert(false); + break; + } + } + + // Alternate-bytes phase + if (s->ABMODE != 0b00) + { + assert(false); + } + + // Dummy-cycles phase + if (s->DCYC != 0) + { + if(s->INSTRUCTION == 0xEB && s->DCYC == 6) { + + // Argument byte + uint8_t d = ssi_transfer(s->qspi, 0); + DPRINTF("- DUMMY: 0x%02X\n", d); + + // 4 cycles + for (int i = 0; i < 4; i++) { + uint8_t d = ssi_transfer(s->qspi, 0); + DPRINTF("- DUMMY: 0x%02X\n", d); + } + } else { + for (int i = 0; i < s->DCYC; i++) + { + uint8_t d = ssi_transfer(s->qspi, 0); + DPRINTF("- DUMMY: 0x%02X\n", d); + } + } + + } + + bool leaveCS = false; + + // Data phase + DPRINTF("Data:\n"); + if (s->DMODE != 0) + { + if (s->FMODE == 0b01) + { + for (int i = 0; i < s->DL + 1; i++) + { + uint8_t d = ssi_transfer(s->qspi, 0); + fifo8_push(&s->rx_fifo, d); + DPRINTF("- 0x%02X\n", d); + } + } + else if (s->FMODE == 0b00) + { + s->dataPushed = 0; + leaveCS = true; + } + else + { + assert(false); + } + } + + if (!leaveCS) + { + qemu_irq_raise(s->cs); + } + +} + +static void +start(STM32L476QspiState *s) +{ + + if (s->FMODE == 0b01 || s->FMODE == 0b00) + { + s->BUSY = true; + // QUADSPI indirect mode + do_transfer(s); + s->BUSY = false; + if (s->FMODE == 0b01 && !fifo8_is_empty(&s->rx_fifo)) + { + s->BUSY = true; + } + s->TCF = true; + } + else if (s->FMODE == 0b10) + { + // QUADSPI status flag polling mode + DPRINTF("QSPI: CMD=0x%02X wait\n", s->INSTRUCTION); + assert(s->PMM == 0); + assert(s->APMS == 1); + + qemu_irq_lower(s->cs); + while (true) + { + ssi_transfer(s->qspi, s->INSTRUCTION); + uint32_t response = 0; + for (int i = 0; i < 4; i++) + { + response |= ssi_transfer(s->qspi, 0) << 8 * i; + } + + if ((response & s->MASK) == s->MATCH) + { + // match found + s->SMF = true; + // break + break; + } + } + qemu_irq_raise(s->cs); + } + else + { + assert(false); + } +} + +static void +stm32l476_quadspi_reset(DeviceState *dev) +{ + STM32L476QspiState *s = STM32L476_QSPI(dev); +} + +static uint64_t +stm32l476_quadspi_read(void *opaque, hwaddr offset, + unsigned int size) +{ + STM32L476QspiState *s = opaque; +// 0801ce1e + switch (offset) + { + case QUADSPI_CR:DPRINTF("QSPI: read CR\n"); + return 0; + + case QUADSPI_DCR:DPRINTF("QSPI: read DCR\n"); + return 0; + + case QUADSPI_SR: + { + uint32_t out = 0; + out |= s->TEF << 0; + out |= s->TCF << 1; + + // FTF + if (s->FMODE == 0b01) + { + out |= (!fifo8_is_empty(&s->rx_fifo)) << 2; + } + else if (s->FMODE == 0b00) + { + out |= 1 << 2; + } + + out |= s->SMF << 3; + out |= s->TOF << 4; + out |= s->BUSY << 5; + DPRINTF("QSPI: read SR (0x%X)\n", out); + return out; + } + + case QUADSPI_DLR:DPRINTF("QSPI: read DLR\n"); + return s->DL; + + case QUADSPI_CCR: + { + uint32_t out = 0; + out |= s->INSTRUCTION << 0; + out |= s->IMODE << 8; + out |= s->ADMODE << 10; + out |= s->ADSIZE << 12; + out |= s->ABMODE << 14; + out |= s->ABSIZE << 16; + out |= s->DCYC << 18; + out |= s->DMODE << 24; + out |= s->FMODE << 26; + return out; + } + + case QUADSPI_AR:DPRINTF("QSPI: read AR\n"); + return s->ADDRESS; + + case QUADSPI_DR: + if (size == 1) + { + uint8_t kI = fifo8_pop(&s->rx_fifo); + DPRINTF("QSPI: read DR (0x%02X)\n", kI); + if (fifo8_is_empty(&s->rx_fifo)) + { + s->BUSY = false; + s->TCF = true; + } + return kI; + } + else + { + assert(false); + } + break; + + default:qemu_log_mask(LOG_UNIMP, "%s: unimplemented device read " + "(size %d, offset 0x%" HWADDR_PRIx ")\n", + __func__, size, offset); + break; + } + return 0; +} + +static void +stm32l476_quadspi_write(void *opaque, hwaddr offset, + uint64_t val64, unsigned int size) +{ + STM32L476QspiState *s = opaque; + StartMode kStart; + + switch (offset) + { + case QUADSPI_CR:DPRINTF("QSPI: CR = 0x%08X\n", val64); + s->EN = extract64(val64, 0, 1); + s->ABORT = extract64(val64, 1, 1); + s->APMS = extract64(val64, 22, 1); + s->PMM = extract64(val64, 23, 1); + + if (s->ABORT) + { + s->TCF = true; + s->ABORT = false; + } + + break; + + case QUADSPI_DCR:DPRINTF("QSPI: DCR = 0x%08X\n", val64); + break; + + case QUADSPI_FCR:DPRINTF("QSPI: FCR = 0x%08X\n", val64); + if (val64 & (1 << 0)) + s->TEF = false; + if (val64 & (1 << 1)) + s->TCF = false; + if (val64 & (1 << 3)) + s->SMF = false; + if (val64 & (1 << 4)) + s->TOF = false; + break; + + case QUADSPI_DLR:s->DL = extract64(val64, 0, 32); + break; + + case QUADSPI_CCR:s->INSTRUCTION = extract64(val64, 0, 8); + s->IMODE = extract64(val64, 8, 2); + s->ADMODE = extract64(val64, 10, 2); + s->ADSIZE = extract64(val64, 12, 2); + s->ABMODE = extract64(val64, 14, 2); + s->ABSIZE = extract64(val64, 16, 2); + s->DCYC = extract64(val64, 18, 5); + s->DMODE = extract64(val64, 24, 2); + s->FMODE = extract64(val64, 26, 2); + + kStart = getStart(s); + if (kStart == OnWriteCCR) + { + start(s); + } + else + { + DPRINTF("Waiting to start with cmd 0x%X\n", s->INSTRUCTION); + } + + break; + + case QUADSPI_AR:s->ADDRESS = extract64(val64, 0, 32); + kStart = getStart(s); + if (kStart == OnWriteAR) + { + start(s); + } + break; + + case QUADSPI_DR: + if (size == 1) + { + kStart = getStart(s); + if (kStart == OnWriteDR) + { + start(s); + } + assert(s->FMODE == 0b00); + ssi_transfer(s->qspi, val64); + s->dataPushed++; + + if (s->dataPushed - 1 == s->DL) + { + s->TCF = true; + s->BUSY = false; + } + } + else + { + assert(false); + } + break; + + case QUADSPI_PSMKR: + if (!s->BUSY) + { + s->MASK = extract64(val64, 0, 32); + } + break; + + case QUADSPI_PSMAR: + if (!s->BUSY) + { + s->MATCH = extract64(val64, 0, 32); + } + break; + + case QUADSPI_PIR: + if (!s->BUSY) + { + s->INTERVAL = extract64(val64, 0, 16); + } + break; + + default:qemu_log_mask(LOG_UNIMP, "%s: unimplemented device write " + "(size %d, value 0x%" PRIx64 + ", offset 0x%" HWADDR_PRIx ")\n", + __func__, size, val64, offset); + break; + } +} + +static const MemoryRegionOps stm32l476_quadspi_ops = { + .read = stm32l476_quadspi_read, + .write = stm32l476_quadspi_write, + .endianness = DEVICE_NATIVE_ENDIAN, +}; + +static uint64_t +cache_read(void *opaque, hwaddr offset, + unsigned int size) +{ + STM32L476QspiState *s = opaque; + + switch (offset) + { + default:qemu_log_mask(LOG_UNIMP, "%s: unimplemented device read " + "(size %d, offset 0x%" HWADDR_PRIx ")\n", + __func__, size, offset); + break; + } + return 0; +} +static void +cache_write(void *opaque, hwaddr offset, uint64_t val64, unsigned int size) +{ + + STM32L476QspiState *s = opaque; + + switch (offset) + { + default:qemu_log_mask(LOG_UNIMP, "%s: unimplemented device write " + "(size %d, value 0x%" PRIx64 + ", offset 0x%" HWADDR_PRIx ")\n", + __func__, size, val64, offset); + break; + } +} + +static const MemoryRegionOps cache_ops = { + .read = cache_read, + .write = cache_write, + .endianness = DEVICE_NATIVE_ENDIAN, +}; + +static void +stm32l476_quadspi_init(DeviceState *dev, Error **pError) +{ + STM32L476QspiState *s = STM32L476_QSPI(dev); + + memory_region_init_io(&s->cache, dev, &cache_ops, s, "QSPI", 0x10000000); + sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->cache); + + memory_region_init_io(&s->mmio, dev, &stm32l476_quadspi_ops, s, + "QPSI_R", 0x400); + sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->mmio); + + s->qspi = ssi_create_bus(dev, "qspi"); + + sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->irq); + sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->cs); + + fifo8_create(&s->rx_fifo, 1024 * 1024); +} + +static void +stm32l476_quadspi_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + + dc->reset = stm32l476_quadspi_reset; + dc->realize = stm32l476_quadspi_init; +} + +static const TypeInfo stm32l476_quadspi_info = { + .name = TYPE_STM32L476_QSPI, + .parent = TYPE_SYS_BUS_DEVICE, + .instance_size = sizeof(STM32L476QspiState), + .class_init = stm32l476_quadspi_class_init, +}; + +static void +stm32l476_quadspi_register_types(void) +{ + type_register_static(&stm32l476_quadspi_info); +} + +type_init(stm32l476_quadspi_register_types) diff --git a/hw/arm/stm32l476_spi.c b/hw/arm/stm32l476_spi.c index c25b7352196a4..405effd315081 100644 --- a/hw/arm/stm32l476_spi.c +++ b/hw/arm/stm32l476_spi.c @@ -15,8 +15,10 @@ #define SPIx_DR 0x0C static void stm32l476_spi_set_txdmaen(STM32L476SpiState *s, bool enabled) { - s->txdmaen = enabled; - qemu_set_irq(s->txdrq, enabled); + if(s->txdmaen != enabled) { + s->txdmaen = enabled; + qemu_set_irq(s->txdrq, enabled); + } } static void stm32l476_spi_reset(DeviceState *dev) { @@ -65,12 +67,23 @@ static void stm32l476_spi_write(void *opaque, hwaddr offset, switch (offset) { case SPIx_CR1: + break; case SPIx_CR2: stm32l476_spi_set_txdmaen(s, extract64(val64, 1, 1)); break; case SPIx_DR: - ssi_transfer(s->spi, val64); + { + if (size == 1) + { + ssi_transfer(s->spi, val64); + } + else + { + ssi_transfer(s->spi, val64 & 0xFF); + ssi_transfer(s->spi, (val64 >> 8) & 0xFF); + } break; + } default: qemu_log_mask(LOG_UNIMP, "%s: unimplemented device write " diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c index 82270884416e3..09d14aaca924c 100644 --- a/hw/block/m25p80.c +++ b/hw/block/m25p80.c @@ -313,6 +313,7 @@ static const FlashPartInfo known_devices[] = { { INFO("w25q32", 0xef4016, 0, 64 << 10, 64, ER_4K) }, { INFO("w25q32dw", 0xef6016, 0, 64 << 10, 64, ER_4K) }, { INFO("w25x64", 0xef3017, 0, 64 << 10, 128, ER_4K) }, + { INFO("w25q64fw", 0xef0016, 0, 64 << 10, 128, ER_4K) }, { INFO("w25q64", 0xef4017, 0, 64 << 10, 128, ER_4K) }, { INFO("w25q80", 0xef5014, 0, 64 << 10, 16, ER_4K) }, { INFO("w25q80bl", 0xef4014, 0, 64 << 10, 16, ER_4K) }, @@ -721,6 +722,14 @@ static void complete_collecting_data(Flash *s) break; case RDID_90: case RDID_AB: + if(get_man(s) == MAN_WINBOND) { + s->data[0] = s->pi->id[0]; + s->data[1] = s->pi->id[2]; + s->pos = 0; + s->len = 2; + s->data_read_loop = true; + s->state = STATE_READING_DATA; + } if (get_man(s) == MAN_SST) { if (s->cur_addr <= 1) { if (s->cur_addr) { diff --git a/hw/display/jdi-lpm013m126c.c b/hw/display/jdi-lpm013m126c.c index bbdfac3a43112..bd24d08bf4985 100644 --- a/hw/display/jdi-lpm013m126c.c +++ b/hw/display/jdi-lpm013m126c.c @@ -52,10 +52,20 @@ static uint8_t bitswap8(uint8_t val) { } uint32_t parse_header(lcd_state *s, uint16_t header) { - if (M0_LOW(header) && M2_HI(header)) { + if (header == 0x0000 || header == 0xFFFF) + { + // Dummy + s->state = 0; + return 0; + } + + if (M0_LOW(header) && M2_HI(header)) + { printf("all clear"); - for (int x = 0; x < 176; x++) { - for (int y = 0; y < 176; y++) { + for (int x = 0; x < 176; x++) + { + for (int y = 0; y < 176; y++) + { s->buffer[y][x].r = x % 2; s->buffer[y][x].g = y % 2; s->buffer[y][x].b = 0; @@ -65,36 +75,49 @@ uint32_t parse_header(lcd_state *s, uint16_t header) { return 0; } - if (M0_HI(header) && M2_LOW(header) && M3_HI(header)) { + if (M0_HI(header) && M2_LOW(header)) + { // Update s->state = 2; s->line = bitswap8(header >> 8) - 1; s->cur_x = 0; - if (M3_HI(header)) { + if (M3_HI(header)) + { s->bpp = 4; - } else if (M4_HI(header)) { + } + else if (M4_HI(header)) + { s->bpp = 1; - } else { + } + else + { s->bpp = 3; } return 0; } + else + { + assert(false); + } s->state = 0; return 0; } -uint32_t jdi_lpm013m126c_transfer(SSISlave *bus, uint32_t val32) { +uint32_t jdi_lpm013m126c_transfer(SSISlave *bus, uint32_t val32) +{ lcd_state *s = LCD(bus); - uint8_t val = bitswap8(val32 & 0xFF); + uint8_t val = val32 & 0xFF; - if (s->state == -1) { + if (s->state == -1) + { return 0; } - if (s->state == 0) { + if (s->state == 0) + { s->header = val; s->state = 1; return 0; diff --git a/include/hw/arm/stm32l467_soc.h b/include/hw/arm/stm32l467_soc.h index 1fba0557f11af..f9c722c850fdd 100644 --- a/include/hw/arm/stm32l467_soc.h +++ b/include/hw/arm/stm32l467_soc.h @@ -8,6 +8,8 @@ #include "hw/arm/stm32l476_rcc.h" #include "hw/arm/stm32l476_dma.h" #include "hw/arm/stm32l476_spi.h" +#include "hw/arm/stm32l476_i2c.h" +#include "hw/arm/stm32l476_qspi.h" #define TYPE_STM32L467_SOC "stm32l467-soc" #define STM32L467_SOC(obj) \ @@ -29,6 +31,8 @@ typedef struct STM32L467State { STM32L476FlashState flash_r; STM32L476DmaState dma; STM32L476SpiState spi[3]; + STM32L476QspiState qspi; + STM32L476I2CState i2c[3]; // STM32L476TimState tim2; MemoryRegion flash_alias; MemoryRegion flash; diff --git a/include/hw/arm/stm32l476_i2c.h b/include/hw/arm/stm32l476_i2c.h new file mode 100644 index 0000000000000..31f94d83a7b0b --- /dev/null +++ b/include/hw/arm/stm32l476_i2c.h @@ -0,0 +1,38 @@ +#ifndef HW_ARM_STM32L476_I2C_H +#define HW_ARM_STM32L476_I2C_H + +#include "hw/arm/armv7m.h" + +#define TYPE_STM32L476_I2C "stm32l476-i2c" +#define STM32L476_I2C(obj) \ + OBJECT_CHECK(STM32L476I2CState, (obj), TYPE_STM32L476_I2C) + +typedef struct { + /* */ + SysBusDevice parent_obj; + char *name; + + /* */ + MemoryRegion mmio; + qemu_irq irq; + + // I2C_CR2 + uint64_t SADD; + uint64_t RD_WRN; + uint64_t ADD10; + uint64_t HEAD10R; + bool START; + bool STOP; + bool NACK; + uint64_t NBYTES; + uint64_t RELOAD; + uint64_t AUTOEND; + bool PECBYTE; + + // I2C_ISR + bool TXIS; + bool BUSY; + I2CBus *bus; +} STM32L476I2CState; + +#endif diff --git a/include/hw/arm/stm32l476_qspi.h b/include/hw/arm/stm32l476_qspi.h new file mode 100644 index 0000000000000..c476665d5cf9c --- /dev/null +++ b/include/hw/arm/stm32l476_qspi.h @@ -0,0 +1,56 @@ +#ifndef HW_ARM_STM32L476_QSPI_H +#define HW_ARM_STM32L476_QSPI_H + +#include "hw/sysbus.h" +#include "hw/ssi/ssi.h" +#include "qemu/fifo8.h" + +#define TYPE_STM32L476_QSPI "stm32l476-qspi" +#define STM32L476_QSPI(obj) \ + OBJECT_CHECK(STM32L476QspiState, (obj), TYPE_STM32L476_QSPI) + +typedef struct { + /* */ + SysBusDevice parent_obj; + + /* */ + MemoryRegion mmio; + MemoryRegion cache; + + bool EN; + bool ABORT; + + bool TCF; + bool TEF; + bool SMF; + bool TOF; + + uint8_t PMM; + uint8_t APMS; + + uint32_t DL; + uint8_t INSTRUCTION; + uint64_t IMODE; + uint64_t ADMODE; + uint64_t ADSIZE; + uint64_t ABMODE; + uint64_t ABSIZE; + uint64_t DCYC; + uint64_t DMODE; + uint64_t FMODE; + uint32_t MASK; + uint32_t MATCH; + uint16_t INTERVAL; + + uint32_t ADDRESS; + bool BUSY; + + qemu_irq irq; + SSIBus *qspi; + qemu_irq cs; + + Fifo8 rx_fifo; + int dataPushed; +} STM32L476QspiState; + +#endif diff --git a/sram1.bin b/sram1.bin new file mode 100644 index 0000000000000000000000000000000000000000..9ab9b961be2dfcb312e192ebf4224d9d49957cb8 GIT binary patch literal 98304 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 literal 0 HcmV?d00001 From 06e6713981fe58c8a0c2818556aa2aace2ce4979 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Wed, 7 Oct 2020 19:42:47 +0200 Subject: [PATCH 13/15] Boot into watchface --- hw/arm/Makefile.objs | 2 + hw/arm/stm32l467_soc.c | 58 +++--- hw/arm/stm32l476_gpio.c | 319 ++++++++++++++++++++++++++++++++ hw/arm/stm32l476_syscfg.c | 148 +++++++++++++++ hw/display/jdi-lpm013m126c.c | 13 +- include/hw/arm/stm32l467_soc.h | 4 +- include/hw/arm/stm32l476_gpio.h | 12 ++ 7 files changed, 527 insertions(+), 29 deletions(-) create mode 100644 hw/arm/stm32l476_gpio.c create mode 100644 hw/arm/stm32l476_syscfg.c create mode 100644 include/hw/arm/stm32l476_gpio.h diff --git a/hw/arm/Makefile.objs b/hw/arm/Makefile.objs index b65847cef3497..a28df465c001e 100644 --- a/hw/arm/Makefile.objs +++ b/hw/arm/Makefile.objs @@ -63,5 +63,7 @@ obj-y += stm32l476_rcc.o obj-y += stm32l476_dma.o obj-y += stm32l476_spi.o obj-y += stm32l476_qspi.o +obj-y += stm32l476_gpio.o +obj-y += stm32l476_syscfg.o obj-y += stm32l476_i2c.o obj-y += it7259.o diff --git a/hw/arm/stm32l467_soc.c b/hw/arm/stm32l467_soc.c index 0c4c9cf96e537..c676916a05d19 100644 --- a/hw/arm/stm32l467_soc.c +++ b/hw/arm/stm32l467_soc.c @@ -12,6 +12,9 @@ #include "qemu/log.h" #include "hw/arm/stm32l467_soc.h" +#include "hw/arm/stm32l476_gpio.h" + +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) #define PERIPH_BASE 0x40000000UL #define APB1PERIPH_BASE PERIPH_BASE @@ -177,22 +180,6 @@ enum { DMA2_Channel7_IRQn = 69, /*!< DMA2 Channel 7 global interrupt */ }; -static uint64_t mv88w8618_wlan_read(void *opaque, hwaddr offset, - unsigned size) { - printf("read @ 0x%x\n", offset); - return 0; -} - -static void mv88w8618_wlan_write(void *opaque, hwaddr offset, - uint64_t value, unsigned size) { - printf("write @ 0x%x\n", offset); -} - -static const MemoryRegionOps mv88w8618_wlan_ops = { - .read = mv88w8618_wlan_read, - .write =mv88w8618_wlan_write, - .endianness = DEVICE_NATIVE_ENDIAN, -}; static inline void create_unimplemented_layer(const char *name, hwaddr base, hwaddr size) { DeviceState *dev = qdev_create(NULL, TYPE_UNIMPLEMENTED_DEVICE); @@ -249,7 +236,6 @@ static void stm32l467_soc_realize(DeviceState *dev_soc, Error **errp) { create_unimplemented_layer("IO", 0, 0xFFFFFFFF); - create_unimplemented_layer("SYSCFG", SYSCFG_BASE, 0x30); create_unimplemented_layer("TIM2", TIM2_BASE, 0x400); create_unimplemented_layer("TIM3", TIM3_BASE, 0x400); create_unimplemented_layer("RTC", RTC_BASE, 0x400); @@ -263,16 +249,42 @@ static void stm32l467_soc_realize(DeviceState *dev_soc, Error **errp) { create_unimplemented_layer("ADC123_COMMON", ADC123_COMMON_BASE, 0x100); create_unimplemented_layer("SPI1", SPI1_BASE, 0x400); - - create_unimplemented_layer("GPIOA", GPIOA_BASE, 0x400); - create_unimplemented_layer("GPIOB", GPIOB_BASE, 0x400); - create_unimplemented_layer("GPIOC", GPIOC_BASE, 0x400); - create_unimplemented_layer("GPIOG", GPIOG_BASE, 0x400); + create_unimplemented_layer("CRC", CRC_BASE, 0x400); + create_unimplemented_layer("TIM1", TIM1_BASE, 0x400); + + s->syscfg = qdev_create(NULL, "stm32l476-syscfg"); + qdev_init_nofail(s->syscfg); + sysbus_mmio_map(SYS_BUS_DEVICE(s->syscfg), 0, SYSCFG_BASE); + + /* GPIO */ + struct + { + hwaddr addr; + char *name; + uint32_t GPIOx_MODER; + uint32_t GPIOx_OSPEEDR; + uint32_t GPIOx_PUPDR; + } const gpio_desc[] = { + {GPIOA_BASE, "GPIOA", 0xABFFFFFF, 0x0C000000, 0x64000000}, + {GPIOB_BASE, "GPIOB", 0xFFFFFEBF, 0x00000000, 0x00000100}, + {GPIOC_BASE, "GPIOC", 0xFFFFFFFF, 0x00000000, 0x00000000}, + {GPIOD_BASE, "GPIOD", 0xFFFFFFFF, 0x00000000, 0x00000000}, + {GPIOE_BASE, "GPIOE", 0xFFFFFFFF, 0x00000000, 0x00000000}, + {GPIOF_BASE, "GPIOF", 0xFFFFFFFF, 0x00000000, 0x00000000}, + {GPIOG_BASE, "GPIOG", 0xFFFFFFFF, 0x00000000, 0x00000000}, + {GPIOH_BASE, "GPIOH", 0x0000000F, 0x00000000, 0x00000000}, + }; + for (int i = 0; i < ARRAY_SIZE(gpio_desc); ++i) + { + s->gpio[i] = qdev_create(NULL, TYPE_STM32L476_GPIO); + s->gpio[i]->id = gpio_desc[i].name; + qdev_init_nofail(s->gpio[i]); + sysbus_mmio_map(SYS_BUS_DEVICE(s->gpio[i]), 0, gpio_desc[i].addr); + } create_unimplemented_layer("EXTI", EXTI_BASE, 0x400); create_unimplemented_layer("QUADSPI", QSPI_R_BASE, 0x400); - memory_region_init_rom(&s->flash, OBJECT(dev_soc), "STM32L467.flash", FLASH_SIZE, &error_fatal); diff --git a/hw/arm/stm32l476_gpio.c b/hw/arm/stm32l476_gpio.c new file mode 100644 index 0000000000000..1c0c1a2faee6d --- /dev/null +++ b/hw/arm/stm32l476_gpio.c @@ -0,0 +1,319 @@ +#include "qemu/osdep.h" +#include "hw/sysbus.h" +#include "hw/arm/boot.h" +#include "sysemu/sysemu.h" +#include "exec/address-spaces.h" +#include "qemu/log.h" +#include "hw/arm/stm32l476_gpio.h" + +typedef struct +{ + uint8_t mode; + uint64_t AFSEL; + uint64_t OT; + uint64_t PUPD; + uint64_t OSPEED; +} GpioPin; + +static const int GPIOx_MODER = 0x00; +static const int GPIOx_OTYPER = 0x04; +static const int GPIOx_OSPEEDR = 0x08; +static const int GPIOx_PUPDR = 0x0C; +static const int GPIOx_IDR = 0x10; +static const int GPIOx_BSRR = 0x18; +static const int GPIOx_AFRH = 0x24; +static const int GPIOx_BRR = 0x28; +static const int GPIOx_ASCR = 0x2c; + +struct __STM32L476GpioState +{ + /* */ + SysBusDevice parent_obj; + + GpioPin pins[16]; + + /* */ + MemoryRegion mmio; + qemu_irq irq; +}; + +static void +stm32l476_gpio_reset(DeviceState *dev) +{ + STM32L476GpioState *s = STM32L476_GPIO(dev); +} + +static uint64_t +stm32l476_gpio_read(void *opaque, hwaddr offset, + unsigned int size) +{ + STM32L476GpioState *s = opaque; + + assert(size == 4); + switch (offset) + { + case GPIOx_MODER: + { + uint32_t out = 0; + + for (int i = 0; i < 16; i++) + { + out |= s->pins[i].mode << (i * 2); + } + + return out; + } + + case GPIOx_OTYPER: + { + uint32_t out = 0; + + for (int i = 0; i < 16; i++) + { + out |= s->pins[i].OT << i; + } + + return out; + } + + case GPIOx_OSPEEDR: + { + uint32_t out = 0; + + for (int i = 0; i < 16; i++) + { + out |= s->pins[i].OSPEED << (i * 2); + } + + return out; + } + + case GPIOx_PUPDR: + { + uint32_t out = 0; + + for (int i = 0; i < 16; i++) + { + out |= s->pins[i].PUPD << (i * 2); + } + + return out; + } + + case GPIOx_AFRL: + { + uint32_t out = 0; + + for (int i = 0; i < 8; i++) + { + out |= s->pins[i].AFSEL << (i * 4); + } + + return out; + } + + case GPIOx_AFRH: + { + uint32_t out = 0; + + for (int i = 0; i < 8; i++) + { + out |= s->pins[8 + i].AFSEL << (i * 4); + } + + return out; + } + + case GPIOx_IDR: + { + return 0x20; + } + + case GPIOx_ASCR: + default: + { + qemu_log_mask(LOG_UNIMP, "%s: unimplemented device read " + "(size %d, offset 0x%" HWADDR_PRIx ")\n", + __func__, size, offset); + break; + } + } + return 0; +} + +static void +stm32l476_gpio_write(void *opaque, hwaddr offset, + uint64_t val64, unsigned int size) +{ + STM32L476GpioState *s = opaque; + + GpioPin backup[16] = {0}; + memcpy(backup, s->pins, sizeof(s->pins)); + + assert(size == 4); + switch (offset) + { + case GPIOx_MODER: + { + for (int i = 0; i < 16; i++) + { + s->pins[i].mode = extract64(val64, i * 2, 2); + } + break; + } + + case GPIOx_OTYPER: + { + for (int i = 0; i < 16; i++) + { + s->pins[i].OT = extract64(val64, i, 1); + } + break; + } + + case GPIOx_OSPEEDR: + { + for (int i = 0; i < 16; i++) + { + s->pins[i].OSPEED = extract64(val64, i * 2, 2); + } + break; + } + + case GPIOx_PUPDR: + { + for (int i = 0; i < 16; i++) + { + s->pins[i].PUPD = extract64(val64, i * 2, 2); + } + break; + } + + case GPIOx_BSRR: + { + // If there is an attempt to both set and reset a bit in GPIOx_BSRR, the set action takes priority. + for (int i = 0; i < 16; i++) + { + if (extract64(val64, i, 1)) + { + //set + } + + if (extract64(val64, 16 + i, 1)) + { + //reset + } + } + break; + } + + case GPIOx_AFRL: + { + for (int i = 0; i < 8; i++) + { + s->pins[i].AFSEL = extract64(val64, i * 4, 4); + } + break; + } + + case GPIOx_AFRH: + { + for (int i = 0; i < 8; i++) + { + s->pins[i + 8].AFSEL = extract64(val64, i * 4, 4); + } + break; + } + + case GPIOx_BRR: + { + for (int i = 0; i < 16; i++) + { + if (extract64(val64, i, 1)) + { + // Reset the corresponding ODx bit + } + } + break; + } + + case GPIOx_ASCR: + { + for (int i = 0; i < 16; i++) + { + if (extract64(val64, i, 1)) + { + // Connect analog switch to the ADC input + } + } + break; + }; + + default:qemu_log_mask(LOG_UNIMP, "%s: unimplemented device write " + "(size %d, value 0x%" PRIx64 + ", offset 0x%" HWADDR_PRIx ")\n", + __func__, size, val64, offset); + break; + } + + for (int i = 0; i < 16; i++) + { + GpioPin *x; + if (memcmp(&backup[i], &s->pins[i], sizeof(s->pins[0])) == 0) + continue; + + printf("[%s] Pin %d changed to ", DEVICE(s)->id, i); + +// x = &backup[i]; +// printf("[mode:%d AFSEL:%d ospeed:%d ot:%d pupd:%d]", x->mode, x->AFSEL, x->OSPEED, x->OT, x->PUPD); +// printf(" to "); + x = &s->pins[i]; + printf("[mode:%d ", x->mode); + if (x->mode == 0b10) + { + printf("AFSEL:%d ", x->AFSEL); + } + printf("ospeed:%d ot:%d pupd:%d]", x->OSPEED, x->OT, x->PUPD); + printf("\n"); + } +} + +static const MemoryRegionOps stm32l476_gpio_ops = { + .read = stm32l476_gpio_read, + .write = stm32l476_gpio_write, + .endianness = DEVICE_NATIVE_ENDIAN, +}; + +static void +stm32l476_gpio_init(Object *obj) +{ + STM32L476GpioState *s = STM32L476_GPIO(obj); + + memory_region_init_io(&s->mmio, obj, &stm32l476_gpio_ops, s, + TYPE_STM32L476_GPIO, 0x400); + sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->mmio); +} + +static void +stm32l476_gpio_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + + dc->reset = stm32l476_gpio_reset; +} + +static const TypeInfo stm32l476_gpio_info = { + .name = TYPE_STM32L476_GPIO, + .parent = TYPE_SYS_BUS_DEVICE, + .instance_size = sizeof(STM32L476GpioState), + .instance_init = stm32l476_gpio_init, + .class_init = stm32l476_gpio_class_init, +}; + +static void +stm32l476_gpio_register_types(void) +{ + type_register_static(&stm32l476_gpio_info); +} + +type_init(stm32l476_gpio_register_types) diff --git a/hw/arm/stm32l476_syscfg.c b/hw/arm/stm32l476_syscfg.c new file mode 100644 index 0000000000000..d052d02037bbf --- /dev/null +++ b/hw/arm/stm32l476_syscfg.c @@ -0,0 +1,148 @@ +#include "qemu/osdep.h" +#include "hw/sysbus.h" +#include "hw/arm/boot.h" +#include "sysemu/sysemu.h" +#include "exec/address-spaces.h" +#include "qemu/log.h" + +typedef struct +{ + /* */ + SysBusDevice parent_obj; + + /* */ + MemoryRegion mmio; + + uint8_t EXTI[16]; +} STM32L476SysCfgState; + +#define TYPE_STM32L476_SYSCFG "stm32l476-syscfg" + +#define STM32L476_SYSCFG(obj) \ + OBJECT_CHECK(STM32L476SysCfgState, (obj), TYPE_STM32L476_SYSCFG) + +static const int SYSCFG_EXTICR1 = 0x08; +static const int SYSCFG_EXTICR2 = 0x0c; +static const int SYSCFG_EXTICR4 = 0x14; +static const int SYSCFG_EXTICR3 = 0x10; + + +static void +stm32l476_syscfg_reset(DeviceState *dev) +{ + STM32L476SysCfgState *s = STM32L476_SYSCFG(dev); + + for (int i = 0; i < 16; i++) + { + s->EXTI[i] = 0b1111; + } + +} + +static uint32_t +getInt(const STM32L476SysCfgState *s, uint32_t offset) +{ + uint32_t out = 0; + for (int i = 0; i < 4; i++) + { + out |= s->EXTI[i + offset] << (i * 4); + } + return out; +} +static uint64_t +stm32l476_syscfg_read(void *opaque, hwaddr offset, + unsigned size) +{ + STM32L476SysCfgState *s = STM32L476_SYSCFG(opaque); + + switch (offset) + { + case 0x04:break; + case SYSCFG_EXTICR1: + { + return getInt(s, 0); + } + case SYSCFG_EXTICR2: + { + return getInt(s, 4); + } + case SYSCFG_EXTICR3: + { + return getInt(s, 8); + } + case SYSCFG_EXTICR4: + { + return getInt(s, 12); + } + + default: + { + qemu_log_mask(LOG_UNIMP, "%s: unimplemented device read " + "(size %d, offset 0x%" HWADDR_PRIx ")\n", + __func__, size, offset); + break; + } + } + return 0; +} + +static void +stm32l476_syscfg_write(void *opaque, hwaddr offset, + uint64_t val64, unsigned size) +{ + switch (offset) + { + case 0x04: +// case SYSCFG_EXTICR1: +// case SYSCFG_EXTICR2: +// case SYSCFG_EXTICR4: + break; + + default:qemu_log_mask(LOG_UNIMP, "%s: unimplemented device write " + "(size %d, value 0x%" PRIx64 + ", offset 0x%" HWADDR_PRIx ")\n", + __func__, size, val64, offset); + break; + + } +} + +static const MemoryRegionOps stm32l476_syscfg_ops = { + .read = stm32l476_syscfg_read, + .write =stm32l476_syscfg_write, + .endianness = DEVICE_NATIVE_ENDIAN, +}; + +static void +stm32l476_syscfg_init(Object *obj) +{ + STM32L476SysCfgState *s = STM32L476_SYSCFG(obj); + + memory_region_init_io(&s->mmio, obj, &stm32l476_syscfg_ops, s, + TYPE_STM32L476_SYSCFG, 0x400); + sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->mmio); +} + +static void +stm32l476_syscfg_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + + dc->reset = stm32l476_syscfg_reset; +} + +static const TypeInfo stm32l476_syscfg_info = { + .name = TYPE_STM32L476_SYSCFG, + .parent = TYPE_SYS_BUS_DEVICE, + .instance_size = sizeof(STM32L476SysCfgState), + .instance_init = stm32l476_syscfg_init, + .class_init = stm32l476_syscfg_class_init, +}; + +static void +stm32l476_syscfg_register_types(void) +{ + type_register_static(&stm32l476_syscfg_info); +} + +type_init(stm32l476_syscfg_register_types) diff --git a/hw/display/jdi-lpm013m126c.c b/hw/display/jdi-lpm013m126c.c index bd24d08bf4985..36998c3885334 100644 --- a/hw/display/jdi-lpm013m126c.c +++ b/hw/display/jdi-lpm013m126c.c @@ -61,7 +61,7 @@ uint32_t parse_header(lcd_state *s, uint16_t header) { if (M0_LOW(header) && M2_HI(header)) { - printf("all clear"); + printf("all clear\n"); for (int x = 0; x < 176; x++) { for (int y = 0; y < 176; y++) @@ -128,7 +128,7 @@ uint32_t jdi_lpm013m126c_transfer(SSISlave *bus, uint32_t val32) s->state = -1; parse_header(s, s->header); -// assert(s->state != -1); + assert(s->state != -1); return 0; } @@ -147,9 +147,12 @@ uint32_t jdi_lpm013m126c_transfer(SSISlave *bus, uint32_t val32) b = (s->fifo >> 2) & 1; } - s->buffer[s->line][s->cur_x].r = r; - s->buffer[s->line][s->cur_x].g = g; - s->buffer[s->line][s->cur_x].b = b; + if(s->cur_x < 176) + { + s->buffer[s->line][s->cur_x].r = r; + s->buffer[s->line][s->cur_x].g = g; + s->buffer[s->line][s->cur_x].b = b; + } s->fifo = s->fifo >> s->bpp; s->fifo_len -= s->bpp; diff --git a/include/hw/arm/stm32l467_soc.h b/include/hw/arm/stm32l467_soc.h index f9c722c850fdd..1a34da278c044 100644 --- a/include/hw/arm/stm32l467_soc.h +++ b/include/hw/arm/stm32l467_soc.h @@ -16,7 +16,7 @@ OBJECT_CHECK(STM32L467State, (obj), TYPE_STM32L467_SOC) #define FLASH_BASE_ADDRESS 0x8000000 -#define FLASH_SIZE (512 * 1024) +#define FLASH_SIZE (1024 * 1024) typedef struct STM32L467State { @@ -38,6 +38,8 @@ typedef struct STM32L467State { MemoryRegion flash; MemoryRegion sram1; MemoryRegion sram2; + DeviceState* gpio[8]; + DeviceState *syscfg; } STM32L467State; #endif diff --git a/include/hw/arm/stm32l476_gpio.h b/include/hw/arm/stm32l476_gpio.h new file mode 100644 index 0000000000000..d084fa5a9e094 --- /dev/null +++ b/include/hw/arm/stm32l476_gpio.h @@ -0,0 +1,12 @@ +#ifndef HW_ARM_STM32L476_GPIO_H +#define HW_ARM_STM32L476_GPIO_H + +#include "hw/arm/armv7m.h" + +#define TYPE_STM32L476_GPIO "stm32l476-gpio" +#define STM32L476_GPIO(obj) \ + OBJECT_CHECK(STM32L476GpioState, (obj), TYPE_STM32L476_GPIO) + +typedef struct __STM32L476GpioState STM32L476GpioState; +static const int GPIOx_AFRL = 0x20; +#endif From b9d2a76a35dc19928b80fd462305052046007f7e Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Mon, 2 Nov 2020 12:02:14 +0100 Subject: [PATCH 14/15] Disable mouse grabbing --- hw/arm/stm32l476_exti.c | 74 +++++++++++++++++++++++++++++++++++++++++ ui/cocoa.m | 2 ++ 2 files changed, 76 insertions(+) create mode 100644 hw/arm/stm32l476_exti.c diff --git a/hw/arm/stm32l476_exti.c b/hw/arm/stm32l476_exti.c new file mode 100644 index 0000000000000..7715e9b2b7653 --- /dev/null +++ b/hw/arm/stm32l476_exti.c @@ -0,0 +1,74 @@ +#include "qemu/osdep.h" +#include "hw/sysbus.h" +#include "hw/arm/boot.h" +#include "sysemu/sysemu.h" +#include "exec/address-spaces.h" +#include "qemu/log.h" + +#include "hw/arm/stm32l476_rcc.h" + +static void stm32l476_rcc_reset(DeviceState *dev) { + STM32L476RccState *s = STM32L476_RCC(dev); +} + +static uint64_t stm32l476_rcc_read(void *opaque, hwaddr offset, + unsigned int size) { + STM32L476RccState *s = opaque; + + switch (offset) { + default: + qemu_log_mask(LOG_UNIMP, "%s: unimplemented device read " + "(size %d, offset 0x%" HWADDR_PRIx ")\n", + __func__, size, offset); + break; + } + return 0; +} + +static void stm32l476_rcc_write(void *opaque, hwaddr offset, + uint64_t val64, unsigned int size) { + STM32L476RccState *s = opaque; + + switch (offset) { + default: + qemu_log_mask(LOG_UNIMP, "%s: unimplemented device write " + "(size %d, value 0x%" PRIx64 + ", offset 0x%" HWADDR_PRIx ")\n", + __func__, size, val64, offset); + break; + } +} + +static const MemoryRegionOps stm32l476_rcc_ops = { + .read = stm32l476_rcc_read, + .write = stm32l476_rcc_write, + .endianness = DEVICE_NATIVE_ENDIAN, +}; + +static void stm32l476_rcc_init(Object *obj) { + STM32L476RccState *s = STM32L476_RCC(obj); + + memory_region_init_io(&s->mmio, obj, &stm32l476_rcc_ops, s, + TYPE_STM32L476_RCC, 0x400); + sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->mmio); +} + +static void stm32l476_rcc_class_init(ObjectClass *klass, void *data) { + DeviceClass *dc = DEVICE_CLASS(klass); + + dc->reset = stm32l476_rcc_reset; +} + +static const TypeInfo stm32l476_rcc_info = { + .name = TYPE_STM32L476_RCC, + .parent = TYPE_SYS_BUS_DEVICE, + .instance_size = sizeof(STM32L476RccState), + .instance_init = stm32l476_rcc_init, + .class_init = stm32l476_rcc_class_init, +}; + +static void stm32l476_rcc_register_types(void) { + type_register_static(&stm32l476_rcc_info); +} + +type_init(stm32l476_rcc_register_types) diff --git a/ui/cocoa.m b/ui/cocoa.m index cb556e4e6689d..316beaee3997e 100644 --- a/ui/cocoa.m +++ b/ui/cocoa.m @@ -950,6 +950,7 @@ - (bool) handleEventLocked:(NSEvent *)event - (void) grabMouse { + return; COCOA_DEBUG("QemuCocoaView: grabMouse\n"); if (!isFullscreen) { @@ -968,6 +969,7 @@ - (void) grabMouse - (void) ungrabMouse { + return; COCOA_DEBUG("QemuCocoaView: ungrabMouse\n"); if (!isFullscreen) { From 860b4e79d01710fdfec237362ebcd4fa35899373 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Mon, 2 Nov 2020 12:02:38 +0100 Subject: [PATCH 15/15] Fix display --- hw/display/jdi-lpm013m126c.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/hw/display/jdi-lpm013m126c.c b/hw/display/jdi-lpm013m126c.c index 36998c3885334..d016881f696f1 100644 --- a/hw/display/jdi-lpm013m126c.c +++ b/hw/display/jdi-lpm013m126c.c @@ -61,7 +61,6 @@ uint32_t parse_header(lcd_state *s, uint16_t header) { if (M0_LOW(header) && M2_HI(header)) { - printf("all clear\n"); for (int x = 0; x < 176; x++) { for (int y = 0; y < 176; y++) @@ -123,7 +122,9 @@ uint32_t jdi_lpm013m126c_transfer(SSISlave *bus, uint32_t val32) return 0; } - if (s->state == 1) { + + if (s->state == 1) + { s->header |= val << 8; s->state = -1; @@ -196,7 +197,9 @@ static const GraphicHwOps sm_lcd_ops = { .invalidate = sm_lcd_invalidate_display, }; -static void jdi_lpm013m126c_realize(SSISlave *d, Error **errp) { +static void +jdi_lpm013m126c_realize(SSISlave *d, Error **errp) +{ DeviceState *dev = DEVICE(d); lcd_state *s = LCD(dev); @@ -205,11 +208,27 @@ static void jdi_lpm013m126c_realize(SSISlave *d, Error **errp) { qemu_console_resize(s->con, 176, 176); } -static void jdi_lpm013m126c_class_init(ObjectClass *klass, void *data) { +int +jdi_lpm013m126c_set_cd(SSISlave *dev, bool select) +{ + lcd_state *s = LCD(dev); + + if (select) + { + s->state = 0; + } + + return 0; +} + +static void +jdi_lpm013m126c_class_init(ObjectClass *klass, void *data) +{ SSISlaveClass *k = SSI_SLAVE_CLASS(klass); k->transfer = jdi_lpm013m126c_transfer; k->realize = jdi_lpm013m126c_realize; - k->cs_polarity = SSI_CS_LOW; + k->cs_polarity = SSI_CS_HIGH; + k->set_cs = jdi_lpm013m126c_set_cd; } static const TypeInfo jdi_lpm013m126c_info = {