Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions .github/workflows/test-build-mcux-sdk.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,15 @@ jobs:
with:
submodules: true

- uses: actions/checkout@main
with:
repository: nxp-mcuxpresso/mcux-sdk
path: mcux-sdk
- name: Install west
run: |
python3 -m pip install --user west
echo "${HOME}/.local/bin" >> $GITHUB_PATH

- uses: actions/checkout@main
with:
repository: nxp-mcuxpresso/CMSIS_5
path: CMSIS_5
- name: Initialize MCUXpresso SDK
run: |
west init -m https://github.com/nxp-mcuxpresso/mcuxsdk-manifests
west update --narrow -o=--depth=1 devices/MCX

- name: Workaround for sources.list
run: sudo sed -i 's|http://azure.archive.ubuntu.com/ubuntu/|http://mirror.arizona.edu/ubuntu/|g' /etc/apt/sources.list
Expand All @@ -58,4 +58,4 @@ jobs:

- name: Build wolfboot
run: |
make MCUXSDK=1 MCUXPRESSO="$GITHUB_WORKSPACE/mcux-sdk" MCUXPRESSO_CMSIS="$GITHUB_WORKSPACE/CMSIS_5/CMSIS" ${{inputs.make-args}} V=1
make MCUXSDK=1 MCUXPRESSO="$GITHUB_WORKSPACE/mcuxsdk" MCUXPRESSO_CMSIS="$GITHUB_WORKSPACE/mcuxsdk/core/CMSIS" ${{inputs.make-args}} V=1
11 changes: 5 additions & 6 deletions .github/workflows/test-configs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -159,12 +159,11 @@ jobs:
arch: ppc
config-file: ./config/examples/nxp-t2080.config

# MCXA test disabled until MCXA is available in mcux
# nxp_mcxa_test:
# uses: ./.github/workflows/test-build-mcux-sdk.yml
# with:
# arch: arm
# config-file: ./config/examples/mcxa.config
nxp_mcxa_test:
uses: ./.github/workflows/test-build-mcux-sdk.yml
with:
arch: arm
config-file: ./config/examples/mcxa.config

raspi3_test:
uses: ./.github/workflows/test-build.yml
Expand Down
42 changes: 38 additions & 4 deletions arch.mk
Original file line number Diff line number Diff line change
Expand Up @@ -610,6 +610,9 @@ endif

ifeq ($(TARGET),mcxa)
CORTEX_M33=1
MCUXPRESSO_DRIVERS=$(MCUXPRESSO)/devices/MCX/MCXA153
MCUXPRESSO_CMSIS_CORE=$(MCUXPRESSO_CMSIS)/Core
CFLAGS+=-I$(MCUXPRESSO_DRIVERS)/drivers -I$(MCUXPRESSO_DRIVERS)
CFLAGS+=\
-I$(MCUXPRESSO_DRIVERS) \
-I$(MCUXPRESSO_DRIVERS)/drivers \
Expand All @@ -624,18 +627,49 @@ ifeq ($(TARGET),mcxa)
LDFLAGS+=-mcpu=cortex-m33
OBJS+=\
$(MCUXPRESSO_DRIVERS)/drivers/fsl_clock.o \
$(MCUXPRESSO_DRIVERS)/drivers/fsl_spc.o
$(MCUXPRESSO)/drivers/mcx_spc/fsl_spc.o

ifeq ($(MCUXSDK),1)
CFLAGS+=\
-I$(MCUXPRESSO)/drivers/flash \
-I$(MCUXPRESSO)/drivers/mcx_spc \
-I$(MCUXPRESSO)/drivers/sysmpu \
-I$(MCUXPRESSO)/drivers/ltc \
-I$(MCUXPRESSO)/drivers/port \
-I$(MCUXPRESSO)/drivers/gpio
endif

