Just4Trionic - CAN and BDM FLASH programmer for Saab cars

Dependencies:   mbed

Committer:
Just4pLeisure
Date:
Sat Apr 23 18:31:40 2016 +0000
Revision:
6:2fbcbebed28c
Parent:
5:1775b4b13232
Version 1.6 Faster T7 P-BUS FLASHing algorithm, longer T8 erase timeout fixed BDM register display function

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Just4pLeisure 1:d5452e398b76 1 /*******************************************************************************
Just4pLeisure 1:d5452e398b76 2
Just4pLeisure 1:d5452e398b76 3 bdmtrionic.cpp
Just4pLeisure 1:d5452e398b76 4 (c) 2010 by Sophie Dexter
Just4pLeisure 1:d5452e398b76 5
Just4pLeisure 1:d5452e398b76 6 General purpose BDM functions for Just4Trionic by Just4pLeisure
Just4pLeisure 1:d5452e398b76 7
Just4pLeisure 1:d5452e398b76 8 A derivative work based on:
Just4pLeisure 1:d5452e398b76 9 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 10 // CAN/BDM adapter firmware
Just4pLeisure 1:d5452e398b76 11 // (C) Janis Silins, 2010
Just4pLeisure 1:d5452e398b76 12 // $id$
Just4pLeisure 1:d5452e398b76 13 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 14
Just4pLeisure 1:d5452e398b76 15 ********************************************************************************
Just4pLeisure 1:d5452e398b76 16
Just4pLeisure 1:d5452e398b76 17 WARNING: Use at your own risk, sadly this software comes with no guarantees.
Just4pLeisure 1:d5452e398b76 18 This software is provided 'free' and in good faith, but the author does not
Just4pLeisure 1:d5452e398b76 19 accept liability for any damage arising from its use.
Just4pLeisure 1:d5452e398b76 20
Just4pLeisure 1:d5452e398b76 21 *******************************************************************************/
Just4pLeisure 1:d5452e398b76 22
Just4pLeisure 1:d5452e398b76 23 #include "bdmtrionic.h"
Just4pLeisure 1:d5452e398b76 24
Just4pLeisure 1:d5452e398b76 25 // structure for command address/value pairs
Just4pLeisure 1:d5452e398b76 26 struct mempair_t {
Just4pLeisure 1:d5452e398b76 27 uint32_t addr; ///< target address
Just4pLeisure 1:d5452e398b76 28 uint16_t val; ///< word value
Just4pLeisure 1:d5452e398b76 29 };
Just4pLeisure 1:d5452e398b76 30
Just4pLeisure 1:d5452e398b76 31 // word write algorithm (29Fxxx)
Just4pLeisure 1:d5452e398b76 32 static const struct mempair_t am29_write [] = {
Just4pLeisure 1:d5452e398b76 33 {0xaaaa, 0xaaaa}, {0x5554, 0x5555}, {0xaaaa, 0xa0a0},
Just4pLeisure 1:d5452e398b76 34 };
Just4pLeisure 1:d5452e398b76 35
Just4pLeisure 1:d5452e398b76 36 // chip erase algorithms
Just4pLeisure 1:d5452e398b76 37 static const struct mempair_t am29_erase [] = {
Just4pLeisure 1:d5452e398b76 38 {0xaaaa, 0xaaaa}, {0x5554, 0x5555}, {0xaaaa, 0x8080},
Just4pLeisure 1:d5452e398b76 39 {0xaaaa, 0xaaaa}, {0x5554, 0x5555}, {0xaaaa, 0x1010}
Just4pLeisure 1:d5452e398b76 40 };
Just4pLeisure 1:d5452e398b76 41
Just4pLeisure 1:d5452e398b76 42 // reset algorithms
Just4pLeisure 1:d5452e398b76 43 //static const struct mempair_t am29_reset = {0xfffe, 0xf0f0};
Just4pLeisure 1:d5452e398b76 44 static const struct mempair_t am29_reset [] = {
Just4pLeisure 1:d5452e398b76 45 {0xaaaa, 0xaaaa}, {0x5554, 0x5555}, {0xaaaa, 0xf0f0},
Just4pLeisure 1:d5452e398b76 46 };
Just4pLeisure 1:d5452e398b76 47
Just4pLeisure 1:d5452e398b76 48 // chip id algorithms
Just4pLeisure 1:d5452e398b76 49 static const struct mempair_t am29_id [] = {
Just4pLeisure 1:d5452e398b76 50 {0xaaaa, 0xaaaa}, {0x5554, 0x5555}, {0xaaaa, 0x9090},
Just4pLeisure 1:d5452e398b76 51 };
Just4pLeisure 1:d5452e398b76 52
Just4pLeisure 1:d5452e398b76 53 // ;-)
Just4pLeisure 1:d5452e398b76 54 static const struct mempair_t flash_tag [] = {
Just4pLeisure 1:d5452e398b76 55 {0x7fe00, 0xFF4A}, {0x7fe02, 0x7573}, {0x7fe04, 0x7434}, {0x7fe06, 0x704C},
Just4pLeisure 1:d5452e398b76 56 {0x7fe08, 0x6569}, {0x7fe0a, 0x7375}, {0x7fe0c, 0x7265}, {0x7fe0e, 0x3B29},
Just4pLeisure 1:d5452e398b76 57 };
Just4pLeisure 1:d5452e398b76 58
Just4pLeisure 1:d5452e398b76 59 // local functions
Just4pLeisure 1:d5452e398b76 60 bool reset_am29(void);
Just4pLeisure 1:d5452e398b76 61 bool erase_am29();
Just4pLeisure 1:d5452e398b76 62 bool flash_am29(const uint32_t* addr, uint16_t value);
Just4pLeisure 1:d5452e398b76 63 bool reset_am28(void);
Just4pLeisure 1:d5452e398b76 64 bool erase_am28(const uint32_t* start_addr, const uint32_t* end_addr);
Just4pLeisure 1:d5452e398b76 65 bool flash_am28(const uint32_t* addr, uint16_t value);
Just4pLeisure 1:d5452e398b76 66 bool get_flash_id(uint8_t* make, uint8_t* type);
Just4pLeisure 1:d5452e398b76 67
Just4pLeisure 5:1775b4b13232 68 bool run_bdm_driver(uint32_t addr, uint32_t maxtime);
Just4pLeisure 1:d5452e398b76 69
Just4pLeisure 1:d5452e398b76 70 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 71 /**
Just4pLeisure 1:d5452e398b76 72 Dumps contents of a memory block from [start_addr] up to, but not including,
Just4pLeisure 1:d5452e398b76 73 the [end_addr] as long words (word-aligned addresses). MCU must be in
Just4pLeisure 1:d5452e398b76 74 background mode. The operation interrupts if the break character is
Just4pLeisure 1:d5452e398b76 75 received.
Just4pLeisure 1:d5452e398b76 76
Just4pLeisure 1:d5452e398b76 77 @param start_addr block start address
Just4pLeisure 1:d5452e398b76 78 @param end_addr block end address
Just4pLeisure 1:d5452e398b76 79
Just4pLeisure 1:d5452e398b76 80 @return status flag
Just4pLeisure 1:d5452e398b76 81 */
Just4pLeisure 1:d5452e398b76 82
Just4pLeisure 1:d5452e398b76 83
Just4pLeisure 4:682d96ff6d79 84 uint8_t dump_flash(const uint32_t* start_addr, const uint32_t* end_addr)
Just4pLeisure 4:682d96ff6d79 85 {
Just4pLeisure 1:d5452e398b76 86
Just4pLeisure 1:d5452e398b76 87 // check parametres
Just4pLeisure 1:d5452e398b76 88 if (*start_addr > *end_addr) {
Just4pLeisure 1:d5452e398b76 89 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 90 }
Just4pLeisure 1:d5452e398b76 91
Just4pLeisure 1:d5452e398b76 92 // dump memory contents
Just4pLeisure 1:d5452e398b76 93 uint32_t curr_addr = *start_addr;
Just4pLeisure 1:d5452e398b76 94 uint32_t value;
Just4pLeisure 1:d5452e398b76 95
Just4pLeisure 1:d5452e398b76 96 while ((curr_addr < *end_addr) && (pc.getc() != TERM_BREAK)) {
Just4pLeisure 1:d5452e398b76 97 // read long word
Just4pLeisure 1:d5452e398b76 98 if (curr_addr > *start_addr) {
Just4pLeisure 1:d5452e398b76 99 if (memdump_long(&value) != TERM_OK) {
Just4pLeisure 1:d5452e398b76 100 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 101 }
Just4pLeisure 1:d5452e398b76 102 } else {
Just4pLeisure 1:d5452e398b76 103 if (memread_long(&value, &curr_addr) != TERM_OK) {
Just4pLeisure 1:d5452e398b76 104 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 105 }
Just4pLeisure 1:d5452e398b76 106 }
Just4pLeisure 1:d5452e398b76 107
Just4pLeisure 1:d5452e398b76 108 // send memory value to host
Just4pLeisure 1:d5452e398b76 109 printf("%08X", value);
Just4pLeisure 4:682d96ff6d79 110 printf("\r\n");
Just4pLeisure 1:d5452e398b76 111
Just4pLeisure 1:d5452e398b76 112 // add the terminating character
Just4pLeisure 1:d5452e398b76 113 if (curr_addr < *end_addr - 4) {
Just4pLeisure 1:d5452e398b76 114 pc.putc(TERM_OK);
Just4pLeisure 1:d5452e398b76 115 // light up the activity LED
Just4pLeisure 2:bf3a2b29259a 116 ACTIVITYLEDON;
Just4pLeisure 1:d5452e398b76 117 }
Just4pLeisure 1:d5452e398b76 118
Just4pLeisure 1:d5452e398b76 119 curr_addr += 4;
Just4pLeisure 1:d5452e398b76 120 }
Just4pLeisure 1:d5452e398b76 121
Just4pLeisure 1:d5452e398b76 122 return TERM_OK;
Just4pLeisure 1:d5452e398b76 123 }
Just4pLeisure 1:d5452e398b76 124
Just4pLeisure 1:d5452e398b76 125 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 126 /**
Just4pLeisure 1:d5452e398b76 127 Dumps the contents of a T5 ECU to a BIN file on the mbed 'disk'
Just4pLeisure 1:d5452e398b76 128 from [start_addr] up to, but not including, the [end_addr].
Just4pLeisure 1:d5452e398b76 129 MCU must be in background mode.
Just4pLeisure 1:d5452e398b76 130
Just4pLeisure 1:d5452e398b76 131 @param start_addr block start address
Just4pLeisure 1:d5452e398b76 132 @param end_addr block end address
Just4pLeisure 1:d5452e398b76 133
Just4pLeisure 1:d5452e398b76 134 @return status flag
Just4pLeisure 1:d5452e398b76 135 */
Just4pLeisure 1:d5452e398b76 136
Just4pLeisure 4:682d96ff6d79 137 uint8_t dump_trionic()
Just4pLeisure 4:682d96ff6d79 138 {
Just4pLeisure 1:d5452e398b76 139
Just4pLeisure 1:d5452e398b76 140 // Configure the MC68332 register values to prepare for flashing
Just4pLeisure 1:d5452e398b76 141 printf("I am trying to discover what type of Trionic ECU I am connected to...\r\n");
Just4pLeisure 1:d5452e398b76 142 prep_t5_do();
Just4pLeisure 1:d5452e398b76 143 // Work out what type of FLASH chips we want to make a dump file for
Just4pLeisure 1:d5452e398b76 144 uint8_t make;
Just4pLeisure 1:d5452e398b76 145 uint8_t type;
Just4pLeisure 1:d5452e398b76 146 get_flash_id(&make, &type);
Just4pLeisure 1:d5452e398b76 147 // set up chip-specific functions
Just4pLeisure 1:d5452e398b76 148 bool (*reset_func)();
Just4pLeisure 1:d5452e398b76 149 uint32_t flash_size;
Just4pLeisure 1:d5452e398b76 150
Just4pLeisure 1:d5452e398b76 151 switch (type) {
Just4pLeisure 4:682d96ff6d79 152 case AMD29BL802C:
Just4pLeisure 4:682d96ff6d79 153 printf("I have found AMD29BL802C type FLASH chips; I must be connected to a T8 ECU :-)\r\n");
Just4pLeisure 4:682d96ff6d79 154 reset_func = &reset_am29;
Just4pLeisure 4:682d96ff6d79 155 flash_size = T8FLASHSIZE;
Just4pLeisure 4:682d96ff6d79 156 break;
Just4pLeisure 1:d5452e398b76 157 case AMD29F400B:
Just4pLeisure 1:d5452e398b76 158 case AMD29F400T:
Just4pLeisure 1:d5452e398b76 159 printf("I have found AMD29F400 type FLASH chips; I must be connected to a T7 ECU :-)\r\n");
Just4pLeisure 1:d5452e398b76 160 reset_func = &reset_am29;
Just4pLeisure 1:d5452e398b76 161 flash_size = T7FLASHSIZE;
Just4pLeisure 1:d5452e398b76 162 break;
Just4pLeisure 1:d5452e398b76 163 case AMD29F010:
Just4pLeisure 5:1775b4b13232 164 case SST39SF010:
Just4pLeisure 5:1775b4b13232 165 case AMICA29010L:
Just4pLeisure 5:1775b4b13232 166 printf("I have found 29/39F010 type FLASH chips; I must be connected to a repaired T5.5 ECU :-)\r\n");
Just4pLeisure 5:1775b4b13232 167 reset_func = &reset_am29;
Just4pLeisure 5:1775b4b13232 168 flash_size = T55FLASHSIZE;
Just4pLeisure 5:1775b4b13232 169 break;
Just4pLeisure 5:1775b4b13232 170 case ATMEL29C010:
Just4pLeisure 5:1775b4b13232 171 printf("I have found Atmel 29C010 type FLASH chips; I must be connected to a repaired T5.5 ECU :-)\r\n");
Just4pLeisure 1:d5452e398b76 172 reset_func = &reset_am29;
Just4pLeisure 1:d5452e398b76 173 flash_size = T55FLASHSIZE;
Just4pLeisure 1:d5452e398b76 174 break;
Just4pLeisure 1:d5452e398b76 175 case AMD28F010:
Just4pLeisure 1:d5452e398b76 176 case INTEL28F010:
Just4pLeisure 1:d5452e398b76 177 printf("I have found 28F010 type FLASH chips; I must be connected to a T5.5 ECU :-)\r\n");
Just4pLeisure 1:d5452e398b76 178 reset_func = &reset_am28;
Just4pLeisure 1:d5452e398b76 179 flash_size = T55FLASHSIZE;
Just4pLeisure 1:d5452e398b76 180 break;
Just4pLeisure 1:d5452e398b76 181 case AMD28F512:
Just4pLeisure 1:d5452e398b76 182 case INTEL28F512:
Just4pLeisure 1:d5452e398b76 183 printf("I have found 28F512 type FLASH chips; I must be connected to a T5.2 ECU :-)\r\n");
Just4pLeisure 1:d5452e398b76 184 reset_func = &reset_am28;
Just4pLeisure 1:d5452e398b76 185 flash_size = T52FLASHSIZE;
Just4pLeisure 1:d5452e398b76 186 break;
Just4pLeisure 5:1775b4b13232 187 case ATMEL29C512:
Just4pLeisure 5:1775b4b13232 188 printf("I have found Atmel 29C512 type FLASH chips; I must be connected to a repaired T5.2 ECU :-)\r\n");
Just4pLeisure 5:1775b4b13232 189 reset_func = &reset_am28;
Just4pLeisure 5:1775b4b13232 190 flash_size = T52FLASHSIZE;
Just4pLeisure 5:1775b4b13232 191 break;
Just4pLeisure 1:d5452e398b76 192 default:
Just4pLeisure 1:d5452e398b76 193 // unknown flash type
Just4pLeisure 1:d5452e398b76 194 printf("I could not work out what FLASH chips or TRIONIC ECU I am connected to :-(\r\n");
Just4pLeisure 1:d5452e398b76 195 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 196 }
Just4pLeisure 1:d5452e398b76 197
Just4pLeisure 1:d5452e398b76 198 // reset the FLASH chips
Just4pLeisure 1:d5452e398b76 199 if (!reset_func()) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 200
Just4pLeisure 1:d5452e398b76 201 printf("Creating FLASH dump file...\r\n");
Just4pLeisure 1:d5452e398b76 202 FILE *fp = fopen("/local/original.bin", "w"); // Open "original.bin" on the local file system for writing
Just4pLeisure 1:d5452e398b76 203 if (!fp) {
Just4pLeisure 1:d5452e398b76 204 perror ("The following error occured");
Just4pLeisure 1:d5452e398b76 205 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 206 }
Just4pLeisure 1:d5452e398b76 207
Just4pLeisure 1:d5452e398b76 208 // dump memory contents
Just4pLeisure 1:d5452e398b76 209 uint32_t addr = 0x00;
Just4pLeisure 1:d5452e398b76 210 uint32_t long_value;
Just4pLeisure 1:d5452e398b76 211
Just4pLeisure 1:d5452e398b76 212 // setup start address to dump from
Just4pLeisure 1:d5452e398b76 213 if (memread_long_cmd(&addr) != TERM_OK) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 214
Just4pLeisure 1:d5452e398b76 215 timer.reset();
Just4pLeisure 1:d5452e398b76 216 timer.start();
Just4pLeisure 4:682d96ff6d79 217 printf(" 0.00 %% complete.\r");
Just4pLeisure 1:d5452e398b76 218 while (addr < flash_size) {
Just4pLeisure 1:d5452e398b76 219 uint16_t byte_count = 0;
Just4pLeisure 1:d5452e398b76 220 while (byte_count < FILE_BUF_LENGTH) {
Just4pLeisure 1:d5452e398b76 221 // get long word
Just4pLeisure 1:d5452e398b76 222 if (memget_long(&long_value) != TERM_OK) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 223 // send memory value to file_buffer before saving to mbed 'disk'
Just4pLeisure 5:1775b4b13232 224 file_buffer[byte_count++] = ((uint8_t)(long_value >> 24));
Just4pLeisure 5:1775b4b13232 225 file_buffer[byte_count++] = ((uint8_t)(long_value >> 16));
Just4pLeisure 5:1775b4b13232 226 file_buffer[byte_count++] = ((uint8_t)(long_value >> 8));
Just4pLeisure 5:1775b4b13232 227 file_buffer[byte_count++] = ((uint8_t)long_value);
Just4pLeisure 1:d5452e398b76 228 }
Just4pLeisure 1:d5452e398b76 229 fwrite(file_buffer, 1, FILE_BUF_LENGTH, fp);
Just4pLeisure 1:d5452e398b76 230 if (ferror (fp)) {
Just4pLeisure 1:d5452e398b76 231 fclose (fp);
Just4pLeisure 1:d5452e398b76 232 printf ("Error writing to the FLASH BIN file.\r\n");
Just4pLeisure 1:d5452e398b76 233 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 234 }
Just4pLeisure 4:682d96ff6d79 235 printf("%6.2f\r", 100*(float)addr/(float)flash_size );
Just4pLeisure 5:1775b4b13232 236 // make the activity led twinkle
Just4pLeisure 5:1775b4b13232 237 ACTIVITYLEDON;
Just4pLeisure 5:1775b4b13232 238 addr += FILE_BUF_LENGTH;
Just4pLeisure 1:d5452e398b76 239 }
Just4pLeisure 5:1775b4b13232 240 printf("100.00\r\n");
Just4pLeisure 1:d5452e398b76 241 // should 'clear' the BDM connection here but bdm_clear won't compile from here
Just4pLeisure 1:d5452e398b76 242 // instead do a memread (or anything really) but ignore the result because it's not needed for anything
Just4pLeisure 1:d5452e398b76 243 memread_long(&long_value, &addr);
Just4pLeisure 1:d5452e398b76 244 timer.stop();
Just4pLeisure 1:d5452e398b76 245 printf("Getting the FLASH dump took %#.1f seconds.\r\n",timer.read());
Just4pLeisure 1:d5452e398b76 246 fclose(fp);
Just4pLeisure 1:d5452e398b76 247 return TERM_OK;
Just4pLeisure 1:d5452e398b76 248 }
Just4pLeisure 1:d5452e398b76 249
Just4pLeisure 1:d5452e398b76 250 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 251 /**
Just4pLeisure 1:d5452e398b76 252 Erases the flash memory chip starting from [start_addr] up to, but not
Just4pLeisure 1:d5452e398b76 253 including [end_addr] and optionally verifies the result; MCU must be in
Just4pLeisure 1:d5452e398b76 254 background mode.
Just4pLeisure 1:d5452e398b76 255
Just4pLeisure 1:d5452e398b76 256 @param flash_type type of flash chip
Just4pLeisure 1:d5452e398b76 257 @param start_addr flash start address
Just4pLeisure 1:d5452e398b76 258 @param end_addr flash end address
Just4pLeisure 1:d5452e398b76 259
Just4pLeisure 1:d5452e398b76 260 @return status flag
Just4pLeisure 1:d5452e398b76 261 */
Just4pLeisure 1:d5452e398b76 262 uint8_t erase_flash(const char* flash_type, const uint32_t* start_addr,
Just4pLeisure 4:682d96ff6d79 263 const uint32_t* end_addr)
Just4pLeisure 4:682d96ff6d79 264 {
Just4pLeisure 1:d5452e398b76 265 // AM29Fxxx chips (retrofitted to Trionic 5.x; original to T7)
Just4pLeisure 1:d5452e398b76 266 if (strncmp(flash_type, "29f010", 6) == 0 ||
Just4pLeisure 1:d5452e398b76 267 strncmp(flash_type, "29f400", 6) == 0) {
Just4pLeisure 1:d5452e398b76 268 return erase_am29() ? TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 269 }
Just4pLeisure 1:d5452e398b76 270
Just4pLeisure 1:d5452e398b76 271 // AM28F010 chip (Trionic 5.x original)
Just4pLeisure 1:d5452e398b76 272 if (strncmp(flash_type, "28f010", 6) == 0) {
Just4pLeisure 1:d5452e398b76 273 return erase_am28(start_addr, end_addr) ? TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 274 }
Just4pLeisure 1:d5452e398b76 275
Just4pLeisure 1:d5452e398b76 276 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 277 }
Just4pLeisure 1:d5452e398b76 278
Just4pLeisure 1:d5452e398b76 279 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 280 /**
Just4pLeisure 1:d5452e398b76 281 Writes a batch of long words to the flash starting from [start_addr]. The
Just4pLeisure 1:d5452e398b76 282 operation interrupts if a break character is received. MCU must be in
Just4pLeisure 1:d5452e398b76 283 background mode.
Just4pLeisure 1:d5452e398b76 284
Just4pLeisure 1:d5452e398b76 285 @param flash_type type of flash chip
Just4pLeisure 1:d5452e398b76 286 @param start_addr block start address
Just4pLeisure 1:d5452e398b76 287
Just4pLeisure 1:d5452e398b76 288 @return status flag
Just4pLeisure 1:d5452e398b76 289 */
Just4pLeisure 4:682d96ff6d79 290 uint8_t write_flash(const char* flash_type, const uint32_t* start_addr)
Just4pLeisure 4:682d96ff6d79 291 {
Just4pLeisure 1:d5452e398b76 292 // set up chip-specific functions
Just4pLeisure 1:d5452e398b76 293 bool (*reset_func)(void);
Just4pLeisure 1:d5452e398b76 294 bool (*flash_func)(const uint32_t*, uint16_t);
Just4pLeisure 1:d5452e398b76 295
Just4pLeisure 1:d5452e398b76 296 // AM29Fxxx chips (retrofitted to Trionic 5.x, original to T7)
Just4pLeisure 1:d5452e398b76 297 if (strncmp(flash_type, "29f010", 6) == 0 ||
Just4pLeisure 1:d5452e398b76 298 strncmp(flash_type, "29f400", 6) == 0) {
Just4pLeisure 1:d5452e398b76 299 reset_func = &reset_am29;
Just4pLeisure 1:d5452e398b76 300 flash_func = &flash_am29;
Just4pLeisure 1:d5452e398b76 301 } else if (strncmp(flash_type, "28f010", 6) == 0) {
Just4pLeisure 1:d5452e398b76 302 // AM28F010 chip (Trionic 5.x original)
Just4pLeisure 1:d5452e398b76 303 reset_func = &reset_am28;
Just4pLeisure 1:d5452e398b76 304 flash_func = &flash_am28;
Just4pLeisure 1:d5452e398b76 305 } else {
Just4pLeisure 1:d5452e398b76 306 // unknown flash type
Just4pLeisure 1:d5452e398b76 307 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 308 }
Just4pLeisure 1:d5452e398b76 309
Just4pLeisure 1:d5452e398b76 310 // reset the flash
Just4pLeisure 1:d5452e398b76 311 if (!reset_func()) {
Just4pLeisure 1:d5452e398b76 312 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 313 }
Just4pLeisure 1:d5452e398b76 314
Just4pLeisure 1:d5452e398b76 315 uint32_t curr_addr = *start_addr;
Just4pLeisure 1:d5452e398b76 316 if (strncmp(flash_type, "29f010", 6) == 0) {
Just4pLeisure 1:d5452e398b76 317 curr_addr = 0;
Just4pLeisure 1:d5452e398b76 318 }
Just4pLeisure 1:d5452e398b76 319
Just4pLeisure 1:d5452e398b76 320 int rx_char = 0;
Just4pLeisure 1:d5452e398b76 321 char rx_buf[8];
Just4pLeisure 1:d5452e398b76 322 char* rx_ptr;
Just4pLeisure 1:d5452e398b76 323 uint32_t long_value;
Just4pLeisure 1:d5452e398b76 324 bool ret = true;
Just4pLeisure 1:d5452e398b76 325
Just4pLeisure 1:d5452e398b76 326 // ready to receive data
Just4pLeisure 1:d5452e398b76 327 pc.putc(TERM_OK);
Just4pLeisure 1:d5452e398b76 328
Just4pLeisure 1:d5452e398b76 329 while (true) {
Just4pLeisure 1:d5452e398b76 330 // receive long words from USB
Just4pLeisure 1:d5452e398b76 331 printf("receive long words from USB\r\n");
Just4pLeisure 1:d5452e398b76 332 rx_ptr = rx_buf;
Just4pLeisure 1:d5452e398b76 333 do {
Just4pLeisure 1:d5452e398b76 334 rx_char = pc.getc();
Just4pLeisure 1:d5452e398b76 335 if (rx_char != EOF) {
Just4pLeisure 1:d5452e398b76 336 // have got all characters for one long word
Just4pLeisure 1:d5452e398b76 337 if (rx_ptr > &rx_buf[7]) {
Just4pLeisure 1:d5452e398b76 338 ret = (rx_char == TERM_OK);
Just4pLeisure 1:d5452e398b76 339 break;
Just4pLeisure 1:d5452e398b76 340 }
Just4pLeisure 1:d5452e398b76 341
Just4pLeisure 1:d5452e398b76 342 // save the character
Just4pLeisure 1:d5452e398b76 343 *rx_ptr++ = (char)rx_char;
Just4pLeisure 1:d5452e398b76 344 }
Just4pLeisure 1:d5452e398b76 345 } while (rx_char != TERM_OK && rx_char != TERM_BREAK);
Just4pLeisure 1:d5452e398b76 346 // end writing
Just4pLeisure 1:d5452e398b76 347 printf("end writing\r\n");
Just4pLeisure 1:d5452e398b76 348 if (!ret || rx_char == TERM_BREAK) {
Just4pLeisure 1:d5452e398b76 349 break;
Just4pLeisure 1:d5452e398b76 350 }
Just4pLeisure 1:d5452e398b76 351
Just4pLeisure 1:d5452e398b76 352 // convert value to long word
Just4pLeisure 1:d5452e398b76 353 printf("convert value to long word\r\n");
Just4pLeisure 1:d5452e398b76 354 if (!ascii2int(&long_value, rx_buf, 8)) {
Just4pLeisure 1:d5452e398b76 355 ret = false;
Just4pLeisure 1:d5452e398b76 356 break;
Just4pLeisure 1:d5452e398b76 357 }
Just4pLeisure 1:d5452e398b76 358 printf("long value %08x \r\n", long_value);
Just4pLeisure 1:d5452e398b76 359
Just4pLeisure 1:d5452e398b76 360 // write the first word
Just4pLeisure 1:d5452e398b76 361 printf("write the first word\r\n");
Just4pLeisure 1:d5452e398b76 362 if (!flash_func(&curr_addr, (uint16_t)(long_value >> 16))) {
Just4pLeisure 1:d5452e398b76 363 ret = false;
Just4pLeisure 1:d5452e398b76 364 break;
Just4pLeisure 1:d5452e398b76 365 }
Just4pLeisure 1:d5452e398b76 366 curr_addr += 2;
Just4pLeisure 1:d5452e398b76 367 // write the second word
Just4pLeisure 1:d5452e398b76 368 printf("write the second word\r\n");
Just4pLeisure 1:d5452e398b76 369 if (!flash_func(&curr_addr, (uint16_t)long_value)) {
Just4pLeisure 1:d5452e398b76 370 ret = false;
Just4pLeisure 1:d5452e398b76 371 break;
Just4pLeisure 1:d5452e398b76 372 }
Just4pLeisure 1:d5452e398b76 373 curr_addr += 2;
Just4pLeisure 1:d5452e398b76 374
Just4pLeisure 1:d5452e398b76 375 // light up the activity LED
Just4pLeisure 4:682d96ff6d79 376 ACTIVITYLEDON;
Just4pLeisure 1:d5452e398b76 377 }
Just4pLeisure 1:d5452e398b76 378
Just4pLeisure 1:d5452e398b76 379 // reset flash
Just4pLeisure 1:d5452e398b76 380 return (reset_func() && ret) ? TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 381 }
Just4pLeisure 1:d5452e398b76 382
Just4pLeisure 1:d5452e398b76 383 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 384 /**
Just4pLeisure 1:d5452e398b76 385 Writes a BIN file to the flash starting from [start_addr].
Just4pLeisure 1:d5452e398b76 386 The operation ends when no more bytes can be read from the BIN file.
Just4pLeisure 1:d5452e398b76 387 MCU must be in background mode.
Just4pLeisure 1:d5452e398b76 388
Just4pLeisure 1:d5452e398b76 389 @param flash_type type of flash chip
Just4pLeisure 1:d5452e398b76 390 @param start_addr block start address
Just4pLeisure 1:d5452e398b76 391
Just4pLeisure 1:d5452e398b76 392 @return status flag
Just4pLeisure 1:d5452e398b76 393 */
Just4pLeisure 4:682d96ff6d79 394 uint8_t flash_trionic()
Just4pLeisure 4:682d96ff6d79 395 {
Just4pLeisure 1:d5452e398b76 396 // Configure the MC68332 register values to prepare for flashing
Just4pLeisure 1:d5452e398b76 397 printf("I am trying to discover what type of Trionic ECU I am connected to...\r\n");
Just4pLeisure 1:d5452e398b76 398 prep_t5_do();
Just4pLeisure 1:d5452e398b76 399 // Work out what type of FLASH chips we want to program
Just4pLeisure 1:d5452e398b76 400 uint8_t make;
Just4pLeisure 1:d5452e398b76 401 uint8_t type;
Just4pLeisure 1:d5452e398b76 402 get_flash_id(&make, &type);
Just4pLeisure 1:d5452e398b76 403 // set up chip-specific functions
Just4pLeisure 1:d5452e398b76 404 bool (*reset_func)();
Just4pLeisure 1:d5452e398b76 405 bool (*flash_func)(const uint32_t*, uint16_t);
Just4pLeisure 1:d5452e398b76 406 uint32_t flash_size;
Just4pLeisure 1:d5452e398b76 407
Just4pLeisure 1:d5452e398b76 408 switch (type) {
Just4pLeisure 4:682d96ff6d79 409 case AMD29BL802C:
Just4pLeisure 4:682d96ff6d79 410 printf("I have found AMD29BL802C type FLASH chips; I must be connected to a T8 ECU :-)\r\n");
Just4pLeisure 4:682d96ff6d79 411 reset_func = &reset_am29;
Just4pLeisure 4:682d96ff6d79 412 flash_func = &flash_am29;
Just4pLeisure 4:682d96ff6d79 413 flash_size = T8FLASHSIZE;
Just4pLeisure 4:682d96ff6d79 414 break;
Just4pLeisure 1:d5452e398b76 415 case AMD29F400B:
Just4pLeisure 1:d5452e398b76 416 case AMD29F400T:
Just4pLeisure 1:d5452e398b76 417 printf("I have found AMD29F400 type FLASH chips; I must be connected to a T7 ECU :-)\r\n");
Just4pLeisure 1:d5452e398b76 418 reset_func = &reset_am29;
Just4pLeisure 1:d5452e398b76 419 flash_func = &flash_am29;
Just4pLeisure 1:d5452e398b76 420 flash_size = T7FLASHSIZE;
Just4pLeisure 1:d5452e398b76 421 break;
Just4pLeisure 1:d5452e398b76 422 case AMD29F010:
Just4pLeisure 5:1775b4b13232 423 case SST39SF010:
Just4pLeisure 5:1775b4b13232 424 case AMICA29010L:
Just4pLeisure 5:1775b4b13232 425 printf("I have found 29/39F010 type FLASH chips; I must be connected to a repaired T5.5 ECU :-)\r\n");
Just4pLeisure 1:d5452e398b76 426 reset_func = &reset_am29;
Just4pLeisure 1:d5452e398b76 427 flash_func = &flash_am29;
Just4pLeisure 1:d5452e398b76 428 flash_size = T55FLASHSIZE;
Just4pLeisure 1:d5452e398b76 429 break;
Just4pLeisure 5:1775b4b13232 430 case ATMEL29C010:
Just4pLeisure 5:1775b4b13232 431 printf("I have found Atmel 29C010 type FLASH chips; I must be connected to a repaired T5.5 ECU :-)\r\n");
Just4pLeisure 5:1775b4b13232 432 reset_func = &reset_am29;
Just4pLeisure 5:1775b4b13232 433 flash_func = NULL;
Just4pLeisure 5:1775b4b13232 434 flash_size = T55FLASHSIZE;
Just4pLeisure 5:1775b4b13232 435 break;
Just4pLeisure 1:d5452e398b76 436 case AMD28F010:
Just4pLeisure 1:d5452e398b76 437 case INTEL28F010:
Just4pLeisure 1:d5452e398b76 438 printf("I have found 28F010 type FLASH chips; I must be connected to a T5.5 ECU :-)\r\n");
Just4pLeisure 1:d5452e398b76 439 reset_func = &reset_am28;
Just4pLeisure 1:d5452e398b76 440 flash_func = &flash_am28;
Just4pLeisure 1:d5452e398b76 441 flash_size = T55FLASHSIZE;
Just4pLeisure 1:d5452e398b76 442 break;
Just4pLeisure 1:d5452e398b76 443 case AMD28F512:
Just4pLeisure 1:d5452e398b76 444 case INTEL28F512:
Just4pLeisure 1:d5452e398b76 445 printf("I have found 28F512 type FLASH chips; I must be connected to a T5.2 ECU :-)\r\n");
Just4pLeisure 1:d5452e398b76 446 reset_func = &reset_am28;
Just4pLeisure 1:d5452e398b76 447 flash_func = &flash_am28;
Just4pLeisure 1:d5452e398b76 448 flash_size = T52FLASHSIZE;
Just4pLeisure 1:d5452e398b76 449 break;
Just4pLeisure 5:1775b4b13232 450 case ATMEL29C512:
Just4pLeisure 5:1775b4b13232 451 printf("I have found Atmel 29C512 type FLASH chips; I must be connected to a repaired T5.2 ECU :-)\r\n");
Just4pLeisure 5:1775b4b13232 452 reset_func = &reset_am29;
Just4pLeisure 5:1775b4b13232 453 flash_func = NULL;
Just4pLeisure 5:1775b4b13232 454 flash_size = T52FLASHSIZE;
Just4pLeisure 5:1775b4b13232 455 break;
Just4pLeisure 1:d5452e398b76 456 default:
Just4pLeisure 1:d5452e398b76 457 // unknown flash type
Just4pLeisure 1:d5452e398b76 458 printf("I could not work out what FLASH chips or TRIONIC ECU I am connected to :-(\r\n");
Just4pLeisure 1:d5452e398b76 459 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 460 }
Just4pLeisure 1:d5452e398b76 461 // reset the FLASH chips
Just4pLeisure 1:d5452e398b76 462 if (!reset_func()) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 463
Just4pLeisure 5:1775b4b13232 464
Just4pLeisure 1:d5452e398b76 465 printf("Checking the FLASH BIN file...\r\n");
Just4pLeisure 5:1775b4b13232 466 FILE *fp = fopen("/local/modified.bin", "r"); // Open "modified.bin" on the local file system for reading
Just4pLeisure 5:1775b4b13232 467 // FILE *fp = fopen("/local/original.bin", "r"); // Open "original.bin" on the local file system for reading
Just4pLeisure 1:d5452e398b76 468 if (!fp) {
Just4pLeisure 5:1775b4b13232 469 printf("Error: I could not find the BIN file MODIFIED.BIN\r\n");;
Just4pLeisure 1:d5452e398b76 470 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 471 }
Just4pLeisure 1:d5452e398b76 472 // obtain file size - it should match the size of the FLASH chips:
Just4pLeisure 1:d5452e398b76 473 fseek (fp , 0 , SEEK_END);
Just4pLeisure 1:d5452e398b76 474 uint32_t file_size = ftell (fp);
Just4pLeisure 1:d5452e398b76 475 rewind (fp);
Just4pLeisure 1:d5452e398b76 476
Just4pLeisure 1:d5452e398b76 477 // read the initial stack pointer value in the BIN file - it should match the value expected for the type of ECU
Just4pLeisure 5:1775b4b13232 478 uint8_t stack_bytes[4] = {0, 0, 0, 0};
Just4pLeisure 1:d5452e398b76 479 uint32_t stack_long = 0;
Just4pLeisure 5:1775b4b13232 480 if (!fread(&stack_bytes[0],1,4,fp)) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 481 rewind (fp);
Just4pLeisure 5:1775b4b13232 482 for(uint32_t i=0; i<4; i++) {
Just4pLeisure 5:1775b4b13232 483 (stack_long <<= 8) |= stack_bytes[i];
Just4pLeisure 5:1775b4b13232 484 }
Just4pLeisure 1:d5452e398b76 485
Just4pLeisure 1:d5452e398b76 486 if (flash_size == T52FLASHSIZE && (file_size != T52FLASHSIZE || stack_long != T5POINTER)) {
Just4pLeisure 1:d5452e398b76 487 fclose(fp);
Just4pLeisure 1:d5452e398b76 488 printf("The BIN file does not appear to be for a T5.2 ECU :-(\r\n");
Just4pLeisure 1:d5452e398b76 489 printf("BIN file size: %#10x, FLASH chip size: %#010x, Pointer: %#10x.\r\n", file_size, flash_size, stack_long);
Just4pLeisure 1:d5452e398b76 490 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 491 }
Just4pLeisure 1:d5452e398b76 492 if (flash_size == T55FLASHSIZE && (file_size != T55FLASHSIZE || stack_long != T5POINTER)) {
Just4pLeisure 1:d5452e398b76 493 fclose(fp);
Just4pLeisure 1:d5452e398b76 494 printf("The BIN file does not appear to be for a T5.5 ECU :-(\r\n");
Just4pLeisure 1:d5452e398b76 495 printf("BIN file size: %#10x, FLASH chip size: %#010x, Pointer: %#10x.\r\n", file_size, flash_size, stack_long);
Just4pLeisure 1:d5452e398b76 496 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 497 }
Just4pLeisure 1:d5452e398b76 498 if (flash_size == T7FLASHSIZE && (file_size != T7FLASHSIZE || stack_long != T7POINTER)) {
Just4pLeisure 1:d5452e398b76 499 fclose(fp);
Just4pLeisure 1:d5452e398b76 500 printf("The BIN file does not appear to be for a T7 ECU :-(\r\n");
Just4pLeisure 1:d5452e398b76 501 printf("BIN file size: %#10x, FLASH chip size: %#010x, Pointer: %#10x.\r\n", file_size, flash_size, stack_long);
Just4pLeisure 1:d5452e398b76 502 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 503 }
Just4pLeisure 4:682d96ff6d79 504 if (flash_size == T8FLASHSIZE && (file_size != T8FLASHSIZE || stack_long != T8POINTER)) {
Just4pLeisure 4:682d96ff6d79 505 fclose(fp);
Just4pLeisure 4:682d96ff6d79 506 printf("The BIN file does not appear to be for a T8 ECU :-(\r\n");
Just4pLeisure 4:682d96ff6d79 507 printf("BIN file size: %#10x, FLASH chip size: %#010x, Pointer: %#10x.\r\n", file_size, flash_size, stack_long);
Just4pLeisure 4:682d96ff6d79 508 return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 509 }
Just4pLeisure 1:d5452e398b76 510
Just4pLeisure 1:d5452e398b76 511 uint32_t curr_addr = 0;
Just4pLeisure 1:d5452e398b76 512
Just4pLeisure 1:d5452e398b76 513 switch (type) {
Just4pLeisure 4:682d96ff6d79 514 case AMD29BL802C:
Just4pLeisure 1:d5452e398b76 515 case AMD29F400T:
Just4pLeisure 1:d5452e398b76 516 case AMD29F010:
Just4pLeisure 5:1775b4b13232 517 case SST39SF010:
Just4pLeisure 5:1775b4b13232 518 case AMICA29010L:
Just4pLeisure 5:1775b4b13232 519 case ATMEL29C010:
Just4pLeisure 1:d5452e398b76 520 case AMD28F010:
Just4pLeisure 1:d5452e398b76 521 case INTEL28F010:
Just4pLeisure 1:d5452e398b76 522 case AMD28F512:
Just4pLeisure 1:d5452e398b76 523 case INTEL28F512:
Just4pLeisure 5:1775b4b13232 524 case ATMEL29C512: {
Just4pLeisure 5:1775b4b13232 525 // BDM FLASH Driver
Just4pLeisure 5:1775b4b13232 526 /*
Just4pLeisure 5:1775b4b13232 527 uint8_t flashDriver5[] = {\
Just4pLeisure 5:1775b4b13232 528 0x60,0x00,0x04,0x08,\
Just4pLeisure 5:1775b4b13232 529 0x7C,0x2F,0x2D,0x5C,0x2A,0x0D,0x00,0x00,\
Just4pLeisure 5:1775b4b13232 530 0x02,0x03,0x00,0x03,0x41,0xFA,0xFF,0xF6,\
Just4pLeisure 5:1775b4b13232 531 0x10,0xBB,0x30,0xEE,0x70,0x01,0x52,0x43,\
Just4pLeisure 5:1775b4b13232 532 0x4E,0x75,\
Just4pLeisure 5:1775b4b13232 533 0x20,0x7C,0x00,0xFF,0xFA,0x00,0x08,0x10,\
Just4pLeisure 5:1775b4b13232 534 0x00,0x04,0x66,0x4E,0xD0,0xFC,0x00,0x04,\
Just4pLeisure 5:1775b4b13232 535 0x10,0xFC,0x00,0x7F,0x08,0x10,0x00,0x03,\
Just4pLeisure 5:1775b4b13232 536 0x67,0xFA,0xD0,0xFC,0x00,0x1C,0x42,0x10,\
Just4pLeisure 5:1775b4b13232 537 0xD0,0xFC,0x00,0x23,0x30,0xBC,0x3F,0xFF,\
Just4pLeisure 5:1775b4b13232 538 0xD0,0xFC,0x00,0x04,0x70,0x07,0x30,0xC0,\
Just4pLeisure 5:1775b4b13232 539 0x30,0xBC,0x68,0x70,0xD0,0xFC,0x00,0x06,\
Just4pLeisure 5:1775b4b13232 540 0x30,0xC0,0x30,0xFC,0x30,0x30,0x30,0xC0,\
Just4pLeisure 5:1775b4b13232 541 0x30,0xBC,0x50,0x30,0xD0,0xFC,0x01,0xBE,\
Just4pLeisure 5:1775b4b13232 542 0x70,0x40,0x30,0xC0,0x30,0x80,0x30,0x3C,\
Just4pLeisure 5:1775b4b13232 543 0x55,0xF0,0x4E,0x71,0x51,0xC8,0xFF,0xFC,\
Just4pLeisure 5:1775b4b13232 544 0x60,0x18,0xD0,0xFC,0x00,0x08,0x30,0xFC,\
Just4pLeisure 5:1775b4b13232 545 0x69,0x08,0x08,0x10,0x00,0x09,0x67,0xFA,\
Just4pLeisure 5:1775b4b13232 546 0x31,0x3C,0x68,0x08,0xD0,0xFC,0x00,0x48,\
Just4pLeisure 5:1775b4b13232 547 0x42,0x50,0x4E,0x75,\
Just4pLeisure 5:1775b4b13232 548 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
Just4pLeisure 5:1775b4b13232 549 0x00,0x00,0x2C,0x3C,0x00,0x00,0x55,0x55,\
Just4pLeisure 5:1775b4b13232 550 0x2E,0x3C,0x00,0x00,0xAA,0xAA,0x2A,0x46,\
Just4pLeisure 5:1775b4b13232 551 0x53,0x8D,0x2C,0x47,0x45,0xF8,0x00,0x00,\
Just4pLeisure 5:1775b4b13232 552 0x47,0xFA,0xFF,0xDE,0x3C,0x87,0x3A,0x86,\
Just4pLeisure 5:1775b4b13232 553 0x3C,0xBC,0x90,0x90,0x36,0xDA,0x36,0x92,\
Just4pLeisure 5:1775b4b13232 554 0x3C,0x87,0x3A,0x86,0x3C,0xBC,0xF0,0xF0,\
Just4pLeisure 5:1775b4b13232 555 0x20,0x3A,0xFF,0xC6,0x72,0x02,0x48,0x41,\
Just4pLeisure 5:1775b4b13232 556 0x74,0x01,0x0C,0x00,0x00,0x25,0x67,0x50,\
Just4pLeisure 5:1775b4b13232 557 0x0C,0x00,0x00,0xB8,0x67,0x4A,0x74,0x04,\
Just4pLeisure 5:1775b4b13232 558 0x0C,0x00,0x00,0x5D,0x67,0x42,0x74,0x01,\
Just4pLeisure 5:1775b4b13232 559 0xE3,0x99,0x0C,0x00,0x00,0xA7,0x67,0x38,\
Just4pLeisure 5:1775b4b13232 560 0x0C,0x00,0x00,0xB4,0x67,0x32,0x74,0x02,\
Just4pLeisure 5:1775b4b13232 561 0x0C,0x00,0x00,0x20,0x67,0x2A,0x0C,0x00,\
Just4pLeisure 5:1775b4b13232 562 0x00,0xA4,0x67,0x24,0x0C,0x00,0x00,0xB5,\
Just4pLeisure 5:1775b4b13232 563 0x67,0x1E,0x74,0x04,0x0C,0x00,0x00,0xD5,\
Just4pLeisure 5:1775b4b13232 564 0x67,0x16,0x74,0x03,0xE3,0x99,0x0C,0x00,\
Just4pLeisure 5:1775b4b13232 565 0x00,0x23,0x67,0x0C,0xE3,0x99,0x0C,0x00,\
Just4pLeisure 5:1775b4b13232 566 0x00,0x81,0x67,0x04,0x72,0x00,0x74,0x00,\
Just4pLeisure 5:1775b4b13232 567 0x47,0xFA,0xFF,0x6A,0x26,0x81,0x47,0xFA,\
Just4pLeisure 5:1775b4b13232 568 0xFF,0x68,0x16,0x82,0x4E,0x75,\
Just4pLeisure 5:1775b4b13232 569 0x45,0x72,0x61,0x73,0x69,0x6E,0x67,0x20,\
Just4pLeisure 5:1775b4b13232 570 0x46,0x4C,0x41,0x53,0x48,0x20,0x63,0x68,\
Just4pLeisure 5:1775b4b13232 571 0x69,0x70,0x73,0x0D,0x0A,0x00,0x41,0xFA,\
Just4pLeisure 5:1775b4b13232 572 0xFF,0xE8,0x70,0x01,0x12,0x3A,0xFF,0x44,\
Just4pLeisure 5:1775b4b13232 573 0x53,0x01,0x67,0x16,0x53,0x01,0x67,0x00,\
Just4pLeisure 5:1775b4b13232 574 0x00,0xB8,0x53,0x01,0x67,0x00,0x01,0x0A,\
Just4pLeisure 5:1775b4b13232 575 0x53,0x01,0x67,0x00,0x01,0x3A,0x60,0x00,\
Just4pLeisure 5:1775b4b13232 576 0x01,0x3A,0x4B,0xF8,0x00,0x00,0x24,0x3A,\
Just4pLeisure 5:1775b4b13232 577 0xFF,0x1E,0x26,0x02,0x3A,0xBC,0xFF,0xFF,\
Just4pLeisure 5:1775b4b13232 578 0x3A,0xBC,0xFF,0xFF,0x42,0x55,0x4A,0x35,\
Just4pLeisure 5:1775b4b13232 579 0x28,0xFF,0x67,0x28,0x7A,0x19,0x1B,0xBC,\
Just4pLeisure 5:1775b4b13232 580 0x00,0x40,0x28,0xFF,0x42,0x35,0x28,0xFF,\
Just4pLeisure 5:1775b4b13232 581 0x72,0x15,0x4E,0x71,0x51,0xC9,0xFF,0xFC,\
Just4pLeisure 5:1775b4b13232 582 0x1B,0xBC,0x00,0xC0,0x28,0xFF,0x72,0x0C,\
Just4pLeisure 5:1775b4b13232 583 0x4E,0x71,0x51,0xC9,0xFF,0xFC,0x4A,0x35,\
Just4pLeisure 5:1775b4b13232 584 0x28,0xFF,0x66,0x06,0x53,0x82,0x66,0xCC,\
Just4pLeisure 5:1775b4b13232 585 0x60,0x04,0x53,0x45,0x66,0xD0,0x42,0x55,\
Just4pLeisure 5:1775b4b13232 586 0x4A,0x55,0x4A,0x05,0x67,0x00,0x00,0xE4,\
Just4pLeisure 5:1775b4b13232 587 0x24,0x03,0x50,0xC4,0x2A,0x3C,0x03,0xE8,\
Just4pLeisure 5:1775b4b13232 588 0x03,0xE8,0x72,0x20,0x1B,0x81,0x28,0xFF,\
Just4pLeisure 5:1775b4b13232 589 0x1B,0x81,0x28,0xFF,0x32,0x3C,0x55,0xF0,\
Just4pLeisure 5:1775b4b13232 590 0x4E,0x71,0x51,0xC9,0xFF,0xFC,0x4E,0xBA,\
Just4pLeisure 5:1775b4b13232 591 0xFE,0x24,0x1B,0xBC,0x00,0xA0,0x28,0xFF,\
Just4pLeisure 5:1775b4b13232 592 0x72,0x0C,0x4E,0x71,0x51,0xC9,0xFF,0xFC,\
Just4pLeisure 5:1775b4b13232 593 0xB8,0x35,0x28,0xFF,0x66,0x08,0x48,0x45,\
Just4pLeisure 5:1775b4b13232 594 0x53,0x82,0x66,0xE6,0x60,0x04,0x53,0x45,\
Just4pLeisure 5:1775b4b13232 595 0x66,0xC8,0x42,0x55,0x4A,0x55,0x4A,0x45,\
Just4pLeisure 5:1775b4b13232 596 0x67,0x00,0x00,0x98,0x60,0x00,0x00,0x90,\
Just4pLeisure 5:1775b4b13232 597 0x70,0x01,0x42,0x83,0x1D,0x87,0x08,0x00,\
Just4pLeisure 5:1775b4b13232 598 0x1B,0x86,0x08,0x00,0x1D,0xBC,0x00,0x80,\
Just4pLeisure 5:1775b4b13232 599 0x08,0x00,0x1D,0x87,0x08,0x00,0x1B,0x86,\
Just4pLeisure 5:1775b4b13232 600 0x08,0x00,0x1D,0xBC,0x00,0x10,0x08,0x00,\
Just4pLeisure 5:1775b4b13232 601 0x2A,0x00,0x4E,0xBA,0xFD,0xD0,0x20,0x05,\
Just4pLeisure 5:1775b4b13232 602 0x1A,0x30,0x09,0x90,0x08,0x05,0x00,0x07,\
Just4pLeisure 5:1775b4b13232 603 0x66,0x20,0x08,0x05,0x00,0x05,0x67,0xE8,\
Just4pLeisure 5:1775b4b13232 604 0x1A,0x30,0x09,0x90,0x08,0x05,0x00,0x07,\
Just4pLeisure 5:1775b4b13232 605 0x66,0x10,0x1D,0x87,0x08,0x00,0x1B,0x86,\
Just4pLeisure 5:1775b4b13232 606 0x08,0x00,0x1D,0xBC,0x00,0xF0,0x08,0x00,\
Just4pLeisure 5:1775b4b13232 607 0x60,0x40,0x53,0x80,0x67,0xAE,0x60,0x36,\
Just4pLeisure 5:1775b4b13232 608 0x42,0x83,0x3C,0x87,0x3A,0x86,0x3C,0xBC,\
Just4pLeisure 5:1775b4b13232 609 0x00,0x80,0x3C,0x87,0x3A,0x86,0x3C,0xBC,\
Just4pLeisure 5:1775b4b13232 610 0x00,0x10,0x4E,0xBA,0xFD,0x88,0x3A,0x15,\
Just4pLeisure 5:1775b4b13232 611 0x08,0x05,0x00,0x07,0x66,0x18,0x08,0x05,\
Just4pLeisure 5:1775b4b13232 612 0x00,0x05,0x67,0xEE,0x3A,0x15,0x08,0x05,\
Just4pLeisure 5:1775b4b13232 613 0x00,0x07,0x66,0x0A,0x3C,0x87,0x3A,0x86,\
Just4pLeisure 5:1775b4b13232 614 0x3C,0xBC,0x00,0xF0,0x60,0x04,0x42,0x80,\
Just4pLeisure 5:1775b4b13232 615 0x60,0x02,0x70,0x01,0x4E,0x75,\
Just4pLeisure 5:1775b4b13232 616 0x47,0xFB,0x01,0x70,0x00,0x00,0x04,0x50,\
Just4pLeisure 5:1775b4b13232 617 0x28,0x49,0x24,0x3C,0x00,0x00,0x01,0x00,\
Just4pLeisure 5:1775b4b13232 618 0x12,0x3A,0xFD,0xDA,0x53,0x01,0x67,0x14,\
Just4pLeisure 5:1775b4b13232 619 0x53,0x01,0x67,0x5A,0x53,0x01,0x67,0x00,\
Just4pLeisure 5:1775b4b13232 620 0x00,0xBC,0x53,0x01,0x67,0x00,0x01,0x00,\
Just4pLeisure 5:1775b4b13232 621 0x60,0x00,0x01,0x2E,0x10,0x33,0x28,0xFF,\
Just4pLeisure 5:1775b4b13232 622 0x0C,0x00,0x00,0xFF,0x67,0x28,0x7A,0x19,\
Just4pLeisure 5:1775b4b13232 623 0x19,0xBC,0x00,0x40,0x28,0xFF,0x19,0x80,\
Just4pLeisure 5:1775b4b13232 624 0x28,0xFF,0x72,0x15,0x4E,0x71,0x51,0xC9,\
Just4pLeisure 5:1775b4b13232 625 0xFF,0xFC,0x19,0xBC,0x00,0xC0,0x28,0xFF,\
Just4pLeisure 5:1775b4b13232 626 0x72,0x0C,0x4E,0x71,0x51,0xC9,0xFF,0xFC,\
Just4pLeisure 5:1775b4b13232 627 0xB0,0x34,0x28,0xFF,0x66,0x06,0x53,0x82,\
Just4pLeisure 5:1775b4b13232 628 0x66,0xCA,0x60,0x04,0x53,0x05,0x66,0xD0,\
Just4pLeisure 5:1775b4b13232 629 0x42,0x55,0x4A,0x55,0x4A,0x05,0x67,0x00,\
Just4pLeisure 5:1775b4b13232 630 0x00,0xE8,0x60,0x00,0x00,0xE0,0x20,0x0C,\
Just4pLeisure 5:1775b4b13232 631 0xD0,0x82,0xC0,0xBC,0x00,0x00,0x00,0x01,\
Just4pLeisure 5:1775b4b13232 632 0x08,0x40,0x00,0x00,0x16,0x33,0x28,0xFF,\
Just4pLeisure 5:1775b4b13232 633 0x0C,0x03,0x00,0xFF,0x67,0x48,0x1D,0x87,\
Just4pLeisure 5:1775b4b13232 634 0x08,0x00,0x1B,0x86,0x08,0x00,0x1D,0xBC,\
Just4pLeisure 5:1775b4b13232 635 0x00,0xA0,0x08,0x00,0x19,0x83,0x28,0xFF,\
Just4pLeisure 5:1775b4b13232 636 0xC6,0x3C,0x00,0x80,0x18,0x34,0x28,0xFF,\
Just4pLeisure 5:1775b4b13232 637 0x1A,0x04,0xC8,0x3C,0x00,0x80,0xB8,0x03,\
Just4pLeisure 5:1775b4b13232 638 0x67,0x24,0x08,0x05,0x00,0x05,0x67,0xEC,\
Just4pLeisure 5:1775b4b13232 639 0x18,0x34,0x28,0xFF,0xC8,0x3C,0x00,0x80,\
Just4pLeisure 5:1775b4b13232 640 0xB8,0x03,0x67,0x12,0x1D,0x87,0x08,0x00,\
Just4pLeisure 5:1775b4b13232 641 0x1B,0x86,0x08,0x00,0x1D,0xBC,0x00,0xF0,\
Just4pLeisure 5:1775b4b13232 642 0x08,0x00,0x60,0x00,0x00,0x84,0x53,0x82,\
Just4pLeisure 5:1775b4b13232 643 0x66,0xA6,0x60,0x78,0x36,0x33,0x28,0xFE,\
Just4pLeisure 5:1775b4b13232 644 0x0C,0x43,0xFF,0xFF,0x67,0x3A,0x3C,0x87,\
Just4pLeisure 5:1775b4b13232 645 0x3A,0x86,0x3C,0xBC,0x00,0xA0,0x39,0x83,\
Just4pLeisure 5:1775b4b13232 646 0x28,0xFE,0xC6,0x7C,0x00,0x80,0x38,0x34,\
Just4pLeisure 5:1775b4b13232 647 0x28,0xFE,0x3A,0x04,0xC8,0x7C,0x00,0x80,\
Just4pLeisure 5:1775b4b13232 648 0xB8,0x43,0x67,0x1C,0x08,0x05,0x00,0x05,\
Just4pLeisure 5:1775b4b13232 649 0x67,0xEC,0x38,0x34,0x28,0xFE,0xC8,0x7C,\
Just4pLeisure 5:1775b4b13232 650 0x00,0x80,0xB8,0x43,0x67,0x0A,0x3C,0x87,\
Just4pLeisure 5:1775b4b13232 651 0x3A,0x86,0x3C,0xBC,0x00,0xF0,0x60,0x38,\
Just4pLeisure 5:1775b4b13232 652 0x55,0x82,0x66,0xB8,0x60,0x2E,0x3C,0x87,\
Just4pLeisure 5:1775b4b13232 653 0x3A,0x86,0x3C,0xBC,0xA0,0xA0,0x39,0xB3,\
Just4pLeisure 5:1775b4b13232 654 0x28,0xFE,0x28,0xFE,0x55,0x82,0x66,0xF6,\
Just4pLeisure 5:1775b4b13232 655 0x32,0x3C,0x55,0xF0,0x4E,0x71,0x51,0xC9,\
Just4pLeisure 5:1775b4b13232 656 0xFF,0xFC,0x34,0x3C,0x01,0x00,0x36,0x33,\
Just4pLeisure 5:1775b4b13232 657 0x28,0xFE,0xB6,0x74,0x28,0xFE,0x66,0x08,\
Just4pLeisure 5:1775b4b13232 658 0x55,0x82,0x66,0xF2,0x42,0x80,0x60,0x02,\
Just4pLeisure 5:1775b4b13232 659 0x70,0x01,0x4E,0x75,\
Just4pLeisure 5:1775b4b13232 660 0x4F,0xFB,0x01,0x70,0x00,0x00,0x02,0xF4,\
Just4pLeisure 5:1775b4b13232 661 0x4E,0xBA,0xFC,0x0A,0x4E,0xBA,0xFC,0x84,\
Just4pLeisure 5:1775b4b13232 662 0x4E,0xBA,0xFD,0x32,0x4A,0xFA,0x42,0x80,\
Just4pLeisure 5:1775b4b13232 663 0x22,0x40,0x4E,0xBA,0xFE,0x88,0x4A,0xFA,\
Just4pLeisure 5:1775b4b13232 664 0xD2,0xFC,0x01,0x00,0x60,0xF4
Just4pLeisure 5:1775b4b13232 665 };
Just4pLeisure 1:d5452e398b76 666
Just4pLeisure 5:1775b4b13232 667 uint8_t flashDriver6[] = {\
Just4pLeisure 5:1775b4b13232 668 0x60,0x00,0x04,0x0A,\
Just4pLeisure 5:1775b4b13232 669 0x7C,0x2F,0x2D,0x5C,0x2A,0x0D,0x00,0x00,\
Just4pLeisure 5:1775b4b13232 670 0x02,0x03,0x00,0x03,0x41,0xFA,0xFF,0xF6,\
Just4pLeisure 5:1775b4b13232 671 0x10,0xBB,0x30,0xEE,0x70,0x01,0x4A,0xFA,\
Just4pLeisure 5:1775b4b13232 672 0x52,0x43,0x4E,0x75,\
Just4pLeisure 5:1775b4b13232 673 0x20,0x7C,0x00,0xFF,0xFA,0x00,0x08,0x10,\
Just4pLeisure 5:1775b4b13232 674 0x00,0x04,0x66,0x4E,0xD0,0xFC,0x00,0x04,\
Just4pLeisure 5:1775b4b13232 675 0x10,0xFC,0x00,0x7F,0x08,0x10,0x00,0x03,\
Just4pLeisure 5:1775b4b13232 676 0x67,0xFA,0xD0,0xFC,0x00,0x1C,0x42,0x10,\
Just4pLeisure 5:1775b4b13232 677 0xD0,0xFC,0x00,0x23,0x30,0xBC,0x3F,0xFF,\
Just4pLeisure 5:1775b4b13232 678 0xD0,0xFC,0x00,0x04,0x70,0x07,0x30,0xC0,\
Just4pLeisure 5:1775b4b13232 679 0x30,0xBC,0x68,0x70,0xD0,0xFC,0x00,0x06,\
Just4pLeisure 5:1775b4b13232 680 0x30,0xC0,0x30,0xFC,0x30,0x30,0x30,0xC0,\
Just4pLeisure 5:1775b4b13232 681 0x30,0xBC,0x50,0x30,0xD0,0xFC,0x01,0xBE,\
Just4pLeisure 5:1775b4b13232 682 0x70,0x40,0x30,0xC0,0x30,0x80,0x30,0x3C,\
Just4pLeisure 5:1775b4b13232 683 0x55,0xF0,0x4E,0x71,0x51,0xC8,0xFF,0xFC,\
Just4pLeisure 5:1775b4b13232 684 0x60,0x18,0xD0,0xFC,0x00,0x08,0x30,0xFC,\
Just4pLeisure 5:1775b4b13232 685 0x69,0x08,0x08,0x10,0x00,0x09,0x67,0xFA,\
Just4pLeisure 5:1775b4b13232 686 0x31,0x3C,0x68,0x08,0xD0,0xFC,0x00,0x48,\
Just4pLeisure 5:1775b4b13232 687 0x42,0x50,0x4E,0x75,\
Just4pLeisure 5:1775b4b13232 688 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
Just4pLeisure 5:1775b4b13232 689 0x00,0x00,0x2C,0x3C,0x00,0x00,0x55,0x55,\
Just4pLeisure 5:1775b4b13232 690 0x2E,0x3C,0x00,0x00,0xAA,0xAA,0x2A,0x46,\
Just4pLeisure 5:1775b4b13232 691 0x53,0x8D,0x2C,0x47,0x45,0xF8,0x00,0x00,\
Just4pLeisure 5:1775b4b13232 692 0x47,0xFA,0xFF,0xDE,0x3C,0x87,0x3A,0x86,\
Just4pLeisure 5:1775b4b13232 693 0x3C,0xBC,0x90,0x90,0x36,0xDA,0x36,0x92,\
Just4pLeisure 5:1775b4b13232 694 0x3C,0x87,0x3A,0x86,0x3C,0xBC,0xF0,0xF0,\
Just4pLeisure 5:1775b4b13232 695 0x20,0x3A,0xFF,0xC6,0x72,0x02,0x48,0x41,\
Just4pLeisure 5:1775b4b13232 696 0x74,0x01,0x0C,0x00,0x00,0x25,0x67,0x50,\
Just4pLeisure 5:1775b4b13232 697 0x0C,0x00,0x00,0xB8,0x67,0x4A,0x74,0x04,\
Just4pLeisure 5:1775b4b13232 698 0x0C,0x00,0x00,0x5D,0x67,0x42,0x74,0x01,\
Just4pLeisure 5:1775b4b13232 699 0xE3,0x99,0x0C,0x00,0x00,0xA7,0x67,0x38,\
Just4pLeisure 5:1775b4b13232 700 0x0C,0x00,0x00,0xB4,0x67,0x32,0x74,0x02,\
Just4pLeisure 5:1775b4b13232 701 0x0C,0x00,0x00,0x20,0x67,0x2A,0x0C,0x00,\
Just4pLeisure 5:1775b4b13232 702 0x00,0xA4,0x67,0x24,0x0C,0x00,0x00,0xB5,\
Just4pLeisure 5:1775b4b13232 703 0x67,0x1E,0x74,0x04,0x0C,0x00,0x00,0xD5,\
Just4pLeisure 5:1775b4b13232 704 0x67,0x16,0x74,0x03,0xE3,0x99,0x0C,0x00,\
Just4pLeisure 5:1775b4b13232 705 0x00,0x23,0x67,0x0C,0xE3,0x99,0x0C,0x00,\
Just4pLeisure 5:1775b4b13232 706 0x00,0x81,0x67,0x04,0x72,0x00,0x74,0x00,\
Just4pLeisure 5:1775b4b13232 707 0x47,0xFA,0xFF,0x6A,0x26,0x81,0x47,0xFA,\
Just4pLeisure 5:1775b4b13232 708 0xFF,0x68,0x16,0x82,0x4E,0x75,\
Just4pLeisure 5:1775b4b13232 709 0x45,0x72,0x61,0x73,0x69,0x6E,0x67,0x20,\
Just4pLeisure 5:1775b4b13232 710 0x46,0x4C,0x41,0x53,0x48,0x20,0x63,0x68,\
Just4pLeisure 5:1775b4b13232 711 0x69,0x70,0x73,0x0D,0x0A,0x00,0x41,0xFA,\
Just4pLeisure 5:1775b4b13232 712 0xFF,0xE8,0x70,0x01,0x12,0x3A,0xFF,0x44,\
Just4pLeisure 5:1775b4b13232 713 0x53,0x01,0x67,0x16,0x53,0x01,0x67,0x00,\
Just4pLeisure 5:1775b4b13232 714 0x00,0xB8,0x53,0x01,0x67,0x00,0x01,0x0A,\
Just4pLeisure 5:1775b4b13232 715 0x53,0x01,0x67,0x00,0x01,0x3A,0x60,0x00,\
Just4pLeisure 5:1775b4b13232 716 0x01,0x3A,0x4B,0xF8,0x00,0x00,0x24,0x3A,\
Just4pLeisure 5:1775b4b13232 717 0xFF,0x1E,0x26,0x02,0x3A,0xBC,0xFF,0xFF,\
Just4pLeisure 5:1775b4b13232 718 0x3A,0xBC,0xFF,0xFF,0x42,0x55,0x4A,0x35,\
Just4pLeisure 5:1775b4b13232 719 0x28,0xFF,0x67,0x28,0x7A,0x19,0x1B,0xBC,\
Just4pLeisure 5:1775b4b13232 720 0x00,0x40,0x28,0xFF,0x42,0x35,0x28,0xFF,\
Just4pLeisure 5:1775b4b13232 721 0x72,0x15,0x4E,0x71,0x51,0xC9,0xFF,0xFC,\
Just4pLeisure 5:1775b4b13232 722 0x1B,0xBC,0x00,0xC0,0x28,0xFF,0x72,0x0C,\
Just4pLeisure 5:1775b4b13232 723 0x4E,0x71,0x51,0xC9,0xFF,0xFC,0x4A,0x35,\
Just4pLeisure 5:1775b4b13232 724 0x28,0xFF,0x66,0x06,0x53,0x82,0x66,0xCC,\
Just4pLeisure 5:1775b4b13232 725 0x60,0x04,0x53,0x45,0x66,0xD0,0x42,0x55,\
Just4pLeisure 5:1775b4b13232 726 0x4A,0x55,0x4A,0x05,0x67,0x00,0x00,0xE4,\
Just4pLeisure 5:1775b4b13232 727 0x24,0x03,0x50,0xC4,0x2A,0x3C,0x03,0xE8,\
Just4pLeisure 5:1775b4b13232 728 0x03,0xE8,0x72,0x20,0x1B,0x81,0x28,0xFF,\
Just4pLeisure 5:1775b4b13232 729 0x1B,0x81,0x28,0xFF,0x32,0x3C,0x55,0xF0,\
Just4pLeisure 5:1775b4b13232 730 0x4E,0x71,0x51,0xC9,0xFF,0xFC,0x4E,0xBA,\
Just4pLeisure 5:1775b4b13232 731 0xFE,0x22,0x1B,0xBC,0x00,0xA0,0x28,0xFF,\
Just4pLeisure 5:1775b4b13232 732 0x72,0x0C,0x4E,0x71,0x51,0xC9,0xFF,0xFC,\
Just4pLeisure 5:1775b4b13232 733 0xB8,0x35,0x28,0xFF,0x66,0x08,0x48,0x45,\
Just4pLeisure 5:1775b4b13232 734 0x53,0x82,0x66,0xE6,0x60,0x04,0x53,0x45,\
Just4pLeisure 5:1775b4b13232 735 0x66,0xC8,0x42,0x55,0x4A,0x55,0x4A,0x45,\
Just4pLeisure 5:1775b4b13232 736 0x67,0x00,0x00,0x98,0x60,0x00,0x00,0x90,\
Just4pLeisure 5:1775b4b13232 737 0x70,0x01,0x42,0x83,0x1D,0x87,0x08,0x00,\
Just4pLeisure 5:1775b4b13232 738 0x1B,0x86,0x08,0x00,0x1D,0xBC,0x00,0x80,\
Just4pLeisure 5:1775b4b13232 739 0x08,0x00,0x1D,0x87,0x08,0x00,0x1B,0x86,\
Just4pLeisure 5:1775b4b13232 740 0x08,0x00,0x1D,0xBC,0x00,0x10,0x08,0x00,\
Just4pLeisure 5:1775b4b13232 741 0x2A,0x00,0x4E,0xBA,0xFD,0xCE,0x20,0x05,\
Just4pLeisure 5:1775b4b13232 742 0x1A,0x30,0x09,0x90,0x08,0x05,0x00,0x07,\
Just4pLeisure 5:1775b4b13232 743 0x66,0x20,0x08,0x05,0x00,0x05,0x67,0xE8,\
Just4pLeisure 5:1775b4b13232 744 0x1A,0x30,0x09,0x90,0x08,0x05,0x00,0x07,\
Just4pLeisure 5:1775b4b13232 745 0x66,0x10,0x1D,0x87,0x08,0x00,0x1B,0x86,\
Just4pLeisure 5:1775b4b13232 746 0x08,0x00,0x1D,0xBC,0x00,0xF0,0x08,0x00,\
Just4pLeisure 5:1775b4b13232 747 0x60,0x40,0x53,0x80,0x67,0xAE,0x60,0x36,\
Just4pLeisure 5:1775b4b13232 748 0x42,0x83,0x3C,0x87,0x3A,0x86,0x3C,0xBC,\
Just4pLeisure 5:1775b4b13232 749 0x00,0x80,0x3C,0x87,0x3A,0x86,0x3C,0xBC,\
Just4pLeisure 5:1775b4b13232 750 0x00,0x10,0x4E,0xBA,0xFD,0x86,0x3A,0x15,\
Just4pLeisure 5:1775b4b13232 751 0x08,0x05,0x00,0x07,0x66,0x18,0x08,0x05,\
Just4pLeisure 5:1775b4b13232 752 0x00,0x05,0x67,0xEE,0x3A,0x15,0x08,0x05,\
Just4pLeisure 5:1775b4b13232 753 0x00,0x07,0x66,0x0A,0x3C,0x87,0x3A,0x86,\
Just4pLeisure 5:1775b4b13232 754 0x3C,0xBC,0x00,0xF0,0x60,0x04,0x42,0x80,\
Just4pLeisure 5:1775b4b13232 755 0x60,0x02,0x70,0x01,0x4E,0x75,\
Just4pLeisure 5:1775b4b13232 756 0x47,0xFB,0x01,0x70,0x00,0x00,0x04,0x4E,\
Just4pLeisure 5:1775b4b13232 757 0x28,0x49,0x24,0x3C,0x00,0x00,0x01,0x00,\
Just4pLeisure 5:1775b4b13232 758 0x12,0x3A,0xFD,0xDA,0x53,0x01,0x67,0x14,\
Just4pLeisure 5:1775b4b13232 759 0x53,0x01,0x67,0x5A,0x53,0x01,0x67,0x00,\
Just4pLeisure 5:1775b4b13232 760 0x00,0xBC,0x53,0x01,0x67,0x00,0x01,0x00,\
Just4pLeisure 5:1775b4b13232 761 0x60,0x00,0x01,0x2E,0x10,0x33,0x28,0xFF,\
Just4pLeisure 5:1775b4b13232 762 0x0C,0x00,0x00,0xFF,0x67,0x28,0x7A,0x19,\
Just4pLeisure 5:1775b4b13232 763 0x19,0xBC,0x00,0x40,0x28,0xFF,0x19,0x80,\
Just4pLeisure 5:1775b4b13232 764 0x28,0xFF,0x72,0x15,0x4E,0x71,0x51,0xC9,\
Just4pLeisure 5:1775b4b13232 765 0xFF,0xFC,0x19,0xBC,0x00,0xC0,0x28,0xFF,\
Just4pLeisure 5:1775b4b13232 766 0x72,0x0C,0x4E,0x71,0x51,0xC9,0xFF,0xFC,\
Just4pLeisure 5:1775b4b13232 767 0xB0,0x34,0x28,0xFF,0x66,0x06,0x53,0x82,\
Just4pLeisure 5:1775b4b13232 768 0x66,0xCA,0x60,0x04,0x53,0x05,0x66,0xD0,\
Just4pLeisure 5:1775b4b13232 769 0x42,0x55,0x4A,0x55,0x4A,0x05,0x67,0x00,\
Just4pLeisure 5:1775b4b13232 770 0x00,0xE8,0x60,0x00,0x00,0xE0,0x20,0x0C,\
Just4pLeisure 5:1775b4b13232 771 0xD0,0x82,0xC0,0xBC,0x00,0x00,0x00,0x01,\
Just4pLeisure 5:1775b4b13232 772 0x08,0x40,0x00,0x00,0x16,0x33,0x28,0xFF,\
Just4pLeisure 5:1775b4b13232 773 0x0C,0x03,0x00,0xFF,0x67,0x48,0x1D,0x87,\
Just4pLeisure 5:1775b4b13232 774 0x08,0x00,0x1B,0x86,0x08,0x00,0x1D,0xBC,\
Just4pLeisure 5:1775b4b13232 775 0x00,0xA0,0x08,0x00,0x19,0x83,0x28,0xFF,\
Just4pLeisure 5:1775b4b13232 776 0xC6,0x3C,0x00,0x80,0x18,0x34,0x28,0xFF,\
Just4pLeisure 5:1775b4b13232 777 0x1A,0x04,0xC8,0x3C,0x00,0x80,0xB8,0x03,\
Just4pLeisure 5:1775b4b13232 778 0x67,0x24,0x08,0x05,0x00,0x05,0x67,0xEC,\
Just4pLeisure 5:1775b4b13232 779 0x18,0x34,0x28,0xFF,0xC8,0x3C,0x00,0x80,\
Just4pLeisure 5:1775b4b13232 780 0xB8,0x03,0x67,0x12,0x1D,0x87,0x08,0x00,\
Just4pLeisure 5:1775b4b13232 781 0x1B,0x86,0x08,0x00,0x1D,0xBC,0x00,0xF0,\
Just4pLeisure 5:1775b4b13232 782 0x08,0x00,0x60,0x00,0x00,0x84,0x53,0x82,\
Just4pLeisure 5:1775b4b13232 783 0x66,0xA6,0x60,0x78,0x36,0x33,0x28,0xFE,\
Just4pLeisure 5:1775b4b13232 784 0x0C,0x43,0xFF,0xFF,0x67,0x3A,0x3C,0x87,\
Just4pLeisure 5:1775b4b13232 785 0x3A,0x86,0x3C,0xBC,0x00,0xA0,0x39,0x83,\
Just4pLeisure 5:1775b4b13232 786 0x28,0xFE,0xC6,0x7C,0x00,0x80,0x38,0x34,\
Just4pLeisure 5:1775b4b13232 787 0x28,0xFE,0x3A,0x04,0xC8,0x7C,0x00,0x80,\
Just4pLeisure 5:1775b4b13232 788 0xB8,0x43,0x67,0x1C,0x08,0x05,0x00,0x05,\
Just4pLeisure 5:1775b4b13232 789 0x67,0xEC,0x38,0x34,0x28,0xFE,0xC8,0x7C,\
Just4pLeisure 5:1775b4b13232 790 0x00,0x80,0xB8,0x43,0x67,0x0A,0x3C,0x87,\
Just4pLeisure 5:1775b4b13232 791 0x3A,0x86,0x3C,0xBC,0x00,0xF0,0x60,0x38,\
Just4pLeisure 5:1775b4b13232 792 0x55,0x82,0x66,0xB8,0x60,0x2E,0x3C,0x87,\
Just4pLeisure 5:1775b4b13232 793 0x3A,0x86,0x3C,0xBC,0xA0,0xA0,0x39,0xB3,\
Just4pLeisure 5:1775b4b13232 794 0x28,0xFE,0x28,0xFE,0x55,0x82,0x66,0xF6,\
Just4pLeisure 5:1775b4b13232 795 0x32,0x3C,0x55,0xF0,0x4E,0x71,0x51,0xC9,\
Just4pLeisure 5:1775b4b13232 796 0xFF,0xFC,0x34,0x3C,0x01,0x00,0x36,0x33,\
Just4pLeisure 5:1775b4b13232 797 0x28,0xFE,0xB6,0x74,0x28,0xFE,0x66,0x08,\
Just4pLeisure 5:1775b4b13232 798 0x55,0x82,0x66,0xF2,0x42,0x80,0x60,0x02,\
Just4pLeisure 5:1775b4b13232 799 0x70,0x01,0x4E,0x75,\
Just4pLeisure 5:1775b4b13232 800 0x4F,0xFB,0x01,0x70,0x00,0x00,0x02,0xF2,\
Just4pLeisure 5:1775b4b13232 801 0x4E,0xBA,0xFC,0x0A,0x4E,0xBA,0xFC,0x84,\
Just4pLeisure 5:1775b4b13232 802 0x4E,0xBA,0xFD,0x32,0x4A,0xFA,0x42,0x80,\
Just4pLeisure 5:1775b4b13232 803 0x22,0x40,0x4E,0xBA,0xFE,0x88,0x4A,0xFA,\
Just4pLeisure 5:1775b4b13232 804 0xD2,0xFC,0x01,0x00,0x60,0xF4,0x00,0x00
Just4pLeisure 5:1775b4b13232 805 };
Just4pLeisure 5:1775b4b13232 806 */
Just4pLeisure 5:1775b4b13232 807 uint8_t flashDriver[] = {\
Just4pLeisure 5:1775b4b13232 808 0x60,0x00,0x04,0x0C,\
Just4pLeisure 5:1775b4b13232 809 0x7C,0x2F,0x2D,0x5C,0x2A,0x0D,0x00,0x00,\
Just4pLeisure 5:1775b4b13232 810 0x02,0x03,0x00,0x03,0x41,0xFA,0xFF,0xF6,\
Just4pLeisure 5:1775b4b13232 811 0x10,0xBB,0x30,0xEE,0x70,0x01,0x4A,0xFA,\
Just4pLeisure 5:1775b4b13232 812 0x52,0x43,0x4E,0x75,\
Just4pLeisure 5:1775b4b13232 813 0x20,0x7C,0x00,0xFF,0xFA,0x00,0x08,0x10,\
Just4pLeisure 5:1775b4b13232 814 0x00,0x04,0x66,0x4E,0xD0,0xFC,0x00,0x04,\
Just4pLeisure 5:1775b4b13232 815 0x10,0xFC,0x00,0x7F,0x08,0x10,0x00,0x03,\
Just4pLeisure 5:1775b4b13232 816 0x67,0xFA,0xD0,0xFC,0x00,0x1C,0x42,0x10,\
Just4pLeisure 5:1775b4b13232 817 0xD0,0xFC,0x00,0x23,0x30,0xBC,0x3F,0xFF,\
Just4pLeisure 5:1775b4b13232 818 0xD0,0xFC,0x00,0x04,0x70,0x07,0x30,0xC0,\
Just4pLeisure 5:1775b4b13232 819 0x30,0xBC,0x68,0x70,0xD0,0xFC,0x00,0x06,\
Just4pLeisure 5:1775b4b13232 820 0x30,0xC0,0x30,0xFC,0x30,0x30,0x30,0xC0,\
Just4pLeisure 5:1775b4b13232 821 0x30,0xBC,0x50,0x30,0xD0,0xFC,0x01,0xBE,\
Just4pLeisure 5:1775b4b13232 822 0x70,0x40,0x30,0xC0,0x30,0x80,0x30,0x3C,\
Just4pLeisure 5:1775b4b13232 823 0x55,0xF0,0x4E,0x71,0x51,0xC8,0xFF,0xFC,\
Just4pLeisure 5:1775b4b13232 824 0x60,0x18,0xD0,0xFC,0x00,0x08,0x30,0xFC,\
Just4pLeisure 5:1775b4b13232 825 0x69,0x08,0x08,0x10,0x00,0x09,0x67,0xFA,\
Just4pLeisure 5:1775b4b13232 826 0x31,0x3C,0x68,0x08,0xD0,0xFC,0x00,0x48,\
Just4pLeisure 5:1775b4b13232 827 0x42,0x50,0x4E,0x75,\
Just4pLeisure 5:1775b4b13232 828 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
Just4pLeisure 5:1775b4b13232 829 0x00,0x00,0x2C,0x3C,0x00,0x00,0x55,0x55,\
Just4pLeisure 5:1775b4b13232 830 0x2E,0x3C,0x00,0x00,0xAA,0xAA,0x2A,0x46,\
Just4pLeisure 5:1775b4b13232 831 0x53,0x8D,0x2C,0x47,0x45,0xF8,0x00,0x00,\
Just4pLeisure 5:1775b4b13232 832 0x47,0xFA,0xFF,0xDE,0x3C,0x87,0x3A,0x86,\
Just4pLeisure 5:1775b4b13232 833 0x3C,0xBC,0x90,0x90,0x36,0xDA,0x36,0x92,\
Just4pLeisure 5:1775b4b13232 834 0x3C,0x87,0x3A,0x86,0x3C,0xBC,0xF0,0xF0,\
Just4pLeisure 5:1775b4b13232 835 0x20,0x3A,0xFF,0xC6,0x72,0x02,0x48,0x41,\
Just4pLeisure 5:1775b4b13232 836 0x74,0x01,0x0C,0x00,0x00,0x25,0x67,0x50,\
Just4pLeisure 5:1775b4b13232 837 0x0C,0x00,0x00,0xB8,0x67,0x4A,0x74,0x04,\
Just4pLeisure 5:1775b4b13232 838 0x0C,0x00,0x00,0x5D,0x67,0x42,0x74,0x01,\
Just4pLeisure 5:1775b4b13232 839 0xE3,0x99,0x0C,0x00,0x00,0xA7,0x67,0x38,\
Just4pLeisure 5:1775b4b13232 840 0x0C,0x00,0x00,0xB4,0x67,0x32,0x74,0x02,\
Just4pLeisure 5:1775b4b13232 841 0x0C,0x00,0x00,0x20,0x67,0x2A,0x0C,0x00,\
Just4pLeisure 5:1775b4b13232 842 0x00,0xA4,0x67,0x24,0x0C,0x00,0x00,0xB5,\
Just4pLeisure 5:1775b4b13232 843 0x67,0x1E,0x74,0x04,0x0C,0x00,0x00,0xD5,\
Just4pLeisure 5:1775b4b13232 844 0x67,0x16,0x74,0x03,0xE3,0x99,0x0C,0x00,\
Just4pLeisure 5:1775b4b13232 845 0x00,0x23,0x67,0x0C,0xE3,0x99,0x0C,0x00,\
Just4pLeisure 5:1775b4b13232 846 0x00,0x81,0x67,0x04,0x72,0x00,0x74,0x00,\
Just4pLeisure 5:1775b4b13232 847 0x47,0xFA,0xFF,0x6A,0x26,0x81,0x47,0xFA,\
Just4pLeisure 5:1775b4b13232 848 0xFF,0x68,0x16,0x82,0x4E,0x75,\
Just4pLeisure 5:1775b4b13232 849 0x45,0x72,0x61,0x73,0x69,0x6E,0x67,0x20,\
Just4pLeisure 5:1775b4b13232 850 0x46,0x4C,0x41,0x53,0x48,0x20,0x63,0x68,\
Just4pLeisure 5:1775b4b13232 851 0x69,0x70,0x73,0x0D,0x0A,0x00,0x41,0xFA,\
Just4pLeisure 5:1775b4b13232 852 0xFF,0xE8,0x70,0x01,0x4A,0xFA,0x12,0x3A,\
Just4pLeisure 5:1775b4b13232 853 0xFF,0x42,0x53,0x01,0x67,0x16,0x53,0x01,\
Just4pLeisure 5:1775b4b13232 854 0x67,0x00,0x00,0xB8,0x53,0x01,0x67,0x00,\
Just4pLeisure 5:1775b4b13232 855 0x01,0x0A,0x53,0x01,0x67,0x00,0x01,0x3A,\
Just4pLeisure 5:1775b4b13232 856 0x60,0x00,0x01,0x3A,0x4B,0xF8,0x00,0x00,\
Just4pLeisure 5:1775b4b13232 857 0x24,0x3A,0xFF,0x1C,0x26,0x02,0x3A,0xBC,\
Just4pLeisure 5:1775b4b13232 858 0xFF,0xFF,0x3A,0xBC,0xFF,0xFF,0x42,0x55,\
Just4pLeisure 5:1775b4b13232 859 0x4A,0x35,0x28,0xFF,0x67,0x28,0x7A,0x19,\
Just4pLeisure 5:1775b4b13232 860 0x1B,0xBC,0x00,0x40,0x28,0xFF,0x42,0x35,\
Just4pLeisure 5:1775b4b13232 861 0x28,0xFF,0x72,0x15,0x4E,0x71,0x51,0xC9,\
Just4pLeisure 5:1775b4b13232 862 0xFF,0xFC,0x1B,0xBC,0x00,0xC0,0x28,0xFF,\
Just4pLeisure 5:1775b4b13232 863 0x72,0x0C,0x4E,0x71,0x51,0xC9,0xFF,0xFC,\
Just4pLeisure 5:1775b4b13232 864 0x4A,0x35,0x28,0xFF,0x66,0x06,0x53,0x82,\
Just4pLeisure 5:1775b4b13232 865 0x66,0xCC,0x60,0x04,0x53,0x45,0x66,0xD0,\
Just4pLeisure 5:1775b4b13232 866 0x42,0x55,0x4A,0x55,0x4A,0x05,0x67,0x00,\
Just4pLeisure 5:1775b4b13232 867 0x00,0xE4,0x24,0x03,0x50,0xC4,0x2A,0x3C,\
Just4pLeisure 5:1775b4b13232 868 0x03,0xE8,0x03,0xE8,0x72,0x20,0x1B,0x81,\
Just4pLeisure 5:1775b4b13232 869 0x28,0xFF,0x1B,0x81,0x28,0xFF,0x32,0x3C,\
Just4pLeisure 5:1775b4b13232 870 0x55,0xF0,0x4E,0x71,0x51,0xC9,0xFF,0xFC,\
Just4pLeisure 5:1775b4b13232 871 0x4E,0xBA,0xFE,0x20,0x1B,0xBC,0x00,0xA0,\
Just4pLeisure 5:1775b4b13232 872 0x28,0xFF,0x72,0x0C,0x4E,0x71,0x51,0xC9,\
Just4pLeisure 5:1775b4b13232 873 0xFF,0xFC,0xB8,0x35,0x28,0xFF,0x66,0x08,\
Just4pLeisure 5:1775b4b13232 874 0x48,0x45,0x53,0x82,0x66,0xE6,0x60,0x04,\
Just4pLeisure 5:1775b4b13232 875 0x53,0x45,0x66,0xC8,0x42,0x55,0x4A,0x55,\
Just4pLeisure 5:1775b4b13232 876 0x4A,0x45,0x67,0x00,0x00,0x98,0x60,0x00,\
Just4pLeisure 5:1775b4b13232 877 0x00,0x90,0x70,0x01,0x42,0x83,0x1D,0x87,\
Just4pLeisure 5:1775b4b13232 878 0x08,0x00,0x1B,0x86,0x08,0x00,0x1D,0xBC,\
Just4pLeisure 5:1775b4b13232 879 0x00,0x80,0x08,0x00,0x1D,0x87,0x08,0x00,\
Just4pLeisure 5:1775b4b13232 880 0x1B,0x86,0x08,0x00,0x1D,0xBC,0x00,0x10,\
Just4pLeisure 5:1775b4b13232 881 0x08,0x00,0x2A,0x00,0x4E,0xBA,0xFD,0xCC,\
Just4pLeisure 5:1775b4b13232 882 0x20,0x05,0x1A,0x30,0x09,0x90,0x08,0x05,\
Just4pLeisure 5:1775b4b13232 883 0x00,0x07,0x66,0x20,0x08,0x05,0x00,0x05,\
Just4pLeisure 5:1775b4b13232 884 0x67,0xE8,0x1A,0x30,0x09,0x90,0x08,0x05,\
Just4pLeisure 5:1775b4b13232 885 0x00,0x07,0x66,0x10,0x1D,0x87,0x08,0x00,\
Just4pLeisure 5:1775b4b13232 886 0x1B,0x86,0x08,0x00,0x1D,0xBC,0x00,0xF0,\
Just4pLeisure 5:1775b4b13232 887 0x08,0x00,0x60,0x40,0x53,0x80,0x67,0xAE,\
Just4pLeisure 5:1775b4b13232 888 0x60,0x36,0x42,0x83,0x3C,0x87,0x3A,0x86,\
Just4pLeisure 5:1775b4b13232 889 0x3C,0xBC,0x00,0x80,0x3C,0x87,0x3A,0x86,\
Just4pLeisure 5:1775b4b13232 890 0x3C,0xBC,0x00,0x10,0x4E,0xBA,0xFD,0x84,\
Just4pLeisure 5:1775b4b13232 891 0x3A,0x15,0x08,0x05,0x00,0x07,0x66,0x18,\
Just4pLeisure 5:1775b4b13232 892 0x08,0x05,0x00,0x05,0x67,0xEE,0x3A,0x15,\
Just4pLeisure 5:1775b4b13232 893 0x08,0x05,0x00,0x07,0x66,0x0A,0x3C,0x87,\
Just4pLeisure 5:1775b4b13232 894 0x3A,0x86,0x3C,0xBC,0x00,0xF0,0x60,0x04,\
Just4pLeisure 5:1775b4b13232 895 0x42,0x80,0x60,0x02,0x70,0x01,0x4E,0x75,\
Just4pLeisure 5:1775b4b13232 896 0x47,0xFB,0x01,0x70,0x00,0x00,0x04,0x4C,\
Just4pLeisure 5:1775b4b13232 897 0x28,0x49,0x24,0x3C,0x00,0x00,0x01,0x00,\
Just4pLeisure 5:1775b4b13232 898 0x12,0x3A,0xFD,0xD8,0x53,0x01,0x67,0x14,\
Just4pLeisure 5:1775b4b13232 899 0x53,0x01,0x67,0x5A,0x53,0x01,0x67,0x00,\
Just4pLeisure 5:1775b4b13232 900 0x00,0xBC,0x53,0x01,0x67,0x00,0x01,0x00,\
Just4pLeisure 5:1775b4b13232 901 0x60,0x00,0x01,0x2E,0x10,0x33,0x28,0xFF,\
Just4pLeisure 5:1775b4b13232 902 0x0C,0x00,0x00,0xFF,0x67,0x28,0x7A,0x19,\
Just4pLeisure 5:1775b4b13232 903 0x19,0xBC,0x00,0x40,0x28,0xFF,0x19,0x80,\
Just4pLeisure 5:1775b4b13232 904 0x28,0xFF,0x72,0x15,0x4E,0x71,0x51,0xC9,\
Just4pLeisure 5:1775b4b13232 905 0xFF,0xFC,0x19,0xBC,0x00,0xC0,0x28,0xFF,\
Just4pLeisure 5:1775b4b13232 906 0x72,0x0C,0x4E,0x71,0x51,0xC9,0xFF,0xFC,\
Just4pLeisure 5:1775b4b13232 907 0xB0,0x34,0x28,0xFF,0x66,0x06,0x53,0x82,\
Just4pLeisure 5:1775b4b13232 908 0x66,0xCA,0x60,0x04,0x53,0x05,0x66,0xD0,\
Just4pLeisure 5:1775b4b13232 909 0x42,0x55,0x4A,0x55,0x4A,0x05,0x67,0x00,\
Just4pLeisure 5:1775b4b13232 910 0x00,0xE8,0x60,0x00,0x00,0xE0,0x20,0x0C,\
Just4pLeisure 5:1775b4b13232 911 0xD0,0x82,0xC0,0xBC,0x00,0x00,0x00,0x01,\
Just4pLeisure 5:1775b4b13232 912 0x08,0x40,0x00,0x00,0x16,0x33,0x28,0xFF,\
Just4pLeisure 5:1775b4b13232 913 0x0C,0x03,0x00,0xFF,0x67,0x48,0x1D,0x87,\
Just4pLeisure 5:1775b4b13232 914 0x08,0x00,0x1B,0x86,0x08,0x00,0x1D,0xBC,\
Just4pLeisure 5:1775b4b13232 915 0x00,0xA0,0x08,0x00,0x19,0x83,0x28,0xFF,\
Just4pLeisure 5:1775b4b13232 916 0xC6,0x3C,0x00,0x80,0x18,0x34,0x28,0xFF,\
Just4pLeisure 5:1775b4b13232 917 0x1A,0x04,0xC8,0x3C,0x00,0x80,0xB8,0x03,\
Just4pLeisure 5:1775b4b13232 918 0x67,0x24,0x08,0x05,0x00,0x05,0x67,0xEC,\
Just4pLeisure 5:1775b4b13232 919 0x18,0x34,0x28,0xFF,0xC8,0x3C,0x00,0x80,\
Just4pLeisure 5:1775b4b13232 920 0xB8,0x03,0x67,0x12,0x1D,0x87,0x08,0x00,\
Just4pLeisure 5:1775b4b13232 921 0x1B,0x86,0x08,0x00,0x1D,0xBC,0x00,0xF0,\
Just4pLeisure 5:1775b4b13232 922 0x08,0x00,0x60,0x00,0x00,0x84,0x53,0x82,\
Just4pLeisure 5:1775b4b13232 923 0x66,0xA6,0x60,0x78,0x36,0x33,0x28,0xFE,\
Just4pLeisure 5:1775b4b13232 924 0x0C,0x43,0xFF,0xFF,0x67,0x3A,0x3C,0x87,\
Just4pLeisure 5:1775b4b13232 925 0x3A,0x86,0x3C,0xBC,0x00,0xA0,0x39,0x83,\
Just4pLeisure 5:1775b4b13232 926 0x28,0xFE,0xC6,0x7C,0x00,0x80,0x38,0x34,\
Just4pLeisure 5:1775b4b13232 927 0x28,0xFE,0x3A,0x04,0xC8,0x7C,0x00,0x80,\
Just4pLeisure 5:1775b4b13232 928 0xB8,0x43,0x67,0x1C,0x08,0x05,0x00,0x05,\
Just4pLeisure 5:1775b4b13232 929 0x67,0xEC,0x38,0x34,0x28,0xFE,0xC8,0x7C,\
Just4pLeisure 5:1775b4b13232 930 0x00,0x80,0xB8,0x43,0x67,0x0A,0x3C,0x87,\
Just4pLeisure 5:1775b4b13232 931 0x3A,0x86,0x3C,0xBC,0x00,0xF0,0x60,0x38,\
Just4pLeisure 5:1775b4b13232 932 0x55,0x82,0x66,0xB8,0x60,0x2E,0x3C,0x87,\
Just4pLeisure 5:1775b4b13232 933 0x3A,0x86,0x3C,0xBC,0xA0,0xA0,0x39,0xB3,\
Just4pLeisure 5:1775b4b13232 934 0x28,0xFE,0x28,0xFE,0x55,0x82,0x66,0xF6,\
Just4pLeisure 5:1775b4b13232 935 0x32,0x3C,0x55,0xF0,0x4E,0x71,0x51,0xC9,\
Just4pLeisure 5:1775b4b13232 936 0xFF,0xFC,0x34,0x3C,0x01,0x00,0x36,0x33,\
Just4pLeisure 5:1775b4b13232 937 0x28,0xFE,0xB6,0x74,0x28,0xFE,0x66,0x08,\
Just4pLeisure 5:1775b4b13232 938 0x55,0x82,0x66,0xF2,0x42,0x80,0x60,0x02,\
Just4pLeisure 5:1775b4b13232 939 0x70,0x01,0x4E,0x75,\
Just4pLeisure 5:1775b4b13232 940 0x4F,0xFB,0x01,0x70,0x00,0x00,0x02,0xF0,\
Just4pLeisure 5:1775b4b13232 941 0x4E,0xBA,0xFC,0x08,0x4E,0xBA,0xFC,0x82,\
Just4pLeisure 5:1775b4b13232 942 0x4E,0xBA,0xFD,0x30,0x4A,0xFA,0x42,0x80,\
Just4pLeisure 5:1775b4b13232 943 0x22,0x40,0x4E,0xBA,0xFE,0x88,0x4A,0xFA,\
Just4pLeisure 5:1775b4b13232 944 0xD2,0xFC,0x01,0x00,0x60,0xF4
Just4pLeisure 5:1775b4b13232 945 };
Just4pLeisure 1:d5452e398b76 946
Just4pLeisure 5:1775b4b13232 947 /*
Just4pLeisure 5:1775b4b13232 948 uint8_t flashDriver8[] = {\
Just4pLeisure 5:1775b4b13232 949 0x60,0x00,0x05,0xC2,0x54,0x72,0x69,0x6F,\
Just4pLeisure 5:1775b4b13232 950 0x6E,0x69,0x63,0x20,0x45,0x43,0x55,0x20,\
Just4pLeisure 5:1775b4b13232 951 0x46,0x4C,0x41,0x53,0x48,0x20,0x73,0x63,\
Just4pLeisure 5:1775b4b13232 952 0x72,0x69,0x70,0x74,0x0D,0x0A,0x00,0x50,\
Just4pLeisure 5:1775b4b13232 953 0x72,0x6F,0x67,0x72,0x61,0x6D,0x6D,0x69,\
Just4pLeisure 5:1775b4b13232 954 0x6E,0x67,0x20,0x46,0x4C,0x41,0x53,0x48,\
Just4pLeisure 5:1775b4b13232 955 0x20,0x63,0x68,0x69,0x70,0x20,0x61,0x64,\
Just4pLeisure 5:1775b4b13232 956 0x64,0x72,0x65,0x73,0x73,0x65,0x73,0x3A,\
Just4pLeisure 5:1775b4b13232 957 0x0D,0x0A,0x00,0x54,0x72,0x69,0x6F,0x6E,\
Just4pLeisure 5:1775b4b13232 958 0x69,0x63,0x20,0x45,0x43,0x55,0x20,0x46,\
Just4pLeisure 5:1775b4b13232 959 0x4C,0x41,0x53,0x48,0x20,0x63,0x68,0x69,\
Just4pLeisure 5:1775b4b13232 960 0x70,0x73,0x20,0x75,0x70,0x64,0x61,0x74,\
Just4pLeisure 5:1775b4b13232 961 0x65,0x64,0x20,0x2D,0x20,0x65,0x6E,0x6A,\
Just4pLeisure 5:1775b4b13232 962 0x6F,0x79,0x20,0x3A,0x2D,0x29,0x0D,0x0A,\
Just4pLeisure 5:1775b4b13232 963 0x00,0x46,0x4C,0x41,0x53,0x48,0x20,0x73,\
Just4pLeisure 5:1775b4b13232 964 0x69,0x7A,0x65,0x3A,0x20,0x30,0x78,0x30,\
Just4pLeisure 5:1775b4b13232 965 0x46,0x61,0x64,0x65,0x30,0x20,0x42,0x79,\
Just4pLeisure 5:1775b4b13232 966 0x74,0x65,0x73,0x0D,0x0A,0x00,0x30,0x78,\
Just4pLeisure 5:1775b4b13232 967 0x30,0x43,0x61,0x66,0x65,0x30,0x2D,0x30,\
Just4pLeisure 5:1775b4b13232 968 0x42,0x61,0x62,0x65,0x30,0x0D,0x00,0x72,\
Just4pLeisure 5:1775b4b13232 969 0x62,0x00,\
Just4pLeisure 5:1775b4b13232 970 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,\
Just4pLeisure 5:1775b4b13232 971 0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46,\
Just4pLeisure 5:1775b4b13232 972 0xE1,0x9A,0x76,0x05,0x42,0x84,0xE9,0x9A,\
Just4pLeisure 5:1775b4b13232 973 0x18,0x02,0x02,0x04,0x00,0x0F,0x10,0xFB,\
Just4pLeisure 5:1775b4b13232 974 0x40,0xE0,0x51,0xCB,0xFF,0xF2,0x4E,0x75,\
Just4pLeisure 5:1775b4b13232 975 0x7C,0x2F,0x2D,0x5C,0x2A,0x0D,0x00,0x00,\
Just4pLeisure 5:1775b4b13232 976 0x02,0x03,0x00,0x03,0x41,0xFA,0xFF,0xF6,\
Just4pLeisure 5:1775b4b13232 977 0x10,0xBB,0x30,0xEE,0x70,0x01,0x4A,0xFA,\
Just4pLeisure 5:1775b4b13232 978 0x52,0x43,0x4E,0x75,\
Just4pLeisure 5:1775b4b13232 979 0x20,0x7C,0x00,0xFF,0xFA,0x00,0x08,0x10,\
Just4pLeisure 5:1775b4b13232 980 0x00,0x04,0x66,0x4E,0xD0,0xFC,0x00,0x04,\
Just4pLeisure 5:1775b4b13232 981 0x10,0xFC,0x00,0x7F,0x08,0x10,0x00,0x03,\
Just4pLeisure 5:1775b4b13232 982 0x67,0xFA,0xD0,0xFC,0x00,0x1C,0x42,0x10,\
Just4pLeisure 5:1775b4b13232 983 0xD0,0xFC,0x00,0x23,0x30,0xBC,0x3F,0xFF,\
Just4pLeisure 5:1775b4b13232 984 0xD0,0xFC,0x00,0x04,0x70,0x07,0x30,0xC0,\
Just4pLeisure 5:1775b4b13232 985 0x30,0xBC,0x68,0x70,0xD0,0xFC,0x00,0x06,\
Just4pLeisure 5:1775b4b13232 986 0x30,0xC0,0x30,0xFC,0x30,0x30,0x30,0xC0,\
Just4pLeisure 5:1775b4b13232 987 0x30,0xBC,0x50,0x30,0xD0,0xFC,0x01,0xBE,\
Just4pLeisure 5:1775b4b13232 988 0x70,0x40,0x30,0xC0,0x30,0x80,0x30,0x3C,\
Just4pLeisure 5:1775b4b13232 989 0x55,0xF0,0x4E,0x71,0x51,0xC8,0xFF,0xFC,\
Just4pLeisure 5:1775b4b13232 990 0x60,0x18,0xD0,0xFC,0x00,0x08,0x30,0xFC,\
Just4pLeisure 5:1775b4b13232 991 0x69,0x08,0x08,0x10,0x00,0x09,0x67,0xFA,\
Just4pLeisure 5:1775b4b13232 992 0x31,0x3C,0x68,0x08,0xD0,0xFC,0x00,0x48,\
Just4pLeisure 5:1775b4b13232 993 0x42,0x50,0x4E,0x75,\
Just4pLeisure 5:1775b4b13232 994 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
Just4pLeisure 5:1775b4b13232 995 0x00,0x00,0x2C,0x3C,0x00,0x00,0x55,0x55,\
Just4pLeisure 5:1775b4b13232 996 0x2E,0x3C,0x00,0x00,0xAA,0xAA,0x2A,0x46,\
Just4pLeisure 5:1775b4b13232 997 0x53,0x8D,0x2C,0x47,0x45,0xF8,0x00,0x00,\
Just4pLeisure 5:1775b4b13232 998 0x47,0xFA,0xFF,0xDE,0x3C,0x87,0x3A,0x86,\
Just4pLeisure 5:1775b4b13232 999 0x3C,0xBC,0x90,0x90,0x36,0xDA,0x36,0x92,\
Just4pLeisure 5:1775b4b13232 1000 0x3C,0x87,0x3A,0x86,0x3C,0xBC,0xF0,0xF0,\
Just4pLeisure 5:1775b4b13232 1001 0x20,0x3A,0xFF,0xC6,0x72,0x02,0x48,0x41,\
Just4pLeisure 5:1775b4b13232 1002 0x74,0x01,0x0C,0x00,0x00,0x25,0x67,0x50,\
Just4pLeisure 5:1775b4b13232 1003 0x0C,0x00,0x00,0xB8,0x67,0x4A,0x74,0x04,\
Just4pLeisure 5:1775b4b13232 1004 0x0C,0x00,0x00,0x5D,0x67,0x42,0x74,0x01,\
Just4pLeisure 5:1775b4b13232 1005 0xE3,0x99,0x0C,0x00,0x00,0xA7,0x67,0x38,\
Just4pLeisure 5:1775b4b13232 1006 0x0C,0x00,0x00,0xB4,0x67,0x32,0x74,0x02,\
Just4pLeisure 5:1775b4b13232 1007 0x0C,0x00,0x00,0x20,0x67,0x2A,0x0C,0x00,\
Just4pLeisure 5:1775b4b13232 1008 0x00,0xA4,0x67,0x24,0x0C,0x00,0x00,0xB5,\
Just4pLeisure 5:1775b4b13232 1009 0x67,0x1E,0x74,0x04,0x0C,0x00,0x00,0xD5,\
Just4pLeisure 5:1775b4b13232 1010 0x67,0x16,0x74,0x03,0xE3,0x99,0x0C,0x00,\
Just4pLeisure 5:1775b4b13232 1011 0x00,0x23,0x67,0x0C,0xE3,0x99,0x0C,0x00,\
Just4pLeisure 5:1775b4b13232 1012 0x00,0x81,0x67,0x04,0x72,0x00,0x74,0x00,\
Just4pLeisure 5:1775b4b13232 1013 0x47,0xFA,0xFF,0x6A,0x26,0x81,0x47,0xFA,\
Just4pLeisure 5:1775b4b13232 1014 0xFF,0x68,0x16,0x82,0x4E,0x75,\
Just4pLeisure 5:1775b4b13232 1015 0x46,0x6F,0x75,0x6E,0x64,0x20,0x61,0x20,\
Just4pLeisure 5:1775b4b13232 1016 0x54,0x20,0x20,0x20,0x0D,0x0A,0x00,0x00,\
Just4pLeisure 5:1775b4b13232 1017 0x20,0x3A,0xFF,0x4C,0x48,0x40,0x41,0xFA,\
Just4pLeisure 5:1775b4b13232 1018 0xFF,0xF1,0x72,0x38,0xE9,0x18,0x65,0x16,\
Just4pLeisure 5:1775b4b13232 1019 0x72,0x37,0xE3,0x18,0x65,0x10,0x72,0x35,\
Just4pLeisure 5:1775b4b13232 1020 0x10,0xC1,0x72,0x2E,0x10,0xC1,0x72,0x35,\
Just4pLeisure 5:1775b4b13232 1021 0xE3,0x18,0x65,0x02,0x72,0x32,0x10,0x81,\
Just4pLeisure 5:1775b4b13232 1022 0x41,0xFA,0xFF,0xC6,0x70,0x01,0x4A,0xFA,\
Just4pLeisure 5:1775b4b13232 1023 0x4E,0x75,\
Just4pLeisure 5:1775b4b13232 1024 0x46,0x49,0x4C,0x45,0x4E,0x41,0x4D,0x45,\
Just4pLeisure 5:1775b4b13232 1025 0x2E,0x42,0x49,0x4E,0x00,0x45,0x6E,0x74,\
Just4pLeisure 5:1775b4b13232 1026 0x65,0x72,0x20,0x61,0x20,0x66,0x69,0x6C,\
Just4pLeisure 5:1775b4b13232 1027 0x65,0x6E,0x61,0x6D,0x65,0x20,0x28,0x75,\
Just4pLeisure 5:1775b4b13232 1028 0x70,0x20,0x74,0x6F,0x20,0x38,0x20,0x63,\
Just4pLeisure 5:1775b4b13232 1029 0x68,0x61,0x72,0x61,0x63,0x74,0x65,0x72,\
Just4pLeisure 5:1775b4b13232 1030 0x73,0x29,0x3A,0x20,0x00,0x00,0x41,0xFA,\
Just4pLeisure 5:1775b4b13232 1031 0xFF,0xD5,0x70,0x01,0x4A,0xFA,0x41,0xFA,\
Just4pLeisure 5:1775b4b13232 1032 0xFF,0xC0,0x78,0x08,0x70,0x04,0x4A,0xFA,\
Just4pLeisure 5:1775b4b13232 1033 0x0C,0x00,0x00,0x0D,0x67,0x26,0x0C,0x00,\
Just4pLeisure 5:1775b4b13232 1034 0x00,0x2E,0x67,0x20,0x0C,0x00,0x00,0x08,\
Just4pLeisure 5:1775b4b13232 1035 0x66,0x0A,0xB8,0x00,0x67,0xE6,0x53,0x48,\
Just4pLeisure 5:1775b4b13232 1036 0x54,0x44,0x60,0x06,0x4A,0x04,0x67,0x0C,\
Just4pLeisure 5:1775b4b13232 1037 0x10,0xC0,0x12,0x00,0x70,0x02,0x4A,0xFA,\
Just4pLeisure 5:1775b4b13232 1038 0x51,0xCC,0xFF,0xD2,0x10,0xFC,0x00,0x2E,\
Just4pLeisure 5:1775b4b13232 1039 0x10,0xFC,0x00,0x42,0x10,0xFC,0x00,0x49,\
Just4pLeisure 5:1775b4b13232 1040 0x10,0xFC,0x00,0x4E,0x10,0xBC,0x00,0x00,\
Just4pLeisure 5:1775b4b13232 1041 0x59,0x88,0x70,0x01,0x4A,0xFA,0x41,0xFA,\
Just4pLeisure 5:1775b4b13232 1042 0xFD,0xB5,0x70,0x01,0x4A,0xFA,0x41,0xFA,\
Just4pLeisure 5:1775b4b13232 1043 0xFF,0x68,0x43,0xFA,0xFD,0xBD,0x70,0x06,\
Just4pLeisure 5:1775b4b13232 1044 0x4A,0xFA,0x41,0xFA,0xFF,0x58,0x20,0x80,\
Just4pLeisure 5:1775b4b13232 1045 0x4E,0x75,\
Just4pLeisure 5:1775b4b13232 1046 0x45,0x72,0x61,0x73,0x69,0x6E,0x67,0x20,\
Just4pLeisure 5:1775b4b13232 1047 0x46,0x4C,0x41,0x53,0x48,0x20,0x63,0x68,\
Just4pLeisure 5:1775b4b13232 1048 0x69,0x70,0x73,0x0D,0x0A,0x00,0x41,0xFA,\
Just4pLeisure 5:1775b4b13232 1049 0xFF,0xE8,0x70,0x01,0x4A,0xFA,0x12,0x3A,\
Just4pLeisure 5:1775b4b13232 1050 0xFE,0x52,0x53,0x01,0x67,0x16,0x53,0x01,\
Just4pLeisure 5:1775b4b13232 1051 0x67,0x00,0x00,0xB8,0x53,0x01,0x67,0x00,\
Just4pLeisure 5:1775b4b13232 1052 0x01,0x0A,0x53,0x01,0x67,0x00,0x01,0x3A,\
Just4pLeisure 5:1775b4b13232 1053 0x60,0x00,0x01,0x3A,0x4B,0xF8,0x00,0x00,\
Just4pLeisure 5:1775b4b13232 1054 0x24,0x3A,0xFE,0x2C,0x26,0x02,0x3A,0xBC,\
Just4pLeisure 5:1775b4b13232 1055 0xFF,0xFF,0x3A,0xBC,0xFF,0xFF,0x42,0x55,\
Just4pLeisure 5:1775b4b13232 1056 0x4A,0x35,0x28,0xFF,0x67,0x28,0x7A,0x19,\
Just4pLeisure 5:1775b4b13232 1057 0x1B,0xBC,0x00,0x40,0x28,0xFF,0x42,0x35,\
Just4pLeisure 5:1775b4b13232 1058 0x28,0xFF,0x72,0x15,0x4E,0x71,0x51,0xC9,\
Just4pLeisure 5:1775b4b13232 1059 0xFF,0xFC,0x1B,0xBC,0x00,0xC0,0x28,0xFF,\
Just4pLeisure 5:1775b4b13232 1060 0x72,0x0C,0x4E,0x71,0x51,0xC9,0xFF,0xFC,\
Just4pLeisure 5:1775b4b13232 1061 0x4A,0x35,0x28,0xFF,0x66,0x06,0x53,0x82,\
Just4pLeisure 5:1775b4b13232 1062 0x66,0xCC,0x60,0x04,0x53,0x45,0x66,0xD0,\
Just4pLeisure 5:1775b4b13232 1063 0x42,0x55,0x4A,0x55,0x4A,0x05,0x67,0x00,\
Just4pLeisure 5:1775b4b13232 1064 0x00,0xE4,0x24,0x03,0x50,0xC4,0x2A,0x3C,\
Just4pLeisure 5:1775b4b13232 1065 0x03,0xE8,0x03,0xE8,0x72,0x20,0x1B,0x81,\
Just4pLeisure 5:1775b4b13232 1066 0x28,0xFF,0x1B,0x81,0x28,0xFF,0x32,0x3C,\
Just4pLeisure 5:1775b4b13232 1067 0x55,0xF0,0x4E,0x71,0x51,0xC9,0xFF,0xFC,\
Just4pLeisure 5:1775b4b13232 1068 0x4E,0xBA,0xFD,0x30,0x1B,0xBC,0x00,0xA0,\
Just4pLeisure 5:1775b4b13232 1069 0x28,0xFF,0x72,0x0C,0x4E,0x71,0x51,0xC9,\
Just4pLeisure 5:1775b4b13232 1070 0xFF,0xFC,0xB8,0x35,0x28,0xFF,0x66,0x08,\
Just4pLeisure 5:1775b4b13232 1071 0x48,0x45,0x53,0x82,0x66,0xE6,0x60,0x04,\
Just4pLeisure 5:1775b4b13232 1072 0x53,0x45,0x66,0xC8,0x42,0x55,0x4A,0x55,\
Just4pLeisure 5:1775b4b13232 1073 0x4A,0x45,0x67,0x00,0x00,0x98,0x60,0x00,\
Just4pLeisure 5:1775b4b13232 1074 0x00,0x90,0x70,0x01,0x42,0x83,0x1D,0x87,\
Just4pLeisure 5:1775b4b13232 1075 0x08,0x00,0x1B,0x86,0x08,0x00,0x1D,0xBC,\
Just4pLeisure 5:1775b4b13232 1076 0x00,0x80,0x08,0x00,0x1D,0x87,0x08,0x00,\
Just4pLeisure 5:1775b4b13232 1077 0x1B,0x86,0x08,0x00,0x1D,0xBC,0x00,0x10,\
Just4pLeisure 5:1775b4b13232 1078 0x08,0x00,0x2A,0x00,0x4E,0xBA,0xFC,0xDC,\
Just4pLeisure 5:1775b4b13232 1079 0x20,0x05,0x1A,0x30,0x09,0x90,0x08,0x05,\
Just4pLeisure 5:1775b4b13232 1080 0x00,0x07,0x66,0x20,0x08,0x05,0x00,0x05,\
Just4pLeisure 5:1775b4b13232 1081 0x67,0xE8,0x1A,0x30,0x09,0x90,0x08,0x05,\
Just4pLeisure 5:1775b4b13232 1082 0x00,0x07,0x66,0x10,0x1D,0x87,0x08,0x00,\
Just4pLeisure 5:1775b4b13232 1083 0x1B,0x86,0x08,0x00,0x1D,0xBC,0x00,0xF0,\
Just4pLeisure 5:1775b4b13232 1084 0x08,0x00,0x60,0x40,0x53,0x80,0x67,0xAE,\
Just4pLeisure 5:1775b4b13232 1085 0x60,0x36,0x42,0x83,0x3C,0x87,0x3A,0x86,\
Just4pLeisure 5:1775b4b13232 1086 0x3C,0xBC,0x00,0x80,0x3C,0x87,0x3A,0x86,\
Just4pLeisure 5:1775b4b13232 1087 0x3C,0xBC,0x00,0x10,0x4E,0xBA,0xFC,0x94,\
Just4pLeisure 5:1775b4b13232 1088 0x3A,0x15,0x08,0x05,0x00,0x07,0x66,0x18,\
Just4pLeisure 5:1775b4b13232 1089 0x08,0x05,0x00,0x05,0x67,0xEE,0x3A,0x15,\
Just4pLeisure 5:1775b4b13232 1090 0x08,0x05,0x00,0x07,0x66,0x0A,0x3C,0x87,\
Just4pLeisure 5:1775b4b13232 1091 0x3A,0x86,0x3C,0xBC,0x00,0xF0,0x60,0x04,\
Just4pLeisure 5:1775b4b13232 1092 0x42,0x80,0x60,0x02,0x70,0x01,0x4E,0x75,\
Just4pLeisure 5:1775b4b13232 1093 0x47,0xFB,0x01,0x70,0x00,0x00,0x02,0x96,\
Just4pLeisure 5:1775b4b13232 1094 0x28,0x49,0x24,0x3C,0x00,0x00,0x01,0x00,\
Just4pLeisure 5:1775b4b13232 1095 0x12,0x3A,0xFC,0xE8,0x53,0x01,0x67,0x14,\
Just4pLeisure 5:1775b4b13232 1096 0x53,0x01,0x67,0x5A,0x53,0x01,0x67,0x00,\
Just4pLeisure 5:1775b4b13232 1097 0x00,0xBC,0x53,0x01,0x67,0x00,0x01,0x00,\
Just4pLeisure 5:1775b4b13232 1098 0x60,0x00,0x01,0x2E,0x10,0x33,0x28,0xFF,\
Just4pLeisure 5:1775b4b13232 1099 0x0C,0x00,0x00,0xFF,0x67,0x28,0x7A,0x19,\
Just4pLeisure 5:1775b4b13232 1100 0x19,0xBC,0x00,0x40,0x28,0xFF,0x19,0x80,\
Just4pLeisure 5:1775b4b13232 1101 0x28,0xFF,0x72,0x15,0x4E,0x71,0x51,0xC9,\
Just4pLeisure 5:1775b4b13232 1102 0xFF,0xFC,0x19,0xBC,0x00,0xC0,0x28,0xFF,\
Just4pLeisure 5:1775b4b13232 1103 0x72,0x0C,0x4E,0x71,0x51,0xC9,0xFF,0xFC,\
Just4pLeisure 5:1775b4b13232 1104 0xB0,0x34,0x28,0xFF,0x66,0x06,0x53,0x82,\
Just4pLeisure 5:1775b4b13232 1105 0x66,0xCA,0x60,0x04,0x53,0x05,0x66,0xD0,\
Just4pLeisure 5:1775b4b13232 1106 0x42,0x55,0x4A,0x55,0x4A,0x05,0x67,0x00,\
Just4pLeisure 5:1775b4b13232 1107 0x00,0xE8,0x60,0x00,0x00,0xE0,0x20,0x0C,\
Just4pLeisure 5:1775b4b13232 1108 0xD0,0x82,0xC0,0xBC,0x00,0x00,0x00,0x01,\
Just4pLeisure 5:1775b4b13232 1109 0x08,0x40,0x00,0x00,0x16,0x33,0x28,0xFF,\
Just4pLeisure 5:1775b4b13232 1110 0x0C,0x03,0x00,0xFF,0x67,0x48,0x1D,0x87,\
Just4pLeisure 5:1775b4b13232 1111 0x08,0x00,0x1B,0x86,0x08,0x00,0x1D,0xBC,\
Just4pLeisure 5:1775b4b13232 1112 0x00,0xA0,0x08,0x00,0x19,0x83,0x28,0xFF,\
Just4pLeisure 5:1775b4b13232 1113 0xC6,0x3C,0x00,0x80,0x18,0x34,0x28,0xFF,\
Just4pLeisure 5:1775b4b13232 1114 0x1A,0x04,0xC8,0x3C,0x00,0x80,0xB8,0x03,\
Just4pLeisure 5:1775b4b13232 1115 0x67,0x24,0x08,0x05,0x00,0x05,0x67,0xEC,\
Just4pLeisure 5:1775b4b13232 1116 0x18,0x34,0x28,0xFF,0xC8,0x3C,0x00,0x80,\
Just4pLeisure 5:1775b4b13232 1117 0xB8,0x03,0x67,0x12,0x1D,0x87,0x08,0x00,\
Just4pLeisure 5:1775b4b13232 1118 0x1B,0x86,0x08,0x00,0x1D,0xBC,0x00,0xF0,\
Just4pLeisure 5:1775b4b13232 1119 0x08,0x00,0x60,0x00,0x00,0x84,0x53,0x82,\
Just4pLeisure 5:1775b4b13232 1120 0x66,0xA6,0x60,0x78,0x36,0x33,0x28,0xFE,\
Just4pLeisure 5:1775b4b13232 1121 0x0C,0x43,0xFF,0xFF,0x67,0x3A,0x3C,0x87,\
Just4pLeisure 5:1775b4b13232 1122 0x3A,0x86,0x3C,0xBC,0x00,0xA0,0x39,0x83,\
Just4pLeisure 5:1775b4b13232 1123 0x28,0xFE,0xC6,0x7C,0x00,0x80,0x38,0x34,\
Just4pLeisure 5:1775b4b13232 1124 0x28,0xFE,0x3A,0x04,0xC8,0x7C,0x00,0x80,\
Just4pLeisure 5:1775b4b13232 1125 0xB8,0x43,0x67,0x1C,0x08,0x05,0x00,0x05,\
Just4pLeisure 5:1775b4b13232 1126 0x67,0xEC,0x38,0x34,0x28,0xFE,0xC8,0x7C,\
Just4pLeisure 5:1775b4b13232 1127 0x00,0x80,0xB8,0x43,0x67,0x0A,0x3C,0x87,\
Just4pLeisure 5:1775b4b13232 1128 0x3A,0x86,0x3C,0xBC,0x00,0xF0,0x60,0x38,\
Just4pLeisure 5:1775b4b13232 1129 0x55,0x82,0x66,0xB8,0x60,0x2E,0x3C,0x87,\
Just4pLeisure 5:1775b4b13232 1130 0x3A,0x86,0x3C,0xBC,0xA0,0xA0,0x39,0xB3,\
Just4pLeisure 5:1775b4b13232 1131 0x28,0xFE,0x28,0xFE,0x55,0x82,0x66,0xF6,\
Just4pLeisure 5:1775b4b13232 1132 0x32,0x3C,0x55,0xF0,0x4E,0x71,0x51,0xC9,\
Just4pLeisure 5:1775b4b13232 1133 0xFF,0xFC,0x34,0x3C,0x01,0x00,0x36,0x33,\
Just4pLeisure 5:1775b4b13232 1134 0x28,0xFE,0xB6,0x74,0x28,0xFE,0x66,0x08,\
Just4pLeisure 5:1775b4b13232 1135 0x55,0x82,0x66,0xF2,0x42,0x80,0x60,0x02,\
Just4pLeisure 5:1775b4b13232 1136 0x70,0x01,0x4E,0x75,\
Just4pLeisure 5:1775b4b13232 1137 0x4F,0xFB,0x01,0x70,0x00,0x00,0x01,0x3A,\
Just4pLeisure 5:1775b4b13232 1138 0x41,0xFA,0xFA,0x36,0x70,0x01,0x4A,0xFA,\
Just4pLeisure 5:1775b4b13232 1139 0x4E,0xBA,0xFB,0x10,0x4E,0xBA,0xFB,0x8A,\
Just4pLeisure 5:1775b4b13232 1140 0x4A,0x42,0x66,0x06,0x74,0x01,0x60,0x00,\
Just4pLeisure 5:1775b4b13232 1141 0x00,0x42,0x4E,0xBA,0xFC,0x28,0x41,0xFA,\
Just4pLeisure 5:1775b4b13232 1142 0xFA,0x93,0x24,0x3A,0xFB,0x6E,0x4E,0xBA,\
Just4pLeisure 5:1775b4b13232 1143 0xFA,0xBE,0x41,0xFA,0xFA,0x79,0x70,0x01,\
Just4pLeisure 5:1775b4b13232 1144 0x4A,0xFA,0x4E,0xBA,0xFD,0x06,0x4A,0x00,\
Just4pLeisure 5:1775b4b13232 1145 0x67,0x06,0x74,0x05,0x60,0x00,0x00,0x1C,\
Just4pLeisure 5:1775b4b13232 1146 0x4A,0xFA,0x41,0xFA,0xFA,0x0F,0x70,0x01,\
Just4pLeisure 5:1775b4b13232 1147 0x4A,0xFA,0x42,0x80,0x22,0x40,0x4E,0xBA,\
Just4pLeisure 5:1775b4b13232 1148 0xFE,0x4C,0x4A,0xFA,0xD2,0xFC,0x01,0x00,\
Just4pLeisure 5:1775b4b13232 1149 0x60,0xF4,0x20,0x7C,0x00,0xFF,0xFA,0x00,\
Just4pLeisure 5:1775b4b13232 1150 0x08,0x10,0x00,0x04,0x66,0x08,0x02,0x79,\
Just4pLeisure 5:1775b4b13232 1151 0xFF,0xBF,0x00,0xFF,0xFC,0x14,0x22,0x02,\
Just4pLeisure 5:1775b4b13232 1152 0x70,0x00,0x4A,0xFA
Just4pLeisure 5:1775b4b13232 1153 };
Just4pLeisure 5:1775b4b13232 1154 */
Just4pLeisure 1:d5452e398b76 1155
Just4pLeisure 5:1775b4b13232 1156
Just4pLeisure 5:1775b4b13232 1157 //if (prep_t5_do() != TERM_OK) return TERM_ERR;
Just4pLeisure 5:1775b4b13232 1158 // Set Program counter to start of BDM driver code
Just4pLeisure 5:1775b4b13232 1159 uint32_t driverAddress = 0x100000;
Just4pLeisure 5:1775b4b13232 1160 if (sysreg_write(0x0, &driverAddress) != TERM_OK) break;
Just4pLeisure 5:1775b4b13232 1161 for (uint32_t i = 0; i < sizeof(flashDriver); i++) {
Just4pLeisure 5:1775b4b13232 1162 if(memwrite_byte(&driverAddress, flashDriver[i]) != TERM_OK) return false;
Just4pLeisure 5:1775b4b13232 1163 driverAddress++;
Just4pLeisure 5:1775b4b13232 1164 }
Just4pLeisure 5:1775b4b13232 1165 // if (!bdmLoadMemory(flashDriver, driverAddress, sizeof(flashDriver))) break;
Just4pLeisure 5:1775b4b13232 1166
Just4pLeisure 5:1775b4b13232 1167 timer.reset();
Just4pLeisure 5:1775b4b13232 1168 timer.start();
Just4pLeisure 5:1775b4b13232 1169 printf("Erasing FLASH chips...\r\n");
Just4pLeisure 5:1775b4b13232 1170 printf("This can take up to a minute for a T8,\r\n");
Just4pLeisure 5:1775b4b13232 1171 printf("30s for a T7 or 15s for a T5 ECU.\r\n");
Just4pLeisure 5:1775b4b13232 1172 // execute the erase algorithm in the BDM driver
Just4pLeisure 5:1775b4b13232 1173 // write the buffer - should complete within 200 milliseconds
Just4pLeisure 5:1775b4b13232 1174 // Typical and Maximum Chip Programming times are 9 and 27 seconds for Am29BL802C
Just4pLeisure 5:1775b4b13232 1175 // Typical Chip erase time for Am29BL802C is 45 secinds, not including 0x00 programming prior to erasure.
Just4pLeisure 5:1775b4b13232 1176 // Allow for at least worst case 27 seconds programming to 0x00 + 3(?) * 45 typical erase time (162 seconds)
Just4pLeisure 5:1775b4b13232 1177 // Allow at least 200 seconds erase time 2,000 * (100ms + BDM memread time)
Just4pLeisure 5:1775b4b13232 1178 // NOTE: 29/39F010 and 29F400 erase times are considerably lower
Just4pLeisure 5:1775b4b13232 1179
Just4pLeisure 5:1775b4b13232 1180 // if (sysreg_write(0x0, &driverAddress) != TERM_OK) return TERM_ERR;
Just4pLeisure 5:1775b4b13232 1181 // break;
Just4pLeisure 5:1775b4b13232 1182 do {
Just4pLeisure 6:2fbcbebed28c 1183 if (!bdmRunDriver(0x0, 200000)) {
Just4pLeisure 5:1775b4b13232 1184 printf("WARNING: An error occured when I tried to erase the FLASH chips :-(\r\n");
Just4pLeisure 5:1775b4b13232 1185 return TERM_ERR;
Just4pLeisure 5:1775b4b13232 1186 }
Just4pLeisure 5:1775b4b13232 1187 } while (bdmProcessSyscall() == CONTINUE);
Just4pLeisure 5:1775b4b13232 1188
Just4pLeisure 5:1775b4b13232 1189 // if (!run_bdm_driver(0x0, 200000)) {
Just4pLeisure 5:1775b4b13232 1190 // printf("WARNING: An error occured when I tried to erase the FLASH chips :-(\r\n");
Just4pLeisure 5:1775b4b13232 1191 // return TERM_ERR;
Just4pLeisure 5:1775b4b13232 1192 // }
Just4pLeisure 5:1775b4b13232 1193 printf("Erasing took %#.1f seconds.\r\n",timer.read());
Just4pLeisure 5:1775b4b13232 1194
Just4pLeisure 5:1775b4b13232 1195 printf("Programming the FLASH chips...\r\n");
Just4pLeisure 1:d5452e398b76 1196
Just4pLeisure 1:d5452e398b76 1197 // ready to receive data
Just4pLeisure 5:1775b4b13232 1198 printf(" 0.00 %% complete.\r");
Just4pLeisure 5:1775b4b13232 1199 while (curr_addr < flash_size) {
Just4pLeisure 5:1775b4b13232 1200 // receive bytes from BIN file - break if no more bytes to get
Just4pLeisure 5:1775b4b13232 1201 if (!fread(file_buffer,1,0x100,fp)) {
Just4pLeisure 5:1775b4b13232 1202 fclose(fp);
Just4pLeisure 5:1775b4b13232 1203 printf("Error reading the BIN file MODIFIED.BIN");
Just4pLeisure 5:1775b4b13232 1204 break;
Just4pLeisure 5:1775b4b13232 1205 }
Just4pLeisure 5:1775b4b13232 1206 if (!bdmLoadMemory((uint8_t*)file_buffer, 0x100700, 0x100)) break;
Just4pLeisure 5:1775b4b13232 1207 // write the buffer - should complete within 200 milliseconds
Just4pLeisure 5:1775b4b13232 1208 if (!bdmRunDriver(0x0, 200)) break;
Just4pLeisure 5:1775b4b13232 1209 // if (!run_bdm_driver(0x0, 200)) break;
Just4pLeisure 5:1775b4b13232 1210
Just4pLeisure 5:1775b4b13232 1211 printf("%6.2f\r", 100*(float)curr_addr/(float)flash_size );
Just4pLeisure 5:1775b4b13232 1212 // make the activity LED twinkle
Just4pLeisure 5:1775b4b13232 1213 ACTIVITYLEDON;
Just4pLeisure 5:1775b4b13232 1214 curr_addr += 0x100;
Just4pLeisure 5:1775b4b13232 1215 }
Just4pLeisure 1:d5452e398b76 1216 break;
Just4pLeisure 1:d5452e398b76 1217 }
Just4pLeisure 5:1775b4b13232 1218 // johnc's original method
Just4pLeisure 5:1775b4b13232 1219 case AMD29F400B: /// a sort of dummy 'placeholder' as the 'B' chip isn't ever fitted to T7 ECUS
Just4pLeisure 5:1775b4b13232 1220 default: {
Just4pLeisure 5:1775b4b13232 1221 timer.reset();
Just4pLeisure 5:1775b4b13232 1222 timer.start();
Just4pLeisure 5:1775b4b13232 1223
Just4pLeisure 5:1775b4b13232 1224 // reset the FLASH chips
Just4pLeisure 5:1775b4b13232 1225 printf("Reset the FLASH chip(s) to prepare them for Erasing\r\n");
Just4pLeisure 5:1775b4b13232 1226 if (!reset_func()) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 1227
Just4pLeisure 5:1775b4b13232 1228 switch (type) {
Just4pLeisure 5:1775b4b13232 1229 // AM29Fxxx chips (retrofitted to Trionic 5.x; original to T7)
Just4pLeisure 5:1775b4b13232 1230 case AMD29BL802C:
Just4pLeisure 5:1775b4b13232 1231 case AMD29F400B:
Just4pLeisure 5:1775b4b13232 1232 case AMD29F400T:
Just4pLeisure 5:1775b4b13232 1233 case AMD29F010:
Just4pLeisure 5:1775b4b13232 1234 case SST39SF010:
Just4pLeisure 5:1775b4b13232 1235 case AMICA29010L:
Just4pLeisure 5:1775b4b13232 1236 printf("Erasing 29BL802/F400/010 type FLASH chips...\r\n");
Just4pLeisure 5:1775b4b13232 1237 if (!erase_am29()) {
Just4pLeisure 5:1775b4b13232 1238 printf("WARNING: An error occured when I tried to erase the FLASH chips :-(\r\n");
Just4pLeisure 5:1775b4b13232 1239 return TERM_ERR;
Just4pLeisure 5:1775b4b13232 1240 }
Just4pLeisure 5:1775b4b13232 1241 break;
Just4pLeisure 5:1775b4b13232 1242 // AM28F010 chip (Trionic 5.x original)
Just4pLeisure 5:1775b4b13232 1243 case AMD28F010:
Just4pLeisure 5:1775b4b13232 1244 case INTEL28F010:
Just4pLeisure 5:1775b4b13232 1245 case AMD28F512:
Just4pLeisure 5:1775b4b13232 1246 case INTEL28F512:
Just4pLeisure 5:1775b4b13232 1247 printf("Erasing 28F010/512 type FLASH chips...\r\n");
Just4pLeisure 5:1775b4b13232 1248 if (!erase_am28(&curr_addr, &flash_size)) {
Just4pLeisure 5:1775b4b13232 1249 printf("WARNING: An error occured when I tried to erase the FLASH chips :-(\r\n");
Just4pLeisure 5:1775b4b13232 1250 return TERM_ERR;
Just4pLeisure 5:1775b4b13232 1251 }
Just4pLeisure 5:1775b4b13232 1252 break;
Just4pLeisure 5:1775b4b13232 1253 case ATMEL29C010:
Just4pLeisure 5:1775b4b13232 1254 case ATMEL29C512:
Just4pLeisure 5:1775b4b13232 1255 printf("Atmel FLASH chips do not require ERASEing :-)\r\n");
Just4pLeisure 5:1775b4b13232 1256 break;
Just4pLeisure 5:1775b4b13232 1257 default:
Just4pLeisure 5:1775b4b13232 1258 // unknown flash type - shouldn't get here hence "Strange!"
Just4pLeisure 5:1775b4b13232 1259 printf("Strange! I couldn't work out how to erase the FLASH chips in the TRIONIC ECU that I am connected to :-(\r\n");
Just4pLeisure 5:1775b4b13232 1260 return TERM_ERR;
Just4pLeisure 5:1775b4b13232 1261 }
Just4pLeisure 5:1775b4b13232 1262
Just4pLeisure 5:1775b4b13232 1263 timer.stop();
Just4pLeisure 5:1775b4b13232 1264 printf("Erasing took %#.1f seconds.\r\n",timer.read());
Just4pLeisure 5:1775b4b13232 1265
Just4pLeisure 5:1775b4b13232 1266 printf("Programming the FLASH chips...\r\n");
Just4pLeisure 5:1775b4b13232 1267
Just4pLeisure 5:1775b4b13232 1268 timer.reset();
Just4pLeisure 5:1775b4b13232 1269 timer.start();
Just4pLeisure 5:1775b4b13232 1270
Just4pLeisure 5:1775b4b13232 1271 uint16_t word_value = 0;
Just4pLeisure 5:1775b4b13232 1272
Just4pLeisure 5:1775b4b13232 1273 // ready to receive data
Just4pLeisure 5:1775b4b13232 1274 printf(" 0.00 %% complete.\r");
Just4pLeisure 5:1775b4b13232 1275 while (curr_addr < flash_size) {
Just4pLeisure 5:1775b4b13232 1276 // receive bytes from BIN file
Just4pLeisure 5:1775b4b13232 1277 //Get a byte - break if no more bytes to get
Just4pLeisure 5:1775b4b13232 1278 if (!fread(&file_buffer[0],1,0x2,fp)) {
Just4pLeisure 5:1775b4b13232 1279 fclose(fp);
Just4pLeisure 5:1775b4b13232 1280 printf("Error reading the BIN file MODIFIED.BIN");
Just4pLeisure 5:1775b4b13232 1281 break;
Just4pLeisure 5:1775b4b13232 1282 }
Just4pLeisure 5:1775b4b13232 1283 for(uint32_t i=0; i<2; i++) {
Just4pLeisure 5:1775b4b13232 1284 (word_value <<= 8) |= file_buffer[i];
Just4pLeisure 5:1775b4b13232 1285 }
Just4pLeisure 5:1775b4b13232 1286
Just4pLeisure 5:1775b4b13232 1287 // write the word if it is not 0xffff
Just4pLeisure 5:1775b4b13232 1288 if (word_value != 0xffff) {
Just4pLeisure 5:1775b4b13232 1289 if (!flash_func(&curr_addr, word_value)) break;
Just4pLeisure 5:1775b4b13232 1290 }
Just4pLeisure 5:1775b4b13232 1291
Just4pLeisure 5:1775b4b13232 1292 if (!(curr_addr % 0x80)) {
Just4pLeisure 5:1775b4b13232 1293 printf("%6.2f\r", 100*(float)curr_addr/(float)flash_size );
Just4pLeisure 5:1775b4b13232 1294 // make the activity LED twinkle
Just4pLeisure 5:1775b4b13232 1295 ACTIVITYLEDON;
Just4pLeisure 5:1775b4b13232 1296 }
Just4pLeisure 5:1775b4b13232 1297 curr_addr += 2;
Just4pLeisure 5:1775b4b13232 1298 }
Just4pLeisure 1:d5452e398b76 1299 }
Just4pLeisure 1:d5452e398b76 1300 }
Just4pLeisure 1:d5452e398b76 1301 timer.stop();
Just4pLeisure 1:d5452e398b76 1302 fclose(fp);
Just4pLeisure 1:d5452e398b76 1303
Just4pLeisure 1:d5452e398b76 1304 if (curr_addr == flash_size) {
Just4pLeisure 5:1775b4b13232 1305 printf("100.00\r\n");
Just4pLeisure 1:d5452e398b76 1306 printf("Programming took %#.1f seconds.\r\n",timer.read());
Just4pLeisure 1:d5452e398b76 1307
Just4pLeisure 4:682d96ff6d79 1308 // "Just4pleisure;)" 'tag' in the empty space at the end of the FLASH chip
Just4pLeisure 4:682d96ff6d79 1309 // Removed for now because it conflicts with some information that Dilemma places in this empty space
Just4pLeisure 4:682d96ff6d79 1310 // and because it is unsafe for Trionic 8 ECUs which have much bigger BIN files and FLASH chips
Just4pLeisure 4:682d96ff6d79 1311 // reset_func();
Just4pLeisure 4:682d96ff6d79 1312 // for (uint8_t i = 0; i < 8; ++i) {
Just4pLeisure 4:682d96ff6d79 1313 // memread_word(&word_value, &flash_tag[i].addr);
Just4pLeisure 4:682d96ff6d79 1314 // flash_func(&flash_tag[i].addr, (flash_tag[i].val & word_value));
Just4pLeisure 4:682d96ff6d79 1315 // }
Just4pLeisure 4:682d96ff6d79 1316
Just4pLeisure 5:1775b4b13232 1317 } else {
Just4pLeisure 5:1775b4b13232 1318 printf("\r\n");
Just4pLeisure 5:1775b4b13232 1319 printf("Programming took %#.1f seconds.\r\n",timer.read());
Just4pLeisure 5:1775b4b13232 1320 printf("WARNING: Oh dear, I couldn't program the FLASH at address 0x%08x.\r\n", curr_addr);
Just4pLeisure 5:1775b4b13232 1321 }
Just4pLeisure 1:d5452e398b76 1322
Just4pLeisure 4:682d96ff6d79 1323 // reset flash
Just4pLeisure 1:d5452e398b76 1324 return (reset_func() && (curr_addr == flash_size)) ? TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 1325 }
Just4pLeisure 1:d5452e398b76 1326
Just4pLeisure 1:d5452e398b76 1327 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 1328 /**
Just4pLeisure 4:682d96ff6d79 1329 Resets an AM29Fxxx flash memory chip. MCU must be in background mode.
Just4pLeisure 1:d5452e398b76 1330
Just4pLeisure 4:682d96ff6d79 1331 @param none
Just4pLeisure 1:d5452e398b76 1332
Just4pLeisure 4:682d96ff6d79 1333 @return succ / fail
Just4pLeisure 1:d5452e398b76 1334 */
Just4pLeisure 4:682d96ff6d79 1335 bool reset_am29(void)
Just4pLeisure 4:682d96ff6d79 1336 {
Just4pLeisure 1:d5452e398b76 1337 // execute the reset command
Just4pLeisure 4:682d96ff6d79 1338 // uint32_t addr = 0xfffe;
Just4pLeisure 4:682d96ff6d79 1339 // return (memwrite_word(&addr, 0xf0f0) == TERM_OK);
Just4pLeisure 1:d5452e398b76 1340 // execute the algorithm
Just4pLeisure 1:d5452e398b76 1341 for (uint8_t i = 0; i < 3; ++i) {
Just4pLeisure 1:d5452e398b76 1342 if (memwrite_word(&am29_reset[i].addr, am29_reset[i].val) != TERM_OK) return false;
Just4pLeisure 1:d5452e398b76 1343 }
Just4pLeisure 1:d5452e398b76 1344 return true;
Just4pLeisure 1:d5452e398b76 1345 }
Just4pLeisure 1:d5452e398b76 1346
Just4pLeisure 1:d5452e398b76 1347 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 1348 /**
Just4pLeisure 4:682d96ff6d79 1349 Erases an AM29Fxxx flash memory chip and verifies the result; MCU must be
Just4pLeisure 4:682d96ff6d79 1350 in background mode.
Just4pLeisure 1:d5452e398b76 1351
Just4pLeisure 4:682d96ff6d79 1352 @return succ / fail
Just4pLeisure 1:d5452e398b76 1353 */
Just4pLeisure 4:682d96ff6d79 1354 bool erase_am29()
Just4pLeisure 4:682d96ff6d79 1355 {
Just4pLeisure 1:d5452e398b76 1356 // reset flash
Just4pLeisure 1:d5452e398b76 1357 if (!reset_am29()) {
Just4pLeisure 1:d5452e398b76 1358 return false;
Just4pLeisure 1:d5452e398b76 1359 }
Just4pLeisure 4:682d96ff6d79 1360 printf("Erasing AMD 29Fxxx FLASH chips.\r\n");
Just4pLeisure 4:682d96ff6d79 1361 printf("This can take up to a minute for a T8,\r\n");
Just4pLeisure 4:682d96ff6d79 1362 printf("30s for a T7 or 15s for a T5 ECU.\r\n");
Just4pLeisure 1:d5452e398b76 1363 // execute the algorithm
Just4pLeisure 1:d5452e398b76 1364 for (uint8_t i = 0; i < 6; ++i) {
Just4pLeisure 1:d5452e398b76 1365 if (memwrite_word(&am29_erase[i].addr, am29_erase[i].val) != TERM_OK) {
Just4pLeisure 1:d5452e398b76 1366 reset_am29();
Just4pLeisure 1:d5452e398b76 1367 return false;
Just4pLeisure 1:d5452e398b76 1368 }
Just4pLeisure 1:d5452e398b76 1369 }
Just4pLeisure 1:d5452e398b76 1370
Just4pLeisure 1:d5452e398b76 1371 // verify the result
Just4pLeisure 1:d5452e398b76 1372 uint32_t addr = 0x0;
Just4pLeisure 1:d5452e398b76 1373 uint16_t verify_value;
Just4pLeisure 1:d5452e398b76 1374
Just4pLeisure 5:1775b4b13232 1375 printf(" 0.0 seconds.\r");
Just4pLeisure 5:1775b4b13232 1376 timeout.reset();
Just4pLeisure 5:1775b4b13232 1377 timeout.start();
Just4pLeisure 5:1775b4b13232 1378 while (timeout.read() < 200.0) {
Just4pLeisure 5:1775b4b13232 1379 // Typical and Maximum Chip Programming times are 9 and 27 seconds for Am29BL802C
Just4pLeisure 5:1775b4b13232 1380 // Typical Chip erase time for Am29BL802C is 45 secinds, not including 0x00 programming prior to erasure.
Just4pLeisure 5:1775b4b13232 1381 // Allow for at least worst case 27 seconds programming to 0x00 + 3(?) * 45 typical erase time (162 seconds)
Just4pLeisure 5:1775b4b13232 1382 // Allow at least 200 seconds erase time 2,000 * (100ms + BDM memread time)
Just4pLeisure 5:1775b4b13232 1383 // NOTE: 29/39F010 and 29F400 erase times are considerably lower
Just4pLeisure 1:d5452e398b76 1384 if (memread_word(&verify_value, &addr) == TERM_OK && verify_value == 0xffff) {
Just4pLeisure 1:d5452e398b76 1385 // erase completed normally
Just4pLeisure 1:d5452e398b76 1386 reset_am29();
Just4pLeisure 4:682d96ff6d79 1387 printf("\n");
Just4pLeisure 1:d5452e398b76 1388 return true;
Just4pLeisure 1:d5452e398b76 1389 }
Just4pLeisure 4:682d96ff6d79 1390 // make the activity LED twinkle
Just4pLeisure 4:682d96ff6d79 1391 ACTIVITYLEDON;
Just4pLeisure 5:1775b4b13232 1392 printf("%5.1f\r", timeout.read());
Just4pLeisure 1:d5452e398b76 1393 }
Just4pLeisure 5:1775b4b13232 1394 // erase failed
Just4pLeisure 4:682d96ff6d79 1395 printf("\n");
Just4pLeisure 1:d5452e398b76 1396 reset_am29();
Just4pLeisure 1:d5452e398b76 1397 return false;
Just4pLeisure 1:d5452e398b76 1398 }
Just4pLeisure 1:d5452e398b76 1399
Just4pLeisure 1:d5452e398b76 1400 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 1401 /**
Just4pLeisure 4:682d96ff6d79 1402 Writes a word to AM29Fxxx flash memory chip and optionally verifies the
Just4pLeisure 4:682d96ff6d79 1403 result; MCU must be in background mode.
Just4pLeisure 1:d5452e398b76 1404
Just4pLeisure 4:682d96ff6d79 1405 @param addr destination address
Just4pLeisure 4:682d96ff6d79 1406 @param val value
Just4pLeisure 1:d5452e398b76 1407
Just4pLeisure 4:682d96ff6d79 1408 @return succ / fail
Just4pLeisure 1:d5452e398b76 1409 */
Just4pLeisure 4:682d96ff6d79 1410 bool flash_am29(const uint32_t* addr, uint16_t value)
Just4pLeisure 4:682d96ff6d79 1411 {
Just4pLeisure 1:d5452e398b76 1412
Just4pLeisure 1:d5452e398b76 1413 // execute the algorithm
Just4pLeisure 1:d5452e398b76 1414 for (uint8_t i = 0; i < 3; ++i) {
Just4pLeisure 1:d5452e398b76 1415 if (memwrite_word(&am29_write[i].addr, am29_write[i].val) != TERM_OK) {
Just4pLeisure 1:d5452e398b76 1416 reset_am29();
Just4pLeisure 1:d5452e398b76 1417 return false;
Just4pLeisure 1:d5452e398b76 1418 }
Just4pLeisure 1:d5452e398b76 1419 }
Just4pLeisure 1:d5452e398b76 1420 // write the value
Just4pLeisure 1:d5452e398b76 1421 if (memwrite_word(addr, value) != TERM_OK) {
Just4pLeisure 1:d5452e398b76 1422 reset_am29();
Just4pLeisure 1:d5452e398b76 1423 return false;
Just4pLeisure 1:d5452e398b76 1424 }
Just4pLeisure 1:d5452e398b76 1425 // verify the result
Just4pLeisure 5:1775b4b13232 1426 timeout.reset();
Just4pLeisure 5:1775b4b13232 1427 timeout.start();
Just4pLeisure 5:1775b4b13232 1428 while (timeout.read_us() < 500) {
Just4pLeisure 5:1775b4b13232 1429 // Typical and Maximum Word Programming times are 9us and 360us for Am29BL802C
Just4pLeisure 5:1775b4b13232 1430 // Allow at least 500 microseconds program time 500 * (1us + BDM memread time)
Just4pLeisure 5:1775b4b13232 1431 // NOTE: 29/39F010 and 29F400 programming times are considerably lower
Just4pLeisure 1:d5452e398b76 1432 uint16_t verify_value;
Just4pLeisure 1:d5452e398b76 1433 if ((memread_word(&verify_value, addr) == TERM_OK) &&
Just4pLeisure 1:d5452e398b76 1434 (verify_value == value)) {
Just4pLeisure 1:d5452e398b76 1435 // flashing successful
Just4pLeisure 1:d5452e398b76 1436 return true;
Just4pLeisure 1:d5452e398b76 1437 }
Just4pLeisure 1:d5452e398b76 1438 }
Just4pLeisure 1:d5452e398b76 1439 // writing failed
Just4pLeisure 1:d5452e398b76 1440 reset_am29();
Just4pLeisure 1:d5452e398b76 1441 return false;
Just4pLeisure 1:d5452e398b76 1442 }
Just4pLeisure 1:d5452e398b76 1443
Just4pLeisure 5:1775b4b13232 1444
Just4pLeisure 5:1775b4b13232 1445 //-----------------------------------------------------------------------------
Just4pLeisure 5:1775b4b13232 1446 /**
Just4pLeisure 5:1775b4b13232 1447 Writes a word to a FLASH memory chip and checks the result
Just4pLeisure 5:1775b4b13232 1448 MCU must be in background mode.
Just4pLeisure 5:1775b4b13232 1449
Just4pLeisure 5:1775b4b13232 1450 @param addr BDM driver address (0 to continue)
Just4pLeisure 5:1775b4b13232 1451 @param maxtime how long to allow driver to execute (milliseconds)
Just4pLeisure 5:1775b4b13232 1452
Just4pLeisure 5:1775b4b13232 1453 @return succ / fail
Just4pLeisure 5:1775b4b13232 1454 */
Just4pLeisure 5:1775b4b13232 1455 bool run_bdm_driver(uint32_t addr, uint32_t maxtime)
Just4pLeisure 5:1775b4b13232 1456 {
Just4pLeisure 5:1775b4b13232 1457 // Start BDM driver and allow it up to 200 milliseconds to update 256 Bytes
Just4pLeisure 5:1775b4b13232 1458 // Upto 25 pulses per byte, 16us per pulse, 256 Bytes
Just4pLeisure 5:1775b4b13232 1459 // 25 * 16 * 256 = 102,400us plus overhead for driver code execution time
Just4pLeisure 5:1775b4b13232 1460 // Allowing up to 200 milliseconds seems like a good allowance.
Just4pLeisure 5:1775b4b13232 1461 uint32_t driverAddress = addr;
Just4pLeisure 5:1775b4b13232 1462 if (run_chip(&driverAddress) != TERM_OK) {
Just4pLeisure 5:1775b4b13232 1463 printf("Failed to start BDM driver.\r\n");
Just4pLeisure 5:1775b4b13232 1464 return false;
Just4pLeisure 5:1775b4b13232 1465 }
Just4pLeisure 5:1775b4b13232 1466 timeout.reset();
Just4pLeisure 5:1775b4b13232 1467 timeout.start();
Just4pLeisure 5:1775b4b13232 1468 // T5 ECUs' BDM interface seem to have problems when the running the CPU and
Just4pLeisure 5:1775b4b13232 1469 // sometimes shows the CPU briefly switching between showing BDM mode or that
Just4pLeisure 5:1775b4b13232 1470 // the CPU is running.
Just4pLeisure 5:1775b4b13232 1471 // I 'debounce' the interface state to workaround this erratic bahaviour
Just4pLeisure 5:1775b4b13232 1472 for (uint32_t debounce = 0; debounce < 5; debounce++) {
Just4pLeisure 5:1775b4b13232 1473 while (IS_RUNNING) {
Just4pLeisure 5:1775b4b13232 1474 debounce = 0;
Just4pLeisure 5:1775b4b13232 1475 if (timeout.read_ms() > maxtime) {
Just4pLeisure 5:1775b4b13232 1476 printf("Driver did not return to BDM mode.\r\n");
Just4pLeisure 5:1775b4b13232 1477 timeout.stop();
Just4pLeisure 5:1775b4b13232 1478 return false;
Just4pLeisure 5:1775b4b13232 1479 }
Just4pLeisure 5:1775b4b13232 1480 }
Just4pLeisure 5:1775b4b13232 1481 wait_us(1);
Just4pLeisure 5:1775b4b13232 1482 }
Just4pLeisure 5:1775b4b13232 1483 timeout.stop();
Just4pLeisure 5:1775b4b13232 1484 // Check return code in D0 register (0 - OK, 1 - FAILED)
Just4pLeisure 5:1775b4b13232 1485 uint32_t result = 1;
Just4pLeisure 5:1775b4b13232 1486 if (adreg_read(&result, 0x0) != TERM_OK) {
Just4pLeisure 5:1775b4b13232 1487 printf("Failed to read BDM register.\r\n");
Just4pLeisure 5:1775b4b13232 1488 return false;
Just4pLeisure 5:1775b4b13232 1489 }
Just4pLeisure 5:1775b4b13232 1490 return (result == 1) ? false : true;
Just4pLeisure 5:1775b4b13232 1491 }
Just4pLeisure 5:1775b4b13232 1492
Just4pLeisure 5:1775b4b13232 1493
Just4pLeisure 1:d5452e398b76 1494 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 1495 /**
Just4pLeisure 4:682d96ff6d79 1496 Resets a AM28Fxxx flash memory chip. MCU must be in background mode.
Just4pLeisure 1:d5452e398b76 1497
Just4pLeisure 4:682d96ff6d79 1498 @param start_addr flash start address
Just4pLeisure 1:d5452e398b76 1499
Just4pLeisure 4:682d96ff6d79 1500 @return succ / fail
Just4pLeisure 1:d5452e398b76 1501 */
Just4pLeisure 4:682d96ff6d79 1502 bool reset_am28(void)
Just4pLeisure 4:682d96ff6d79 1503 {
Just4pLeisure 1:d5452e398b76 1504 uint32_t start_addr = 0x0;
Just4pLeisure 2:bf3a2b29259a 1505 return (memwrite_word_write_word(&start_addr, 0xffff, 0xffff) == TERM_OK);
Just4pLeisure 1:d5452e398b76 1506 }
Just4pLeisure 1:d5452e398b76 1507
Just4pLeisure 1:d5452e398b76 1508 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 1509 /**
Just4pLeisure 4:682d96ff6d79 1510 Erases an AM28Fxxx flash memory chip and verifies the result; MCU must be
Just4pLeisure 4:682d96ff6d79 1511 in background mode.
Just4pLeisure 1:d5452e398b76 1512
Just4pLeisure 4:682d96ff6d79 1513 @param start_addr flash start address
Just4pLeisure 4:682d96ff6d79 1514 @param end_addr flash end address
Just4pLeisure 1:d5452e398b76 1515
Just4pLeisure 4:682d96ff6d79 1516 @return succ / fail
Just4pLeisure 1:d5452e398b76 1517 */
Just4pLeisure 4:682d96ff6d79 1518 bool erase_am28(const uint32_t* start_addr, const uint32_t* end_addr)
Just4pLeisure 4:682d96ff6d79 1519 {
Just4pLeisure 1:d5452e398b76 1520
Just4pLeisure 1:d5452e398b76 1521 // check the addresses
Just4pLeisure 1:d5452e398b76 1522 if (!start_addr || !end_addr) return false;
Just4pLeisure 1:d5452e398b76 1523
Just4pLeisure 1:d5452e398b76 1524 // reset flash
Just4pLeisure 1:d5452e398b76 1525 if (!reset_am28()) return false;
Just4pLeisure 1:d5452e398b76 1526
Just4pLeisure 1:d5452e398b76 1527 // write zeroes over entire flash space
Just4pLeisure 1:d5452e398b76 1528 uint32_t addr = *start_addr;
Just4pLeisure 1:d5452e398b76 1529
Just4pLeisure 4:682d96ff6d79 1530 printf("First write 0x00 to all FLASH addresses.\r\n");
Just4pLeisure 4:682d96ff6d79 1531 printf(" 0.00 %% complete.\r");
Just4pLeisure 1:d5452e398b76 1532 while (addr < *end_addr) {
Just4pLeisure 1:d5452e398b76 1533 if (!flash_am28(&addr, 0x0000)) return false;
Just4pLeisure 1:d5452e398b76 1534 addr += 2;
Just4pLeisure 4:682d96ff6d79 1535 // // feedback to host computer
Just4pLeisure 4:682d96ff6d79 1536 // pc.putc(TERM_OK);
Just4pLeisure 5:1775b4b13232 1537 if (!(addr % 0x80)) {
Just4pLeisure 5:1775b4b13232 1538 // make the activity LED twinkle
Just4pLeisure 5:1775b4b13232 1539 ACTIVITYLEDON;
Just4pLeisure 4:682d96ff6d79 1540 printf("%6.2f\r", 100*(float)addr/(float)*end_addr );
Just4pLeisure 5:1775b4b13232 1541 }
Just4pLeisure 1:d5452e398b76 1542 }
Just4pLeisure 4:682d96ff6d79 1543 printf("\n");
Just4pLeisure 1:d5452e398b76 1544
Just4pLeisure 1:d5452e398b76 1545 // erase flash
Just4pLeisure 1:d5452e398b76 1546 addr = *start_addr;
Just4pLeisure 1:d5452e398b76 1547 uint8_t verify_value;
Just4pLeisure 1:d5452e398b76 1548
Just4pLeisure 4:682d96ff6d79 1549 printf("Now erasing FLASH and verfiying that all addresses are 0xFF.\r\n");
Just4pLeisure 4:682d96ff6d79 1550 printf(" 0.00 %% complete.\r");
Just4pLeisure 1:d5452e398b76 1551 uint16_t pulse_cnt = 0;
Just4pLeisure 1:d5452e398b76 1552 if (memwrite_byte_cmd(NULL) != TERM_OK) {
Just4pLeisure 1:d5452e398b76 1553 reset_am28();
Just4pLeisure 1:d5452e398b76 1554 return false;
Just4pLeisure 1:d5452e398b76 1555 }
Just4pLeisure 1:d5452e398b76 1556 while ((++pulse_cnt < 1000) && (addr < *end_addr)) {
Just4pLeisure 1:d5452e398b76 1557 // issue the erase command
Just4pLeisure 1:d5452e398b76 1558 if (memwrite_write_byte(&addr, 0x20) != TERM_OK ||
Just4pLeisure 1:d5452e398b76 1559 memwrite_write_byte(&addr, 0x20) != TERM_OK) break;
Just4pLeisure 1:d5452e398b76 1560 wait_ms(10);
Just4pLeisure 1:d5452e398b76 1561
Just4pLeisure 1:d5452e398b76 1562 while (addr < *end_addr) {
Just4pLeisure 1:d5452e398b76 1563 // issue the verify command
Just4pLeisure 1:d5452e398b76 1564 if (memwrite_read_byte(&addr, 0xa0) != TERM_OK) break;
Just4pLeisure 4:682d96ff6d79 1565 // wait_us(6);
Just4pLeisure 1:d5452e398b76 1566 // check the written value
Just4pLeisure 1:d5452e398b76 1567 if (memread_write_byte(&verify_value, &addr) != TERM_OK) break;
Just4pLeisure 1:d5452e398b76 1568 if (verify_value != 0xff) break;
Just4pLeisure 1:d5452e398b76 1569 // succeeded need to check next address
Just4pLeisure 1:d5452e398b76 1570 addr++;
Just4pLeisure 1:d5452e398b76 1571 // make the activity LED twinkle
Just4pLeisure 4:682d96ff6d79 1572 ACTIVITYLEDON;
Just4pLeisure 5:1775b4b13232 1573 if (!(addr % 0x80)) {
Just4pLeisure 5:1775b4b13232 1574 // make the activity LED twinkle
Just4pLeisure 5:1775b4b13232 1575 ACTIVITYLEDON;
Just4pLeisure 4:682d96ff6d79 1576 printf("%6.2f\r", 100*(float)addr/(float)*end_addr );
Just4pLeisure 5:1775b4b13232 1577 }
Just4pLeisure 1:d5452e398b76 1578 }
Just4pLeisure 1:d5452e398b76 1579 }
Just4pLeisure 4:682d96ff6d79 1580 printf("\n");
Just4pLeisure 1:d5452e398b76 1581 // the erase process ends with a BDM_WRITE + BDM_BYTESIZE command left in the BDM
Just4pLeisure 1:d5452e398b76 1582 // it is safe to use it to put one of the FLASH chips into read mode and thereby
Just4pLeisure 1:d5452e398b76 1583 // leave the BDM ready for the next command
Just4pLeisure 1:d5452e398b76 1584 memwrite_nop_byte(start_addr, 0x00);
Just4pLeisure 1:d5452e398b76 1585
Just4pLeisure 1:d5452e398b76 1586 reset_am28();
Just4pLeisure 1:d5452e398b76 1587 // check for success
Just4pLeisure 1:d5452e398b76 1588 return (addr == *end_addr) ? true : false;
Just4pLeisure 1:d5452e398b76 1589 }
Just4pLeisure 1:d5452e398b76 1590
Just4pLeisure 1:d5452e398b76 1591 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 1592 /**
Just4pLeisure 4:682d96ff6d79 1593 Writes a byte to AM28Fxxx flash memory chip and verifies the result
Just4pLeisure 4:682d96ff6d79 1594 A so called 'mask' method checks the FLASH contents and only tries
Just4pLeisure 4:682d96ff6d79 1595 to program bytes that need to be programmed.
Just4pLeisure 4:682d96ff6d79 1596 MCU must be in background mode.
Just4pLeisure 1:d5452e398b76 1597
Just4pLeisure 4:682d96ff6d79 1598 @param addr destination address
Just4pLeisure 4:682d96ff6d79 1599 @param val value
Just4pLeisure 1:d5452e398b76 1600
Just4pLeisure 4:682d96ff6d79 1601 @return succ / fail
Just4pLeisure 1:d5452e398b76 1602 */
Just4pLeisure 4:682d96ff6d79 1603 bool flash_am28(const uint32_t* addr, uint16_t value)
Just4pLeisure 4:682d96ff6d79 1604 {
Just4pLeisure 1:d5452e398b76 1605
Just4pLeisure 1:d5452e398b76 1606 if (!addr) return false;
Just4pLeisure 1:d5452e398b76 1607
Just4pLeisure 1:d5452e398b76 1608 uint8_t pulse_cnt = 0;
Just4pLeisure 1:d5452e398b76 1609 uint16_t verify_value = 0;
Just4pLeisure 1:d5452e398b76 1610 uint16_t mask_value = 0xffff;
Just4pLeisure 1:d5452e398b76 1611
Just4pLeisure 1:d5452e398b76 1612 // put flash into read mode and read address
Just4pLeisure 1:d5452e398b76 1613 if (memwrite_word_read_word(&verify_value, addr, 0x0000) != TERM_OK) return false;
Just4pLeisure 1:d5452e398b76 1614 // return if FLASH already has the correct value - e.g. not all of the FLASH is used and is 0xff
Just4pLeisure 1:d5452e398b76 1615 if (verify_value == value) return true;
Just4pLeisure 1:d5452e398b76 1616
Just4pLeisure 1:d5452e398b76 1617 while (++pulse_cnt < 25) {
Just4pLeisure 1:d5452e398b76 1618
Just4pLeisure 1:d5452e398b76 1619 // set a mask
Just4pLeisure 2:bf3a2b29259a 1620 if ((uint8_t)verify_value == (uint8_t)value)
Just4pLeisure 2:bf3a2b29259a 1621 mask_value &= 0xff00;
Just4pLeisure 2:bf3a2b29259a 1622 if ((uint8_t)(verify_value >> 8) == (uint8_t)(value >> 8))
Just4pLeisure 2:bf3a2b29259a 1623 mask_value &= 0x00ff;
Just4pLeisure 1:d5452e398b76 1624
Just4pLeisure 1:d5452e398b76 1625 // write the new value
Just4pLeisure 1:d5452e398b76 1626 if (memwrite_word_write_word(addr, (0x4040 & mask_value), value) != TERM_OK) break;
Just4pLeisure 1:d5452e398b76 1627 // NOTE the BDM interface is slow enough that there is no need for a 10us delay before verifying
Just4pLeisure 1:d5452e398b76 1628 // issue the verification command
Just4pLeisure 1:d5452e398b76 1629 // NOTE the BDM interface is slow enough that there is no need for a 6us delay before reading back
Just4pLeisure 1:d5452e398b76 1630 if (memwrite_word_read_word(&verify_value, addr, (0xc0c0 & mask_value)) != TERM_OK) break;
Just4pLeisure 1:d5452e398b76 1631 // check if flashing was successful;
Just4pLeisure 1:d5452e398b76 1632 if (verify_value == value) return true;
Just4pLeisure 1:d5452e398b76 1633 }
Just4pLeisure 1:d5452e398b76 1634
Just4pLeisure 1:d5452e398b76 1635 // something went wrong; reset the flash chip and return failed
Just4pLeisure 1:d5452e398b76 1636 reset_am28();
Just4pLeisure 1:d5452e398b76 1637 return false;
Just4pLeisure 1:d5452e398b76 1638 }
Just4pLeisure 1:d5452e398b76 1639
Just4pLeisure 1:d5452e398b76 1640 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 1641 /**
Just4pLeisure 4:682d96ff6d79 1642 Does the equivalent of do prept5.do in BD32
Just4pLeisure 4:682d96ff6d79 1643 Sets up all of the control registers in the MC68332 so that we can program
Just4pLeisure 4:682d96ff6d79 1644 the FLASH chips
Just4pLeisure 1:d5452e398b76 1645
Just4pLeisure 4:682d96ff6d79 1646 @param none
Just4pLeisure 1:d5452e398b76 1647
Just4pLeisure 4:682d96ff6d79 1648 @return succ / fail
Just4pLeisure 1:d5452e398b76 1649 */
Just4pLeisure 1:d5452e398b76 1650
Just4pLeisure 4:682d96ff6d79 1651 //uint8_t prep_t5_do(void) {
Just4pLeisure 4:682d96ff6d79 1652 uint8_t prep_t8_do(void)
Just4pLeisure 4:682d96ff6d79 1653 {
Just4pLeisure 1:d5452e398b76 1654
Just4pLeisure 1:d5452e398b76 1655 // reset and freeze the MC68332 chip
Just4pLeisure 1:d5452e398b76 1656 if (restart_chip() != TERM_OK) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 1657
Just4pLeisure 1:d5452e398b76 1658 // set the 'fc' registers to allow supervisor mode access
Just4pLeisure 1:d5452e398b76 1659 uint32_t long_value = 0x05;
Just4pLeisure 1:d5452e398b76 1660 if (sysreg_write(0x0e, &long_value) != TERM_OK) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 1661 if (sysreg_write(0x0f, &long_value) != TERM_OK) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 1662
Just4pLeisure 4:682d96ff6d79 1663 // Set MC68332 to 16 MHz (actually 16.78 MHz) (SYNCR)
Just4pLeisure 1:d5452e398b76 1664 long_value = 0x00fffa04;
Just4pLeisure 1:d5452e398b76 1665 if (memwrite_word(&long_value, 0x7f00) != TERM_OK) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 1666
Just4pLeisure 4:682d96ff6d79 1667 // Disable watchdog and monitors (SYPCR)
Just4pLeisure 1:d5452e398b76 1668 long_value = 0x00fffa21;
Just4pLeisure 1:d5452e398b76 1669 if (memwrite_byte(&long_value, 0x00) != TERM_OK) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 1670
Just4pLeisure 4:682d96ff6d79 1671
Just4pLeisure 4:682d96ff6d79 1672 // Chip select pin assignments (CSPAR0)
Just4pLeisure 1:d5452e398b76 1673 long_value = 0x00fffa44;
Just4pLeisure 1:d5452e398b76 1674 if (memwrite_word(&long_value, 0x3fff) != TERM_OK) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 1675
Just4pLeisure 4:682d96ff6d79 1676 // Boot Chip select read only, one wait state (CSBARBT)
Just4pLeisure 1:d5452e398b76 1677 long_value = 0x00fffa48;
Just4pLeisure 1:d5452e398b76 1678 if (memwrite_word(&long_value, 0x0007) != TERM_OK) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 1679 if (memfill_word(0x6870) != TERM_OK) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 1680
Just4pLeisure 4:682d96ff6d79 1681 // Chip select 1 and 2 upper lower bytes, zero wait states (CSBAR1, CSOR1, CSBAR2, CSBAR2)
Just4pLeisure 1:d5452e398b76 1682 long_value = 0x00fffa50;
Just4pLeisure 1:d5452e398b76 1683 if (memwrite_word(&long_value, 0x0007) != TERM_OK) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 1684 if (memfill_word(0x3030) != TERM_OK) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 1685 if (memfill_word(0x0007) != TERM_OK) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 1686 if (memfill_word(0x5030) != TERM_OK) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 1687
Just4pLeisure 4:682d96ff6d79 1688 // PQS Data - turn on VPPH (PORTQS)
Just4pLeisure 1:d5452e398b76 1689 long_value = 0x00fffc14;
Just4pLeisure 1:d5452e398b76 1690 if (memwrite_word(&long_value, 0x0040) != TERM_OK) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 1691
Just4pLeisure 4:682d96ff6d79 1692 // PQS Data Direction output (DDRQS)
Just4pLeisure 1:d5452e398b76 1693 long_value = 0x00fffc17;
Just4pLeisure 1:d5452e398b76 1694 if (memwrite_byte(&long_value, 0x40) != TERM_OK) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 1695 // wait for programming voltage to be ready
Just4pLeisure 1:d5452e398b76 1696 wait_ms(10);
Just4pLeisure 1:d5452e398b76 1697
Just4pLeisure 4:682d96ff6d79 1698 // // Enable internal 2kByte RAM of 68332 at address 0x00100000 (TRAMBAR)
Just4pLeisure 4:682d96ff6d79 1699 // long_value = 0x00fffb04;
Just4pLeisure 4:682d96ff6d79 1700 // if (memwrite_word(&long_value, 0x1000) != TERM_OK) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 1701 return TERM_OK;
Just4pLeisure 1:d5452e398b76 1702 }
Just4pLeisure 1:d5452e398b76 1703
Just4pLeisure 1:d5452e398b76 1704 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 1705 /**
Just4pLeisure 4:682d96ff6d79 1706 Does the equivalent of do prept5/7/8.do in BD32
Just4pLeisure 4:682d96ff6d79 1707 Sets up all of the control registers in the MC68332/377 so that we can
Just4pLeisure 4:682d96ff6d79 1708 program the FLASH chips
Just4pLeisure 4:682d96ff6d79 1709
Just4pLeisure 4:682d96ff6d79 1710 @param none
Just4pLeisure 4:682d96ff6d79 1711
Just4pLeisure 4:682d96ff6d79 1712 @return succ / fail
Just4pLeisure 4:682d96ff6d79 1713 */
Just4pLeisure 4:682d96ff6d79 1714
Just4pLeisure 4:682d96ff6d79 1715 uint8_t prep_t5_do(void)
Just4pLeisure 4:682d96ff6d79 1716 {
Just4pLeisure 5:1775b4b13232 1717 // Make sure that BDM clock is SLOW
Just4pLeisure 5:1775b4b13232 1718 bdm_clk_mode(SLOW);
Just4pLeisure 4:682d96ff6d79 1719 // reset and freeze the MC68332/377 chip
Just4pLeisure 4:682d96ff6d79 1720 if (restart_chip() != TERM_OK) return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 1721
Just4pLeisure 4:682d96ff6d79 1722 // define some variables to store address and data values
Just4pLeisure 4:682d96ff6d79 1723 uint32_t long_value = 0x05;
Just4pLeisure 4:682d96ff6d79 1724 uint16_t verify_value;
Just4pLeisure 4:682d96ff6d79 1725
Just4pLeisure 4:682d96ff6d79 1726 // set the 'fc' registers to allow supervisor mode access
Just4pLeisure 4:682d96ff6d79 1727 if (sysreg_write(0x0e, &long_value) != TERM_OK) return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 1728 if (sysreg_write(0x0f, &long_value) != TERM_OK) return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 1729
Just4pLeisure 4:682d96ff6d79 1730 // Read MC68332/377 Module Control Register (SIMCR/MCR)
Just4pLeisure 4:682d96ff6d79 1731 // and use the value to work out if ECU is a T5/7 or a T8
Just4pLeisure 4:682d96ff6d79 1732 long_value = 0x00fffa00;
Just4pLeisure 4:682d96ff6d79 1733 if (memread_word(&verify_value, &long_value) != TERM_OK) return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 1734 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Just4pLeisure 4:682d96ff6d79 1735 // verify_value = 0x7E4F;
Just4pLeisure 4:682d96ff6d79 1736 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Just4pLeisure 4:682d96ff6d79 1737 // MC68377 MCR = x111111x01001111 binary after a reset
Just4pLeisure 4:682d96ff6d79 1738 if ((verify_value & 0x7E4F) == 0x7E4F) {
Just4pLeisure 4:682d96ff6d79 1739 printf ("I have found a Trionic 8 ECU.\r\n");
Just4pLeisure 5:1775b4b13232 1740 // Stop system protection (MDR bit 0 STOP-SYS-PROT)
Just4pLeisure 5:1775b4b13232 1741 long_value = 0x00fffa04;
Just4pLeisure 5:1775b4b13232 1742 if (memwrite_byte(&long_value, 0x01) != TERM_OK) return TERM_ERR;
Just4pLeisure 5:1775b4b13232 1743 // Set MC68377 to double it's default speed (16 MHz?) (SYNCR)
Just4pLeisure 4:682d96ff6d79 1744 long_value = 0x00fffa08;
Just4pLeisure 4:682d96ff6d79 1745 // First set the MFD part (change 4x to 8x)
Just4pLeisure 4:682d96ff6d79 1746 if (memwrite_word(&long_value, 0x6908) != TERM_OK) return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 1747 // wait for everything to settle (should really check the PLL lock register)
Just4pLeisure 4:682d96ff6d79 1748 wait_ms(100);
Just4pLeisure 4:682d96ff6d79 1749 // Now set the RFD part (change /2 to /1)
Just4pLeisure 4:682d96ff6d79 1750 if (memwrite_word(&long_value, 0x6808) != TERM_OK) return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 1751 // Disable watchdog and monitors (SYPCR)
Just4pLeisure 4:682d96ff6d79 1752 long_value = 0x00fffa50;
Just4pLeisure 4:682d96ff6d79 1753 if (memwrite_word(&long_value, 0x0000) != TERM_OK) return TERM_ERR;
Just4pLeisure 5:1775b4b13232 1754 // Enable internal 6kByte RAM of 68377 at address 0x00100000 (DPTRAM)
Just4pLeisure 5:1775b4b13232 1755 long_value = 0x00fff684;
Just4pLeisure 5:1775b4b13232 1756 if (memwrite_word(&long_value, 0x1000) != TERM_OK) return TERM_ERR;
Just4pLeisure 5:1775b4b13232 1757 // can use fast or turbo or nitrous BDM clock mode once ECU has been prepped and CPU clock is ??MHz
Just4pLeisure 5:1775b4b13232 1758 // bdm_clk_mode(NITROUS);
Just4pLeisure 4:682d96ff6d79 1759 }
Just4pLeisure 4:682d96ff6d79 1760 // MC68332 SIMCR = 0000x00011001111 binary after a reset
Just4pLeisure 4:682d96ff6d79 1761 //if ((verify_value & 0x00CF) == 0x00CF) {
Just4pLeisure 4:682d96ff6d79 1762 else {
Just4pLeisure 4:682d96ff6d79 1763 printf ("I have found a Trionic 5 or 7 ECU.\r\n");
Just4pLeisure 4:682d96ff6d79 1764 // Set MC68332 to 16 MHz (actually 16.78 MHz) (SYNCR)
Just4pLeisure 4:682d96ff6d79 1765 long_value = 0x00fffa04;
Just4pLeisure 4:682d96ff6d79 1766 if (memwrite_word(&long_value, 0x7f00) != TERM_OK) return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 1767 // Disable watchdog and monitors (SYPCR)
Just4pLeisure 4:682d96ff6d79 1768 long_value = 0x00fffa21;
Just4pLeisure 4:682d96ff6d79 1769 if (memwrite_byte(&long_value, 0x00) != TERM_OK) return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 1770 // Chip select pin assignments (CSPAR0)
Just4pLeisure 4:682d96ff6d79 1771 long_value = 0x00fffa44;
Just4pLeisure 4:682d96ff6d79 1772 if (memwrite_word(&long_value, 0x3fff) != TERM_OK) return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 1773 // Boot Chip select read only, one wait state (CSBARBT)
Just4pLeisure 4:682d96ff6d79 1774 long_value = 0x00fffa48;
Just4pLeisure 4:682d96ff6d79 1775 if (memwrite_word(&long_value, 0x0007) != TERM_OK) return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 1776 if (memfill_word(0x6870) != TERM_OK) return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 1777 // Chip select 1 and 2 upper lower bytes, zero wait states (CSBAR1, CSOR1, CSBAR2, CSBAR2)
Just4pLeisure 4:682d96ff6d79 1778 long_value = 0x00fffa50;
Just4pLeisure 4:682d96ff6d79 1779 if (memwrite_word(&long_value, 0x0007) != TERM_OK) return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 1780 if (memfill_word(0x3030) != TERM_OK) return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 1781 if (memfill_word(0x0007) != TERM_OK) return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 1782 if (memfill_word(0x5030) != TERM_OK) return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 1783 // PQS Data - turn on VPPH (PORTQS)
Just4pLeisure 4:682d96ff6d79 1784 long_value = 0x00fffc14;
Just4pLeisure 4:682d96ff6d79 1785 if (memwrite_word(&long_value, 0x0040) != TERM_OK) return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 1786 // PQS Data Direction output (DDRQS)
Just4pLeisure 4:682d96ff6d79 1787 long_value = 0x00fffc17;
Just4pLeisure 4:682d96ff6d79 1788 if (memwrite_byte(&long_value, 0x40) != TERM_OK) return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 1789 // wait for programming voltage to be ready
Just4pLeisure 4:682d96ff6d79 1790 wait_ms(10);
Just4pLeisure 4:682d96ff6d79 1791 // Enable internal 2kByte RAM of 68332 at address 0x00100000 (TRAMBAR)
Just4pLeisure 5:1775b4b13232 1792 long_value = 0x00fffb04;
Just4pLeisure 5:1775b4b13232 1793 if (memwrite_word(&long_value, 0x1000) != TERM_OK) return TERM_ERR;
Just4pLeisure 5:1775b4b13232 1794 // can use fast or turbo BDM clock mode once ECU has been prepped and CPU clock is 16MHz
Just4pLeisure 5:1775b4b13232 1795 // bdm_clk_mode(TURBO);
Just4pLeisure 5:1775b4b13232 1796 // bdm_clk_mode(FAST);
Just4pLeisure 4:682d96ff6d79 1797 }
Just4pLeisure 5:1775b4b13232 1798 return TERM_OK;
Just4pLeisure 4:682d96ff6d79 1799 }
Just4pLeisure 4:682d96ff6d79 1800
Just4pLeisure 4:682d96ff6d79 1801
Just4pLeisure 4:682d96ff6d79 1802 //-----------------------------------------------------------------------------
Just4pLeisure 4:682d96ff6d79 1803 /**
Just4pLeisure 1:d5452e398b76 1804 Works out what type of flash chip is fitted in the ECU by reading
Just4pLeisure 1:d5452e398b76 1805 the manufacturer byte codes.
Just4pLeisure 1:d5452e398b76 1806 It is enough to use the 29Fxxx flash id algorithm because 28Fxxx
Just4pLeisure 1:d5452e398b76 1807 FLASH chips ignore the first few writes needed by the 29Fxxx chips
Just4pLeisure 1:d5452e398b76 1808 MCU must be in background mode.
Just4pLeisure 1:d5452e398b76 1809
Just4pLeisure 1:d5452e398b76 1810 @param make (out)
Just4pLeisure 1:d5452e398b76 1811 type (out)
Just4pLeisure 1:d5452e398b76 1812
Just4pLeisure 1:d5452e398b76 1813 @return succ / fail
Just4pLeisure 1:d5452e398b76 1814 */
Just4pLeisure 4:682d96ff6d79 1815 bool get_flash_id(uint8_t* make, uint8_t* type)
Just4pLeisure 4:682d96ff6d79 1816 {
Just4pLeisure 1:d5452e398b76 1817
Just4pLeisure 1:d5452e398b76 1818 uint32_t addr = 0x0;
Just4pLeisure 1:d5452e398b76 1819 uint32_t value;
Just4pLeisure 1:d5452e398b76 1820 bool ret;
Just4pLeisure 1:d5452e398b76 1821 // read id bytes algorithm for 29F010/400 FLASH chips
Just4pLeisure 1:d5452e398b76 1822 for (uint8_t i = 0; i < 3; ++i) {
Just4pLeisure 4:682d96ff6d79 1823 //printf("Getting FLASH chip ID.\r\n");
Just4pLeisure 4:682d96ff6d79 1824 if (memwrite_word(&am29_id[i].addr, am29_id[i].val) != TERM_OK) {
Just4pLeisure 4:682d96ff6d79 1825 printf("There was an error when I tried to request the FLASH chip ID.\r\n");
Just4pLeisure 4:682d96ff6d79 1826 return false;
Just4pLeisure 4:682d96ff6d79 1827 }
Just4pLeisure 1:d5452e398b76 1828 }
Just4pLeisure 4:682d96ff6d79 1829 if (memread_long(&value, &addr) != TERM_OK) {
Just4pLeisure 4:682d96ff6d79 1830 printf("Error Reading FLASH chip types in get_flash_id\r\n");
Just4pLeisure 4:682d96ff6d79 1831 return false;
Just4pLeisure 4:682d96ff6d79 1832 }
Just4pLeisure 2:bf3a2b29259a 1833 // *make = (uint8_t)(value >> 24);
Just4pLeisure 2:bf3a2b29259a 1834 // *type = (uint8_t)(value >> 8);
Just4pLeisure 2:bf3a2b29259a 1835 *make = (uint8_t)(value >> 16);
Just4pLeisure 2:bf3a2b29259a 1836 *type = (uint8_t)(value);
Just4pLeisure 1:d5452e398b76 1837 printf("FLASH id bytes: %08x, make: %02x, type: %02x\r\n", value, *make, *type);
Just4pLeisure 1:d5452e398b76 1838 switch (*type) {
Just4pLeisure 4:682d96ff6d79 1839 case AMD29BL802C:
Just4pLeisure 1:d5452e398b76 1840 case AMD29F400B:
Just4pLeisure 1:d5452e398b76 1841 case AMD29F400T:
Just4pLeisure 1:d5452e398b76 1842 case AMD29F010:
Just4pLeisure 1:d5452e398b76 1843 case AMD28F010:
Just4pLeisure 1:d5452e398b76 1844 case INTEL28F010:
Just4pLeisure 1:d5452e398b76 1845 case AMD28F512:
Just4pLeisure 1:d5452e398b76 1846 case INTEL28F512:
Just4pLeisure 1:d5452e398b76 1847 ret = true;
Just4pLeisure 1:d5452e398b76 1848 default:
Just4pLeisure 1:d5452e398b76 1849 ret = false;
Just4pLeisure 1:d5452e398b76 1850 }
Just4pLeisure 1:d5452e398b76 1851 return ret;
Just4pLeisure 1:d5452e398b76 1852 }
Just4pLeisure 1:d5452e398b76 1853
Just4pLeisure 1:d5452e398b76 1854 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 1855 // EOF
Just4pLeisure 1:d5452e398b76 1856 //-----------------------------------------------------------------------------