Mercurial > public > ostc4
comparison Discovery/Src/externCPU2bootloader.c @ 312:e84a2486933e
Merged in janlmulder/ostc4/cleanup-4 (pull request #25)
Fix stopwatch and divetime not in sync
author | heinrichsweikamp <bitbucket@heinrichsweikamp.com> |
---|---|
date | Fri, 31 May 2019 06:22:50 +0000 |
parents | 5ca177d2df5d |
children | 01f40cb1057e |
comparison
equal
deleted
inserted
replaced
299:b70c26be71a0 | 312:e84a2486933e |
---|---|
33 | 33 |
34 | 34 |
35 /* Exported variables --------------------------------------------------------*/ | 35 /* Exported variables --------------------------------------------------------*/ |
36 | 36 |
37 /* Private types -------------------------------------------------------------*/ | 37 /* Private types -------------------------------------------------------------*/ |
38 #define BOOTLOADSPITIMEOUT 5000 | |
39 | 38 |
40 /* Private variables ---------------------------------------------------------*/ | 39 /* Private variables ---------------------------------------------------------*/ |
41 | 40 |
42 /* Private function prototypes -----------------------------------------------*/ | 41 /* Private function prototypes -----------------------------------------------*/ |
43 | 42 |
44 uint8_t boot_sync_frame(void); | 43 static uint8_t boot_sync_frame(void); |
45 uint8_t boot_ack(void); | 44 static uint8_t boot_ack(void); |
46 uint8_t boot_get(uint8_t *RxBuffer); | 45 static uint8_t boot_get_id(uint8_t *RxBuffer); |
47 uint8_t boot_get_id(uint8_t *RxBuffer); | 46 static uint8_t boot_get_version(uint8_t *RxBuffer); |
48 uint8_t boot_get_version(uint8_t *RxBuffer); | 47 static uint8_t boot_write_memory(uint32_t address, uint8_t length_minus_1, uint8_t *data); |
49 //uint8_t boot_go(uint32_t address); | 48 static uint8_t boot_erase_memory(void); |
50 uint8_t boot_write_memory(uint32_t address, uint8_t length_minus_1, uint8_t *data); | 49 static void Bootloader_send_command(uint8_t command); |
51 //uint8_t boot_erase_memory(uint16_t data_frame, uint16_t *page_numbers); | 50 static void Bootloader_spi_single(uint8_t TxByte); |
52 uint8_t boot_erase_memory(void); | 51 static void Bootloader_spi(uint16_t lengthData, uint8_t *aTxBuffer, uint8_t *aRxBuffer); |
53 uint8_t boot_write_protect(uint8_t number_of_sectors_minus_one, uint8_t *sector_codes); | 52 static void Bootloader_Error_Handler(void); |
54 /* | |
55 uint8_t boot_write_unprotect(void); | |
56 uint8_t boot_readout_protect(void); | |
57 uint8_t boot_readout_unprotect(void); | |
58 */ | |
59 void Bootoader_send_command(uint8_t command); | |
60 void Bootloader_spi_single(uint8_t TxByte); | |
61 void Bootloader_spi(uint16_t lengthData, uint8_t *aTxBuffer, uint8_t *aRxBuffer); | |
62 void Bootloader_Error_Handler(void); | |
63 | 53 |
64 /* Exported functions --------------------------------------------------------*/ | 54 /* Exported functions --------------------------------------------------------*/ |
65 | 55 |
66 uint8_t extCPU2bootloader_start(uint8_t *version, uint16_t *chipID) | 56 uint8_t extCPU2bootloader_start(uint8_t *version, uint16_t *chipID) |
67 { | 57 { |
68 // uint8_t aTxBuffer[256] = { 0 }; | |
69 uint8_t aRxBuffer[256] = { 0 }; | 58 uint8_t aRxBuffer[256] = { 0 }; |
70 | 59 |
71 HAL_GPIO_WritePin(SMALLCPU_CSB_GPIO_PORT,SMALLCPU_CSB_PIN,GPIO_PIN_RESET); | 60 HAL_GPIO_WritePin(SMALLCPU_CSB_GPIO_PORT,SMALLCPU_CSB_PIN,GPIO_PIN_RESET); |
72 | 61 |
73 boot_sync_frame(); | 62 boot_sync_frame(); |
87 | 76 |
88 uint8_t extCPU2bootloader_internal(uint8_t* buffer, uint32_t length, char* display_text) | 77 uint8_t extCPU2bootloader_internal(uint8_t* buffer, uint32_t length, char* display_text) |
89 { | 78 { |
90 uint8_t version = 0; | 79 uint8_t version = 0; |
91 uint16_t chipID = 0; | 80 uint16_t chipID = 0; |
92 // uint8_t ret; | 81 |
93 if(!extCPU2bootloader_start(&version,&chipID)) | 82 if(!extCPU2bootloader_start(&version,&chipID)) |
94 return 0; | 83 return 0; |
95 if(!boot_erase_memory()) | 84 if(!boot_erase_memory()) |
96 return 0; | 85 return 0; |
97 HAL_Delay(100); | 86 HAL_Delay(100); |
133 return result; | 122 return result; |
134 } | 123 } |
135 | 124 |
136 /* Private functions --------------------------------------------------------*/ | 125 /* Private functions --------------------------------------------------------*/ |
137 | 126 |
138 uint8_t boot_sync_frame(void) | 127 static uint8_t boot_sync_frame(void) |
139 { | 128 { |
140 Bootloader_spi_single(0x5a); | 129 Bootloader_spi_single(0x5a); |
141 return boot_ack(); | 130 return boot_ack(); |
142 } | 131 } |
143 | 132 |
144 | 133 static uint8_t boot_get_version(uint8_t *RxBuffer) |
145 uint8_t boot_get(uint8_t *RxBuffer) | 134 { |
146 { | 135 Bootloader_spi_single(0x5a); |
147 Bootloader_spi_single(0x5a); | 136 Bootloader_send_command(0x01); |
148 Bootoader_send_command(0x00); | |
149 if(!boot_ack()) | |
150 return 0; | |
151 Bootloader_spi(14, NULL, RxBuffer); | |
152 return boot_ack(); | |
153 } | |
154 | |
155 | |
156 uint8_t boot_get_version(uint8_t *RxBuffer) | |
157 { | |
158 Bootloader_spi_single(0x5a); | |
159 Bootoader_send_command(0x01); | |
160 if(!boot_ack()) | 137 if(!boot_ack()) |
161 return 0; | 138 return 0; |
162 Bootloader_spi(3, NULL, RxBuffer); | 139 Bootloader_spi(3, NULL, RxBuffer); |
163 return boot_ack(); | 140 return boot_ack(); |
164 } | 141 } |
165 | 142 |
166 | 143 |
167 uint8_t boot_get_id(uint8_t *RxBuffer) | 144 static uint8_t boot_get_id(uint8_t *RxBuffer) |
168 { | 145 { |
169 Bootloader_spi_single(0x5a); | 146 Bootloader_spi_single(0x5a); |
170 Bootoader_send_command(0x02); | 147 Bootloader_send_command(0x02); |
171 if(!boot_ack()) | 148 if(!boot_ack()) |
172 return 0; | 149 return 0; |
173 Bootloader_spi(5, NULL, RxBuffer); | 150 Bootloader_spi(5, NULL, RxBuffer); |
174 return boot_ack(); | 151 return boot_ack(); |
175 } | 152 } |
176 | |
177 /* | |
178 uint8_t boot_go(uint32_t address) | |
179 { | |
180 | |
181 } | |
182 */ | |
183 | 153 |
184 | 154 |
185 uint8_t boot_write_memory(uint32_t address, uint8_t length_minus_1, uint8_t *data) | 155 uint8_t boot_write_memory(uint32_t address, uint8_t length_minus_1, uint8_t *data) |
186 { | 156 { |
187 uint8_t addressNew[4]; | 157 uint8_t addressNew[4]; |
188 uint8_t checksum = 0; | 158 uint8_t checksum = 0; |
189 uint16_t length; | 159 uint16_t length; |
190 | 160 |
191 Bootloader_spi_single(0x5a); | 161 Bootloader_spi_single(0x5a); |
192 Bootoader_send_command(0x31); | 162 Bootloader_send_command(0x31); |
193 if(!boot_ack()) | 163 if(!boot_ack()) |
194 return 1; | 164 return 1; |
195 HAL_Delay(5); | 165 HAL_Delay(5); |
196 addressNew[0] = (uint8_t)((address >> 24) & 0xFF); | 166 addressNew[0] = (uint8_t)((address >> 24) & 0xFF); |
197 addressNew[1] = (uint8_t)((address >> 16) & 0xFF); | 167 addressNew[1] = (uint8_t)((address >> 16) & 0xFF); |
221 return 0; | 191 return 0; |
222 HAL_Delay(1); | 192 HAL_Delay(1); |
223 return 1; | 193 return 1; |
224 } | 194 } |
225 | 195 |
226 //uint8_t boot_erase_memory(uint16_t data_frame, uint16_t *page_numbers) | 196 static uint8_t boot_erase_memory(void) |
227 uint8_t boot_erase_memory(void) | |
228 { | 197 { |
229 uint8_t special_erase_with_checksum[3] = {0xFF, 0xFF, 0x00}; | 198 uint8_t special_erase_with_checksum[3] = {0xFF, 0xFF, 0x00}; |
230 | 199 |
231 Bootloader_spi_single(0x5a); | 200 Bootloader_spi_single(0x5a); |
232 Bootoader_send_command(0x44); | 201 Bootloader_send_command(0x44); |
233 if(!boot_ack()) | 202 if(!boot_ack()) |
234 return 0; | 203 return 0; |
235 Bootloader_spi(3, special_erase_with_checksum, NULL); | 204 Bootloader_spi(3, special_erase_with_checksum, NULL); |
236 HAL_Delay(11000); /* 5.5 to 11 seconds */ | 205 HAL_Delay(11000); /* 5.5 to 11 seconds */ |
237 if(!boot_ack()) | 206 if(!boot_ack()) |
241 | 210 |
242 /* write unprotect does reset the system !! */ | 211 /* write unprotect does reset the system !! */ |
243 uint8_t boot_write_unprotect(void) | 212 uint8_t boot_write_unprotect(void) |
244 { | 213 { |
245 Bootloader_spi_single(0x5a); | 214 Bootloader_spi_single(0x5a); |
246 Bootoader_send_command(0x73); | 215 Bootloader_send_command(0x73); |
247 if(!boot_ack()) | 216 if(!boot_ack()) |
248 return 0; | 217 return 0; |
249 return boot_ack(); | 218 return boot_ack(); |
250 } | 219 } |
251 | 220 |
252 /* | 221 static uint8_t boot_ack(void) |
253 uint8_t boot_write_protect(uint8_t number_of_sectors_minus_one, uint8_t *sector_codes) | |
254 { | |
255 | |
256 } | |
257 | |
258 uint8_t boot_readout_protect(void) | |
259 { | |
260 | |
261 } | |
262 | |
263 uint8_t boot_readout_unprotect(void) | |
264 { | |
265 | |
266 } | |
267 */ | |
268 | |
269 uint8_t boot_ack(void) | |
270 { | 222 { |
271 uint8_t answer = 0; | 223 uint8_t answer = 0; |
272 | 224 |
273 Bootloader_spi_single(0x00); | 225 Bootloader_spi_single(0x00); |
274 for(int i=0; i< 1000; i++) | 226 for(int i=0; i< 1000; i++) |
285 return 1; | 237 return 1; |
286 else | 238 else |
287 return 0; | 239 return 0; |
288 } | 240 } |
289 | 241 |
290 void Bootoader_send_command(uint8_t command) | 242 static void Bootloader_send_command(uint8_t command) |
291 { | 243 { |
292 uint8_t send[2]; | 244 uint8_t send[2]; |
293 uint8_t receive[2]; | 245 uint8_t receive[2]; |
294 | 246 |
295 send[0] = command; | 247 send[0] = command; |
296 send[1] = 0xFF ^ command; | 248 send[1] = 0xFF ^ command; |
297 Bootloader_spi(2, send, receive); | 249 Bootloader_spi(2, send, receive); |
298 } | 250 } |
299 | 251 |
300 void Bootloader_spi_single(uint8_t TxByte) | 252 static void Bootloader_spi_single(uint8_t TxByte) |
301 { | 253 { |
302 Bootloader_spi(1,&TxByte, 0); | 254 Bootloader_spi(1,&TxByte, 0); |
303 } | 255 } |
304 | 256 |
305 | 257 |
306 void Bootloader_spi(uint16_t lengthData, uint8_t *aTxBuffer, uint8_t *aRxBuffer) | 258 static void Bootloader_spi(uint16_t lengthData, uint8_t *aTxBuffer, uint8_t *aRxBuffer) |
307 { | 259 { |
308 uint8_t dummy[256] = { 0 }; | 260 uint8_t dummy[256] = { 0 }; |
309 uint8_t *tx_data; | 261 uint8_t *tx_data; |
310 uint8_t *rx_data; | 262 uint8_t *rx_data; |
311 | 263 |
332 HAL_GPIO_WritePin(OSCILLOSCOPE_GPIO_PORT,OSCILLOSCOPE_PIN,GPIO_PIN_SET); // only for testing with Oscilloscope | 284 HAL_GPIO_WritePin(OSCILLOSCOPE_GPIO_PORT,OSCILLOSCOPE_PIN,GPIO_PIN_SET); // only for testing with Oscilloscope |
333 */ | 285 */ |
334 } | 286 } |
335 | 287 |
336 | 288 |
337 void Bootloader_Error_Handler(void) | 289 static void Bootloader_Error_Handler(void) |
338 { | 290 { |
339 while(1); | 291 while(1); |
340 } | 292 } |
341 | |
342 | |
343 |