[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC PATCH v2 00/23] NXP i.MX RT595, ARM SVD and device model unit tests
|
From: |
Octavian Purdila |
|
Subject: |
[RFC PATCH v2 00/23] NXP i.MX RT595, ARM SVD and device model unit tests |
|
Date: |
Sat, 17 Aug 2024 03:25:43 -0700 |
This patch set adds support for NXP's RT500 MCU [1] and the RT595
EVK[2]. More RT500 device models will be submitted in future patch sets.
The goal of this first patch set is to provide a minimal set that
allows running the NXP MCU SDK hello world example[4].
The patch set introduces a (python) tool that generates C header files
from ARM SVD files[3]. This significantly reduces the effort to write
a new device model by automatically generating: register definitions
and layout (including bit fields), register names for easier debugging
and tracing, reset register values, register write masks, etc.
The generated files are commited and not generated at compile
time. Build targets are created so that they can be easily regenerated
if needed.
It also introduces unit tests for device models. To allow accessing
registers from unit tests a system bus mock is created.
This can potentially introduce maintainance issues, due to mocks or
unit tests getting outdated when code is refactored. However, I think
this is not an issue in this case because the APIs we mocked (system
bus MMIO access) or directly used (irq APIs, chardev APIs, clock tree
APIs) to interact with device models are stable at this
point. Anecdotally, our experience seems to confirm this: we only run
into one (trivially fixed) breaking upstream change (gpio getting
removed from hwcore) in the last three years.
Changes since v1:
* setup scripts/git.orderfile
* svd_gen_header: add support for multi line comments
* svd_gen_header: use qemu register fields instead of bitfields
* svd_gen_header: generate register write mask array
* add mcux-soc-svd as a subproject instead of commiting the rt595 SVD
file directly
* svd generated headers: don't generate them at compile time, instead
commit the generated headers and create compile targets so that it is
easy to regenerate them
* remove pysvd dependency; developers who need to (re)generate svd
headers need to have it installed on the host machine
* use DEFINE_TYPES where possible
* use g_strdup_printf where possible
* reduce iterator variables scopes
* hard code rt500 to use the cortex-m33
* use static for local arrays initializers
* remove rt500 properties as they are not yet used
* drop private/public comments
* remove unused headers
* free rt500 mem regions in rt500_unrealize() instead of
rt500_finalize
* use memops access constraints where possible instead of
reg32_aligned_access
* flexspi: use 64bit properties for mmap_size property
* rstctl: use a generic abstract type and remove the "num" property
* flexspi: don't call get_system_memory() directly and remove
mmap_base property
[1] https://www.nxp.com/docs/en/data-sheet/IMXRT500EC.pdf
[2] https://www.nxp.com/webapp/Download?colCode=MIMXRT595EVKHUG
[3] https://arm-software.github.io/CMSIS_5/SVD/html/index.html
[4] Building and running the NXP MCU SDK hello world example
Clone the following git repos:
https://github.com/nxp-mcuxpresso/cmsis.git,
https://github.com/nxp-mcuxpresso/mcux-sdk.git
https://github.com/nxp-mcuxpresso/mcux-sdk-examples.git
in the following directories: CMSIS, core, examples.
cd examples/evkmimxrt595/demo_apps/hello_world/armgcc
ARMGCC_DIR=/usr CFLAGS=-I../../../../../CMSIS/CMSIS/Core/Include \
sh build_flash_debug.sh
qemu-system-arm --machine rt595-evk -kernel flash_debug/hello_world.elf \
-global armv7m.init-nsvtor=0x08001000 -global
armv7m.init-svtor=0x08001000 \
-chardev stdio,id=flexcomm0
Octavian Purdila (19):
fifo32: add peek function
tests/unit: add fifo test
Add mcux-soc-svd subproject
hw: add register access utility functions
hw/misc: add basic flexcomm device model
test/unit: add register access macros and functions
test/unit: add flexcomm unit test
hw/char: add support for flexcomm usart
test/unit: add flexcomm usart unit test
hw/i2c: add support for flexcomm i2c
test/unit: add i2c-tester
test/unit: add unit tests for flexcomm i2c
test/unit: add spi-tester
hw/misc: add support for RT500's clock controller
test/unit: add unit tests for RT500's clock controller
hw/ssi: add support for flexspi
hw/misc: add support for RT500's reset controller
hw/arm: add basic support for the RT500 SoC
hw/arm: add RT595-EVK board
Sebastian Ene (2):
hw/ssi: add support for flexcomm spi
test/unit: add unit tests for flexcomm spi
Stefan Stanacar (1):
scripts: add script to generate C header files from SVD XML files
Valentin Ghita (1):
tests/unit: add system bus mock
meson.build | 4 +
include/hw/arm/rt500.h | 44 +
include/hw/arm/svd/flexcomm.h | 109 +
include/hw/arm/svd/flexcomm_i2c.h | 1134 ++++++
include/hw/arm/svd/flexcomm_spi.h | 980 ++++++
include/hw/arm/svd/flexcomm_usart.h | 959 +++++
include/hw/arm/svd/flexspi.h | 2100 +++++++++++
include/hw/arm/svd/rt500.h | 65 +
include/hw/arm/svd/rt500_clkctl0.h | 2287 ++++++++++++
include/hw/arm/svd/rt500_clkctl1.h | 3109 +++++++++++++++++
include/hw/arm/svd/rt500_rstctl0.h | 832 +++++
include/hw/arm/svd/rt500_rstctl1.h | 1344 +++++++
include/hw/char/flexcomm_usart.h | 20 +
include/hw/i2c/flexcomm_i2c.h | 27 +
include/hw/misc/flexcomm.h | 85 +
include/hw/misc/rt500_clk_freqs.h | 18 +
include/hw/misc/rt500_clkctl0.h | 37 +
include/hw/misc/rt500_clkctl1.h | 36 +
include/hw/misc/rt500_rstctl.h | 32 +
include/hw/regs.h | 34 +
include/hw/ssi/flexcomm_spi.h | 20 +
include/hw/ssi/flexspi.h | 32 +
include/qemu/fifo32.h | 28 +
tests/unit/i2c_tester.h | 30 +
tests/unit/reg-utils.h | 97 +
tests/unit/spi_tester.h | 32 +
tests/unit/sysbus-mock.h | 82 +
hw/arm/rt500.c | 335 ++
hw/arm/rt595-evk.c | 64 +
hw/char/flexcomm_usart.c | 292 ++
hw/i2c/flexcomm_i2c.c | 207 ++
hw/misc/flexcomm.c | 304 ++
hw/misc/rt500_clkctl0.c | 226 ++
hw/misc/rt500_clkctl1.c | 207 ++
hw/misc/rt500_rstctl.c | 225 ++
hw/ssi/flexcomm_spi.c | 439 +++
hw/ssi/flexspi.c | 157 +
tests/unit/i2c_tester.c | 108 +
tests/unit/spi_tester.c | 57 +
tests/unit/sysbus-mock.c | 312 ++
tests/unit/test-fifo.c | 97 +
tests/unit/test-flexcomm-i2c.c | 210 ++
tests/unit/test-flexcomm-spi.c | 201 ++
tests/unit/test-flexcomm-usart.c | 320 ++
tests/unit/test-flexcomm.c | 212 ++
tests/unit/test-rt500-clkctl.c | 263 ++
hw/arm/Kconfig | 13 +
hw/arm/meson.build | 4 +
hw/arm/svd/meson.build | 35 +
hw/char/meson.build | 1 +
hw/char/trace-events | 9 +
hw/i2c/meson.build | 1 +
hw/i2c/trace-events | 10 +
hw/misc/Kconfig | 12 +
hw/misc/meson.build | 5 +
hw/misc/trace-events | 18 +
hw/ssi/Kconfig | 4 +
hw/ssi/meson.build | 2 +
hw/ssi/trace-events | 12 +
meson_options.txt | 3 +
scripts/meson-buildoptions.sh | 4 +
scripts/svd-gen-header.py | 343 ++
subprojects/.gitignore | 1 +
subprojects/mcux-soc-svd.wrap | 5 +
.../packagefiles/mcux-soc-svd/meson.build | 5 +
tests/unit/meson.build | 56 +-
66 files changed, 18355 insertions(+), 1 deletion(-)
create mode 100644 include/hw/arm/rt500.h
create mode 100644 include/hw/arm/svd/flexcomm.h
create mode 100644 include/hw/arm/svd/flexcomm_i2c.h
create mode 100644 include/hw/arm/svd/flexcomm_spi.h
create mode 100644 include/hw/arm/svd/flexcomm_usart.h
create mode 100644 include/hw/arm/svd/flexspi.h
create mode 100644 include/hw/arm/svd/rt500.h
create mode 100644 include/hw/arm/svd/rt500_clkctl0.h
create mode 100644 include/hw/arm/svd/rt500_clkctl1.h
create mode 100644 include/hw/arm/svd/rt500_rstctl0.h
create mode 100644 include/hw/arm/svd/rt500_rstctl1.h
create mode 100644 include/hw/char/flexcomm_usart.h
create mode 100644 include/hw/i2c/flexcomm_i2c.h
create mode 100644 include/hw/misc/flexcomm.h
create mode 100644 include/hw/misc/rt500_clk_freqs.h
create mode 100644 include/hw/misc/rt500_clkctl0.h
create mode 100644 include/hw/misc/rt500_clkctl1.h
create mode 100644 include/hw/misc/rt500_rstctl.h
create mode 100644 include/hw/regs.h
create mode 100644 include/hw/ssi/flexcomm_spi.h
create mode 100644 include/hw/ssi/flexspi.h
create mode 100644 tests/unit/i2c_tester.h
create mode 100644 tests/unit/reg-utils.h
create mode 100644 tests/unit/spi_tester.h
create mode 100644 tests/unit/sysbus-mock.h
create mode 100644 hw/arm/rt500.c
create mode 100644 hw/arm/rt595-evk.c
create mode 100644 hw/char/flexcomm_usart.c
create mode 100644 hw/i2c/flexcomm_i2c.c
create mode 100644 hw/misc/flexcomm.c
create mode 100644 hw/misc/rt500_clkctl0.c
create mode 100644 hw/misc/rt500_clkctl1.c
create mode 100644 hw/misc/rt500_rstctl.c
create mode 100644 hw/ssi/flexcomm_spi.c
create mode 100644 hw/ssi/flexspi.c
create mode 100644 tests/unit/i2c_tester.c
create mode 100644 tests/unit/spi_tester.c
create mode 100644 tests/unit/sysbus-mock.c
create mode 100644 tests/unit/test-fifo.c
create mode 100644 tests/unit/test-flexcomm-i2c.c
create mode 100644 tests/unit/test-flexcomm-spi.c
create mode 100644 tests/unit/test-flexcomm-usart.c
create mode 100644 tests/unit/test-flexcomm.c
create mode 100644 tests/unit/test-rt500-clkctl.c
create mode 100644 hw/arm/svd/meson.build
create mode 100755 scripts/svd-gen-header.py
create mode 100644 subprojects/mcux-soc-svd.wrap
create mode 100644 subprojects/packagefiles/mcux-soc-svd/meson.build
--
2.46.0.184.g6999bdac58-goog
- [RFC PATCH v2 00/23] NXP i.MX RT595, ARM SVD and device model unit tests,
Octavian Purdila <=
- [RFC PATCH v2 02/23] tests/unit: add fifo test, Octavian Purdila, 2024/08/17
- [RFC PATCH v2 01/23] fifo32: add peek function, Octavian Purdila, 2024/08/17
- [RFC PATCH v2 05/23] hw: add register access utility functions, Octavian Purdila, 2024/08/17
- [RFC PATCH v2 03/23] scripts: add script to generate C header files from SVD XML files, Octavian Purdila, 2024/08/17
- [RFC PATCH v2 10/23] hw/char: add support for flexcomm usart, Octavian Purdila, 2024/08/17
- [RFC PATCH v2 04/23] Add mcux-soc-svd subproject, Octavian Purdila, 2024/08/17
- [RFC PATCH v2 13/23] test/unit: add i2c-tester, Octavian Purdila, 2024/08/17
- [RFC PATCH v2 09/23] test/unit: add flexcomm unit test, Octavian Purdila, 2024/08/17
- [RFC PATCH v2 11/23] test/unit: add flexcomm usart unit test, Octavian Purdila, 2024/08/17
- [RFC PATCH v2 06/23] hw/misc: add basic flexcomm device model, Octavian Purdila, 2024/08/17