Skip to content
Merged
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
13 changes: 8 additions & 5 deletions Bootloader/Adapters/Inc/flash_adapter.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,11 @@
#include <stdint.h>
#include <stdbool.h>

#ifdef EXTERNAL_FLASH
#ifdef EXTERNAL_FLASH // Selecting where will firmware go

#include "quadspi.h"
#include "w25q.h"
#define FIRMWARE_FLASH_SIZE_LIMIT W25Q_CHIP_SIZE
#define PACKET_SIZE W25Q_PAGE_SIZE //TODO: this time size is 256 and 64 byte package can fit in, Check in the future.
// 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.

#else
#define FIRMWARE_FLASH_SIZE_LIMIT (FLASH_SIZE - 0x8000u) //!< Max available flash size for firmware. Flash bank size - FW start address
Expand All @@ -68,6 +67,10 @@
#define RAM_FIRMWARE_ADDRESS (0x20020000UL) //!< RAM address where firmware will be written
#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 RAM_FIRMWARE_ADDRESS (0x34000000UL) //!< RAM address where firmware will be written
#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 Down
14 changes: 10 additions & 4 deletions Bootloader/Adapters/Src/flash_adapter.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,27 +53,33 @@ static uint32_t type_program = FLASH_TYPEPROGRAM_FLASHWORD;
#define FLASH_WORD_SIZE (4U) //!< Flash word size in bytes
#endif

#ifdef INTERNAL_FLASH
HAL_StatusTypeDef ActivateProtection(FLASH_OBProgramInitTypeDef* ob_struct, uint32_t protect_address_start, uint32_t protect_address_end);
#endif

#ifdef EXTERNAL_FLASH
bool
FlashAdapter_erase(uint32_t firmware_size, uint32_t flash_address) {
return W25q_dynamicErase(firmware_size, flash_address);
//return W25q_dynamicErase(firmware_size, flash_address);
return true;
}

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

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

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

bool
Expand Down
3 changes: 3 additions & 0 deletions Bootloader/Adapters/Src/gpio_adapter.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@ GpioAdapter_init(void) {
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE();
#if defined(STM32N657xx)
__HAL_RCC_GPIOG_CLK_ENABLE();
#endif

#if defined(LED1_Pin) && defined(LED1_Port) && defined(LED_OFF)
HAL_GPIO_WritePin(LED1_Port, LED1_Pin, LED_OFF);
Expand Down
99 changes: 99 additions & 0 deletions Bootloader/Adapters/Src/system_clock_adapter.c
Original file line number Diff line number Diff line change
Expand Up @@ -186,5 +186,104 @@ SystemClock_Config(void) {
Error_Handler();
}
}
#elif defined(STM32N6xx)
void
SystemClock_Config(void) {
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

/** Configure the System Power Supply
*/
if (HAL_PWREx_ConfigSupply(PWR_EXTERNAL_SOURCE_SUPPLY) != HAL_OK) {
Error_Handler();
}

/* Enable HSI */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL1.PLLState = RCC_PLL_NONE;
RCC_OscInitStruct.PLL2.PLLState = RCC_PLL_NONE;
RCC_OscInitStruct.PLL3.PLLState = RCC_PLL_NONE;
RCC_OscInitStruct.PLL4.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
Error_Handler();
}

/* Wait HSE stabilization time before its selection as PLL source. */
HAL_Delay(HSE_STARTUP_TIMEOUT);

/** Get current CPU/System buses clocks configuration and if necessary switch
to intermediate HSI clock to ensure target clock can be set
*/
HAL_RCC_GetClockConfig(&RCC_ClkInitStruct);
if ((RCC_ClkInitStruct.CPUCLKSource == RCC_CPUCLKSOURCE_IC1) ||
(RCC_ClkInitStruct.SYSCLKSource == RCC_SYSCLKSOURCE_IC2_IC6_IC11)) {
RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_CPUCLK | RCC_CLOCKTYPE_SYSCLK);
RCC_ClkInitStruct.CPUCLKSource = RCC_CPUCLKSOURCE_HSI;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct) != HAL_OK) {
/* Initialization Error */
Error_Handler();
}
}

/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL1.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL1.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL1.PLLM = 1;
RCC_OscInitStruct.PLL1.PLLN = 50;
RCC_OscInitStruct.PLL1.PLLFractional = 0;
RCC_OscInitStruct.PLL1.PLLP1 = 1;
RCC_OscInitStruct.PLL1.PLLP2 = 1;
RCC_OscInitStruct.PLL2.PLLState = RCC_PLL_NONE;
RCC_OscInitStruct.PLL3.PLLState = RCC_PLL_NONE;
RCC_OscInitStruct.PLL4.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
Error_Handler();
}

