Skip to content

Commit 3e80589

Browse files
committed
Integrate wolfHAL
1 parent 472cab6 commit 3e80589

12 files changed

Lines changed: 419 additions & 0 deletions

File tree

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,6 @@
1313
[submodule "lib/wolfPSA"]
1414
path = lib/wolfPSA
1515
url = https://github.com/wolfSSL/wolfPSA.git
16+
[submodule "lib/wolfHAL"]
17+
path = lib/wolfHAL
18+
url = https://github.com/wolfSSL/wolfHAL.git

Makefile

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,20 +142,23 @@ WOLFBOOT_LIB_WOLFTPM?=lib/wolfTPM
142142
WOLFBOOT_LIB_WOLFPKCS11?=lib/wolfPKCS11
143143
WOLFBOOT_LIB_WOLFPSA?=lib/wolfPSA
144144
WOLFBOOT_LIB_WOLFHSM?=lib/wolfHSM
145+
WOLFBOOT_LIB_WOLFHAL?=lib/wolfHAL
145146

146147
# Convert to absolute paths using abspath function
147148
WOLFBOOT_LIB_WOLFSSL:=$(abspath $(WOLFBOOT_LIB_WOLFSSL))
148149
WOLFBOOT_LIB_WOLFTPM:=$(abspath $(WOLFBOOT_LIB_WOLFTPM))
149150
WOLFBOOT_LIB_WOLFPKCS11:=$(abspath $(WOLFBOOT_LIB_WOLFPKCS11))
150151
WOLFBOOT_LIB_WOLFPSA:=$(abspath $(WOLFBOOT_LIB_WOLFPSA))
151152
WOLFBOOT_LIB_WOLFHSM:=$(abspath $(WOLFBOOT_LIB_WOLFHSM))
153+
WOLFBOOT_LIB_WOLFHAL:=$(abspath $(WOLFBOOT_LIB_WOLFHAL))
152154

153155
# Export variables so they are available to sub-makefiles
154156
export WOLFBOOT_LIB_WOLFSSL
155157
export WOLFBOOT_LIB_WOLFTPM
156158
export WOLFBOOT_LIB_WOLFPKCS11
157159
export WOLFBOOT_LIB_WOLFPSA
158160
export WOLFBOOT_LIB_WOLFHSM
161+
export WOLFBOOT_LIB_WOLFHAL
159162

160163
## Architecture/CPU configuration
161164
include arch.mk
@@ -227,6 +230,13 @@ ifeq ($(TARGET),stm32h5)
227230
endif
228231
endif # TZEN=1
229232

233+
ifeq ($(TARGET),wolfhal)
234+
LSCRIPT_IN:=hal/$(WOLFHAL_TARGET).ld
235+
CFLAGS+= -I$(WOLFBOOT_LIB_WOLFHAL)
236+
OBJS+=config/wolfHAL/$(WOLFHAL_BOARD).o
237+
include config/wolfHAL/$(WOLFHAL_BOARD).mk
238+
endif
239+
230240
ifeq ($(TARGET),x86_64_efi)
231241
MAIN_TARGET:=wolfboot.efi
232242
endif

arch.mk

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,12 @@ ifeq ($(ARCH),ARM)
203203
endif
204204
endif
205205

206+
ifeq ($(TARGET),wolfhal)
207+
ifeq ($(WOLFHAL_TARGET),stm32wb)
208+
ARCH_FLASH_OFFSET=0x08000000
209+
SPI_TARGET=stm32
210+
endif
211+
endif
206212

207213
ifeq ($(TARGET),stm32l5)
208214
CORTEX_M33=1
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
TARGET=wolfhal
2+
SIGN=ECC256
3+
HASH=SHA256
4+
WOLFBOOT_SECTOR_SIZE=0x1000
5+
WOLFBOOT_PARTITION_SIZE=0x20000
6+
WOLFBOOT_PARTITION_BOOT_ADDRESS=0x08010000
7+
WOLFBOOT_PARTITION_UPDATE_ADDRESS=0x08028000
8+
WOLFBOOT_PARTITION_SWAP_ADDRESS=0x08048000
9+
NVM_FLASH_WRITEONCE=1
10+
PKA=0
11+
WOLFHAL_TARGET=stm32wb
12+
WOLFHAL_BOARD=stm32wb55_nucleo
13+
WOLFHAL_FLASH_SIZE=0x100000
14+
WOLFHAL_INIT_HOOKS=1