ifeq ($(TARGET),mcxw)
CORTEX_M33=1
MCUXPRESSO_DRIVERS=$(MCUXPRESSO)/devices/MCX/MCXW71
MCUXPRESSO_CMSIS_CORE=$(MCUXPRESSO_CMSIS)/Core
CFLAGS+=\
-I$(MCUXPRESSO_DRIVERS) \
-I$(MCUXPRESSO_DRIVERS)/drivers \
-I$(MCUXPRESSO_DRIVERS)/periph2 \
-I$(MCUXPRESSO)/drivers \
-I$(MCUXPRESSO)/drivers/common \
-I$(MCUXPRESSO_CMSIS)/Include \
-I$(MCUXPRESSO_CMSIS)/Core/Include
CFLAGS+=-DCPU_$(MCUXPRESSO_CPU) -DDEBUG_CONSOLE_ASSERT_DISABLE=1
CFLAGS+=-DWOLFSSL_SP_NO_UMAAL
CFLAGS+=-Wno-old-style-declaration
CFLAGS+=-mcpu=cortex-m33 -DCORTEX_M33 -U__ARM_FEATURE_DSP
LDFLAGS+=-mcpu=cortex-m33
OBJS+=\
$(MCUXPRESSO_DRIVERS)/drivers/fsl_clock.o \
$(MCUXPRESSO)/drivers/mcx_spc/fsl_spc.o \
$(MCUXPRESSO_DRIVERS)/project_template/clock_config.o \
$(MCUXPRESSO_DRIVERS)/drivers/fsl_ccm32k.o \
$(MCUXPRESSO_DRIVERS)/drivers/fsl_romapi.o

CFLAGS+=\
-I$(MCUXPRESSO)/drivers/flash \
-I$(MCUXPRESSO)/drivers/mcx_spc \
-I$(MCUXPRESSO)/drivers/sysmpu \
-I$(MCUXPRESSO)/drivers/ltc \
-I$(MCUXPRESSO)/drivers/port \
-I$(MCUXPRESSO)/drivers/gpio

else
endif
endif

ifeq ($(TARGET),imx_rt)
Expand Down
154 changes: 154 additions & 0 deletions hal/mcxw.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
/* mcxw.c
*
* Stubs for custom HAL implementation. Defines the
* functions used by wolfboot for a specific target.
*
* Copyright (C) 2025 wolfSSL Inc.
*
* This file is part of wolfBoot.
*
* wolfBoot is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* wolfBoot is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
*/

#include <stdint.h>
#include <target.h>
#include "image.h"
/* FSL includes */
#include "fsl_common.h"

/* Clock + RAM voltage settings */
#include "fsl_clock.h"
#include "fsl_spc.h"

/* Flash driver */
#include "fsl_device_registers.h"
#include "fsl_lpspi_flash.h"
#include "fsl_k4_flash.h"

/*!< Core clock frequency: 48000000Hz */
#define BOARD_BOOTCLOCKRUN_CORE_CLOCK 48000000U
static flash_config_t pflash;
static uint32_t pflash_sector_size = WOLFBOOT_SECTOR_SIZE;

uint32_t SystemCoreClock;


#ifdef __WOLFBOOT

extern void BOARD_BootClockRUN(void);



/* Assert hook needed by Kinetis SDK */
void __assert_func(const char *a, int b, const char *c, const char *d)
{
while(1)
;
}


void hal_prepare_boot(void)
{

}

#endif

void hal_init(void)
{
#ifdef __WOLFBOOT
/* Clock setting */
BOARD_BootClockRUN();
#endif

/* Flash driver init */
flash_config_t pflash;
/* Clear the FLASH configuration structure */
memset(&pflash, 0, sizeof(pflash));
/* FLASH driver init */
FLASH_Init(&pflash);
FLASH_GetProperty(&pflash, kFLASH_PropertyPflash0SectorSize,
&pflash_sector_size);
}