/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_CPUCLK | RCC_CLOCKTYPE_HCLK
| RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1
| RCC_CLOCKTYPE_PCLK2 | RCC_CLOCKTYPE_PCLK5
| RCC_CLOCKTYPE_PCLK4;
RCC_ClkInitStruct.CPUCLKSource = RCC_CPUCLKSOURCE_IC1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_IC2_IC6_IC11;
RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV1;
RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV1;
RCC_ClkInitStruct.APB5CLKDivider = RCC_APB5_DIV1;
RCC_ClkInitStruct.IC1Selection.ClockSelection = RCC_ICCLKSOURCE_PLL1;
RCC_ClkInitStruct.IC1Selection.ClockDivider = 3;
RCC_ClkInitStruct.IC2Selection.ClockSelection = RCC_ICCLKSOURCE_PLL1;
RCC_ClkInitStruct.IC2Selection.ClockDivider = 6;
RCC_ClkInitStruct.IC6Selection.ClockSelection = RCC_ICCLKSOURCE_PLL1;
RCC_ClkInitStruct.IC6Selection.ClockDivider = 4;
RCC_ClkInitStruct.IC11Selection.ClockSelection = RCC_ICCLKSOURCE_PLL1;
RCC_ClkInitStruct.IC11Selection.ClockDivider = 3;

if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct) != HAL_OK) {
Error_Handler();
}

__HAL_RCC_AXISRAM3_MEM_CLK_ENABLE();
__HAL_RCC_AXISRAM4_MEM_CLK_ENABLE();
__HAL_RCC_AXISRAM5_MEM_CLK_ENABLE();
__HAL_RCC_AXISRAM6_MEM_CLK_ENABLE();
__HAL_RCC_AHBSRAM1_MEM_CLK_ENABLE();
__HAL_RCC_AHBSRAM2_MEM_CLK_ENABLE();
__HAL_RCC_BKPSRAM_MEM_CLK_ENABLE();
__HAL_RCC_FLEXRAM_MEM_CLK_ENABLE();
__HAL_RCC_CACHEAXIRAM_MEM_CLK_ENABLE();
__HAL_RCC_VENCRAM_MEM_CLK_ENABLE();
}
#endif

2 changes: 2 additions & 0 deletions Bootloader/Inc/board_info.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@
#define PRODUCT_TYPE (const char*)("IMProject_demo-pixhawk4") // Maximum allowed size is 100 characters (101 bytes)
#elif defined(STM32H735G_DK)
#define PRODUCT_TYPE (const char*)("IMProject_demo-stm32h735g_dk") // Maximum allowed size is 100 characters (101 bytes)
#elif defined(NUCLEO_N657X0_Q)
#define PRODUCT_TYPE (const char*)("IMProject_demo-nucleo_n657x0_q") // Maximum allowed size is 100 characters (101 bytes)
#else
#define PRODUCT_TYPE (const char*)("Product_type_name-board_name") // Maximum allowed size is 100 characters (101 bytes)
#endif
Expand Down
13 changes: 13 additions & 0 deletions Bootloader/Inc/boards_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,19 @@
#define LED_ON GPIO_PIN_RESET
#define LED_OFF GPIO_PIN_SET
#define PWR_SUPPLY PWR_DIRECT_SMPS_SUPPLY
#elif defined(NUCLEO_N657X0_Q)
#define LED1_Pin GPIO_PIN_8 //!< Pin defined for blue LED
#define LED1_Port GPIOG
#define LED2_Pin GPIO_PIN_10 //!< Pin defined for red LED
#define LED2_Port GPIOG
#define LED_ON GPIO_PIN_RESET
#define LED_OFF GPIO_PIN_SET
#define BL_BUTTON_Pin GPIO_PIN_13 //!< Button for entering in BL if pressed at boot time
#define BL_BUTTON_Port GPIOC
#define BL_BUTTON_ON GPIO_PIN_SET
#define BL_BUTTON_OFF GPIO_PIN_RESET
#define BL_BUTTON_PRESS_TIME 500u //!< Time in [ms] needed for button to be pressed to enter in BL
#define PWR_SUPPLY PWR_DIRECT_SMPS_SUPPLY
#else
#define LED1_Pin GPIO_PIN_13
#define LED1_Port GPIOC
Expand Down
3 changes: 3 additions & 0 deletions Bootloader/Inc/main.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@ extern "C" {
#elif defined(STM32F7xx)
#include "stm32f7xx.h"
#include "stm32f7xx_hal.h"
#elif defined(STM32N657xx)
#include "stm32n6xx.h"
#include "stm32n6xx_hal.h"
#endif

void Error_Handler(void);
Expand Down
Loading