config/wolfHAL/stm32wb55_nucleo.c

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
#include <wolfHAL/platform/st/stm32wb55xx.h>
2+
3+
whal_StRcc_PeriphClk periphClkEn[] =
4+
{
5+
WHAL_ST_RCC_PERIPH_GPIOA,
6+
WHAL_ST_RCC_PERIPH_GPIOB,
7+
WHAL_ST_RCC_PERIPH_LPUART1,
8+
WHAL_ST_RCC_PERIPH_FLASH,
9+
};
10+
11+
whal_Clock wbClock = {
12+
WHAL_STM32WB55_RCC_DEVICE,
13+
14+
.cfg = &(whal_StRcc_Cfg){
15+
.sysClkSrc = WHAL_ST_RCC_SYSCLK_SRC_PLL,
16+
.sysClkCfg.pll =
17+
{
18+
.clkSrc = WHAL_ST_RCC_PLLCLK_SRC_MSI,
19+
/* 64 MHz */
20+
.n = 32,
21+
.m = 0,
22+
.r = 1,
23+
.q = 0,
24+
.p = 0,
25+
},
26+
.periphClkEn = periphClkEn,
27+
.periphClkEnCount = sizeof(periphClkEn) / sizeof(whal_StRcc_PeriphClk),
28+
},
29+
};
30+
31+
whal_Gpio wbGpio = {
32+
WHAL_STM32WB55_GPIO_DEVICE,
33+
34+
.pinCfg = &(whal_StGpio_Cfg[3]){
35+
{ /* LED */
36+
.port = WHAL_STGPIO_PORT_B,
37+
.pin = 5,
38+
.mode = WHAL_STGPIO_MODE_OUT,
39+
.outType = WHAL_STGPIO_OUTTYPE_PUSHPULL,
40+
.speed = WHAL_STGPIO_SPEED_LOW,
41+
.pull = WHAL_STGPIO_PULL_UP,
42+
.altFn = 0,
43+
},
44+
{ /* LPUART1 TX */
45+
.port = WHAL_STGPIO_PORT_A,
46+
.pin = 2,
47+
.mode = WHAL_STGPIO_MODE_ALTFN,
48+
.outType = WHAL_STGPIO_OUTTYPE_PUSHPULL,
49+
.speed = WHAL_STGPIO_SPEED_FAST,
50+
.pull = WHAL_STGPIO_PULL_UP,
51+
.altFn = 8,
52+
},
53+
{ /* LPUART1 RX */
54+
.port = WHAL_STGPIO_PORT_A,
55+
.pin = 3,
56+
.mode = WHAL_STGPIO_MODE_ALTFN,
57+
.outType = WHAL_STGPIO_OUTTYPE_PUSHPULL,
58+
.speed = WHAL_STGPIO_SPEED_FAST,
59+
.pull = WHAL_STGPIO_PULL_UP,
60+
.altFn = 8,
61+
},
62+
},
63+
.pinCount = 3,
64+
};
65+
66+
whal_Uart wbUart = {
67+
WHAL_STM32WB55_LPUART1_DEVICE,
68+
69+
.cfg = &(whal_StUart_Cfg){
70+
.baud = 115200,
71+
.sysClk = &wbClock,
72+
},
73+
};
74+
75+
whal_Flash wbFlash = {
76+
WHAL_STM32WB55_FLASH_DEVICE,
77+
78+
.cfg = &(whal_StFlash_Cfg) {
79+
.startAddr = 0x08000000,
80+
.size = 0x100000,
81+
},
82+
};
83+
84+
void hal_pre_init()
85+
{
86+
/* The flash read latency needs to be set prior to
87+
* calling whal_Clock_Enable in hal_init() */
88+
89+
whal_StFlash_SetLatencyArgs wbFlashLatency = {
90+
.latency = WHAL_ST_FLASH_LATENCY_3
91+
};
92+
whal_Flash_Cmd(&wbFlash, WHAL_ST_FLASH_CMD_SET_LATENCY, &wbFlashLatency);
93+
}
94+
95+
void hal_post_prepare_boot()
96+
{
97+
whal_StFlash_SetLatencyArgs wbFlashLatency = {
98+
.latency = WHAL_ST_FLASH_LATENCY_0
99+
};
100+
whal_Flash_Cmd(&wbFlash, WHAL_ST_FLASH_CMD_SET_LATENCY, &wbFlashLatency);
101+
}