int RAMFUNCTION hal_flash_write(uint32_t address, const uint8_t *data, int len)
{
int ret;
int w = 0;
const uint8_t empty_qword[16] = {
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};

while (len > 0) {
if ((len < 16) || address & 0x0F) {
uint8_t aligned_qword[16];
uint32_t address_align = address - (address & 0x0F);
uint32_t start_off = address - address_align;
int i;

memcpy(aligned_qword, (void*)address_align, 16);
for (i = start_off; ((i < 16) && (i < len + (int)start_off)); i++) {
aligned_qword[i] = data[w++];
}
if (memcmp(aligned_qword, empty_qword, 16) != 0) {
ret = FLASH_Program(&pflash, FLASH, address_align, aligned_qword, 16);
if (ret != kStatus_Success)
return -1;
}
address += i;
len -= i;
}
else {
uint32_t len_align = len - (len & 0x0F);
ret = FLASH_Program(&pflash, FLASH, address, (uint8_t*)data + w, len_align);
if (ret != kStatus_Success)
return -1;
len -= len_align;
address += len_align;
}
}
return 0;
}

void RAMFUNCTION hal_flash_unlock(void)
{
}

void RAMFUNCTION hal_flash_lock(void)
{
}

int RAMFUNCTION hal_flash_erase(uint32_t address, int len)
{
status_t result;
if (address % pflash_sector_size)
address -= address % pflash_sector_size;
while (len > 0) {
result = FLASH_Erase(&pflash, FLASH, address, pflash_sector_size,
kFLASH_ApiEraseKey);
if (kStatus_FLASH_Success != result)
return -1;

/* Verify sector if it's been erased. */
result = FLASH_VerifyEraseSector(&pflash, FLASH, address,
pflash_sector_size);
if (kStatus_FLASH_Success != result)
return -1;
len -= pflash_sector_size;
}
return 0;
}

54 changes: 54 additions & 0 deletions hal/mcxw.ld
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
MEMORY
{
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = @BOOTLOADER_PARTITION_SIZE@
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 24K
}

SECTIONS
{

.text :
{
_start_text = .;
KEEP(*(.isr_vector))
. = 0x200;
*(.keystore*)
*(.text*)
*(.rodata*)
*(.init*)
*(.fini*)
. = ALIGN(4);
_end_text = .;
} > FLASH

.edidx :
{
. = ALIGN(4);
*(.ARM.exidx*)
} > FLASH

_stored_data = .;

.data : AT (_stored_data)
{
_start_data = .;
KEEP(*(.data*))
. = ALIGN(4);
_end_data = .;
} > RAM

.bss (NOLOAD) :
{
_start_bss = .;
__bss_start__ = .;
*(.bss*)
*(COMMON)
. = ALIGN(4);
_end_bss = .;
__bss_end__ = .;
_end = .;
} > RAM
. = ALIGN(4);
}

END_STACK = ORIGIN(RAM) + LENGTH(RAM);
57 changes: 57 additions & 0 deletions test-app/ARM-mcxw.ld
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
MEMORY
{
FLASH (rx) : ORIGIN = @WOLFBOOT_TEST_APP_ADDRESS@, LENGTH = @WOLFBOOT_TEST_APP_SIZE@
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 24K
}

SECTIONS
{
.text :
{
_start_text = .;
KEEP(*(.isr_vector))
*(.init)
*(.fini)
*(.text*)
KEEP(*(.rodata*))
. = ALIGN(4);
_end_text = .;
} > FLASH

.ARM :
{
__exidx_start = .;
*(.ARM.exidx*)
__exidx_end = .;
} > FLASH

_stored_data = .;

.data : AT (_stored_data)
{
_start_data = .;
KEEP(*(.data*))
. = ALIGN(4);
KEEP(*(.ramcode))
. = ALIGN(4);
_end_data = .;
} > RAM

.bss :
{
_start_bss = .;
*(.bss*)
*(COMMON)
. = ALIGN(4);
_end_bss = .;
_end = .;
} > RAM
}

_wolfboot_partition_boot_address = @WOLFBOOT_PARTITION_BOOT_ADDRESS@;
_wolfboot_partition_size = @WOLFBOOT_PARTITION_SIZE@;
_wolfboot_partition_update_address = @WOLFBOOT_PARTITION_UPDATE_ADDRESS@;
_wolfboot_partition_swap_address = @WOLFBOOT_PARTITION_SWAP_ADDRESS@;

PROVIDE(_start_heap = _end);
PROVIDE(_end_stack = ORIGIN(RAM) + LENGTH(RAM));
Loading
Loading