Skip to content
Draft
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
16 changes: 11 additions & 5 deletions Bootloader/Adapters/Inc/flash_adapter.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,10 @@

#ifdef EXTERNAL_FLASH // Selecting where will firmware go

// TODO: add support for external flash chip
#define FIRMWARE_FLASH_SIZE_LIMIT (100000U)
#define PACKET_SIZE 256U //TODO: this time size is 256 and 64 byte package can fit in, Check in the future.
#define ENABLE_SSBL

#define FIRMWARE_FLASH_SIZE_LIMIT (100000U)
#define PACKET_SIZE (256U)

#else
#define FIRMWARE_FLASH_SIZE_LIMIT (FLASH_SIZE - 0x8000u) //!< Max available flash size for firmware. Flash bank size - FW start address
Expand All @@ -68,9 +69,11 @@
#define MAGIC_KEY_ADDRESS_FLASH (0x08020200UL) //!< Flash address in internal flash for communication between bootloader and firmware
#define MAGIC_KEY_ADDRESS_RAM (0x20070000UL) //!< Flash address in ram for communication between bootloader and firmware
#elif defined(STM32N6xx)
#define FLASH_FIRMWARE_ADDRESS (0x08020000UL) //!< Flash address where firmware will be written
#define FLASH_BOOTLOADER_ADDRESS (0x08000000UL) //!< Flash address where bootloader will be written
#define FLASH_FIRMWARE_ADDRESS (0x70200400UL) //!< Flash address where firmware will be written
#define FLASH_BOOTLOADER_ADDRESS (0x70100400UL) //!< Flash address where bootloader (SSBL) will be written
#define RAM_FIRMWARE_ADDRESS (0x34000000UL) //!< RAM address where firmware will be written
#define FLASH_ADDRESS_BASE (0x70000000UL) //!< Address where the external flash starts
#define FLASH_ADDRESS_OFFSET (0x400UL) //!< For compatibility with the STM32 SigningTool header
#else // UnitTest
#define FLASH_FIRMWARE_ADDRESS (0x08020000UL) //!< Flash address where firmware will be written
#define FLASH_BOOTLOADER_ADDRESS (0x08000000UL) //!< Flash address where bootloader will be written
Expand All @@ -92,5 +95,8 @@ bool FlashAdapter_setReadProtection(bool enable);
/* proprietary code readout protection */
bool FlashAdapter_setPCROP(bool enable, uint32_t protect_address_start, uint32_t protect_address_end);

#ifdef EXTERNAL_FLASH
void FlashAdapter_init(void);
#endif

