Mercurial > public > ostc4
annotate Discovery/Src/externLogbookFlash.c @ 1028:3d9552e4997c GasConsumption
Code improvment: line <=> menu id function:
In generell the structure of the menus is defined by the tStructure.h using global state defines. In some implementation hardcoded line numbers are used. Risk: In case the order of menu items change the update of other code sections could be forgotten (in the case the update of the top menu) causing unintended behavior. To avoid this the hard coded lines have been replaced by a function connecting the intended function to the menu item defined in the tstructure.h.
| author | Ideenmodellierer |
|---|---|
| date | Sun, 07 Sep 2025 19:08:43 +0200 |
| parents | 158100a84ebd |
| children | 74be24428049 |
| rev | line source |
|---|---|
| 38 | 1 /** |
| 2 ****************************************************************************** | |
| 3 * @copyright heinrichs weikamp | |
| 4 * @file externLogbookFlash.c | |
| 5 * @author heinrichs weikamp gmbh | |
| 6 * @date 07-Aug-2014 | |
| 7 * @version V0.0.4 | |
| 8 * @since 29-Sept-2015 | |
| 9 * @brief Main File to access the new 1.8 Volt Spansion S25FS256S 256 Mbit (32 Mbyte) | |
| 10 * @bug | |
| 11 * @warning | |
| 12 * | |
| 13 @verbatim | |
| 14 ============================================================================== | |
| 15 ##### Logbook Header (TOC) ##### | |
| 16 ============================================================================== | |
| 17 [..] Memory useage: | |
| 18 NEW: Spansion S25FS-S256S | |
| 19 | |
| 20 only 8x 4KB and 1x 32KB, remaining is 64KB or 256KB | |
| 21 Sector Size (kbyte) Sector Count Sector Range Address Range (Byte Address) Notes | |
| 22 4 8 SA00 00000000h-00000FFFh | |
| 23 : : | |
| 24 SA07 00007000h-00007FFFh | |
| 25 | |
| 26 32 1 SA08 00008000h-0000FFFFh | |
| 27 | |
| 28 64 511 SA09 00010000h-0001FFFFh | |
| 29 : : | |
| 30 SA519 01FF0000h-01FFFFFFh | |
| 31 OLD: | |
| 32 1kB each header | |
| 33 with predive header at beginning | |
| 34 and postdive header with 0x400 HEADER2OFFSET | |
| 35 4kB (one erase) has two dives with 4 headers total | |
| 36 total of 512 kB (with 256 header ids (8 bit)) | |
| 37 Size is 280 Byte (as of 25.Nov. 2014) | |
| 38 | |
| 39 [..] Output to PC / UART is postdive header | |
| 40 | |
| 41 [..] Block Protection Lock-Down is to erase logbook only | |
| 42 | |
| 43 [..] Timing (see page 137 of LOGBOOK_V3_S25FS-S_00-271247.pdf | |
| 44 bulk erase is 2 minutes typ., 6 minutes max. | |
| 45 | |
| 46 ============================================================================== | |
| 47 ##### DEMOMODE ##### | |
| 48 ============================================================================== | |
| 49 151215: ext_flash_write_settings() is DISABLED! | |
| 50 | |
| 51 ============================================================================== | |
| 52 ##### bug fixes ##### | |
| 53 ============================================================================== | |
| 54 150917: end in header and length of sample was one byte too long | |
| 55 as stated by Jef Driesen email 15.09.2015 | |
| 56 | |
| 57 @endverbatim | |
| 58 ****************************************************************************** | |
| 59 * @attention | |
| 60 * | |
| 61 * <h2><center>© COPYRIGHT(c) 2015 heinrichs weikamp</center></h2> | |
| 62 * | |
| 63 ****************************************************************************** | |
| 64 */ | |
| 65 | |
| 66 /* Includes ------------------------------------------------------------------*/ | |
| 67 #include "stm32f4xx_hal.h" | |
| 68 #include "externLogbookFlash.h" | |
| 69 #include "ostc.h" | |
| 70 #include "settings.h" | |
| 71 #include "gfx_engine.h" | |
| 72 | |
| 73 #ifndef BOOTLOADER_STANDALONE | |
| 74 #include "logbook.h" | |
| 75 #endif | |
| 76 | |
| 77 /* Private types -------------------------------------------------------------*/ | |
| 78 #define FLASHSTART 0x000000 | |
| 79 //#define FLASHSTOP 0x01FFFFFF all 32 MB with 4byte addressing | |
| 80 #define FLASHSTOP 0x00FFFFFF | |
| 81 //#define FLASHSTOP 0x3FFFFF | |
| 82 #define RELEASE 1 | |
| 83 #define HOLDCS 0 | |
| 84 | |
| 85 #define HEADER2OFFSET 0x400 | |
| 86 | |
| 87 typedef struct{ | |
| 88 uint8_t IsBusy:1; | |
| 89 uint8_t IsWriteEnabled:1; | |
| 90 uint8_t BlockProtect0:1; | |
| 91 uint8_t BlockProtect1:1; | |
| 92 uint8_t BlockProtect2:1; | |
| 93 uint8_t BlockProtect3:1; | |
| 94 uint8_t IsAutoAddressIncMode:1; | |
| 95 uint8_t BlockProtectL:1; | |
| 96 } extFlashStatusUbit8_t; | |
| 97 | |
| 98 typedef union{ | |
| 99 extFlashStatusUbit8_t ub; | |
| 100 uint8_t uw; | |
| 101 } extFlashStatusBit8_Type; | |
| 102 | |
| 103 | |
| 104 /* Exported variables --------------------------------------------------------*/ | |
| 105 | |
| 106 /* Private variables ---------------------------------------------------------*/ | |
| 870 | 107 |
| 108 #ifndef BOOTLOADER_STANDALONE | |
| 109 static uint32_t entryPoint = 0; | |
| 110 static uint32_t LengthLeftSampleRead = 0; | |
| 111 static uint32_t actualPointerDevicedata_Read = DDSTART; | |
| 112 #endif | |
| 113 | |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
114 static uint32_t actualAddress = 0; |
|
423
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
115 static uint32_t preparedPageAddress = 0; |
|
425
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
116 static uint32_t closeSectorAddress = 0; |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
117 static uint32_t actualPointerHeader = 0; |
|
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
118 static uint32_t actualPointerSample = 0; |
|
421
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
119 static uint32_t actualPointerDevicedata = DDSTART; |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
120 static uint32_t actualPointerVPM = 0; |
| 427 | 121 static uint32_t actualPointerSettings = SETTINGSSTART; |
| 1027 | 122 static uint32_t actualPointerProfile = PROFILE0_START; |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
123 static uint32_t actualPointerFirmware = 0; |
|
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
124 static uint32_t actualPointerFirmware2 = 0; |
| 38 | 125 |
| 126 /* Private function prototypes -----------------------------------------------*/ | |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
127 static void chip_unselect(void); |
|
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
128 static void chip_select(void); |
| 870 | 129 #ifndef BOOTLOADER_STANDALONE |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
130 static void error_led_on(void); |
|
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
131 static void error_led_off(void); |
| 870 | 132 static void ext_flash_decf_address_ring(uint8_t type); |
| 133 static void ext_flash_disable_protection(void); | |
| 134 static _Bool ext_flash_test_remaining_space_of_page_empty(uint32_t pointer, uint16_t length); | |
| 135 static void ext_flash_set_to_begin_of_next_page(uint32_t *pointer, uint8_t type); | |
| 136 #endif | |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
137 static void write_spi(uint8_t data, uint8_t unselect_CS_afterwards); |
|
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
138 static uint8_t read_spi(uint8_t unselect_CS_afterwards); |
|
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
139 static void write_address(uint8_t unselect_CS_afterwards); |
| 38 | 140 static void Error_Handler_extflash(void); |
| 141 static void wait_chip_not_busy(void); | |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
142 static void ext_flash_incf_address(uint8_t type); |
| 38 | 143 //void ext_flash_incf_address_ring(void); |
| 144 | |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
145 static void ext_flash_erase4kB(void); |
|
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
146 static void ext_flash_erase32kB(void); |
|
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
147 static void ext_flash_erase64kB(void); |
|
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
148 static uint8_t ext_flash_erase_if_on_page_start(void); |
| 38 | 149 |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
150 static void ef_write_block(uint8_t * sendByte, uint32_t length, uint8_t type, uint8_t do_not_erase); |
| 38 | 151 |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
152 static void ext_flash_read_block(uint8_t *getByte, uint8_t type); |
|
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
153 static void ext_flash_read_block_multi(void *getByte, uint32_t size, uint8_t type); |
|
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
154 static void ext_flash_read_block_stop(void); |
| 38 | 155 |
| 156 static void ef_hw_rough_delay_us(uint32_t delayUs); | |
| 157 static void ef_erase_64K(uint32_t blocks); | |
| 158 | |
| 870 | 159 #ifndef BOOTLOADER_STANDALONE |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
160 static void ext_flash_overwrite_sample_without_erase(uint8_t *pSample, uint16_t length); |
| 870 | 161 static void ext_flash_find_start(void); |
| 162 #endif | |
| 38 | 163 |
| 164 | |
| 165 | |
| 166 /* Exported functions --------------------------------------------------------*/ | |
| 167 | |
| 168 void ext_flash_write_firmware(uint8_t *pSample1, uint32_t length1)//, uint8_t *pSample2, uint32_t length2) | |
| 169 { | |
| 170 general32to8_Type lengthTransform; | |
| 171 | |
| 172 lengthTransform.u32 = length1; | |
| 173 | |
| 174 actualPointerFirmware = FWSTART; | |
| 175 ef_write_block(lengthTransform.u8,4, EF_FIRMWARE, 1); | |
| 176 ef_write_block(pSample1,length1, EF_FIRMWARE, 1); | |
| 177 | |
| 178 // if(length2) | |
| 179 // ef_write_block(pSample2,length2, EF_FIRMWARE, 1); | |
| 180 } | |
| 181 | |
| 182 uint8_t ext_flash_read_firmware_version(char *text) | |
| 183 { | |
| 184 uint32_t backup = actualAddress; | |
| 185 uint8_t buffer[4]; | |
| 186 | |
| 187 // + 4 for length data, see ext_flash_write_firmware | |
| 188 actualAddress = FWSTART + 4 + 0x10000; | |
| 189 ext_flash_read_block_start(); | |
| 190 ext_flash_read_block(&buffer[0], EF_FIRMWARE); | |
| 191 ext_flash_read_block(&buffer[1], EF_FIRMWARE); | |
| 192 ext_flash_read_block(&buffer[2], EF_FIRMWARE); | |
| 193 ext_flash_read_block(&buffer[3], EF_FIRMWARE); | |
| 194 | |
| 195 ext_flash_read_block_stop(); | |
| 196 actualAddress = backup; | |
| 197 | |
| 198 uint8_t ptr = 0; | |
| 199 text[ptr++] = 'V'; | |
| 200 ptr += gfx_number_to_string(2,0,&text[ptr],buffer[0] & 0x3F); | |
| 201 text[ptr++] = '.'; | |
| 202 ptr += gfx_number_to_string(2,0,&text[ptr],buffer[1] & 0x3F); | |
| 203 text[ptr++] = '.'; | |
| 204 ptr += gfx_number_to_string(2,0,&text[ptr],buffer[2] & 0x3F); | |
| 205 text[ptr++] = ' '; | |
| 206 if(buffer[3]) | |
| 207 { | |
| 208 text[ptr++] = 'b'; | |
| 209 text[ptr++] = 'e'; | |
| 210 text[ptr++] = 't'; | |
| 211 text[ptr++] = 'a'; | |
| 212 text[ptr++] = ' '; | |
| 213 } | |
| 214 return ptr; | |
| 215 } | |
| 216 | |
| 217 | |
| 218 uint32_t ext_flash_read_firmware(uint8_t *pSample1, uint32_t max_length, uint8_t *magicByte) | |
| 219 { | |
| 220 uint32_t backup = actualAddress; | |
| 221 general32to8_Type lengthTransform; | |
| 222 | |
| 223 actualAddress = FWSTART; | |
| 224 ext_flash_read_block_start(); | |
| 225 | |
| 226 ext_flash_read_block(&lengthTransform.u8[0], EF_FIRMWARE); | |
| 227 ext_flash_read_block(&lengthTransform.u8[1], EF_FIRMWARE); | |
| 228 ext_flash_read_block(&lengthTransform.u8[2], EF_FIRMWARE); | |
| 229 ext_flash_read_block(&lengthTransform.u8[3], EF_FIRMWARE); | |
| 230 | |
| 231 | |
| 232 if(lengthTransform.u32 == 0xFFFFFFFF) | |
| 233 { | |
| 234 lengthTransform.u32 = 0xFFFFFFFF; | |
| 235 } | |
| 236 else | |
| 237 if(lengthTransform.u32 > max_length) | |
| 238 { | |
| 239 lengthTransform.u32 = 0xFF000000; | |
| 240 } | |
| 241 else | |
| 242 { | |
| 243 for(uint32_t i = 0; i<lengthTransform.u32; i++) | |
| 244 { | |
| 245 ext_flash_read_block(&pSample1[i], EF_FIRMWARE); | |
| 246 } | |
| 247 | |
| 248 } | |
| 249 | |
| 250 ext_flash_read_block_stop(); | |
| 251 | |
| 252 if(magicByte) | |
| 253 { | |
| 254 *magicByte = pSample1[0x10000 + 0x3E]; // 0x3E == 62 | |
| 255 } | |
| 256 | |
| 257 actualAddress = backup; | |
| 258 return lengthTransform.u32; | |
| 259 } | |
| 260 | |
| 261 | |
| 262 void ext_flash_write_firmware2(uint32_t offset, uint8_t *pSample1, uint32_t length1, uint8_t *pSample2, uint32_t length2) | |
| 263 { | |
| 264 general32to8_Type lengthTransform, offsetTransform; | |
| 265 | |
| 266 lengthTransform.u32 = length1 + length2; | |
| 267 offsetTransform.u32 = offset; | |
| 268 | |
| 269 actualPointerFirmware2 = FWSTART2; | |
| 270 ef_write_block(lengthTransform.u8,4, EF_FIRMWARE2, 1); | |
| 271 ef_write_block(offsetTransform.u8,4, EF_FIRMWARE2, 1); | |
| 272 ef_write_block(pSample1,length1, EF_FIRMWARE2, 1); | |
| 273 if(length2) | |
| 274 ef_write_block(pSample2,length2, EF_FIRMWARE2, 1); | |
| 275 } | |
| 276 | |
| 277 | |
| 278 uint32_t ext_flash_read_firmware2(uint32_t *offset, uint8_t *pSample1, uint32_t max_length1, uint8_t *pSample2, uint32_t max_length2) | |
| 279 { | |
| 280 uint32_t backup = actualAddress; | |
| 281 uint32_t length1, length2; | |
| 282 general32to8_Type lengthTransform, offsetTransform; | |
| 283 | |
| 284 actualAddress = FWSTART2; | |
| 285 ext_flash_read_block_start(); | |
| 286 | |
| 287 ext_flash_read_block(&lengthTransform.u8[0], EF_FIRMWARE2); | |
| 288 ext_flash_read_block(&lengthTransform.u8[1], EF_FIRMWARE2); | |
| 289 ext_flash_read_block(&lengthTransform.u8[2], EF_FIRMWARE2); | |
| 290 ext_flash_read_block(&lengthTransform.u8[3], EF_FIRMWARE2); | |
| 291 | |
| 292 ext_flash_read_block(&offsetTransform.u8[0], EF_FIRMWARE2); | |
| 293 ext_flash_read_block(&offsetTransform.u8[1], EF_FIRMWARE2); | |
| 294 ext_flash_read_block(&offsetTransform.u8[2], EF_FIRMWARE2); | |
| 295 ext_flash_read_block(&offsetTransform.u8[3], EF_FIRMWARE2); | |
| 296 | |
| 297 *offset = offsetTransform.u32; | |
| 298 | |
| 299 if(lengthTransform.u32 == 0xFFFFFFFF) | |
| 300 { | |
| 301 lengthTransform.u32 = 0xFFFFFFFF; | |
| 302 } | |
| 303 else | |
| 304 if(lengthTransform.u32 > max_length1 + max_length2) | |
| 305 { | |
| 306 lengthTransform.u32 = 0xFF000000; | |
| 307 } | |
| 308 else | |
| 309 { | |
| 310 if(lengthTransform.u32 < max_length1) | |
| 311 { | |
| 312 length1 = lengthTransform.u32; | |
| 313 length2 = 0; | |
| 314 } | |
| 315 else | |
| 316 { | |
| 317 length1 = max_length1; | |
| 318 length2 = lengthTransform.u32 - max_length1; | |
| 319 } | |
| 320 | |
| 321 if(pSample1) | |
| 322 { | |
| 323 for(uint32_t i = 0; i<length1; i++) | |
| 324 { | |
| 325 ext_flash_read_block(&pSample1[i], EF_FIRMWARE2); | |
| 326 } | |
| 327 if(pSample2) | |
| 328 { | |
| 329 for(uint32_t i = 0; i<length2; i++) | |
| 330 { | |
| 331 ext_flash_read_block(&pSample2[i], EF_FIRMWARE2); | |
| 332 } | |
| 333 } | |
| 334 } | |
| 335 else if(pSample2) | |
| 336 { | |
| 337 actualAddress += length1; | |
| 338 for(uint32_t i = 0; i<length2; i++) | |
| 339 { | |
| 340 ext_flash_read_block(&pSample2[i], EF_FIRMWARE2); | |
| 341 } | |
| 342 } | |
| 343 } | |
| 344 ext_flash_read_block_stop(); | |
| 345 actualAddress = backup; | |
| 346 return lengthTransform.u32; | |
| 347 } | |
| 348 | |
| 349 | |
| 350 void ext_flash_read_fixed_16_devicedata_blocks_formated_128byte_total(uint8_t *buffer) | |
| 351 { | |
| 352 SDeviceLine data[16]; | |
| 353 uint8_t tempLengthIngnore; | |
| 354 uint16_t count; | |
| 355 uint8_t transfer; | |
| 356 | |
| 357 RTC_DateTypeDef Sdate; | |
| 358 RTC_TimeTypeDef Stime; | |
| 359 | |
| 360 actualAddress = DDSTART; | |
| 361 | |
| 362 ext_flash_read_block_start(); | |
| 363 ext_flash_read_block(&tempLengthIngnore, EF_DEVICEDATA); | |
| 364 ext_flash_read_block(&tempLengthIngnore, EF_DEVICEDATA); | |
| 365 | |
| 366 ext_flash_read_block_multi((uint8_t *)data,16*3*4, EF_DEVICEDATA); | |
| 367 ext_flash_read_block_stop(); | |
| 368 | |
| 369 count = 0; | |
| 370 for(int i=0;i<16;i++) | |
| 371 { | |
| 372 transfer = (data[i].value_int32 >> 24) & 0xFF; | |
| 373 buffer[count++] = transfer; | |
| 374 transfer = (data[i].value_int32 >> 16) & 0xFF; | |
| 375 buffer[count++] = transfer; | |
| 376 transfer = (data[i].value_int32 >> 8) & 0xFF; | |
| 377 buffer[count++] = transfer; | |
| 378 transfer = (data[i].value_int32) & 0xFF; | |
| 379 buffer[count++] = transfer; | |
| 380 | |
| 381 translateDate(data[i].date_rtc_dr, &Sdate); | |
| 382 translateTime(data[i].time_rtc_tr, &Stime); | |
| 383 buffer[count++] = Sdate.Year; | |
| 384 buffer[count++] = Sdate.Month; | |
| 385 buffer[count++] = Sdate.Date; | |
| 386 buffer[count++] = Stime.Hours; | |
| 387 } | |
| 388 } | |
| 389 | |
| 390 | |
| 391 #ifndef BOOTLOADER_STANDALONE | |
| 392 | |
|
421
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
393 void ext_flash_write_devicedata(uint8_t resetRing) |
| 38 | 394 { |
| 395 uint8_t *pData; | |
| 396 const uint16_t length = sizeof(SDevice); | |
| 397 uint8_t length_lo, length_hi; | |
| 398 uint8_t dataLength[2] = { 0 }; | |
|
421
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
399 uint32_t tmpBlockStart; |
| 38 | 400 |
| 401 ext_flash_disable_protection(); | |
| 402 | |
| 403 pData = (uint8_t *)stateDeviceGetPointer(); | |
| 404 | |
|
421
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
405 /* Reset the Ring to the start address if requested (e.g. because we write the default block during shutdown) */ |
|
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
406 if((resetRing) || ((actualPointerDevicedata + length) >= DDSTOP)) |
|
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
407 { |
|
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
408 actualPointerDevicedata = DDSTART; |
|
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
409 } |
|
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
410 tmpBlockStart = actualPointerDevicedata; |
| 38 | 411 |
| 412 length_lo = (uint8_t)(length & 0xFF); | |
| 413 length_hi = (uint8_t)(length >> 8); | |
| 414 dataLength[0] = length_lo; | |
| 415 dataLength[1] = length_hi; | |
| 416 | |
| 417 ef_write_block(dataLength,2, EF_DEVICEDATA, 0); | |
| 418 ef_write_block(pData,length, EF_DEVICEDATA, 0); | |
|
421
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
419 |
|
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
420 actualPointerDevicedata_Read = tmpBlockStart; |
|
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
421 |
| 38 | 422 } |
| 423 | |
| 424 | |
| 425 uint16_t ext_flash_read_devicedata(uint8_t *buffer, uint16_t max_length) | |
| 426 { | |
| 427 uint16_t length; | |
| 428 uint8_t length_lo, length_hi; | |
| 429 | |
|
421
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
430 actualAddress = actualPointerDevicedata_Read; |
| 38 | 431 |
|
421
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
432 length = 0; |
|
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
433 length_lo = 0; |
|
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
434 length_hi = 0; |
| 38 | 435 ext_flash_read_block_start(); |
|
421
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
436 |
|
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
437 |
| 38 | 438 ext_flash_read_block(&length_lo, EF_DEVICEDATA); |
| 439 ext_flash_read_block(&length_hi, EF_DEVICEDATA); | |
| 440 | |
|
421
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
441 while ((length_lo != 0xFF) && (length_hi != 0xFF)) |
|
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
442 { |
|
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
443 length = (length_hi * 256) + length_lo; |
|
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
444 |
|
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
445 if(length > max_length) |
|
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
446 return 0; |
|
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
447 |
|
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
448 ext_flash_read_block_multi(buffer,length,EF_DEVICEDATA); |
|
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
449 |
|
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
450 ext_flash_read_block(&length_lo, EF_DEVICEDATA); /* check if another devicedata set is available */ |
|
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
451 ext_flash_read_block(&length_hi, EF_DEVICEDATA); /* length will be 0xFFFF if a empty memory is read */ |
|
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
452 } |
|
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
453 ext_flash_decf_address_ring(EF_DEVICEDATA); /* set pointer back to empty address */ |
|
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
454 ext_flash_decf_address_ring(EF_DEVICEDATA); |
| 38 | 455 ext_flash_read_block_stop(); |
|
421
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
456 |
|
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
457 if(actualAddress > actualPointerDevicedata) /* the write pointer has not yet been set up probably */ |
|
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
458 { |
|
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
459 actualPointerDevicedata = actualAddress; |
|
3f7d80f37bfc
Enable sequentionel writing of device data:
ideenmodellierer
parents:
420
diff
changeset
|
460 } |
| 38 | 461 return length; |
| 462 } | |
| 463 | |
| 464 | |
| 465 void ext_flash_write_vpm(SVpm *vpmInput) | |
| 466 { | |
| 467 uint8_t *pData; | |
| 468 const uint16_t length = sizeof(SVpm); | |
| 469 | |
| 470 uint8_t length_lo, length_hi; | |
| 471 uint8_t dataLength[2] = { 0 }; | |
| 472 | |
| 473 pData = (uint8_t *)vpmInput; | |
| 474 | |
| 475 actualPointerVPM = VPMSTART; | |
| 476 | |
| 477 length_lo = (uint8_t)(length & 0xFF); | |
| 478 length_hi = (uint8_t)(length >> 8); | |
| 479 dataLength[0] = length_lo; | |
| 480 dataLength[1] = length_hi; | |
| 481 | |
| 482 ef_write_block(dataLength,2, EF_VPMDATA, 0); | |
| 483 ef_write_block(pData,length, EF_VPMDATA, 0); | |
| 484 } | |
| 485 | |
| 486 | |
| 487 int ext_flash_read_vpm(SVpm *vpmOutput) | |
| 488 { | |
| 489 uint8_t *pData; | |
| 490 const uint16_t length = sizeof(SVpm); | |
| 491 uint8_t length_lo, length_hi; | |
| 492 int output; | |
| 493 | |
| 494 actualAddress = VPMSTART; | |
| 495 | |
| 496 ext_flash_read_block_start(); | |
| 497 ext_flash_read_block(&length_lo, EF_VPMDATA); | |
| 498 ext_flash_read_block(&length_hi, EF_VPMDATA); | |
| 499 if((length_lo == (uint8_t)(length & 0xFF)) | |
| 500 &&(length_hi == (uint8_t)(length >> 8))) | |
| 501 { | |
| 502 pData = (uint8_t *)vpmOutput; | |
| 503 for(uint16_t i = 0; i < length; i++) | |
| 504 ext_flash_read_block(&pData[i], EF_VPMDATA); | |
| 505 output = length; | |
| 506 } | |
| 507 else | |
| 508 output = 0; | |
| 509 | |
| 510 ext_flash_read_block_stop(); | |
| 511 return output; | |
| 512 } | |
| 513 | |
| 514 #ifdef DEMOMODE | |
| 515 void ext_flash_write_settings(void) | |
| 516 { | |
| 517 return; | |
| 518 } | |
| 519 #else | |
| 1027 | 520 void ext_flash_write_settings(uint8_t whichSettings, uint8_t resetRing) |
| 38 | 521 { |
| 1027 | 522 SSettings *pSettings; |
| 38 | 523 const uint16_t length = sizeof(SSettings); |
| 524 uint8_t length_lo, length_hi; | |
| 525 uint8_t dataLength[2] = { 0 }; | |
| 526 | |
| 1027 | 527 pSettings = settingsGetPointer(); |
| 528 | |
| 38 | 529 ext_flash_disable_protection(); |
| 530 | |
| 1027 | 531 switch (whichSettings) |
| 38 | 532 { |
| 1027 | 533 default: |
| 534 case EF_SETTINGS: if(stateRealGetPointer()->lastKnownBatteryPercentage) | |
| 535 { | |
| 536 pSettings->lastKnownBatteryPercentage = stateRealGetPointer()->lastKnownBatteryPercentage; | |
| 537 } | |
| 538 pSettings->backup_localtime_rtc_tr = stateRealGetPointer()->lifeData.timeBinaryFormat; | |
| 539 pSettings->backup_localtime_rtc_dr = stateRealGetPointer()->lifeData.dateBinaryFormat; | |
| 540 /* Reset the Ring to the start address if requested (e.g. because we write the default block during shutdown) */ | |
| 541 if((resetRing) || ((actualPointerSettings + length) >= SETTINGSSTOP)) | |
| 542 { | |
| 543 actualPointerSettings = SETTINGSSTART; | |
| 544 } | |
| 545 break; | |
| 546 case EF_PROFILE0: actualPointerProfile = PROFILE0_START; | |
| 547 pSettings = profileGetPointer(0); | |
| 548 break; | |
| 549 case EF_PROFILE1: actualPointerProfile = PROFILE1_START; | |
| 550 pSettings = profileGetPointer(1); | |
| 551 break; | |
| 552 case EF_PROFILE2: actualPointerProfile = PROFILE2_START; | |
| 553 pSettings = profileGetPointer(2); | |
| 554 break; | |
| 555 case EF_PROFILE3: actualPointerProfile = PROFILE3_START; | |
| 556 pSettings = profileGetPointer(3); | |
| 557 break; | |
| 427 | 558 } |
| 38 | 559 |
| 560 length_lo = (uint8_t)(length & 0xFF); | |
| 561 length_hi = (uint8_t)(length >> 8); | |
| 562 dataLength[0] = length_lo; | |
| 563 dataLength[1] = length_hi; | |
| 564 | |
| 1027 | 565 ef_write_block(dataLength,2, whichSettings, 0); |
| 566 ef_write_block((uint8_t*)pSettings,length, whichSettings, 0); | |
| 38 | 567 // ext_flash_enable_protection(); |
| 568 } | |
| 569 #endif | |
| 570 | |
| 571 | |
| 572 /* CHANGES 150929 hw | |
| 573 * this now allows to read old settings too | |
| 574 * but make sure that everything is fixed in | |
| 575 * set_new_settings_missing_in_ext_flash | |
| 576 * new settings should be fine as they are added | |
| 577 * and loaded before calling this function | |
| 578 */ | |
| 1027 | 579 uint8_t ext_flash_read_settings(uint8_t whichSettings) |
| 38 | 580 { |
| 581 uint8_t returnValue = HAL_BUSY; | |
|
538
b1eee27cd02b
BugFix firmware downgrade to version with less settings:
Ideenmodellierer
parents:
466
diff
changeset
|
582 uint8_t exit = 0; |
| 38 | 583 uint8_t *pData; |
| 584 const uint16_t lengthStandardNow = sizeof(SSettings); | |
| 585 uint8_t length_lo, length_hi; | |
| 586 uint16_t lengthOnEEPROM; | |
| 587 uint32_t header; | |
| 1027 | 588 SSettings* pSettings = settingsGetPointer(); |
| 38 | 589 |
| 1027 | 590 switch(whichSettings) |
| 591 { | |
| 592 case EF_SETTINGS: pSettings = settingsGetPointer(); | |
| 593 actualAddress = SETTINGSSTART; | |
| 594 break; | |
| 595 case EF_PROFILE0: pSettings = profileGetPointer(0); | |
| 596 actualAddress = PROFILE0_START; | |
| 597 break; | |
| 598 case EF_PROFILE1: pSettings = profileGetPointer(1); | |
| 599 actualAddress = PROFILE1_START; | |
| 600 break; | |
| 601 case EF_PROFILE2: pSettings = profileGetPointer(2); | |
| 602 actualAddress = PROFILE2_START; | |
| 603 break; | |
| 604 case EF_PROFILE3: pSettings = profileGetPointer(3); | |
| 605 actualAddress = PROFILE3_START; | |
| 606 break; | |
| 607 default: returnValue = HAL_ERROR; | |
| 608 } | |
| 609 | |
| 610 if(returnValue != HAL_ERROR) | |
| 38 | 611 { |
| 1027 | 612 ext_flash_read_block_start(); |
| 613 ext_flash_read_block(&length_lo, whichSettings); | |
| 614 ext_flash_read_block(&length_hi, whichSettings); | |
| 615 | |
| 616 while ((length_lo != 0xFF) && (length_hi != 0xFF) && (exit == 0)) /* get the latest stored setting block */ | |
| 38 | 617 { |
| 1027 | 618 lengthOnEEPROM = length_hi * 256; |
| 619 lengthOnEEPROM += length_lo; | |
| 620 if(lengthOnEEPROM <= lengthStandardNow) /* EEPROM Header size equal or smaller => settings constant or upgraded */ | |
| 427 | 621 { |
| 1027 | 622 ext_flash_read_block_multi(&header, 4, whichSettings); |
| 623 if((header <= pSettings->header) && (header >= pSettings->updateSettingsAllowedFromHeader)) /* check to allow update of header */ | |
|
538
b1eee27cd02b
BugFix firmware downgrade to version with less settings:
Ideenmodellierer
parents:
466
diff
changeset
|
624 { |
| 1027 | 625 returnValue = HAL_OK; |
| 626 pSettings->header = header; | |
| 627 pData = (uint8_t *)pSettings + 4; /* header */ | |
| 628 for(uint16_t i = 0; i < (lengthOnEEPROM-4); i++) | |
| 629 ext_flash_read_block(&pData[i], whichSettings); | |
| 630 if(header != pSettings->header) /* setting layout changed => no additional setting sets expected */ | |
| 631 { | |
| 632 exit = 1; | |
| 633 } | |
| 634 } | |
| 635 else | |
| 636 { | |
| 637 returnValue = HAL_ERROR; | |
|
538
b1eee27cd02b
BugFix firmware downgrade to version with less settings:
Ideenmodellierer
parents:
466
diff
changeset
|
638 exit = 1; |
|
b1eee27cd02b
BugFix firmware downgrade to version with less settings:
Ideenmodellierer
parents:
466
diff
changeset
|
639 } |
|
b1eee27cd02b
BugFix firmware downgrade to version with less settings:
Ideenmodellierer
parents:
466
diff
changeset
|
640 } |
| 1027 | 641 else /* size of settings decreased => possible downgrade of firmware */ |
|
538
b1eee27cd02b
BugFix firmware downgrade to version with less settings:
Ideenmodellierer
parents:
466
diff
changeset
|
642 { |
| 1027 | 643 ext_flash_read_block_multi(&header, 4, whichSettings); |
| 644 | |
| 645 if(header > 0xFFFF0014) /* verify that new (old) header should be compatible (only less bytes, no change in layout) */ | |
| 646 { | |
| 647 returnValue = HAL_OK; | |
| 648 pSettings->header = header; | |
| 649 pData = (uint8_t *)pSettings + 4; /* header */ | |
| 650 for(uint16_t i = 0; i < (lengthStandardNow-4); i++) /* only read the data fitting into the structure */ | |
| 651 ext_flash_read_block(&pData[i], whichSettings); | |
| 652 } | |
| 653 else | |
| 654 { | |
| 655 returnValue = HAL_ERROR; | |
| 656 } | |
|
538
b1eee27cd02b
BugFix firmware downgrade to version with less settings:
Ideenmodellierer
parents:
466
diff
changeset
|
657 exit = 1; |
|
b1eee27cd02b
BugFix firmware downgrade to version with less settings:
Ideenmodellierer
parents:
466
diff
changeset
|
658 } |
| 1027 | 659 ext_flash_read_block(&length_lo, whichSettings); |
| 660 ext_flash_read_block(&length_hi, whichSettings); | |
|
538
b1eee27cd02b
BugFix firmware downgrade to version with less settings:
Ideenmodellierer
parents:
466
diff
changeset
|
661 } |
| 1027 | 662 ext_flash_decf_address_ring(whichSettings); /* set pointer back to empty address */ |
| 663 ext_flash_decf_address_ring(whichSettings); | |
| 664 ext_flash_read_block_stop(); | |
|
538
b1eee27cd02b
BugFix firmware downgrade to version with less settings:
Ideenmodellierer
parents:
466
diff
changeset
|
665 |
| 1027 | 666 if(actualAddress > actualPointerSettings) /* the write pointer has not yet been set up probably */ |
| 667 { | |
| 668 actualPointerSettings = actualAddress; | |
| 38 | 669 } |
| 1027 | 670 ext_flash_read_block_stop(); |
| 427 | 671 } |
| 38 | 672 return returnValue; |
| 673 } | |
| 674 | |
| 675 | |
| 676 | |
| 677 | |
| 678 /* ext_flash_start_new_dive_log_and_set_actualPointerSample | |
| 679 * prepares the write sample pointer | |
| 680 * to be used by ext_flash_write_sample() | |
| 681 * to be set in the * pHeaderPreDive | |
| 682 * for write with ext_flash_create_new_dive_log() and ext_flash_close_new_dive_log() | |
| 683 */ | |
| 684 void ext_flash_start_new_dive_log_and_set_actualPointerSample(uint8_t *pHeaderPreDive) | |
| 685 { | |
| 686 convert_Type data; | |
| 687 SSettings *settings = settingsGetPointer(); | |
| 688 | |
| 689 /* new 5. Jan. 2015 */ | |
| 690 actualPointerSample = settings->logFlashNextSampleStartAddress; | |
| 691 | |
| 692 if(!ext_flash_test_remaining_space_of_page_empty(actualPointerSample, 4)) | |
| 693 ext_flash_set_to_begin_of_next_page(&actualPointerSample, EF_SAMPLE); | |
| 694 | |
| 695 if((actualPointerSample < SAMPLESTART) || (actualPointerSample > SAMPLESTOP)) | |
| 696 actualPointerSample = SAMPLESTART; | |
| 697 | |
| 698 data.u32bit = actualPointerSample; | |
| 699 pHeaderPreDive[2] = data.u8bit.byteLow; | |
| 700 pHeaderPreDive[3] = data.u8bit.byteMidLow; | |
| 701 pHeaderPreDive[4] = data.u8bit.byteMidHigh; | |
| 702 /* to start sample writing and header etc. pp. */ | |
| 703 ext_flash_disable_protection_for_logbook(); | |
| 704 } | |
| 705 | |
| 706 | |
| 707 /* ext_flash_create_new_dive_log | |
| 708 * uses the first header without HEADER2OFFSET | |
| 709 * for the header it is not important to be complete | |
| 710 * and can be reconstructed | |
| 711 * ext_flash_start_new_dive_log_and_set_actualPointerSample() | |
| 712 * has to be called before to set the actualPointerSample | |
| 713 * in the header | |
| 714 * the following func writes to header to the ext_flash | |
| 715 */ | |
| 716 void ext_flash_create_new_dive_log(uint8_t *pHeaderPreDive) | |
| 717 { | |
| 718 SSettings *settings; | |
|
429
7f351c25608a
Marked possible code improvment for future activities:
ideenmodellierer
parents:
427
diff
changeset
|
719 uint8_t id; |
| 38 | 720 uint8_t header1, header2; |
| 721 | |
| 722 settings = settingsGetPointer(); | |
| 723 id = settings->lastDiveLogId; | |
| 724 | |
| 725 actualAddress = HEADERSTART + (0x800 * id); | |
| 726 ext_flash_read_block_start(); | |
|
429
7f351c25608a
Marked possible code improvment for future activities:
ideenmodellierer
parents:
427
diff
changeset
|
727 ext_flash_read_block(&header1, EF_SAMPLE); /* the sample ring is increased instead of header... not sure if that is planned intention */ |
|
7f351c25608a
Marked possible code improvment for future activities:
ideenmodellierer
parents:
427
diff
changeset
|
728 ext_flash_read_block(&header2, EF_SAMPLE); /* does not matter because actual address is reset in write_block call */ |
| 38 | 729 ext_flash_read_block_stop(); |
| 730 | |
|
429
7f351c25608a
Marked possible code improvment for future activities:
ideenmodellierer
parents:
427
diff
changeset
|
731 /* TODO Cleanup_Ref_2: The code below should not be necessary in case of a proper shutdown and startup */ |
|
7f351c25608a
Marked possible code improvment for future activities:
ideenmodellierer
parents:
427
diff
changeset
|
732 /* the implementation fixes an issue which might happen at Cleanup_Ref_1 (in case of more then 254 dives) */ |
| 38 | 733 if((header1 == 0xFA) && (header2 == 0xFA)) |
| 734 { | |
| 735 id += 1; /* 0-255, auto rollover */ | |
| 736 if(id & 1) | |
| 737 { | |
| 738 actualAddress = HEADERSTART + (0x800 * id); | |
| 739 ext_flash_read_block_start(); | |
| 740 ext_flash_read_block(&header1, EF_SAMPLE); | |
| 741 ext_flash_read_block(&header2, EF_SAMPLE); | |
| 742 ext_flash_read_block_stop(); | |
| 743 if((header1 == 0xFA) && (header2 == 0xFA)) | |
| 744 id += 1; | |
| 745 } | |
| 746 } | |
| 747 else | |
| 748 { | |
| 749 id = 0; | |
| 750 } | |
| 751 | |
| 752 settings->lastDiveLogId = id; | |
| 753 actualPointerHeader = HEADERSTART + (0x800 * id); | |
| 754 | |
| 755 if(pHeaderPreDive != 0) | |
| 756 ef_write_block(pHeaderPreDive,HEADERSIZE, EF_HEADER, 0); | |
| 757 } | |
| 758 | |
| 759 | |
| 760 void ext_flash_close_new_dive_log(uint8_t *pHeaderPostDive ) | |
| 761 { | |
| 762 SSettings * settings = settingsGetPointer(); | |
| 763 uint8_t id; | |
| 764 convert_Type startAddress; | |
| 765 convert_Type data; | |
| 766 uint32_t backup; | |
| 767 | |
| 768 uint8_t sampleData[3]; | |
| 769 actualAddress = actualPointerSample; | |
| 770 sampleData[0] = 0xFD; | |
| 771 sampleData[1] = 0xFD; | |
| 772 ext_flash_write_sample(sampleData, 2); | |
| 773 | |
| 774 /* end of sample data, pointing to the last sample 0xFD | |
| 775 */ | |
| 776 actualAddress = actualPointerSample; // change hw 17.09.2015 | |
| 777 ext_flash_decf_address_ring(EF_SAMPLE); // 17.09.2015: this decf actualAddress only!! | |
| 778 actualPointerSample = actualAddress; // change hw 17.09.2015 | |
| 779 data.u32bit = actualPointerSample; | |
| 780 | |
| 781 pHeaderPostDive[5] = data.u8bit.byteLow; | |
| 782 pHeaderPostDive[6] = data.u8bit.byteMidLow; | |
| 783 pHeaderPostDive[7] = data.u8bit.byteMidHigh; | |
| 784 | |
| 785 /* take data written before, calculate length and write | |
| 786 SLogbookHeader has different order: length (byte# 8,9,10) prior to profile version (byte# 11) | |
| 787 */ | |
| 788 startAddress.u8bit.byteLow = pHeaderPostDive[2]; | |
| 789 startAddress.u8bit.byteMidLow = pHeaderPostDive[3]; | |
| 790 startAddress.u8bit.byteMidHigh = pHeaderPostDive[4]; | |
| 791 startAddress.u8bit.byteHigh = 0; | |
| 792 | |
| 793 if(startAddress.u32bit < actualPointerSample) | |
| 794 data.u32bit = 1 + actualPointerSample - startAddress.u32bit; | |
| 795 else | |
| 796 data.u32bit = 2 + (actualPointerSample - SAMPLESTART) + (SAMPLESTOP - startAddress.u32bit); | |
| 797 | |
| 798 pHeaderPostDive[8] = data.u8bit.byteLow; | |
| 799 pHeaderPostDive[9] = data.u8bit.byteMidLow; | |
| 800 pHeaderPostDive[10] = data.u8bit.byteMidHigh; | |
| 801 | |
| 802 /* set id and write post-dive-header | |
| 803 */ | |
| 804 id = settings->lastDiveLogId; | |
| 805 actualPointerHeader = HEADERSTART + (0x800 * id) + HEADER2OFFSET; | |
| 806 | |
| 807 ef_write_block(pHeaderPostDive,HEADERSIZE, EF_HEADER, 0); | |
| 808 | |
| 809 /* write length at beginning of sample | |
| 810 and write proper beginning for next dive to actualPointerSample | |
| 811 */ | |
| 812 backup = actualPointerSample; | |
| 813 actualPointerSample = startAddress.u32bit; // is still 0xFF | |
| 814 sampleData[0] = data.u8bit.byteLow; | |
| 815 sampleData[1] = data.u8bit.byteMidLow; | |
| 816 sampleData[2] = data.u8bit.byteMidHigh; | |
| 817 ext_flash_overwrite_sample_without_erase(sampleData, 3); | |
| 818 | |
| 819 actualAddress = backup; | |
| 820 ext_flash_incf_address(EF_SAMPLE); | |
| 821 actualPointerSample = actualAddress; | |
| 822 ext_flash_enable_protection(); | |
| 823 } | |
| 824 | |
| 825 | |
| 826 void ext_flash_write_sample(uint8_t *pSample, uint16_t length) | |
| 827 { | |
|
423
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
828 uint32_t actualAdressBackup = 0; |
|
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
829 |
| 38 | 830 ef_write_block(pSample,length, EF_SAMPLE, 0); |
| 831 | |
| 832 SSettings *settings = settingsGetPointer(); | |
| 833 settings->logFlashNextSampleStartAddress = actualPointerSample; | |
|
423
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
834 |
|
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
835 if(0xFFFF - (actualAddress & 0x0000FFFF) < 255) /* are we close to a sector border? */ |
|
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
836 { |
|
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
837 if (((actualAddress & 0x0000FFFF) != 0) && (preparedPageAddress == 0)) /* only prepare if not already at start of sector */ |
|
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
838 { |
|
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
839 actualAdressBackup = actualAddress; |
|
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
840 actualAddress = (actualAddress & 0xFFFF0000) + 0x00010000; /* Set to start of next 64k sector */ |
|
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
841 if(actualAddress >= SAMPLESTOP) |
|
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
842 { |
|
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
843 actualAddress = SAMPLESTART; |
|
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
844 } |
|
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
845 preparedPageAddress = actualAddress; |
|
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
846 ext_flash_erase64kB(); |
|
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
847 actualAddress = actualAdressBackup; |
|
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
848 } |
|
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
849 } |
| 38 | 850 } |
| 851 | |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
852 static void ext_flash_overwrite_sample_without_erase(uint8_t *pSample, uint16_t length) |
| 38 | 853 { |
| 854 ef_write_block(pSample,length, EF_SAMPLE, 1); | |
| 855 } | |
| 856 | |
| 857 | |
| 858 uint8_t ext_flash_count_dive_headers(void) | |
| 859 { | |
| 860 uint8_t id = 0; | |
| 861 uint8_t counter = 0; | |
| 862 uint16_t headerStartData = 0x0000; | |
| 863 | |
| 864 id = settingsGetPointer()->lastDiveLogId; | |
| 865 | |
| 866 do | |
| 867 { | |
| 868 actualAddress = HEADERSTART + (0x800 * id) + HEADER2OFFSET; | |
| 869 ext_flash_read_block_start(); | |
| 870 ext_flash_read_block_multi((uint8_t *)&headerStartData, 2, EF_HEADER); | |
| 871 ext_flash_read_block_stop(); | |
| 872 counter++; | |
| 873 id -=1; | |
| 874 } while((headerStartData == 0xFAFA) && (counter < 255)); | |
| 875 return (counter - 1); | |
| 876 } | |
| 877 | |
| 878 | |
| 879 void ext_flash_read_dive_header(uint8_t *pHeaderToFill, uint8_t StepBackwards) | |
| 880 { | |
| 881 SSettings *settings; | |
| 882 uint8_t id; | |
| 883 uint16_t i; | |
| 884 | |
| 885 settings = settingsGetPointer(); | |
| 886 id = settings->lastDiveLogId; | |
| 887 id -= StepBackwards; /* 0-255, auto rollover */ | |
| 888 | |
| 889 actualAddress = HEADERSTART + (0x800 * id) + HEADER2OFFSET; | |
| 890 ext_flash_read_block_start(); | |
| 891 for(i = 0; i < HEADERSIZE; i++) | |
| 892 ext_flash_read_block(&pHeaderToFill[i], EF_HEADER); | |
| 893 ext_flash_read_block_stop(); | |
| 894 | |
| 895 } | |
| 896 | |
| 897 void ext_flash_read_dive_header2(uint8_t *pHeaderToFill, uint8_t id, _Bool bOffset) | |
| 898 { | |
| 899 | |
| 900 uint16_t i; | |
| 901 actualAddress = HEADERSTART + (0x800 * id) ; | |
| 902 | |
| 903 if(bOffset) | |
| 904 actualAddress += HEADER2OFFSET; | |
| 905 ext_flash_read_block_start(); | |
| 906 for(i = 0; i < HEADERSIZE; i++) | |
| 907 ext_flash_read_block(&pHeaderToFill[i], EF_HEADER); | |
| 908 ext_flash_read_block_stop(); | |
| 909 } | |
| 910 | |
| 911 | |
| 912 uint32_t ext_flash_read_dive_raw_with_double_header_1K(uint8_t *data, uint32_t max_size, uint8_t StepBackwards) | |
| 913 { | |
| 914 if(max_size < 0x800) | |
| 915 return 0; | |
| 916 | |
| 917 uint8_t id; | |
| 918 convert_Type dataStart, dataEnd; | |
| 919 uint32_t LengthAll = 0; | |
| 920 | |
| 921 id = settingsGetPointer()->lastDiveLogId; | |
| 922 id -= StepBackwards; /* 0-255, auto rollover */ | |
| 923 | |
| 924 // clear data | |
| 925 for(int i=0;i<0x800;i++) | |
| 926 data[i] = 0xFF; | |
| 927 | |
| 928 // copy primary/pre-dive | |
| 929 actualAddress = HEADERSTART + (0x800 * id); | |
| 930 ext_flash_read_block_start(); | |
| 931 for(int i = 0; i < HEADERSIZE; i++) | |
| 932 ext_flash_read_block(&data[i], EF_HEADER); | |
| 933 ext_flash_read_block_stop(); | |
| 934 | |
| 935 // copy main/secondary/post-dive | |
| 936 actualAddress = HEADERSTART + (0x800 * id) + HEADER2OFFSET; | |
| 937 ext_flash_read_block_start(); | |
| 938 for(int i = 0x400; i < HEADERSIZE+0x400; i++) | |
| 939 ext_flash_read_block(&data[i], EF_HEADER); | |
| 940 ext_flash_read_block_stop(); | |
| 941 | |
| 942 // data | |
| 943 | |
| 944 dataStart.u8bit.byteHigh = 0; | |
| 945 dataStart.u8bit.byteLow = data[0x402]; | |
| 946 dataStart.u8bit.byteMidLow = data[0x403]; | |
| 947 dataStart.u8bit.byteMidHigh = data[0x404]; | |
| 948 | |
| 949 dataEnd.u8bit.byteHigh = 0; | |
| 950 dataEnd.u8bit.byteLow = data[0x405]; | |
| 951 dataEnd.u8bit.byteMidLow = data[0x406]; | |
| 952 dataEnd.u8bit.byteMidHigh = data[0x407]; | |
| 953 | |
| 954 actualPointerSample = dataStart.u32bit; | |
| 955 if(dataEnd.u32bit >= dataStart.u32bit) | |
| 956 LengthAll = 1 + dataEnd.u32bit - dataStart.u32bit; | |
| 957 else | |
| 958 LengthAll = 2 + (dataStart.u32bit - SAMPLESTART) + (SAMPLESTOP - dataEnd.u32bit); | |
| 959 | |
| 960 LengthAll += 0x800; | |
| 961 | |
| 962 if(LengthAll > max_size) | |
| 963 return 0x800; | |
| 964 | |
| 965 actualAddress = actualPointerSample; | |
| 966 ext_flash_read_block_start(); | |
| 967 for(uint32_t i = 0x800; i < LengthAll; i++) | |
| 968 ext_flash_read_block(&data[i], EF_SAMPLE); | |
| 969 ext_flash_read_block_stop(); | |
| 970 return LengthAll; | |
| 971 } | |
| 972 | |
| 973 void ext_flash_write_dive_raw_with_double_header_1K(uint8_t *data, uint32_t length) | |
| 974 { | |
| 975 convert_Type dataStart, dataEnd; | |
| 976 SLogbookHeader headerTemp; | |
| 977 | |
| 978 // set actualPointerSample and get pointer to sample storage and disable flash write protect | |
| 979 ext_flash_start_new_dive_log_and_set_actualPointerSample((uint8_t *)&headerTemp); | |
| 980 | |
| 981 dataStart.u8bit.byteHigh = 0; | |
| 982 dataStart.u8bit.byteLow = headerTemp.pBeginProfileData[0]; | |
| 983 dataStart.u8bit.byteMidLow = headerTemp.pBeginProfileData[1]; | |
| 984 dataStart.u8bit.byteMidHigh = headerTemp.pBeginProfileData[2]; | |
| 985 | |
| 986 dataEnd.u32bit = dataStart.u32bit + length - 0x801; | |
| 987 if(dataEnd.u32bit > SAMPLESTOP) | |
| 988 dataEnd.u32bit -= SAMPLESTOP + SAMPLESTART - 1; | |
| 989 | |
| 990 data[0x002] = data[0x402] = dataStart.u8bit.byteLow; | |
| 991 data[0x003] = data[0x403] = dataStart.u8bit.byteMidLow; | |
| 992 data[0x004] = data[0x404] = dataStart.u8bit.byteMidHigh; | |
| 993 data[0x005] = data[0x405] = dataEnd.u8bit.byteLow; | |
| 994 data[0x006] = data[0x406] = dataEnd.u8bit.byteMidLow; | |
| 995 data[0x007] = data[0x407] = dataEnd.u8bit.byteMidHigh; | |
| 996 | |
| 997 // set actualPointerHeader to next free header and update lastDiveLogId | |
| 998 ext_flash_create_new_dive_log(0); | |
| 999 | |
| 1000 // copy header data | |
| 1001 ef_write_block(data,0x800,EF_HEADER, 1); | |
| 1002 | |
| 1003 // copy sample data | |
| 1004 ef_write_block(&data[0x800], length-0x800, EF_SAMPLE, 1); | |
| 1005 | |
| 1006 // update logFlashNextSampleStartAddress | |
| 1007 settingsGetPointer()->logFlashNextSampleStartAddress = actualPointerSample; | |
| 1008 } | |
| 1009 | |
| 1010 | |
| 1011 // =============================================================================== | |
| 1012 // ext_flash_read_header_memory | |
| 1013 /// @brief This function returns the entire header space 1:1 | |
| 1014 /// @date 04-April-2016 | |
| 1015 /// | |
| 1016 /// @param *data 256KB output | |
| 1017 // =============================================================================== | |
| 1018 void ext_flash_read_header_memory(uint8_t *data) | |
| 1019 { | |
| 1020 actualAddress = HEADERSTART; | |
| 1021 actualPointerHeader = actualAddress; | |
| 1022 ext_flash_read_block_start(); | |
| 1023 for(int i=0;i<8;i++) | |
| 1024 ext_flash_read_block_multi(&data[0x8000 * i], 0x8000, EF_HEADER); | |
| 1025 ext_flash_read_block_stop(); | |
| 1026 } | |
| 1027 | |
| 1028 | |
| 1029 // =============================================================================== | |
| 463 | 1030 // ext_flash_write_header_memory |
| 38 | 1031 /// @brief This function erases and overwrites the entire logbook header block |
| 1032 /// @date 04-April-2016 | |
| 1033 /// | |
| 1034 /// @param *data 256KB input of header memory 1:1 | |
| 1035 // =============================================================================== | |
| 1036 void ext_flash_write_header_memory(uint8_t *data) | |
| 1037 { | |
| 1038 actualAddress = HEADERSTART; | |
| 1039 actualPointerHeader = actualAddress; | |
| 1040 ef_write_block(data, 0x40000, EF_HEADER, 0); | |
| 1041 } | |
| 1042 | |
| 463 | 1043 void ext_flash_read_sample_memory(uint8_t *data,uint16_t blockId) |
| 1044 { | |
| 1045 actualAddress = SAMPLESTART; | |
| 1046 actualAddress += blockId * 0x8000; /* add 32k Block offset */ | |
| 1047 actualPointerSample = actualAddress; | |
| 1048 ext_flash_read_block_start(); | |
| 1049 ext_flash_read_block_multi(data, 0x8000, EF_SAMPLE); | |
| 1050 ext_flash_read_block_stop(); | |
| 1051 } | |
| 1052 | |
| 1053 void ext_flash_write_sample_memory(uint8_t *data,uint16_t blockId) | |
| 1054 { | |
| 1055 actualAddress = SAMPLESTART; | |
| 1056 actualAddress += blockId * 0x8000; /* add 32k Block offset */ | |
| 1057 actualPointerSample = actualAddress; | |
| 1058 ef_write_block(data, 0x8000, EF_SAMPLE,0); | |
| 1059 } | |
| 1060 | |
| 38 | 1061 |
| 1062 void ext_flash_open_read_sample(uint8_t StepBackwards, uint32_t *totalNumberOfBytes) | |
| 1063 { | |
| 1064 SSettings *settings = settingsGetPointer(); | |
| 1065 uint8_t id; | |
| 1066 convert_Type dataStart, dataEnd; | |
| 1067 uint8_t header1, header2; | |
| 1068 | |
| 1069 id = settings->lastDiveLogId; | |
| 1070 id -= StepBackwards; /* 0-255, auto rollover */ | |
| 1071 # | |
| 1072 actualAddress = HEADERSTART + (0x800 * id) + HEADER2OFFSET; | |
| 1073 actualPointerHeader = actualAddress; | |
| 1074 | |
| 1075 ext_flash_read_block_start(); | |
| 1076 /* little endian */ | |
| 1077 ext_flash_read_block(&header1, EF_HEADER); | |
| 1078 ext_flash_read_block(&header2, EF_HEADER); | |
| 1079 dataStart.u8bit.byteHigh = 0; | |
| 1080 ext_flash_read_block(&dataStart.u8bit.byteLow, EF_HEADER); | |
| 1081 ext_flash_read_block(&dataStart.u8bit.byteMidLow, EF_HEADER); | |
| 1082 ext_flash_read_block(&dataStart.u8bit.byteMidHigh, EF_HEADER); | |
| 1083 dataEnd.u8bit.byteHigh = 0; | |
| 1084 ext_flash_read_block(&dataEnd.u8bit.byteLow, EF_HEADER); | |
| 1085 ext_flash_read_block(&dataEnd.u8bit.byteMidLow, EF_HEADER); | |
| 1086 ext_flash_read_block(&dataEnd.u8bit.byteMidHigh, EF_HEADER); | |
| 1087 ext_flash_read_block_stop(); | |
| 1088 | |
| 1089 actualPointerSample = dataStart.u32bit; | |
| 1090 if(dataEnd.u32bit >= dataStart.u32bit) | |
| 1091 LengthLeftSampleRead = 1 + dataEnd.u32bit - dataStart.u32bit; | |
| 1092 else | |
| 1093 LengthLeftSampleRead = 2 + (dataStart.u32bit - SAMPLESTART) + (SAMPLESTOP - dataEnd.u32bit); | |
| 1094 *totalNumberOfBytes = LengthLeftSampleRead; | |
| 1095 | |
| 1096 actualAddress = actualPointerSample; | |
| 1097 ext_flash_read_block_start(); | |
| 1098 } | |
| 1099 | |
| 1100 | |
| 1101 void ext_flash_read_next_sample_part(uint8_t *pSample, uint8_t length) | |
| 1102 { | |
| 1103 for(uint16_t i = 0; i < length; i++) | |
| 1104 ext_flash_read_block(&pSample[i], EF_SAMPLE); | |
| 1105 } | |
| 1106 | |
| 1107 | |
| 1108 void ext_flash_close_read_sample(void) | |
| 1109 { | |
| 1110 actualPointerSample = actualAddress; | |
| 1111 ext_flash_read_block_stop(); | |
| 1112 } | |
| 1113 | |
| 1114 | |
| 1115 void ext_flash_set_entry_point(void) | |
| 1116 { | |
| 1117 entryPoint = actualAddress; | |
| 1118 } | |
| 1119 | |
| 1120 | |
| 1121 void ext_flash_reopen_read_sample_at_entry_point(void) | |
| 1122 { | |
| 1123 error_led_on(); | |
| 1124 chip_unselect(); | |
| 1125 wait_chip_not_busy(); | |
| 1126 | |
| 1127 actualAddress = entryPoint; | |
| 1128 ext_flash_read_block_start(); | |
| 1129 error_led_off(); | |
| 1130 } | |
| 1131 | |
| 1132 /* | |
| 1133 uint8_t ext_flash_point_to_64k_block_in_headerSpace(uint8_t logId) | |
| 1134 { | |
| 1135 uint32_t pointerToData = logId * 0x800; | |
| 1136 | |
| 1137 return pointerToData / 0x10000; | |
| 1138 } | |
| 1139 */ | |
| 1140 | |
| 1141 | |
| 1142 // =============================================================================== | |
| 1143 // ext_flash_repair_dive_numbers_starting_count_helper | |
| 1144 /// @brief | |
| 1145 /// @date 22-June-2016 | |
| 1146 | |
| 1147 // =============================================================================== | |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
1148 static uint16_t ext_flash_repair_dive_numbers_starting_count_helper(uint8_t *data, uint8_t *change64k, uint16_t startNumber, uint8_t lastLogId) |
| 38 | 1149 { |
| 1150 const uint32_t headerStep = 0x800; | |
| 1151 uint8_t actualLogId = 0; | |
| 1152 uint16_t oldNumber = 0; | |
| 1153 uint16_t actualNumber = 0; | |
| 1154 SLogbookHeader *ptrLogbookHeader = 0; | |
| 1155 | |
| 1156 if(startNumber == 0) | |
| 1157 return 0; | |
| 1158 | |
| 1159 actualNumber = startNumber - 1; | |
| 1160 | |
| 282 | 1161 // where is the oldest dive (Which is now getting startNumber) |
| 38 | 1162 // use first header for ease (without HEADER2OFFSET for end of dive header) |
| 1163 // compare for lastLogId to prevent endless loop | |
| 1164 | |
| 1165 if(*(uint16_t*)&data[lastLogId * headerStep] != 0xFAFA) | |
| 1166 return 0; | |
| 1167 | |
| 1168 actualLogId = lastLogId - 1; | |
| 1169 while((*(uint16_t*)&data[actualLogId * headerStep] == 0xFAFA) && (actualLogId != lastLogId)) | |
| 1170 { | |
| 1171 actualLogId--; | |
| 1172 } | |
| 1173 | |
| 1174 // now pointing to one behind the last | |
| 1175 while(actualLogId != lastLogId) | |
| 1176 { | |
| 1177 actualLogId++; | |
| 1178 actualNumber++; | |
| 1179 ptrLogbookHeader = (SLogbookHeader *)&data[actualLogId * headerStep]; | |
| 1180 | |
| 1181 oldNumber = ptrLogbookHeader->diveNumber; | |
| 1182 if(oldNumber != actualNumber) | |
| 1183 { | |
| 1184 // change64k[ext_flash_point_to_64k_block_in_headerSpace(actualLogId )] = 1; | |
| 1185 change64k[(actualLogId * 0x800)/0x10000] = 1; | |
| 1186 ptrLogbookHeader->diveNumber = actualNumber; | |
| 1187 ptrLogbookHeader = (SLogbookHeader *)(&data[actualLogId * headerStep] + HEADER2OFFSET); | |
| 1188 ptrLogbookHeader->diveNumber = actualNumber; | |
| 1189 } | |
| 1190 } | |
| 1191 | |
| 1192 return actualNumber; | |
| 1193 } | |
| 1194 | |
| 1195 // =============================================================================== | |
| 1196 // ext_flash_repair_SPECIAL_dive_numbers_starting_count_with | |
| 1197 /// @brief This function | |
| 1198 /// @date 04-April-2016 | |
| 282 | 1199 /// problem (160621): 64K blocks (32 dives) in the new flash memory chip |
| 1200 /// This block needs to be deleted | |
| 1201 /// these where only 4KB block before | |
| 38 | 1202 /// @output endCount, last diveNumber |
| 1203 | |
| 1204 // =============================================================================== | |
| 1205 uint16_t ext_flash_repair_SPECIAL_dive_numbers_starting_count_with(uint16_t startCount) | |
| 1206 { | |
| 1207 uint32_t logCopyDataPtr = 0; | |
| 1208 uint8_t *data; | |
| 1209 uint16_t lastCount; | |
| 282 | 1210 uint8_t listOfChanged64kBlocks[8]; // 32 dives each 64K |
| 38 | 1211 |
| 1212 logCopyDataPtr = getFrame(97); | |
| 1213 data = (uint8_t *)logCopyDataPtr; | |
| 1214 | |
| 1215 for(int i=0;i<8;i++) | |
| 1216 listOfChanged64kBlocks[i] = 0; | |
| 1217 | |
| 1218 actualAddress = HEADERSTART; | |
| 1219 ext_flash_read_block_start(); | |
| 1220 ext_flash_read_block_multi(data,0x100000,EF_HEADER); | |
| 1221 ext_flash_read_block_stop(); | |
| 1222 | |
| 1223 lastCount = ext_flash_repair_dive_numbers_starting_count_helper(data, listOfChanged64kBlocks, startCount, settingsGetPointer()->lastDiveLogId); | |
| 1224 | |
| 1225 for(int i=0;i<8;i++) | |
| 1226 { | |
| 1227 if(listOfChanged64kBlocks[i] != 0) | |
| 1228 { | |
| 1229 actualPointerHeader = HEADERSTART + (i * 0x10000); | |
| 1230 ef_write_block(&data[i * 0x10000], 0x10000, EF_HEADER, 0); | |
| 1231 } | |
| 1232 } | |
| 1233 | |
| 1234 releaseFrame(97,logCopyDataPtr); | |
| 1235 if(settingsGetPointer()->totalDiveCounter < lastCount) | |
| 1236 { | |
| 1237 settingsGetPointer()->totalDiveCounter = lastCount; | |
| 1238 } | |
| 1239 return lastCount; | |
| 1240 } | |
| 1241 | |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
1242 /* |
| 38 | 1243 void OLD_ext_flash_repair_SPECIAL_dive_numbers_starting_count_with(uint16_t startCount) |
| 1244 { | |
| 1245 uint16_t counterStorage[256]; | |
| 1246 uint8_t start = 0xFF; | |
| 1247 uint32_t logCopyDataPtr = 0; | |
| 1248 uint8_t *data; | |
| 1249 uint8_t startAbsolute = 0; | |
| 1250 int16_t count = 0; | |
| 1251 _Bool repair = 0; | |
| 1252 uint8_t startBackup = 0; | |
| 1253 | |
| 1254 SLogbookHeader tempLogbookHeader; | |
| 1255 SLogbookHeader *ptrHeaderInData1a; | |
| 1256 SLogbookHeader *ptrHeaderInData1b; | |
| 1257 SLogbookHeader *ptrHeaderInData2a; | |
| 1258 SLogbookHeader *ptrHeaderInData2b; | |
| 1259 | |
| 1260 logCopyDataPtr = getFrame(97); | |
| 1261 data = (uint8_t *)logCopyDataPtr; | |
| 1262 ptrHeaderInData1a = (SLogbookHeader *)logCopyDataPtr; | |
| 1263 ptrHeaderInData1b = (SLogbookHeader *)(logCopyDataPtr + HEADER2OFFSET); | |
| 1264 ptrHeaderInData2a = (SLogbookHeader *)(logCopyDataPtr + 0x800); | |
| 1265 ptrHeaderInData2b = (SLogbookHeader *)(logCopyDataPtr + 0x800 + HEADER2OFFSET); | |
| 1266 | |
| 1267 // get data | |
| 1268 for(int StepBackwards = 0; StepBackwards < 255; StepBackwards++) | |
| 1269 { | |
| 1270 logbook_getHeader(StepBackwards, &tempLogbookHeader); | |
| 1271 counterStorage[StepBackwards+1] = tempLogbookHeader.diveNumber; | |
| 1272 if(tempLogbookHeader.diveHeaderStart == 0xFAFA) | |
| 1273 start = StepBackwards; | |
| 1274 else | |
| 1275 break; | |
| 1276 } | |
| 1277 | |
| 1278 if(start == 0xFF) | |
| 1279 return; | |
| 1280 | |
| 1281 count = start + 1; | |
| 1282 startAbsolute = settingsGetPointer()->lastDiveLogId; | |
| 1283 | |
| 1284 | |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
1285 |
| 38 | 1286 if(start%2) |
| 1287 { | |
| 1288 if(counterStorage[start] != startCount) | |
| 1289 { | |
| 1290 // clear data | |
| 1291 for(int i=0;i<0x800*2;i++) | |
| 1292 data[i] = 0xFF; | |
| 1293 | |
| 1294 uint8_t id = settingsGetPointer()->lastDiveLogId; | |
| 1295 id -= start; // 0-255, auto rollover | |
| 1296 | |
| 1297 // copy primary/pre-dive | |
| 1298 actualAddress = HEADERSTART + (0x800 * id); | |
| 1299 ext_flash_read_block_start(); | |
| 1300 for(int i = 0; i < HEADERSIZE; i++) | |
| 1301 ext_flash_read_block(&data[i], EF_HEADER); | |
| 1302 ext_flash_read_block_stop(); | |
| 1303 | |
| 1304 // copy main/secondary/post-dive | |
| 1305 actualAddress = HEADERSTART + (0x800 * id) + HEADER2OFFSET; | |
| 1306 ext_flash_read_block_start(); | |
| 1307 for(int i = 0x400; i < HEADERSIZE+0x400; i++) | |
| 1308 ext_flash_read_block(&data[i], EF_HEADER); | |
| 1309 ext_flash_read_block_stop(); | |
| 1310 | |
| 1311 // repair | |
| 1312 ptrHeaderInData2a->diveNumber = startCount; | |
| 1313 ptrHeaderInData2b->diveNumber = startCount; | |
| 1314 startCount++; | |
| 1315 | |
| 1316 // write | |
| 1317 actualAddress = HEADERSTART + (0x800 * (id-1)); | |
| 1318 ef_write_block(data,0x800*2,EF_HEADER, 0); | |
| 1319 } | |
| 1320 start--; | |
| 1321 } | |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
1322 |
| 38 | 1323 // for(int count = start; count > -1; count -= 2) |
| 1324 | |
| 1325 while(count > 0) | |
| 1326 { | |
| 1327 // clear data | |
| 1328 for(int i=0;i<0x1000;i++) | |
| 1329 data[i] = 0xFF; | |
| 1330 | |
| 1331 repair = 0; | |
| 1332 | |
| 1333 startBackup = startAbsolute; | |
| 1334 | |
| 1335 if(startAbsolute%2) // 0x800 to 0x1000 | |
| 1336 { | |
| 1337 // copy second pre-dive | |
| 1338 actualAddress = HEADERSTART + (0x800 * startAbsolute); | |
| 1339 ext_flash_read_block_start(); | |
| 1340 for(int i = 0x800; i < HEADERSIZE+0x800; i++) | |
| 1341 ext_flash_read_block(&data[i], EF_HEADER); | |
| 1342 ext_flash_read_block_stop(); | |
| 1343 | |
| 1344 // copy second post-dive | |
| 1345 actualAddress = HEADERSTART + HEADER2OFFSET + (0x800 * startAbsolute); | |
| 1346 ext_flash_read_block_start(); | |
| 1347 for(int i = 0xC00; i < HEADERSIZE+0xC00; i++) | |
| 1348 ext_flash_read_block(&data[i], EF_HEADER); | |
| 1349 ext_flash_read_block_stop(); | |
| 1350 | |
| 1351 if(counterStorage[count] != startCount) | |
| 1352 { | |
| 1353 ptrHeaderInData2a->diveNumber = startCount; | |
| 1354 ptrHeaderInData2b->diveNumber = startCount; | |
| 1355 repair = 1; | |
| 1356 } | |
| 1357 startCount += 1; | |
| 1358 | |
| 1359 startAbsolute -= 1; | |
| 1360 count -= 1; | |
| 1361 | |
| 1362 if(count > 0) | |
| 1363 { | |
| 1364 // copy first pre-dive | |
| 1365 actualAddress = HEADERSTART + (0x800 * startAbsolute); | |
| 1366 ext_flash_read_block_start(); | |
| 1367 for(int i = 0; i < HEADERSIZE; i++) | |
| 1368 ext_flash_read_block(&data[i], EF_HEADER); | |
| 1369 ext_flash_read_block_stop(); | |
| 1370 | |
| 1371 // copy first post-dive | |
| 1372 actualAddress = HEADERSTART + (0x800 * startAbsolute); | |
| 1373 ext_flash_read_block_start(); | |
| 1374 for(int i = 0x400; i < HEADERSIZE+0x400; i++) | |
| 1375 ext_flash_read_block(&data[i], EF_HEADER); | |
| 1376 ext_flash_read_block_stop(); | |
| 1377 | |
| 1378 if(counterStorage[count] != startCount) | |
| 1379 { | |
| 1380 ptrHeaderInData1a->diveNumber = startCount; | |
| 1381 ptrHeaderInData1b->diveNumber = startCount; | |
| 1382 repair = 1; | |
| 1383 } | |
| 1384 startCount += 1; | |
| 1385 | |
| 1386 startAbsolute -= 1; | |
| 1387 count -= 1; | |
| 1388 } | |
| 1389 } | |
| 1390 else | |
| 1391 { | |
| 1392 // copy first pre-dive | |
| 1393 actualAddress = HEADERSTART + (0x800 * startAbsolute); | |
| 1394 ext_flash_read_block_start(); | |
| 1395 for(int i = 0; i < HEADERSIZE; i++) | |
| 1396 ext_flash_read_block(&data[i], EF_HEADER); | |
| 1397 ext_flash_read_block_stop(); | |
| 1398 | |
| 1399 // copy first post-dive | |
| 1400 actualAddress = HEADERSTART + (0x800 * startAbsolute); | |
| 1401 ext_flash_read_block_start(); | |
| 1402 for(int i = 0x400; i < HEADERSIZE+0x400; i++) | |
| 1403 ext_flash_read_block(&data[i], EF_HEADER); | |
| 1404 ext_flash_read_block_stop(); | |
| 1405 | |
| 1406 if(counterStorage[count] != startCount) | |
| 1407 { | |
| 1408 ptrHeaderInData1a->diveNumber = startCount; | |
| 1409 ptrHeaderInData1b->diveNumber = startCount; | |
| 1410 repair = 1; | |
| 1411 } | |
| 1412 startCount += 1; | |
| 1413 | |
| 1414 startAbsolute -= 1; | |
| 1415 count -= 1; | |
| 1416 } | |
| 1417 | |
| 1418 // write | |
| 1419 if(repair) | |
| 1420 { | |
| 1421 actualPointerHeader = HEADERSTART + (0x1000 * startBackup%2); | |
| 1422 ef_write_block(data,0x1000,EF_HEADER, 0); | |
| 1423 } | |
| 1424 } | |
| 1425 releaseFrame(97,logCopyDataPtr); | |
| 1426 settingsGetPointer()->totalDiveCounter = startCount; | |
| 1427 } | |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
1428 */ |
| 38 | 1429 |
|
452
b90ddf57f7f1
Added compile variant enabling the reset of profile sample information:
ideenmodellierer
parents:
429
diff
changeset
|
1430 uint8_t ext_dive_log_consistent(void) |
|
b90ddf57f7f1
Added compile variant enabling the reset of profile sample information:
ideenmodellierer
parents:
429
diff
changeset
|
1431 { |
|
b90ddf57f7f1
Added compile variant enabling the reset of profile sample information:
ideenmodellierer
parents:
429
diff
changeset
|
1432 uint8_t ret = 0; |
|
b90ddf57f7f1
Added compile variant enabling the reset of profile sample information:
ideenmodellierer
parents:
429
diff
changeset
|
1433 uint8_t header1, header2; |
|
b90ddf57f7f1
Added compile variant enabling the reset of profile sample information:
ideenmodellierer
parents:
429
diff
changeset
|
1434 uint8_t id; |
|
b90ddf57f7f1
Added compile variant enabling the reset of profile sample information:
ideenmodellierer
parents:
429
diff
changeset
|
1435 convert_Type dataStart; |
|
557
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1436 convert_Type dataEnd; |
|
452
b90ddf57f7f1
Added compile variant enabling the reset of profile sample information:
ideenmodellierer
parents:
429
diff
changeset
|
1437 |
|
b90ddf57f7f1
Added compile variant enabling the reset of profile sample information:
ideenmodellierer
parents:
429
diff
changeset
|
1438 SSettings *settings = settingsGetPointer(); |
|
b90ddf57f7f1
Added compile variant enabling the reset of profile sample information:
ideenmodellierer
parents:
429
diff
changeset
|
1439 id = settings->lastDiveLogId; |
|
b90ddf57f7f1
Added compile variant enabling the reset of profile sample information:
ideenmodellierer
parents:
429
diff
changeset
|
1440 |
|
557
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1441 if(settings->lastDiveLogId != 0) /* not trust LogID 0 which might be reset by a settings problem */ |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1442 { /* ==> Find function will be called restoring the Id belonging to the latest sample */ |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1443 actualAddress = HEADERSTART + (0x800 * id); |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1444 ext_flash_read_block_start(); |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1445 ext_flash_read_block(&header1, EF_HEADER); |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1446 ext_flash_read_block(&header2, EF_HEADER); |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1447 ext_flash_read_block_stop(); |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1448 if((header1 == 0xFA) && (header2 == 0xFA)) /* Header is indicating the start of a dive */ |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1449 { |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1450 actualAddress = HEADERSTART + (0x800 * id) + HEADER2OFFSET; |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1451 ext_flash_read_block_start(); |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1452 ext_flash_read_block(&header1, EF_HEADER); |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1453 ext_flash_read_block(&header2, EF_HEADER); |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1454 dataStart.u8bit.byteHigh = 0; |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1455 ext_flash_read_block(&dataStart.u8bit.byteLow, EF_HEADER); |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1456 ext_flash_read_block(&dataStart.u8bit.byteMidLow, EF_HEADER); |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1457 ext_flash_read_block(&dataStart.u8bit.byteMidHigh, EF_HEADER); |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1458 dataEnd.u8bit.byteHigh = 0; |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1459 ext_flash_read_block(&dataEnd.u8bit.byteLow, EF_HEADER); |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1460 ext_flash_read_block(&dataEnd.u8bit.byteMidLow, EF_HEADER); |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1461 ext_flash_read_block(&dataEnd.u8bit.byteMidHigh, EF_HEADER); |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1462 ext_flash_read_block_stop(); |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1463 |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1464 if((header1 == 0xFA) && (header2 == 0xFA)) /* Secondary header was written at the end of a dive */ |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1465 { |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1466 if(dataStart.u32bit < dataEnd.u32bit) |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1467 { |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1468 ret = 1; /* => lastDiveLogID points to a valid dive entry */ |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1469 } |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1470 else /* check if address wrap is valid */ |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1471 { |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1472 if(ext_flash_SampleOverrunValid()) |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1473 { |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1474 ret = 1; |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1475 } |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1476 } |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1477 } |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1478 } |
|
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
1479 } |
|
452
b90ddf57f7f1
Added compile variant enabling the reset of profile sample information:
ideenmodellierer
parents:
429
diff
changeset
|
1480 return ret; |
|
b90ddf57f7f1
Added compile variant enabling the reset of profile sample information:
ideenmodellierer
parents:
429
diff
changeset
|
1481 } |
|
b90ddf57f7f1
Added compile variant enabling the reset of profile sample information:
ideenmodellierer
parents:
429
diff
changeset
|
1482 |
| 38 | 1483 // =============================================================================== |
| 1484 // ext_flash_repair_dive_log | |
| 1485 /// @brief This function | |
| 1486 /// does set | |
| 1487 /// logFlashNextSampleStartAddress | |
| 1488 /// and | |
| 1489 /// lastDiveLogId | |
| 1490 /// | |
|
452
b90ddf57f7f1
Added compile variant enabling the reset of profile sample information:
ideenmodellierer
parents:
429
diff
changeset
|
1491 |
| 38 | 1492 void ext_flash_repair_dive_log(void) |
| 1493 { | |
| 1494 uint8_t header1, header2; | |
| 1495 convert_Type dataStart; | |
| 1496 | |
| 1497 for(int id = 0; id < 255;id++) | |
| 1498 { | |
| 1499 actualAddress = HEADERSTART + (0x800 * id); | |
| 1500 ext_flash_read_block_start(); | |
| 1501 ext_flash_read_block(&header1, EF_HEADER); | |
| 1502 ext_flash_read_block(&header2, EF_HEADER); | |
| 1503 dataStart.u8bit.byteHigh = 0; | |
| 1504 ext_flash_read_block(&dataStart.u8bit.byteLow, EF_HEADER); | |
| 1505 ext_flash_read_block(&dataStart.u8bit.byteMidLow, EF_HEADER); | |
| 1506 ext_flash_read_block(&dataStart.u8bit.byteMidHigh, EF_HEADER); | |
| 1507 ext_flash_read_block_stop(); | |
|
425
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
1508 if((header1 == 0xFA) && (header2 == 0xFA)) /* Header is indicating the start of a dive */ |
| 38 | 1509 { |
| 1510 actualAddress = HEADERSTART + (0x800 * id) + HEADER2OFFSET; | |
| 1511 ext_flash_read_block_start(); | |
| 1512 ext_flash_read_block(&header1, EF_HEADER); | |
| 1513 ext_flash_read_block(&header2, EF_HEADER); | |
| 1514 ext_flash_read_block_stop(); | |
|
425
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
1515 if((header1 != 0xFA) || (header2 != 0xFA)) /* Secondary header was not written at the end of a dive */ |
| 38 | 1516 { |
|
425
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
1517 actualPointerSample = dataStart.u32bit; /* Set datapointer to position stored in header written at beginning of dive */ |
| 38 | 1518 actualAddress = actualPointerSample; |
| 1519 logbook_recover_brokenlog(id); | |
| 1520 SSettings *settings = settingsGetPointer(); | |
| 1521 settings->logFlashNextSampleStartAddress = actualPointerSample; | |
| 1522 } | |
| 1523 } | |
| 1524 } | |
| 1525 ext_flash_find_start(); | |
| 1526 } | |
| 1527 | |
| 1528 | |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
1529 static void ext_flash_find_start(void) |
| 38 | 1530 { |
| 1531 uint8_t id; | |
| 1532 uint8_t header1, header2; | |
| 1533 convert_Type dataStart, dataEnd; | |
| 1534 | |
|
429
7f351c25608a
Marked possible code improvment for future activities:
ideenmodellierer
parents:
427
diff
changeset
|
1535 /* TODO Cleanup_Ref_1: cleanup logFlashNextSampleStartAddress and lastDiveLogId */ |
|
7f351c25608a
Marked possible code improvment for future activities:
ideenmodellierer
parents:
427
diff
changeset
|
1536 /* The implementation below would cause problems in case more then 254 dives would be done. */ |
|
7f351c25608a
Marked possible code improvment for future activities:
ideenmodellierer
parents:
427
diff
changeset
|
1537 /* This is avoided by Cleanup_Ref2 */ |
|
441
9a9e4908ce2e
fix potential issue with >255 dives in the logbook
heinrichsweikamp
parents:
429
diff
changeset
|
1538 for(id = 0; id <= 255;id++) |
| 38 | 1539 { |
| 1540 actualAddress = HEADERSTART + (0x800 * id) + HEADER2OFFSET; | |
| 1541 ext_flash_read_block_start(); | |
| 1542 ext_flash_read_block(&header1, EF_HEADER); | |
| 1543 ext_flash_read_block(&header2, EF_HEADER); | |
| 1544 dataStart.u8bit.byteHigh = 0; | |
| 1545 ext_flash_read_block(&dataStart.u8bit.byteLow, EF_HEADER); | |
| 1546 ext_flash_read_block(&dataStart.u8bit.byteMidLow, EF_HEADER); | |
| 1547 ext_flash_read_block(&dataStart.u8bit.byteMidHigh, EF_HEADER); | |
| 1548 ext_flash_read_block_stop(); | |
| 1549 if((header1 == 0xFF) && (header2 == 0xFF)) | |
| 1550 { | |
| 1551 break; | |
| 1552 } | |
| 1553 } | |
| 1554 id--; | |
| 1555 SSettings *settings = settingsGetPointer(); | |
| 1556 settings->lastDiveLogId = id; | |
| 1557 | |
| 1558 actualAddress = HEADERSTART + (0x800 * id) + HEADER2OFFSET; | |
| 1559 actualPointerHeader = actualAddress; | |
| 1560 | |
| 1561 ext_flash_read_block_start(); | |
| 1562 | |
| 1563 ext_flash_read_block(&header1, EF_HEADER); | |
| 1564 ext_flash_read_block(&header2, EF_HEADER); | |
| 1565 dataStart.u8bit.byteHigh = 0; | |
| 1566 ext_flash_read_block(&dataStart.u8bit.byteLow, EF_HEADER); | |
| 1567 ext_flash_read_block(&dataStart.u8bit.byteMidLow, EF_HEADER); | |
| 1568 ext_flash_read_block(&dataStart.u8bit.byteMidHigh, EF_HEADER); | |
| 1569 dataEnd.u8bit.byteHigh = 0; | |
| 1570 ext_flash_read_block(&dataEnd.u8bit.byteLow, EF_HEADER); | |
| 1571 ext_flash_read_block(&dataEnd.u8bit.byteMidLow, EF_HEADER); | |
| 1572 ext_flash_read_block(&dataEnd.u8bit.byteMidHigh, EF_HEADER); | |
| 1573 ext_flash_read_block_stop(); | |
| 1574 | |
| 1575 //Find free space | |
| 1576 if((header1 == 0xFA) && (header2 == 0xFA)) | |
| 1577 { | |
| 1578 uint8_t uiRead = 0; | |
| 1579 int countFF = 0; | |
| 1580 //End of last complete dive | |
| 1581 actualPointerSample = dataEnd.u32bit ; | |
| 1582 actualAddress = actualPointerSample; | |
| 1583 //Check if there are samples of dives with less than half a minute | |
| 1584 while(true) | |
| 1585 { | |
| 1586 ext_flash_read_block_start(); | |
| 1587 ext_flash_read_block(&uiRead, EF_SAMPLE); | |
| 1588 if(uiRead == 0xFF) | |
| 1589 countFF++; | |
| 1590 else | |
| 1591 countFF = 0; | |
| 1592 | |
| 1593 | |
| 1594 | |
| 1595 if(countFF == 10) | |
| 1596 { | |
| 1597 actualAddress -= 10; | |
| 1598 break; | |
| 1599 } | |
| 1600 | |
| 1601 //New page: clear | |
| 1602 if(ext_flash_erase_if_on_page_start()) | |
| 1603 break; | |
| 1604 } | |
| 1605 // Set new start address | |
| 1606 actualPointerSample = actualAddress; | |
| 1607 settings->logFlashNextSampleStartAddress = actualPointerSample; | |
| 1608 } | |
| 1609 else | |
| 1610 { | |
| 1611 settings->logFlashNextSampleStartAddress = SAMPLESTART; | |
| 1612 } | |
| 1613 } | |
| 1614 | |
| 1615 | |
| 870 | 1616 |
| 38 | 1617 |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
1618 static void ext_flash_disable_protection(void) |
| 38 | 1619 { |
| 1620 /* | |
| 1621 extFlashStatusBit8_Type status; | |
| 1622 | |
| 1623 status.uw = 0; | |
| 1624 | |
| 1625 wait_chip_not_busy(); | |
| 1626 write_spi(0x50,RELEASE); // EWSR | |
| 1627 write_spi(0x01,HOLDCS); // WRSR | |
| 1628 write_spi(status.uw,RELEASE); // new status | |
| 1629 */ | |
| 1630 } | |
| 870 | 1631 #endif |
| 38 | 1632 |
| 1633 void ext_flash_disable_protection_for_logbook(void) | |
| 1634 { | |
| 1635 /* | |
| 1636 extFlashStatusBit8_Type status; | |
| 1637 | |
| 1638 status.uw = 0; | |
| 1639 status.ub.BlockProtect0 = 1; | |
| 1640 status.ub.BlockProtect1 = 0; | |
| 1641 status.ub.BlockProtect2 = 1; | |
| 1642 status.ub.BlockProtect3 = 0; // not set in OSTC3. Why? | |
| 1643 | |
| 1644 wait_chip_not_busy(); | |
| 1645 write_spi(0x50,RELEASE); // EWSR | |
| 1646 write_spi(0x01,HOLDCS); // WRSR | |
| 1647 write_spi(status.uw,RELEASE); // new status | |
| 1648 */ | |
| 1649 } | |
| 1650 | |
| 1651 | |
| 1652 void ext_flash_enable_protection(void) | |
| 1653 { | |
| 1654 /* | |
| 1655 extFlashStatusBit8_Type status; | |
| 1656 | |
| 1657 status.uw = 0; | |
| 1658 status.ub.BlockProtect0 = 1; | |
| 1659 status.ub.BlockProtect1 = 1; | |
| 1660 status.ub.BlockProtect2 = 1; | |
| 1661 status.ub.BlockProtect3 = 1; // not set in OSTC3. Why? | |
| 1662 | |
| 1663 wait_chip_not_busy(); | |
| 1664 write_spi(0x50,RELEASE); // EWSR | |
| 1665 write_spi(0x01,HOLDCS); // WRSR | |
| 1666 write_spi(status.uw,RELEASE); // new status | |
| 1667 */ | |
| 1668 } | |
| 1669 | |
| 1670 | |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
1671 /*void ext_flash_erase_chip(void) |
| 38 | 1672 { |
| 1673 wait_chip_not_busy(); | |
| 1674 write_spi(0x06,RELEASE); | |
| 1675 write_spi(0x60,RELEASE); | |
| 1676 wait_chip_not_busy(); | |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
1677 }*/ |
| 38 | 1678 |
| 1679 void ext_flash_erase_firmware(void) | |
| 1680 { | |
| 1681 uint32_t size, blocks_64k; | |
| 1682 | |
| 1683 actualAddress = FWSTART; | |
| 1684 size = 1 + FWSTOP - FWSTART; | |
| 1685 blocks_64k = size / 0x10000; | |
| 1686 ef_erase_64K(blocks_64k); | |
| 1687 } | |
| 1688 | |
| 1689 void ext_flash_erase_firmware2(void) | |
| 1690 { | |
| 1691 uint32_t size, blocks_64k; | |
| 1692 | |
| 1693 actualAddress = FWSTART2; | |
| 1694 size = 1 + FWSTOP2 - FWSTART2; | |
| 1695 blocks_64k = size / 0x10000; | |
| 1696 ef_erase_64K(blocks_64k); | |
| 1697 } | |
| 1698 | |
| 1699 | |
| 1700 | |
| 1701 void ext_flash_erase_logbook(void) | |
| 1702 { | |
| 1703 uint32_t size, blocks_64k; | |
| 1704 | |
| 1705 ext_flash_disable_protection_for_logbook(); | |
| 1706 | |
| 1707 actualAddress = SAMPLESTART; | |
| 1708 size = 1 + SAMPLESTOP - SAMPLESTART; | |
| 1709 blocks_64k = size / 0x10000; | |
| 1710 ef_erase_64K(blocks_64k); | |
| 1711 | |
| 1712 actualAddress = HEADERSTART; | |
| 1713 size = 1 + HEADERSTOP - HEADERSTART; | |
| 1714 blocks_64k = size / 0x10000; | |
| 1715 ef_erase_64K(blocks_64k); | |
| 1716 | |
| 1717 ext_flash_enable_protection(); | |
| 1718 } | |
| 1719 | |
| 1720 | |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
1721 static void ext_flash_erase4kB(void) |
| 38 | 1722 { |
| 1723 wait_chip_not_busy(); | |
| 1724 write_spi(0x06,RELEASE);/* WREN */ | |
| 1725 write_spi(0x20,HOLDCS);/* sector erase cmd */ | |
| 1726 write_address(RELEASE); | |
| 1727 } | |
| 1728 | |
| 282 | 1729 /* be careful - might not work with entire family and other products |
| 38 | 1730 * see page 14 of LOGBOOK_V3_S25FS-S_00-271247.pdf |
| 1731 */ | |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
1732 static void ext_flash_erase32kB(void) |
| 38 | 1733 { |
| 1734 uint32_t actualAddress_backup; | |
| 1735 | |
| 1736 actualAddress_backup = actualAddress; | |
| 1737 actualAddress = 0; | |
| 1738 wait_chip_not_busy(); | |
| 1739 write_spi(0x06,RELEASE);/* WREN */ | |
| 1740 write_spi(0xD8,HOLDCS);/* sector erase cmd */ | |
| 1741 write_address(RELEASE); | |
| 1742 actualAddress = actualAddress_backup; | |
| 1743 } | |
| 1744 | |
| 1745 | |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
1746 static void ext_flash_erase64kB(void) |
| 38 | 1747 { |
| 1748 wait_chip_not_busy(); | |
| 1749 write_spi(0x06,RELEASE);/* WREN */ | |
| 1750 write_spi(0xD8,HOLDCS);/* sector erase cmd */ | |
| 1751 write_address(RELEASE); | |
| 1752 } | |
| 1753 | |
| 1754 | |
| 1755 void ext_flash_read_block_start(void) | |
| 1756 { | |
| 1757 wait_chip_not_busy(); | |
| 1758 write_spi(0x03,HOLDCS); /* WREN */ | |
| 1759 write_address(HOLDCS); | |
| 1760 } | |
| 1761 | |
| 1762 /* 4KB, 32KB, 64 KB, not the upper 16 MB with 4 Byte address at the moment */ | |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
1763 static uint8_t ext_flash_erase_if_on_page_start(void) |
| 38 | 1764 { |
| 1765 if(actualAddress < 0x00008000) | |
| 1766 { | |
| 1767 /* 4K Byte is 0x1000 */ | |
| 1768 if((actualAddress & 0xFFF) == 0) | |
| 1769 { | |
| 1770 ext_flash_erase4kB(); | |
| 1771 return 1; | |
| 1772 } | |
|
423
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
1773 } |
| 38 | 1774 else |
| 1775 if(actualAddress < 0x00010000) | |
| 1776 { | |
| 1777 /* 32K Byte is only one page */ | |
| 1778 if(actualAddress == 0x00010000) | |
| 1779 { | |
| 1780 ext_flash_erase32kB(); | |
| 1781 return 1; | |
| 1782 } | |
|
423
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
1783 } |
| 38 | 1784 else |
| 1785 { | |
| 1786 /* 64K Byte is 0x10000 */ | |
| 1787 if((actualAddress & 0xFFFF) == 0) | |
| 1788 { | |
|
423
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
1789 if(preparedPageAddress == actualAddress) /* has page already been prepared before? (at the moment for samples only) */ |
|
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
1790 { |
|
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
1791 preparedPageAddress = 0; |
|
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
1792 |
|
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
1793 } |
|
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
1794 else |
|
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
1795 { |
|
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
1796 ext_flash_erase64kB(); |
|
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
1797 } |
| 38 | 1798 return 1; |
| 1799 } | |
|
423
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
1800 } |
|
a560afdaadbf
ext_Flash_write_sample erase sector optimization:
ideenmodellierer
parents:
421
diff
changeset
|
1801 |
| 38 | 1802 return 0; |
| 1803 } | |
| 1804 | |
| 1805 | |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
1806 static void ext_flash_read_block(uint8_t *getByte, uint8_t type) |
| 38 | 1807 { |
| 1808 *getByte = read_spi(HOLDCS);/* read data */ | |
| 1809 ext_flash_incf_address(type); | |
| 1810 } | |
| 1811 | |
| 1812 | |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
1813 static void ext_flash_read_block_multi(void *getByte, uint32_t size, uint8_t type) |
| 38 | 1814 { |
| 1815 uint8_t *data; | |
| 1816 data = getByte; | |
| 1817 | |
| 1818 for(uint32_t i=0;i<size;i++) | |
| 1819 { | |
| 1820 data[i] = read_spi(HOLDCS);/* read data */ | |
| 1821 ext_flash_incf_address(type); | |
| 1822 } | |
| 1823 } | |
| 1824 | |
| 1825 | |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
1826 static void ext_flash_read_block_stop(void) |
| 38 | 1827 { |
| 1828 chip_unselect(); | |
| 1829 } | |
| 1830 | |
| 1831 | |
| 1832 /* Private functions ---------------------------------------------------------*/ | |
| 1833 | |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
1834 static void ef_write_block(uint8_t * sendByte, uint32_t length, uint8_t type, uint8_t do_not_erase) |
| 38 | 1835 { |
| 1836 uint32_t remaining_page_size, remaining_length, remaining_space_to_ring_end; | |
| 420 | 1837 uint32_t i=0; |
| 1838 | |
| 38 | 1839 if(!length) |
| 1840 return; | |
| 1841 | |
| 1842 uint32_t ringStart, ringStop; | |
| 1843 | |
| 1844 switch(type) | |
| 1845 { | |
| 1846 case EF_HEADER: | |
| 1847 actualAddress = actualPointerHeader; | |
| 1848 ringStart = HEADERSTART; | |
| 1849 ringStop = HEADERSTOP; | |
| 1850 break; | |
| 1851 case EF_SAMPLE: | |
| 1852 actualAddress = actualPointerSample; | |
| 1853 ringStart = SAMPLESTART; | |
| 1854 ringStop = SAMPLESTOP; | |
| 1855 break; | |
| 1856 case EF_DEVICEDATA: | |
| 1857 actualAddress = actualPointerDevicedata; | |
| 1858 ringStart = DDSTART; | |
| 1859 ringStop = DDSTOP; | |
| 1860 break; | |
| 1861 case EF_VPMDATA: | |
| 1862 actualAddress = actualPointerVPM; | |
| 1863 ringStart = VPMSTART; | |
| 1864 ringStop = VPMSTOP; | |
| 1865 break; | |
| 1866 case EF_SETTINGS: | |
| 1867 actualAddress = actualPointerSettings; | |
| 1868 ringStart = SETTINGSSTART; | |
| 1869 ringStop = SETTINGSSTOP; | |
| 1870 break; | |
| 1871 case EF_FIRMWARE: | |
| 1872 actualAddress = actualPointerFirmware; | |
| 1873 ringStart = FWSTART; | |
| 1874 ringStop = FWSTOP; | |
| 1875 break; | |
| 1876 case EF_FIRMWARE2: | |
| 1877 actualAddress = actualPointerFirmware2; | |
| 1878 ringStart = FWSTART2; | |
| 1879 ringStop = FWSTOP2; | |
| 1880 break; | |
| 1027 | 1881 case EF_PROFILE0: |
| 1882 case EF_PROFILE1: | |
| 1883 case EF_PROFILE2: | |
| 1884 case EF_PROFILE3: actualAddress = actualPointerProfile; | |
| 1885 ringStart = PROFILE0_START; | |
| 1886 ringStop = PROFILE3_STOP; | |
| 1887 break; | |
| 38 | 1888 default: |
| 1889 ringStart = FLASHSTART; | |
| 1890 ringStop = FLASHSTOP; | |
| 1891 break; | |
| 1892 } | |
| 1893 /* safety */ | |
| 1894 if(actualAddress < ringStart) | |
| 1895 actualAddress = ringStart; | |
| 1896 | |
| 1897 if(do_not_erase == 0) | |
|
459
7ac0e76dbd6a
Activated reset of sample information within header data at time of sector erasing:
ideenmodellierer
parents:
452
diff
changeset
|
1898 { |
|
466
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
1899 ext_flash_erase_if_on_page_start(); |
|
459
7ac0e76dbd6a
Activated reset of sample information within header data at time of sector erasing:
ideenmodellierer
parents:
452
diff
changeset
|
1900 } |
| 38 | 1901 |
| 420 | 1902 while( i<length) |
| 38 | 1903 { |
| 1904 ef_hw_rough_delay_us(5); | |
| 1905 wait_chip_not_busy(); | |
| 1906 write_spi(0x06,RELEASE); /* WREN */ | |
| 1907 write_spi(0x02,HOLDCS); /* write cmd */ | |
| 1908 write_address(HOLDCS); | |
| 1909 | |
| 1910 remaining_length = length - i; | |
| 420 | 1911 remaining_page_size = 0xFF - (uint8_t)(actualAddress & 0xFF) +1; |
| 38 | 1912 remaining_space_to_ring_end = ringStop - actualAddress; |
| 1913 | |
| 420 | 1914 if(remaining_length >= 256) |
| 1915 { | |
| 1916 remaining_length = 255; /* up to 256 bytes may be written in one burst. Last byte is written with release */ | |
| 1917 } | |
| 1918 else | |
| 38 | 1919 { |
| 420 | 1920 remaining_length--; /* last byte needed for release */ |
| 1921 } | |
| 1922 if(remaining_length >= (remaining_page_size) ) /* use 256 byte page and calculate number of bytes left */ | |
| 1923 { | |
| 1924 remaining_length = remaining_page_size - 1; | |
| 1925 } | |
| 1926 if( (remaining_space_to_ring_end >= 256)) | |
| 1927 { | |
| 1928 for(int j=0; j<remaining_length; j++) | |
| 38 | 1929 { |
| 1930 write_spi(sendByte[i],HOLDCS);/* write data */ | |
| 1931 actualAddress++; | |
| 1932 i++; | |
| 1933 } | |
| 1934 } | |
| 1935 /* byte with RELEASE */ | |
| 1936 write_spi(sendByte[i],RELEASE);/* write data */ | |
| 1937 actualAddress++; | |
| 420 | 1938 i++; |
| 1939 | |
| 38 | 1940 if(actualAddress > ringStop) |
| 1941 actualAddress = ringStart; | |
| 420 | 1942 |
| 38 | 1943 if(do_not_erase == 0) |
| 1944 ext_flash_erase_if_on_page_start(); | |
| 1945 } | |
| 1946 switch(type) | |
| 1947 { | |
| 1948 case EF_HEADER: | |
| 1949 actualPointerHeader = actualAddress; | |
| 1950 break; | |
| 1951 case EF_SAMPLE: | |
| 1952 actualPointerSample = actualAddress; | |
| 1953 break; | |
| 1954 case EF_DEVICEDATA: | |
| 1955 actualPointerDevicedata = actualAddress; | |
| 1956 break; | |
| 1957 case EF_VPMDATA: | |
| 1958 actualPointerVPM = actualAddress; | |
| 1959 break; | |
| 1960 case EF_SETTINGS: | |
| 1961 actualPointerSettings = actualAddress; | |
| 1962 break; | |
| 1963 case EF_FIRMWARE: | |
| 1964 actualPointerFirmware = actualAddress; | |
| 1965 break; | |
| 1966 case EF_FIRMWARE2: | |
| 1967 actualPointerFirmware2 = actualAddress; | |
| 1968 break; | |
| 1027 | 1969 case EF_PROFILE0: |
| 1970 case EF_PROFILE1: | |
| 1971 case EF_PROFILE2: | |
| 1972 case EF_PROFILE3: actualPointerProfile = actualAddress; | |
| 1973 break; | |
| 38 | 1974 default: |
| 1975 break; | |
| 1976 } | |
| 1977 } | |
| 1978 | |
| 870 | 1979 #ifndef BOOTLOADER_STANDALONE |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
1980 static _Bool ext_flash_test_remaining_space_of_page_empty(uint32_t pointer, uint16_t length) |
| 38 | 1981 { |
| 1982 if((pointer & 0xFFF) == 0) | |
| 1983 return 1; | |
| 1984 | |
| 1985 uint32_t backup = actualAddress; | |
| 1986 uint8_t data; | |
| 1987 uint32_t size_to_page_end; | |
| 1988 | |
| 1989 size_to_page_end = 0x1000 - (pointer & 0xFFF); | |
| 1990 if(length > size_to_page_end) | |
| 1991 length = size_to_page_end; | |
| 1992 | |
| 1993 actualAddress = pointer; | |
| 1994 ext_flash_read_block_start(); | |
| 1995 | |
| 1996 for(uint16_t i = 0; i<length; i++) | |
| 1997 { | |
| 1998 ext_flash_read_block(&data, 255); // 255 = ENTIRE FLASH | |
| 1999 if(data != 0xFF) | |
| 2000 { | |
| 2001 ext_flash_read_block_stop(); | |
| 2002 actualAddress = backup; | |
| 2003 return 0; | |
| 2004 } | |
| 2005 } | |
| 2006 ext_flash_read_block_stop(); | |
| 2007 actualAddress = backup; | |
| 2008 return 1; | |
| 2009 } | |
| 2010 | |
| 2011 | |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
2012 static void ext_flash_set_to_begin_of_next_page(uint32_t *pointer, uint8_t type) |
| 38 | 2013 { |
| 2014 uint32_t ringStart, ringStop; | |
| 2015 | |
| 2016 switch(type) | |
| 2017 { | |
| 2018 case EF_HEADER: | |
| 2019 ringStart = HEADERSTART; | |
| 2020 ringStop = HEADERSTOP; | |
| 2021 break; | |
| 2022 case EF_SAMPLE: | |
| 2023 ringStart = SAMPLESTART; | |
| 2024 ringStop = SAMPLESTOP; | |
| 2025 break; | |
| 2026 case EF_DEVICEDATA: | |
| 2027 ringStart = DDSTART; | |
| 2028 ringStop = DDSTOP; | |
| 2029 break; | |
| 2030 case EF_VPMDATA: | |
| 2031 ringStart = VPMSTART; | |
| 2032 ringStop = VPMSTOP; | |
| 2033 break; | |
| 2034 case EF_SETTINGS: | |
| 2035 ringStart = SETTINGSSTART; | |
| 2036 ringStop = SETTINGSSTOP; | |
| 2037 break; | |
| 1027 | 2038 case EF_PROFILE0: |
| 2039 case EF_PROFILE1: | |
| 2040 case EF_PROFILE2: | |
| 2041 case EF_PROFILE3: ringStart = PROFILE0_START; | |
| 2042 ringStop = PROFILE3_STOP; | |
| 2043 break; | |
| 2044 | |
| 38 | 2045 default: |
| 2046 ringStart = FLASHSTART; | |
| 2047 ringStop = FLASHSTOP; | |
| 2048 break; | |
| 2049 } | |
| 2050 | |
| 2051 *pointer = (*pointer & 0xFFF) + 0x1000; | |
| 2052 | |
| 2053 if((*pointer < ringStart) || (*pointer >= ringStop)) | |
| 2054 *pointer = ringStart; | |
| 2055 } | |
| 870 | 2056 #endif |
| 38 | 2057 |
| 2058 static void ef_erase_64K(uint32_t blocks) | |
| 2059 { | |
| 2060 for(uint32_t i = 0; i < blocks; i++) | |
| 2061 { | |
| 2062 wait_chip_not_busy(); | |
| 2063 write_spi(0x06,RELEASE);/* WREN */ | |
| 2064 write_spi(0xD8,HOLDCS);/* 64k erase cmd */ | |
| 2065 write_address(RELEASE); | |
| 2066 actualAddress += 0x10000; | |
| 2067 HAL_Delay(25); | |
| 2068 } | |
| 2069 } | |
| 2070 | |
| 2071 | |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
2072 static void chip_unselect(void) |
| 38 | 2073 { |
| 2074 HAL_GPIO_WritePin(EXTFLASH_CSB_GPIO_PORT,EXTFLASH_CSB_PIN,GPIO_PIN_SET); // chip select | |
| 2075 } | |
| 2076 | |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
2077 static void chip_select(void) |
| 38 | 2078 { |
| 2079 HAL_GPIO_WritePin(EXTFLASH_CSB_GPIO_PORT,EXTFLASH_CSB_PIN,GPIO_PIN_RESET); // chip select | |
| 2080 } | |
| 870 | 2081 #ifndef BOOTLOADER_STANDALONE |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
2082 static void error_led_on(void) |
| 38 | 2083 { |
| 2084 HAL_GPIO_WritePin(OSCILLOSCOPE_GPIO_PORT,OSCILLOSCOPE_PIN,GPIO_PIN_SET); | |
| 2085 } | |
| 2086 | |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
2087 static void error_led_off(void) |
| 38 | 2088 { |
| 2089 HAL_GPIO_WritePin(OSCILLOSCOPE_GPIO_PORT,OSCILLOSCOPE_PIN,GPIO_PIN_RESET); | |
| 2090 } | |
| 870 | 2091 #endif |
| 38 | 2092 |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
2093 static uint8_t read_spi(uint8_t unselect_CS_afterwards) |
| 38 | 2094 { |
| 2095 uint8_t byte; | |
| 2096 | |
| 2097 chip_select(); | |
| 2098 | |
| 2099 if(HAL_SPI_Receive(&hspiDisplay, &byte, 1, 10000) != HAL_OK) | |
| 2100 Error_Handler_extflash(); | |
| 2101 | |
| 2102 while (HAL_SPI_GetState(&hspiDisplay) != HAL_SPI_STATE_READY) | |
| 2103 { | |
| 2104 } | |
| 2105 if(unselect_CS_afterwards) | |
| 2106 chip_unselect(); | |
| 2107 | |
| 2108 return byte; | |
| 2109 } | |
| 2110 | |
| 2111 | |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
2112 static void write_spi(uint8_t data, uint8_t unselect_CS_afterwards) |
| 38 | 2113 { |
| 2114 chip_select(); | |
| 2115 | |
| 2116 if(HAL_SPI_Transmit(&hspiDisplay, &data, 1, 10000) != HAL_OK) | |
| 2117 Error_Handler_extflash(); | |
| 2118 | |
| 2119 while (HAL_SPI_GetState(&hspiDisplay) != HAL_SPI_STATE_READY) | |
| 2120 { | |
| 2121 } | |
| 2122 if(unselect_CS_afterwards) | |
| 2123 chip_unselect(); | |
| 2124 } | |
| 2125 | |
| 2126 | |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
2127 static void write_address(uint8_t unselect_CS_afterwards) |
| 38 | 2128 { |
| 2129 uint8_t hi, med ,lo; | |
| 2130 | |
| 2131 hi = (actualAddress >> 16) & 0xFF; | |
| 2132 med = (actualAddress >> 8) & 0xFF; | |
| 2133 lo = actualAddress & 0xFF; | |
| 2134 | |
| 2135 write_spi(hi, HOLDCS); | |
| 2136 write_spi(med, HOLDCS); | |
| 2137 write_spi(lo, unselect_CS_afterwards); | |
| 2138 } | |
| 2139 | |
| 2140 | |
| 2141 static void wait_chip_not_busy(void) | |
| 2142 { | |
| 2143 uint8_t status; | |
| 2144 | |
| 2145 chip_unselect(); | |
| 2146 | |
| 2147 write_spi(0x05,HOLDCS); /* RDSR */ | |
| 2148 status = read_spi(HOLDCS);/* read status */ | |
| 2149 while(status & 0x01) | |
| 2150 { | |
| 2151 HAL_Delay(1); | |
| 2152 status = read_spi(HOLDCS);/* read status */ | |
| 2153 } | |
| 2154 chip_unselect(); | |
| 2155 } | |
| 2156 | |
| 2157 | |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
2158 static void ext_flash_incf_address(uint8_t type) |
| 38 | 2159 { |
| 2160 uint32_t ringStart, ringStop; | |
| 2161 | |
| 2162 actualAddress += 1; | |
| 2163 | |
| 2164 switch(type) | |
| 2165 { | |
| 2166 case EF_HEADER: | |
| 2167 ringStart = HEADERSTART; | |
| 2168 ringStop = HEADERSTOP; | |
| 2169 break; | |
| 2170 case EF_SAMPLE: | |
| 2171 ringStart = SAMPLESTART; | |
| 2172 ringStop = SAMPLESTOP; | |
| 2173 break; | |
| 2174 case EF_DEVICEDATA: | |
| 2175 ringStart = DDSTART; | |
| 2176 ringStop = DDSTOP; | |
| 2177 break; | |
| 2178 case EF_VPMDATA: | |
| 2179 ringStart = VPMSTART; | |
| 2180 ringStop = VPMSTOP; | |
| 2181 break; | |
| 2182 case EF_SETTINGS: | |
| 2183 ringStart = SETTINGSSTART; | |
| 2184 ringStop = SETTINGSSTOP; | |
| 2185 break; | |
| 2186 case EF_FIRMWARE: | |
| 2187 ringStart = FWSTART; | |
| 2188 ringStop = FWSTOP; | |
| 2189 break; | |
| 2190 case EF_FIRMWARE2: | |
| 2191 ringStart = FWSTART2; | |
| 2192 ringStop = FWSTOP2; | |
| 2193 break; | |
| 1027 | 2194 case EF_PROFILE0: |
| 2195 case EF_PROFILE1: | |
| 2196 case EF_PROFILE2: | |
| 2197 case EF_PROFILE3: ringStart = PROFILE0_START; | |
| 2198 ringStop = PROFILE3_STOP; | |
| 2199 break; | |
| 38 | 2200 default: |
| 2201 ringStart = FLASHSTART; | |
| 2202 ringStop = FLASHSTOP; | |
| 2203 break; | |
| 2204 } | |
| 2205 | |
| 2206 if((actualAddress < ringStart) || (actualAddress > ringStop)) | |
| 2207 actualAddress = ringStart; | |
| 2208 } | |
| 2209 | |
| 870 | 2210 #ifndef BOOTLOADER_STANDALONE |
|
268
1b9847d40e81
cleanup: make things static where possible.
Jan Mulder <jlmulder@xs4all.nl>
parents:
225
diff
changeset
|
2211 static void ext_flash_decf_address_ring(uint8_t type) |
| 38 | 2212 { |
| 2213 uint32_t ringStart, ringStop; | |
| 2214 | |
| 2215 switch(type) | |
| 2216 { | |
| 2217 case EF_HEADER: | |
| 2218 ringStart = HEADERSTART; | |
| 2219 ringStop = HEADERSTOP; | |
| 2220 break; | |
| 2221 case EF_SAMPLE: | |
| 2222 ringStart = SAMPLESTART; | |
| 2223 ringStop = SAMPLESTOP; | |
| 2224 break; | |
| 2225 case EF_DEVICEDATA: | |
| 2226 ringStart = DDSTART; | |
| 2227 ringStop = DDSTOP; | |
| 2228 break; | |
| 2229 case EF_VPMDATA: | |
| 2230 ringStart = VPMSTART; | |
| 2231 ringStop = VPMSTOP; | |
| 2232 break; | |
| 2233 case EF_SETTINGS: | |
| 2234 ringStart = SETTINGSSTART; | |
| 2235 ringStop = SETTINGSSTOP; | |
| 2236 break; | |
| 2237 case EF_FIRMWARE: | |
| 2238 ringStart = FWSTART; | |
| 2239 ringStop = FWSTOP; | |
| 2240 break; | |
| 2241 case EF_FIRMWARE2: | |
| 2242 ringStart = FWSTART2; | |
| 2243 ringStop = FWSTOP2; | |
| 2244 break; | |
| 1027 | 2245 case EF_PROFILE0: |
| 2246 case EF_PROFILE1: | |
| 2247 case EF_PROFILE2: | |
| 2248 case EF_PROFILE3: ringStart = PROFILE0_START; | |
| 2249 ringStop = PROFILE3_STOP; | |
| 2250 break; | |
| 2251 | |
| 38 | 2252 default: |
| 2253 ringStart = FLASHSTART; | |
| 2254 ringStop = FLASHSTOP; | |
| 2255 break; | |
| 2256 } | |
| 2257 | |
| 2258 if((actualAddress <= ringStart) || (actualAddress > ringStop)) | |
| 2259 actualAddress = ringStop; | |
| 2260 else | |
| 2261 actualAddress -= 1; | |
| 2262 } | |
| 870 | 2263 #endif |
| 38 | 2264 |
| 2265 static void ef_hw_rough_delay_us(uint32_t delayUs) | |
| 2266 { | |
| 2267 if(!delayUs) | |
| 2268 return; | |
| 2269 delayUs*= 12; | |
| 2270 while(delayUs--); | |
| 2271 return; | |
| 2272 } | |
| 2273 | |
| 2274 static void Error_Handler_extflash(void) | |
| 2275 { | |
| 2276 while(1) | |
| 2277 { | |
| 2278 } | |
| 2279 } | |
|
425
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2280 |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2281 void ext_flash_CloseSector(void) |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2282 { |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2283 uint32_t actualAddressBackup = actualAddress; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2284 int i=0; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2285 |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2286 if(closeSectorAddress != 0) |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2287 { |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2288 /* write some dummy bytes to the sector which is currently used for storing samples. This is done to "hide" problem if function is calles again */ |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2289 actualAddress = closeSectorAddress; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2290 |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2291 wait_chip_not_busy(); |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2292 write_spi(0x06,RELEASE); /* WREN */ |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2293 write_spi(0x02,HOLDCS); /* write cmd */ |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2294 write_address(HOLDCS); |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2295 for(i = 0; i<8; i++) |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2296 { |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2297 write_spi(0xA5,HOLDCS);/* write data */ |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2298 actualAddress++; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2299 } |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2300 /* byte with RELEASE */ |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2301 write_spi(0xA5,RELEASE);/* write data */ |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2302 actualAddress = actualAddressBackup; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2303 closeSectorAddress = 0; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2304 } |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2305 } |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2306 |
|
466
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2307 /* This function validates a potential jump of sample address by checking the last sector for empty memory cells */ |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2308 uint8_t ext_flash_SampleOverrunValid(void) |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2309 { |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2310 uint8_t jumpvalid = 1; |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2311 uint32_t curAddress, actualaddrbackup; |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2312 uint8_t tmpBuffer; |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2313 uint8_t emptyCellCnt = 0; |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2314 |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2315 actualaddrbackup = actualAddress; |
|
557
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
2316 curAddress = SAMPLESTOP - 20; /* check the last 20 bytes of the last sample sector */ |
|
466
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2317 actualAddress = curAddress; |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2318 ext_flash_read_block_start(); |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2319 while(actualAddress < SAMPLESTOP) |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2320 { |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2321 tmpBuffer = read_spi(HOLDCS);/* read data */ |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2322 if(tmpBuffer == 0xFF) |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2323 { |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2324 emptyCellCnt++; |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2325 } |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2326 actualAddress++; |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2327 } |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2328 ext_flash_read_block_stop(); |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2329 |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2330 if(emptyCellCnt == 20) |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2331 { |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2332 jumpvalid = 0; |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2333 } |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2334 actualAddress = actualaddrbackup; |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2335 return jumpvalid; |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2336 } |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2337 |
|
557
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
2338 uint32_t ext_flash_AnalyseSampleBuffer() |
|
425
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2339 { |
|
557
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
2340 uint8_t sectorState[192]; /* samples are stored in 192 sector / 64k each */ |
|
425
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2341 uint32_t curAddress = SAMPLESTART; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2342 uint8_t curSector = 0; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2343 uint8_t samplebuffer[10]; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2344 uint32_t actualAddressBackup = actualAddress; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2345 uint8_t emptyCellCnt = 0; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2346 uint32_t i = 0; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2347 uint8_t startedSectors = 0; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2348 uint8_t lastSectorInuse = 0; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2349 |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2350 /* check if a sector is used till its end */ |
|
557
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
2351 for(curSector = 0; curSector < 192; curSector++) |
|
425
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2352 { |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2353 sectorState[curSector] = 0; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2354 emptyCellCnt = 0; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2355 curAddress = SAMPLESTART + (curSector * 0x10000); /* set address to begin of sector and check if it is used */ |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2356 actualAddress = curAddress; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2357 ext_flash_read_block_start(); |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2358 for(uint32_t i=0;i<10;i++) |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2359 { |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2360 samplebuffer[i] = read_spi(HOLDCS);/* read data */ |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2361 if(samplebuffer[i] == 0xFF) |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2362 { |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2363 emptyCellCnt++; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2364 } |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2365 } |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2366 ext_flash_read_block_stop(); |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2367 if(emptyCellCnt == 10) |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2368 { |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2369 sectorState[curSector] = SECTOR_NOTUSED; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2370 } |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2371 emptyCellCnt = 0; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2372 curAddress = SAMPLESTART + (curSector * 0x10000) + 0xFFF5; /* set address to end of sector and check if it is used */ |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2373 actualAddress = curAddress; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2374 ext_flash_read_block_start(); |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2375 for(i=0;i<10;i++) |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2376 { |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2377 samplebuffer[i] = read_spi(HOLDCS);/* read data */ |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2378 if(samplebuffer[i] == 0xFF) |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2379 { |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2380 emptyCellCnt++; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2381 } |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2382 } |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2383 ext_flash_read_block_stop(); |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2384 if(emptyCellCnt == 10) |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2385 { |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2386 sectorState[curSector] |= SECTOR_INUSE; /* will become SECTOR_EMPTY if start is NOTUSED */ |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2387 } |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2388 } |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2389 |
|
557
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
2390 for(i=0;i<192;i++) |
|
425
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2391 { |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2392 if( sectorState[i] == SECTOR_INUSE) |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2393 { |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2394 startedSectors++; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2395 lastSectorInuse = i; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2396 } |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2397 } |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2398 |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2399 if(startedSectors > 1) /* more than one sector is in used => ring buffer corrupted */ |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2400 { |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2401 if(startedSectors == 2) /* only fix issue if only two sectors are in used. Otherwise fixing will cause more worries than help */ |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2402 { |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2403 /* the logic behind healing of the problem is that the larger address is the oldest one => restore the largest address */ |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2404 curAddress = SAMPLESTART + (lastSectorInuse * 0x10000); |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2405 emptyCellCnt = 0; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2406 actualAddress = curAddress; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2407 ext_flash_read_block_start(); |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2408 while((emptyCellCnt < 10) && (actualAddress < curAddress + 0x10000)) |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2409 { |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2410 samplebuffer[0] = read_spi(HOLDCS);/* read data */ |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2411 if(samplebuffer[0] == 0xFF) |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2412 { |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2413 emptyCellCnt++; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2414 } |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2415 else |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2416 { |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2417 emptyCellCnt = 0; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2418 } |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2419 actualAddress++; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2420 } |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2421 ext_flash_read_block_stop(); |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2422 actualAddress -= 10; /* step 10 bytes back to the start of free bytes */ |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2423 actualPointerSample = actualAddress; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2424 |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2425 closeSectorAddress = settingsGetPointer()->logFlashNextSampleStartAddress & 0xFFFF0000; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2426 closeSectorAddress += 0xFFF5; /* to be used once next time a dive is logged. Needed because NextSampleID is derived at every startup */ |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2427 settingsGetPointer()->logFlashNextSampleStartAddress = actualPointerSample; /* store new position to be used for next dive */ |
|
557
2702bfa7b177
Stabilityfix: Do not trust lastDiveLogID == 0 at startup:
Ideenmodellierer
parents:
538
diff
changeset
|
2428 ext_flash_CloseSector(); |
|
425
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2429 } |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2430 } |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2431 actualAddress = actualAddressBackup; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2432 return startedSectors; |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2433 } |
|
86fcac4cc43a
Added function to analyse the sampel ringbuffer:
ideenmodellierer
parents:
423
diff
changeset
|
2434 |
|
466
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2435 uint32_t ext_flash_read_profilelength_small_header(uint32_t smallHeaderAddr) |
|
452
b90ddf57f7f1
Added compile variant enabling the reset of profile sample information:
ideenmodellierer
parents:
429
diff
changeset
|
2436 { |
|
466
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2437 uint32_t profileLength = 0; |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2438 actualPointerSample = smallHeaderAddr; |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2439 actualAddress = actualPointerSample; |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2440 ext_flash_read_block_start(); |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2441 ext_flash_read_next_sample_part((uint8_t*)&profileLength, 3); |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2442 ext_flash_close_read_sample(); |
|
538eb1c976e9
Removed invalidate header function because it is no lonnger needed
ideenmodellierer
parents:
463
diff
changeset
|
2443 return profileLength; |
|
452
b90ddf57f7f1
Added compile variant enabling the reset of profile sample information:
ideenmodellierer
parents:
429
diff
changeset
|
2444 } |
|
b90ddf57f7f1
Added compile variant enabling the reset of profile sample information:
ideenmodellierer
parents:
429
diff
changeset
|
2445 |
|
b90ddf57f7f1
Added compile variant enabling the reset of profile sample information:
ideenmodellierer
parents:
429
diff
changeset
|
2446 |
| 870 | 2447 |
| 38 | 2448 uint8_t ext_flash_erase_firmware_if_not_empty(void) |
| 2449 { | |
| 2450 const uint8_t TESTSIZE_FW = 4; | |
| 2451 | |
| 2452 uint8_t data[TESTSIZE_FW]; | |
| 2453 uint8_t notEmpty = 0; | |
| 2454 | |
| 2455 actualAddress = FWSTART; | |
| 2456 ext_flash_read_block_start(); | |
| 2457 for(int i = 0; i < TESTSIZE_FW; i++) | |
| 2458 { | |
| 2459 ext_flash_read_block(&data[i], EF_FIRMWARE); | |
| 2460 if(data[i] != 0xFF) | |
| 2461 notEmpty = 1; | |
| 2462 } | |
| 2463 ext_flash_read_block_stop(); | |
| 2464 | |
| 2465 if(notEmpty) | |
| 2466 { | |
| 2467 ext_flash_erase_firmware(); | |
| 2468 return 1; | |
| 2469 } | |
| 2470 else | |
| 2471 return 0; | |
| 2472 } | |
| 2473 | |
| 2474 uint8_t ext_flash_erase_firmware2_if_not_empty(void) | |
| 2475 { | |
| 2476 const uint8_t TESTSIZE_FW = 4; | |
| 2477 | |
| 2478 uint8_t data[TESTSIZE_FW]; | |
| 2479 uint8_t notEmpty = 0; | |
| 2480 | |
| 2481 actualAddress = FWSTART2; | |
| 2482 ext_flash_read_block_start(); | |
| 2483 for(int i = 0; i < TESTSIZE_FW; i++) | |
| 2484 { | |
| 2485 ext_flash_read_block(&data[i], EF_FIRMWARE2); | |
| 2486 if(data[i] != 0xFF) | |
| 2487 notEmpty = 1; | |
| 2488 } | |
| 2489 ext_flash_read_block_stop(); | |
| 2490 | |
| 2491 if(notEmpty) | |
| 2492 { | |
| 2493 ext_flash_erase_firmware2(); | |
| 2494 return 1; | |
| 2495 } | |
| 2496 else | |
| 2497 return 0; | |
| 870 | 2498 } |
