From 84fd7cece05ea61eb34b4f8da20fd39d0c000b4a Mon Sep 17 00:00:00 2001 From: Alex Lanzano Date: Mon, 2 Mar 2026 00:08:18 -0500 Subject: [PATCH] [examples, tests] Refactor examples and tests directory --- .github/workflows/ci.yml | 30 +-- examples/README.md | 35 +++ examples/blinky/Makefile | 37 +++ .../pic32cz_curiosity_ultra/Makefile.inc | 22 ++ .../boards/pic32cz_curiosity_ultra/board.c} | 127 +++++++++- .../boards/pic32cz_curiosity_ultra/board.h | 18 ++ .../boards/pic32cz_curiosity_ultra}/ivt.c | 0 .../pic32cz_curiosity_ultra/jlink/target.xml | 56 +++++ .../boards/pic32cz_curiosity_ultra}/linker.ld | 0 .../boards/stm32wb55xx_nucleo/Makefile.inc | 15 ++ .../blinky/boards/stm32wb55xx_nucleo/board.c | 209 ++++++++++++++++ .../blinky/boards/stm32wb55xx_nucleo/board.h | 18 ++ .../boards/stm32wb55xx_nucleo}/ivt.c | 2 +- .../boards/stm32wb55xx_nucleo}/linker.ld | 2 +- examples/blinky/main.c | 21 ++ examples/pic32cz/Makefile | 51 ---- examples/pic32cz/main.c | 110 --------- examples/pic32cz/pic32cz_curiosity_ultra.h | 14 -- examples/stm32wb/Makefile | 43 ---- examples/stm32wb/main.c | 126 ---------- examples/stm32wb/stm32wb55xx_nucleo.h | 43 ---- tests/Makefile | 44 ++++ tests/README.md | 60 +++++ .../pic32cz_curiosity_ultra/Makefile.inc | 23 ++ tests/boards/pic32cz_curiosity_ultra/board.c | 228 ++++++++++++++++++ tests/boards/pic32cz_curiosity_ultra/board.h | 24 ++ tests/boards/pic32cz_curiosity_ultra/ivt.c | 79 ++++++ .../pic32cz_curiosity_ultra/jlink/target.xml | 56 +++++ .../boards/pic32cz_curiosity_ultra/linker.ld | 55 +++++ tests/boards/stm32wb55xx_nucleo/Makefile.inc | 16 ++ .../boards/stm32wb55xx_nucleo/board.c | 200 ++++++++++----- tests/boards/stm32wb55xx_nucleo/board.h | 25 ++ tests/boards/stm32wb55xx_nucleo/ivt.c | 216 +++++++++++++++++ tests/boards/stm32wb55xx_nucleo/linker.ld | 173 +++++++++++++ tests/clock/test_clock.c | 17 ++ .../test_pic32cz_clock.c} | 42 ++-- .../test_stm32wb_clock.c} | 32 +-- tests/{sim => core}/Makefile | 8 +- tests/{sim/test_main.c => core/main.c} | 10 +- tests/{sim => core}/test_bitops.c | 38 +-- tests/{sim => core}/test_dispatch.c | 190 +++++++-------- tests/flash/test_flash.c | 61 +++++ tests/flash/test_stm32wb_flash.c | 27 +++ tests/gpio/test_gpio.c | 25 ++ .../test_gpio.c => gpio/test_pic32cz_gpio.c} | 31 +-- .../test_gpio.c => gpio/test_stm32wb_gpio.c} | 24 +- tests/main.c | 111 +++++++++ tests/pic32cz/Makefile | 52 ---- tests/pic32cz/test_flash.c | 57 ----- tests/pic32cz/test_main.c | 112 --------- tests/rng/test_rng.c | 49 ++++ tests/stm32wb/Makefile | 52 ---- tests/stm32wb/test_flash.c | 59 ----- tests/stm32wb/test_main.c | 107 -------- tests/stm32wb/test_rng.c | 68 ------ tests/stm32wb/test_timer.c | 32 --- tests/test.h | 38 +-- tests/{pic32cz => timer}/test_timer.c | 13 +- wolfHAL/wolfHAL.h | 2 + 59 files changed, 2207 insertions(+), 1228 deletions(-) create mode 100644 examples/README.md create mode 100644 examples/blinky/Makefile create mode 100644 examples/blinky/boards/pic32cz_curiosity_ultra/Makefile.inc rename examples/{pic32cz/pic32cz_curiosity_ultra.c => blinky/boards/pic32cz_curiosity_ultra/board.c} (57%) create mode 100644 examples/blinky/boards/pic32cz_curiosity_ultra/board.h rename examples/{pic32cz => blinky/boards/pic32cz_curiosity_ultra}/ivt.c (100%) create mode 100644 examples/blinky/boards/pic32cz_curiosity_ultra/jlink/target.xml rename examples/{pic32cz => blinky/boards/pic32cz_curiosity_ultra}/linker.ld (100%) create mode 100644 examples/blinky/boards/stm32wb55xx_nucleo/Makefile.inc create mode 100644 examples/blinky/boards/stm32wb55xx_nucleo/board.c create mode 100644 examples/blinky/boards/stm32wb55xx_nucleo/board.h rename examples/{stm32wb => blinky/boards/stm32wb55xx_nucleo}/ivt.c (99%) rename examples/{stm32wb => blinky/boards/stm32wb55xx_nucleo}/linker.ld (99%) create mode 100644 examples/blinky/main.c delete mode 100644 examples/pic32cz/Makefile delete mode 100644 examples/pic32cz/main.c delete mode 100644 examples/pic32cz/pic32cz_curiosity_ultra.h delete mode 100644 examples/stm32wb/Makefile delete mode 100644 examples/stm32wb/main.c delete mode 100644 examples/stm32wb/stm32wb55xx_nucleo.h create mode 100644 tests/Makefile create mode 100644 tests/README.md create mode 100644 tests/boards/pic32cz_curiosity_ultra/Makefile.inc create mode 100644 tests/boards/pic32cz_curiosity_ultra/board.c create mode 100644 tests/boards/pic32cz_curiosity_ultra/board.h create mode 100644 tests/boards/pic32cz_curiosity_ultra/ivt.c create mode 100644 tests/boards/pic32cz_curiosity_ultra/jlink/target.xml create mode 100644 tests/boards/pic32cz_curiosity_ultra/linker.ld create mode 100644 tests/boards/stm32wb55xx_nucleo/Makefile.inc rename examples/stm32wb/stm32wb55xx_nucleo.c => tests/boards/stm32wb55xx_nucleo/board.c (52%) create mode 100644 tests/boards/stm32wb55xx_nucleo/board.h create mode 100644 tests/boards/stm32wb55xx_nucleo/ivt.c create mode 100644 tests/boards/stm32wb55xx_nucleo/linker.ld create mode 100644 tests/clock/test_clock.c rename tests/{pic32cz/test_clock.c => clock/test_pic32cz_clock.c} (61%) rename tests/{stm32wb/test_clock.c => clock/test_stm32wb_clock.c} (51%) rename tests/{sim => core}/Makefile (79%) rename tests/{sim/test_main.c => core/main.c} (65%) rename tests/{sim => core}/test_bitops.c (58%) rename tests/{sim => core}/test_dispatch.c (60%) create mode 100644 tests/flash/test_flash.c create mode 100644 tests/flash/test_stm32wb_flash.c create mode 100644 tests/gpio/test_gpio.c rename tests/{pic32cz/test_gpio.c => gpio/test_pic32cz_gpio.c} (62%) rename tests/{stm32wb/test_gpio.c => gpio/test_stm32wb_gpio.c} (66%) create mode 100644 tests/main.c delete mode 100644 tests/pic32cz/Makefile delete mode 100644 tests/pic32cz/test_flash.c delete mode 100644 tests/pic32cz/test_main.c create mode 100644 tests/rng/test_rng.c delete mode 100644 tests/stm32wb/Makefile delete mode 100644 tests/stm32wb/test_flash.c delete mode 100644 tests/stm32wb/test_main.c delete mode 100644 tests/stm32wb/test_rng.c delete mode 100644 tests/stm32wb/test_timer.c rename tests/{pic32cz => timer}/test_timer.c (66%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8c8330a..4426f28 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,13 +7,13 @@ on: branches: [main] jobs: - sim-tests: + core-tests: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Build and run sim tests - working-directory: tests/sim + - name: Build and run core tests + working-directory: tests/core run: make run cross-compile: @@ -24,18 +24,18 @@ jobs: - name: Install ARM toolchain run: sudo apt-get update && sudo apt-get install -y gcc-arm-none-eabi - - name: Build STM32WB example - working-directory: examples/stm32wb - run: make + - name: Build blinky (STM32WB) + working-directory: examples/blinky + run: make BOARD=stm32wb55xx_nucleo - - name: Build STM32WB hardware tests - working-directory: tests/stm32wb - run: make + - name: Build blinky (PIC32CZ) + working-directory: examples/blinky + run: make BOARD=pic32cz_curiosity_ultra - - name: Build PIC32CZ example - working-directory: examples/pic32cz - run: make + - name: Build tests (STM32WB) + working-directory: tests + run: make BOARD=stm32wb55xx_nucleo - - name: Build PIC32CZ hardware tests - working-directory: tests/pic32cz - run: make + - name: Build tests (PIC32CZ) + working-directory: tests + run: make BOARD=pic32cz_curiosity_ultra diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 0000000..2502555 --- /dev/null +++ b/examples/README.md @@ -0,0 +1,35 @@ +# wolfHAL Examples + +## Building + +From an example directory: + +``` +cd blinky +make BOARD= +``` + +The output binary is placed in `build//`. + +## Example Structure + +Each example is self-contained with its own board support: + +``` +/ + main.c + Makefile + boards/ + / + board.c # Device instances and Board_Init + board.h # Externs and board constants + Makefile.inc + linker.ld + ... # Additional board-specific source files +``` + +## Adding a New Board + +1. Create `boards//` with `board.c`, `board.h`, `Makefile.inc`, `linker.ld`, and any additional board-specific source files. +2. Define the device instances and `Board_Init` needed by the example in `board.c`. +3. Build with `make BOARD=`. diff --git a/examples/blinky/Makefile b/examples/blinky/Makefile new file mode 100644 index 0000000..5e0762e --- /dev/null +++ b/examples/blinky/Makefile @@ -0,0 +1,37 @@ +WHAL_DIR = $(CURDIR)/../.. + +BOARD ?= stm32wb55xx_nucleo +BOARD_DIR = boards/$(BOARD) +BUILD_DIR = build/$(BOARD) + +INCLUDE = -I$(WHAL_DIR) -I$(BOARD_DIR) + +include $(BOARD_DIR)/Makefile.inc + +SOURCE = main.c +SOURCE += $(BOARD_SOURCE) + +OBJECTS = $(patsubst %.c,$(BUILD_DIR)/%.o,$(SOURCE)) +DEPENDS = $(OBJECTS:.o=.d) + +LINKER_SCRIPT = $(BOARD_DIR)/linker.ld + +all: $(BUILD_DIR)/$(notdir $(CURDIR)).bin + +$(BUILD_DIR)/%.o: %.c Makefile + @mkdir -p $(dir $@) + $(GCC) $(CFLAGS) -c -o $@ $< + +.SECONDARY: +$(BUILD_DIR)/%.elf: $(OBJECTS) $(LINKER_SCRIPT) + @mkdir -p $(dir $@) + $(LD) $(LDFLAGS) -T $(LINKER_SCRIPT) -o $@ $(OBJECTS) + +$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf + $(OBJCOPY) $^ -O binary $@ + +.PHONY: clean +clean: + rm -rf build + +-include $(DEPENDS) diff --git a/examples/blinky/boards/pic32cz_curiosity_ultra/Makefile.inc b/examples/blinky/boards/pic32cz_curiosity_ultra/Makefile.inc new file mode 100644 index 0000000..27bb27c --- /dev/null +++ b/examples/blinky/boards/pic32cz_curiosity_ultra/Makefile.inc @@ -0,0 +1,22 @@ +PLATFORM = pic32cz + +GCC = $(GCC_PATH)arm-none-eabi-gcc +LD = $(GCC_PATH)arm-none-eabi-ld +OBJCOPY = $(GCC_PATH)arm-none-eabi-objcopy + +CFLAGS += -Wall -Werror $(INCLUDE) -g3 \ + -ffreestanding -nostdlib -mcpu=cortex-m7 \ + -MMD -MP +LDFLAGS = --omagic -static + +BOARD_SOURCE = $(BOARD_DIR)/ivt.c +BOARD_SOURCE += $(BOARD_DIR)/board.c +BOARD_SOURCE += $(wildcard $(WHAL_DIR)/src/*.c) +BOARD_SOURCE += $(wildcard $(WHAL_DIR)/src/*/gpio.c) +BOARD_SOURCE += $(wildcard $(WHAL_DIR)/src/*/clock.c) +BOARD_SOURCE += $(wildcard $(WHAL_DIR)/src/*/uart.c) +BOARD_SOURCE += $(wildcard $(WHAL_DIR)/src/*/timer.c) +BOARD_SOURCE += $(wildcard $(WHAL_DIR)/src/*/supply.c) +BOARD_SOURCE += $(wildcard $(WHAL_DIR)/src/*/flash.c) +BOARD_SOURCE += $(wildcard $(WHAL_DIR)/src/*/pic32cz_*.c) +BOARD_SOURCE += $(wildcard $(WHAL_DIR)/src/*/systick.c) diff --git a/examples/pic32cz/pic32cz_curiosity_ultra.c b/examples/blinky/boards/pic32cz_curiosity_ultra/board.c similarity index 57% rename from examples/pic32cz/pic32cz_curiosity_ultra.c rename to examples/blinky/boards/pic32cz_curiosity_ultra/board.c index 91e9991..8cb9424 100644 --- a/examples/pic32cz/pic32cz_curiosity_ultra.c +++ b/examples/blinky/boards/pic32cz_curiosity_ultra/board.c @@ -1,10 +1,124 @@ -#include +#include +#include +#include "board.h" #include -whal_Supply g_whalSupply = { +/* Forward declarations for static device instances */ +static whal_Supply g_whalSupply; + +/* SysTick timing */ +volatile size_t g_tick = 0; +volatile uint8_t g_waiting = 0; +volatile uint8_t g_tickOverflow = 0; + +void SysTick_Handler() +{ + size_t tickBefore = g_tick++; + if (g_waiting) { + if (tickBefore > g_tick) + g_tickOverflow = 1; + } +} + +void Board_WaitMs(size_t ms) +{ + size_t startCount = g_tick; + g_waiting = 1; + while (1) { + size_t currentCount = g_tick; + if (g_tickOverflow) { + if ((SIZE_MAX - startCount) + currentCount > ms) { + break; + } + } else if (currentCount - startCount > ms) { + break; + } + } + + g_waiting = 0; + g_tickOverflow = 0; +} + +whal_Error Board_Init(void) +{ + whal_Error err; + + err = whal_Supply_Init(&g_whalSupply); + if (err) { + return err; + } + + err = whal_Clock_Init(&g_whalClock); + if (err) { + return err; + } + + err = whal_Gpio_Init(&g_whalGpio); + if (err) { + return err; + } + + err = whal_Uart_Init(&g_whalUart); + if (err) { + return err; + } + + err = whal_Timer_Init(&g_whalTimer); + if (err) { + return err; + } + + err = whal_Timer_Start(&g_whalTimer); + if (err) { + return err; + } + + return WHAL_SUCCESS; +} + +whal_Error Board_Deinit(void) +{ + whal_Error err; + + err = whal_Timer_Stop(&g_whalTimer); + if (err) { + return err; + } + + err = whal_Timer_Deinit(&g_whalTimer); + if (err) { + return err; + } + + err = whal_Uart_Deinit(&g_whalUart); + if (err) { + return err; + } + + err = whal_Gpio_Deinit(&g_whalGpio); + if (err) { + return err; + } + + err = whal_Clock_Deinit(&g_whalClock); + if (err) { + return err; + } + + err = whal_Supply_Deinit(&g_whalSupply); + if (err) { + return err; + } + + return WHAL_SUCCESS; +} + +/* Supply */ +static whal_Supply g_whalSupply = { WHAL_PIC32CZ_SUPPLY_DEVICE, }; +/* Clock */ whal_Clock g_whalClock = { WHAL_PIC32CZ_CLOCK_PLL_DEVICE, @@ -42,9 +156,10 @@ whal_Clock g_whalClock = { }, }; +/* GPIO */ whal_Gpio g_whalGpio = { WHAL_PIC32CZ_GPIO_DEVICE, - + .cfg = &(whal_Pic32czGpio_Cfg) { .pinCfgCount = 3, .pinCfg = (whal_Pic32czGpio_PinCfg[]) { @@ -70,6 +185,7 @@ whal_Gpio g_whalGpio = { }, }; +/* UART */ static whal_Pic32czClock_Clk uartClk = { .gclkPeriphChannel = 25, /* SERCOM 4 */ .gclkPeriphSrc = 0, /* GEN 0 */ @@ -90,6 +206,7 @@ whal_Uart g_whalUart = { }, }; +/* Timer */ whal_Timer g_whalTimer = { WHAL_CORTEX_M7_SYSTICK_DEVICE, @@ -99,7 +216,3 @@ whal_Timer g_whalTimer = { .tickInt = WHAL_SYSTICK_TICKINT_ENABLED, }, }; - -whal_Flash g_whalFlash = { - WHAL_PIC32CZ_FLASH_DEVICE, -}; diff --git a/examples/blinky/boards/pic32cz_curiosity_ultra/board.h b/examples/blinky/boards/pic32cz_curiosity_ultra/board.h new file mode 100644 index 0000000..45e2995 --- /dev/null +++ b/examples/blinky/boards/pic32cz_curiosity_ultra/board.h @@ -0,0 +1,18 @@ +#ifndef BOARD_H +#define BOARD_H + +#include +#include + +extern whal_Clock g_whalClock; +extern whal_Gpio g_whalGpio; +extern whal_Timer g_whalTimer; +extern whal_Uart g_whalUart; + +#define BOARD_LED_PIN 0 + +whal_Error Board_Init(void); +whal_Error Board_Deinit(void); +void Board_WaitMs(size_t ms); + +#endif /* BOARD_H */ diff --git a/examples/pic32cz/ivt.c b/examples/blinky/boards/pic32cz_curiosity_ultra/ivt.c similarity index 100% rename from examples/pic32cz/ivt.c rename to examples/blinky/boards/pic32cz_curiosity_ultra/ivt.c diff --git a/examples/blinky/boards/pic32cz_curiosity_ultra/jlink/target.xml b/examples/blinky/boards/pic32cz_curiosity_ultra/jlink/target.xml new file mode 100644 index 0000000..f5ecb8d --- /dev/null +++ b/examples/blinky/boards/pic32cz_curiosity_ultra/jlink/target.xml @@ -0,0 +1,56 @@ + + + arm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/pic32cz/linker.ld b/examples/blinky/boards/pic32cz_curiosity_ultra/linker.ld similarity index 100% rename from examples/pic32cz/linker.ld rename to examples/blinky/boards/pic32cz_curiosity_ultra/linker.ld diff --git a/examples/blinky/boards/stm32wb55xx_nucleo/Makefile.inc b/examples/blinky/boards/stm32wb55xx_nucleo/Makefile.inc new file mode 100644 index 0000000..c18eb31 --- /dev/null +++ b/examples/blinky/boards/stm32wb55xx_nucleo/Makefile.inc @@ -0,0 +1,15 @@ +PLATFORM = stm32wb + +GCC = $(GCC_PATH)arm-none-eabi-gcc +LD = $(GCC_PATH)arm-none-eabi-ld +OBJCOPY = $(GCC_PATH)arm-none-eabi-objcopy + +CFLAGS += -Wall -Werror $(INCLUDE) -g3 \ + -ffreestanding -nostdlib -mcpu=cortex-m4 \ + -MMD -MP +LDFLAGS = --omagic -static + +BOARD_SOURCE = $(BOARD_DIR)/ivt.c +BOARD_SOURCE += $(BOARD_DIR)/board.c +BOARD_SOURCE += $(wildcard $(WHAL_DIR)/src/*.c) +BOARD_SOURCE += $(wildcard $(WHAL_DIR)/src/*/*.c) diff --git a/examples/blinky/boards/stm32wb55xx_nucleo/board.c b/examples/blinky/boards/stm32wb55xx_nucleo/board.c new file mode 100644 index 0000000..966a382 --- /dev/null +++ b/examples/blinky/boards/stm32wb55xx_nucleo/board.c @@ -0,0 +1,209 @@ +#include +#include +#include "board.h" +#include + +/* SysTick timing */ +volatile size_t g_tick = 0; +volatile uint8_t g_waiting = 0; +volatile uint8_t g_tickOverflow = 0; + +void SysTick_Handler() +{ + size_t tickBefore = g_tick++; + if (g_waiting) { + if (tickBefore > g_tick) + g_tickOverflow = 1; + } +} + +void Board_WaitMs(size_t ms) +{ + size_t startCount = g_tick; + g_waiting = 1; + while (1) { + size_t currentCount = g_tick; + if (g_tickOverflow) { + if ((SIZE_MAX - startCount) + currentCount > ms) { + break; + } + } else if (currentCount - startCount > ms) { + break; + } + } + + g_waiting = 0; + g_tickOverflow = 0; +} + +whal_Error Board_Init(void) +{ + whal_Error err; + + err = whal_Clock_Init(&g_whalClock); + if (err) { + return err; + } + + err = whal_Gpio_Init(&g_whalGpio); + if (err) { + return err; + } + + err = whal_Uart_Init(&g_whalUart); + if (err) { + return err; + } + + err = whal_Timer_Init(&g_whalTimer); + if (err) { + return err; + } + + err = whal_Timer_Start(&g_whalTimer); + if (err) { + return err; + } + + return WHAL_SUCCESS; +} + +whal_Error Board_Deinit(void) +{ + whal_Error err; + + err = whal_Timer_Stop(&g_whalTimer); + if (err) { + return err; + } + + err = whal_Timer_Deinit(&g_whalTimer); + if (err) { + return err; + } + + err = whal_Uart_Deinit(&g_whalUart); + if (err) { + return err; + } + + err = whal_Gpio_Deinit(&g_whalGpio); + if (err) { + return err; + } + + err = whal_Clock_Deinit(&g_whalClock); + if (err) { + return err; + } + + return WHAL_SUCCESS; +} + +/* Flash (needed by clock for wait state configuration) */ +static whal_Flash flash = { + WHAL_STM32WB55_FLASH_DEVICE, + + .cfg = &(whal_Stm32wbFlash_Cfg) { + .clkCtrl = &g_whalClock, + .clk = &(whal_Stm32wbRcc_Clk) {WHAL_STM32WB55_FLASH_CLOCK}, + + .startAddr = 0x08000000, + .size = 0x100000, + }, +}; + +/* Clock */ +whal_Clock g_whalClock = { + WHAL_STM32WB55_RCC_PLL_DEVICE, + + .cfg = &(whal_Stm32wbRcc_Cfg) { + .flash = &flash, + .flashLatency = WHAL_STM32WB_FLASH_LATENCY_3, + + .sysClkSrc = WHAL_STM32WB_RCC_SYSCLK_SRC_PLL, + .sysClkCfg = &(whal_Stm32wbRcc_PllClkCfg) + { + .clkSrc = WHAL_STM32WB_RCC_PLLCLK_SRC_MSI, + /* 64 MHz */ + .n = 32, + .m = 0, + .r = 1, + .q = 0, + .p = 0, + }, + }, +}; + +/* GPIO */ +enum { + LED_PIN, + UART_TX_PIN, + UART_RX_PIN, +}; + +whal_Gpio g_whalGpio = { + WHAL_STM32WB55_GPIO_DEVICE, + + .cfg = &(whal_Stm32wbGpio_Cfg) { + .clkCtrl = &g_whalClock, + .clk = (const void *[1]) { + &(whal_Stm32wbRcc_Clk){WHAL_STM32WB55_GPIOB_CLOCK}, + }, + .clkCount = 1, + + .pinCfg = (whal_Stm32wbGpio_PinCfg[3]) { + [LED_PIN] = { /* LED */ + .port = WHAL_STM32WB_GPIO_PORT_B, + .pin = 5, + .mode = WHAL_STM32WB_GPIO_MODE_OUT, + .outType = WHAL_STM32WB_GPIO_OUTTYPE_PUSHPULL, + .speed = WHAL_STM32WB_GPIO_SPEED_LOW, + .pull = WHAL_STM32WB_GPIO_PULL_UP, + .altFn = 0, + }, + [UART_TX_PIN] = { /* UART1 TX */ + .port = WHAL_STM32WB_GPIO_PORT_B, + .pin = 6, + .mode = WHAL_STM32WB_GPIO_MODE_ALTFN, + .outType = WHAL_STM32WB_GPIO_OUTTYPE_PUSHPULL, + .speed = WHAL_STM32WB_GPIO_SPEED_FAST, + .pull = WHAL_STM32WB_GPIO_PULL_UP, + .altFn = 7, + }, + [UART_RX_PIN] = { /* UART1 RX */ + .port = WHAL_STM32WB_GPIO_PORT_B, + .pin = 7, + .mode = WHAL_STM32WB_GPIO_MODE_ALTFN, + .outType = WHAL_STM32WB_GPIO_OUTTYPE_PUSHPULL, + .speed = WHAL_STM32WB_GPIO_SPEED_FAST, + .pull = WHAL_STM32WB_GPIO_PULL_UP, + .altFn = 7, + }, + }, + .pinCount = 3, + }, +}; + +/* Timer */ +whal_Timer g_whalTimer = { + WHAL_CORTEX_M4_SYSTICK_DEVICE, + + .cfg = &(whal_SysTick_Cfg) { + .cyclesPerTick = 64000000 / 1000, + .clkSrc = WHAL_SYSTICK_CLKSRC_SYSCLK, + .tickInt = WHAL_SYSTICK_TICKINT_ENABLED, + }, +}; + +/* UART */ +whal_Uart g_whalUart = { + WHAL_STM32WB55_UART1_DEVICE, + + .cfg = &(whal_Stm32wbUart_Cfg) { + .clkCtrl = &g_whalClock, + .clk = &(whal_Stm32wbRcc_Clk) {WHAL_STM32WB55_UART1_CLOCK}, + + .baud = 115200, + }, +}; diff --git a/examples/blinky/boards/stm32wb55xx_nucleo/board.h b/examples/blinky/boards/stm32wb55xx_nucleo/board.h new file mode 100644 index 0000000..45e2995 --- /dev/null +++ b/examples/blinky/boards/stm32wb55xx_nucleo/board.h @@ -0,0 +1,18 @@ +#ifndef BOARD_H +#define BOARD_H + +#include +#include + +extern whal_Clock g_whalClock; +extern whal_Gpio g_whalGpio; +extern whal_Timer g_whalTimer; +extern whal_Uart g_whalUart; + +#define BOARD_LED_PIN 0 + +whal_Error Board_Init(void); +whal_Error Board_Deinit(void); +void Board_WaitMs(size_t ms); + +#endif /* BOARD_H */ diff --git a/examples/stm32wb/ivt.c b/examples/blinky/boards/stm32wb55xx_nucleo/ivt.c similarity index 99% rename from examples/stm32wb/ivt.c rename to examples/blinky/boards/stm32wb55xx_nucleo/ivt.c index f713e1a..a8b8d89 100644 --- a/examples/stm32wb/ivt.c +++ b/examples/blinky/boards/stm32wb55xx_nucleo/ivt.c @@ -210,7 +210,7 @@ void __attribute__((naked)) Reset_Handler() // Set Interrupt Vector Table Offset uint32_t *vtor = (uint32_t *)0xE000ED08; - *vtor = (uint32_t)interrupt_vector_table; + *vtor = (uint32_t)interrupt_vector_table; main(); } diff --git a/examples/stm32wb/linker.ld b/examples/blinky/boards/stm32wb55xx_nucleo/linker.ld similarity index 99% rename from examples/stm32wb/linker.ld rename to examples/blinky/boards/stm32wb55xx_nucleo/linker.ld index c9c3d35..b98b596 100644 --- a/examples/stm32wb/linker.ld +++ b/examples/blinky/boards/stm32wb55xx_nucleo/linker.ld @@ -144,7 +144,7 @@ SECTIONS . = ALIGN(4); .bss : { - /* This is used by the startup in order to initialize the .bss secion */ + /* This is used by the startup in order to initialize the .bss section */ _sbss = .; /* define a global symbol at bss start */ __bss_start__ = _sbss; *(.bss) diff --git a/examples/blinky/main.c b/examples/blinky/main.c new file mode 100644 index 0000000..7abc8a2 --- /dev/null +++ b/examples/blinky/main.c @@ -0,0 +1,21 @@ +#include +#include +#include "board.h" + +void main(void) +{ + if (Board_Init() != WHAL_SUCCESS) + goto loop; + + while (1) { + whal_Gpio_Set(&g_whalGpio, BOARD_LED_PIN, 1); + whal_Uart_Send(&g_whalUart, (const uint8_t *)"Blink!\r\n", 8); + Board_WaitMs(1000); + whal_Gpio_Set(&g_whalGpio, BOARD_LED_PIN, 0); + whal_Uart_Send(&g_whalUart, (const uint8_t *)"Blink!\r\n", 8); + Board_WaitMs(1000); + } + +loop: + while (1); +} diff --git a/examples/pic32cz/Makefile b/examples/pic32cz/Makefile deleted file mode 100644 index bf7f55c..0000000 --- a/examples/pic32cz/Makefile +++ /dev/null @@ -1,51 +0,0 @@ -WHAL_DIR = $(PWD)/../../ -INCLUDE = -I$(WHAL_DIR) -CFLAGS = -Wall -Werror $(INCLUDE) -g3 \ - -ffreestanding -nostdlib -mcpu=cortex-m7 \ - -MMD -MF $(DEPDIR)/$*.d -LDFLAGS = --omagic -static - -DEPDIR = .deps/ - -SOURCE ?= $(wildcard *.c) -SOURCE += $(wildcard $(WHAL_DIR)/src/*.c) - -SOURCE += $(wildcard $(WHAL_DIR)/src/*/gpio.c) -SOURCE += $(wildcard $(WHAL_DIR)/src/*/clock.c) -SOURCE += $(wildcard $(WHAL_DIR)/src/*/uart.c) -SOURCE += $(wildcard $(WHAL_DIR)/src/*/timer.c) -SOURCE += $(wildcard $(WHAL_DIR)/src/*/supply.c) -SOURCE += $(wildcard $(WHAL_DIR)/src/*/flash.c) -SOURCE += $(wildcard $(WHAL_DIR)/src/*/pic32cz_*.c) -SOURCE += $(wildcard $(WHAL_DIR)/src/*/systick.c) - -OBJECTS = $(patsubst %.c,%.o,$(SOURCE)) - -DEPENDS = $(patsubst %.c,$(DEPDIR)/%.d,$(SOURCE)) - -GCC = $(GCC_PATH)arm-none-eabi-gcc -LD = $(GCC_PATH)arm-none-eabi-ld -OBJCOPY = $(GCC_PATH)arm-none-eabi-objcopy - -LINKER_SCRIPT = linker.ld - -all: boot.bin - -%.d: - @mkdir -p $(@D) - -%.o: %.c Makefile - $(GCC) $(CFLAGS) -c -o $@ $< - -.SECONDARY: -%.elf: $(OBJECTS) $(LINKER_SCRIPT) - $(LD) $(LDFLAGS) -T $(LINKER_SCRIPT) -o $@ $(OBJECTS) - -%.bin: %.elf - $(OBJCOPY) $^ -O binary $@ - -.PHONY: clean -clean: - rm -rf $(DEPDIR) $(OBJECTS) boot.bin boot.elf - --include $(DEPENDS) diff --git a/examples/pic32cz/main.c b/examples/pic32cz/main.c deleted file mode 100644 index b00f2f3..0000000 --- a/examples/pic32cz/main.c +++ /dev/null @@ -1,110 +0,0 @@ -#include -#include "pic32cz_curiosity_ultra.h" - -volatile size_t g_tick = 0; -volatile uint8_t g_waiting = 0; -volatile uint8_t g_tickOverflow = 0; - -void SysTick_Handler() -{ - size_t tickBefore = g_tick++; - if (g_waiting) { - if (tickBefore > g_tick) - g_tickOverflow = 1; - } -} - -void WaitMs(size_t ms) -{ - size_t startCount = g_tick; - g_waiting = 1; - while (1) { - size_t currentCount = g_tick; - if (g_tickOverflow) { - if ((SIZE_MAX - startCount) + currentCount > ms) { - break; - } - } else if (currentCount - startCount > ms) { - break; - } - } - - g_waiting = 0; - g_tickOverflow = 0; -} - -void main(void) -{ - whal_Error err; - uint8_t data[] = "Hello world!\r\n"; - uint8_t test[] = "test1\r\n"; - uint8_t tmp[sizeof(test)] = {0}; - - err = whal_Clock_Init(&g_whalClock); - if (err) { - goto loop; - } - - err = whal_Gpio_Init(&g_whalGpio); - if (err) { - goto loop; - } - - err = whal_Uart_Init(&g_whalUart); - if (err) { - goto loop; - } - - err = whal_Uart_Send(&g_whalUart, data, sizeof(data)); - if (err) { - goto loop; - } - - err = whal_Flash_Init(&g_whalFlash); - if (err) { - goto loop; - } - - err = whal_Flash_Erase(&g_whalFlash, 0x0C000000, 0x1000); - if (err) { - goto loop; - } - - do { - err = whal_Flash_Write(&g_whalFlash, 0x0C000000, test, sizeof(test)); - } while (err == WHAL_ENOTREADY); - - if (err) { - goto loop; - } - - err = whal_Flash_Read(&g_whalFlash, 0x0C000000, tmp, sizeof(tmp)); - if (err) { - goto loop; - } - - err = whal_Uart_Send(&g_whalUart, tmp, sizeof(tmp)); - if (err) { - goto loop; - } - - err = whal_Timer_Init(&g_whalTimer); - if (err) { - goto loop; - } - - whal_Timer_Start(&g_whalTimer); - - while (1) { - whal_Gpio_Set(&g_whalGpio, 0, 1); - - WaitMs(1000); - - whal_Gpio_Set(&g_whalGpio, 0, 0); - - WaitMs(1000); - } - -loop: - while (1); -} diff --git a/examples/pic32cz/pic32cz_curiosity_ultra.h b/examples/pic32cz/pic32cz_curiosity_ultra.h deleted file mode 100644 index da89c28..0000000 --- a/examples/pic32cz/pic32cz_curiosity_ultra.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef WHAL_PIC32CZ_CURIOSITY_ULTRA -#define WHAL_PIC32CZ_CURIOSITY_ULTRA - -#include -#include - -extern whal_Supply g_whalSupply; -extern whal_Clock g_whalClock; -extern whal_Gpio g_whalGpio; -extern whal_Timer g_whalTimer; -extern whal_Uart g_whalUart; -extern whal_Flash g_whalFlash; - -#endif /* WHAL_PIC32CZ_CURIOSITY_ULTRA */ diff --git a/examples/stm32wb/Makefile b/examples/stm32wb/Makefile deleted file mode 100644 index 0968f8d..0000000 --- a/examples/stm32wb/Makefile +++ /dev/null @@ -1,43 +0,0 @@ -WHAL_DIR = $(PWD)/../../ -INCLUDE = -I$(WHAL_DIR) -CFLAGS = -Wall -Werror $(INCLUDE) -g3 \ - -ffreestanding -nostdlib -mcpu=cortex-m4 \ - -MMD -MF $(DEPDIR)/$*.d -LDFLAGS = --omagic -static - -DEPDIR = .deps/ - -SOURCE ?= $(wildcard *.c) -SOURCE += $(wildcard $(WHAL_DIR)/src/*.c) -SOURCE += $(wildcard $(WHAL_DIR)/src/*/*.c) - -OBJECTS = $(patsubst %.c,%.o,$(SOURCE)) - -DEPENDS = $(patsubst %.c,$(DEPDIR)/%.d,$(SOURCE)) - -GCC = $(GCC_PATH)arm-none-eabi-gcc -LD = $(GCC_PATH)arm-none-eabi-ld -OBJCOPY = $(GCC_PATH)arm-none-eabi-objcopy - -LINKER_SCRIPT = linker.ld - -all: boot.bin - -%.d: - @mkdir -p $(@D) - -%.o: %.c Makefile - $(GCC) $(CFLAGS) -c -o $@ $< - -.SECONDARY: -%.elf: $(OBJECTS) $(LINKER_SCRIPT) - $(LD) $(LDFLAGS) -T $(LINKER_SCRIPT) -o $@ $(OBJECTS) - -%.bin: %.elf - $(OBJCOPY) $^ -O binary $@ - -.PHONY: clean -clean: - rm -rf $(DEPDIR) $(OBJECTS) boot.bin boot.elf - --include $(DEPENDS) diff --git a/examples/stm32wb/main.c b/examples/stm32wb/main.c deleted file mode 100644 index ded5a55..0000000 --- a/examples/stm32wb/main.c +++ /dev/null @@ -1,126 +0,0 @@ -#include -#include -#include -#include "stm32wb55xx_nucleo.h" - -volatile size_t g_tick = 0; -volatile uint8_t g_waiting = 0; -volatile uint8_t g_tickOverflow = 0; - -void SysTick_Handler() -{ - size_t tickBefore = g_tick++; - if (g_waiting) { - if (tickBefore > g_tick) - g_tickOverflow = 1; - } -} - -void WaitMs(size_t ms) -{ - size_t startCount = g_tick; - g_waiting = 1; - while (1) { - size_t currentCount = g_tick; - if (g_tickOverflow) { - if ((SIZE_MAX - startCount) + currentCount > ms) { - break; - } - } else if (currentCount - startCount > ms) { - break; - } - } - - g_waiting = 0; - g_tickOverflow = 0; -} - -void main(void) -{ - whal_Error err; - - err = whal_Clock_Init(&g_whalClock); - if (err) { - goto loop; - } - - err = whal_Gpio_Init(&g_whalGpio); - if (err) { - goto loop; - } - err = whal_Gpio_Set(&g_whalGpio, LED_PIN, 1); - if (err) { - goto loop; - } - - err = whal_Uart_Init(&g_whalUart); - if (err) { - goto loop; - } - - err = whal_Flash_Init(&g_whalFlash); - if (err) { - goto loop; - } - - err = whal_Timer_Init(&g_whalTimer); - if (err) { - goto loop; - } - - err = whal_Timer_Start(&g_whalTimer); - if (err) { - goto loop; - } - - whal_Flash_Unlock(&g_whalFlash, 0, 0); - - uint8_t data[] = "TESTING TESTING HELLO\r\n"; - uint8_t tmp[sizeof(data)] = {0}; - whal_Flash_Erase(&g_whalFlash, 0x08080000, 0x1000); - - do { - err = whal_Flash_Write(&g_whalFlash, 0x08080000, data, sizeof(data)); - } while (err == WHAL_ENOTREADY); - - whal_Flash_Read(&g_whalFlash, 0x08080000, tmp, sizeof(tmp)); - - whal_Flash_Lock(&g_whalFlash, 0, 0); - - whal_Uart_Send(&g_whalUart, tmp, sizeof(tmp)); - - while (1) { - uint8_t input[8]; - err = whal_Uart_Send(&g_whalUart, (uint8_t *)"Enter Stuff:\r\n", 14); - if (err) { - goto loop; - } - - err = whal_Uart_Recv(&g_whalUart, input, sizeof(input)); - if (err) { - goto loop; - } - - err = whal_Uart_Send(&g_whalUart, input, sizeof(input)); - if (err) { - goto loop; - } - err = whal_Gpio_Set(&g_whalGpio, LED_PIN, 1); - if (err) { - goto loop; - } - - WaitMs(1000); - - err = whal_Gpio_Set(&g_whalGpio, LED_PIN, 0); - if (err) { - goto loop; - } - - WaitMs(1000); - } - -loop: - while (1); - -} diff --git a/examples/stm32wb/stm32wb55xx_nucleo.h b/examples/stm32wb/stm32wb55xx_nucleo.h deleted file mode 100644 index 34c393b..0000000 --- a/examples/stm32wb/stm32wb55xx_nucleo.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef STM32WB55XX_NUCLEO_H -#define STM32WB55XX_NUCLEO_H - -#include - -/* - * @file stm32wb55xx_nucleo.h - * @brief Board-specific handles for the STM32WB55xx Nucleo example. - */ - -/* Friendly pin index mapping for the example board. */ -enum { - LED_PIN, - LPUART1_TX_PIN, - LPUART1_RX_PIN, - SPI1_SCK_PIN, - SPI1_MISO_PIN, - SPI1_MOSI_PIN, - CS_PIN, -}; - -/* RCC clock controller instance. */ -extern whal_Clock g_whalClock; - -/* GPIO controller instance. */ -extern whal_Gpio g_whalGpio; - -/* SysTick timer instance. */ -extern whal_Timer g_whalTimer; - -/* LPUART1 UART instance. */ -extern whal_Uart g_whalUart; - -/* Flash controller instance. */ -extern whal_Flash g_whalFlash; - -/* SPI controller instance. */ -extern whal_Spi g_whalSpi; - -/* RNG instance. */ -extern whal_Rng g_whalRng; - -#endif /* STM32WB55XX_NUCLEO_H */ diff --git a/tests/Makefile b/tests/Makefile new file mode 100644 index 0000000..7cf41d0 --- /dev/null +++ b/tests/Makefile @@ -0,0 +1,44 @@ +WHAL_DIR = $(CURDIR)/.. + +BOARD ?= stm32wb55xx_nucleo +BOARD_DIR = boards/$(BOARD) +BUILD_DIR = build/$(BOARD) +INCLUDE = -I$(WHAL_DIR) -I$(BOARD_DIR) -I. + +include $(BOARD_DIR)/Makefile.inc + +TESTS ?= clock gpio flash timer + +uc = $(shell echo $(1) | tr a-z A-Z) +CFLAGS += $(foreach t,$(TESTS),-DWHAL_TEST_ENABLE_$(call uc,$(t))) +CFLAGS += $(foreach t,$(TESTS),$(if $(wildcard $(t)/test_$(PLATFORM)_$(t).c),-DWHAL_TEST_ENABLE_$(call uc,$(t))_PLATFORM)) + +SOURCE = main.c +SOURCE += $(BOARD_SOURCE) +SOURCE += $(foreach t,$(TESTS),$(t)/test_$(t).c) +SOURCE += $(foreach t,$(TESTS),$(wildcard $(t)/test_$(PLATFORM)_$(t).c)) + +OBJECTS = $(patsubst %.c,$(BUILD_DIR)/%.o,$(SOURCE)) +DEPENDS = $(OBJECTS:.o=.d) + +LINKER_SCRIPT = $(BOARD_DIR)/linker.ld + +all: $(BUILD_DIR)/test_hw.bin + +$(BUILD_DIR)/%.o: %.c Makefile + @mkdir -p $(dir $@) + $(GCC) $(CFLAGS) -c -o $@ $< + +.SECONDARY: +$(BUILD_DIR)/%.elf: $(OBJECTS) $(LINKER_SCRIPT) + @mkdir -p $(dir $@) + $(LD) $(LDFLAGS) -T $(LINKER_SCRIPT) -o $@ $(OBJECTS) + +$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf + $(OBJCOPY) $^ -O binary $@ + +.PHONY: clean +clean: + rm -rf build + +-include $(DEPENDS) diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 0000000..209f9ce --- /dev/null +++ b/tests/README.md @@ -0,0 +1,60 @@ +# wolfHAL Hardware Test Suite + +## Building + +``` +make BOARD= +``` + +Each board defines its supported tests in `boards//Makefile.inc`. + +## Selecting Tests + +Override the `TESTS` variable to build a subset of tests: + +``` +make BOARD=stm32wb55xx_nucleo TESTS=gpio +make BOARD=stm32wb55xx_nucleo TESTS="gpio clock" +``` + +## Test Structure + +Tests are organized by device type: + +``` +tests/ + main.c # Test runner entry point + test.h # Test macros (WHAL_ASSERT_EQ, WHAL_TEST, etc.) + Makefile + boards/ + / + board.c # Device instances and Board_Init + board.h # Externs and board constants + Makefile.inc + ivt.c + linker.ld + gpio/ + test_gpio.c # Generic API tests + test_stm32wb_gpio.c # STM32WB platform-specific tests + test_pic32cz_gpio.c # PIC32CZ platform-specific tests + ... +``` + +Each device directory contains: + +- `test_.c` -- Generic tests that exercise the wolfHAL API. +- `test__.c` -- Platform-specific tests. These are automatically detected and compiled when building for the matching board. + +## Adding a New Board + +1. Create `boards//` with `board.c`, `board.h`, `Makefile.inc`, `linker.ld`, and any additional board-specific source files. +2. Set `PLATFORM` and `TESTS` in `Makefile.inc`. +3. Optionally add platform-specific test files as `/test__.c`. + +## Core Tests + +Host-side unit tests (bitops, dispatch) live in `core/` and build with the native compiler: + +``` +cd core && make && make run +``` diff --git a/tests/boards/pic32cz_curiosity_ultra/Makefile.inc b/tests/boards/pic32cz_curiosity_ultra/Makefile.inc new file mode 100644 index 0000000..f8a7760 --- /dev/null +++ b/tests/boards/pic32cz_curiosity_ultra/Makefile.inc @@ -0,0 +1,23 @@ +PLATFORM = pic32cz +TESTS = clock gpio flash timer + +GCC = $(GCC_PATH)arm-none-eabi-gcc +LD = $(GCC_PATH)arm-none-eabi-ld +OBJCOPY = $(GCC_PATH)arm-none-eabi-objcopy + +CFLAGS += -Wall -Werror $(INCLUDE) -g3 \ + -ffreestanding -nostdlib -mcpu=cortex-m7 \ + -DPLATFORM_PIC32CZ -MMD -MP +LDFLAGS = --omagic -static + +BOARD_SOURCE = $(BOARD_DIR)/ivt.c +BOARD_SOURCE += $(BOARD_DIR)/board.c +BOARD_SOURCE += $(wildcard $(WHAL_DIR)/src/*.c) +BOARD_SOURCE += $(wildcard $(WHAL_DIR)/src/*/gpio.c) +BOARD_SOURCE += $(wildcard $(WHAL_DIR)/src/*/clock.c) +BOARD_SOURCE += $(wildcard $(WHAL_DIR)/src/*/uart.c) +BOARD_SOURCE += $(wildcard $(WHAL_DIR)/src/*/timer.c) +BOARD_SOURCE += $(wildcard $(WHAL_DIR)/src/*/supply.c) +BOARD_SOURCE += $(wildcard $(WHAL_DIR)/src/*/flash.c) +BOARD_SOURCE += $(wildcard $(WHAL_DIR)/src/*/pic32cz_*.c) +BOARD_SOURCE += $(wildcard $(WHAL_DIR)/src/*/systick.c) diff --git a/tests/boards/pic32cz_curiosity_ultra/board.c b/tests/boards/pic32cz_curiosity_ultra/board.c new file mode 100644 index 0000000..7718e5c --- /dev/null +++ b/tests/boards/pic32cz_curiosity_ultra/board.c @@ -0,0 +1,228 @@ +#include +#include +#include "board.h" +#include + +/* Forward declarations for static device instances */ +static whal_Supply g_whalSupply; + +/* SysTick timing */ +volatile size_t g_tick = 0; +volatile uint8_t g_waiting = 0; +volatile uint8_t g_tickOverflow = 0; + +void SysTick_Handler() +{ + size_t tickBefore = g_tick++; + if (g_waiting) { + if (tickBefore > g_tick) + g_tickOverflow = 1; + } +} + +void Board_WaitMs(size_t ms) +{ + size_t startCount = g_tick; + g_waiting = 1; + while (1) { + size_t currentCount = g_tick; + if (g_tickOverflow) { + if ((SIZE_MAX - startCount) + currentCount > ms) { + break; + } + } else if (currentCount - startCount > ms) { + break; + } + } + + g_waiting = 0; + g_tickOverflow = 0; +} + +whal_Error Board_Init(void) +{ + whal_Error err; + + err = whal_Supply_Init(&g_whalSupply); + if (err) { + return err; + } + + err = whal_Clock_Init(&g_whalClock); + if (err) { + return err; + } + + err = whal_Gpio_Init(&g_whalGpio); + if (err) { + return err; + } + + err = whal_Uart_Init(&g_whalUart); + if (err) { + return err; + } + + err = whal_Flash_Init(&g_whalFlash); + if (err) { + return err; + } + + err = whal_Timer_Init(&g_whalTimer); + if (err) { + return err; + } + + err = whal_Timer_Start(&g_whalTimer); + if (err) { + return err; + } + + return WHAL_SUCCESS; +} + +whal_Error Board_Deinit(void) +{ + whal_Error err; + + err = whal_Timer_Stop(&g_whalTimer); + if (err) { + return err; + } + + err = whal_Timer_Deinit(&g_whalTimer); + if (err) { + return err; + } + + err = whal_Uart_Deinit(&g_whalUart); + if (err) { + return err; + } + + err = whal_Gpio_Deinit(&g_whalGpio); + if (err) { + return err; + } + + err = whal_Clock_Deinit(&g_whalClock); + if (err) { + return err; + } + + err = whal_Supply_Deinit(&g_whalSupply); + if (err) { + return err; + } + + return WHAL_SUCCESS; +} + +/* Supply */ +static whal_Supply g_whalSupply = { + WHAL_PIC32CZ_SUPPLY_DEVICE, +}; + +/* Clock */ +whal_Clock g_whalClock = { + WHAL_PIC32CZ_CLOCK_PLL_DEVICE, + + .cfg = &(whal_Pic32czClock_Cfg) { + /* 300MHz clock */ + .oscCtrlCfg = &(whal_Pic32czClockPll_OscCtrlCfg) { + .supplyCtrl = &g_whalSupply, + .supply = &(whal_Pic32czSupc_Supply){WHAL_PIC32CZ_SUPPLY_PLL}, + + .pllInst = WHAL_PIC32CZ_PLL0, + .refSel = WHAL_PIC32CZ_REFSEL_DFLL48M, + .bwSel = WHAL_PIC32CZ_BWSEL_10MHz_TO_20MHz, + + .fbDiv = 225, + .refDiv = 12, + + .outCfgCount = 1, + .outCfg = &(whal_Pic32czClockPll_OutCfg) { + .postDivMask = WHAL_PIC32CZ_POSTDIV0_Msk, + .postDivPos = WHAL_PIC32CZ_POSTDIV0_Pos, + .outEnMask = WHAL_PIC32CZ_OUTEN0_Msk, + .outEnPos = WHAL_PIC32CZ_OUTEN0_Pos, + .postDiv = 3, + }, + }, + .mclkCfg = &(whal_Pic32czClock_MclkCfg) { + .div = 2, + }, + .gclkCfgCount = 1, + .gclkCfg = &(whal_Pic32czClock_GclkCfg) { + .gen = 0, + .genSrc = WHAL_PIC32CZ_GENSRC_PLL0_CLOCKOUT0, + .genDiv = 1, + }, + }, +}; + +/* GPIO */ +whal_Gpio g_whalGpio = { + WHAL_PIC32CZ_GPIO_DEVICE, + + .cfg = &(whal_Pic32czGpio_Cfg) { + .pinCfgCount = 3, + .pinCfg = (whal_Pic32czGpio_PinCfg[]) { + { /* LED */ + .port = 1, + .pin = 21, + .dir = WHAL_PIC32CZ_DIR_OUTPUT, + .out = 0, + }, + { /* UART TX */ + .port = 2, + .pin = 21, + .pmuxEn = 1, + .pmux = WHAL_PIC32CZ_PMUX_SERCOM_ALT, + }, + { /* UART RX */ + .port = 2, + .pin = 22, + .pmuxEn = 1, + .pmux = WHAL_PIC32CZ_PMUX_SERCOM_ALT, + }, + }, + }, +}; + +/* UART */ +static whal_Pic32czClock_Clk uartClk = { + .gclkPeriphChannel = 25, /* SERCOM 4 */ + .gclkPeriphSrc = 0, /* GEN 0 */ + .mclkEnableInst = 1, /* Peripheral BUS Clock Enable Mask1 Register */ + .mclkEnableMask = (1UL << 3), /* SERCOM 4 enable mask */ + .mclkEnablePos = 3, +}; + +whal_Uart g_whalUart = { + WHAL_PIC32CZ_SERCOM4_UART_DEVICE, + + .cfg = &(whal_Pic32czUart_Cfg) { + .clkCtrl = &g_whalClock, + .clk = &uartClk, + .baud = WHAL_PIC32CZ_UART_BAUD(115200, 300000000), + .txPad = WHAL_PIC32CZ_UART_TXPO_PAD0, + .rxPad = WHAL_PIC32CZ_UART_RXPO_PAD1, + }, +}; + +/* Timer */ +whal_Timer g_whalTimer = { + WHAL_CORTEX_M7_SYSTICK_DEVICE, + + .cfg = &(whal_SysTick_Cfg) { + .cyclesPerTick = 300000000 / 1000, + .clkSrc = WHAL_SYSTICK_CLKSRC_SYSCLK, + .tickInt = WHAL_SYSTICK_TICKINT_ENABLED, + }, +}; + +/* Flash */ +whal_Flash g_whalFlash = { + WHAL_PIC32CZ_FLASH_DEVICE, +}; diff --git a/tests/boards/pic32cz_curiosity_ultra/board.h b/tests/boards/pic32cz_curiosity_ultra/board.h new file mode 100644 index 0000000..5b44ef1 --- /dev/null +++ b/tests/boards/pic32cz_curiosity_ultra/board.h @@ -0,0 +1,24 @@ +#ifndef BOARD_H +#define BOARD_H + +#include +#include +#include + +extern whal_Clock g_whalClock; +extern whal_Gpio g_whalGpio; +extern whal_Timer g_whalTimer; +extern whal_Uart g_whalUart; +extern whal_Flash g_whalFlash; + +extern volatile size_t g_tick; + +#define BOARD_LED_PIN 0 +#define BOARD_FLASH_TEST_ADDR 0x0C000000 +#define BOARD_FLASH_SECTOR_SZ 0x1000 + +whal_Error Board_Init(void); +whal_Error Board_Deinit(void); +void Board_WaitMs(size_t ms); + +#endif /* BOARD_H */ diff --git a/tests/boards/pic32cz_curiosity_ultra/ivt.c b/tests/boards/pic32cz_curiosity_ultra/ivt.c new file mode 100644 index 0000000..5493981 --- /dev/null +++ b/tests/boards/pic32cz_curiosity_ultra/ivt.c @@ -0,0 +1,79 @@ +#include + +extern uint32_t _sidata; +extern uint32_t _sdata; +extern uint32_t _edata; +extern uint32_t _sbss; +extern uint32_t _ebss; +extern uint32_t _estack; + +void Reset_Handler(void); +void NMI_Handler(void) __attribute__((weak, alias("Default_Handler"))); +void HardFault_Handler(void) __attribute__((weak, alias("Default_Handler"))); +void MemManage_Handler(void) __attribute__((weak, alias("Default_Handler"))); +void BusFault_Handler(void) __attribute__((weak, alias("Default_Handler"))); +void UsageFault_Handler(void) __attribute__((weak, alias("Default_Handler"))); +void SVC_Handler(void) __attribute__((weak, alias("Default_Handler"))); +void DebugMon_Handler(void) __attribute__((weak, alias("Default_Handler"))); +void PendSV_Handler(void) __attribute__((weak, alias("Default_Handler"))); +void SysTick_Handler(void) __attribute__((weak, alias("Default_Handler"))); + +extern int main(void); + +void Default_Handler(void) +{ + while (1) { + } +} + +/* Vector table */ +__attribute__((section(".isr_vectors"))) const void* vector_table[] = { + /* Stack pointer */ + &_estack, + + /* Core handlers */ + Reset_Handler, + NMI_Handler, + HardFault_Handler, + MemManage_Handler, + BusFault_Handler, + UsageFault_Handler, + 0, /* Reserved */ + 0, /* Reserved */ + 0, /* Reserved */ + 0, /* Reserved */ + SVC_Handler, + DebugMon_Handler, + 0, /* Reserved */ + PendSV_Handler, + SysTick_Handler, +}; + +void Reset_Handler(void) +{ + uint32_t* src = &_sidata; + uint32_t* dst = &_sdata; + + __asm__("ldr r0, =_estack\n\t" + "mov sp, r0"); + + while (dst < &_edata) { + *dst++ = *src++; + } + + dst = &_sbss; + while (dst < &_ebss) { + *dst++ = 0; + } + + /* Point VTOR to our vector table (SCB->VTOR = 0xE000ED08) */ + *(volatile uint32_t *)0xE000ED08 = (uint32_t)vector_table; + + /* Call main */ + main(); + + /* Never return */ + while (1) { + } +} + diff --git a/tests/boards/pic32cz_curiosity_ultra/jlink/target.xml b/tests/boards/pic32cz_curiosity_ultra/jlink/target.xml new file mode 100644 index 0000000..f5ecb8d --- /dev/null +++ b/tests/boards/pic32cz_curiosity_ultra/jlink/target.xml @@ -0,0 +1,56 @@ + + + arm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/boards/pic32cz_curiosity_ultra/linker.ld b/tests/boards/pic32cz_curiosity_ultra/linker.ld new file mode 100644 index 0000000..1b869e5 --- /dev/null +++ b/tests/boards/pic32cz_curiosity_ultra/linker.ld @@ -0,0 +1,55 @@ +MEMORY +{ + FLASH (rwx) : ORIGIN = 0x08000000, LENGTH = 64K + RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 512K +} + +ENTRY(Reset_Handler) + +SECTIONS +{ + .isr_vectors : + { + . = ALIGN(4); + KEEP(*(.isr_vectors)) + . = ALIGN(4); + } > FLASH + + .text : + { + . = ALIGN(4); + *(.text*) + *(.rodata*) + . = ALIGN(4); + } > FLASH + + .data : + { + . = ALIGN(4); + _sdata = .; + *(.data*) + . = ALIGN(4); + _edata = .; + } > RAM AT > FLASH + + _sidata = LOADADDR(.data); + + .bss : + { + . = ALIGN(4); + _sbss = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + _ebss = .; + } > RAM + + /* Set stack top to end of RAM */ + _estack = ORIGIN(RAM) + LENGTH(RAM); + + /DISCARD/ : + { + *(.comment) + *(.ARM.attributes) + } +} diff --git a/tests/boards/stm32wb55xx_nucleo/Makefile.inc b/tests/boards/stm32wb55xx_nucleo/Makefile.inc new file mode 100644 index 0000000..b114874 --- /dev/null +++ b/tests/boards/stm32wb55xx_nucleo/Makefile.inc @@ -0,0 +1,16 @@ +PLATFORM = stm32wb +TESTS = clock gpio flash timer rng + +GCC = $(GCC_PATH)arm-none-eabi-gcc +LD = $(GCC_PATH)arm-none-eabi-ld +OBJCOPY = $(GCC_PATH)arm-none-eabi-objcopy + +CFLAGS += -Wall -Werror $(INCLUDE) -g3 \ + -ffreestanding -nostdlib -mcpu=cortex-m4 \ + -DPLATFORM_STM32WB -MMD -MP +LDFLAGS = --omagic -static + +BOARD_SOURCE = $(BOARD_DIR)/ivt.c +BOARD_SOURCE += $(BOARD_DIR)/board.c +BOARD_SOURCE += $(wildcard $(WHAL_DIR)/src/*.c) +BOARD_SOURCE += $(wildcard $(WHAL_DIR)/src/*/*.c) diff --git a/examples/stm32wb/stm32wb55xx_nucleo.c b/tests/boards/stm32wb55xx_nucleo/board.c similarity index 52% rename from examples/stm32wb/stm32wb55xx_nucleo.c rename to tests/boards/stm32wb55xx_nucleo/board.c index 9f9bef7..5569ae5 100644 --- a/examples/stm32wb/stm32wb55xx_nucleo.c +++ b/tests/boards/stm32wb55xx_nucleo/board.c @@ -1,9 +1,132 @@ +#include +#include +#include "board.h" #include -#include "stm32wb55xx_nucleo.h" - -whal_Clock g_whalClock; -whal_Flash g_whalFlash; +/* SysTick timing */ +volatile size_t g_tick = 0; +volatile uint8_t g_waiting = 0; +volatile uint8_t g_tickOverflow = 0; + +void SysTick_Handler() +{ + size_t tickBefore = g_tick++; + if (g_waiting) { + if (tickBefore > g_tick) + g_tickOverflow = 1; + } +} + +void Board_WaitMs(size_t ms) +{ + size_t startCount = g_tick; + g_waiting = 1; + while (1) { + size_t currentCount = g_tick; + if (g_tickOverflow) { + if ((SIZE_MAX - startCount) + currentCount > ms) { + break; + } + } else if (currentCount - startCount > ms) { + break; + } + } + + g_waiting = 0; + g_tickOverflow = 0; +} + +whal_Error Board_Init(void) +{ + whal_Error err; + + err = whal_Clock_Init(&g_whalClock); + if (err) { + return err; + } + + /* Enable HSI48 osc required by the RNG */ + err = whal_Stm32wbRcc_Ext_EnableHsi48(&g_whalClock, 1); + if (err) { + return err; + } + + err = whal_Gpio_Init(&g_whalGpio); + if (err) { + return err; + } + + err = whal_Uart_Init(&g_whalUart); + if (err) { + return err; + } + + err = whal_Flash_Init(&g_whalFlash); + if (err) { + return err; + } + + err = whal_Rng_Init(&g_whalRng); + if (err) { + return err; + } + + err = whal_Timer_Init(&g_whalTimer); + if (err) { + return err; + } + + err = whal_Timer_Start(&g_whalTimer); + if (err) { + return err; + } + + return WHAL_SUCCESS; +} + +whal_Error Board_Deinit(void) +{ + whal_Error err; + + err = whal_Timer_Stop(&g_whalTimer); + if (err) { + return err; + } + + err = whal_Timer_Deinit(&g_whalTimer); + if (err) { + return err; + } + + err = whal_Rng_Deinit(&g_whalRng); + if (err) { + return err; + } + + err = whal_Uart_Deinit(&g_whalUart); + if (err) { + return err; + } + + err = whal_Gpio_Deinit(&g_whalGpio); + if (err) { + return err; + } + + err = whal_Stm32wbRcc_Ext_EnableHsi48(&g_whalClock, 0); + if (err) { + return err; + } + + err = whal_Clock_Deinit(&g_whalClock); + if (err) { + return err; + } + + return WHAL_SUCCESS; +} + +/* Clock */ whal_Clock g_whalClock = { WHAL_STM32WB55_RCC_PLL_DEVICE, @@ -25,18 +148,24 @@ whal_Clock g_whalClock = { }, }; +/* GPIO */ +enum { + LED_PIN, + UART_TX_PIN, + UART_RX_PIN, +}; + whal_Gpio g_whalGpio = { WHAL_STM32WB55_GPIO_DEVICE, .cfg = &(whal_Stm32wbGpio_Cfg) { .clkCtrl = &g_whalClock, - .clk = (const void *[2]) { - &(whal_Stm32wbRcc_Clk){WHAL_STM32WB55_GPIOA_CLOCK}, + .clk = (const void *[1]) { &(whal_Stm32wbRcc_Clk){WHAL_STM32WB55_GPIOB_CLOCK}, }, - .clkCount = 2, + .clkCount = 1, - .pinCfg = (whal_Stm32wbGpio_PinCfg[7]) { + .pinCfg = (whal_Stm32wbGpio_PinCfg[3]) { [LED_PIN] = { /* LED */ .port = WHAL_STM32WB_GPIO_PORT_B, .pin = 5, @@ -46,7 +175,7 @@ whal_Gpio g_whalGpio = { .pull = WHAL_STM32WB_GPIO_PULL_UP, .altFn = 0, }, - [LPUART1_TX_PIN] = { /* UART1 TX */ + [UART_TX_PIN] = { /* UART1 TX */ .port = WHAL_STM32WB_GPIO_PORT_B, .pin = 6, .mode = WHAL_STM32WB_GPIO_MODE_ALTFN, @@ -55,7 +184,7 @@ whal_Gpio g_whalGpio = { .pull = WHAL_STM32WB_GPIO_PULL_UP, .altFn = 7, }, - [LPUART1_RX_PIN] = { /* UART1 RX */ + [UART_RX_PIN] = { /* UART1 RX */ .port = WHAL_STM32WB_GPIO_PORT_B, .pin = 7, .mode = WHAL_STM32WB_GPIO_MODE_ALTFN, @@ -64,47 +193,12 @@ whal_Gpio g_whalGpio = { .pull = WHAL_STM32WB_GPIO_PULL_UP, .altFn = 7, }, - [SPI1_SCK_PIN] = { /* SPI1 SCK */ - .port = WHAL_STM32WB_GPIO_PORT_A, - .pin = 5, - .mode = WHAL_STM32WB_GPIO_MODE_ALTFN, - .outType = WHAL_STM32WB_GPIO_OUTTYPE_PUSHPULL, - .speed = WHAL_STM32WB_GPIO_SPEED_FAST, - .pull = WHAL_STM32WB_GPIO_PULL_UP, - .altFn = 5, - }, - [SPI1_MISO_PIN] = { /* SPI1 MISO */ - .port = WHAL_STM32WB_GPIO_PORT_A, - .pin = 6, - .mode = WHAL_STM32WB_GPIO_MODE_ALTFN, - .outType = WHAL_STM32WB_GPIO_OUTTYPE_PUSHPULL, - .speed = WHAL_STM32WB_GPIO_SPEED_FAST, - .pull = WHAL_STM32WB_GPIO_PULL_UP, - .altFn = 5, - }, - [SPI1_MOSI_PIN] = { /* SPI1 MOSI */ - .port = WHAL_STM32WB_GPIO_PORT_A, - .pin = 7, - .mode = WHAL_STM32WB_GPIO_MODE_ALTFN, - .outType = WHAL_STM32WB_GPIO_OUTTYPE_PUSHPULL, - .speed = WHAL_STM32WB_GPIO_SPEED_FAST, - .pull = WHAL_STM32WB_GPIO_PULL_UP, - .altFn = 5, - }, - [CS_PIN] = { /* SPI1 CS */ - .port = WHAL_STM32WB_GPIO_PORT_A, - .pin = 4, - .mode = WHAL_STM32WB_GPIO_MODE_OUT, - .outType = WHAL_STM32WB_GPIO_OUTTYPE_PUSHPULL, - .speed = WHAL_STM32WB_GPIO_SPEED_LOW, - .pull = WHAL_STM32WB_GPIO_PULL_UP, - .altFn = 0, - }, }, - .pinCount = 7, + .pinCount = 3, }, }; +/* Timer */ whal_Timer g_whalTimer = { WHAL_CORTEX_M4_SYSTICK_DEVICE, @@ -115,6 +209,7 @@ whal_Timer g_whalTimer = { }, }; +/* UART */ whal_Uart g_whalUart = { WHAL_STM32WB55_UART1_DEVICE, @@ -126,6 +221,7 @@ whal_Uart g_whalUart = { }, }; +/* Flash */ whal_Flash g_whalFlash = { WHAL_STM32WB55_FLASH_DEVICE, @@ -138,15 +234,7 @@ whal_Flash g_whalFlash = { }, }; -whal_Spi g_whalSpi = { - WHAL_STM32WB55_SPI1_DEVICE, - - .cfg = &(whal_Stm32wbSpi_Cfg) { - .clkCtrl = &g_whalClock, - .clk = &(whal_Stm32wbRcc_Clk) {WHAL_STM32WB55_SPI1_CLOCK}, - }, -}; - +/* RNG */ whal_Rng g_whalRng = { WHAL_STM32WB55_RNG_DEVICE, diff --git a/tests/boards/stm32wb55xx_nucleo/board.h b/tests/boards/stm32wb55xx_nucleo/board.h new file mode 100644 index 0000000..047bc79 --- /dev/null +++ b/tests/boards/stm32wb55xx_nucleo/board.h @@ -0,0 +1,25 @@ +#ifndef BOARD_H +#define BOARD_H + +#include +#include +#include + +extern whal_Clock g_whalClock; +extern whal_Gpio g_whalGpio; +extern whal_Timer g_whalTimer; +extern whal_Uart g_whalUart; +extern whal_Flash g_whalFlash; +extern whal_Rng g_whalRng; + +extern volatile size_t g_tick; + +#define BOARD_LED_PIN 0 +#define BOARD_FLASH_TEST_ADDR 0x08080000 +#define BOARD_FLASH_SECTOR_SZ 0x1000 + +whal_Error Board_Init(void); +whal_Error Board_Deinit(void); +void Board_WaitMs(size_t ms); + +#endif /* BOARD_H */ diff --git a/tests/boards/stm32wb55xx_nucleo/ivt.c b/tests/boards/stm32wb55xx_nucleo/ivt.c new file mode 100644 index 0000000..a8b8d89 --- /dev/null +++ b/tests/boards/stm32wb55xx_nucleo/ivt.c @@ -0,0 +1,216 @@ +#include +#include + +extern uint32_t _estack[]; +extern uint32_t _sidata[]; +extern uint32_t _sdata[]; +extern uint32_t _edata[]; +extern uint32_t _sbss[]; +extern uint32_t _ebss[]; + +extern void main(); + +void __attribute__((naked,noreturn)) Default_Handler() +{ + while(1); +} + +void Reset_Handler() __attribute__((weak)); +void NMI_Handler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void HardFault_Handler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void MemManage_Handler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void BusFault_Handler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void UsageFault_Handler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void SVC_Handler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void DebugMon_Handler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void PendSV_Handler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void SysTick_Handler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void WWDG_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void PVD_PVM_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void TAMP_STAMP_LSECSS_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void RTC_WKUP_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void FLASH_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void RCC_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void EXTI0_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void EXTI1_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void EXTI2_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void EXTI3_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void EXTI4_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void DMA1_Channel1_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void DMA1_Channel2_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void DMA1_Channel3_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void DMA1_Channel4_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void DMA1_Channel5_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void DMA1_Channel6_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void DMA1_Channel7_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void ADC1_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void USB_HP_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void USB_LP_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void C2SEV_PWR_C2H_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void COMP_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void EXTI9_5_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void TIM1_BRK_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void TIM1_UP_TIM16_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void TIM1_TRG_COM_TIM17_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void TIM1_CC_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void TIM2_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void PKA_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void I2C1_EV_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void I2C1_ER_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void I2C3_EV_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void I2C3_ER_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void SPI1_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void SPI2_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void USART1_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void LPUART1_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void SAI1_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void TSC_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void EXTI15_10_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void RTC_Alarm_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void CRS_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void IPCC_C1_RX_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void IPCC_C1_TX_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void HSEM_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void LPTIM1_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void LPTIM2_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void LCD_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void QUADSPI_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void AES1_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void AES2_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void RNG_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void FPU_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void DMA2_Channel1_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void DMA2_Channel2_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void DMA2_Channel3_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void DMA2_Channel4_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void DMA2_Channel5_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void DMA2_Channel6_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void DMA2_Channel7_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); +void DMAMUX1_OVR_IRQHandler() __attribute__((weak, noreturn, alias("Default_Handler"))); + +#define RESERVED Default_Handler + +void (* const interrupt_vector_table[])() __attribute__((section(".isr_vector"))) = { + (void (*)())_estack, + Reset_Handler, + NMI_Handler, + HardFault_Handler, + MemManage_Handler, + BusFault_Handler, + UsageFault_Handler, + RESERVED, + RESERVED, + RESERVED, + RESERVED, + SVC_Handler, + DebugMon_Handler, + RESERVED, + PendSV_Handler, + SysTick_Handler, + WWDG_IRQHandler, + PVD_PVM_IRQHandler, + TAMP_STAMP_LSECSS_IRQHandler, + RTC_WKUP_IRQHandler, + FLASH_IRQHandler, + RCC_IRQHandler, + EXTI0_IRQHandler, + EXTI1_IRQHandler, + EXTI2_IRQHandler, + EXTI3_IRQHandler, + EXTI4_IRQHandler, + DMA1_Channel1_IRQHandler, + DMA1_Channel2_IRQHandler, + DMA1_Channel3_IRQHandler, + DMA1_Channel4_IRQHandler, + DMA1_Channel5_IRQHandler, + DMA1_Channel6_IRQHandler, + DMA1_Channel7_IRQHandler, + ADC1_IRQHandler, + USB_HP_IRQHandler, + USB_LP_IRQHandler, + C2SEV_PWR_C2H_IRQHandler, + COMP_IRQHandler, + EXTI9_5_IRQHandler, + TIM1_BRK_IRQHandler, + TIM1_UP_TIM16_IRQHandler, + TIM1_TRG_COM_TIM17_IRQHandler, + TIM1_CC_IRQHandler, + TIM2_IRQHandler, + PKA_IRQHandler, + I2C1_EV_IRQHandler, + I2C1_ER_IRQHandler, + I2C3_EV_IRQHandler, + I2C3_ER_IRQHandler, + SPI1_IRQHandler, + SPI2_IRQHandler, + USART1_IRQHandler, + LPUART1_IRQHandler, + SAI1_IRQHandler, + TSC_IRQHandler, + EXTI15_10_IRQHandler, + RTC_Alarm_IRQHandler, + CRS_IRQHandler, + PWR_SOTF_BLEACT_802ACT_RFPHASE_IRQHandler, + IPCC_C1_RX_IRQHandler, + IPCC_C1_TX_IRQHandler, + HSEM_IRQHandler, + LPTIM1_IRQHandler, + LPTIM2_IRQHandler, + LCD_IRQHandler, + QUADSPI_IRQHandler, + AES1_IRQHandler, + AES2_IRQHandler, + RNG_IRQHandler, + FPU_IRQHandler, + DMA2_Channel1_IRQHandler, + DMA2_Channel2_IRQHandler, + DMA2_Channel3_IRQHandler, + DMA2_Channel4_IRQHandler, + DMA2_Channel5_IRQHandler, + DMA2_Channel6_IRQHandler, + DMA2_Channel7_IRQHandler, + DMAMUX1_OVR_IRQHandler, +}; + +void *memcpy(void *dest, const void *src, size_t n) +{ + unsigned char *d = dest; + const unsigned char *s = src; + + for (size_t i = 0; i < n; i++) + d[i] = s[i]; + + return dest; +} + +void *memset(void *s, int c, size_t n) +{ + unsigned char *p = s; + unsigned char v = (unsigned char)c; + + for (size_t i = 0; i < n; i++) + p[i] = v; + + return s; +} + +void __attribute__((naked)) Reset_Handler() +{ + __asm__("ldr r0, =_estack\n\t" + "mov sp, r0"); + + // Copy data section from flash memory to ram + uint32_t data_section_size = _edata - _sdata; + memcpy(_sdata, _sidata, data_section_size*4); + + // Zero out bss + uint32_t bss_section_size = _ebss - _sbss; + memset(_sbss, 0, bss_section_size*4); + + // Set Interrupt Vector Table Offset + uint32_t *vtor = (uint32_t *)0xE000ED08; + *vtor = (uint32_t)interrupt_vector_table; + + main(); +} diff --git a/tests/boards/stm32wb55xx_nucleo/linker.ld b/tests/boards/stm32wb55xx_nucleo/linker.ld new file mode 100644 index 0000000..b98b596 --- /dev/null +++ b/tests/boards/stm32wb55xx_nucleo/linker.ld @@ -0,0 +1,173 @@ +/* +***************************************************************************** +** +** File : linker.ld +** +** Abstract : System Workbench Minimal System calls file +** +** For more information about which c-functions +** need which of these lowlevel functions +** please consult the Newlib libc-manual +** +** Environment : System Workbench for MCU +** +** Distribution: The file is distributed “as is,” without any warranty +** of any kind. +** +***************************************************************************** +** +**

© COPYRIGHT(c) 2019 Ac6

+** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of Ac6 nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = 0x20030000; /* end of RAM */ +/* Generate a link error if the stack don't fit into RAM */ +_Min_Stack_Size = 0x500; /* required amount of stack */ + +/* Specify the memory areas */ +MEMORY +{ +FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K +BOOTLOADER_MAGIC (rx) : ORIGIN = 0x20000004, LENGTH = 0x4 +RAM1 (xrw) : ORIGIN = 0x20000008, LENGTH = 0x1ffc +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into FLASH */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >FLASH + + /* The program code and other data goes into FLASH */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >FLASH + + /* Constant data goes into FLASH */ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >FLASH + + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH + .ARM : { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } >FLASH + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >FLASH + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } >FLASH + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >FLASH + + /* used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections goes into RAM, load LMA copy after code */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM1 AT> FLASH + + + /* Uninitialized data section */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM1 + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM1 + + /* .ARM.attributes 0 : { *(.ARM.attributes) } */ + /* MAPPING_TABLE (NOLOAD) : { *(MAPPING_TABLE) } >RAM_SHARED */ + /* MB_MEM1 (NOLOAD) : { *(MB_MEM1) } >RAM_SHARED */ + /* MB_MEM2 (NOLOAD) : { _sMB_MEM2 = . ; *(MB_MEM2) ; _eMB_MEM2 = . ; } >RAM_SHARED */ +} diff --git a/tests/clock/test_clock.c b/tests/clock/test_clock.c new file mode 100644 index 0000000..9cf4888 --- /dev/null +++ b/tests/clock/test_clock.c @@ -0,0 +1,17 @@ +#include +#include "board.h" +#include "test.h" + +static void Test_Clock_GetRate(void) +{ + size_t rate = 0; + WHAL_ASSERT_EQ(whal_Clock_GetRate(&g_whalClock, &rate), WHAL_SUCCESS); + WHAL_ASSERT_NEQ(rate, 0); +} + +void whal_Test_Clock(void) +{ + WHAL_TEST_SUITE_START("clock"); + WHAL_TEST(Test_Clock_GetRate); + WHAL_TEST_SUITE_END(); +} diff --git a/tests/pic32cz/test_clock.c b/tests/clock/test_pic32cz_clock.c similarity index 61% rename from tests/pic32cz/test_clock.c rename to tests/clock/test_pic32cz_clock.c index 3c27476..339b85f 100644 --- a/tests/pic32cz/test_clock.c +++ b/tests/clock/test_pic32cz_clock.c @@ -1,25 +1,16 @@ #include #include #include -#include "pic32cz_curiosity_ultra.h" -#include "../test.h" - -/* - * GCLK peripheral channel control register layout: - * Offset from clock base: 0x10000 + 0x80 + (channel * 4) - * GEN field: bits [3:0] - * CHEN bit: bit 6 - * - * MCLK clock mask register layout: - * Offset from clock base: 0x12000 + 0x3C + (inst * 4) - */ +#include "board.h" +#include "test.h" + #define GCLK_PCHCTRL_OFFSET(ch) (0x10000 + 0x80 + ((ch) * 4)) #define GCLK_PCHCTRL_CHEN_Pos 6 #define GCLK_PCHCTRL_CHEN_Msk (1UL << GCLK_PCHCTRL_CHEN_Pos) #define MCLK_CLKMSK_OFFSET(inst) (0x12000 + 0x3C + ((inst) * 4)) -static void test_clock_enable_disable(void) +static void Test_Clock_EnableDisable(void) { /* Use a test clock descriptor for SERCOM4 (same as UART clock) */ whal_Pic32czClock_Clk testClk = { @@ -30,34 +21,41 @@ static void test_clock_enable_disable(void) .mclkEnablePos = 3, }; + /* Save original state */ + size_t origChen = 0; + whal_Reg_Get(g_whalClock.regmap.base, GCLK_PCHCTRL_OFFSET(25), + GCLK_PCHCTRL_CHEN_Msk, GCLK_PCHCTRL_CHEN_Pos, &origChen); + + size_t origMclk = 0; + whal_Reg_Get(g_whalClock.regmap.base, MCLK_CLKMSK_OFFSET(1), + (1UL << 3), 3, &origMclk); + size_t val = 0; + /* Enable and verify */ WHAL_ASSERT_EQ(whal_Clock_Enable(&g_whalClock, &testClk), WHAL_SUCCESS); - /* Readback: GCLK PCHCTRL channel 25 CHEN bit should be set */ whal_Reg_Get(g_whalClock.regmap.base, GCLK_PCHCTRL_OFFSET(25), GCLK_PCHCTRL_CHEN_Msk, GCLK_PCHCTRL_CHEN_Pos, &val); WHAL_ASSERT_EQ(val, 1); - /* Readback: MCLK CLKMSK1 bit 3 should be set */ whal_Reg_Get(g_whalClock.regmap.base, MCLK_CLKMSK_OFFSET(1), (1UL << 3), 3, &val); WHAL_ASSERT_EQ(val, 1); + /* Disable and verify */ WHAL_ASSERT_EQ(whal_Clock_Disable(&g_whalClock, &testClk), WHAL_SUCCESS); - /* After disable: CHEN should be cleared */ whal_Reg_Get(g_whalClock.regmap.base, GCLK_PCHCTRL_OFFSET(25), GCLK_PCHCTRL_CHEN_Msk, GCLK_PCHCTRL_CHEN_Pos, &val); WHAL_ASSERT_EQ(val, 0); - /* Re-enable so UART still works for remaining tests */ - WHAL_ASSERT_EQ(whal_Clock_Enable(&g_whalClock, &testClk), WHAL_SUCCESS); + /* Restore original state */ + if (origChen) + whal_Clock_Enable(&g_whalClock, &testClk); } -void test_clock(void) +void whal_Test_Clock_Platform(void) { - WHAL_TEST_SUITE_START("clock"); - WHAL_TEST(test_clock_enable_disable); - WHAL_TEST_SUITE_END(); + WHAL_TEST(Test_Clock_EnableDisable); } diff --git a/tests/stm32wb/test_clock.c b/tests/clock/test_stm32wb_clock.c similarity index 51% rename from tests/stm32wb/test_clock.c rename to tests/clock/test_stm32wb_clock.c index d7ded55..dcb39f8 100644 --- a/tests/stm32wb/test_clock.c +++ b/tests/clock/test_stm32wb_clock.c @@ -1,37 +1,37 @@ #include +#include #include #include -#include "stm32wb55xx_nucleo.h" -#include "../test.h" +#include "board.h" +#include "test.h" -static void test_clock_getrate(void) -{ - size_t rate = 0; - WHAL_ASSERT_EQ(whal_Clock_GetRate(&g_whalClock, &rate), WHAL_SUCCESS); - WHAL_ASSERT_EQ(rate, 64000000); -} - -static void test_clock_enable_disable(void) +static void Test_Clock_EnableDisable(void) { whal_Stm32wbRcc_Clk testClk = { WHAL_STM32WB55_GPIOA_CLOCK }; + /* Save original state */ + size_t origVal = 0; + whal_Reg_Get(g_whalClock.regmap.base, 0x4C, (1 << 0), 0, &origVal); + + /* Enable and verify */ WHAL_ASSERT_EQ(whal_Clock_Enable(&g_whalClock, &testClk), WHAL_SUCCESS); - /* Readback: GPIOA enable bit should be set in AHB2ENR (offset 0x4C, bit 0) */ size_t val = 0; whal_Reg_Get(g_whalClock.regmap.base, 0x4C, (1 << 0), 0, &val); WHAL_ASSERT_EQ(val, 1); + /* Disable and verify */ WHAL_ASSERT_EQ(whal_Clock_Disable(&g_whalClock, &testClk), WHAL_SUCCESS); whal_Reg_Get(g_whalClock.regmap.base, 0x4C, (1 << 0), 0, &val); WHAL_ASSERT_EQ(val, 0); + + /* Restore original state */ + if (origVal) + whal_Clock_Enable(&g_whalClock, &testClk); } -void test_clock(void) +void whal_Test_Clock_Platform(void) { - WHAL_TEST_SUITE_START("clock"); - WHAL_TEST(test_clock_getrate); - WHAL_TEST(test_clock_enable_disable); - WHAL_TEST_SUITE_END(); + WHAL_TEST(Test_Clock_EnableDisable); } diff --git a/tests/sim/Makefile b/tests/core/Makefile similarity index 79% rename from tests/sim/Makefile rename to tests/core/Makefile index c9220ff..25e1865 100644 --- a/tests/sim/Makefile +++ b/tests/core/Makefile @@ -1,12 +1,10 @@ -WHAL_DIR = $(PWD)/../../ +WHAL_DIR = $(CURDIR)/../.. INCLUDE = -I$(WHAL_DIR) CFLAGS = -Wall -Werror $(INCLUDE) -g3 -# Test sources -TEST_SRC = test_main.c test_bitops.c test_dispatch.c +TEST_SRC = main.c test_bitops.c test_dispatch.c -# wolfHAL generic dispatch sources (no platform drivers) WHAL_SRC = $(WHAL_DIR)/src/clock/clock.c \ $(WHAL_DIR)/src/gpio/gpio.c \ $(WHAL_DIR)/src/uart/uart.c \ @@ -19,7 +17,7 @@ WHAL_SRC = $(WHAL_DIR)/src/clock/clock.c \ SOURCE = $(TEST_SRC) $(WHAL_SRC) OBJECTS = $(patsubst %.c,%.o,$(SOURCE)) -TARGET = test_sim +TARGET = test_core all: $(TARGET) diff --git a/tests/sim/test_main.c b/tests/core/main.c similarity index 65% rename from tests/sim/test_main.c rename to tests/core/main.c index 4597a6d..bd2aa8f 100644 --- a/tests/sim/test_main.c +++ b/tests/core/main.c @@ -5,21 +5,21 @@ int g_whalTestPassed; int g_whalTestFailed; int g_whalTestCurFailed; -void whalTest_Puts(const char *s) +void whal_Test_Puts(const char *s) { fputs(s, stdout); } -void test_bitops(void); -void test_dispatch(void); +void whal_Test_Bitops(void); +void whal_Test_Dispatch(void); int main(void) { g_whalTestPassed = 0; g_whalTestFailed = 0; - test_bitops(); - test_dispatch(); + whal_Test_Bitops(); + whal_Test_Dispatch(); WHAL_TEST_SUMMARY(); diff --git a/tests/sim/test_bitops.c b/tests/core/test_bitops.c similarity index 58% rename from tests/sim/test_bitops.c rename to tests/core/test_bitops.c index 66ddc0b..5df9440 100644 --- a/tests/sim/test_bitops.c +++ b/tests/core/test_bitops.c @@ -1,50 +1,50 @@ #include #include "../test.h" -static void test_bitmask_4(void) +static void Test_Bitops_Bitmask4(void) { WHAL_ASSERT_EQ(WHAL_BITMASK(4), 0xFul); } -static void test_bitmask_8(void) +static void Test_Bitops_Bitmask8(void) { WHAL_ASSERT_EQ(WHAL_BITMASK(8), 0xFFul); } -static void test_bitmask_1(void) +static void Test_Bitops_Bitmask1(void) { WHAL_ASSERT_EQ(WHAL_BITMASK(1), 1ul); } -static void test_setbits_low(void) +static void Test_Bitops_SetbitsLow(void) { size_t msk = WHAL_BITMASK(4); size_t pos = 0; WHAL_ASSERT_EQ(whal_SetBits(msk, pos, 0xA), 0xAul); } -static void test_setbits_shifted(void) +static void Test_Bitops_SetbitsShifted(void) { size_t msk = (WHAL_BITMASK(4) << 4); size_t pos = 4; WHAL_ASSERT_EQ(whal_SetBits(msk, pos, 0x5), 0x50ul); } -static void test_getbits_low(void) +static void Test_Bitops_GetbitsLow(void) { size_t msk = WHAL_BITMASK(4); size_t pos = 0; WHAL_ASSERT_EQ(whal_GetBits(msk, pos, 0xABul), 0xBul); } -static void test_getbits_shifted(void) +static void Test_Bitops_GetbitsShifted(void) { size_t msk = (WHAL_BITMASK(4) << 4); size_t pos = 4; WHAL_ASSERT_EQ(whal_GetBits(msk, pos, 0xABul), 0xAul); } -static void test_setbits_getbits_roundtrip(void) +static void Test_Bitops_SetbitsGetbitsRoundtrip(void) { size_t msk = (WHAL_BITMASK(7) << 8); size_t pos = 8; @@ -53,7 +53,7 @@ static void test_setbits_getbits_roundtrip(void) WHAL_ASSERT_EQ(whal_GetBits(msk, pos, encoded), val); } -static void test_setbits_single_bit(void) +static void Test_Bitops_SetbitsSingleBit(void) { size_t msk = (1UL << 24); size_t pos = 24; @@ -61,17 +61,17 @@ static void test_setbits_single_bit(void) WHAL_ASSERT_EQ(whal_SetBits(msk, pos, 0), 0ul); } -void test_bitops(void) +void whal_Test_Bitops(void) { WHAL_TEST_SUITE_START("bitops"); - WHAL_TEST(test_bitmask_4); - WHAL_TEST(test_bitmask_8); - WHAL_TEST(test_bitmask_1); - WHAL_TEST(test_setbits_low); - WHAL_TEST(test_setbits_shifted); - WHAL_TEST(test_getbits_low); - WHAL_TEST(test_getbits_shifted); - WHAL_TEST(test_setbits_getbits_roundtrip); - WHAL_TEST(test_setbits_single_bit); + WHAL_TEST(Test_Bitops_Bitmask4); + WHAL_TEST(Test_Bitops_Bitmask8); + WHAL_TEST(Test_Bitops_Bitmask1); + WHAL_TEST(Test_Bitops_SetbitsLow); + WHAL_TEST(Test_Bitops_SetbitsShifted); + WHAL_TEST(Test_Bitops_GetbitsLow); + WHAL_TEST(Test_Bitops_GetbitsShifted); + WHAL_TEST(Test_Bitops_SetbitsGetbitsRoundtrip); + WHAL_TEST(Test_Bitops_SetbitsSingleBit); WHAL_TEST_SUITE_END(); } diff --git a/tests/sim/test_dispatch.c b/tests/core/test_dispatch.c similarity index 60% rename from tests/sim/test_dispatch.c rename to tests/core/test_dispatch.c index dc0fced..fce0951 100644 --- a/tests/sim/test_dispatch.c +++ b/tests/core/test_dispatch.c @@ -9,89 +9,89 @@ * Used to verify the generic dispatch layer. */ -static whal_Error mockClockInit(whal_Clock *d) { (void)d; return WHAL_SUCCESS; } -static whal_Error mockClockDeinit(whal_Clock *d) { (void)d; return WHAL_SUCCESS; } -static whal_Error mockClockEnable(whal_Clock *d, const void *c) { (void)d; (void)c; return WHAL_SUCCESS; } -static whal_Error mockClockDisable(whal_Clock *d, const void *c) { (void)d; (void)c; return WHAL_SUCCESS; } -static whal_Error mockClockGetRate(whal_Clock *d, size_t *r) { (void)d; *r = 64000000; return WHAL_SUCCESS; } +static whal_Error MockClockInit(whal_Clock *d) { (void)d; return WHAL_SUCCESS; } +static whal_Error MockClockDeinit(whal_Clock *d) { (void)d; return WHAL_SUCCESS; } +static whal_Error MockClockEnable(whal_Clock *d, const void *c) { (void)d; (void)c; return WHAL_SUCCESS; } +static whal_Error MockClockDisable(whal_Clock *d, const void *c) { (void)d; (void)c; return WHAL_SUCCESS; } +static whal_Error MockClockGetRate(whal_Clock *d, size_t *r) { (void)d; *r = 64000000; return WHAL_SUCCESS; } static const whal_ClockDriver mockClockDriver = { - .Init = mockClockInit, - .Deinit = mockClockDeinit, - .Enable = mockClockEnable, - .Disable = mockClockDisable, - .GetRate = mockClockGetRate, + .Init = MockClockInit, + .Deinit = MockClockDeinit, + .Enable = MockClockEnable, + .Disable = MockClockDisable, + .GetRate = MockClockGetRate, }; -static whal_Error mockGpioInit(whal_Gpio *d) { (void)d; return WHAL_SUCCESS; } -static whal_Error mockGpioDeinit(whal_Gpio *d) { (void)d; return WHAL_SUCCESS; } -static whal_Error mockGpioGet(whal_Gpio *d, size_t p, size_t *v) { (void)d; (void)p; *v = 1; return WHAL_SUCCESS; } -static whal_Error mockGpioSet(whal_Gpio *d, size_t p, size_t v) { (void)d; (void)p; (void)v; return WHAL_SUCCESS; } +static whal_Error MockGpioInit(whal_Gpio *d) { (void)d; return WHAL_SUCCESS; } +static whal_Error MockGpioDeinit(whal_Gpio *d) { (void)d; return WHAL_SUCCESS; } +static whal_Error MockGpioGet(whal_Gpio *d, size_t p, size_t *v) { (void)d; (void)p; *v = 1; return WHAL_SUCCESS; } +static whal_Error MockGpioSet(whal_Gpio *d, size_t p, size_t v) { (void)d; (void)p; (void)v; return WHAL_SUCCESS; } static const whal_GpioDriver mockGpioDriver = { - .Init = mockGpioInit, - .Deinit = mockGpioDeinit, - .Get = mockGpioGet, - .Set = mockGpioSet, + .Init = MockGpioInit, + .Deinit = MockGpioDeinit, + .Get = MockGpioGet, + .Set = MockGpioSet, }; -static whal_Error mockUartInit(whal_Uart *d) { (void)d; return WHAL_SUCCESS; } -static whal_Error mockUartDeinit(whal_Uart *d) { (void)d; return WHAL_SUCCESS; } -static whal_Error mockUartSend(whal_Uart *d, const uint8_t *data, size_t sz) { (void)d; (void)data; (void)sz; return WHAL_SUCCESS; } -static whal_Error mockUartRecv(whal_Uart *d, uint8_t *data, size_t sz) { (void)d; (void)data; (void)sz; return WHAL_SUCCESS; } +static whal_Error MockUartInit(whal_Uart *d) { (void)d; return WHAL_SUCCESS; } +static whal_Error MockUartDeinit(whal_Uart *d) { (void)d; return WHAL_SUCCESS; } +static whal_Error MockUartSend(whal_Uart *d, const uint8_t *data, size_t sz) { (void)d; (void)data; (void)sz; return WHAL_SUCCESS; } +static whal_Error MockUartRecv(whal_Uart *d, uint8_t *data, size_t sz) { (void)d; (void)data; (void)sz; return WHAL_SUCCESS; } static const whal_UartDriver mockUartDriver = { - .Init = mockUartInit, - .Deinit = mockUartDeinit, - .Send = mockUartSend, - .Recv = mockUartRecv, + .Init = MockUartInit, + .Deinit = MockUartDeinit, + .Send = MockUartSend, + .Recv = MockUartRecv, }; -static whal_Error mockFlashInit(whal_Flash *d) { (void)d; return WHAL_SUCCESS; } -static whal_Error mockFlashDeinit(whal_Flash *d) { (void)d; return WHAL_SUCCESS; } -static whal_Error mockFlashLock(whal_Flash *d, size_t a, size_t l) { (void)d; (void)a; (void)l; return WHAL_SUCCESS; } -static whal_Error mockFlashUnlock(whal_Flash *d, size_t a, size_t l) { (void)d; (void)a; (void)l; return WHAL_SUCCESS; } -static whal_Error mockFlashRead(whal_Flash *d, size_t a, uint8_t *data, size_t sz) { (void)d; (void)a; (void)data; (void)sz; return WHAL_SUCCESS; } -static whal_Error mockFlashWrite(whal_Flash *d, size_t a, const uint8_t *data, size_t sz) { (void)d; (void)a; (void)data; (void)sz; return WHAL_SUCCESS; } -static whal_Error mockFlashErase(whal_Flash *d, size_t a, size_t sz) { (void)d; (void)a; (void)sz; return WHAL_SUCCESS; } +static whal_Error MockFlashInit(whal_Flash *d) { (void)d; return WHAL_SUCCESS; } +static whal_Error MockFlashDeinit(whal_Flash *d) { (void)d; return WHAL_SUCCESS; } +static whal_Error MockFlashLock(whal_Flash *d, size_t a, size_t l) { (void)d; (void)a; (void)l; return WHAL_SUCCESS; } +static whal_Error MockFlashUnlock(whal_Flash *d, size_t a, size_t l) { (void)d; (void)a; (void)l; return WHAL_SUCCESS; } +static whal_Error MockFlashRead(whal_Flash *d, size_t a, uint8_t *data, size_t sz) { (void)d; (void)a; (void)data; (void)sz; return WHAL_SUCCESS; } +static whal_Error MockFlashWrite(whal_Flash *d, size_t a, const uint8_t *data, size_t sz) { (void)d; (void)a; (void)data; (void)sz; return WHAL_SUCCESS; } +static whal_Error MockFlashErase(whal_Flash *d, size_t a, size_t sz) { (void)d; (void)a; (void)sz; return WHAL_SUCCESS; } static const whal_FlashDriver mockFlashDriver = { - .Init = mockFlashInit, - .Deinit = mockFlashDeinit, - .Lock = mockFlashLock, - .Unlock = mockFlashUnlock, - .Read = mockFlashRead, - .Write = mockFlashWrite, - .Erase = mockFlashErase, + .Init = MockFlashInit, + .Deinit = MockFlashDeinit, + .Lock = MockFlashLock, + .Unlock = MockFlashUnlock, + .Read = MockFlashRead, + .Write = MockFlashWrite, + .Erase = MockFlashErase, }; -static whal_Error mockTimerInit(whal_Timer *d) { (void)d; return WHAL_SUCCESS; } -static whal_Error mockTimerDeinit(whal_Timer *d) { (void)d; return WHAL_SUCCESS; } -static whal_Error mockTimerStart(whal_Timer *d) { (void)d; return WHAL_SUCCESS; } -static whal_Error mockTimerStop(whal_Timer *d) { (void)d; return WHAL_SUCCESS; } -static whal_Error mockTimerReset(whal_Timer *d) { (void)d; return WHAL_SUCCESS; } +static whal_Error MockTimerInit(whal_Timer *d) { (void)d; return WHAL_SUCCESS; } +static whal_Error MockTimerDeinit(whal_Timer *d) { (void)d; return WHAL_SUCCESS; } +static whal_Error MockTimerStart(whal_Timer *d) { (void)d; return WHAL_SUCCESS; } +static whal_Error MockTimerStop(whal_Timer *d) { (void)d; return WHAL_SUCCESS; } +static whal_Error MockTimerReset(whal_Timer *d) { (void)d; return WHAL_SUCCESS; } static const whal_TimerDriver mockTimerDriver = { - .Init = mockTimerInit, - .Deinit = mockTimerDeinit, - .Start = mockTimerStart, - .Stop = mockTimerStop, - .Reset = mockTimerReset, + .Init = MockTimerInit, + .Deinit = MockTimerDeinit, + .Start = MockTimerStart, + .Stop = MockTimerStop, + .Reset = MockTimerReset, }; -static whal_Error mockRngInit(whal_Rng *d) { (void)d; return WHAL_SUCCESS; } -static whal_Error mockRngDeinit(whal_Rng *d) { (void)d; return WHAL_SUCCESS; } -static whal_Error mockRngGenerate(whal_Rng *d, uint8_t *data, size_t sz) { (void)d; (void)data; (void)sz; return WHAL_SUCCESS; } +static whal_Error MockRngInit(whal_Rng *d) { (void)d; return WHAL_SUCCESS; } +static whal_Error MockRngDeinit(whal_Rng *d) { (void)d; return WHAL_SUCCESS; } +static whal_Error MockRngGenerate(whal_Rng *d, uint8_t *data, size_t sz) { (void)d; (void)data; (void)sz; return WHAL_SUCCESS; } static const whal_RngDriver mockRngDriver = { - .Init = mockRngInit, - .Deinit = mockRngDeinit, - .Generate = mockRngGenerate, + .Init = MockRngInit, + .Deinit = MockRngDeinit, + .Generate = MockRngGenerate, }; /* --- Clock dispatch tests --- */ -static void test_clock_null_dev(void) +static void Test_Clock_NullDev(void) { WHAL_ASSERT_EQ(whal_Clock_Init(NULL), WHAL_EINVAL); WHAL_ASSERT_EQ(whal_Clock_Deinit(NULL), WHAL_EINVAL); @@ -101,20 +101,20 @@ static void test_clock_null_dev(void) WHAL_ASSERT_EQ(whal_Clock_GetRate(NULL, &rate), WHAL_EINVAL); } -static void test_clock_null_driver(void) +static void Test_Clock_NullDriver(void) { whal_Clock dev = { .driver = NULL }; WHAL_ASSERT_EQ(whal_Clock_Init(&dev), WHAL_EINVAL); } -static void test_clock_null_vtable_entry(void) +static void Test_Clock_NullVtableEntry(void) { static const whal_ClockDriver emptyDriver = { 0 }; whal_Clock dev = { .driver = &emptyDriver }; WHAL_ASSERT_EQ(whal_Clock_Init(&dev), WHAL_EINVAL); } -static void test_clock_valid_dispatch(void) +static void Test_Clock_ValidDispatch(void) { whal_Clock dev = { .driver = &mockClockDriver }; WHAL_ASSERT_EQ(whal_Clock_Init(&dev), WHAL_SUCCESS); @@ -128,7 +128,7 @@ static void test_clock_valid_dispatch(void) /* --- GPIO dispatch tests --- */ -static void test_gpio_null_dev(void) +static void Test_Gpio_NullDev(void) { WHAL_ASSERT_EQ(whal_Gpio_Init(NULL), WHAL_EINVAL); WHAL_ASSERT_EQ(whal_Gpio_Set(NULL, 0, 0), WHAL_EINVAL); @@ -136,13 +136,13 @@ static void test_gpio_null_dev(void) WHAL_ASSERT_EQ(whal_Gpio_Get(NULL, 0, &val), WHAL_EINVAL); } -static void test_gpio_null_driver(void) +static void Test_Gpio_NullDriver(void) { whal_Gpio dev = { .driver = NULL }; WHAL_ASSERT_EQ(whal_Gpio_Init(&dev), WHAL_EINVAL); } -static void test_gpio_valid_dispatch(void) +static void Test_Gpio_ValidDispatch(void) { whal_Gpio dev = { .driver = &mockGpioDriver }; WHAL_ASSERT_EQ(whal_Gpio_Init(&dev), WHAL_SUCCESS); @@ -154,7 +154,7 @@ static void test_gpio_valid_dispatch(void) /* --- UART dispatch tests --- */ -static void test_uart_null_dev(void) +static void Test_Uart_NullDev(void) { WHAL_ASSERT_EQ(whal_Uart_Init(NULL), WHAL_EINVAL); uint8_t buf[1]; @@ -162,13 +162,13 @@ static void test_uart_null_dev(void) WHAL_ASSERT_EQ(whal_Uart_Recv(NULL, buf, 1), WHAL_EINVAL); } -static void test_uart_null_driver(void) +static void Test_Uart_NullDriver(void) { whal_Uart dev = { .driver = NULL }; WHAL_ASSERT_EQ(whal_Uart_Init(&dev), WHAL_EINVAL); } -static void test_uart_valid_dispatch(void) +static void Test_Uart_ValidDispatch(void) { whal_Uart dev = { .driver = &mockUartDriver }; WHAL_ASSERT_EQ(whal_Uart_Init(&dev), WHAL_SUCCESS); @@ -179,7 +179,7 @@ static void test_uart_valid_dispatch(void) /* --- Flash dispatch tests --- */ -static void test_flash_null_dev(void) +static void Test_Flash_NullDev(void) { WHAL_ASSERT_EQ(whal_Flash_Init(NULL), WHAL_EINVAL); WHAL_ASSERT_EQ(whal_Flash_Lock(NULL, 0, 0), WHAL_EINVAL); @@ -190,13 +190,13 @@ static void test_flash_null_dev(void) WHAL_ASSERT_EQ(whal_Flash_Erase(NULL, 0, 1), WHAL_EINVAL); } -static void test_flash_null_driver(void) +static void Test_Flash_NullDriver(void) { whal_Flash dev = { .driver = NULL }; WHAL_ASSERT_EQ(whal_Flash_Init(&dev), WHAL_EINVAL); } -static void test_flash_valid_dispatch(void) +static void Test_Flash_ValidDispatch(void) { whal_Flash dev = { .driver = &mockFlashDriver }; WHAL_ASSERT_EQ(whal_Flash_Init(&dev), WHAL_SUCCESS); @@ -210,7 +210,7 @@ static void test_flash_valid_dispatch(void) /* --- Timer dispatch tests --- */ -static void test_timer_null_dev(void) +static void Test_Timer_NullDev(void) { WHAL_ASSERT_EQ(whal_Timer_Init(NULL), WHAL_EINVAL); WHAL_ASSERT_EQ(whal_Timer_Start(NULL), WHAL_EINVAL); @@ -218,13 +218,13 @@ static void test_timer_null_dev(void) WHAL_ASSERT_EQ(whal_Timer_Reset(NULL), WHAL_EINVAL); } -static void test_timer_null_driver(void) +static void Test_Timer_NullDriver(void) { whal_Timer dev = { .driver = NULL }; WHAL_ASSERT_EQ(whal_Timer_Init(&dev), WHAL_EINVAL); } -static void test_timer_valid_dispatch(void) +static void Test_Timer_ValidDispatch(void) { whal_Timer dev = { .driver = &mockTimerDriver }; WHAL_ASSERT_EQ(whal_Timer_Init(&dev), WHAL_SUCCESS); @@ -235,7 +235,7 @@ static void test_timer_valid_dispatch(void) /* --- RNG dispatch tests --- */ -static void test_rng_null_dev(void) +static void Test_Rng_NullDev(void) { uint8_t buf[1]; WHAL_ASSERT_EQ(whal_Rng_Init(NULL), WHAL_EINVAL); @@ -243,13 +243,13 @@ static void test_rng_null_dev(void) WHAL_ASSERT_EQ(whal_Rng_Generate(NULL, buf, 1), WHAL_EINVAL); } -static void test_rng_null_driver(void) +static void Test_Rng_NullDriver(void) { whal_Rng dev = { .driver = NULL }; WHAL_ASSERT_EQ(whal_Rng_Init(&dev), WHAL_EINVAL); } -static void test_rng_valid_dispatch(void) +static void Test_Rng_ValidDispatch(void) { whal_Rng dev = { .driver = &mockRngDriver }; WHAL_ASSERT_EQ(whal_Rng_Init(&dev), WHAL_SUCCESS); @@ -258,27 +258,27 @@ static void test_rng_valid_dispatch(void) WHAL_ASSERT_EQ(whal_Rng_Deinit(&dev), WHAL_SUCCESS); } -void test_dispatch(void) +void whal_Test_Dispatch(void) { WHAL_TEST_SUITE_START("dispatch"); - WHAL_TEST(test_clock_null_dev); - WHAL_TEST(test_clock_null_driver); - WHAL_TEST(test_clock_null_vtable_entry); - WHAL_TEST(test_clock_valid_dispatch); - WHAL_TEST(test_gpio_null_dev); - WHAL_TEST(test_gpio_null_driver); - WHAL_TEST(test_gpio_valid_dispatch); - WHAL_TEST(test_uart_null_dev); - WHAL_TEST(test_uart_null_driver); - WHAL_TEST(test_uart_valid_dispatch); - WHAL_TEST(test_flash_null_dev); - WHAL_TEST(test_flash_null_driver); - WHAL_TEST(test_flash_valid_dispatch); - WHAL_TEST(test_timer_null_dev); - WHAL_TEST(test_timer_null_driver); - WHAL_TEST(test_timer_valid_dispatch); - WHAL_TEST(test_rng_null_dev); - WHAL_TEST(test_rng_null_driver); - WHAL_TEST(test_rng_valid_dispatch); + WHAL_TEST(Test_Clock_NullDev); + WHAL_TEST(Test_Clock_NullDriver); + WHAL_TEST(Test_Clock_NullVtableEntry); + WHAL_TEST(Test_Clock_ValidDispatch); + WHAL_TEST(Test_Gpio_NullDev); + WHAL_TEST(Test_Gpio_NullDriver); + WHAL_TEST(Test_Gpio_ValidDispatch); + WHAL_TEST(Test_Uart_NullDev); + WHAL_TEST(Test_Uart_NullDriver); + WHAL_TEST(Test_Uart_ValidDispatch); + WHAL_TEST(Test_Flash_NullDev); + WHAL_TEST(Test_Flash_NullDriver); + WHAL_TEST(Test_Flash_ValidDispatch); + WHAL_TEST(Test_Timer_NullDev); + WHAL_TEST(Test_Timer_NullDriver); + WHAL_TEST(Test_Timer_ValidDispatch); + WHAL_TEST(Test_Rng_NullDev); + WHAL_TEST(Test_Rng_NullDriver); + WHAL_TEST(Test_Rng_ValidDispatch); WHAL_TEST_SUITE_END(); } diff --git a/tests/flash/test_flash.c b/tests/flash/test_flash.c new file mode 100644 index 0000000..48276e0 --- /dev/null +++ b/tests/flash/test_flash.c @@ -0,0 +1,61 @@ +#include +#include +#include "board.h" +#include "test.h" + +static void Test_Flash_EraseBlank(void) +{ + uint8_t readback[8] = {0}; + uint8_t erased[8] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; + + WHAL_ASSERT_EQ(whal_Flash_Unlock(&g_whalFlash, BOARD_FLASH_TEST_ADDR, BOARD_FLASH_SECTOR_SZ), WHAL_SUCCESS); + + WHAL_ASSERT_EQ(whal_Flash_Erase(&g_whalFlash, BOARD_FLASH_TEST_ADDR, + BOARD_FLASH_SECTOR_SZ), + WHAL_SUCCESS); + + + WHAL_ASSERT_EQ(whal_Flash_Read(&g_whalFlash, BOARD_FLASH_TEST_ADDR, + readback, sizeof(readback)), + WHAL_SUCCESS); + + WHAL_ASSERT_MEM_EQ(readback, erased, sizeof(erased)); + + WHAL_ASSERT_EQ(whal_Flash_Lock(&g_whalFlash, BOARD_FLASH_TEST_ADDR, BOARD_FLASH_SECTOR_SZ), WHAL_SUCCESS); +} + +static void Test_Flash_WriteRead(void) +{ + uint8_t pattern[] = "wolfHAL"; + uint8_t readback[sizeof(pattern)] = {0}; + + WHAL_ASSERT_EQ(whal_Flash_Unlock(&g_whalFlash, BOARD_FLASH_TEST_ADDR, BOARD_FLASH_SECTOR_SZ), WHAL_SUCCESS); + + WHAL_ASSERT_EQ(whal_Flash_Erase(&g_whalFlash, BOARD_FLASH_TEST_ADDR, + BOARD_FLASH_SECTOR_SZ), + WHAL_SUCCESS); + + whal_Error err; + do { + err = whal_Flash_Write(&g_whalFlash, BOARD_FLASH_TEST_ADDR, pattern, + sizeof(pattern)); + } while (err == WHAL_ENOTREADY); + WHAL_ASSERT_EQ(err, WHAL_SUCCESS); + + + WHAL_ASSERT_EQ(whal_Flash_Read(&g_whalFlash, BOARD_FLASH_TEST_ADDR, + readback, sizeof(readback)), + WHAL_SUCCESS); + + WHAL_ASSERT_MEM_EQ(pattern, readback, sizeof(pattern)); + + WHAL_ASSERT_EQ(whal_Flash_Lock(&g_whalFlash, BOARD_FLASH_TEST_ADDR, BOARD_FLASH_SECTOR_SZ), WHAL_SUCCESS); +} + +void whal_Test_Flash(void) +{ + WHAL_TEST_SUITE_START("flash"); + WHAL_TEST(Test_Flash_EraseBlank); + WHAL_TEST(Test_Flash_WriteRead); + WHAL_TEST_SUITE_END(); +} diff --git a/tests/flash/test_stm32wb_flash.c b/tests/flash/test_stm32wb_flash.c new file mode 100644 index 0000000..28cf2f1 --- /dev/null +++ b/tests/flash/test_stm32wb_flash.c @@ -0,0 +1,27 @@ +#include +#include +#include +#include +#include "board.h" +#include "test.h" + +/* Flash CR register offset and LOCK bit */ +#define FLASH_CR_REG 0x14 +#define FLASH_CR_LOCK_Pos 31 +#define FLASH_CR_LOCK_Msk (1UL << FLASH_CR_LOCK_Pos) + +static void Test_Flash_LockReadback(void) +{ + /* After locking, the CR.LOCK bit should be set */ + WHAL_ASSERT_EQ(whal_Flash_Lock(&g_whalFlash, 0, 0), WHAL_SUCCESS); + + size_t val = 0; + whal_Reg_Get(g_whalFlash.regmap.base, FLASH_CR_REG, + FLASH_CR_LOCK_Msk, FLASH_CR_LOCK_Pos, &val); + WHAL_ASSERT_EQ(val, 1); +} + +void whal_Test_Flash_Platform(void) +{ + WHAL_TEST(Test_Flash_LockReadback); +} diff --git a/tests/gpio/test_gpio.c b/tests/gpio/test_gpio.c new file mode 100644 index 0000000..7aa4581 --- /dev/null +++ b/tests/gpio/test_gpio.c @@ -0,0 +1,25 @@ +#include +#include "board.h" +#include "test.h" + +static void Test_Gpio_SetGetHighLow(void) +{ + size_t val = 0; + + /* Set high and verify */ + WHAL_ASSERT_EQ(whal_Gpio_Set(&g_whalGpio, BOARD_LED_PIN, 1), WHAL_SUCCESS); + WHAL_ASSERT_EQ(whal_Gpio_Get(&g_whalGpio, BOARD_LED_PIN, &val), WHAL_SUCCESS); + WHAL_ASSERT_EQ(val, 1); + + /* Set low and verify */ + WHAL_ASSERT_EQ(whal_Gpio_Set(&g_whalGpio, BOARD_LED_PIN, 0), WHAL_SUCCESS); + WHAL_ASSERT_EQ(whal_Gpio_Get(&g_whalGpio, BOARD_LED_PIN, &val), WHAL_SUCCESS); + WHAL_ASSERT_EQ(val, 0); +} + +void whal_Test_Gpio(void) +{ + WHAL_TEST_SUITE_START("gpio"); + WHAL_TEST(Test_Gpio_SetGetHighLow); + WHAL_TEST_SUITE_END(); +} diff --git a/tests/pic32cz/test_gpio.c b/tests/gpio/test_pic32cz_gpio.c similarity index 62% rename from tests/pic32cz/test_gpio.c rename to tests/gpio/test_pic32cz_gpio.c index d4661e7..f86aebd 100644 --- a/tests/pic32cz/test_gpio.c +++ b/tests/gpio/test_pic32cz_gpio.c @@ -1,15 +1,8 @@ #include #include #include -#include "pic32cz_curiosity_ultra.h" -#include "../test.h" - -/* Pin indices matching board config pin table */ -enum { - LED_PIN, - UART_TX_PIN, - UART_RX_PIN, -}; +#include "board.h" +#include "test.h" /* * PIC32CZ PORT register offsets. @@ -22,7 +15,7 @@ enum { #define LED_PORT 1 #define LED_HW_PIN 21 -static void test_gpio_dir_register(void) +static void Test_Gpio_DirRegister(void) { /* PB21 should be configured as output (bit 21 set in DIR register) */ size_t val = 0; @@ -31,9 +24,9 @@ static void test_gpio_dir_register(void) WHAL_ASSERT_EQ(val, 1); } -static void test_gpio_set_high(void) +static void Test_Gpio_SetHighReg(void) { - WHAL_ASSERT_EQ(whal_Gpio_Set(&g_whalGpio, LED_PIN, 1), WHAL_SUCCESS); + WHAL_ASSERT_EQ(whal_Gpio_Set(&g_whalGpio, BOARD_LED_PIN, 1), WHAL_SUCCESS); /* Readback OUT register bit 21 */ size_t val = 0; @@ -42,9 +35,9 @@ static void test_gpio_set_high(void) WHAL_ASSERT_EQ(val, 1); } -static void test_gpio_set_low(void) +static void Test_Gpio_SetLowReg(void) { - WHAL_ASSERT_EQ(whal_Gpio_Set(&g_whalGpio, LED_PIN, 0), WHAL_SUCCESS); + WHAL_ASSERT_EQ(whal_Gpio_Set(&g_whalGpio, BOARD_LED_PIN, 0), WHAL_SUCCESS); size_t val = 0; whal_Reg_Get(g_whalGpio.regmap.base, PORT_OUT_REG(LED_PORT), @@ -52,11 +45,9 @@ static void test_gpio_set_low(void) WHAL_ASSERT_EQ(val, 0); } -void test_gpio(void) +void whal_Test_Gpio_Platform(void) { - WHAL_TEST_SUITE_START("gpio"); - WHAL_TEST(test_gpio_dir_register); - WHAL_TEST(test_gpio_set_high); - WHAL_TEST(test_gpio_set_low); - WHAL_TEST_SUITE_END(); + WHAL_TEST(Test_Gpio_DirRegister); + WHAL_TEST(Test_Gpio_SetHighReg); + WHAL_TEST(Test_Gpio_SetLowReg); } diff --git a/tests/stm32wb/test_gpio.c b/tests/gpio/test_stm32wb_gpio.c similarity index 66% rename from tests/stm32wb/test_gpio.c rename to tests/gpio/test_stm32wb_gpio.c index f98c43c..a5f7a9f 100644 --- a/tests/stm32wb/test_gpio.c +++ b/tests/gpio/test_stm32wb_gpio.c @@ -1,8 +1,8 @@ #include #include #include -#include "stm32wb55xx_nucleo.h" -#include "../test.h" +#include "board.h" +#include "test.h" /* * GPIO register offsets (GPIOB port base = GPIO base + 0x400) @@ -12,7 +12,7 @@ #define GPIOx_MODE_REG 0x00 #define GPIOx_ODR_REG 0x14 -static void test_gpio_mode_register(void) +static void Test_Gpio_ModeRegister(void) { /* PB5 should be configured as output (mode = 0x01) in bits [11:10] */ size_t portBase = g_whalGpio.regmap.base + GPIOB_BASE_OFFSET; @@ -23,9 +23,9 @@ static void test_gpio_mode_register(void) WHAL_ASSERT_EQ(val, WHAL_STM32WB_GPIO_MODE_OUT); } -static void test_gpio_set_high(void) +static void Test_Gpio_SetHighReg(void) { - WHAL_ASSERT_EQ(whal_Gpio_Set(&g_whalGpio, LED_PIN, 1), WHAL_SUCCESS); + WHAL_ASSERT_EQ(whal_Gpio_Set(&g_whalGpio, BOARD_LED_PIN, 1), WHAL_SUCCESS); /* Readback ODR bit 5 */ size_t portBase = g_whalGpio.regmap.base + GPIOB_BASE_OFFSET; @@ -34,9 +34,9 @@ static void test_gpio_set_high(void) WHAL_ASSERT_EQ(val, 1); } -static void test_gpio_set_low(void) +static void Test_Gpio_SetLowReg(void) { - WHAL_ASSERT_EQ(whal_Gpio_Set(&g_whalGpio, LED_PIN, 0), WHAL_SUCCESS); + WHAL_ASSERT_EQ(whal_Gpio_Set(&g_whalGpio, BOARD_LED_PIN, 0), WHAL_SUCCESS); size_t portBase = g_whalGpio.regmap.base + GPIOB_BASE_OFFSET; size_t val = 0; @@ -44,11 +44,9 @@ static void test_gpio_set_low(void) WHAL_ASSERT_EQ(val, 0); } -void test_gpio(void) +void whal_Test_Gpio_Platform(void) { - WHAL_TEST_SUITE_START("gpio"); - WHAL_TEST(test_gpio_mode_register); - WHAL_TEST(test_gpio_set_high); - WHAL_TEST(test_gpio_set_low); - WHAL_TEST_SUITE_END(); + WHAL_TEST(Test_Gpio_ModeRegister); + WHAL_TEST(Test_Gpio_SetHighReg); + WHAL_TEST(Test_Gpio_SetLowReg); } diff --git a/tests/main.c b/tests/main.c new file mode 100644 index 0000000..4dc44ab --- /dev/null +++ b/tests/main.c @@ -0,0 +1,111 @@ +#include +#include +#include "board.h" +#include "test.h" + +#ifdef WHAL_TEST_ENABLE_CLOCK +void whal_Test_Clock(void); +#ifdef WHAL_TEST_ENABLE_CLOCK_PLATFORM +void whal_Test_Clock_Platform(void); +#endif +#endif + +#ifdef WHAL_TEST_ENABLE_GPIO +void whal_Test_Gpio(void); +#ifdef WHAL_TEST_ENABLE_GPIO_PLATFORM +void whal_Test_Gpio_Platform(void); +#endif +#endif + +#ifdef WHAL_TEST_ENABLE_FLASH +void whal_Test_Flash(void); +#ifdef WHAL_TEST_ENABLE_FLASH_PLATFORM +void whal_Test_Flash_Platform(void); +#endif +#endif + +#ifdef WHAL_TEST_ENABLE_TIMER +void whal_Test_Timer(void); +#endif + +#ifdef WHAL_TEST_ENABLE_RNG +void whal_Test_Rng(void); +#ifdef WHAL_TEST_ENABLE_RNG_PLATFORM +void whal_Test_Rng_Platform(void); +#endif +#endif + +int g_whalTestPassed; +int g_whalTestFailed; +int g_whalTestCurFailed; + +void whal_Test_Puts(const char *s) +{ + while (*s) { + if (*s == '\n') + whal_Uart_Send(&g_whalUart, (const uint8_t *)"\r\n", 2); + else + whal_Uart_Send(&g_whalUart, (const uint8_t *)s, 1); + s++; + } +} + +void main(void) +{ + g_whalTestPassed = 0; + g_whalTestFailed = 0; + + if (Board_Init() != WHAL_SUCCESS) + while (1); + + whal_Gpio_Set(&g_whalGpio, BOARD_LED_PIN, 1); + + whal_Test_Printf("wolfHAL HW Test Suite\n"); + whal_Test_Printf("=====================\n"); + +#ifdef WHAL_TEST_ENABLE_CLOCK + whal_Test_Clock(); +#ifdef WHAL_TEST_ENABLE_CLOCK_PLATFORM + whal_Test_Clock_Platform(); +#endif +#endif + +#ifdef WHAL_TEST_ENABLE_GPIO + whal_Test_Gpio(); +#ifdef WHAL_TEST_ENABLE_GPIO_PLATFORM + whal_Test_Gpio_Platform(); +#endif +#endif + +#ifdef WHAL_TEST_ENABLE_FLASH + whal_Test_Flash(); +#ifdef WHAL_TEST_ENABLE_FLASH_PLATFORM + whal_Test_Flash_Platform(); +#endif +#endif + +#ifdef WHAL_TEST_ENABLE_TIMER + whal_Test_Timer(); +#endif + +#ifdef WHAL_TEST_ENABLE_RNG + whal_Test_Rng(); +#ifdef WHAL_TEST_ENABLE_RNG_PLATFORM + whal_Test_Rng_Platform(); +#endif +#endif + + WHAL_TEST_SUMMARY(); + + if (g_whalTestFailed == 0) { + whal_Gpio_Set(&g_whalGpio, BOARD_LED_PIN, 1); + while (1); + } + + while (1) { + whal_Gpio_Set(&g_whalGpio, BOARD_LED_PIN, 1); + Board_WaitMs(100); + whal_Gpio_Set(&g_whalGpio, BOARD_LED_PIN, 0); + Board_WaitMs(100); + } +} diff --git a/tests/pic32cz/Makefile b/tests/pic32cz/Makefile deleted file mode 100644 index 5719913..0000000 --- a/tests/pic32cz/Makefile +++ /dev/null @@ -1,52 +0,0 @@ -WHAL_DIR = $(PWD)/../../ -EXAMPLE_DIR = $(WHAL_DIR)/examples/pic32cz - -INCLUDE = -I$(WHAL_DIR) -I$(EXAMPLE_DIR) -CFLAGS = -Wall -Werror $(INCLUDE) -g3 \ - -ffreestanding -nostdlib -mcpu=cortex-m7 \ - -MMD -MF $(DEPDIR)/$*.d -LDFLAGS = -static - -DEPDIR = .deps/ - -# Test sources -TEST_SRC = test_main.c test_clock.c test_gpio.c test_flash.c test_timer.c - -# Board config and IVT from the example -BOARD_SRC = $(EXAMPLE_DIR)/pic32cz_curiosity_ultra.c \ - $(EXAMPLE_DIR)/ivt.c - -# All wolfHAL sources (generic + platform drivers) -WHAL_SRC = $(wildcard $(WHAL_DIR)/src/*.c) \ - $(wildcard $(WHAL_DIR)/src/*/*.c) - -SOURCE = $(TEST_SRC) $(BOARD_SRC) $(WHAL_SRC) -OBJECTS = $(patsubst %.c,%.o,$(SOURCE)) -DEPENDS = $(patsubst %.c,$(DEPDIR)/%.d,$(SOURCE)) - -GCC = $(GCC_PATH)arm-none-eabi-gcc -LD = $(GCC_PATH)arm-none-eabi-ld -OBJCOPY = $(GCC_PATH)arm-none-eabi-objcopy - -LINKER_SCRIPT = $(EXAMPLE_DIR)/linker.ld - -all: test_hw.bin - -%.d: - @mkdir -p $(@D) - -%.o: %.c Makefile - $(GCC) $(CFLAGS) -c -o $@ $< - -.SECONDARY: -%.elf: $(OBJECTS) $(LINKER_SCRIPT) - $(LD) $(LDFLAGS) -T $(LINKER_SCRIPT) -o $@ $(OBJECTS) - -%.bin: %.elf - $(OBJCOPY) $^ -O binary $@ - -.PHONY: clean -clean: - rm -rf $(DEPDIR) $(OBJECTS) test_hw.bin test_hw.elf - --include $(DEPENDS) diff --git a/tests/pic32cz/test_flash.c b/tests/pic32cz/test_flash.c deleted file mode 100644 index 85903fe..0000000 --- a/tests/pic32cz/test_flash.c +++ /dev/null @@ -1,57 +0,0 @@ -#include -#include -#include -#include -#include "pic32cz_curiosity_ultra.h" -#include "../test.h" - -/* Test address in PFM (Program Flash Memory) data area */ -#define TEST_FLASH_ADDR 0x0C000000 -#define TEST_FLASH_SIZE 0x1000 - -static void test_flash_write_read(void) -{ - uint8_t pattern[] = "wolfHAL"; /* 8 bytes, double-word aligned */ - uint8_t readback[sizeof(pattern)] = {0}; - - WHAL_ASSERT_EQ(whal_Flash_Erase(&g_whalFlash, TEST_FLASH_ADDR, - TEST_FLASH_SIZE), - WHAL_SUCCESS); - - whal_Error err; - do { - err = whal_Flash_Write(&g_whalFlash, TEST_FLASH_ADDR, pattern, - sizeof(pattern)); - } while (err == WHAL_ENOTREADY); - WHAL_ASSERT_EQ(err, WHAL_SUCCESS); - - WHAL_ASSERT_EQ(whal_Flash_Read(&g_whalFlash, TEST_FLASH_ADDR, readback, - sizeof(readback)), - WHAL_SUCCESS); - - WHAL_ASSERT_MEM_EQ(pattern, readback, sizeof(pattern)); -} - -static void test_flash_erase_blank(void) -{ - uint8_t readback[8] = {0}; - uint8_t erased[8] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; - - WHAL_ASSERT_EQ(whal_Flash_Erase(&g_whalFlash, TEST_FLASH_ADDR, - TEST_FLASH_SIZE), - WHAL_SUCCESS); - - WHAL_ASSERT_EQ(whal_Flash_Read(&g_whalFlash, TEST_FLASH_ADDR, readback, - sizeof(readback)), - WHAL_SUCCESS); - - WHAL_ASSERT_MEM_EQ(readback, erased, sizeof(erased)); -} - -void test_flash(void) -{ - WHAL_TEST_SUITE_START("flash"); - WHAL_TEST(test_flash_erase_blank); - WHAL_TEST(test_flash_write_read); - WHAL_TEST_SUITE_END(); -} diff --git a/tests/pic32cz/test_main.c b/tests/pic32cz/test_main.c deleted file mode 100644 index e1d1149..0000000 --- a/tests/pic32cz/test_main.c +++ /dev/null @@ -1,112 +0,0 @@ -#include -#include -#include -#include -#include "pic32cz_curiosity_ultra.h" -#include "../test.h" - -/* Pin indices matching board config pin table */ -enum { - LED_PIN, - UART_TX_PIN, - UART_RX_PIN, -}; - -int g_whalTestPassed; -int g_whalTestFailed; -int g_whalTestCurFailed; - -volatile size_t g_tick = 0; - -void SysTick_Handler(void) -{ - g_tick++; -} - -/* whalTest_Puts: send a string over UART, translating \n to \r\n */ -void whalTest_Puts(const char *s) -{ - while (*s) { - if (*s == '\n') - whal_Uart_Send(&g_whalUart, (const uint8_t *)"\r\n", 2); - else - whal_Uart_Send(&g_whalUart, (const uint8_t *)s, 1); - s++; - } -} - -/* Busy-wait delay using SysTick */ -static void delay_ms(size_t ms) -{ - size_t start = g_tick; - while (g_tick - start < ms) - ; -} - -void test_clock(void); -void test_gpio(void); -void test_flash(void); -void test_timer(void); - -void main(void) -{ - whal_Error err; - - g_whalTestPassed = 0; - g_whalTestFailed = 0; - - /* Bootstrap: clock -> GPIO -> UART -> flash -> timer */ - err = whal_Clock_Init(&g_whalClock); - if (err) - goto fail; - - err = whal_Gpio_Init(&g_whalGpio); - if (err) - goto fail; - - /* LED on to indicate boot */ - whal_Gpio_Set(&g_whalGpio, LED_PIN, 1); - - err = whal_Uart_Init(&g_whalUart); - if (err) - goto fail; - - err = whal_Flash_Init(&g_whalFlash); - if (err) - goto fail; - - err = whal_Timer_Init(&g_whalTimer); - if (err) - goto fail; - - err = whal_Timer_Start(&g_whalTimer); - if (err) - goto fail; - - whalTest_Printf("wolfHAL HW Test Suite (PIC32CZ)\n"); - whalTest_Printf("===============================\n"); - - /* Run test suites */ - test_clock(); - test_gpio(); - test_flash(); - test_timer(); - - WHAL_TEST_SUMMARY(); - - /* Visual indication: solid LED = all pass, blink = failure */ - if (g_whalTestFailed == 0) { - whal_Gpio_Set(&g_whalGpio, LED_PIN, 1); - while (1) - ; - } - -fail: - /* Rapid blink = failure */ - while (1) { - whal_Gpio_Set(&g_whalGpio, LED_PIN, 1); - delay_ms(100); - whal_Gpio_Set(&g_whalGpio, LED_PIN, 0); - delay_ms(100); - } -} diff --git a/tests/rng/test_rng.c b/tests/rng/test_rng.c new file mode 100644 index 0000000..03076e3 --- /dev/null +++ b/tests/rng/test_rng.c @@ -0,0 +1,49 @@ +#include +#include +#include "board.h" +#include "test.h" + +static void Test_Rng_GenerateNonzero(void) +{ + uint8_t buf[32] = {0}; + int allZero = 1; + + WHAL_ASSERT_EQ(whal_Rng_Generate(&g_whalRng, buf, sizeof(buf)), WHAL_SUCCESS); + + for (size_t i = 0; i < sizeof(buf); i++) { + if (buf[i] != 0) { + allZero = 0; + break; + } + } + + WHAL_ASSERT_EQ(allZero, 0); +} + +static void Test_Rng_GenerateUnique(void) +{ + uint8_t buf1[16] = {0}; + uint8_t buf2[16] = {0}; + int same = 1; + + WHAL_ASSERT_EQ(whal_Rng_Generate(&g_whalRng, buf1, sizeof(buf1)), WHAL_SUCCESS); + WHAL_ASSERT_EQ(whal_Rng_Generate(&g_whalRng, buf2, sizeof(buf2)), WHAL_SUCCESS); + + for (size_t i = 0; i < sizeof(buf1); i++) { + if (buf1[i] != buf2[i]) { + same = 0; + break; + } + } + + /* Two consecutive 16-byte outputs should differ */ + WHAL_ASSERT_EQ(same, 0); +} + +void whal_Test_Rng(void) +{ + WHAL_TEST_SUITE_START("rng"); + WHAL_TEST(Test_Rng_GenerateNonzero); + WHAL_TEST(Test_Rng_GenerateUnique); + WHAL_TEST_SUITE_END(); +} diff --git a/tests/stm32wb/Makefile b/tests/stm32wb/Makefile deleted file mode 100644 index b6e8b21..0000000 --- a/tests/stm32wb/Makefile +++ /dev/null @@ -1,52 +0,0 @@ -WHAL_DIR = $(PWD)/../../ -EXAMPLE_DIR = $(WHAL_DIR)/examples/stm32wb - -INCLUDE = -I$(WHAL_DIR) -I$(EXAMPLE_DIR) -CFLAGS = -Wall -Werror $(INCLUDE) -g3 \ - -ffreestanding -nostdlib -mcpu=cortex-m4 \ - -MMD -MF $(DEPDIR)/$*.d -LDFLAGS = --omagic -static - -DEPDIR = .deps/ - -# Test sources -TEST_SRC = test_main.c test_clock.c test_gpio.c test_flash.c test_timer.c test_rng.c - -# Board config and IVT from the example -BOARD_SRC = $(EXAMPLE_DIR)/stm32wb55xx_nucleo.c \ - $(EXAMPLE_DIR)/ivt.c - -# All wolfHAL sources (generic + platform drivers) -WHAL_SRC = $(wildcard $(WHAL_DIR)/src/*.c) \ - $(wildcard $(WHAL_DIR)/src/*/*.c) - -SOURCE = $(TEST_SRC) $(BOARD_SRC) $(WHAL_SRC) -OBJECTS = $(patsubst %.c,%.o,$(SOURCE)) -DEPENDS = $(patsubst %.c,$(DEPDIR)/%.d,$(SOURCE)) - -GCC = $(GCC_PATH)arm-none-eabi-gcc -LD = $(GCC_PATH)arm-none-eabi-ld -OBJCOPY = $(GCC_PATH)arm-none-eabi-objcopy - -LINKER_SCRIPT = $(EXAMPLE_DIR)/linker.ld - -all: test_hw.bin - -%.d: - @mkdir -p $(@D) - -%.o: %.c Makefile - $(GCC) $(CFLAGS) -c -o $@ $< - -.SECONDARY: -%.elf: $(OBJECTS) $(LINKER_SCRIPT) - $(LD) $(LDFLAGS) -T $(LINKER_SCRIPT) -o $@ $(OBJECTS) - -%.bin: %.elf - $(OBJCOPY) $^ -O binary $@ - -.PHONY: clean -clean: - rm -rf $(DEPDIR) $(OBJECTS) test_hw.bin test_hw.elf - --include $(DEPENDS) diff --git a/tests/stm32wb/test_flash.c b/tests/stm32wb/test_flash.c deleted file mode 100644 index 588063c..0000000 --- a/tests/stm32wb/test_flash.c +++ /dev/null @@ -1,59 +0,0 @@ -#include -#include -#include -#include -#include "stm32wb55xx_nucleo.h" -#include "../test.h" - -/* Flash CR register offset and LOCK bit */ -#define FLASH_CR_REG 0x14 -#define FLASH_CR_LOCK_Pos 31 -#define FLASH_CR_LOCK_Msk (1UL << FLASH_CR_LOCK_Pos) - -/* Test address in the data flash area (OTP/data, not code flash) */ -#define TEST_FLASH_ADDR 0x08080000 -#define TEST_FLASH_SIZE 0x1000 - -static void test_flash_write_read(void) -{ - uint8_t pattern[] = "wolfHAL TEST"; - uint8_t readback[sizeof(pattern)] = {0}; - - WHAL_ASSERT_EQ(whal_Flash_Unlock(&g_whalFlash, 0, 0), WHAL_SUCCESS); - - WHAL_ASSERT_EQ(whal_Flash_Erase(&g_whalFlash, TEST_FLASH_ADDR, TEST_FLASH_SIZE), - WHAL_SUCCESS); - - whal_Error err; - do { - err = whal_Flash_Write(&g_whalFlash, TEST_FLASH_ADDR, pattern, - sizeof(pattern)); - } while (err == WHAL_ENOTREADY); - WHAL_ASSERT_EQ(err, WHAL_SUCCESS); - - WHAL_ASSERT_EQ(whal_Flash_Read(&g_whalFlash, TEST_FLASH_ADDR, readback, - sizeof(readback)), - WHAL_SUCCESS); - - WHAL_ASSERT_MEM_EQ(pattern, readback, sizeof(pattern)); - - WHAL_ASSERT_EQ(whal_Flash_Lock(&g_whalFlash, 0, 0), WHAL_SUCCESS); -} - -static void test_flash_lock_readback(void) -{ - /* After locking, the CR.LOCK bit should be set */ - WHAL_ASSERT_EQ(whal_Flash_Lock(&g_whalFlash, 0, 0), WHAL_SUCCESS); - - size_t val = 0; - whal_Reg_Get(g_whalFlash.regmap.base, FLASH_CR_REG, FLASH_CR_LOCK_Msk, FLASH_CR_LOCK_Pos, &val); - WHAL_ASSERT_EQ(val, 1); -} - -void test_flash(void) -{ - WHAL_TEST_SUITE_START("flash"); - WHAL_TEST(test_flash_write_read); - WHAL_TEST(test_flash_lock_readback); - WHAL_TEST_SUITE_END(); -} diff --git a/tests/stm32wb/test_main.c b/tests/stm32wb/test_main.c deleted file mode 100644 index f9d20d0..0000000 --- a/tests/stm32wb/test_main.c +++ /dev/null @@ -1,107 +0,0 @@ -#include -#include -#include -#include -#include "stm32wb55xx_nucleo.h" -#include "../test.h" - -int g_whalTestPassed; -int g_whalTestFailed; -int g_whalTestCurFailed; - -volatile size_t g_tick = 0; - -void SysTick_Handler(void) -{ - g_tick++; -} - -/* whalTest_Puts: send a string over UART, translating \n to \r\n */ -void whalTest_Puts(const char *s) -{ - while (*s) { - if (*s == '\n') - whal_Uart_Send(&g_whalUart, (const uint8_t *)"\r\n", 2); - else - whal_Uart_Send(&g_whalUart, (const uint8_t *)s, 1); - s++; - } -} - -/* Busy-wait delay using SysTick */ -static void delay_ms(size_t ms) -{ - size_t start = g_tick; - while (g_tick - start < ms) - ; -} - -void test_clock(void); -void test_gpio(void); -void test_flash(void); -void test_timer(void); -void test_rng(void); - -void main(void) -{ - whal_Error err; - - g_whalTestPassed = 0; - g_whalTestFailed = 0; - - /* Bootstrap: clock -> GPIO -> UART -> timer */ - err = whal_Clock_Init(&g_whalClock); - if (err) - goto fail; - - err = whal_Gpio_Init(&g_whalGpio); - if (err) - goto fail; - - /* LED on to indicate boot */ - whal_Gpio_Set(&g_whalGpio, LED_PIN, 1); - - err = whal_Uart_Init(&g_whalUart); - if (err) - goto fail; - - err = whal_Flash_Init(&g_whalFlash); - if (err) - goto fail; - - err = whal_Timer_Init(&g_whalTimer); - if (err) - goto fail; - - err = whal_Timer_Start(&g_whalTimer); - if (err) - goto fail; - - whalTest_Printf("wolfHAL HW Test Suite\n"); - whalTest_Printf("=====================\n"); - - /* Run test suites */ - test_clock(); - test_gpio(); - test_flash(); - test_timer(); - test_rng(); - - WHAL_TEST_SUMMARY(); - - /* Visual indication: solid LED = all pass, blink = failure */ - if (g_whalTestFailed == 0) { - whal_Gpio_Set(&g_whalGpio, LED_PIN, 1); - while (1) - ; - } - -fail: - /* Rapid blink = failure */ - while (1) { - whal_Gpio_Set(&g_whalGpio, LED_PIN, 1); - delay_ms(100); - whal_Gpio_Set(&g_whalGpio, LED_PIN, 0); - delay_ms(100); - } -} diff --git a/tests/stm32wb/test_rng.c b/tests/stm32wb/test_rng.c deleted file mode 100644 index fed0a36..0000000 --- a/tests/stm32wb/test_rng.c +++ /dev/null @@ -1,68 +0,0 @@ -#include -#include -#include -#include -#include -#include "stm32wb55xx_nucleo.h" -#include "../test.h" - -static void test_rng_init_deinit(void) -{ - WHAL_ASSERT_EQ(whal_Rng_Init(&g_whalRng), WHAL_SUCCESS); - WHAL_ASSERT_EQ(whal_Rng_Deinit(&g_whalRng), WHAL_SUCCESS); -} - -static void test_rng_generate_nonzero(void) -{ - uint8_t buf[16] = {0}; - int allZero = 1; - - whal_Stm32wbRcc_Ext_EnableHsi48(&g_whalClock, 1); - WHAL_ASSERT_EQ(whal_Rng_Init(&g_whalRng), WHAL_SUCCESS); - WHAL_ASSERT_EQ(whal_Rng_Generate(&g_whalRng, buf, sizeof(buf)), WHAL_SUCCESS); - WHAL_ASSERT_EQ(whal_Rng_Deinit(&g_whalRng), WHAL_SUCCESS); - whal_Stm32wbRcc_Ext_EnableHsi48(&g_whalClock, 0); - - for (size_t i = 0; i < sizeof(buf); i++) { - if (buf[i] != 0) { - allZero = 0; - break; - } - } - - /* 16 zero bytes from a TRNG is astronomically unlikely */ - WHAL_ASSERT_EQ(allZero, 0); -} - -static void test_rng_generate_unique(void) -{ - uint8_t buf1[16] = {0}; - uint8_t buf2[16] = {0}; - int same = 1; - - whal_Stm32wbRcc_Ext_EnableHsi48(&g_whalClock, 1); - WHAL_ASSERT_EQ(whal_Rng_Init(&g_whalRng), WHAL_SUCCESS); - WHAL_ASSERT_EQ(whal_Rng_Generate(&g_whalRng, buf1, sizeof(buf1)), WHAL_SUCCESS); - WHAL_ASSERT_EQ(whal_Rng_Generate(&g_whalRng, buf2, sizeof(buf2)), WHAL_SUCCESS); - WHAL_ASSERT_EQ(whal_Rng_Deinit(&g_whalRng), WHAL_SUCCESS); - whal_Stm32wbRcc_Ext_EnableHsi48(&g_whalClock, 0); - - for (size_t i = 0; i < sizeof(buf1); i++) { - if (buf1[i] != buf2[i]) { - same = 0; - break; - } - } - - /* Two consecutive 16-byte outputs should differ */ - WHAL_ASSERT_EQ(same, 0); -} - -void test_rng(void) -{ - WHAL_TEST_SUITE_START("rng"); - WHAL_TEST(test_rng_init_deinit); - WHAL_TEST(test_rng_generate_nonzero); - WHAL_TEST(test_rng_generate_unique); - WHAL_TEST_SUITE_END(); -} diff --git a/tests/stm32wb/test_timer.c b/tests/stm32wb/test_timer.c deleted file mode 100644 index 3bb1803..0000000 --- a/tests/stm32wb/test_timer.c +++ /dev/null @@ -1,32 +0,0 @@ -#include -#include -#include -#include "stm32wb55xx_nucleo.h" -#include "../test.h" - -/* Tick counter incremented by SysTick_Handler in test_main.c */ -extern volatile size_t g_tick; - -static void test_timer_ticks_advance(void) -{ - size_t before = g_tick; - - /* Spin for ~100ms worth of ticks. At 1ms/tick this should yield ~100. */ - volatile size_t spin = 0; - while (g_tick - before < 100) { - spin++; - } - - size_t elapsed = g_tick - before; - - /* Allow some tolerance — at least 100 ticks should have passed */ - WHAL_ASSERT_NEQ(elapsed, 0); - WHAL_ASSERT_EQ(elapsed >= 100, 1); -} - -void test_timer(void) -{ - WHAL_TEST_SUITE_START("timer"); - WHAL_TEST(test_timer_ticks_advance); - WHAL_TEST_SUITE_END(); -} diff --git a/tests/test.h b/tests/test.h index 72b93d6..1d5b794 100644 --- a/tests/test.h +++ b/tests/test.h @@ -8,16 +8,16 @@ * Minimal test framework for wolfHAL. * * Provides test runner macros, assertions, and pass/fail tracking. - * The print backend (whalTest_Puts) is implemented per-harness: - * - sim: libc puts + * The print backend (whal_Test_Puts) is implemented per-harness: + * - core: libc puts * - hw: UART send */ /* Provided by each harness */ -void whalTest_Puts(const char *s); +void whal_Test_Puts(const char *s); /* Convert an integer to decimal in a static buffer (no libc dependency) */ -static inline const char *whalTest_Itoa(int val) +static inline const char *whal_Test_Itoa(int val) { static char buf[16]; char *p = buf + sizeof(buf) - 1; @@ -40,8 +40,8 @@ static inline const char *whalTest_Itoa(int val) return p; } -/* Minimal printf: supports %d, %s, and %%. Calls whalTest_Puts once. */ -static inline void whalTest_Printf(const char *fmt, ...) +/* Minimal printf: supports %d, %s, and %%. Calls whal_Test_Puts once. */ +static inline void whal_Test_Printf(const char *fmt, ...) { static char buf[128]; char *out = buf; @@ -56,7 +56,7 @@ static inline void whalTest_Printf(const char *fmt, ...) } fmt++; if (*fmt == 'd') { - const char *s = whalTest_Itoa(va_arg(ap, int)); + const char *s = whal_Test_Itoa(va_arg(ap, int)); while (*s && out < end) *out++ = *s++; } @@ -73,7 +73,7 @@ static inline void whalTest_Printf(const char *fmt, ...) va_end(ap); *out = '\0'; - whalTest_Puts(buf); + whal_Test_Puts(buf); } extern int g_whalTestPassed; @@ -82,7 +82,7 @@ extern int g_whalTestCurFailed; #define WHAL_TEST_SUITE_START(name) \ do { \ - whalTest_Printf("\n=== " name " ===\n"); \ + whal_Test_Printf("\n=== " name " ===\n"); \ } while (0) #define WHAL_TEST_SUITE_END() \ @@ -93,11 +93,11 @@ extern int g_whalTestCurFailed; g_whalTestCurFailed = 0; \ fn(); \ if (g_whalTestCurFailed) { \ - whalTest_Printf(#fn ": FAIL\n"); \ + whal_Test_Printf(#fn ": FAIL\n"); \ g_whalTestFailed++; \ } \ else { \ - whalTest_Printf(#fn ": PASS\n"); \ + whal_Test_Printf(#fn ": PASS\n"); \ g_whalTestPassed++; \ } \ } while (0) @@ -105,8 +105,8 @@ extern int g_whalTestCurFailed; #define WHAL_ASSERT_EQ(a, b) \ do { \ if ((a) != (b)) { \ - whalTest_Printf(" ASSERT_EQ failed at line %d\n", __LINE__); \ - whalTest_Printf(" got: %d, expected: %d\n", \ + whal_Test_Printf(" ASSERT_EQ failed at line %d\n", __LINE__); \ + whal_Test_Printf(" got: %d, expected: %d\n", \ (int)(a), (int)(b)); \ g_whalTestCurFailed = 1; \ return; \ @@ -116,7 +116,7 @@ extern int g_whalTestCurFailed; #define WHAL_ASSERT_NEQ(a, b) \ do { \ if ((a) == (b)) { \ - whalTest_Printf(" ASSERT_NEQ failed at line %d\n", __LINE__);\ + whal_Test_Printf(" ASSERT_NEQ failed at line %d\n", __LINE__);\ g_whalTestCurFailed = 1; \ return; \ } \ @@ -128,7 +128,7 @@ extern int g_whalTestCurFailed; const unsigned char *_b = (const unsigned char *)(b); \ for (size_t _i = 0; _i < (len); _i++) { \ if (_a[_i] != _b[_i]) { \ - whalTest_Printf(" ASSERT_MEM_EQ failed at line %d, " \ + whal_Test_Printf(" ASSERT_MEM_EQ failed at line %d, " \ "byte offset: %d\n", __LINE__, (int)_i); \ g_whalTestCurFailed = 1; \ return; \ @@ -138,10 +138,10 @@ extern int g_whalTestCurFailed; #define WHAL_TEST_SUMMARY() \ do { \ - whalTest_Printf("\n"); \ - whalTest_Printf("--- Results ---\n"); \ - whalTest_Printf("Passed: %d\n", g_whalTestPassed); \ - whalTest_Printf("Failed: %d\n", g_whalTestFailed); \ + whal_Test_Printf("\n"); \ + whal_Test_Printf("--- Results ---\n"); \ + whal_Test_Printf("Passed: %d\n", g_whalTestPassed); \ + whal_Test_Printf("Failed: %d\n", g_whalTestFailed); \ } while (0) #endif /* WHAL_TEST_H */ diff --git a/tests/pic32cz/test_timer.c b/tests/timer/test_timer.c similarity index 66% rename from tests/pic32cz/test_timer.c rename to tests/timer/test_timer.c index d6251a3..d24152d 100644 --- a/tests/pic32cz/test_timer.c +++ b/tests/timer/test_timer.c @@ -1,13 +1,10 @@ #include #include #include -#include "pic32cz_curiosity_ultra.h" -#include "../test.h" +#include "board.h" +#include "test.h" -/* Tick counter incremented by SysTick_Handler in test_main.c */ -extern volatile size_t g_tick; - -static void test_timer_ticks_advance(void) +static void Test_Timer_TicksAdvance(void) { size_t before = g_tick; @@ -24,9 +21,9 @@ static void test_timer_ticks_advance(void) WHAL_ASSERT_EQ(elapsed >= 100, 1); } -void test_timer(void) +void whal_Test_Timer(void) { WHAL_TEST_SUITE_START("timer"); - WHAL_TEST(test_timer_ticks_advance); + WHAL_TEST(Test_Timer_TicksAdvance); WHAL_TEST_SUITE_END(); } diff --git a/wolfHAL/wolfHAL.h b/wolfHAL/wolfHAL.h index f1c2f84..29499ec 100644 --- a/wolfHAL/wolfHAL.h +++ b/wolfHAL/wolfHAL.h @@ -14,6 +14,8 @@ #include #include #include +#include +#include #include #include