#endif /* BOOTLOADER_INC_FLASH_ADAPTER_H_ */
99 changes: 91 additions & 8 deletions Bootloader/Adapters/Src/flash_adapter.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,28 +58,111 @@ HAL_StatusTypeDef ActivateProtection(FLASH_OBProgramInitTypeDef* ob_struct, uint
#endif

#ifdef EXTERNAL_FLASH

#define MX25UM51245G_SECTOR_SIZE 0xFFF

#include "extmem_manager.h"
#include "stm32_sfdp_driver_api.h"

extern BOOTStatus_TypeDef MapMemory(void);

extern EXTMEM_DefinitionTypeDef extmem_list_config[1];

XSPI_HandleTypeDef hxspi2;

void
FlashAdapter_init(void) {
XSPIM_CfgTypeDef sXspiManagerCfg = {0};

/* XSPI2 parameter configuration*/
hxspi2.Instance = XSPI2;
hxspi2.Init.FifoThresholdByte = 4;
hxspi2.Init.MemoryMode = HAL_XSPI_SINGLE_MEM;
hxspi2.Init.MemoryType = HAL_XSPI_MEMTYPE_MACRONIX;
hxspi2.Init.MemorySize = HAL_XSPI_SIZE_1GB;
hxspi2.Init.ChipSelectHighTimeCycle = 1;
hxspi2.Init.FreeRunningClock = HAL_XSPI_FREERUNCLK_DISABLE;
hxspi2.Init.ClockMode = HAL_XSPI_CLOCK_MODE_0;
hxspi2.Init.WrapSize = HAL_XSPI_WRAP_NOT_SUPPORTED;
hxspi2.Init.ClockPrescaler = 0;
hxspi2.Init.SampleShifting = HAL_XSPI_SAMPLE_SHIFT_NONE;
hxspi2.Init.DelayHoldQuarterCycle = HAL_XSPI_DHQC_ENABLE;
hxspi2.Init.ChipSelectBoundary = HAL_XSPI_BONDARYOF_NONE;
hxspi2.Init.MaxTran = 0;
hxspi2.Init.Refresh = 0;
hxspi2.Init.MemorySelect = HAL_XSPI_CSSEL_NCS1;
if (HAL_XSPI_Init(&hxspi2) != HAL_OK) {
Error_Handler();
}
sXspiManagerCfg.nCSOverride = HAL_XSPI_CSSEL_OVR_NCS1;
sXspiManagerCfg.IOPort = HAL_XSPIM_IOPORT_2;
sXspiManagerCfg.Req2AckTime = 1;
if (HAL_XSPIM_Config(&hxspi2, &sXspiManagerCfg, HAL_XSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
Error_Handler();
}

MX_EXTMEM_MANAGER_Init();
MapMemory();
}

bool
FlashAdapter_erase(uint32_t firmware_size, uint32_t flash_address) {
//return W25q_dynamicErase(firmware_size, flash_address);
return true;

bool success = false;

uint32_t address = (flash_address - FLASH_ADDRESS_BASE - FLASH_ADDRESS_OFFSET);

EXTMEM_DRIVER_NOR_SFDP_Disable_MemoryMappedMode(&(extmem_list_config->NorSfdpObject));

EXTMEM_StatusTypeDef retr = EXTMEM_EraseSector(EXTMEMORY_1, address, firmware_size + FLASH_ADDRESS_OFFSET);

if (EXTMEM_OK == retr) {
success = true;
}

EXTMEM_DRIVER_NOR_SFDP_Enable_MemoryMappedMode(&(extmem_list_config->NorSfdpObject));

return success;
}

bool
FlashAdapter_blockErase(uint32_t address) {
//return W25q_blockErase64k(address);
return true;
return false;
}

bool
FlashAdapter_program(uint32_t address, uint8_t* buffer, uint32_t length) {
//return W25q_quadPageProgram(address, buffer, length);
return true;

bool success = false;
EXTMEM_DRIVER_NOR_SFDP_StatusTypeDef ret = EXTMEM_DRIVER_NOR_SFDP_OK;

address -= FLASH_ADDRESS_BASE;

ret = EXTMEM_DRIVER_NOR_SFDP_Disable_MemoryMappedMode(&(extmem_list_config->NorSfdpObject));

if (EXTMEM_DRIVER_NOR_SFDP_OK == ret) {
ret = EXTMEM_DRIVER_NOR_SFDP_Write(&(extmem_list_config->NorSfdpObject), address, buffer, length);

if (EXTMEM_DRIVER_NOR_SFDP_OK == ret) {
EXTMEM_DRIVER_NOR_SFDP_Enable_MemoryMappedMode(&(extmem_list_config->NorSfdpObject));
}
}

if (EXTMEM_DRIVER_NOR_SFDP_OK == ret) {
success = true;
}

return success;
}

bool
FlashAdapter_readBytes(uint32_t address, uint8_t* buffer, uint32_t length) {
//return W25q_readBytes(address, buffer, length);
return true;

bool success = true;
// cppcheck-suppress misra-c2012-11.6; address is received as uint32_t
(void*)memcpy((void*)buffer, (void*)address, length);

return success;
}

bool
Expand Down
1 change: 1 addition & 0 deletions Bootloader/Adapters/Src/gpio_adapter.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ GpioAdapter_init(void) {
__HAL_RCC_GPIOF_CLK_ENABLE();
#if defined(STM32N657xx)
__HAL_RCC_GPIOG_CLK_ENABLE();
__HAL_RCC_GPION_CLK_ENABLE();
#endif

#if defined(LED1_Pin) && defined(LED1_Port) && defined(LED_OFF)
Expand Down
11 changes: 6 additions & 5 deletions Bootloader/Inc/signature.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,12 @@ typedef struct signature {

//! Enumeration for different signatures
typedef enum signatureType_ENUM {
signatureType_FIRMWARE_FLASH = 0x00, //!< New firmware for FLASH
signatureType_FIRMWARE_RAM = 0x01, //!< Firmware for RAM
signatureType_BOOTLOADER_FLASH = 0x02, //!< New bootloader for FLASH
signatureType_BOOTLOADER_RAM = 0x03, //!< Bootloader for RAM
signatureType_UNKNOWN = 0xFF, //!< Not existing or unknown signature
signatureType_FIRMWARE_FLASH = 0x00, //!< New firmware for FLASH
signatureType_FIRMWARE_RAM = 0x01, //!< Firmware for RAM
signatureType_BOOTLOADER_INT_FLASH = 0x02, //!< New bootloader for Internal FLASH
signatureType_BOOTLOADER_RAM = 0x03, //!< Bootloader for RAM
signatureType_BOOTLOADER_EXT_FLASH = 0x04, //!< New bootloader for External FLASH
signatureType_UNKNOWN = 0xFF, //!< Not existing or unknown signature
} signatureType_E;

signatureType_E Signature_verification(const signature_S* signature);
Expand Down
77 changes: 77 additions & 0 deletions Bootloader/STM32/ExtMemManager/extmem_manager.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : extmem_manager.c
* @version : 1.0.0
* @brief : This file implements the extmem configuration
******************************************************************************
* @attention
*
* Copyright (c) 2025 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include "extmem_manager.h"
#include <string.h>

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/

/* USER CODE END PV */

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/

/* USER CODE END PFP */

/*
* -- Insert your variables declaration here --
*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/*
* -- Insert your external function declaration here --
*/
/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/**
* Init External memory manager
* @retval None
*/
void
MX_EXTMEM_MANAGER_Init(void) {

/* USER CODE BEGIN MX_EXTMEM_Init_PreTreatment */

/* USER CODE END MX_EXTMEM_Init_PreTreatment */

/* Initialization of the memory parameters */
memset(extmem_list_config, 0x0, sizeof(extmem_list_config));

/* EXTMEMORY_1 */
extmem_list_config[0].MemType = EXTMEM_NOR_SFDP;
extmem_list_config[0].Handle = (void*)&hxspi2;
extmem_list_config[0].ConfigType = EXTMEM_LINK_CONFIG_8LINES;

EXTMEM_Init(EXTMEMORY_1, HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_XSPI2));

/* USER CODE BEGIN MX_EXTMEM_Init_PostTreatment */

/* USER CODE END MX_EXTMEM_Init_PostTreatment */
}
67 changes: 67 additions & 0 deletions Bootloader/STM32/ExtMemManager/extmem_manager.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : extmem_manager.h
* @version : 1.0.0
* @brief : Header for secure_manager_api.c file.
******************************************************************************
* @attention
*
* Copyright (c) 2025 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __MX_EXTMEM__H__
#define __MX_EXTMEM__H__

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "stm32_extmem_conf.h"

/* USER CODE BEGIN INCLUDE */

/* USER CODE END INCLUDE */

/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/*
* -- Insert your variables declaration here --
*/
/* USER CODE BEGIN VARIABLES */

/* USER CODE END VARIABLES */

void MX_EXTMEM_MANAGER_Init(void);

/*
* -- Insert functions declaration here --
*/
/* USER CODE BEGIN FD */

/* USER CODE END FD */

#ifdef __cplusplus
}
#endif

#endif /* __MX_EXTMEM__H__ */

Loading