[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [RFC PATCH] stm32f103: Add initial skeleton of STM32 F1
From: |
Alistair Francis |
Subject: |
Re: [Qemu-devel] [RFC PATCH] stm32f103: Add initial skeleton of STM32 F103 SoC |
Date: |
Tue, 15 Jan 2019 13:56:51 -0800 |
On Sun, Jan 6, 2019 at 1:03 PM Priit Laes <address@hidden> wrote:
>
> On Thu, Jan 03, 2019 at 01:33:08PM -0800, Alistair Francis wrote:
> > On Wed, Dec 26, 2018 at 11:08 AM Priit Laes <address@hidden> wrote:
> > >
> > > Initial barebone SoC implementation for STM32F103
> > > with "Blue Pill" board source for testing.
> > >
> > > Code is based on both nrf51/microbit and stm32f205.
> > >
> > > Although code loads and seems to be at the right
> > > addresses it does not yet run:
> > >
> > > ./arm-softmmu/qemu-system-arm -nographic \
> > > -machine stm32bluepill \
> > > -kernel \
> > > libopencm3-miniblink/bin/stm32/bluepill.bin
> > > QEMU 3.1.50 monitor - type 'help' for more information
> > > (qemu) QEMU 3.1.50 monitor - type 'help' for more information
> > > (qemu) gdbserver
> > > Waiting for gdb connection on device 'tcp::1234'
> > >
> > > $ arm-none-eabi-gdb \
> > > libopencm3-miniblink/bin/stm32/bluepill.elf
> > > (gdb) target remote tcp::1234
> > > Remote debugging using tcp::1234
> > > blocking_handler () at ../../cm3/vector.c:103
> > > 103 {
> > > (gdb) bt
> > > Backtrace stopped: previous frame identical to this frame (corrupt stack?)
> > > (gdb) info line
> > > Line 103 of "../../cm3/vector.c" starts at address 0x8000380 \
> > > <blocking_handler> and ends at 0x8000382 <null_handler>.
> > >
> > > Any ideas?
> >
> > Have you tried running QEMU with the -d option (-d in_asm is a good
> > place to start)? Does that shed any light on what is happening?
>
> Thanks for the tips, it actually was working, but just went into
> infinite loop (which is probably caused by unimplemented peripheral
> register access, or something else).
>
> Also, what helped in addition to (-d in_asm):
> -S freezes CPU at startup (so one can singlestep with gdb)
> -s starts gdbserver on tcp::1234
Great! I'm glad it's working.
Make sure you send a patch once you have it working and it can be
merged into mainline QEMU. Looking at your code it looks like you are
on the right track :)
Alistair
>
> Thanks! :)
> >
> > Alistair
> >
> > >
> > > Signed-off-by: Priit Laes <address@hidden>
> > > ---
> > > default-configs/arm-softmmu.mak | 1 +
> > > hw/arm/Makefile.objs | 1 +
> > > hw/arm/stm32f103_blue_pill.c | 78 ++++++++++++++++++++++++++++
> > > hw/arm/stm32f103_soc.c | 92 +++++++++++++++++++++++++++++++++
> > > include/hw/arm/stm32f103_soc.h | 54 +++++++++++++++++++
> > > 5 files changed, 226 insertions(+)
> > > create mode 100644 hw/arm/stm32f103_blue_pill.c
> > > create mode 100644 hw/arm/stm32f103_soc.c
> > > create mode 100644 include/hw/arm/stm32f103_soc.h
> > >
> > > diff --git a/default-configs/arm-softmmu.mak
> > > b/default-configs/arm-softmmu.mak
> > > index 2420491aac..7a55e523e1 100644
> > > --- a/default-configs/arm-softmmu.mak
> > > +++ b/default-configs/arm-softmmu.mak
> > > @@ -95,6 +95,7 @@ CONFIG_RASPI=y
> > > CONFIG_REALVIEW=y
> > > CONFIG_ZAURUS=y
> > > CONFIG_ZYNQ=y
> > > +CONFIG_STM32F103_SOC=y
> > > CONFIG_STM32F2XX_TIMER=y
> > > CONFIG_STM32F2XX_USART=y
> > > CONFIG_STM32F2XX_SYSCFG=y
> > > diff --git a/hw/arm/Makefile.objs b/hw/arm/Makefile.objs
> > > index 50c7b4a927..7f59a9349d 100644
> > > --- a/hw/arm/Makefile.objs
> > > +++ b/hw/arm/Makefile.objs
> > > @@ -24,6 +24,7 @@ obj-$(CONFIG_OMAP) += omap1.o omap2.o
> > > obj-$(CONFIG_STRONGARM) += strongarm.o
> > > obj-$(CONFIG_ALLWINNER_A10) += allwinner-a10.o cubieboard.o
> > > obj-$(CONFIG_RASPI) += bcm2835_peripherals.o bcm2836.o raspi.o
> > > +obj-$(CONFIG_STM32F103_SOC) += stm32f103_soc.o stm32f103_blue_pill.o
> > > obj-$(CONFIG_STM32F205_SOC) += stm32f205_soc.o
> > > obj-$(CONFIG_XLNX_ZYNQMP_ARM) += xlnx-zynqmp.o xlnx-zcu102.o
> > > obj-$(CONFIG_XLNX_VERSAL) += xlnx-versal.o xlnx-versal-virt.o
> > > diff --git a/hw/arm/stm32f103_blue_pill.c b/hw/arm/stm32f103_blue_pill.c
> > > new file mode 100644
> > > index 0000000000..09dd69aa71
> > > --- /dev/null
> > > +++ b/hw/arm/stm32f103_blue_pill.c
> > > @@ -0,0 +1,78 @@
> > > +/*
> > > + * STM32F103C8 Blue Pill development board Machine Model
> > > + *
> > > + * Copyright (c) 2018 Priit Laes <address@hidden>
> > > + *
> > > + * Permission is hereby granted, free of charge, to any person obtaining
> > > a copy
> > > + * of this software and associated documentation files (the "Software"),
> > > to deal
> > > + * in the Software without restriction, including without limitation the
> > > rights
> > > + * to use, copy, modify, merge, publish, distribute, sublicense, and/or
> > > sell
> > > + * copies of the Software, and to permit persons to whom the Software is
> > > + * furnished to do so, subject to the following conditions:
> > > + *
> > > + * The above copyright notice and this permission notice shall be
> > > included in
> > > + * all copies or substantial portions of the Software.
> > > + *
> > > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> > > EXPRESS OR
> > > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> > > MERCHANTABILITY,
> > > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
> > > SHALL
> > > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
> > > OTHER
> > > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> > > ARISING FROM,
> > > + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
> > > DEALINGS IN
> > > + * THE SOFTWARE.
> > > + */
> > > +
> > > +#include "qemu/osdep.h"
> > > +#include "qapi/error.h"
> > > +#include "hw/boards.h"
> > > +#include "hw/arm/arm.h"
> > > +#include "exec/address-spaces.h"
> > > +
> > > +#include "hw/arm/stm32f103_soc.h"
> > > +
> > > +typedef struct {
> > > + MachineState parent;
> > > +
> > > + STM32F103State stm32f103;
> > > +} STM32BluePillMachineState;
> > > +
> > > +#define TYPE_STM32BLUEPILL_MACHINE MACHINE_TYPE_NAME("stm32bluepill")
> > > +
> > > +#define STM32BLUEPILL_MACHINE(obj) \
> > > + OBJECT_CHECK(STM32BluePillMachineState, obj,
> > > TYPE_STM32BLUEPILL_MACHINE)
> > > +
> > > +static void stm32bluepill_init(MachineState *machine)
> > > +{
> > > + STM32BluePillMachineState *s = STM32BLUEPILL_MACHINE(machine);
> > > + Object *soc = OBJECT(&s->stm32f103);
> > > +
> > > + sysbus_init_child_obj(OBJECT(machine), "stm32f103-soc", soc,
> > > + sizeof(s->stm32f103), TYPE_STM32F103_SOC);
> > > + object_property_set_bool(soc, true, "realized", &error_fatal);
> > > +
> > > + armv7m_load_kernel(ARM_CPU(first_cpu), machine->kernel_filename,
> > > + FLASH_SIZE);
> > > +}
> > > +
> > > +static void stm32bluepill_machine_class_init(ObjectClass *oc, void *data)
> > > +{
> > > + MachineClass *mc = MACHINE_CLASS(oc);
> > > +
> > > + mc->desc = "STM32F103 Blue Pill development board";
> > > + mc->init = stm32bluepill_init;
> > > + mc->max_cpus = 1;
> > > +}
> > > +
> > > +static const TypeInfo stm32bluepill_info = {
> > > + .name = TYPE_STM32BLUEPILL_MACHINE,
> > > + .parent = TYPE_MACHINE,
> > > + .instance_size = sizeof(STM32BluePillMachineState),
> > > + .class_init = stm32bluepill_machine_class_init,
> > > +};
> > > +
> > > +static void stm32bluepill_machine_init(void)
> > > +{
> > > + type_register_static(&stm32bluepill_info);
> > > +}
> > > +
> > > +type_init(stm32bluepill_machine_init);
> > > diff --git a/hw/arm/stm32f103_soc.c b/hw/arm/stm32f103_soc.c
> > > new file mode 100644
> > > index 0000000000..3093bce4ea
> > > --- /dev/null
> > > +++ b/hw/arm/stm32f103_soc.c
> > > @@ -0,0 +1,92 @@
> > > +/*
> > > + * STM32 F103 SoC (or MCU)
> > > + *
> > > + * Copyright 2018 Priit Laes <address@hidden>
> > > + *
> > > + * This code is licensed under the GPL version 2 or later. See
> > > + * the COPYING file in the top-level directory.
> > > + */
> > > +#include "qemu/osdep.h"
> > > +#include "qapi/error.h"
> > > +#include "hw/sysbus.h"
> > > +#include "exec/address-spaces.h"
> > > +
> > > +#include "hw/arm/stm32f103_soc.h"
> > > +
> > > +#define FLASH_BASE 0x08000000
> > > +#define SRAM_BASE 0x20000000
> > > +
> > > +static void stm32f103_soc_init(Object *obj)
> > > +{
> > > + STM32F103State *s = STM32F103_SOC(obj);
> > > +
> > > + sysbus_init_child_obj(obj, "armv7m", &s->cpu, sizeof(s->cpu),
> > > + TYPE_ARMV7M);
> > > +}
> > > +
> > > +static void stm32f103_soc_realize(DeviceState *dev_soc, Error **errp)
> > > +{
> > > + STM32F103State *s = STM32F103_SOC(dev_soc);
> > > + Error *err = NULL;
> > > +
> > > + /*
> > > + * XXX: Region 0x1FFF F000 - 0x1FFF F7FF is called "System Memory"
> > > + * containing boot loader used to reprogram flash by using USART1.
> > > + */
> > > + MemoryRegion *system_memory = get_system_memory();
> > > +
> > > + memory_region_init_rom(&s->flash, NULL, "stm32.flash", FLASH_SIZE,
> > > + &error_fatal);
> > > + memory_region_add_subregion(system_memory, FLASH_BASE, &s->flash);
> > > + /*
> > > + * TODO: based on BOOT pin, 0x00000000 - 0x0007FFFF is aliased to
> > > + * either Flash or system memory. We currently hardcode it to flash.
> > > + */
> > > + memory_region_init_alias(&s->flash_alias, NULL, "stm32.flash_alias",
> > > + &s->flash, 0, FLASH_SIZE);
> > > + memory_region_add_subregion(system_memory, 0, &s->flash_alias);
> > > +
> > > + memory_region_init_ram(&s->sram, NULL, "stm32.sram", SRAM_SIZE,
> > > + &error_fatal);
> > > + memory_region_add_subregion(system_memory, SRAM_BASE, &s->sram);
> > > +
> > > + qdev_prop_set_bit(DEVICE(&s->cpu), "enable-bitband", true);
> > > + qdev_prop_set_uint32(DEVICE(&s->cpu), "num-irq", 80);
> > > + qdev_prop_set_string(DEVICE(&s->cpu), "cpu-type",
> > > ARM_CPU_TYPE_NAME("cortex-m3"));
> > > +
> > > + object_property_set_link(OBJECT(&s->cpu), OBJECT(system_memory),
> > > + "memory", &error_abort);
> > > + object_property_set_bool(OBJECT(&s->cpu), true, "realized", &err);
> > > + if (err != NULL) {
> > > + error_propagate(errp, err);
> > > + return;
> > > + }
> > > +}
> > > +
> > > +static Property stm32f103_soc_properties[] = {
> > > + DEFINE_PROP_UINT32("flash-size", STM32F103State, flash_size,
> > > FLASH_SIZE),
> > > + DEFINE_PROP_UINT32("sram-size", STM32F103State, sram_size,
> > > SRAM_SIZE),
> > > + DEFINE_PROP_END_OF_LIST(),
> > > +};
> > > +
> > > +static void stm32f103_soc_class_init(ObjectClass *klass, void *data)
> > > +{
> > > + DeviceClass *dc = DEVICE_CLASS(klass);
> > > +
> > > + dc->props = stm32f103_soc_properties;
> > > + dc->realize = stm32f103_soc_realize;
> > > +}
> > > +
> > > +static const TypeInfo stm32f103_soc_info = {
> > > + .name = TYPE_STM32F103_SOC,
> > > + .parent = TYPE_SYS_BUS_DEVICE,
> > > + .instance_size = sizeof(STM32F103State),
> > > + .instance_init = stm32f103_soc_init,
> > > + .class_init = stm32f103_soc_class_init,
> > > +};
> > > +
> > > +static void stm32f103_soc_types(void)
> > > +{
> > > + type_register_static(&stm32f103_soc_info);
> > > +}
> > > +type_init(stm32f103_soc_types)
> > > diff --git a/include/hw/arm/stm32f103_soc.h
> > > b/include/hw/arm/stm32f103_soc.h
> > > new file mode 100644
> > > index 0000000000..d6b2eb9c57
> > > --- /dev/null
> > > +++ b/include/hw/arm/stm32f103_soc.h
> > > @@ -0,0 +1,54 @@
> > > +/*
> > > + * STM32 F103 SoC (or MCU)
> > > + *
> > > + * Copyright (c) 2018 Priit Laes <address@hidden>
> > > + *
> > > + * Permission is hereby granted, free of charge, to any person obtaining
> > > a copy
> > > + * of this software and associated documentation files (the "Software"),
> > > to deal
> > > + * in the Software without restriction, including without limitation the
> > > rights
> > > + * to use, copy, modify, merge, publish, distribute, sublicense, and/or
> > > sell
> > > + * copies of the Software, and to permit persons to whom the Software is
> > > + * furnished to do so, subject to the following conditions:
> > > + *
> > > + * The above copyright notice and this permission notice shall be
> > > included in
> > > + * all copies or substantial portions of the Software.
> > > + *
> > > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> > > EXPRESS OR
> > > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> > > MERCHANTABILITY,
> > > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
> > > SHALL
> > > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
> > > OTHER
> > > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> > > ARISING FROM,
> > > + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
> > > DEALINGS IN
> > > + * THE SOFTWARE.
> > > + */
> > > +
> > > +#ifndef HW_ARM_STM32F103_SOC_H
> > > +#define HW_ARM_STM32F103_SOC_H
> > > +
> > > +#include "hw/arm/armv7m.h"
> > > +
> > > +#define TYPE_STM32F103_SOC "stm32f103-soc"
> > > +#define STM32F103_SOC(obj) \
> > > + OBJECT_CHECK(STM32F103State, (obj), TYPE_STM32F103_SOC)
> > > +
> > > +/* TODO: flash/sram sizes are for STM32F103C8 part. */
> > > +#define FLASH_SIZE (64 * 1024)
> > > +#define SRAM_SIZE (20 * 1024)
> > > +
> > > +typedef struct STM32F103State {
> > > + SysBusDevice parent_obj;
> > > +
> > > + ARMv7MState cpu;
> > > +
> > > + uint32_t sram_size;
> > > + uint32_t flash_size;
> > > + MemoryRegion sram;
> > > + MemoryRegion flash;
> > > + /* XXX: find better name */
> > > + MemoryRegion flash_alias;
> > > +
> > > + /* TODO: Peripherals */
> > > +
> > > +} STM32F103State;
> > > +
> > > +#endif /* HW_ARM_STM32F103_SOC_H */
> > > --
> > > 2.20.1
> > >
> > >
>