@@ -58,28 +58,111 @@ HAL_StatusTypeDef ActivateProtection(FLASH_OBProgramInitTypeDef* ob_struct, uint
5858#endif
5959
6060#ifdef EXTERNAL_FLASH
61+
62+ #define MX25UM51245G_SECTOR_SIZE 0xFFF
63+
64+ #include "extmem_manager.h"
65+ #include "stm32_sfdp_driver_api.h"
66+
67+ extern BOOTStatus_TypeDef MapMemory (void );
68+
69+ extern EXTMEM_DefinitionTypeDef extmem_list_config [1 ];
70+
71+ XSPI_HandleTypeDef hxspi2 ;
72+
73+ void
74+ FlashAdapter_init (void ) {
75+ XSPIM_CfgTypeDef sXspiManagerCfg = {0 };
76+
77+ /* XSPI2 parameter configuration*/
78+ hxspi2 .Instance = XSPI2 ;
79+ hxspi2 .Init .FifoThresholdByte = 4 ;
80+ hxspi2 .Init .MemoryMode = HAL_XSPI_SINGLE_MEM ;
81+ hxspi2 .Init .MemoryType = HAL_XSPI_MEMTYPE_MACRONIX ;
82+ hxspi2 .Init .MemorySize = HAL_XSPI_SIZE_1GB ;
83+ hxspi2 .Init .ChipSelectHighTimeCycle = 1 ;
84+ hxspi2 .Init .FreeRunningClock = HAL_XSPI_FREERUNCLK_DISABLE ;
85+ hxspi2 .Init .ClockMode = HAL_XSPI_CLOCK_MODE_0 ;
86+ hxspi2 .Init .WrapSize = HAL_XSPI_WRAP_NOT_SUPPORTED ;
87+ hxspi2 .Init .ClockPrescaler = 0 ;
88+ hxspi2 .Init .SampleShifting = HAL_XSPI_SAMPLE_SHIFT_NONE ;
89+ hxspi2 .Init .DelayHoldQuarterCycle = HAL_XSPI_DHQC_ENABLE ;
90+ hxspi2 .Init .ChipSelectBoundary = HAL_XSPI_BONDARYOF_NONE ;
91+ hxspi2 .Init .MaxTran = 0 ;
92+ hxspi2 .Init .Refresh = 0 ;
93+ hxspi2 .Init .MemorySelect = HAL_XSPI_CSSEL_NCS1 ;
94+ if (HAL_XSPI_Init (& hxspi2 ) != HAL_OK ) {
95+ Error_Handler ();
96+ }
97+ sXspiManagerCfg .nCSOverride = HAL_XSPI_CSSEL_OVR_NCS1 ;
98+ sXspiManagerCfg .IOPort = HAL_XSPIM_IOPORT_2 ;
99+ sXspiManagerCfg .Req2AckTime = 1 ;
100+ if (HAL_XSPIM_Config (& hxspi2 , & sXspiManagerCfg , HAL_XSPI_TIMEOUT_DEFAULT_VALUE ) != HAL_OK ) {
101+ Error_Handler ();
102+ }
103+
104+ MX_EXTMEM_MANAGER_Init ();
105+ MapMemory ();
106+ }
107+
61108bool
62109FlashAdapter_erase (uint32_t firmware_size , uint32_t flash_address ) {
63- //return W25q_dynamicErase(firmware_size, flash_address);
64- return true;
110+
111+ bool success = false;
112+
113+ uint32_t address = (flash_address - FLASH_ADDRESS_BASE - FLASH_ADDRESS_OFFSET );
114+
115+ EXTMEM_DRIVER_NOR_SFDP_Disable_MemoryMappedMode (& (extmem_list_config -> NorSfdpObject ));
116+
117+ EXTMEM_StatusTypeDef retr = EXTMEM_EraseSector (EXTMEMORY_1 , address , firmware_size + FLASH_ADDRESS_OFFSET );
118+
119+ if (EXTMEM_OK == retr ) {
120+ success = true;
121+ }
122+
123+ EXTMEM_DRIVER_NOR_SFDP_Enable_MemoryMappedMode (& (extmem_list_config -> NorSfdpObject ));
124+
125+ return success ;
65126}
66127
67128bool
68129FlashAdapter_blockErase (uint32_t address ) {
69- //return W25q_blockErase64k(address);
70- return true;
130+ return false;
71131}
72132
73133bool
74134FlashAdapter_program (uint32_t address , uint8_t * buffer , uint32_t length ) {
75- //return W25q_quadPageProgram(address, buffer, length);
76- return true;
135+
136+ bool success = false;
137+ EXTMEM_DRIVER_NOR_SFDP_StatusTypeDef ret = EXTMEM_DRIVER_NOR_SFDP_OK ;
138+
139+ address -= FLASH_ADDRESS_BASE ;
140+
141+ ret = EXTMEM_DRIVER_NOR_SFDP_Disable_MemoryMappedMode (& (extmem_list_config -> NorSfdpObject ));
142+
143+ if (EXTMEM_DRIVER_NOR_SFDP_OK == ret ) {
144+ ret = EXTMEM_DRIVER_NOR_SFDP_Write (& (extmem_list_config -> NorSfdpObject ), address , buffer , length );
145+
146+ if (EXTMEM_DRIVER_NOR_SFDP_OK == ret ) {
147+ EXTMEM_DRIVER_NOR_SFDP_Enable_MemoryMappedMode (& (extmem_list_config -> NorSfdpObject ));
148+ }
149+ }
150+
151+ if (EXTMEM_DRIVER_NOR_SFDP_OK == ret ) {
152+ success = true;
153+ }
154+
155+ return success ;
77156}
78157
79158bool
80159FlashAdapter_readBytes (uint32_t address , uint8_t * buffer , uint32_t length ) {
81- //return W25q_readBytes(address, buffer, length);
82- return true;
160+
161+ bool success = true;
162+ // cppcheck-suppress misra-c2012-11.6; address is received as uint32_t
163+ (void * )memcpy ((void * )buffer , (void * )address , length );
164+
165+ return success ;
83166}
84167
85168bool
0 commit comments