diff --git a/boards/peripheral/Makefile.inc b/boards/peripheral/Makefile.inc index e92c3c3..8438690 100644 --- a/boards/peripheral/Makefile.inc +++ b/boards/peripheral/Makefile.inc @@ -5,18 +5,18 @@ BOARD_SOURCE += $(_PERIPHERAL_DIR)/peripheral.c ifneq ($(filter sdhc_spi_sdcard32gb,$(PERIPHERALS)),) CFLAGS += -DPERIPHERAL_SDHC_SPI_SDCARD32GB BOARD_SOURCE += $(_PERIPHERAL_DIR)/block/sdhc_spi_sdcard32gb.c -BOARD_SOURCE += $(WHAL_DIR)/src/block/sdhc_spi.c +BOARD_SOURCE += $(WHAL_DIR)/src/block/sdhc_spi_block.c endif ifneq ($(filter spi_nor_w25q64,$(PERIPHERALS)),) CFLAGS += -DPERIPHERAL_SPI_NOR_W25Q64 BOARD_SOURCE += $(_PERIPHERAL_DIR)/flash/spi_nor_w25q64.c -BOARD_SOURCE += $(WHAL_DIR)/src/flash/spi_nor.c +BOARD_SOURCE += $(WHAL_DIR)/src/flash/spi_nor_flash.c endif ifneq ($(filter bmi270,$(PERIPHERALS)),) CFLAGS += -DPERIPHERAL_BMI270 BOARD_SOURCE += $(_PERIPHERAL_DIR)/sensor/imu/bmi270.c -BOARD_SOURCE += $(WHAL_DIR)/src/sensor/imu/bmi270.c +BOARD_SOURCE += $(WHAL_DIR)/src/sensor/imu/bmi270_sensor.c BOARD_SOURCE += $(WHAL_DIR)/src/sensor/imu/bmi270_config_data.c endif diff --git a/boards/peripheral/block/sdhc_spi_sdcard32gb.c b/boards/peripheral/block/sdhc_spi_sdcard32gb.c index 30eeba6..f452a87 100644 --- a/boards/peripheral/block/sdhc_spi_sdcard32gb.c +++ b/boards/peripheral/block/sdhc_spi_sdcard32gb.c @@ -1,5 +1,5 @@ #include "sdhc_spi_sdcard32gb.h" -#include +#include #include "board.h" static whal_Spi_ComCfg g_sdcardComCfg = { diff --git a/boards/peripheral/block/sdhc_spi_sdcard32gb.h b/boards/peripheral/block/sdhc_spi_sdcard32gb.h index 4cf086a..b66d181 100644 --- a/boards/peripheral/block/sdhc_spi_sdcard32gb.h +++ b/boards/peripheral/block/sdhc_spi_sdcard32gb.h @@ -3,7 +3,7 @@ #include #include -#include +#include extern whal_Block g_whalSdhcSpiSdcard32gb; diff --git a/boards/peripheral/flash/spi_nor_w25q64.c b/boards/peripheral/flash/spi_nor_w25q64.c index 530917a..f77b3c2 100644 --- a/boards/peripheral/flash/spi_nor_w25q64.c +++ b/boards/peripheral/flash/spi_nor_w25q64.c @@ -1,5 +1,5 @@ #include "spi_nor_w25q64.h" -#include +#include #include "board.h" /* diff --git a/boards/peripheral/flash/spi_nor_w25q64.h b/boards/peripheral/flash/spi_nor_w25q64.h index dcb41e4..435686b 100644 --- a/boards/peripheral/flash/spi_nor_w25q64.h +++ b/boards/peripheral/flash/spi_nor_w25q64.h @@ -3,7 +3,7 @@ #include #include -#include +#include extern whal_Flash g_whalSpiNorW25q64; diff --git a/boards/peripheral/sensor/imu/bmi270.c b/boards/peripheral/sensor/imu/bmi270.c index b39dad8..811ddd7 100644 --- a/boards/peripheral/sensor/imu/bmi270.c +++ b/boards/peripheral/sensor/imu/bmi270.c @@ -1,5 +1,5 @@ #include "bmi270.h" -#include +#include #include #include "board.h" diff --git a/boards/peripheral/sensor/imu/bmi270.h b/boards/peripheral/sensor/imu/bmi270.h index 1474a58..d033a32 100644 --- a/boards/peripheral/sensor/imu/bmi270.h +++ b/boards/peripheral/sensor/imu/bmi270.h @@ -3,7 +3,7 @@ #include #include -#include +#include extern whal_Sensor g_whalBmi270; diff --git a/boards/pic32cz_curiosity_ultra/Makefile.inc b/boards/pic32cz_curiosity_ultra/Makefile.inc index eac73f6..a867497 100644 --- a/boards/pic32cz_curiosity_ultra/Makefile.inc +++ b/boards/pic32cz_curiosity_ultra/Makefile.inc @@ -1,7 +1,7 @@ _BOARD_DIR := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST)))) PLATFORM = pic32cz -TESTS ?= clock gpio flash timer +TESTS ?= clock gpio flash timer supply uart GCC = $(GCC_PATH)arm-none-eabi-gcc LD = $(GCC_PATH)arm-none-eabi-ld diff --git a/boards/stm32c031_nucleo/Makefile.inc b/boards/stm32c031_nucleo/Makefile.inc index 15866a9..4d1985f 100644 --- a/boards/stm32c031_nucleo/Makefile.inc +++ b/boards/stm32c031_nucleo/Makefile.inc @@ -1,7 +1,7 @@ _BOARD_DIR := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST)))) PLATFORM = stm32c0 -TESTS ?= clock gpio timer flash +TESTS ?= clock gpio timer flash uart GCC = $(GCC_PATH)arm-none-eabi-gcc LD = $(GCC_PATH)arm-none-eabi-gcc diff --git a/boards/stm32f411_blackpill/Makefile.inc b/boards/stm32f411_blackpill/Makefile.inc index cf5025d..bc8122f 100644 --- a/boards/stm32f411_blackpill/Makefile.inc +++ b/boards/stm32f411_blackpill/Makefile.inc @@ -1,7 +1,7 @@ _BOARD_DIR := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST)))) PLATFORM = stm32f4 -TESTS ?= clock gpio timer flash +TESTS ?= clock gpio timer flash uart GCC = $(GCC_PATH)arm-none-eabi-gcc LD = $(GCC_PATH)arm-none-eabi-ld diff --git a/boards/stm32h563zi_nucleo/Makefile.inc b/boards/stm32h563zi_nucleo/Makefile.inc index f37f470..92cfc6e 100644 --- a/boards/stm32h563zi_nucleo/Makefile.inc +++ b/boards/stm32h563zi_nucleo/Makefile.inc @@ -1,7 +1,7 @@ _BOARD_DIR := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST)))) PLATFORM = stm32h5 -TESTS ?= clock gpio timer flash rng eth +TESTS ?= clock gpio timer flash rng eth uart GCC = $(GCC_PATH)arm-none-eabi-gcc LD = $(GCC_PATH)arm-none-eabi-ld diff --git a/boards/stm32h563zi_nucleo/board.c b/boards/stm32h563zi_nucleo/board.c index 9b81a04..ab28f37 100644 --- a/boards/stm32h563zi_nucleo/board.c +++ b/boards/stm32h563zi_nucleo/board.c @@ -4,7 +4,7 @@ #include #include "board.h" #include -#include +#include #include "peripheral.h" /* SysTick timing */ diff --git a/boards/stm32wb55xx_nucleo/Makefile.inc b/boards/stm32wb55xx_nucleo/Makefile.inc index 5a9f133..d6916c0 100644 --- a/boards/stm32wb55xx_nucleo/Makefile.inc +++ b/boards/stm32wb55xx_nucleo/Makefile.inc @@ -1,7 +1,7 @@ _BOARD_DIR := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST)))) PLATFORM = stm32wb -TESTS ?= clock gpio flash timer rng crypto block +TESTS ?= clock gpio flash timer rng crypto block uart i2c dma irq GCC = $(GCC_PATH)arm-none-eabi-gcc LD = $(GCC_PATH)arm-none-eabi-ld diff --git a/docs/adding_a_peripheral.md b/docs/adding_a_peripheral.md index a13e28f..656cb2a 100644 --- a/docs/adding_a_peripheral.md +++ b/docs/adding_a_peripheral.md @@ -50,7 +50,7 @@ Declare the global device instance: #include #include -#include +#include extern whal_Flash g_whalSpiNorW25q64; @@ -65,7 +65,7 @@ globals (`g_whalSpi`, `g_whalGpio`, `SPI_CS_PIN`, `g_whalTimeout`) from ```c #include "spi_nor_w25q64.h" -#include +#include #include "board.h" #define W25Q64_PAGE_SZ 256 @@ -168,8 +168,16 @@ framework. ## Naming Convention -- Flag: `PERIPHERAL_` (e.g., `PERIPHERAL_BMI270`) -- PERIPHERALS variable: lowercase name (e.g., `bmi270`, `spi_nor_w25q64`) +Instance files are named `_`: + +- `sdhc_spi_sdcard32gb` — sdhc_spi driver, 32GB SD card +- `spi_nor_w25q64` — spi_nor driver, W25Q64 chip +- `bmi270` — bmi270 driver (single instance, no qualifier needed) + +Summary: + - Directory: `boards/peripheral//` (e.g., `flash/`, `block/`, `sensor/imu/`) -- Files: `.h` and `.c` -- Global instance: `g_whal` (e.g., `g_whalBmi270`, `g_whalSpiNorW25q64`) +- Files: `.h` and `.c` for single-instance peripherals; otherwise `_.h` and `_.c` +- Flag: `PERIPHERAL_` (e.g., `PERIPHERAL_SPI_NOR_W25Q64`) +- PERIPHERALS variable: lowercase name (e.g., `spi_nor_w25q64`, `bmi270`) +- Global instance: `g_whal` (e.g., `g_whalSpiNorW25q64`, `g_whalBmi270`) diff --git a/docs/getting_started.md b/docs/getting_started.md index 11314a0..57dfdd8 100644 --- a/docs/getting_started.md +++ b/docs/getting_started.md @@ -277,7 +277,7 @@ This eliminates the vtable indirection and lets the compiler inline or optimize the calls more aggressively. Register-level drivers do not call other drivers internally, so this works -without any caveats. Bus-device drivers (e.g., SPI flash) still call their +without any caveats. Peripheral drivers (e.g., SPI flash) still call their bus driver through the vtable. ## Next Steps diff --git a/docs/writing_a_driver.md b/docs/writing_a_driver.md index 5b54e1e..02a9db8 100644 --- a/docs/writing_a_driver.md +++ b/docs/writing_a_driver.md @@ -1,15 +1,35 @@ # Writing a Driver -This guide covers how to implement a wolfHAL driver for a specific platform. +This guide covers how to implement wolfHAL drivers. + +## Driver Categories + +wolfHAL has two categories of drivers: + +**Platform drivers** operate directly on SoC hardware registers at fixed memory +addresses. They are tied to a specific microcontroller family and use the +`whal_Reg_*` helpers to read and write peripheral registers. Examples: +`stm32wb_uart`, `stm32wb_gpio`, `stm32wb_dma`, `pic32cz_clock`. + +**Peripheral drivers** communicate with external chips over a bus (SPI, I2C, +MDIO). They call platform drivers (e.g., `whal_Spi_SendRecv`) to reach the +hardware and are portable across any SoC that provides the required bus. +Examples: `spi_nor_flash` (SPI flash), `sdhc_spi_block` (SD card over SPI), +`bmi270_sensor` (IMU over I2C), `lan8742a_eth_phy` (Ethernet PHY over MDIO). + +Both categories implement the same vtable interface — the application calls +`whal_Flash_Read()` whether the flash is on-chip (platform driver) or +external SPI NOR (peripheral driver). The distinction matters for driver +authors, not for application code. ## Common Pattern Every device type in wolfHAL follows the same structure: -1. A **driver vtable** — a struct of function pointers that the platform driver - must populate. +1. A **driver vtable** — a struct of function pointers that the driver must + populate. 2. A **device struct** — contains a register map, a pointer to the driver - vtable, and a pointer to platform-specific configuration. + vtable, and a pointer to driver-specific configuration. 3. A **generic dispatch layer** — validates inputs and calls through the vtable. To write a driver for a device type, you implement the functions defined in that @@ -17,11 +37,16 @@ type's vtable and expose them as a const driver instance. ### File Layout -For a device type `foo` on platform `myplatform`: +For a platform driver implementing device type `foo` on platform `myplatform`: - `wolfHAL/foo/myplatform_foo.h` — configuration types and driver extern - `src/foo/myplatform_foo.c` — driver implementation and vtable definition +For a peripheral driver implementing device type `foo` for chip `mychip`: + +- `wolfHAL/foo/mychip_foo.h` — configuration types and driver extern +- `src/foo/mychip_foo.c` — driver implementation and vtable definition + ### Driver Vtable Every vtable includes `Init` and `Deinit`. The remaining functions are specific @@ -51,18 +76,17 @@ static whal_Error whal_MyplatformFoo_Init(whal_Foo *fooDev) ### No Cross-Driver Calls -Register-level drivers must not call other wolfHAL drivers. A UART driver -must not call the clock driver to enable its own clock, and a clock driver -must not call the flash driver to set wait states. The board is responsible -for all cross-peripheral dependencies — enabling clocks, configuring power -supplies, and setting flash latency — before calling a driver's Init. +Platform drivers should only touch their own registers. The board handles all +cross-peripheral setup — clock enables, power supply sequencing, flash wait +states — before calling Init. -This ensures drivers are pure register-level abstractions with no hidden -dependencies, making them usable with or without the vtable dispatch layer. +There are two exceptions: -Bus-device drivers (e.g., SPI flash) are the exception — they inherently -need to call their underlying bus driver (SPI, I2C) to communicate with the -device. +- **Peripheral drivers** call their underlying bus driver (SPI, I2C, MDIO) to + communicate with the external chip. +- **DMA-backed platform drivers** (e.g., `stm32wb_uart_dma`) call the DMA + driver to set up and start transfers. The DMA device is passed through the + driver's configuration struct. ### Register Access @@ -332,12 +356,6 @@ driver should handle all of these. Disable a peripheral clock gate. The inverse of Enable — clear the enable bit(s) for the given clock descriptor. -### GetRate - -Report the current system clock frequency in Hz. The driver should compute this -from the configured source, PLL coefficients, and divider settings. Store the -result in the output pointer. - --- ## GPIO @@ -707,7 +725,7 @@ Erase a flash region. Flash erase operates at sector/page granularity - Validate that the region is unlocked before erasing The `addr` does not need to be page-aligned — the driver should erase all pages -that overlap with the requested range. Bus-device flash drivers (e.g., SPI-NOR) +that overlap with the requested range. Peripheral flash drivers (e.g., SPI-NOR) may enforce stricter alignment requirements where the underlying hardware requires aligned erase addresses. @@ -722,9 +740,8 @@ SD cards and eMMC. Unlike flash, block devices are addressed by block number rather than byte address, and all operations work in units of fixed-size blocks (e.g. 512 bytes). -Block drivers are bus-device drivers — they call their underlying bus driver -(SPI, SDIO) to communicate with the storage device. This is the expected -exception to the no-cross-driver-calls rule. +Block drivers are peripheral drivers — they call their underlying bus driver +(SPI, SDIO) to communicate with the storage device. ### Init diff --git a/src/block/sdhc_spi.c b/src/block/sdhc_spi_block.c similarity index 99% rename from src/block/sdhc_spi.c rename to src/block/sdhc_spi_block.c index 517a3f9..3333b4d 100644 --- a/src/block/sdhc_spi.c +++ b/src/block/sdhc_spi_block.c @@ -1,5 +1,5 @@ #include -#include +#include #include #include #include diff --git a/src/clock/clock.c b/src/clock/clock.c index d7203e2..cf950f8 100644 --- a/src/clock/clock.c +++ b/src/clock/clock.c @@ -37,14 +37,3 @@ inline whal_Error whal_Clock_Disable(whal_Clock *clkDev, const void *clk) return clkDev->driver->Disable(clkDev, clk); } -inline whal_Error whal_Clock_GetRate(whal_Clock *clkDev, size_t *rateOut) -{ - if (!clkDev || !clkDev->driver || !clkDev->driver->GetRate || - !rateOut) - { - return WHAL_EINVAL; - } - - return clkDev->driver->GetRate(clkDev, rateOut); -} - diff --git a/src/clock/pic32cz_clock.c b/src/clock/pic32cz_clock.c index c7c0b58..c0c75c1 100644 --- a/src/clock/pic32cz_clock.c +++ b/src/clock/pic32cz_clock.c @@ -238,21 +238,9 @@ whal_Error whal_Pic32czClock_Disable(whal_Clock *clkDev, const void *clk) return WHAL_SUCCESS; } -whal_Error whal_Pic32czClock_GetRate(whal_Clock *clkDev, size_t *rateOut) -{ - if (!clkDev || !rateOut) { - return WHAL_EINVAL; - } - - /* TODO: Calculate actual clock rate from PLL and divider settings */ - *rateOut = 0; - return WHAL_SUCCESS; -} - const whal_ClockDriver whal_Pic32czClockPll_Driver = { .Init = whal_Pic32czClockPll_Init, .Deinit = whal_Pic32czClockPll_Deinit, .Enable = whal_Pic32czClock_Enable, .Disable = whal_Pic32czClock_Disable, - .GetRate = whal_Pic32czClock_GetRate, }; diff --git a/src/clock/stm32c0_rcc.c b/src/clock/stm32c0_rcc.c index 54ae72b..9dd3836 100644 --- a/src/clock/stm32c0_rcc.c +++ b/src/clock/stm32c0_rcc.c @@ -114,26 +114,9 @@ whal_Error whal_Stm32c0Rcc_Disable(whal_Clock *clkDev, const void *clk) return WHAL_SUCCESS; } -whal_Error whal_Stm32c0Rcc_GetRate(whal_Clock *clkDev, size_t *rateOut) -{ - whal_Stm32c0Rcc_Cfg *cfg; - - if (!clkDev || !clkDev->cfg || !rateOut) { - return WHAL_EINVAL; - } - - cfg = (whal_Stm32c0Rcc_Cfg *)clkDev->cfg; - - /* HSI48 base frequency divided by HSIDIV (1 << hsidiv) */ - *rateOut = 48000000 / (1 << cfg->hsidiv); - - return WHAL_SUCCESS; -} - const whal_ClockDriver whal_Stm32c0Rcc_Driver = { .Init = whal_Stm32c0Rcc_Init, .Deinit = whal_Stm32c0Rcc_Deinit, .Enable = whal_Stm32c0Rcc_Enable, .Disable = whal_Stm32c0Rcc_Disable, - .GetRate = whal_Stm32c0Rcc_GetRate, }; diff --git a/src/clock/stm32f4_rcc.c b/src/clock/stm32f4_rcc.c index 924ca50..3972c5e 100644 --- a/src/clock/stm32f4_rcc.c +++ b/src/clock/stm32f4_rcc.c @@ -72,9 +72,6 @@ #define RCC_CFGR_PPRE2_Pos 13 #define RCC_CFGR_PPRE2_Msk (WHAL_BITMASK(3) << RCC_CFGR_PPRE2_Pos) -/* PLLP register value to actual divider: 0->2, 1->4, 2->6, 3->8 */ -static const uint8_t pllp_div[] = { 2, 4, 6, 8 }; - whal_Error whal_Stm32f4RccPll_Init(whal_Clock *clkDev) { whal_Stm32f4Rcc_Cfg *cfg; @@ -211,39 +208,9 @@ whal_Error whal_Stm32f4Rcc_Disable(whal_Clock *clkDev, const void *clk) return WHAL_SUCCESS; } -whal_Error whal_Stm32f4RccPll_GetRate(whal_Clock *clkDev, size_t *rateOut) -{ - whal_Stm32f4Rcc_Cfg *cfg; - whal_Stm32f4Rcc_PllClkCfg *pllCfg; - size_t srcFreq; - size_t pllm; - size_t plln; - size_t pllp; - - if (!clkDev || !clkDev->cfg || !rateOut) - return WHAL_EINVAL; - - cfg = (whal_Stm32f4Rcc_Cfg *)clkDev->cfg; - pllCfg = (whal_Stm32f4Rcc_PllClkCfg *)cfg->sysClkCfg; - - /* Determine source frequency */ - if (pllCfg->clkSrc == WHAL_STM32F4_RCC_PLLCLK_SRC_HSI) - srcFreq = 16000000; - else - srcFreq = 25000000; - - pllm = pllCfg->m; - plln = pllCfg->n; - pllp = pllp_div[pllCfg->p & 0x3]; - - *rateOut = ((srcFreq / pllm) * plln) / pllp; - return WHAL_SUCCESS; -} - const whal_ClockDriver whal_Stm32f4RccPll_Driver = { .Init = whal_Stm32f4RccPll_Init, .Deinit = whal_Stm32f4RccPll_Deinit, .Enable = whal_Stm32f4Rcc_Enable, .Disable = whal_Stm32f4Rcc_Disable, - .GetRate = whal_Stm32f4RccPll_GetRate, }; diff --git a/src/clock/stm32h5_rcc.c b/src/clock/stm32h5_rcc.c index 4a9c94d..f71ef10 100644 --- a/src/clock/stm32h5_rcc.c +++ b/src/clock/stm32h5_rcc.c @@ -102,29 +102,6 @@ /* HSI base frequency */ #define HSI_FREQ 64000000UL -/* - * Compute the input reference frequency for PLL source selection. - * Returns the HSI frequency accounting for the divider if HSI is selected. - */ -static size_t Stm32h5Rcc_GetPllInputFreq(size_t rccBase, - whal_Stm32h5Rcc_PllClockSrc src) -{ - size_t hsidiv; - - switch (src) { - case WHAL_STM32H5_RCC_PLLCLK_SRC_HSI: - whal_Reg_Get(rccBase, RCC_CR_REG, RCC_CR_HSIDIV_Msk, - RCC_CR_HSIDIV_Pos, &hsidiv); - return HSI_FREQ >> hsidiv; - case WHAL_STM32H5_RCC_PLLCLK_SRC_CSI: - return 4000000; - case WHAL_STM32H5_RCC_PLLCLK_SRC_HSE: - return 8000000; /* TODO: Make configurable per board */ - default: - return 0; - } -} - whal_Error whal_Stm32h5RccPll_Init(whal_Clock *clkDev) { whal_Stm32h5Rcc_Cfg *cfg; @@ -333,63 +310,11 @@ whal_Error whal_Stm32h5Rcc_Disable(whal_Clock *clkDev, const void *clk) return WHAL_SUCCESS; } -whal_Error whal_Stm32h5RccPll_GetRate(whal_Clock *clkDev, size_t *rateOut) -{ - whal_Stm32h5Rcc_Cfg *cfg; - whal_Stm32h5Rcc_PllClkCfg *pllCfg; - size_t srcFreq; - size_t pllm; - size_t plln; - size_t pllp; - - if (!clkDev || !clkDev->cfg || !rateOut) - return WHAL_EINVAL; - - cfg = (whal_Stm32h5Rcc_Cfg *)clkDev->cfg; - pllCfg = (whal_Stm32h5Rcc_PllClkCfg *)cfg->sysClkCfg; - - srcFreq = Stm32h5Rcc_GetPllInputFreq(clkDev->regmap.base, pllCfg->clkSrc); - if (srcFreq == 0) - return WHAL_EINVAL; - - /* - * PLL1 output (pll1_p_ck): - * f_vco = (f_src / m) * (n + 1) - * f_pllp = f_vco / (p + 1) - * - * PLL1M: register value is the divisor directly (1-63, 0=disabled) - * PLL1N: register value + 1 is the multiplier (3=4x, 4=5x, ...) - * PLL1P: register value + 1 is the divisor (1=/2, 2=/3, ...) - */ - pllm = pllCfg->m; - plln = pllCfg->n + 1; - pllp = pllCfg->p + 1; - - *rateOut = ((srcFreq / pllm) * plln) / pllp; - return WHAL_SUCCESS; -} - -whal_Error whal_Stm32h5RccHsi_GetRate(whal_Clock *clkDev, size_t *rateOut) -{ - size_t hsidiv; - - if (!clkDev || !rateOut) - return WHAL_EINVAL; - - whal_Reg_Get(clkDev->regmap.base, RCC_CR_REG, RCC_CR_HSIDIV_Msk, - RCC_CR_HSIDIV_Pos, &hsidiv); - - /* HSI divider: 0=div1(64MHz), 1=div2(32MHz), 2=div4(16MHz), 3=div8(8MHz) */ - *rateOut = HSI_FREQ >> hsidiv; - return WHAL_SUCCESS; -} - const whal_ClockDriver whal_Stm32h5RccPll_Driver = { .Init = whal_Stm32h5RccPll_Init, .Deinit = whal_Stm32h5RccPll_Deinit, .Enable = whal_Stm32h5Rcc_Enable, .Disable = whal_Stm32h5Rcc_Disable, - .GetRate = whal_Stm32h5RccPll_GetRate, }; const whal_ClockDriver whal_Stm32h5RccHsi_Driver = { @@ -397,7 +322,6 @@ const whal_ClockDriver whal_Stm32h5RccHsi_Driver = { .Deinit = whal_Stm32h5RccHsi_Deinit, .Enable = whal_Stm32h5Rcc_Enable, .Disable = whal_Stm32h5Rcc_Disable, - .GetRate = whal_Stm32h5RccHsi_GetRate, }; whal_Error whal_Stm32h5Rcc_Ext_EnableHsi48(whal_Clock *clkDev, uint8_t enable) diff --git a/src/clock/stm32wb_rcc.c b/src/clock/stm32wb_rcc.c index d14d425..c8e7554 100644 --- a/src/clock/stm32wb_rcc.c +++ b/src/clock/stm32wb_rcc.c @@ -262,93 +262,6 @@ whal_Error whal_Stm32wbRcc_Disable(whal_Clock *clkDev, const void *clk) return WHAL_SUCCESS; } -whal_Error whal_Stm32wbRccPll_GetRate(whal_Clock *clkDev, size_t *rateOut) -{ - whal_Stm32wbRcc_Cfg *cfg; - - if (!clkDev || !clkDev->cfg) { - return WHAL_EINVAL; - } - - cfg = (whal_Stm32wbRcc_Cfg *)clkDev->cfg; - whal_Stm32wbRcc_PllClkCfg *pllClkCfg = cfg->sysClkCfg; - - /* - * Calculate PLL output frequency: - * f_pllr = ((f_src / (m + 1)) * n) / (r + 1) - */ - size_t srcFreq; - size_t pllm = pllClkCfg->m + 1; - size_t plln = pllClkCfg->n; - size_t pllr = pllClkCfg->r + 1; - - /* Determine source frequency based on PLL input selection */ - if (pllClkCfg->clkSrc == WHAL_STM32WB_RCC_PLLCLK_SRC_MSI) { - srcFreq = 4000000; - } - else { - return WHAL_EINVAL; - } - - *rateOut = ((srcFreq / pllm) * plln) / pllr; - return WHAL_SUCCESS; -} - -whal_Error whal_Stm32wbRccMsi_GetRate(whal_Clock *clkDev, size_t *rateOut) -{ - size_t msiRange; - - if (!clkDev || !rateOut) { - return WHAL_EINVAL; - } - - /* Read current MSI range from hardware */ - whal_Reg_Get(clkDev->regmap.base, RCC_CR_REG, RCC_CR_MSIRANGE_Msk, - RCC_CR_MSIRANGE_Pos, &msiRange); - - /* Map range setting to frequency in Hz */ - switch (msiRange) { - case WHAL_STM32WB_RCC_MSIRANGE_100kHz: - *rateOut = 100000; - break; - case WHAL_STM32WB_RCC_MSIRANGE_200kHz: - *rateOut = 200000; - break; - case WHAL_STM32WB_RCC_MSIRANGE_400kHz: - *rateOut = 400000; - break; - case WHAL_STM32WB_RCC_MSIRANGE_800kHz: - *rateOut = 800000; - break; - case WHAL_STM32WB_RCC_MSIRANGE_1MHz: - *rateOut = 1000000; - break; - case WHAL_STM32WB_RCC_MSIRANGE_2MHz: - *rateOut = 2000000; - break; - case WHAL_STM32WB_RCC_MSIRANGE_4MHz: - *rateOut = 4000000; - break; - case WHAL_STM32WB_RCC_MSIRANGE_8MHz: - *rateOut = 8000000; - break; - case WHAL_STM32WB_RCC_MSIRANGE_16MHz: - *rateOut = 16000000; - break; - case WHAL_STM32WB_RCC_MSIRANGE_24MHz: - *rateOut = 24000000; - break; - case WHAL_STM32WB_RCC_MSIRANGE_32MHz: - *rateOut = 32000000; - break; - case WHAL_STM32WB_RCC_MSIRANGE_48MHz: - *rateOut = 48000000; - break; - } - - return WHAL_SUCCESS; -} - whal_Error whal_Stm32wbRcc_Ext_EnableHsi48(whal_Clock *clkDev, uint8_t enable) { if (!clkDev) { @@ -394,7 +307,6 @@ const whal_ClockDriver whal_Stm32wbRccPll_Driver = { .Deinit = whal_Stm32wbRccPll_Deinit, .Enable = whal_Stm32wbRcc_Enable, .Disable = whal_Stm32wbRcc_Disable, - .GetRate = whal_Stm32wbRccPll_GetRate, }; const whal_ClockDriver whal_Stm32wbRccMsi_Driver = { @@ -402,5 +314,4 @@ const whal_ClockDriver whal_Stm32wbRccMsi_Driver = { .Deinit = whal_Stm32wbRccMsi_Deinit, .Enable = whal_Stm32wbRcc_Enable, .Disable = whal_Stm32wbRcc_Disable, - .GetRate = whal_Stm32wbRccMsi_GetRate, }; diff --git a/src/eth_phy/lan8742a.c b/src/eth_phy/lan8742a_eth_phy.c similarity index 98% rename from src/eth_phy/lan8742a.c rename to src/eth_phy/lan8742a_eth_phy.c index 4f63d6b..530b691 100644 --- a/src/eth_phy/lan8742a.c +++ b/src/eth_phy/lan8742a_eth_phy.c @@ -1,4 +1,4 @@ -#include +#include #include #include diff --git a/src/flash/spi_nor.c b/src/flash/spi_nor_flash.c similarity index 99% rename from src/flash/spi_nor.c rename to src/flash/spi_nor_flash.c index e9fa97b..df5d7a7 100644 --- a/src/flash/spi_nor.c +++ b/src/flash/spi_nor_flash.c @@ -1,5 +1,5 @@ #include -#include +#include #include #include #include diff --git a/src/sensor/imu/bmi270.c b/src/sensor/imu/bmi270_sensor.c similarity index 99% rename from src/sensor/imu/bmi270.c rename to src/sensor/imu/bmi270_sensor.c index bf40dc5..a310ad6 100644 --- a/src/sensor/imu/bmi270.c +++ b/src/sensor/imu/bmi270_sensor.c @@ -1,5 +1,5 @@ #include -#include +#include #include #include #include diff --git a/tests/Makefile b/tests/Makefile index d79c005..f21e3f9 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -10,7 +10,7 @@ include $(BOARD_DIR)/Makefile.inc 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)) +CFLAGS += $(foreach t,$(TESTS),$(if $(shell find . -name 'test_$(PLATFORM)_$(t).c'),-DWHAL_TEST_ENABLE_$(call uc,$(t))_PLATFORM)) SOURCE = main.c SOURCE += $(BOARD_SOURCE) diff --git a/tests/block/test_block.c b/tests/block/test_block.c index 7f252ae..371ce7d 100644 --- a/tests/block/test_block.c +++ b/tests/block/test_block.c @@ -81,11 +81,25 @@ static void Test_Block_MultiWriteRead(void) } } +static void Test_Block_Api(void) +{ + uint8_t buf[8]; + + WHAL_ASSERT_EQ(whal_Block_Init(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Block_Deinit(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Block_Read(NULL, 0, buf, 1), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Block_Write(NULL, 0, buf, 1), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Block_Erase(NULL, 0, 1), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Block_Read(g_testBlockDev, 0, NULL, 1), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Block_Write(g_testBlockDev, 0, NULL, 1), WHAL_EINVAL); +} + static void run_block_tests(const char *name) { WHAL_TEST_SUITE_START("block"); if (name) whal_Test_Printf(" device: %s\n", name); + WHAL_TEST(Test_Block_Api); WHAL_TEST(Test_Block_EraseBlank); WHAL_TEST(Test_Block_WriteRead); WHAL_TEST(Test_Block_MultiWriteRead); diff --git a/tests/clock/test_clock.c b/tests/clock/test_clock.c index 9cf4888..1f78602 100644 --- a/tests/clock/test_clock.c +++ b/tests/clock/test_clock.c @@ -2,16 +2,17 @@ #include "board.h" #include "test.h" -static void Test_Clock_GetRate(void) +static void Test_Clock_Api(void) { - size_t rate = 0; - WHAL_ASSERT_EQ(whal_Clock_GetRate(&g_whalClock, &rate), WHAL_SUCCESS); - WHAL_ASSERT_NEQ(rate, 0); + WHAL_ASSERT_EQ(whal_Clock_Init(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Clock_Deinit(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Clock_Enable(NULL, NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Clock_Disable(NULL, NULL), WHAL_EINVAL); } void whal_Test_Clock(void) { WHAL_TEST_SUITE_START("clock"); - WHAL_TEST(Test_Clock_GetRate); + WHAL_TEST(Test_Clock_Api); WHAL_TEST_SUITE_END(); } diff --git a/tests/core/test_dispatch.c b/tests/core/test_dispatch.c index b46455c..4a9f6b7 100644 --- a/tests/core/test_dispatch.c +++ b/tests/core/test_dispatch.c @@ -13,14 +13,11 @@ 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, }; static whal_Error MockGpioInit(whal_Gpio *d) { (void)d; return WHAL_SUCCESS; } @@ -109,8 +106,6 @@ static void Test_Clock_NullDev(void) WHAL_ASSERT_EQ(whal_Clock_Deinit(NULL), WHAL_EINVAL); WHAL_ASSERT_EQ(whal_Clock_Enable(NULL, NULL), WHAL_EINVAL); WHAL_ASSERT_EQ(whal_Clock_Disable(NULL, NULL), WHAL_EINVAL); - size_t rate; - WHAL_ASSERT_EQ(whal_Clock_GetRate(NULL, &rate), WHAL_EINVAL); } static void Test_Clock_NullDriver(void) @@ -133,9 +128,6 @@ static void Test_Clock_ValidDispatch(void) WHAL_ASSERT_EQ(whal_Clock_Deinit(&dev), WHAL_SUCCESS); WHAL_ASSERT_EQ(whal_Clock_Enable(&dev, NULL), WHAL_SUCCESS); WHAL_ASSERT_EQ(whal_Clock_Disable(&dev, NULL), WHAL_SUCCESS); - size_t rate; - WHAL_ASSERT_EQ(whal_Clock_GetRate(&dev, &rate), WHAL_SUCCESS); - WHAL_ASSERT_EQ(rate, 64000000); } /* --- GPIO dispatch tests --- */ diff --git a/tests/crypto/test_crypto.c b/tests/crypto/test_crypto.c index 03a2162..4990b99 100644 --- a/tests/crypto/test_crypto.c +++ b/tests/crypto/test_crypto.c @@ -464,9 +464,20 @@ static void Test_Crypto_AesCcm_KnownAnswer(void) WHAL_ASSERT_MEM_EQ(tag, ccmTag, sizeof(ccmTag)); } +static void Test_Crypto_Api(void) +{ + whal_Crypto_AesEcbArgs args = {0}; + + WHAL_ASSERT_EQ(whal_Crypto_Init(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Crypto_Deinit(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Crypto_Op(NULL, 0, &args), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Crypto_Op(&g_whalCrypto, 0, NULL), WHAL_EINVAL); +} + void whal_Test_Crypto(void) { WHAL_TEST_SUITE_START("crypto"); + WHAL_TEST(Test_Crypto_Api); WHAL_TEST(Test_Crypto_AesEcb_Basic); WHAL_TEST(Test_Crypto_AesEcb_KnownAnswer); WHAL_TEST(Test_Crypto_AesCbc_Basic); diff --git a/tests/dma/test_dma.c b/tests/dma/test_dma.c new file mode 100644 index 0000000..3e4eb11 --- /dev/null +++ b/tests/dma/test_dma.c @@ -0,0 +1,21 @@ +#include +#include "board.h" +#include "test.h" + +static void Test_Dma_Api(void) +{ + uint8_t chCfg[1]; + + WHAL_ASSERT_EQ(whal_Dma_Init(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Dma_Deinit(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Dma_Configure(NULL, 0, chCfg), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Dma_Start(NULL, 0), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Dma_Stop(NULL, 0), WHAL_EINVAL); +} + +void whal_Test_Dma(void) +{ + WHAL_TEST_SUITE_START("dma"); + WHAL_TEST(Test_Dma_Api); + WHAL_TEST_SUITE_END(); +} diff --git a/tests/eth/test_eth.c b/tests/eth/test_eth.c index 5243e69..e2c6a34 100644 --- a/tests/eth/test_eth.c +++ b/tests/eth/test_eth.c @@ -17,6 +17,30 @@ #define PHY_REG_PHYIDR1 2 #define PHY_REG_PHYIDR2 3 +static void Test_Eth_Api(void) +{ + uint8_t buf[64]; + size_t len = sizeof(buf); + uint16_t val; + + WHAL_ASSERT_EQ(whal_Eth_Init(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Eth_Deinit(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Eth_Start(NULL, 100, 1), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Eth_Stop(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Eth_Send(NULL, buf, sizeof(buf)), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Eth_Recv(NULL, buf, &len), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Eth_MdioRead(NULL, 0, 0, &val), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Eth_MdioWrite(NULL, 0, 0, 0), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Eth_Send(&g_whalEth, NULL, 64), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Eth_Recv(&g_whalEth, NULL, &len), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Eth_Recv(&g_whalEth, buf, NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Eth_MdioRead(&g_whalEth, 0, 0, NULL), WHAL_EINVAL); + + WHAL_ASSERT_EQ(whal_EthPhy_Init(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_EthPhy_Deinit(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_EthPhy_GetLinkState(NULL, NULL, NULL, NULL), WHAL_EINVAL); +} + static void Test_Eth_MdioReadPhyId(void) { uint16_t id1 = 0; @@ -56,6 +80,7 @@ static void Test_Eth_PhyGetLinkState(void) void whal_Test_Eth(void) { WHAL_TEST_SUITE_START("eth"); + WHAL_TEST(Test_Eth_Api); WHAL_TEST(Test_Eth_MdioReadPhyId); WHAL_TEST(Test_Eth_PhyGetLinkState); WHAL_TEST_SUITE_END(); diff --git a/tests/flash/test_flash.c b/tests/flash/test_flash.c index 3f8a4a7..5e94303 100644 --- a/tests/flash/test_flash.c +++ b/tests/flash/test_flash.c @@ -12,6 +12,21 @@ static size_t g_testFlashStartAddr; static size_t g_testFlashSize; #endif +static void Test_Flash_Api(void) +{ + uint8_t buf[8]; + + WHAL_ASSERT_EQ(whal_Flash_Init(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Flash_Deinit(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Flash_Lock(NULL, 0, 0), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Flash_Unlock(NULL, 0, 0), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Flash_Read(NULL, 0, buf, sizeof(buf)), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Flash_Write(NULL, 0, buf, sizeof(buf)), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Flash_Erase(NULL, 0, sizeof(buf)), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Flash_Read(g_testFlashDev, 0, NULL, 8), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Flash_Write(g_testFlashDev, 0, NULL, 8), WHAL_EINVAL); +} + static void Test_Flash_EraseBlank(void) { uint8_t readback[8] = {0}; @@ -92,6 +107,7 @@ static void run_flash_tests(const char *name) WHAL_TEST_SUITE_START("flash"); if (name) whal_Test_Printf(" device: %s\n", name); + WHAL_TEST(Test_Flash_Api); WHAL_TEST(Test_Flash_EraseBlank); WHAL_TEST(Test_Flash_WriteRead); #ifdef BOARD_FLASH_SIZE diff --git a/tests/gpio/test_gpio.c b/tests/gpio/test_gpio.c index 7aa4581..839f497 100644 --- a/tests/gpio/test_gpio.c +++ b/tests/gpio/test_gpio.c @@ -2,6 +2,17 @@ #include "board.h" #include "test.h" +static void Test_Gpio_Api(void) +{ + size_t val; + + WHAL_ASSERT_EQ(whal_Gpio_Init(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Gpio_Deinit(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Gpio_Get(NULL, 0, &val), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Gpio_Set(NULL, 0, 0), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Gpio_Get(&g_whalGpio, 0, NULL), WHAL_EINVAL); +} + static void Test_Gpio_SetGetHighLow(void) { size_t val = 0; @@ -20,6 +31,7 @@ static void Test_Gpio_SetGetHighLow(void) void whal_Test_Gpio(void) { WHAL_TEST_SUITE_START("gpio"); + WHAL_TEST(Test_Gpio_Api); WHAL_TEST(Test_Gpio_SetGetHighLow); WHAL_TEST_SUITE_END(); } diff --git a/tests/i2c/test_i2c.c b/tests/i2c/test_i2c.c new file mode 100644 index 0000000..e05abb8 --- /dev/null +++ b/tests/i2c/test_i2c.c @@ -0,0 +1,24 @@ +#include +#include "board.h" +#include "test.h" + +static void Test_I2c_Api(void) +{ + whal_I2c_ComCfg comCfg = { .freq = 100000, .addr = 0x50, .addrSz = 7 }; + whal_I2c_Msg msg = { .data = (uint8_t[]){0}, .dataSz = 1, .flags = 0 }; + + WHAL_ASSERT_EQ(whal_I2c_Init(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_I2c_Deinit(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_I2c_StartCom(NULL, &comCfg), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_I2c_EndCom(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_I2c_Transfer(NULL, &msg, 1), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_I2c_StartCom(&g_whalI2c, NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_I2c_Transfer(&g_whalI2c, NULL, 1), WHAL_EINVAL); +} + +void whal_Test_I2c(void) +{ + WHAL_TEST_SUITE_START("i2c"); + WHAL_TEST(Test_I2c_Api); + WHAL_TEST_SUITE_END(); +} diff --git a/tests/irq/test_irq.c b/tests/irq/test_irq.c new file mode 100644 index 0000000..b9fbbc1 --- /dev/null +++ b/tests/irq/test_irq.c @@ -0,0 +1,18 @@ +#include +#include "board.h" +#include "test.h" + +static void Test_Irq_Api(void) +{ + WHAL_ASSERT_EQ(whal_Irq_Init(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Irq_Deinit(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Irq_Enable(NULL, 0, NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Irq_Disable(NULL, 0), WHAL_EINVAL); +} + +void whal_Test_Irq(void) +{ + WHAL_TEST_SUITE_START("irq"); + WHAL_TEST(Test_Irq_Api); + WHAL_TEST_SUITE_END(); +} diff --git a/tests/main.c b/tests/main.c index b9613eb..adb2fb8 100644 --- a/tests/main.c +++ b/tests/main.c @@ -26,6 +26,9 @@ void whal_Test_Flash_Platform(void); #ifdef WHAL_TEST_ENABLE_TIMER void whal_Test_Timer(void); +#ifdef WHAL_TEST_ENABLE_TIMER_PLATFORM +void whal_Test_Timer_Platform(void); +#endif #endif #ifdef WHAL_TEST_ENABLE_RNG @@ -44,10 +47,16 @@ void whal_Test_Ipc_Platform(void); #ifdef WHAL_TEST_ENABLE_SPI_LOOPBACK void whal_Test_Spi_Loopback(void); +#ifdef WHAL_TEST_ENABLE_SPI_LOOPBACK_PLATFORM +void whal_Test_Spi_Loopback_Platform(void); +#endif #endif #ifdef WHAL_TEST_ENABLE_CRYPTO void whal_Test_Crypto(void); +#ifdef WHAL_TEST_ENABLE_CRYPTO_PLATFORM +void whal_Test_Crypto_Platform(void); +#endif #endif #ifdef WHAL_TEST_ENABLE_BLOCK @@ -61,12 +70,54 @@ void whal_Test_Eth_Platform(void); #endif #endif -#ifdef WHAL_TEST_ENABLE_BMI270 -void whal_Test_Bmi270(void); +#ifdef WHAL_TEST_ENABLE_BMI270_SENSOR +void whal_Test_Bmi270_Sensor(void); #endif #ifdef WHAL_TEST_ENABLE_WATCHDOG void whal_Test_Watchdog(void); +#ifdef WHAL_TEST_ENABLE_WATCHDOG_PLATFORM +void whal_Test_Watchdog_Platform(void); +#endif +#endif + +#ifdef WHAL_TEST_ENABLE_UART +void whal_Test_Uart(void); +#ifdef WHAL_TEST_ENABLE_UART_PLATFORM +void whal_Test_Uart_Platform(void); +#endif +#endif + +#ifdef WHAL_TEST_ENABLE_I2C +void whal_Test_I2c(void); +#ifdef WHAL_TEST_ENABLE_I2C_PLATFORM +void whal_Test_I2c_Platform(void); +#endif +#endif + +#ifdef WHAL_TEST_ENABLE_DMA +void whal_Test_Dma(void); +#ifdef WHAL_TEST_ENABLE_DMA_PLATFORM +void whal_Test_Dma_Platform(void); +#endif +#endif + +#ifdef WHAL_TEST_ENABLE_IRQ +void whal_Test_Irq(void); +#ifdef WHAL_TEST_ENABLE_IRQ_PLATFORM +void whal_Test_Irq_Platform(void); +#endif +#endif + +#ifdef WHAL_TEST_ENABLE_SUPPLY +void whal_Test_Supply(void); +#ifdef WHAL_TEST_ENABLE_SUPPLY_PLATFORM +void whal_Test_Supply_Platform(void); +#endif +#endif + +#ifdef WHAL_TEST_ENABLE_SENSOR +void whal_Test_Sensor(void); #endif int g_whalTestPassed; @@ -123,6 +174,9 @@ void main(void) #ifdef WHAL_TEST_ENABLE_TIMER whal_Test_Timer(); +#ifdef WHAL_TEST_ENABLE_TIMER_PLATFORM + whal_Test_Timer_Platform(); +#endif #endif #ifdef WHAL_TEST_ENABLE_RNG @@ -141,10 +195,16 @@ void main(void) #ifdef WHAL_TEST_ENABLE_SPI_LOOPBACK whal_Test_Spi_Loopback(); +#ifdef WHAL_TEST_ENABLE_SPI_LOOPBACK_PLATFORM + whal_Test_Spi_Loopback_Platform(); +#endif #endif #ifdef WHAL_TEST_ENABLE_CRYPTO whal_Test_Crypto(); +#ifdef WHAL_TEST_ENABLE_CRYPTO_PLATFORM + whal_Test_Crypto_Platform(); +#endif #endif #ifdef WHAL_TEST_ENABLE_BLOCK @@ -158,12 +218,54 @@ void main(void) #endif #endif -#ifdef WHAL_TEST_ENABLE_BMI270 - whal_Test_Bmi270(); +#ifdef WHAL_TEST_ENABLE_BMI270_SENSOR + whal_Test_Bmi270_Sensor(); #endif #ifdef WHAL_TEST_ENABLE_WATCHDOG whal_Test_Watchdog(); +#ifdef WHAL_TEST_ENABLE_WATCHDOG_PLATFORM + whal_Test_Watchdog_Platform(); +#endif +#endif + +#ifdef WHAL_TEST_ENABLE_UART + whal_Test_Uart(); +#ifdef WHAL_TEST_ENABLE_UART_PLATFORM + whal_Test_Uart_Platform(); +#endif +#endif + +#ifdef WHAL_TEST_ENABLE_I2C + whal_Test_I2c(); +#ifdef WHAL_TEST_ENABLE_I2C_PLATFORM + whal_Test_I2c_Platform(); +#endif +#endif + +#ifdef WHAL_TEST_ENABLE_DMA + whal_Test_Dma(); +#ifdef WHAL_TEST_ENABLE_DMA_PLATFORM + whal_Test_Dma_Platform(); +#endif +#endif + +#ifdef WHAL_TEST_ENABLE_IRQ + whal_Test_Irq(); +#ifdef WHAL_TEST_ENABLE_IRQ_PLATFORM + whal_Test_Irq_Platform(); +#endif +#endif + +#ifdef WHAL_TEST_ENABLE_SUPPLY + whal_Test_Supply(); +#ifdef WHAL_TEST_ENABLE_SUPPLY_PLATFORM + whal_Test_Supply_Platform(); +#endif +#endif + +#ifdef WHAL_TEST_ENABLE_SENSOR + whal_Test_Sensor(); #endif WHAL_TEST_SUMMARY(); diff --git a/tests/rng/test_rng.c b/tests/rng/test_rng.c index 03076e3..64a2cbc 100644 --- a/tests/rng/test_rng.c +++ b/tests/rng/test_rng.c @@ -3,6 +3,16 @@ #include "board.h" #include "test.h" +static void Test_Rng_Api(void) +{ + uint8_t buf[8]; + + WHAL_ASSERT_EQ(whal_Rng_Init(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Rng_Deinit(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Rng_Generate(NULL, buf, sizeof(buf)), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Rng_Generate(&g_whalRng, NULL, 8), WHAL_EINVAL); +} + static void Test_Rng_GenerateNonzero(void) { uint8_t buf[32] = {0}; @@ -43,6 +53,7 @@ static void Test_Rng_GenerateUnique(void) void whal_Test_Rng(void) { WHAL_TEST_SUITE_START("rng"); + WHAL_TEST(Test_Rng_Api); WHAL_TEST(Test_Rng_GenerateNonzero); WHAL_TEST(Test_Rng_GenerateUnique); WHAL_TEST_SUITE_END(); diff --git a/tests/sensor/imu/test_bmi270.c b/tests/sensor/imu/test_bmi270_sensor.c similarity index 94% rename from tests/sensor/imu/test_bmi270.c rename to tests/sensor/imu/test_bmi270_sensor.c index 2baebb3..403e50f 100644 --- a/tests/sensor/imu/test_bmi270.c +++ b/tests/sensor/imu/test_bmi270_sensor.c @@ -1,6 +1,6 @@ #include #include -#include +#include #include "board.h" #include "peripheral.h" #include "test.h" @@ -44,7 +44,7 @@ static void Test_Bmi270_ReadMultiple(void) WHAL_ASSERT_NEQ(data2.accelX | data2.accelY | data2.accelZ, 0); } -void whal_Test_Bmi270(void) +void whal_Test_Bmi270_Sensor(void) { WHAL_TEST_SUITE_START("bmi270"); WHAL_TEST(Test_Bmi270_Read); diff --git a/tests/sensor/test_sensor.c b/tests/sensor/test_sensor.c new file mode 100644 index 0000000..c12626d --- /dev/null +++ b/tests/sensor/test_sensor.c @@ -0,0 +1,19 @@ +#include +#include "board.h" +#include "test.h" + +static void Test_Sensor_Api(void) +{ + uint8_t data[32]; + + WHAL_ASSERT_EQ(whal_Sensor_Init(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Sensor_Deinit(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Sensor_Read(NULL, data), WHAL_EINVAL); +} + +void whal_Test_Sensor(void) +{ + WHAL_TEST_SUITE_START("sensor"); + WHAL_TEST(Test_Sensor_Api); + WHAL_TEST_SUITE_END(); +} diff --git a/tests/spi_loopback/test_spi_loopback.c b/tests/spi/test_spi_loopback.c similarity index 81% rename from tests/spi_loopback/test_spi_loopback.c rename to tests/spi/test_spi_loopback.c index 26ec36b..05754f6 100644 --- a/tests/spi_loopback/test_spi_loopback.c +++ b/tests/spi/test_spi_loopback.c @@ -71,9 +71,23 @@ static void Test_SpiLoopback_SendRecvDrain(void) WHAL_ASSERT_MEM_EQ(rx, expected, sizeof(expected)); } +static void Test_Spi_Api(void) +{ + uint8_t buf[4]; + whal_Spi_ComCfg cfg = { .freq = 1000000, .mode = 0, .wordSz = 8 }; + + WHAL_ASSERT_EQ(whal_Spi_Init(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Spi_Deinit(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Spi_StartCom(NULL, &cfg), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Spi_EndCom(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Spi_SendRecv(NULL, buf, 4, buf, 4), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Spi_StartCom(&g_whalSpi, NULL), WHAL_EINVAL); +} + void whal_Test_Spi_Loopback(void) { WHAL_TEST_SUITE_START("spi_loopback"); + WHAL_TEST(Test_Spi_Api); WHAL_TEST(Test_SpiLoopback_SendRecv); WHAL_TEST(Test_SpiLoopback_NullBufWithLen); WHAL_TEST(Test_SpiLoopback_SendRecvDrain); diff --git a/tests/supply/test_supply.c b/tests/supply/test_supply.c new file mode 100644 index 0000000..3bd2768 --- /dev/null +++ b/tests/supply/test_supply.c @@ -0,0 +1,18 @@ +#include +#include "board.h" +#include "test.h" + +static void Test_Supply_Api(void) +{ + WHAL_ASSERT_EQ(whal_Supply_Init(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Supply_Deinit(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Supply_Enable(NULL, NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Supply_Disable(NULL, NULL), WHAL_EINVAL); +} + +void whal_Test_Supply(void) +{ + WHAL_TEST_SUITE_START("supply"); + WHAL_TEST(Test_Supply_Api); + WHAL_TEST_SUITE_END(); +} diff --git a/tests/timer/test_timer.c b/tests/timer/test_timer.c index d24152d..e423dd2 100644 --- a/tests/timer/test_timer.c +++ b/tests/timer/test_timer.c @@ -4,6 +4,15 @@ #include "board.h" #include "test.h" +static void Test_Timer_Api(void) +{ + WHAL_ASSERT_EQ(whal_Timer_Init(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Timer_Deinit(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Timer_Start(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Timer_Stop(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Timer_Reset(NULL), WHAL_EINVAL); +} + static void Test_Timer_TicksAdvance(void) { size_t before = g_tick; @@ -24,6 +33,7 @@ static void Test_Timer_TicksAdvance(void) void whal_Test_Timer(void) { WHAL_TEST_SUITE_START("timer"); + WHAL_TEST(Test_Timer_Api); WHAL_TEST(Test_Timer_TicksAdvance); WHAL_TEST_SUITE_END(); } diff --git a/tests/uart/test_uart.c b/tests/uart/test_uart.c new file mode 100644 index 0000000..2cd2eb7 --- /dev/null +++ b/tests/uart/test_uart.c @@ -0,0 +1,24 @@ +#include +#include "board.h" +#include "test.h" + +static void Test_Uart_Api(void) +{ + uint8_t buf[8]; + + WHAL_ASSERT_EQ(whal_Uart_Init(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Uart_Deinit(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Uart_Send(NULL, buf, sizeof(buf)), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Uart_Recv(NULL, buf, sizeof(buf)), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Uart_SendAsync(NULL, buf, sizeof(buf)), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Uart_RecvAsync(NULL, buf, sizeof(buf)), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Uart_Send(&g_whalUart, NULL, 8), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Uart_Recv(&g_whalUart, NULL, 8), WHAL_EINVAL); +} + +void whal_Test_Uart(void) +{ + WHAL_TEST_SUITE_START("uart"); + WHAL_TEST(Test_Uart_Api); + WHAL_TEST_SUITE_END(); +} diff --git a/tests/watchdog/test_watchdog.c b/tests/watchdog/test_watchdog.c index 1714d85..5a0405d 100644 --- a/tests/watchdog/test_watchdog.c +++ b/tests/watchdog/test_watchdog.c @@ -27,6 +27,13 @@ typedef struct { uint32_t pad[2]; } wdg_test_state_t; +static void Test_Watchdog_Api(void) +{ + WHAL_ASSERT_EQ(whal_Watchdog_Init(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Watchdog_Deinit(NULL), WHAL_EINVAL); + WHAL_ASSERT_EQ(whal_Watchdog_Refresh(NULL), WHAL_EINVAL); +} + static void Test_Watchdog(void) { wdg_test_state_t state; @@ -91,6 +98,7 @@ static void Test_Watchdog(void) void whal_Test_Watchdog(void) { WHAL_TEST_SUITE_START("watchdog"); + WHAL_TEST(Test_Watchdog_Api); WHAL_TEST(Test_Watchdog); WHAL_TEST_SUITE_END(); } diff --git a/wolfHAL/block/sdhc_spi.h b/wolfHAL/block/sdhc_spi_block.h similarity index 100% rename from wolfHAL/block/sdhc_spi.h rename to wolfHAL/block/sdhc_spi_block.h diff --git a/wolfHAL/clock/clock.h b/wolfHAL/clock/clock.h index 9ce30f0..fa686cc 100644 --- a/wolfHAL/clock/clock.h +++ b/wolfHAL/clock/clock.h @@ -24,8 +24,6 @@ typedef struct { whal_Error (*Enable)(whal_Clock *clkDev, const void *clk); /* Disable the clock output. */ whal_Error (*Disable)(whal_Clock *clkDev, const void *clk); - /* Read back the effective clock rate. */ - whal_Error (*GetRate)(whal_Clock *clkDev, size_t *rate); } whal_ClockDriver; /* @@ -50,7 +48,6 @@ struct whal_Clock { #define whal_Clock_Deinit(clkDev) ((clkDev)->driver->Deinit((clkDev))) #define whal_Clock_Enable(clkDev, clk) ((clkDev)->driver->Enable((clkDev), (clk))) #define whal_Clock_Disable(clkDev, clk) ((clkDev)->driver->Disable((clkDev), (clk))) -#define whal_Clock_GetRate(clkDev, rate) ((clkDev)->driver->GetRate((clkDev), (rate))) #else /* * @brief Initializes a clock device and its backing driver. @@ -88,16 +85,6 @@ whal_Error whal_Clock_Enable(whal_Clock *clkDev, const void *clk); * @retval WHAL_EINVAL Null pointer or driver-specific disable failed. */ whal_Error whal_Clock_Disable(whal_Clock *clkDev, const void *clk); -/* - * @brief Reports the current output rate for a clock device. - * - * @param clkDev Pointer to the clock instance being queried. - * @param rate Storage for the computed frequency in Hz. - * - * @retval WHAL_SUCCESS Result stored in @p rate. - * @retval WHAL_EINVAL Null pointer or driver could not provide a rate. - */ -whal_Error whal_Clock_GetRate(whal_Clock *clkDev, size_t *rate); #endif #endif /* WHAL_CLOCK_H */ diff --git a/wolfHAL/clock/pic32cz_clock.h b/wolfHAL/clock/pic32cz_clock.h index 780f99e..59dbb99 100644 --- a/wolfHAL/clock/pic32cz_clock.h +++ b/wolfHAL/clock/pic32cz_clock.h @@ -248,15 +248,5 @@ whal_Error whal_Pic32czClock_Enable(whal_Clock *clkDev, const void *clk); * @retval WHAL_EINVAL Invalid arguments. */ whal_Error whal_Pic32czClock_Disable(whal_Clock *clkDev, const void *clk); -/* - * @brief Report the PIC32CZ oscillator clock rate. - * - * @param clkDev Clock device instance to query. - * @param rateOut Storage for the clock rate. - * - * @retval WHAL_SUCCESS Rate reported. - * @retval WHAL_EINVAL Invalid arguments. - */ -whal_Error whal_Pic32czClock_GetRate(whal_Clock *clkDev, size_t *rateOut); #endif /* WHAL_PIC32CZ_CLOCK_H */ diff --git a/wolfHAL/clock/stm32c0_rcc.h b/wolfHAL/clock/stm32c0_rcc.h index 62473e9..b3047f1 100644 --- a/wolfHAL/clock/stm32c0_rcc.h +++ b/wolfHAL/clock/stm32c0_rcc.h @@ -111,17 +111,4 @@ whal_Error whal_Stm32c0Rcc_Enable(whal_Clock *clkDev, const void *clk); */ whal_Error whal_Stm32c0Rcc_Disable(whal_Clock *clkDev, const void *clk); -/* - * @brief Compute the current system clock rate. - * - * Returns 48 MHz divided by the configured HSIDIV setting. - * - * @param clkDev Clock device instance. - * @param rateOut Output for the computed rate in Hz. - * - * @retval WHAL_SUCCESS Rate computed. - * @retval WHAL_EINVAL Invalid arguments. - */ -whal_Error whal_Stm32c0Rcc_GetRate(whal_Clock *clkDev, size_t *rateOut); - #endif /* WHAL_STM32C0_RCC_H */ diff --git a/wolfHAL/clock/stm32f4_rcc.h b/wolfHAL/clock/stm32f4_rcc.h index fa8fe13..f7f92c5 100644 --- a/wolfHAL/clock/stm32f4_rcc.h +++ b/wolfHAL/clock/stm32f4_rcc.h @@ -146,18 +146,4 @@ whal_Error whal_Stm32f4Rcc_Enable(whal_Clock *clkDev, const void *clk); */ whal_Error whal_Stm32f4Rcc_Disable(whal_Clock *clkDev, const void *clk); -/* - * @brief Compute the current system clock rate (PLL mode). - * - * Calculates the PLL output frequency from the configured source, - * multiplier, and dividers. - * - * @param clkDev Clock device instance. - * @param rateOut Output for the computed rate in Hz. - * - * @retval WHAL_SUCCESS Rate computed. - * @retval WHAL_EINVAL Invalid arguments. - */ -whal_Error whal_Stm32f4RccPll_GetRate(whal_Clock *clkDev, size_t *rateOut); - #endif /* WHAL_STM32F4_RCC_H */ diff --git a/wolfHAL/clock/stm32h5_rcc.h b/wolfHAL/clock/stm32h5_rcc.h index ca1284b..e7aa8f7 100644 --- a/wolfHAL/clock/stm32h5_rcc.h +++ b/wolfHAL/clock/stm32h5_rcc.h @@ -185,33 +185,6 @@ whal_Error whal_Stm32h5Rcc_Enable(whal_Clock *clkDev, const void *clk); */ whal_Error whal_Stm32h5Rcc_Disable(whal_Clock *clkDev, const void *clk); -/* - * @brief Compute the current system clock rate (PLL1 mode). - * - * Calculates the PLL1 output frequency from the configured source, - * multiplier, and dividers. - * - * @param clkDev Clock device instance. - * @param rateOut Output for the computed rate in Hz. - * - * @retval WHAL_SUCCESS Rate computed. - * @retval WHAL_EINVAL Invalid arguments. - */ -whal_Error whal_Stm32h5RccPll_GetRate(whal_Clock *clkDev, size_t *rateOut); - -/* - * @brief Compute the current system clock rate (HSI mode). - * - * Returns 64 MHz divided by the configured HSI divider. - * - * @param clkDev Clock device instance. - * @param rateOut Output for the computed rate in Hz. - * - * @retval WHAL_SUCCESS Rate computed. - * @retval WHAL_EINVAL Invalid arguments. - */ -whal_Error whal_Stm32h5RccHsi_GetRate(whal_Clock *clkDev, size_t *rateOut); - /* * @brief Enable or disable the HSI48 oscillator. * diff --git a/wolfHAL/clock/stm32wb_rcc.h b/wolfHAL/clock/stm32wb_rcc.h index cf023ed..8d563b5 100644 --- a/wolfHAL/clock/stm32wb_rcc.h +++ b/wolfHAL/clock/stm32wb_rcc.h @@ -188,26 +188,6 @@ whal_Error whal_Stm32wbRcc_Enable(whal_Clock *clkDev, const void *clk); * @retval WHAL_EINVAL Invalid arguments. */ whal_Error whal_Stm32wbRcc_Disable(whal_Clock *clkDev, const void *clk); -/* - * @brief Compute the current system clock rate. - * - * @param clkDev Clock device instance. - * @param rateOut Output for the computed rate in Hz. - * - * @retval WHAL_SUCCESS Rate computed. - * @retval WHAL_EINVAL Invalid arguments. - */ -whal_Error whal_Stm32wbRccPll_GetRate(whal_Clock *clkDev, size_t *rateOut); -/* - * @brief Compute the current system clock rate. - * - * @param clkDev Clock device instance. - * @param rateOut Output for the computed rate in Hz. - * - * @retval WHAL_SUCCESS Rate computed. - * @retval WHAL_EINVAL Invalid arguments. - */ -whal_Error whal_Stm32wbRccMsi_GetRate(whal_Clock *clkDev, size_t *rateOut); /* * @brief Enable or disable the HSI48 oscillator required by the RNG peripheral. * diff --git a/wolfHAL/eth_phy/lan8742a.h b/wolfHAL/eth_phy/lan8742a_eth_phy.h similarity index 100% rename from wolfHAL/eth_phy/lan8742a.h rename to wolfHAL/eth_phy/lan8742a_eth_phy.h diff --git a/wolfHAL/flash/spi_nor.h b/wolfHAL/flash/spi_nor_flash.h similarity index 100% rename from wolfHAL/flash/spi_nor.h rename to wolfHAL/flash/spi_nor_flash.h diff --git a/wolfHAL/sensor/imu/bmi270.h b/wolfHAL/sensor/imu/bmi270_sensor.h similarity index 100% rename from wolfHAL/sensor/imu/bmi270.h rename to wolfHAL/sensor/imu/bmi270_sensor.h