33
33
/* Private define ------------------------------------------------------------ */
34
34
#define FLASH_DESC_STR " @Internal Flash 2MB /0x08000000/01*128Ka,15*128Kg"
35
35
// #define BOOTLOADER_DESC_STR "@Option Bits /0x52002000/01*1Ka"
36
- #define QSPI_FLASH_DESC_STR " @External Flash 16MB /0x90000000/16*128Kg"
36
+ #define QSPI_FLASH_DESC_STR " @Ext RAW Flash 16MB /0x90000000/4096*4Kg"
37
+ #define FILE_FLASH_DESC_STR " @Ext File Flash 16MB /0xA0000000/16*128Kg"
37
38
38
39
#define FLASH_ERASE_TIME (uint16_t )0
39
40
#define FLASH_PROGRAM_TIME (uint16_t )0
@@ -54,14 +55,17 @@ uint16_t Flash_If_DeInit(void);
54
55
uint16_t Flash_If_GetStatus (uint32_t Add, uint8_t Cmd, uint8_t * buffer);
55
56
56
57
FlashIAP flash;
58
+ QSPIFBlockDevice qspi_flash (PD_11, PD_12, PF_7, PD_13, PF_10, PG_6, QSPIF_POLARITY_MODE_1, 40000000 );
57
59
mbed::BlockDevice* dfu_secondary_bd = get_secondary_bd();
58
60
59
61
const uint32_t QSPIFLASH_BASE_ADDRESS = 0x90000000 ;
62
+ const uint32_t FILEBLOCK_BASE_ADDRESS = 0xA0000000 ;
60
63
61
64
USBD_DFU_MediaTypeDef USBD_DFU_Flash_fops = {
62
65
{
63
66
(uint8_t *) FLASH_DESC_STR,
64
67
(uint8_t *) QSPI_FLASH_DESC_STR,
68
+ (uint8_t *) FILE_FLASH_DESC_STR,
65
69
(uint8_t *) BOOTLOADER_DESC_STR
66
70
},
67
71
Flash_If_Init,
@@ -76,6 +80,7 @@ bool Flash_If_Init_requested = false;
76
80
77
81
void init_Memories () {
78
82
flash.init ();
83
+ qspi_flash.init ();
79
84
dfu_secondary_bd->init ();
80
85
snprintf (BOOTLOADER_DESC_STR, sizeof (BOOTLOADER_DESC_STR), " @MCUBoot version %d /0x00000000/0*4Kg" , BOOTLOADER_VERSION);
81
86
}
@@ -112,16 +117,23 @@ static bool isExternalFlash(uint32_t Add) {
112
117
return (Add >= QSPIFLASH_BASE_ADDRESS);
113
118
}
114
119
120
+ static bool isFileBlockFlash (uint32_t Add) {
121
+ return (Add >= FILEBLOCK_BASE_ADDRESS);
122
+ }
123
+
115
124
/* *
116
125
* @brief Erases sector.
117
126
* @param Add: Address of sector to be erased.
118
127
* @retval 0 if operation is successful, MAL_FAIL else.
119
128
*/
120
129
uint16_t Flash_If_Erase (uint32_t Add)
121
130
{
122
- if (isExternalFlash (Add)) {
123
- Add -= QSPIFLASH_BASE_ADDRESS ;
131
+ if (isFileBlockFlash (Add)) {
132
+ Add -= FILEBLOCK_BASE_ADDRESS ;
124
133
return dfu_secondary_bd->erase (Add, dfu_secondary_bd->get_erase_size (Add));
134
+ } else if (isExternalFlash (Add)) {
135
+ Add -= QSPIFLASH_BASE_ADDRESS;
136
+ return qspi_flash.erase (Add, qspi_flash.get_erase_size (Add));
125
137
} else {
126
138
return flash.erase (Add, flash.get_sector_size (Add));
127
139
}
@@ -148,12 +160,18 @@ void delayed_write(struct writeInfo* info) {
148
160
*/
149
161
uint16_t Flash_If_Write (uint8_t * src, uint8_t * dest, uint32_t Len)
150
162
{
151
- if (isExternalFlash ((uint32_t )dest)) {
152
- dest -= QSPIFLASH_BASE_ADDRESS ;
163
+ if (isFileBlockFlash ((uint32_t )dest)) {
164
+ dest -= FILEBLOCK_BASE_ADDRESS ;
153
165
if (Len < dfu_secondary_bd->get_erase_size (0 )) {
154
166
Len = dfu_secondary_bd->get_erase_size (0 );
155
167
}
156
168
return dfu_secondary_bd->program (src, (uint32_t )dest, Len);
169
+ } else if (isExternalFlash ((uint32_t )dest)) {
170
+ dest -= QSPIFLASH_BASE_ADDRESS;
171
+ if (Len < qspi_flash.get_erase_size (0 )) {
172
+ Len = qspi_flash.get_erase_size (0 );
173
+ }
174
+ return qspi_flash.program (src, (uint32_t )dest, Len);
157
175
} else {
158
176
uint8_t * srcCopy = (uint8_t *)malloc (Len);
159
177
memcpy (srcCopy, src, Len);
@@ -178,9 +196,12 @@ uint8_t *Flash_If_Read(uint8_t * src, uint8_t * dest, uint32_t Len)
178
196
uint32_t i = 0 ;
179
197
uint8_t *psrc = src;
180
198
181
- if (isExternalFlash ((uint32_t )src)) {
182
- src -= QSPIFLASH_BASE_ADDRESS ;
199
+ if (isFileBlockFlash ((uint32_t )src)) {
200
+ src -= FILEBLOCK_BASE_ADDRESS ;
183
201
dfu_secondary_bd->read (dest, (uint32_t )src, Len);
202
+ } else if (isExternalFlash ((uint32_t )src)) {
203
+ src -= QSPIFLASH_BASE_ADDRESS;
204
+ qspi_flash.read (dest, (uint32_t )src, Len);
184
205
} else {
185
206
for (i = 0 ; i < Len; i++)
186
207
{
0 commit comments