From: Inès Varhol <ines.varhol@telecom-paris.fr>
This commit adds a new B-L475E-IOT01A board using the STM32L475VG SoC.
The implementation is derived from the Netduino Plus 2 machine.
There are no peripherals implemented, only memory regions.
Signed-off-by: default avatarArnaud Minier <arnaud.minier@telecom-paris.fr>
Signed-off-by: Inès Varhol <ines.varhol@telecom-paris.fr>
---
configs/devices/arm-softmmu/default.mak | 1 +
hw/arm/Kconfig | 6 +++
hw/arm/b-l475e-iot01a.c | 71 +++++++++++++++++++++++++
hw/arm/meson.build | 1 +
4 files changed, 79 insertions(+)
create mode 100644 hw/arm/b-l475e-iot01a.c
diff --git a/configs/devices/arm-softmmu/default.mak b/configs/devices/arm-softmmu/default.mak
index 980c48a7d9..023faa2f75 100644
--- a/configs/devices/arm-softmmu/default.mak
+++ b/configs/devices/arm-softmmu/default.mak
@@ -19,6 +19,7 @@ CONFIG_ARM_VIRT=y
# CONFIG_NSERIES=n
# CONFIG_STELLARIS=n
# CONFIG_STM32VLDISCOVERY=n
+# CONFIG_B_L475E_IOT01A=n
# CONFIG_REALVIEW=n
# CONFIG_VERSATILE=n
# CONFIG_VEXPRESS=n
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
index 763510afeb..4d4ed96168 100644
--- a/hw/arm/Kconfig
+++ b/hw/arm/Kconfig
@@ -448,6 +448,12 @@ config STM32F405_SOC
select STM32F4XX_SYSCFG
select STM32F4XX_EXTI
+config B_L475E_IOT01A
+ bool
+ default y
+ depends on TCG && ARM
+ select STM32L475VG_SOC
+
config STM32L475VG_SOC
bool
select ARM_V7M
diff --git a/hw/arm/b-l475e-iot01a.c b/hw/arm/b-l475e-iot01a.c
new file mode 100644
index 0000000000..bfcb386d52
--- /dev/null
+++ b/hw/arm/b-l475e-iot01a.c
@@ -0,0 +1,71 @@
+/*
+ * B-L475E-IOT01A Discovery Kit machine
+ * (B-L475E-IOT01A IoT Node)
+ *
+ * Copyright (c) 2014 Alistair Francis <alistair@alistair23.me>
+ * Copyright (c) 2023 Arnaud Minier <arnaud.minier@telecom-paris.fr>
+ * Copyright (c) 2023 Ines Varhol <ines.varhol@telecom-paris.fr>
+ *
+ * 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/qdev-properties.h"
+#include "hw/qdev-clock.h"
+#include "qemu/error-report.h"
+#include "hw/arm/stm32l475vg_soc.h"
+#include "hw/arm/boot.h"
+
+/* B-L475E-IOT01A implementation is derived from netduinoplus2 */
+
+/* Main SYSCLK frequency in Hz (80MHz) */
+#define SYSCLK_FRQ 80000000ULL
+
+static void b_l475e_iot01a_init(MachineState *machine)
+{
+ DeviceState *dev;
+ Clock *sysclk;
+
+ /* This clock doesn't need migration because it is fixed-frequency */
+ sysclk = clock_new(OBJECT(machine), "SYSCLK");
+ clock_set_hz(sysclk, SYSCLK_FRQ);
+
+ dev = qdev_new(TYPE_STM32L475VG_SOC);
+ qdev_prop_set_string(dev, "cpu-type", ARM_CPU_TYPE_NAME("cortex-m4"));
+ qdev_connect_clock_in(dev, "sysclk", sysclk);
+ qdev_realize(DEVICE(dev), NULL, &error_fatal);
+
+ armv7m_load_kernel(ARM_CPU(first_cpu),
+ machine->kernel_filename,
+ 0, FLASH_SIZE);
+}
+
+static void b_l475e_iot01a_machine_init(MachineClass *mc)
+{
+ mc->desc = "B-L475E-IOT01A Discovery Kit (Cortex-M4)";
+ mc->init = b_l475e_iot01a_init;
+ mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-m4");
+
+ /* SRAM pre-allocated as part of the SoC instantiation */
+ mc->default_ram_size = 0;
+}
+
+DEFINE_MACHINE("b-l475e-iot01a", b_l475e_iot01a_machine_init)
diff --git a/hw/arm/meson.build b/hw/arm/meson.build
index 6b2e1228e5..579c28f546 100644
--- a/hw/arm/meson.build
+++ b/hw/arm/meson.build
@@ -42,6 +42,7 @@ arm_ss.add(when: 'CONFIG_RASPI', if_true: files('bcm2836.c', 'raspi.c'))
arm_ss.add(when: 'CONFIG_STM32F100_SOC', if_true: files('stm32f100_soc.c'))
arm_ss.add(when: 'CONFIG_STM32F205_SOC', if_true: files('stm32f205_soc.c'))
arm_ss.add(when: 'CONFIG_STM32F405_SOC', if_true: files('stm32f405_soc.c'))
+arm_ss.add(when: 'CONFIG_B_L475E_IOT01A', if_true: files('b-l475e-iot01a.c'))
arm_ss.add(when: 'CONFIG_STM32L475VG_SOC', if_true: files('stm32l475vg_soc.c'))
arm_ss.add(when: 'CONFIG_XLNX_ZYNQMP_ARM', if_true: files('xlnx-zynqmp.c', 'xlnx-zcu102.c'))
arm_ss.add(when: 'CONFIG_XLNX_VERSAL', if_true: files('xlnx-versal.c', 'xlnx-versal-virt.c'))
--
2.38.5
Hi Inès, On 15/11/23 09:04, ~inesvarhol wrote: > From: Inès Varhol <ines.varhol@telecom-paris.fr> > > This commit adds a new B-L475E-IOT01A board using the STM32L475VG SoC. > The implementation is derived from the Netduino Plus 2 machine. > There are no peripherals implemented, only memory regions. > > Signed-off-by: default avatarArnaud Minier <arnaud.minier@telecom-paris.fr> "default avatar" got converted to text :) > Signed-off-by: Inès Varhol <ines.varhol@telecom-paris.fr> > --- > configs/devices/arm-softmmu/default.mak | 1 + > hw/arm/Kconfig | 6 +++ > hw/arm/b-l475e-iot01a.c | 71 +++++++++++++++++++++++++ > hw/arm/meson.build | 1 + > 4 files changed, 79 insertions(+) > create mode 100644 hw/arm/b-l475e-iot01a.c > > diff --git a/configs/devices/arm-softmmu/default.mak b/configs/devices/arm-softmmu/default.mak > index 980c48a7d9..023faa2f75 100644 > --- a/configs/devices/arm-softmmu/default.mak > +++ b/configs/devices/arm-softmmu/default.mak > @@ -19,6 +19,7 @@ CONFIG_ARM_VIRT=y > # CONFIG_NSERIES=n > # CONFIG_STELLARIS=n > # CONFIG_STM32VLDISCOVERY=n > +# CONFIG_B_L475E_IOT01A=n > # CONFIG_REALVIEW=n > # CONFIG_VERSATILE=n > # CONFIG_VEXPRESS=n > diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig > index 763510afeb..4d4ed96168 100644 > --- a/hw/arm/Kconfig > +++ b/hw/arm/Kconfig > @@ -448,6 +448,12 @@ config STM32F405_SOC > select STM32F4XX_SYSCFG > select STM32F4XX_EXTI > > +config B_L475E_IOT01A > + bool > + default y > + depends on TCG && ARM > + select STM32L475VG_SOC > + > config STM32L475VG_SOC > bool > select ARM_V7M > diff --git a/hw/arm/b-l475e-iot01a.c b/hw/arm/b-l475e-iot01a.c > new file mode 100644 > index 0000000000..bfcb386d52 > --- /dev/null > +++ b/hw/arm/b-l475e-iot01a.c > @@ -0,0 +1,71 @@ > +/* > + * B-L475E-IOT01A Discovery Kit machine > + * (B-L475E-IOT01A IoT Node) > + * > + * Copyright (c) 2014 Alistair Francis <alistair@alistair23.me> > + * Copyright (c) 2023 Arnaud Minier <arnaud.minier@telecom-paris.fr> > + * Copyright (c) 2023 Ines Varhol <ines.varhol@telecom-paris.fr> > + * Please add a SPDX tag if possible. > + * 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/qdev-properties.h" > +#include "hw/qdev-clock.h" > +#include "qemu/error-report.h" > +#include "hw/arm/stm32l475vg_soc.h" > +#include "hw/arm/boot.h" > + > +/* B-L475E-IOT01A implementation is derived from netduinoplus2 */ > + > +/* Main SYSCLK frequency in Hz (80MHz) */ > +#define SYSCLK_FRQ 80000000ULL > + > +static void b_l475e_iot01a_init(MachineState *machine) > +{ > + DeviceState *dev; > + Clock *sysclk; > + > + /* This clock doesn't need migration because it is fixed-frequency */ > + sysclk = clock_new(OBJECT(machine), "SYSCLK"); > + clock_set_hz(sysclk, SYSCLK_FRQ); > + > + dev = qdev_new(TYPE_STM32L475VG_SOC); > + qdev_prop_set_string(dev, "cpu-type", ARM_CPU_TYPE_NAME("cortex-m4")); > + qdev_connect_clock_in(dev, "sysclk", sysclk); > + qdev_realize(DEVICE(dev), NULL, &error_fatal); > + > + armv7m_load_kernel(ARM_CPU(first_cpu), > + machine->kernel_filename, > + 0, FLASH_SIZE); > +} > + > > +static void b_l475e_iot01a_machine_init(MachineClass *mc) > +{ We can enforce the CPU type using: static const char *machine_valid_cpu_types[] = { ARM_CPU_TYPE_NAME("cortex-m4"), NULL }; > + mc->desc = "B-L475E-IOT01A Discovery Kit (Cortex-M4)"; > + mc->init = b_l475e_iot01a_init; > + mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-m4"); mc->valid_cpu_types = machine_valid_cpu_types; Otherwise, clean patch :) Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Regards, Phil. > + > + /* SRAM pre-allocated as part of the SoC instantiation */ > + mc->default_ram_size = 0; > +} > + > +DEFINE_MACHINE("b-l475e-iot01a", b_l475e_iot01a_machine_init) > diff --git a/hw/arm/meson.build b/hw/arm/meson.build > index 6b2e1228e5..579c28f546 100644 > --- a/hw/arm/meson.build > +++ b/hw/arm/meson.build > @@ -42,6 +42,7 @@ arm_ss.add(when: 'CONFIG_RASPI', if_true: files('bcm2836.c', 'raspi.c')) > arm_ss.add(when: 'CONFIG_STM32F100_SOC', if_true: files('stm32f100_soc.c')) > arm_ss.add(when: 'CONFIG_STM32F205_SOC', if_true: files('stm32f205_soc.c')) > arm_ss.add(when: 'CONFIG_STM32F405_SOC', if_true: files('stm32f405_soc.c')) > +arm_ss.add(when: 'CONFIG_B_L475E_IOT01A', if_true: files('b-l475e-iot01a.c')) > arm_ss.add(when: 'CONFIG_STM32L475VG_SOC', if_true: files('stm32l475vg_soc.c')) > arm_ss.add(when: 'CONFIG_XLNX_ZYNQMP_ARM', if_true: files('xlnx-zynqmp.c', 'xlnx-zcu102.c')) > arm_ss.add(when: 'CONFIG_XLNX_VERSAL', if_true: files('xlnx-versal.c', 'xlnx-versal-virt.c'))
© 2016 - 2024 Red Hat, Inc.