54
54
#include "queue.h"
55
55
#include "stm32fxxx.h"
56
56
#include "system.h"
57
+ #include "buf2buf.h"
57
58
58
59
#include "cpx_internal_router.h"
59
60
#include "cpx_external_router.h"
@@ -111,73 +112,86 @@ void cpxBootloaderMessage(const CPXPacket_t * packet) {
111
112
xEventGroupSetBits (bootloaderSync , CPX_WAIT_FOR_BOOTLOADER_REPLY );
112
113
}
113
114
114
- static CPXPacket_t bootPacket ;
115
+ static CPXPacket_t txPacket ;
115
116
116
117
#define FLASH_BUFFER_SIZE 64
117
118
static uint8_t flashBuffer [FLASH_BUFFER_SIZE ];
118
- static int flashBufferIndex = 0 ;
119
+ static Buf2bufContext_t gap8BufContext ;
119
120
120
- static bool gap8DeckFlasherWrite (const uint32_t memAddr , const uint8_t writeLen , const uint8_t * buffer , const DeckMemDef_t * memDef ) {
121
+ static void sendFlashInit (const uint32_t fwSize ) {
122
+ GAP8BlCmdPacket_t * gap8BlPacket = (GAP8BlCmdPacket_t * )txPacket .data ;
121
123
122
- cpxInitRoute (CPX_T_STM32 , CPX_T_GAP8 , CPX_F_BOOTLOADER , & bootPacket .route );
124
+ gap8BlPacket -> cmd = GAP8_BL_CMD_START_WRITE ;
125
+ gap8BlPacket -> startAddress = 0x40000 ;
126
+ gap8BlPacket -> writeSize = fwSize ;
127
+ txPacket .dataLength = sizeof (GAP8BlCmdPacket_t );
128
+ bool writeOk = cpxSendPacketBlockingTimeout (& txPacket , M2T (GAP8_MAX_MEM_WRITE_TIMEOUT_MS ));
129
+ ASSERT (writeOk );
130
+ }
123
131
124
- if (memAddr == 0 ) {
125
- GAP8BlCmdPacket_t * gap8BlPacket = (GAP8BlCmdPacket_t * )bootPacket .data ;
132
+ static void sendFlashBuffer (const uint32_t size ) {
133
+ memcpy (& txPacket .data , flashBuffer , size );
134
+ txPacket .dataLength = size ;
135
+ bool writeOk = cpxSendPacketBlockingTimeout (& txPacket , M2T (GAP8_MAX_MEM_WRITE_TIMEOUT_MS ));
136
+ ASSERT (writeOk );
137
+ }
126
138
127
- gap8BlPacket -> cmd = GAP8_BL_CMD_START_WRITE ;
128
- gap8BlPacket -> startAddress = 0x40000 ;
129
- gap8BlPacket -> writeSize = * (memDef -> newFwSizeP );
130
- bootPacket .dataLength = sizeof (GAP8BlCmdPacket_t );
131
- bool writeOk = cpxSendPacketBlockingTimeout (& bootPacket , M2T (GAP8_MAX_MEM_WRITE_TIMEOUT_MS ));
132
- ASSERT (writeOk );
133
- }
139
+ static void sendFlashMd5Request (const uint32_t fwSize ) {
140
+ GAP8BlCmdPacket_t * gap8BlPacket = (GAP8BlCmdPacket_t * )txPacket .data ;
141
+ gap8BlPacket -> cmd = GAP8_BL_CMD_MD5 ;
142
+ gap8BlPacket -> startAddress = 0x40000 ;
143
+ gap8BlPacket -> writeSize = fwSize ;
144
+ txPacket .dataLength = sizeof (GAP8BlCmdPacket_t );
145
+ bool writeOk = cpxSendPacketBlockingTimeout (& txPacket , M2T (GAP8_MAX_MEM_WRITE_TIMEOUT_MS ));
146
+ ASSERT (writeOk );
147
+ }
148
+
149
+ static void waitForCpxResponse () {
150
+ EventBits_t bits = xEventGroupWaitBits (bootloaderSync ,
151
+ CPX_WAIT_FOR_BOOTLOADER_REPLY ,
152
+ pdTRUE , // Clear bits before returning
153
+ pdFALSE , // Wait for any bit
154
+ M2T (GAP8_MAX_MEM_VERIFY_TIMEOUT_MS ));
155
+ bool flashWritten = (bits & CPX_WAIT_FOR_BOOTLOADER_REPLY );
156
+ ASSERT (flashWritten );
157
+ }
158
+
159
+ static bool gap8DeckFlasherWrite (const uint32_t memAddr , const uint8_t writeLen , const uint8_t * buffer , const DeckMemDef_t * memDef ) {
160
+ cpxInitRoute (CPX_T_STM32 , CPX_T_GAP8 , CPX_F_BOOTLOADER , & txPacket .route );
161
+
162
+ const uint32_t fwSize = * (memDef -> newFwSizeP );
134
163
135
164
// The GAP8 can only flash data in multiples of 4 bytes,
136
165
// buffering will guard against this and also speed things up.
137
166
// The full binary that will be flashed is multiple of 4.
138
167
139
- uint32_t sizeLeftToBufferFull = sizeof (flashBuffer ) - flashBufferIndex ;
140
- uint32_t sizeAbleToBuffer = sizeLeftToBufferFull < writeLen ? sizeLeftToBufferFull : writeLen ;
141
- uint32_t lastAddressToWrite = memAddr + sizeAbleToBuffer ;
142
-
143
- memcpy (& flashBuffer [flashBufferIndex ], buffer , sizeAbleToBuffer );
144
- flashBufferIndex += sizeAbleToBuffer ;
145
-
146
- if (flashBufferIndex == sizeof (flashBuffer ) || lastAddressToWrite == * (memDef -> newFwSizeP )) {
147
- memcpy (& bootPacket .data , flashBuffer , flashBufferIndex );
148
- bootPacket .dataLength = flashBufferIndex ;
168
+ const bool isFirstBuf = (memAddr == 0 );
169
+ if (isFirstBuf ) {
170
+ sendFlashInit (fwSize );
171
+ buf2bufInit (& gap8BufContext , flashBuffer , FLASH_BUFFER_SIZE );
172
+ }
149
173
150
- bool writeOk = cpxSendPacketBlockingTimeout (& bootPacket , M2T (GAP8_MAX_MEM_WRITE_TIMEOUT_MS ));
151
- ASSERT (writeOk );
174
+ buf2bufAddInBuf (& gap8BufContext , buffer , writeLen );
175
+ ASSERT (buf2bufBytesAdded (& gap8BufContext ) <= fwSize );
176
+ while (buf2bufConsumeInBuf (& gap8BufContext )) {
177
+ sendFlashBuffer (FLASH_BUFFER_SIZE );
178
+ }
179
+ buf2bufReleaseInBuf (& gap8BufContext );
152
180
153
- flashBufferIndex = 0 ;
154
- int sizeLeftToBuffer = writeLen - sizeLeftToBufferFull ;
155
- if ( sizeLeftToBuffer > 0 ) {
156
- memcpy ( & flashBuffer [ flashBufferIndex ], & buffer [ sizeLeftToBufferFull ], sizeLeftToBuffer );
157
- flashBufferIndex += sizeLeftToBuffer ;
181
+ const bool isLastBuf = ( buf2bufBytesConsumed ( & gap8BufContext ) == fwSize ) ;
182
+ if ( isLastBuf ) {
183
+ uint32_t size = buf2bufReleaseOutBuf ( & gap8BufContext );
184
+ if ( size > 0 ) {
185
+ sendFlashBuffer ( size ) ;
158
186
}
159
- }
187
+ ASSERT ( buf2bufBytesAdded ( & gap8BufContext ) == buf2bufBytesConsumed ( & gap8BufContext ));
160
188
161
- if (memAddr + writeLen == * (memDef -> newFwSizeP )) {
162
189
// Request the MD5 checksum of the flashed data. This is only done
163
190
// for synchronizing and making sure everything has been written,
164
191
// we do not care about the results.
165
- GAP8BlCmdPacket_t * gap8BlPacket = (GAP8BlCmdPacket_t * )bootPacket .data ;
166
- gap8BlPacket -> cmd = GAP8_BL_CMD_MD5 ;
167
- gap8BlPacket -> startAddress = 0x40000 ;
168
- gap8BlPacket -> writeSize = * (memDef -> newFwSizeP );
169
- bootPacket .dataLength = sizeof (GAP8BlCmdPacket_t );
170
- bool writeOk = cpxSendPacketBlockingTimeout (& bootPacket , M2T (GAP8_MAX_MEM_WRITE_TIMEOUT_MS ));
171
- ASSERT (writeOk );
172
-
173
- EventBits_t bits = xEventGroupWaitBits (bootloaderSync ,
174
- CPX_WAIT_FOR_BOOTLOADER_REPLY ,
175
- pdTRUE , // Clear bits before returning
176
- pdFALSE , // Wait for any bit
177
- M2T (GAP8_MAX_MEM_VERIFY_TIMEOUT_MS ));
178
- bool flashWritten = (bits & CPX_WAIT_FOR_BOOTLOADER_REPLY );
179
- ASSERT (flashWritten );
180
- }
192
+ sendFlashMd5Request (fwSize );
193
+ waitForCpxResponse ();
194
+ }
181
195
182
196
return true;
183
197
}
@@ -186,14 +200,14 @@ static bool gap8DeckFlasherWrite(const uint32_t memAddr, const uint8_t writeLen,
186
200
static bool isGap8InBootloaderMode = false;
187
201
188
202
static void resetGap8ToBootloader () {
189
- cpxInitRoute (CPX_T_STM32 , CPX_T_ESP32 , CPX_F_SYSTEM , & bootPacket .route );
203
+ cpxInitRoute (CPX_T_STM32 , CPX_T_ESP32 , CPX_F_SYSTEM , & txPacket .route );
190
204
191
- ESP32SysPacket_t * esp32SysPacket = (ESP32SysPacket_t * )bootPacket .data ;
205
+ ESP32SysPacket_t * esp32SysPacket = (ESP32SysPacket_t * )txPacket .data ;
192
206
193
207
esp32SysPacket -> cmd = ESP32_SYS_CMD_RESET_GAP8 ;
194
- bootPacket .dataLength = sizeof (ESP32SysPacket_t );
208
+ txPacket .dataLength = sizeof (ESP32SysPacket_t );
195
209
196
- cpxSendPacketBlocking (& bootPacket );
210
+ cpxSendPacketBlocking (& txPacket );
197
211
// This should be handled on RX on CPX instead
198
212
vTaskDelay (100 );
199
213
isGap8InBootloaderMode = true;
0 commit comments