config/wolfHAL/stm32wb55_nucleo.mk

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
OBJS += $(WOLFBOOT_LIB_WOLFHAL)/src/reg.o
2+
3+
OBJS += $(WOLFBOOT_LIB_WOLFHAL)/src/clock/clock.o \
4+
$(WOLFBOOT_LIB_WOLFHAL)/src/uart/uart.o \
5+
$(WOLFBOOT_LIB_WOLFHAL)/src/gpio/gpio.o \
6+
$(WOLFBOOT_LIB_WOLFHAL)/src/flash/flash.o
7+
8+
9+
OBJS += $(WOLFBOOT_LIB_WOLFHAL)/src/clock/st_rcc.o \
10+
$(WOLFBOOT_LIB_WOLFHAL)/src/uart/st_uart.o \
11+
$(WOLFBOOT_LIB_WOLFHAL)/src/gpio/st_gpio.o \
12+
$(WOLFBOOT_LIB_WOLFHAL)/src/flash/st_flash.o
13+
14+
APP_OBJS += $(WOLFBOOT_LIB_WOLFHAL)/src/reg.o
15+
16+
APP_OBJS += $(WOLFBOOT_LIB_WOLFHAL)/src/clock/clock.o \
17+
$(WOLFBOOT_LIB_WOLFHAL)/src/uart/uart.o \
18+
$(WOLFBOOT_LIB_WOLFHAL)/src/gpio/gpio.o \
19+
$(WOLFBOOT_LIB_WOLFHAL)/src/flash/flash.o
20+
21+
22+
APP_OBJS += $(WOLFBOOT_LIB_WOLFHAL)/src/clock/st_rcc.o \
23+
$(WOLFBOOT_LIB_WOLFHAL)/src/uart/st_uart.o \
24+
$(WOLFBOOT_LIB_WOLFHAL)/src/gpio/st_gpio.o \
25+
$(WOLFBOOT_LIB_WOLFHAL)/src/flash/st_flash.o

hal/uart/uart_drv_wolfhal.c

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/* uart_drv_stm32wb.c
2+
*
3+
* Driver for the back-end of the UART_FLASH module.
4+
*
5+
* Example implementation for stm32WB, using UART1.
6+
*
7+
* Pinout: RX=PB7, TX=PB6 (VCOM port UART1 -> STLINK USB)
8+
*
9+
* Copyright (C) 2025 wolfSSL Inc.
10+
*
11+
* This file is part of wolfBoot.
12+
*
13+
* wolfBoot is free software; you can redistribute it and/or modify
14+
* it under the terms of the GNU General Public License as published by
15+
* the Free Software Foundation; either version 3 of the License, or
16+
* (at your option) any later version.
17+
*
18+
* wolfBoot is distributed in the hope that it will be useful,
19+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
20+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21+
* GNU General Public License for more details.
22+
*
23+
* You should have received a copy of the GNU General Public License
24+
* along with this program; if not, write to the Free Software
25+
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
26+
*/
27+
28+
#ifdef TARGET_wolfhal
29+
30+
#include <stdint.h>
31+
#include <wolfHAL/wolfHAL.h>
32+
33+
extern whal_Uart wbUart;
34+
35+
int uart_tx(const uint8_t c)
36+
{
37+
whal_Uart_Send(&wbUart, &c, 1);
38+
return 1;
39+
}
40+
41+
int uart_rx(uint8_t *c)
42+
{
43+
whal_Uart_Recv(&wbUart, c, 1);
44+
/* ALEX NOTE: this function also returns zero if no data is available... */
45+
return 1;
46+
}
47+
48+
int uart_init(uint32_t bitrate, uint8_t data, char parity, uint8_t stop)
49+
{
50+
/* Handle these configure options in the wolfHAL UART config */
51+
(void)bitrate;
52+
(void)data;
53+
(void)parity;
54+
(void)stop;
55+
56+
whal_Error err;
57+
err = whal_Uart_Init(&wbUart);
58+
if (err) {
59+
return 1;
60+
}
61+
62+
return 0;
63+
}
64+
65+
#ifdef DEBUG_UART
66+
void uart_write(const char *buf, unsigned int len)
67+
{
68+
whal_Uart_Send(&wbUart, (uint8_t *)buf, len);
69+
}
70+
#endif
71+
72+
#endif /* TARGET_wolfhal */

