6.3 KiB
Hardware Abstraction Layer (HAL)
The Hardware Abstraction Layer (HAL) provides the interface between wolfBoot and target hardware. Each supported microcontroller requires its own HAL implementation.
Overview
The HAL serves two primary purposes:
- Provide hardware-specific flash operations (read/write/erase) for both:
- Bootloader operations
- Application-initiated firmware updates
- Ensure optimal MCU performance during boot for fast signature verification
Implementation Structure
HAL implementations are organized as follows:
-
Platform-specific C files:
- Located in the hal directory
- One file per supported platform
- Contains all hardware-specific function implementations
-
Platform-specific linker scripts:
- Located alongside HAL C files
- Named
platform_name.ld
- Defines:
- Flash memory layout
- RAM boundaries
- Required symbol exports
Supported platforms
Please see Targets
Core HAL API
Every HAL implementation must provide these six core functions:
System Initialization
void hal_init(void)
Called at bootloader startup to initialize the hardware.
Responsibilities:
- Configure system clock for optimal performance
- Initialize critical peripherals
- Set up flash controller
- Configure any required hardware accelerators
Flash Memory Operations
Unlock Flash
void hal_flash_unlock(void)
Prepares flash memory for write/erase operations.
Notes:
- Called before any flash write/erase operation
- May be empty if target doesn't require explicit unlocking
- Must handle any required flash controller configuration
Write to Flash
int hal_flash_write(uint32_t address, const uint8_t *data, int len)
Writes data to internal flash memory.
Parameters:
address
: Offset from flash start addressdata
: Pointer to data buffer to writelen
: Number of bytes to write
Requirements:
- Must handle any size/alignment of writes
- Must implement read-modify-write if needed
- Must work with minimum programmable unit size
Returns:
- 0 on success
- Negative value on failure
Lock Flash
void hal_flash_lock(void)
Re-enables flash write protection after operations.
Notes:
- Called after flash write/erase operations complete
- Restores flash controller to protected state
- Must reverse any changes made by
hal_flash_unlock()
Erase Flash
int hal_flash_erase(uint32_t address, int len)
Erases a section of internal flash memory.
Parameters:
address
: Start address to erase (aligned toWOLFBOOT_SECTOR_SIZE
)len
: Number of bytes to erase (multiple ofWOLFBOOT_SECTOR_SIZE
)
Requirements:
- Must handle flash sector geometry
- Must erase all sectors in specified range
- Must use target's IAP interface
Returns:
- 0 on success
- Negative value on failure
Boot Preparation
void hal_prepare_boot(void)
Prepares system for firmware execution.
Called:
- Just before chain-loading firmware
- After all bootloader operations complete
Responsibilities:
- Restore default clock settings
- Reset modified peripherals
- Ensure clean hardware state for firmware
Optional HAL Extensions
External Flash Support
Enable with: make EXT_FLASH=1
This extension allows:
- Using external memory for UPDATE/SWAP partitions
- Custom handling of flash read operations
- Support for special flash interfaces
Configuration:
PART_UPDATE_EXT
: Store UPDATE partition in external memoryPART_SWAP_EXT
: Store SWAP partition in external memory
Important Notes:
- Incompatible with
NVM_FLASH_WRITEONCE
- Requires implementing additional HAL functions
- Can be used for special flash handling needs
External Flash API
When EXT_FLASH=1
is enabled, the following functions must be implemented:
Write to External Flash
int ext_flash_write(uintptr_t address, const uint8_t *data, int len)
Writes data to external flash memory.
Parameters:
address
: Offset from external memory base addressdata
: Pointer to data buffer to writelen
: Number of bytes to write
Requirements:
- Must follow same restrictions as
hal_flash_write()
- Must handle device-specific protocols (e.g., SPI)
Returns:
- 0 on success
- Negative value on failure
Read from External Flash
int ext_flash_read(uintptr_t address, uint8_t *data, int len)
Reads data from external flash memory.
Parameters:
address
: Offset from external memory base addressdata
: Buffer to store read datalen
: Number of bytes to read
Requirements:
- Must handle any size/alignment of reads
- Must implement device-specific read protocol
Returns:
- 0 on success
- Negative value on failure
Erase External Flash
int ext_flash_erase(uintptr_t address, int len)
Erases a section of external flash memory.
Parameters:
address
: Start address to eraselen
: Number of bytes to erase
Requirements:
- Must follow same restrictions as
hal_flash_erase()
- Must handle device-specific sector geometry
- Must implement proper erase commands
Returns:
- 0 on success
- Negative value on failure
External Flash Protection
void ext_flash_lock(void)
Re-enables write protection for external flash.
Called:
- After external flash operations complete
- Before returning control to application
void ext_flash_unlock(void)
Disables write protection for external flash.
Called:
- Before external flash write/erase operations
- May be empty if device doesn't require unlocking
Dual-Bank Support
Some MCUs support hardware-assisted bank swapping for fail-safe updates. Enable with DUALBANK_SWAP=1
.
Required Functions
void hal_flash_dualbank_swap(void)
Performs hardware bank swap operation.
Notes:
- Called to switch between flash banks
- May trigger system reboot
- Implementation is platform-specific
- May not return on some architectures
void fork_bootloader(void)
Manages bootloader redundancy across banks.
Responsibilities:
- Creates backup copy of bootloader if needed
- Ensures both banks have identical bootloader code
- Returns immediately if banks already match
Usage:
- Called during bank management operations
- Critical for fail-safe dual-bank operation
- Must be carefully implemented per platform