@@ -58,28 +58,110 @@ HAL_StatusTypeDef ActivateProtection(FLASH_OBProgramInitTypeDef* ob_struct, uint
58
58
#endif
59
59
60
60
#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
+
61
108
bool
62
109
FlashAdapter_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 - 0x70000000UL );
114
+
115
+ EXTMEM_DRIVER_NOR_SFDP_Disable_MemoryMappedMode (& (extmem_list_config -> NorSfdpObject ));
116
+
117
+ EXTMEM_StatusTypeDef retr = EXTMEM_EraseSector (EXTMEMORY_1 , address , firmware_size );
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 ;
65
126
}
66
127
67
128
bool
68
129
FlashAdapter_blockErase (uint32_t address ) {
69
- //return W25q_blockErase64k(address);
70
- return true;
130
+ return false;
71
131
}
72
132
73
133
bool
74
134
FlashAdapter_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 -= 0x70000000UL ;
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 ;
77
156
}
78
157
79
158
bool
80
159
FlashAdapter_readBytes (uint32_t address , uint8_t * buffer , uint32_t length ) {
81
- //return W25q_readBytes(address, buffer, length);
82
- return true;
160
+ bool success = true;
161
+ // cppcheck-suppress misra-c2012-11.6; address is received as uint32_t
162
+ (void * )memcpy ((void * )buffer , (void * )address , length );
163
+
164
+ return success ;
83
165
}
84
166
85
167
bool
0 commit comments