hal/wolfhal.c

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/* stm32wb.c
2+
*
3+
* Copyright (C) 2025 wolfSSL Inc.
4+
*
5+
* This file is part of wolfBoot.
6+
*
7+
* wolfBoot is free software; you can redistribute it and/or modify
8+
* it under the terms of the GNU General Public License as published by
9+
* the Free Software Foundation; either version 3 of the License, or
10+
* (at your option) any later version.
11+
*
12+
* wolfBoot is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
* GNU General Public License for more details.
16+
*
17+
* You should have received a copy of the GNU General Public License
18+
* along with this program; if not, write to the Free Software
19+
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
20+
*/
21+
22+
#include <stdint.h>
23+
#include <wolfHAL/wolfHAL.h>
24+
#include "image.h"
25+
26+
extern whal_Clock wbClock;
27+
extern whal_Gpio wbGpio;
28+
extern whal_Uart wbUart;
29+
extern whal_Flash wbFlash;
30+
31+
#ifdef WOLFHAL_INIT_HOOKS
32+
extern void hal_pre_init();
33+
extern void hal_post_prepare_boot();
34+
#endif /* WOLFHAL_INIT_HOOKS */
35+
36+
void RAMFUNCTION hal_flash_unlock(void)
37+
{
38+
whal_Flash_Unlock(&wbFlash,
39+
0, WOLFHAL_FLASH_SIZE);
40+
}
41+
42+
void RAMFUNCTION hal_flash_lock(void)
43+
{
44+
whal_Flash_Lock(&wbFlash,
45+
0, WOLFHAL_FLASH_SIZE);
46+
}
47+
48+
int RAMFUNCTION hal_flash_write(uint32_t address, const uint8_t *data, int len)
49+
{
50+
whal_Flash_Write(&wbFlash, address, data, len);
51+
return 0;
52+
}
53+
54+
int RAMFUNCTION hal_flash_erase(uint32_t address, int len)
55+
{
56+
if (len == 0)
57+
return -1;
58+
59+
whal_Flash_Erase(&wbFlash, address, len);
60+
return 0;
61+
}
62+
63+
void hal_init(void)
64+
{
65+
#ifdef WOLFHAL_INIT_HOOKS
66+
hal_pre_init();
67+
#endif /* WOLFHAL_INIT_HOOKS */
68+
69+
whal_Clock_Init(&wbClock);
70+
whal_Clock_Enable(&wbClock);
71+
72+
whal_Gpio_Init(&wbGpio);
73+
whal_Uart_Init(&wbUart);
74+
whal_Flash_Init(&wbFlash);
75+
}
76+
77+
void hal_prepare_boot(void)
78+
{
79+
whal_Flash_Deinit(&wbFlash);
80+
whal_Uart_Deinit(&wbUart);
81+
whal_Gpio_Deinit(&wbGpio);
82+
83+
whal_Clock_Disable(&wbClock);
84+
whal_Clock_Deinit(&wbClock);
85+
86+
#ifdef WOLFHAL_INIT_HOOKS
87+
hal_post_prepare_boot();
88+
#endif /* WOLFHAL_INIT_HOOKS */
89+
}

lib/wolfHAL

Submodule wolfHAL added at 6a463b2

options.mk

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1145,3 +1145,11 @@ endif
11451145
ifeq ($(TZEN),1)
11461146
CFLAGS+=-DTZEN
11471147
endif
1148+
1149+
ifneq ($(WOLFHAL_FLASH_SIZE),)
1150+
CFLAGS+=-DWOLFHAL_FLASH_SIZE=$(WOLFHAL_FLASH_SIZE)
1151+
endif
1152+
1153+
ifeq ($(WOLFHAL_INIT_HOOKS),1)
1154+
CFLAGS+=-DWOLFHAL_INIT_HOOKS=$(WOLFHAL_INIT_HOOKS)
1155+
endif

0 commit comments

Comments
 (0)