Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: bdmtrionic.cpp
- Revision:
- 5:1775b4b13232
- Parent:
- 4:682d96ff6d79
- Child:
- 6:2fbcbebed28c
--- a/bdmtrionic.cpp Wed Sep 11 11:55:51 2013 +0000
+++ b/bdmtrionic.cpp Sat Apr 25 17:07:08 2015 +0000
@@ -65,6 +65,7 @@
bool flash_am28(const uint32_t* addr, uint16_t value);
bool get_flash_id(uint8_t* make, uint8_t* type);
+bool run_bdm_driver(uint32_t addr, uint32_t maxtime);
//-----------------------------------------------------------------------------
/**
@@ -160,7 +161,14 @@
flash_size = T7FLASHSIZE;
break;
case AMD29F010:
- printf("I have found AMD29F010 type FLASH chips; I must be connected to a repaired T5.5 ECU :-)\r\n");
+ case SST39SF010:
+ case AMICA29010L:
+ printf("I have found 29/39F010 type FLASH chips; I must be connected to a repaired T5.5 ECU :-)\r\n");
+ reset_func = &reset_am29;
+ flash_size = T55FLASHSIZE;
+ break;
+ case ATMEL29C010:
+ printf("I have found Atmel 29C010 type FLASH chips; I must be connected to a repaired T5.5 ECU :-)\r\n");
reset_func = &reset_am29;
flash_size = T55FLASHSIZE;
break;
@@ -176,6 +184,11 @@
reset_func = &reset_am28;
flash_size = T52FLASHSIZE;
break;
+ case ATMEL29C512:
+ printf("I have found Atmel 29C512 type FLASH chips; I must be connected to a repaired T5.2 ECU :-)\r\n");
+ reset_func = &reset_am28;
+ flash_size = T52FLASHSIZE;
+ break;
default:
// unknown flash type
printf("I could not work out what FLASH chips or TRIONIC ECU I am connected to :-(\r\n");
@@ -207,15 +220,11 @@
while (byte_count < FILE_BUF_LENGTH) {
// get long word
if (memget_long(&long_value) != TERM_OK) return TERM_ERR;
- addr += 4;
// send memory value to file_buffer before saving to mbed 'disk'
- file_buffer[byte_count] = ((uint8_t)(long_value >> 24));
- file_buffer[byte_count+1] = ((uint8_t)(long_value >> 16));
- file_buffer[byte_count+2] = ((uint8_t)(long_value >> 8));
- file_buffer[byte_count+3] = ((uint8_t)long_value);
- byte_count +=4;
- // make the activity led twinkle
- ACTIVITYLEDON;
+ file_buffer[byte_count++] = ((uint8_t)(long_value >> 24));
+ file_buffer[byte_count++] = ((uint8_t)(long_value >> 16));
+ file_buffer[byte_count++] = ((uint8_t)(long_value >> 8));
+ file_buffer[byte_count++] = ((uint8_t)long_value);
}
fwrite(file_buffer, 1, FILE_BUF_LENGTH, fp);
if (ferror (fp)) {
@@ -224,8 +233,11 @@
return TERM_ERR;
}
printf("%6.2f\r", 100*(float)addr/(float)flash_size );
+ // make the activity led twinkle
+ ACTIVITYLEDON;
+ addr += FILE_BUF_LENGTH;
}
- printf("\n");
+ printf("100.00\r\n");
// should 'clear' the BDM connection here but bdm_clear won't compile from here
// instead do a memread (or anything really) but ignore the result because it's not needed for anything
memread_long(&long_value, &addr);
@@ -408,11 +420,19 @@
flash_size = T7FLASHSIZE;
break;
case AMD29F010:
- printf("I have found AMD29F010 type FLASH chips; I must be connected to a repaired T5.5 ECU :-)\r\n");
+ case SST39SF010:
+ case AMICA29010L:
+ printf("I have found 29/39F010 type FLASH chips; I must be connected to a repaired T5.5 ECU :-)\r\n");
reset_func = &reset_am29;
flash_func = &flash_am29;
flash_size = T55FLASHSIZE;
break;
+ case ATMEL29C010:
+ printf("I have found Atmel 29C010 type FLASH chips; I must be connected to a repaired T5.5 ECU :-)\r\n");
+ reset_func = &reset_am29;
+ flash_func = NULL;
+ flash_size = T55FLASHSIZE;
+ break;
case AMD28F010:
case INTEL28F010:
printf("I have found 28F010 type FLASH chips; I must be connected to a T5.5 ECU :-)\r\n");
@@ -427,20 +447,26 @@
flash_func = &flash_am28;
flash_size = T52FLASHSIZE;
break;
+ case ATMEL29C512:
+ printf("I have found Atmel 29C512 type FLASH chips; I must be connected to a repaired T5.2 ECU :-)\r\n");
+ reset_func = &reset_am29;
+ flash_func = NULL;
+ flash_size = T52FLASHSIZE;
+ break;
default:
// unknown flash type
printf("I could not work out what FLASH chips or TRIONIC ECU I am connected to :-(\r\n");
return TERM_ERR;
}
-
// reset the FLASH chips
- printf("Reset the FLASH chip(s) to prepare them for Erasing\r\n");
if (!reset_func()) return TERM_ERR;
+
printf("Checking the FLASH BIN file...\r\n");
- FILE *fp = fopen("/local/modified.hex", "r"); // Open "modified.hex" on the local file system for reading
+ FILE *fp = fopen("/local/modified.bin", "r"); // Open "modified.bin" on the local file system for reading
+// FILE *fp = fopen("/local/original.bin", "r"); // Open "original.bin" on the local file system for reading
if (!fp) {
- printf("Error: I could not find the BIN file MODIFIED.HEX\r\n");;
+ printf("Error: I could not find the BIN file MODIFIED.BIN\r\n");;
return TERM_ERR;
}
// obtain file size - it should match the size of the FLASH chips:
@@ -449,17 +475,13 @@
rewind (fp);
// read the initial stack pointer value in the BIN file - it should match the value expected for the type of ECU
- uint8_t stack_byte = 0;
+ uint8_t stack_bytes[4] = {0, 0, 0, 0};
uint32_t stack_long = 0;
- if (!fread(&stack_byte,1,1,fp)) return TERM_ERR;
- stack_long |= (stack_byte << 24);
- if (!fread(&stack_byte,1,1,fp)) return TERM_ERR;
- stack_long |= (stack_byte << 16);
- if (!fread(&stack_byte,1,1,fp)) return TERM_ERR;
- stack_long |= (stack_byte << 8);
- if (!fread(&stack_byte,1,1,fp)) return TERM_ERR;
- stack_long |= stack_byte;
+ if (!fread(&stack_bytes[0],1,4,fp)) return TERM_ERR;
rewind (fp);
+ for(uint32_t i=0; i<4; i++) {
+ (stack_long <<= 8) |= stack_bytes[i];
+ }
if (flash_size == T52FLASHSIZE && (file_size != T52FLASHSIZE || stack_long != T5POINTER)) {
fclose(fp);
@@ -486,86 +508,801 @@
return TERM_ERR;
}
- timer.reset();
- timer.start();
-
uint32_t curr_addr = 0;
switch (type) {
- // AM29Fxxx chips (retrofitted to Trionic 5.x; original to T7)
case AMD29BL802C:
- case AMD29F400B:
case AMD29F400T:
case AMD29F010:
- printf("Erasing 29BL802/F400/010 type FLASH chips...\r\n");
- if (!erase_am29()) {
- printf("WARNING: An error occured when I tried to erase the FLASH chips :-(\r\n");
- return TERM_ERR;
- }
- break;
- // AM28F010 chip (Trionic 5.x original)
+ case SST39SF010:
+ case AMICA29010L:
+ case ATMEL29C010:
case AMD28F010:
case INTEL28F010:
case AMD28F512:
case INTEL28F512:
- printf("Erasing 28F010/512 type FLASH chips...\r\n");
- if (!erase_am28(&curr_addr, &flash_size)) {
- printf("WARNING: An error occured when I tried to erase the FLASH chips :-(\r\n");
- return TERM_ERR;
- }
- break;
- default:
- // unknown flash type - shouldn't get here hence "Strange!"
- printf("Strange! I couldn't work out how to erase the FLASH chips in the TRIONIC ECU that I am connected to :-(\r\n");
- return TERM_ERR;
- }
+ case ATMEL29C512: {
+ // BDM FLASH Driver
+ /*
+ uint8_t flashDriver5[] = {\
+ 0x60,0x00,0x04,0x08,\
+ 0x7C,0x2F,0x2D,0x5C,0x2A,0x0D,0x00,0x00,\
+ 0x02,0x03,0x00,0x03,0x41,0xFA,0xFF,0xF6,\
+ 0x10,0xBB,0x30,0xEE,0x70,0x01,0x52,0x43,\
+ 0x4E,0x75,\
+ 0x20,0x7C,0x00,0xFF,0xFA,0x00,0x08,0x10,\
+ 0x00,0x04,0x66,0x4E,0xD0,0xFC,0x00,0x04,\
+ 0x10,0xFC,0x00,0x7F,0x08,0x10,0x00,0x03,\
+ 0x67,0xFA,0xD0,0xFC,0x00,0x1C,0x42,0x10,\
+ 0xD0,0xFC,0x00,0x23,0x30,0xBC,0x3F,0xFF,\
+ 0xD0,0xFC,0x00,0x04,0x70,0x07,0x30,0xC0,\
+ 0x30,0xBC,0x68,0x70,0xD0,0xFC,0x00,0x06,\
+ 0x30,0xC0,0x30,0xFC,0x30,0x30,0x30,0xC0,\
+ 0x30,0xBC,0x50,0x30,0xD0,0xFC,0x01,0xBE,\
+ 0x70,0x40,0x30,0xC0,0x30,0x80,0x30,0x3C,\
+ 0x55,0xF0,0x4E,0x71,0x51,0xC8,0xFF,0xFC,\
+ 0x60,0x18,0xD0,0xFC,0x00,0x08,0x30,0xFC,\
+ 0x69,0x08,0x08,0x10,0x00,0x09,0x67,0xFA,\
+ 0x31,0x3C,0x68,0x08,0xD0,0xFC,0x00,0x48,\
+ 0x42,0x50,0x4E,0x75,\
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
+ 0x00,0x00,0x2C,0x3C,0x00,0x00,0x55,0x55,\
+ 0x2E,0x3C,0x00,0x00,0xAA,0xAA,0x2A,0x46,\
+ 0x53,0x8D,0x2C,0x47,0x45,0xF8,0x00,0x00,\
+ 0x47,0xFA,0xFF,0xDE,0x3C,0x87,0x3A,0x86,\
+ 0x3C,0xBC,0x90,0x90,0x36,0xDA,0x36,0x92,\
+ 0x3C,0x87,0x3A,0x86,0x3C,0xBC,0xF0,0xF0,\
+ 0x20,0x3A,0xFF,0xC6,0x72,0x02,0x48,0x41,\
+ 0x74,0x01,0x0C,0x00,0x00,0x25,0x67,0x50,\
+ 0x0C,0x00,0x00,0xB8,0x67,0x4A,0x74,0x04,\
+ 0x0C,0x00,0x00,0x5D,0x67,0x42,0x74,0x01,\
+ 0xE3,0x99,0x0C,0x00,0x00,0xA7,0x67,0x38,\
+ 0x0C,0x00,0x00,0xB4,0x67,0x32,0x74,0x02,\
+ 0x0C,0x00,0x00,0x20,0x67,0x2A,0x0C,0x00,\
+ 0x00,0xA4,0x67,0x24,0x0C,0x00,0x00,0xB5,\
+ 0x67,0x1E,0x74,0x04,0x0C,0x00,0x00,0xD5,\
+ 0x67,0x16,0x74,0x03,0xE3,0x99,0x0C,0x00,\
+ 0x00,0x23,0x67,0x0C,0xE3,0x99,0x0C,0x00,\
+ 0x00,0x81,0x67,0x04,0x72,0x00,0x74,0x00,\
+ 0x47,0xFA,0xFF,0x6A,0x26,0x81,0x47,0xFA,\
+ 0xFF,0x68,0x16,0x82,0x4E,0x75,\
+ 0x45,0x72,0x61,0x73,0x69,0x6E,0x67,0x20,\
+ 0x46,0x4C,0x41,0x53,0x48,0x20,0x63,0x68,\
+ 0x69,0x70,0x73,0x0D,0x0A,0x00,0x41,0xFA,\
+ 0xFF,0xE8,0x70,0x01,0x12,0x3A,0xFF,0x44,\
+ 0x53,0x01,0x67,0x16,0x53,0x01,0x67,0x00,\
+ 0x00,0xB8,0x53,0x01,0x67,0x00,0x01,0x0A,\
+ 0x53,0x01,0x67,0x00,0x01,0x3A,0x60,0x00,\
+ 0x01,0x3A,0x4B,0xF8,0x00,0x00,0x24,0x3A,\
+ 0xFF,0x1E,0x26,0x02,0x3A,0xBC,0xFF,0xFF,\
+ 0x3A,0xBC,0xFF,0xFF,0x42,0x55,0x4A,0x35,\
+ 0x28,0xFF,0x67,0x28,0x7A,0x19,0x1B,0xBC,\
+ 0x00,0x40,0x28,0xFF,0x42,0x35,0x28,0xFF,\
+ 0x72,0x15,0x4E,0x71,0x51,0xC9,0xFF,0xFC,\
+ 0x1B,0xBC,0x00,0xC0,0x28,0xFF,0x72,0x0C,\
+ 0x4E,0x71,0x51,0xC9,0xFF,0xFC,0x4A,0x35,\
+ 0x28,0xFF,0x66,0x06,0x53,0x82,0x66,0xCC,\
+ 0x60,0x04,0x53,0x45,0x66,0xD0,0x42,0x55,\
+ 0x4A,0x55,0x4A,0x05,0x67,0x00,0x00,0xE4,\
+ 0x24,0x03,0x50,0xC4,0x2A,0x3C,0x03,0xE8,\
+ 0x03,0xE8,0x72,0x20,0x1B,0x81,0x28,0xFF,\
+ 0x1B,0x81,0x28,0xFF,0x32,0x3C,0x55,0xF0,\
+ 0x4E,0x71,0x51,0xC9,0xFF,0xFC,0x4E,0xBA,\
+ 0xFE,0x24,0x1B,0xBC,0x00,0xA0,0x28,0xFF,\
+ 0x72,0x0C,0x4E,0x71,0x51,0xC9,0xFF,0xFC,\
+ 0xB8,0x35,0x28,0xFF,0x66,0x08,0x48,0x45,\
+ 0x53,0x82,0x66,0xE6,0x60,0x04,0x53,0x45,\
+ 0x66,0xC8,0x42,0x55,0x4A,0x55,0x4A,0x45,\
+ 0x67,0x00,0x00,0x98,0x60,0x00,0x00,0x90,\
+ 0x70,0x01,0x42,0x83,0x1D,0x87,0x08,0x00,\
+ 0x1B,0x86,0x08,0x00,0x1D,0xBC,0x00,0x80,\
+ 0x08,0x00,0x1D,0x87,0x08,0x00,0x1B,0x86,\
+ 0x08,0x00,0x1D,0xBC,0x00,0x10,0x08,0x00,\
+ 0x2A,0x00,0x4E,0xBA,0xFD,0xD0,0x20,0x05,\
+ 0x1A,0x30,0x09,0x90,0x08,0x05,0x00,0x07,\
+ 0x66,0x20,0x08,0x05,0x00,0x05,0x67,0xE8,\
+ 0x1A,0x30,0x09,0x90,0x08,0x05,0x00,0x07,\
+ 0x66,0x10,0x1D,0x87,0x08,0x00,0x1B,0x86,\
+ 0x08,0x00,0x1D,0xBC,0x00,0xF0,0x08,0x00,\
+ 0x60,0x40,0x53,0x80,0x67,0xAE,0x60,0x36,\
+ 0x42,0x83,0x3C,0x87,0x3A,0x86,0x3C,0xBC,\
+ 0x00,0x80,0x3C,0x87,0x3A,0x86,0x3C,0xBC,\
+ 0x00,0x10,0x4E,0xBA,0xFD,0x88,0x3A,0x15,\
+ 0x08,0x05,0x00,0x07,0x66,0x18,0x08,0x05,\
+ 0x00,0x05,0x67,0xEE,0x3A,0x15,0x08,0x05,\
+ 0x00,0x07,0x66,0x0A,0x3C,0x87,0x3A,0x86,\
+ 0x3C,0xBC,0x00,0xF0,0x60,0x04,0x42,0x80,\
+ 0x60,0x02,0x70,0x01,0x4E,0x75,\
+ 0x47,0xFB,0x01,0x70,0x00,0x00,0x04,0x50,\
+ 0x28,0x49,0x24,0x3C,0x00,0x00,0x01,0x00,\
+ 0x12,0x3A,0xFD,0xDA,0x53,0x01,0x67,0x14,\
+ 0x53,0x01,0x67,0x5A,0x53,0x01,0x67,0x00,\
+ 0x00,0xBC,0x53,0x01,0x67,0x00,0x01,0x00,\
+ 0x60,0x00,0x01,0x2E,0x10,0x33,0x28,0xFF,\
+ 0x0C,0x00,0x00,0xFF,0x67,0x28,0x7A,0x19,\
+ 0x19,0xBC,0x00,0x40,0x28,0xFF,0x19,0x80,\
+ 0x28,0xFF,0x72,0x15,0x4E,0x71,0x51,0xC9,\
+ 0xFF,0xFC,0x19,0xBC,0x00,0xC0,0x28,0xFF,\
+ 0x72,0x0C,0x4E,0x71,0x51,0xC9,0xFF,0xFC,\
+ 0xB0,0x34,0x28,0xFF,0x66,0x06,0x53,0x82,\
+ 0x66,0xCA,0x60,0x04,0x53,0x05,0x66,0xD0,\
+ 0x42,0x55,0x4A,0x55,0x4A,0x05,0x67,0x00,\
+ 0x00,0xE8,0x60,0x00,0x00,0xE0,0x20,0x0C,\
+ 0xD0,0x82,0xC0,0xBC,0x00,0x00,0x00,0x01,\
+ 0x08,0x40,0x00,0x00,0x16,0x33,0x28,0xFF,\
+ 0x0C,0x03,0x00,0xFF,0x67,0x48,0x1D,0x87,\
+ 0x08,0x00,0x1B,0x86,0x08,0x00,0x1D,0xBC,\
+ 0x00,0xA0,0x08,0x00,0x19,0x83,0x28,0xFF,\
+ 0xC6,0x3C,0x00,0x80,0x18,0x34,0x28,0xFF,\
+ 0x1A,0x04,0xC8,0x3C,0x00,0x80,0xB8,0x03,\
+ 0x67,0x24,0x08,0x05,0x00,0x05,0x67,0xEC,\
+ 0x18,0x34,0x28,0xFF,0xC8,0x3C,0x00,0x80,\
+ 0xB8,0x03,0x67,0x12,0x1D,0x87,0x08,0x00,\
+ 0x1B,0x86,0x08,0x00,0x1D,0xBC,0x00,0xF0,\
+ 0x08,0x00,0x60,0x00,0x00,0x84,0x53,0x82,\
+ 0x66,0xA6,0x60,0x78,0x36,0x33,0x28,0xFE,\
+ 0x0C,0x43,0xFF,0xFF,0x67,0x3A,0x3C,0x87,\
+ 0x3A,0x86,0x3C,0xBC,0x00,0xA0,0x39,0x83,\
+ 0x28,0xFE,0xC6,0x7C,0x00,0x80,0x38,0x34,\
+ 0x28,0xFE,0x3A,0x04,0xC8,0x7C,0x00,0x80,\
+ 0xB8,0x43,0x67,0x1C,0x08,0x05,0x00,0x05,\
+ 0x67,0xEC,0x38,0x34,0x28,0xFE,0xC8,0x7C,\
+ 0x00,0x80,0xB8,0x43,0x67,0x0A,0x3C,0x87,\
+ 0x3A,0x86,0x3C,0xBC,0x00,0xF0,0x60,0x38,\
+ 0x55,0x82,0x66,0xB8,0x60,0x2E,0x3C,0x87,\
+ 0x3A,0x86,0x3C,0xBC,0xA0,0xA0,0x39,0xB3,\
+ 0x28,0xFE,0x28,0xFE,0x55,0x82,0x66,0xF6,\
+ 0x32,0x3C,0x55,0xF0,0x4E,0x71,0x51,0xC9,\
+ 0xFF,0xFC,0x34,0x3C,0x01,0x00,0x36,0x33,\
+ 0x28,0xFE,0xB6,0x74,0x28,0xFE,0x66,0x08,\
+ 0x55,0x82,0x66,0xF2,0x42,0x80,0x60,0x02,\
+ 0x70,0x01,0x4E,0x75,\
+ 0x4F,0xFB,0x01,0x70,0x00,0x00,0x02,0xF4,\
+ 0x4E,0xBA,0xFC,0x0A,0x4E,0xBA,0xFC,0x84,\
+ 0x4E,0xBA,0xFD,0x32,0x4A,0xFA,0x42,0x80,\
+ 0x22,0x40,0x4E,0xBA,0xFE,0x88,0x4A,0xFA,\
+ 0xD2,0xFC,0x01,0x00,0x60,0xF4
+ };
- timer.stop();
- printf("Erasing took %#.1f seconds.\r\n",timer.read());
-
- printf("Programming the FLASH chips...\r\n");
+ uint8_t flashDriver6[] = {\
+ 0x60,0x00,0x04,0x0A,\
+ 0x7C,0x2F,0x2D,0x5C,0x2A,0x0D,0x00,0x00,\
+ 0x02,0x03,0x00,0x03,0x41,0xFA,0xFF,0xF6,\
+ 0x10,0xBB,0x30,0xEE,0x70,0x01,0x4A,0xFA,\
+ 0x52,0x43,0x4E,0x75,\
+ 0x20,0x7C,0x00,0xFF,0xFA,0x00,0x08,0x10,\
+ 0x00,0x04,0x66,0x4E,0xD0,0xFC,0x00,0x04,\
+ 0x10,0xFC,0x00,0x7F,0x08,0x10,0x00,0x03,\
+ 0x67,0xFA,0xD0,0xFC,0x00,0x1C,0x42,0x10,\
+ 0xD0,0xFC,0x00,0x23,0x30,0xBC,0x3F,0xFF,\
+ 0xD0,0xFC,0x00,0x04,0x70,0x07,0x30,0xC0,\
+ 0x30,0xBC,0x68,0x70,0xD0,0xFC,0x00,0x06,\
+ 0x30,0xC0,0x30,0xFC,0x30,0x30,0x30,0xC0,\
+ 0x30,0xBC,0x50,0x30,0xD0,0xFC,0x01,0xBE,\
+ 0x70,0x40,0x30,0xC0,0x30,0x80,0x30,0x3C,\
+ 0x55,0xF0,0x4E,0x71,0x51,0xC8,0xFF,0xFC,\
+ 0x60,0x18,0xD0,0xFC,0x00,0x08,0x30,0xFC,\
+ 0x69,0x08,0x08,0x10,0x00,0x09,0x67,0xFA,\
+ 0x31,0x3C,0x68,0x08,0xD0,0xFC,0x00,0x48,\
+ 0x42,0x50,0x4E,0x75,\
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
+ 0x00,0x00,0x2C,0x3C,0x00,0x00,0x55,0x55,\
+ 0x2E,0x3C,0x00,0x00,0xAA,0xAA,0x2A,0x46,\
+ 0x53,0x8D,0x2C,0x47,0x45,0xF8,0x00,0x00,\
+ 0x47,0xFA,0xFF,0xDE,0x3C,0x87,0x3A,0x86,\
+ 0x3C,0xBC,0x90,0x90,0x36,0xDA,0x36,0x92,\
+ 0x3C,0x87,0x3A,0x86,0x3C,0xBC,0xF0,0xF0,\
+ 0x20,0x3A,0xFF,0xC6,0x72,0x02,0x48,0x41,\
+ 0x74,0x01,0x0C,0x00,0x00,0x25,0x67,0x50,\
+ 0x0C,0x00,0x00,0xB8,0x67,0x4A,0x74,0x04,\
+ 0x0C,0x00,0x00,0x5D,0x67,0x42,0x74,0x01,\
+ 0xE3,0x99,0x0C,0x00,0x00,0xA7,0x67,0x38,\
+ 0x0C,0x00,0x00,0xB4,0x67,0x32,0x74,0x02,\
+ 0x0C,0x00,0x00,0x20,0x67,0x2A,0x0C,0x00,\
+ 0x00,0xA4,0x67,0x24,0x0C,0x00,0x00,0xB5,\
+ 0x67,0x1E,0x74,0x04,0x0C,0x00,0x00,0xD5,\
+ 0x67,0x16,0x74,0x03,0xE3,0x99,0x0C,0x00,\
+ 0x00,0x23,0x67,0x0C,0xE3,0x99,0x0C,0x00,\
+ 0x00,0x81,0x67,0x04,0x72,0x00,0x74,0x00,\
+ 0x47,0xFA,0xFF,0x6A,0x26,0x81,0x47,0xFA,\
+ 0xFF,0x68,0x16,0x82,0x4E,0x75,\
+ 0x45,0x72,0x61,0x73,0x69,0x6E,0x67,0x20,\
+ 0x46,0x4C,0x41,0x53,0x48,0x20,0x63,0x68,\
+ 0x69,0x70,0x73,0x0D,0x0A,0x00,0x41,0xFA,\
+ 0xFF,0xE8,0x70,0x01,0x12,0x3A,0xFF,0x44,\
+ 0x53,0x01,0x67,0x16,0x53,0x01,0x67,0x00,\
+ 0x00,0xB8,0x53,0x01,0x67,0x00,0x01,0x0A,\
+ 0x53,0x01,0x67,0x00,0x01,0x3A,0x60,0x00,\
+ 0x01,0x3A,0x4B,0xF8,0x00,0x00,0x24,0x3A,\
+ 0xFF,0x1E,0x26,0x02,0x3A,0xBC,0xFF,0xFF,\
+ 0x3A,0xBC,0xFF,0xFF,0x42,0x55,0x4A,0x35,\
+ 0x28,0xFF,0x67,0x28,0x7A,0x19,0x1B,0xBC,\
+ 0x00,0x40,0x28,0xFF,0x42,0x35,0x28,0xFF,\
+ 0x72,0x15,0x4E,0x71,0x51,0xC9,0xFF,0xFC,\
+ 0x1B,0xBC,0x00,0xC0,0x28,0xFF,0x72,0x0C,\
+ 0x4E,0x71,0x51,0xC9,0xFF,0xFC,0x4A,0x35,\
+ 0x28,0xFF,0x66,0x06,0x53,0x82,0x66,0xCC,\
+ 0x60,0x04,0x53,0x45,0x66,0xD0,0x42,0x55,\
+ 0x4A,0x55,0x4A,0x05,0x67,0x00,0x00,0xE4,\
+ 0x24,0x03,0x50,0xC4,0x2A,0x3C,0x03,0xE8,\
+ 0x03,0xE8,0x72,0x20,0x1B,0x81,0x28,0xFF,\
+ 0x1B,0x81,0x28,0xFF,0x32,0x3C,0x55,0xF0,\
+ 0x4E,0x71,0x51,0xC9,0xFF,0xFC,0x4E,0xBA,\
+ 0xFE,0x22,0x1B,0xBC,0x00,0xA0,0x28,0xFF,\
+ 0x72,0x0C,0x4E,0x71,0x51,0xC9,0xFF,0xFC,\
+ 0xB8,0x35,0x28,0xFF,0x66,0x08,0x48,0x45,\
+ 0x53,0x82,0x66,0xE6,0x60,0x04,0x53,0x45,\
+ 0x66,0xC8,0x42,0x55,0x4A,0x55,0x4A,0x45,\
+ 0x67,0x00,0x00,0x98,0x60,0x00,0x00,0x90,\
+ 0x70,0x01,0x42,0x83,0x1D,0x87,0x08,0x00,\
+ 0x1B,0x86,0x08,0x00,0x1D,0xBC,0x00,0x80,\
+ 0x08,0x00,0x1D,0x87,0x08,0x00,0x1B,0x86,\
+ 0x08,0x00,0x1D,0xBC,0x00,0x10,0x08,0x00,\
+ 0x2A,0x00,0x4E,0xBA,0xFD,0xCE,0x20,0x05,\
+ 0x1A,0x30,0x09,0x90,0x08,0x05,0x00,0x07,\
+ 0x66,0x20,0x08,0x05,0x00,0x05,0x67,0xE8,\
+ 0x1A,0x30,0x09,0x90,0x08,0x05,0x00,0x07,\
+ 0x66,0x10,0x1D,0x87,0x08,0x00,0x1B,0x86,\
+ 0x08,0x00,0x1D,0xBC,0x00,0xF0,0x08,0x00,\
+ 0x60,0x40,0x53,0x80,0x67,0xAE,0x60,0x36,\
+ 0x42,0x83,0x3C,0x87,0x3A,0x86,0x3C,0xBC,\
+ 0x00,0x80,0x3C,0x87,0x3A,0x86,0x3C,0xBC,\
+ 0x00,0x10,0x4E,0xBA,0xFD,0x86,0x3A,0x15,\
+ 0x08,0x05,0x00,0x07,0x66,0x18,0x08,0x05,\
+ 0x00,0x05,0x67,0xEE,0x3A,0x15,0x08,0x05,\
+ 0x00,0x07,0x66,0x0A,0x3C,0x87,0x3A,0x86,\
+ 0x3C,0xBC,0x00,0xF0,0x60,0x04,0x42,0x80,\
+ 0x60,0x02,0x70,0x01,0x4E,0x75,\
+ 0x47,0xFB,0x01,0x70,0x00,0x00,0x04,0x4E,\
+ 0x28,0x49,0x24,0x3C,0x00,0x00,0x01,0x00,\
+ 0x12,0x3A,0xFD,0xDA,0x53,0x01,0x67,0x14,\
+ 0x53,0x01,0x67,0x5A,0x53,0x01,0x67,0x00,\
+ 0x00,0xBC,0x53,0x01,0x67,0x00,0x01,0x00,\
+ 0x60,0x00,0x01,0x2E,0x10,0x33,0x28,0xFF,\
+ 0x0C,0x00,0x00,0xFF,0x67,0x28,0x7A,0x19,\
+ 0x19,0xBC,0x00,0x40,0x28,0xFF,0x19,0x80,\
+ 0x28,0xFF,0x72,0x15,0x4E,0x71,0x51,0xC9,\
+ 0xFF,0xFC,0x19,0xBC,0x00,0xC0,0x28,0xFF,\
+ 0x72,0x0C,0x4E,0x71,0x51,0xC9,0xFF,0xFC,\
+ 0xB0,0x34,0x28,0xFF,0x66,0x06,0x53,0x82,\
+ 0x66,0xCA,0x60,0x04,0x53,0x05,0x66,0xD0,\
+ 0x42,0x55,0x4A,0x55,0x4A,0x05,0x67,0x00,\
+ 0x00,0xE8,0x60,0x00,0x00,0xE0,0x20,0x0C,\
+ 0xD0,0x82,0xC0,0xBC,0x00,0x00,0x00,0x01,\
+ 0x08,0x40,0x00,0x00,0x16,0x33,0x28,0xFF,\
+ 0x0C,0x03,0x00,0xFF,0x67,0x48,0x1D,0x87,\
+ 0x08,0x00,0x1B,0x86,0x08,0x00,0x1D,0xBC,\
+ 0x00,0xA0,0x08,0x00,0x19,0x83,0x28,0xFF,\
+ 0xC6,0x3C,0x00,0x80,0x18,0x34,0x28,0xFF,\
+ 0x1A,0x04,0xC8,0x3C,0x00,0x80,0xB8,0x03,\
+ 0x67,0x24,0x08,0x05,0x00,0x05,0x67,0xEC,\
+ 0x18,0x34,0x28,0xFF,0xC8,0x3C,0x00,0x80,\
+ 0xB8,0x03,0x67,0x12,0x1D,0x87,0x08,0x00,\
+ 0x1B,0x86,0x08,0x00,0x1D,0xBC,0x00,0xF0,\
+ 0x08,0x00,0x60,0x00,0x00,0x84,0x53,0x82,\
+ 0x66,0xA6,0x60,0x78,0x36,0x33,0x28,0xFE,\
+ 0x0C,0x43,0xFF,0xFF,0x67,0x3A,0x3C,0x87,\
+ 0x3A,0x86,0x3C,0xBC,0x00,0xA0,0x39,0x83,\
+ 0x28,0xFE,0xC6,0x7C,0x00,0x80,0x38,0x34,\
+ 0x28,0xFE,0x3A,0x04,0xC8,0x7C,0x00,0x80,\
+ 0xB8,0x43,0x67,0x1C,0x08,0x05,0x00,0x05,\
+ 0x67,0xEC,0x38,0x34,0x28,0xFE,0xC8,0x7C,\
+ 0x00,0x80,0xB8,0x43,0x67,0x0A,0x3C,0x87,\
+ 0x3A,0x86,0x3C,0xBC,0x00,0xF0,0x60,0x38,\
+ 0x55,0x82,0x66,0xB8,0x60,0x2E,0x3C,0x87,\
+ 0x3A,0x86,0x3C,0xBC,0xA0,0xA0,0x39,0xB3,\
+ 0x28,0xFE,0x28,0xFE,0x55,0x82,0x66,0xF6,\
+ 0x32,0x3C,0x55,0xF0,0x4E,0x71,0x51,0xC9,\
+ 0xFF,0xFC,0x34,0x3C,0x01,0x00,0x36,0x33,\
+ 0x28,0xFE,0xB6,0x74,0x28,0xFE,0x66,0x08,\
+ 0x55,0x82,0x66,0xF2,0x42,0x80,0x60,0x02,\
+ 0x70,0x01,0x4E,0x75,\
+ 0x4F,0xFB,0x01,0x70,0x00,0x00,0x02,0xF2,\
+ 0x4E,0xBA,0xFC,0x0A,0x4E,0xBA,0xFC,0x84,\
+ 0x4E,0xBA,0xFD,0x32,0x4A,0xFA,0x42,0x80,\
+ 0x22,0x40,0x4E,0xBA,0xFE,0x88,0x4A,0xFA,\
+ 0xD2,0xFC,0x01,0x00,0x60,0xF4,0x00,0x00
+ };
+ */
+ uint8_t flashDriver[] = {\
+ 0x60,0x00,0x04,0x0C,\
+ 0x7C,0x2F,0x2D,0x5C,0x2A,0x0D,0x00,0x00,\
+ 0x02,0x03,0x00,0x03,0x41,0xFA,0xFF,0xF6,\
+ 0x10,0xBB,0x30,0xEE,0x70,0x01,0x4A,0xFA,\
+ 0x52,0x43,0x4E,0x75,\
+ 0x20,0x7C,0x00,0xFF,0xFA,0x00,0x08,0x10,\
+ 0x00,0x04,0x66,0x4E,0xD0,0xFC,0x00,0x04,\
+ 0x10,0xFC,0x00,0x7F,0x08,0x10,0x00,0x03,\
+ 0x67,0xFA,0xD0,0xFC,0x00,0x1C,0x42,0x10,\
+ 0xD0,0xFC,0x00,0x23,0x30,0xBC,0x3F,0xFF,\
+ 0xD0,0xFC,0x00,0x04,0x70,0x07,0x30,0xC0,\
+ 0x30,0xBC,0x68,0x70,0xD0,0xFC,0x00,0x06,\
+ 0x30,0xC0,0x30,0xFC,0x30,0x30,0x30,0xC0,\
+ 0x30,0xBC,0x50,0x30,0xD0,0xFC,0x01,0xBE,\
+ 0x70,0x40,0x30,0xC0,0x30,0x80,0x30,0x3C,\
+ 0x55,0xF0,0x4E,0x71,0x51,0xC8,0xFF,0xFC,\
+ 0x60,0x18,0xD0,0xFC,0x00,0x08,0x30,0xFC,\
+ 0x69,0x08,0x08,0x10,0x00,0x09,0x67,0xFA,\
+ 0x31,0x3C,0x68,0x08,0xD0,0xFC,0x00,0x48,\
+ 0x42,0x50,0x4E,0x75,\
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
+ 0x00,0x00,0x2C,0x3C,0x00,0x00,0x55,0x55,\
+ 0x2E,0x3C,0x00,0x00,0xAA,0xAA,0x2A,0x46,\
+ 0x53,0x8D,0x2C,0x47,0x45,0xF8,0x00,0x00,\
+ 0x47,0xFA,0xFF,0xDE,0x3C,0x87,0x3A,0x86,\
+ 0x3C,0xBC,0x90,0x90,0x36,0xDA,0x36,0x92,\
+ 0x3C,0x87,0x3A,0x86,0x3C,0xBC,0xF0,0xF0,\
+ 0x20,0x3A,0xFF,0xC6,0x72,0x02,0x48,0x41,\
+ 0x74,0x01,0x0C,0x00,0x00,0x25,0x67,0x50,\
+ 0x0C,0x00,0x00,0xB8,0x67,0x4A,0x74,0x04,\
+ 0x0C,0x00,0x00,0x5D,0x67,0x42,0x74,0x01,\
+ 0xE3,0x99,0x0C,0x00,0x00,0xA7,0x67,0x38,\
+ 0x0C,0x00,0x00,0xB4,0x67,0x32,0x74,0x02,\
+ 0x0C,0x00,0x00,0x20,0x67,0x2A,0x0C,0x00,\
+ 0x00,0xA4,0x67,0x24,0x0C,0x00,0x00,0xB5,\
+ 0x67,0x1E,0x74,0x04,0x0C,0x00,0x00,0xD5,\
+ 0x67,0x16,0x74,0x03,0xE3,0x99,0x0C,0x00,\
+ 0x00,0x23,0x67,0x0C,0xE3,0x99,0x0C,0x00,\
+ 0x00,0x81,0x67,0x04,0x72,0x00,0x74,0x00,\
+ 0x47,0xFA,0xFF,0x6A,0x26,0x81,0x47,0xFA,\
+ 0xFF,0x68,0x16,0x82,0x4E,0x75,\
+ 0x45,0x72,0x61,0x73,0x69,0x6E,0x67,0x20,\
+ 0x46,0x4C,0x41,0x53,0x48,0x20,0x63,0x68,\
+ 0x69,0x70,0x73,0x0D,0x0A,0x00,0x41,0xFA,\
+ 0xFF,0xE8,0x70,0x01,0x4A,0xFA,0x12,0x3A,\
+ 0xFF,0x42,0x53,0x01,0x67,0x16,0x53,0x01,\
+ 0x67,0x00,0x00,0xB8,0x53,0x01,0x67,0x00,\
+ 0x01,0x0A,0x53,0x01,0x67,0x00,0x01,0x3A,\
+ 0x60,0x00,0x01,0x3A,0x4B,0xF8,0x00,0x00,\
+ 0x24,0x3A,0xFF,0x1C,0x26,0x02,0x3A,0xBC,\
+ 0xFF,0xFF,0x3A,0xBC,0xFF,0xFF,0x42,0x55,\
+ 0x4A,0x35,0x28,0xFF,0x67,0x28,0x7A,0x19,\
+ 0x1B,0xBC,0x00,0x40,0x28,0xFF,0x42,0x35,\
+ 0x28,0xFF,0x72,0x15,0x4E,0x71,0x51,0xC9,\
+ 0xFF,0xFC,0x1B,0xBC,0x00,0xC0,0x28,0xFF,\
+ 0x72,0x0C,0x4E,0x71,0x51,0xC9,0xFF,0xFC,\
+ 0x4A,0x35,0x28,0xFF,0x66,0x06,0x53,0x82,\
+ 0x66,0xCC,0x60,0x04,0x53,0x45,0x66,0xD0,\
+ 0x42,0x55,0x4A,0x55,0x4A,0x05,0x67,0x00,\
+ 0x00,0xE4,0x24,0x03,0x50,0xC4,0x2A,0x3C,\
+ 0x03,0xE8,0x03,0xE8,0x72,0x20,0x1B,0x81,\
+ 0x28,0xFF,0x1B,0x81,0x28,0xFF,0x32,0x3C,\
+ 0x55,0xF0,0x4E,0x71,0x51,0xC9,0xFF,0xFC,\
+ 0x4E,0xBA,0xFE,0x20,0x1B,0xBC,0x00,0xA0,\
+ 0x28,0xFF,0x72,0x0C,0x4E,0x71,0x51,0xC9,\
+ 0xFF,0xFC,0xB8,0x35,0x28,0xFF,0x66,0x08,\
+ 0x48,0x45,0x53,0x82,0x66,0xE6,0x60,0x04,\
+ 0x53,0x45,0x66,0xC8,0x42,0x55,0x4A,0x55,\
+ 0x4A,0x45,0x67,0x00,0x00,0x98,0x60,0x00,\
+ 0x00,0x90,0x70,0x01,0x42,0x83,0x1D,0x87,\
+ 0x08,0x00,0x1B,0x86,0x08,0x00,0x1D,0xBC,\
+ 0x00,0x80,0x08,0x00,0x1D,0x87,0x08,0x00,\
+ 0x1B,0x86,0x08,0x00,0x1D,0xBC,0x00,0x10,\
+ 0x08,0x00,0x2A,0x00,0x4E,0xBA,0xFD,0xCC,\
+ 0x20,0x05,0x1A,0x30,0x09,0x90,0x08,0x05,\
+ 0x00,0x07,0x66,0x20,0x08,0x05,0x00,0x05,\
+ 0x67,0xE8,0x1A,0x30,0x09,0x90,0x08,0x05,\
+ 0x00,0x07,0x66,0x10,0x1D,0x87,0x08,0x00,\
+ 0x1B,0x86,0x08,0x00,0x1D,0xBC,0x00,0xF0,\
+ 0x08,0x00,0x60,0x40,0x53,0x80,0x67,0xAE,\
+ 0x60,0x36,0x42,0x83,0x3C,0x87,0x3A,0x86,\
+ 0x3C,0xBC,0x00,0x80,0x3C,0x87,0x3A,0x86,\
+ 0x3C,0xBC,0x00,0x10,0x4E,0xBA,0xFD,0x84,\
+ 0x3A,0x15,0x08,0x05,0x00,0x07,0x66,0x18,\
+ 0x08,0x05,0x00,0x05,0x67,0xEE,0x3A,0x15,\
+ 0x08,0x05,0x00,0x07,0x66,0x0A,0x3C,0x87,\
+ 0x3A,0x86,0x3C,0xBC,0x00,0xF0,0x60,0x04,\
+ 0x42,0x80,0x60,0x02,0x70,0x01,0x4E,0x75,\
+ 0x47,0xFB,0x01,0x70,0x00,0x00,0x04,0x4C,\
+ 0x28,0x49,0x24,0x3C,0x00,0x00,0x01,0x00,\
+ 0x12,0x3A,0xFD,0xD8,0x53,0x01,0x67,0x14,\
+ 0x53,0x01,0x67,0x5A,0x53,0x01,0x67,0x00,\
+ 0x00,0xBC,0x53,0x01,0x67,0x00,0x01,0x00,\
+ 0x60,0x00,0x01,0x2E,0x10,0x33,0x28,0xFF,\
+ 0x0C,0x00,0x00,0xFF,0x67,0x28,0x7A,0x19,\
+ 0x19,0xBC,0x00,0x40,0x28,0xFF,0x19,0x80,\
+ 0x28,0xFF,0x72,0x15,0x4E,0x71,0x51,0xC9,\
+ 0xFF,0xFC,0x19,0xBC,0x00,0xC0,0x28,0xFF,\
+ 0x72,0x0C,0x4E,0x71,0x51,0xC9,0xFF,0xFC,\
+ 0xB0,0x34,0x28,0xFF,0x66,0x06,0x53,0x82,\
+ 0x66,0xCA,0x60,0x04,0x53,0x05,0x66,0xD0,\
+ 0x42,0x55,0x4A,0x55,0x4A,0x05,0x67,0x00,\
+ 0x00,0xE8,0x60,0x00,0x00,0xE0,0x20,0x0C,\
+ 0xD0,0x82,0xC0,0xBC,0x00,0x00,0x00,0x01,\
+ 0x08,0x40,0x00,0x00,0x16,0x33,0x28,0xFF,\
+ 0x0C,0x03,0x00,0xFF,0x67,0x48,0x1D,0x87,\
+ 0x08,0x00,0x1B,0x86,0x08,0x00,0x1D,0xBC,\
+ 0x00,0xA0,0x08,0x00,0x19,0x83,0x28,0xFF,\
+ 0xC6,0x3C,0x00,0x80,0x18,0x34,0x28,0xFF,\
+ 0x1A,0x04,0xC8,0x3C,0x00,0x80,0xB8,0x03,\
+ 0x67,0x24,0x08,0x05,0x00,0x05,0x67,0xEC,\
+ 0x18,0x34,0x28,0xFF,0xC8,0x3C,0x00,0x80,\
+ 0xB8,0x03,0x67,0x12,0x1D,0x87,0x08,0x00,\
+ 0x1B,0x86,0x08,0x00,0x1D,0xBC,0x00,0xF0,\
+ 0x08,0x00,0x60,0x00,0x00,0x84,0x53,0x82,\
+ 0x66,0xA6,0x60,0x78,0x36,0x33,0x28,0xFE,\
+ 0x0C,0x43,0xFF,0xFF,0x67,0x3A,0x3C,0x87,\
+ 0x3A,0x86,0x3C,0xBC,0x00,0xA0,0x39,0x83,\
+ 0x28,0xFE,0xC6,0x7C,0x00,0x80,0x38,0x34,\
+ 0x28,0xFE,0x3A,0x04,0xC8,0x7C,0x00,0x80,\
+ 0xB8,0x43,0x67,0x1C,0x08,0x05,0x00,0x05,\
+ 0x67,0xEC,0x38,0x34,0x28,0xFE,0xC8,0x7C,\
+ 0x00,0x80,0xB8,0x43,0x67,0x0A,0x3C,0x87,\
+ 0x3A,0x86,0x3C,0xBC,0x00,0xF0,0x60,0x38,\
+ 0x55,0x82,0x66,0xB8,0x60,0x2E,0x3C,0x87,\
+ 0x3A,0x86,0x3C,0xBC,0xA0,0xA0,0x39,0xB3,\
+ 0x28,0xFE,0x28,0xFE,0x55,0x82,0x66,0xF6,\
+ 0x32,0x3C,0x55,0xF0,0x4E,0x71,0x51,0xC9,\
+ 0xFF,0xFC,0x34,0x3C,0x01,0x00,0x36,0x33,\
+ 0x28,0xFE,0xB6,0x74,0x28,0xFE,0x66,0x08,\
+ 0x55,0x82,0x66,0xF2,0x42,0x80,0x60,0x02,\
+ 0x70,0x01,0x4E,0x75,\
+ 0x4F,0xFB,0x01,0x70,0x00,0x00,0x02,0xF0,\
+ 0x4E,0xBA,0xFC,0x08,0x4E,0xBA,0xFC,0x82,\
+ 0x4E,0xBA,0xFD,0x30,0x4A,0xFA,0x42,0x80,\
+ 0x22,0x40,0x4E,0xBA,0xFE,0x88,0x4A,0xFA,\
+ 0xD2,0xFC,0x01,0x00,0x60,0xF4
+ };
- timer.reset();
- timer.start();
+ /*
+ uint8_t flashDriver8[] = {\
+ 0x60,0x00,0x05,0xC2,0x54,0x72,0x69,0x6F,\
+ 0x6E,0x69,0x63,0x20,0x45,0x43,0x55,0x20,\
+ 0x46,0x4C,0x41,0x53,0x48,0x20,0x73,0x63,\
+ 0x72,0x69,0x70,0x74,0x0D,0x0A,0x00,0x50,\
+ 0x72,0x6F,0x67,0x72,0x61,0x6D,0x6D,0x69,\
+ 0x6E,0x67,0x20,0x46,0x4C,0x41,0x53,0x48,\
+ 0x20,0x63,0x68,0x69,0x70,0x20,0x61,0x64,\
+ 0x64,0x72,0x65,0x73,0x73,0x65,0x73,0x3A,\
+ 0x0D,0x0A,0x00,0x54,0x72,0x69,0x6F,0x6E,\
+ 0x69,0x63,0x20,0x45,0x43,0x55,0x20,0x46,\
+ 0x4C,0x41,0x53,0x48,0x20,0x63,0x68,0x69,\
+ 0x70,0x73,0x20,0x75,0x70,0x64,0x61,0x74,\
+ 0x65,0x64,0x20,0x2D,0x20,0x65,0x6E,0x6A,\
+ 0x6F,0x79,0x20,0x3A,0x2D,0x29,0x0D,0x0A,\
+ 0x00,0x46,0x4C,0x41,0x53,0x48,0x20,0x73,\
+ 0x69,0x7A,0x65,0x3A,0x20,0x30,0x78,0x30,\
+ 0x46,0x61,0x64,0x65,0x30,0x20,0x42,0x79,\
+ 0x74,0x65,0x73,0x0D,0x0A,0x00,0x30,0x78,\
+ 0x30,0x43,0x61,0x66,0x65,0x30,0x2D,0x30,\
+ 0x42,0x61,0x62,0x65,0x30,0x0D,0x00,0x72,\
+ 0x62,0x00,\
+ 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,\
+ 0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46,\
+ 0xE1,0x9A,0x76,0x05,0x42,0x84,0xE9,0x9A,\
+ 0x18,0x02,0x02,0x04,0x00,0x0F,0x10,0xFB,\
+ 0x40,0xE0,0x51,0xCB,0xFF,0xF2,0x4E,0x75,\
+ 0x7C,0x2F,0x2D,0x5C,0x2A,0x0D,0x00,0x00,\
+ 0x02,0x03,0x00,0x03,0x41,0xFA,0xFF,0xF6,\
+ 0x10,0xBB,0x30,0xEE,0x70,0x01,0x4A,0xFA,\
+ 0x52,0x43,0x4E,0x75,\
+ 0x20,0x7C,0x00,0xFF,0xFA,0x00,0x08,0x10,\
+ 0x00,0x04,0x66,0x4E,0xD0,0xFC,0x00,0x04,\
+ 0x10,0xFC,0x00,0x7F,0x08,0x10,0x00,0x03,\
+ 0x67,0xFA,0xD0,0xFC,0x00,0x1C,0x42,0x10,\
+ 0xD0,0xFC,0x00,0x23,0x30,0xBC,0x3F,0xFF,\
+ 0xD0,0xFC,0x00,0x04,0x70,0x07,0x30,0xC0,\
+ 0x30,0xBC,0x68,0x70,0xD0,0xFC,0x00,0x06,\
+ 0x30,0xC0,0x30,0xFC,0x30,0x30,0x30,0xC0,\
+ 0x30,0xBC,0x50,0x30,0xD0,0xFC,0x01,0xBE,\
+ 0x70,0x40,0x30,0xC0,0x30,0x80,0x30,0x3C,\
+ 0x55,0xF0,0x4E,0x71,0x51,0xC8,0xFF,0xFC,\
+ 0x60,0x18,0xD0,0xFC,0x00,0x08,0x30,0xFC,\
+ 0x69,0x08,0x08,0x10,0x00,0x09,0x67,0xFA,\
+ 0x31,0x3C,0x68,0x08,0xD0,0xFC,0x00,0x48,\
+ 0x42,0x50,0x4E,0x75,\
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\
+ 0x00,0x00,0x2C,0x3C,0x00,0x00,0x55,0x55,\
+ 0x2E,0x3C,0x00,0x00,0xAA,0xAA,0x2A,0x46,\
+ 0x53,0x8D,0x2C,0x47,0x45,0xF8,0x00,0x00,\
+ 0x47,0xFA,0xFF,0xDE,0x3C,0x87,0x3A,0x86,\
+ 0x3C,0xBC,0x90,0x90,0x36,0xDA,0x36,0x92,\
+ 0x3C,0x87,0x3A,0x86,0x3C,0xBC,0xF0,0xF0,\
+ 0x20,0x3A,0xFF,0xC6,0x72,0x02,0x48,0x41,\
+ 0x74,0x01,0x0C,0x00,0x00,0x25,0x67,0x50,\
+ 0x0C,0x00,0x00,0xB8,0x67,0x4A,0x74,0x04,\
+ 0x0C,0x00,0x00,0x5D,0x67,0x42,0x74,0x01,\
+ 0xE3,0x99,0x0C,0x00,0x00,0xA7,0x67,0x38,\
+ 0x0C,0x00,0x00,0xB4,0x67,0x32,0x74,0x02,\
+ 0x0C,0x00,0x00,0x20,0x67,0x2A,0x0C,0x00,\
+ 0x00,0xA4,0x67,0x24,0x0C,0x00,0x00,0xB5,\
+ 0x67,0x1E,0x74,0x04,0x0C,0x00,0x00,0xD5,\
+ 0x67,0x16,0x74,0x03,0xE3,0x99,0x0C,0x00,\
+ 0x00,0x23,0x67,0x0C,0xE3,0x99,0x0C,0x00,\
+ 0x00,0x81,0x67,0x04,0x72,0x00,0x74,0x00,\
+ 0x47,0xFA,0xFF,0x6A,0x26,0x81,0x47,0xFA,\
+ 0xFF,0x68,0x16,0x82,0x4E,0x75,\
+ 0x46,0x6F,0x75,0x6E,0x64,0x20,0x61,0x20,\
+ 0x54,0x20,0x20,0x20,0x0D,0x0A,0x00,0x00,\
+ 0x20,0x3A,0xFF,0x4C,0x48,0x40,0x41,0xFA,\
+ 0xFF,0xF1,0x72,0x38,0xE9,0x18,0x65,0x16,\
+ 0x72,0x37,0xE3,0x18,0x65,0x10,0x72,0x35,\
+ 0x10,0xC1,0x72,0x2E,0x10,0xC1,0x72,0x35,\
+ 0xE3,0x18,0x65,0x02,0x72,0x32,0x10,0x81,\
+ 0x41,0xFA,0xFF,0xC6,0x70,0x01,0x4A,0xFA,\
+ 0x4E,0x75,\
+ 0x46,0x49,0x4C,0x45,0x4E,0x41,0x4D,0x45,\
+ 0x2E,0x42,0x49,0x4E,0x00,0x45,0x6E,0x74,\
+ 0x65,0x72,0x20,0x61,0x20,0x66,0x69,0x6C,\
+ 0x65,0x6E,0x61,0x6D,0x65,0x20,0x28,0x75,\
+ 0x70,0x20,0x74,0x6F,0x20,0x38,0x20,0x63,\
+ 0x68,0x61,0x72,0x61,0x63,0x74,0x65,0x72,\
+ 0x73,0x29,0x3A,0x20,0x00,0x00,0x41,0xFA,\
+ 0xFF,0xD5,0x70,0x01,0x4A,0xFA,0x41,0xFA,\
+ 0xFF,0xC0,0x78,0x08,0x70,0x04,0x4A,0xFA,\
+ 0x0C,0x00,0x00,0x0D,0x67,0x26,0x0C,0x00,\
+ 0x00,0x2E,0x67,0x20,0x0C,0x00,0x00,0x08,\
+ 0x66,0x0A,0xB8,0x00,0x67,0xE6,0x53,0x48,\
+ 0x54,0x44,0x60,0x06,0x4A,0x04,0x67,0x0C,\
+ 0x10,0xC0,0x12,0x00,0x70,0x02,0x4A,0xFA,\
+ 0x51,0xCC,0xFF,0xD2,0x10,0xFC,0x00,0x2E,\
+ 0x10,0xFC,0x00,0x42,0x10,0xFC,0x00,0x49,\
+ 0x10,0xFC,0x00,0x4E,0x10,0xBC,0x00,0x00,\
+ 0x59,0x88,0x70,0x01,0x4A,0xFA,0x41,0xFA,\
+ 0xFD,0xB5,0x70,0x01,0x4A,0xFA,0x41,0xFA,\
+ 0xFF,0x68,0x43,0xFA,0xFD,0xBD,0x70,0x06,\
+ 0x4A,0xFA,0x41,0xFA,0xFF,0x58,0x20,0x80,\
+ 0x4E,0x75,\
+ 0x45,0x72,0x61,0x73,0x69,0x6E,0x67,0x20,\
+ 0x46,0x4C,0x41,0x53,0x48,0x20,0x63,0x68,\
+ 0x69,0x70,0x73,0x0D,0x0A,0x00,0x41,0xFA,\
+ 0xFF,0xE8,0x70,0x01,0x4A,0xFA,0x12,0x3A,\
+ 0xFE,0x52,0x53,0x01,0x67,0x16,0x53,0x01,\
+ 0x67,0x00,0x00,0xB8,0x53,0x01,0x67,0x00,\
+ 0x01,0x0A,0x53,0x01,0x67,0x00,0x01,0x3A,\
+ 0x60,0x00,0x01,0x3A,0x4B,0xF8,0x00,0x00,\
+ 0x24,0x3A,0xFE,0x2C,0x26,0x02,0x3A,0xBC,\
+ 0xFF,0xFF,0x3A,0xBC,0xFF,0xFF,0x42,0x55,\
+ 0x4A,0x35,0x28,0xFF,0x67,0x28,0x7A,0x19,\
+ 0x1B,0xBC,0x00,0x40,0x28,0xFF,0x42,0x35,\
+ 0x28,0xFF,0x72,0x15,0x4E,0x71,0x51,0xC9,\
+ 0xFF,0xFC,0x1B,0xBC,0x00,0xC0,0x28,0xFF,\
+ 0x72,0x0C,0x4E,0x71,0x51,0xC9,0xFF,0xFC,\
+ 0x4A,0x35,0x28,0xFF,0x66,0x06,0x53,0x82,\
+ 0x66,0xCC,0x60,0x04,0x53,0x45,0x66,0xD0,\
+ 0x42,0x55,0x4A,0x55,0x4A,0x05,0x67,0x00,\
+ 0x00,0xE4,0x24,0x03,0x50,0xC4,0x2A,0x3C,\
+ 0x03,0xE8,0x03,0xE8,0x72,0x20,0x1B,0x81,\
+ 0x28,0xFF,0x1B,0x81,0x28,0xFF,0x32,0x3C,\
+ 0x55,0xF0,0x4E,0x71,0x51,0xC9,0xFF,0xFC,\
+ 0x4E,0xBA,0xFD,0x30,0x1B,0xBC,0x00,0xA0,\
+ 0x28,0xFF,0x72,0x0C,0x4E,0x71,0x51,0xC9,\
+ 0xFF,0xFC,0xB8,0x35,0x28,0xFF,0x66,0x08,\
+ 0x48,0x45,0x53,0x82,0x66,0xE6,0x60,0x04,\
+ 0x53,0x45,0x66,0xC8,0x42,0x55,0x4A,0x55,\
+ 0x4A,0x45,0x67,0x00,0x00,0x98,0x60,0x00,\
+ 0x00,0x90,0x70,0x01,0x42,0x83,0x1D,0x87,\
+ 0x08,0x00,0x1B,0x86,0x08,0x00,0x1D,0xBC,\
+ 0x00,0x80,0x08,0x00,0x1D,0x87,0x08,0x00,\
+ 0x1B,0x86,0x08,0x00,0x1D,0xBC,0x00,0x10,\
+ 0x08,0x00,0x2A,0x00,0x4E,0xBA,0xFC,0xDC,\
+ 0x20,0x05,0x1A,0x30,0x09,0x90,0x08,0x05,\
+ 0x00,0x07,0x66,0x20,0x08,0x05,0x00,0x05,\
+ 0x67,0xE8,0x1A,0x30,0x09,0x90,0x08,0x05,\
+ 0x00,0x07,0x66,0x10,0x1D,0x87,0x08,0x00,\
+ 0x1B,0x86,0x08,0x00,0x1D,0xBC,0x00,0xF0,\
+ 0x08,0x00,0x60,0x40,0x53,0x80,0x67,0xAE,\
+ 0x60,0x36,0x42,0x83,0x3C,0x87,0x3A,0x86,\
+ 0x3C,0xBC,0x00,0x80,0x3C,0x87,0x3A,0x86,\
+ 0x3C,0xBC,0x00,0x10,0x4E,0xBA,0xFC,0x94,\
+ 0x3A,0x15,0x08,0x05,0x00,0x07,0x66,0x18,\
+ 0x08,0x05,0x00,0x05,0x67,0xEE,0x3A,0x15,\
+ 0x08,0x05,0x00,0x07,0x66,0x0A,0x3C,0x87,\
+ 0x3A,0x86,0x3C,0xBC,0x00,0xF0,0x60,0x04,\
+ 0x42,0x80,0x60,0x02,0x70,0x01,0x4E,0x75,\
+ 0x47,0xFB,0x01,0x70,0x00,0x00,0x02,0x96,\
+ 0x28,0x49,0x24,0x3C,0x00,0x00,0x01,0x00,\
+ 0x12,0x3A,0xFC,0xE8,0x53,0x01,0x67,0x14,\
+ 0x53,0x01,0x67,0x5A,0x53,0x01,0x67,0x00,\
+ 0x00,0xBC,0x53,0x01,0x67,0x00,0x01,0x00,\
+ 0x60,0x00,0x01,0x2E,0x10,0x33,0x28,0xFF,\
+ 0x0C,0x00,0x00,0xFF,0x67,0x28,0x7A,0x19,\
+ 0x19,0xBC,0x00,0x40,0x28,0xFF,0x19,0x80,\
+ 0x28,0xFF,0x72,0x15,0x4E,0x71,0x51,0xC9,\
+ 0xFF,0xFC,0x19,0xBC,0x00,0xC0,0x28,0xFF,\
+ 0x72,0x0C,0x4E,0x71,0x51,0xC9,0xFF,0xFC,\
+ 0xB0,0x34,0x28,0xFF,0x66,0x06,0x53,0x82,\
+ 0x66,0xCA,0x60,0x04,0x53,0x05,0x66,0xD0,\
+ 0x42,0x55,0x4A,0x55,0x4A,0x05,0x67,0x00,\
+ 0x00,0xE8,0x60,0x00,0x00,0xE0,0x20,0x0C,\
+ 0xD0,0x82,0xC0,0xBC,0x00,0x00,0x00,0x01,\
+ 0x08,0x40,0x00,0x00,0x16,0x33,0x28,0xFF,\
+ 0x0C,0x03,0x00,0xFF,0x67,0x48,0x1D,0x87,\
+ 0x08,0x00,0x1B,0x86,0x08,0x00,0x1D,0xBC,\
+ 0x00,0xA0,0x08,0x00,0x19,0x83,0x28,0xFF,\
+ 0xC6,0x3C,0x00,0x80,0x18,0x34,0x28,0xFF,\
+ 0x1A,0x04,0xC8,0x3C,0x00,0x80,0xB8,0x03,\
+ 0x67,0x24,0x08,0x05,0x00,0x05,0x67,0xEC,\
+ 0x18,0x34,0x28,0xFF,0xC8,0x3C,0x00,0x80,\
+ 0xB8,0x03,0x67,0x12,0x1D,0x87,0x08,0x00,\
+ 0x1B,0x86,0x08,0x00,0x1D,0xBC,0x00,0xF0,\
+ 0x08,0x00,0x60,0x00,0x00,0x84,0x53,0x82,\
+ 0x66,0xA6,0x60,0x78,0x36,0x33,0x28,0xFE,\
+ 0x0C,0x43,0xFF,0xFF,0x67,0x3A,0x3C,0x87,\
+ 0x3A,0x86,0x3C,0xBC,0x00,0xA0,0x39,0x83,\
+ 0x28,0xFE,0xC6,0x7C,0x00,0x80,0x38,0x34,\
+ 0x28,0xFE,0x3A,0x04,0xC8,0x7C,0x00,0x80,\
+ 0xB8,0x43,0x67,0x1C,0x08,0x05,0x00,0x05,\
+ 0x67,0xEC,0x38,0x34,0x28,0xFE,0xC8,0x7C,\
+ 0x00,0x80,0xB8,0x43,0x67,0x0A,0x3C,0x87,\
+ 0x3A,0x86,0x3C,0xBC,0x00,0xF0,0x60,0x38,\
+ 0x55,0x82,0x66,0xB8,0x60,0x2E,0x3C,0x87,\
+ 0x3A,0x86,0x3C,0xBC,0xA0,0xA0,0x39,0xB3,\
+ 0x28,0xFE,0x28,0xFE,0x55,0x82,0x66,0xF6,\
+ 0x32,0x3C,0x55,0xF0,0x4E,0x71,0x51,0xC9,\
+ 0xFF,0xFC,0x34,0x3C,0x01,0x00,0x36,0x33,\
+ 0x28,0xFE,0xB6,0x74,0x28,0xFE,0x66,0x08,\
+ 0x55,0x82,0x66,0xF2,0x42,0x80,0x60,0x02,\
+ 0x70,0x01,0x4E,0x75,\
+ 0x4F,0xFB,0x01,0x70,0x00,0x00,0x01,0x3A,\
+ 0x41,0xFA,0xFA,0x36,0x70,0x01,0x4A,0xFA,\
+ 0x4E,0xBA,0xFB,0x10,0x4E,0xBA,0xFB,0x8A,\
+ 0x4A,0x42,0x66,0x06,0x74,0x01,0x60,0x00,\
+ 0x00,0x42,0x4E,0xBA,0xFC,0x28,0x41,0xFA,\
+ 0xFA,0x93,0x24,0x3A,0xFB,0x6E,0x4E,0xBA,\
+ 0xFA,0xBE,0x41,0xFA,0xFA,0x79,0x70,0x01,\
+ 0x4A,0xFA,0x4E,0xBA,0xFD,0x06,0x4A,0x00,\
+ 0x67,0x06,0x74,0x05,0x60,0x00,0x00,0x1C,\
+ 0x4A,0xFA,0x41,0xFA,0xFA,0x0F,0x70,0x01,\
+ 0x4A,0xFA,0x42,0x80,0x22,0x40,0x4E,0xBA,\
+ 0xFE,0x4C,0x4A,0xFA,0xD2,0xFC,0x01,0x00,\
+ 0x60,0xF4,0x20,0x7C,0x00,0xFF,0xFA,0x00,\
+ 0x08,0x10,0x00,0x04,0x66,0x08,0x02,0x79,\
+ 0xFF,0xBF,0x00,0xFF,0xFC,0x14,0x22,0x02,\
+ 0x70,0x00,0x4A,0xFA
+ };
+ */
- uint16_t word_value = 0;
- uint8_t byte_value = 0;
-// bool ret = true;
+
+ //if (prep_t5_do() != TERM_OK) return TERM_ERR;
+ // Set Program counter to start of BDM driver code
+ uint32_t driverAddress = 0x100000;
+ if (sysreg_write(0x0, &driverAddress) != TERM_OK) break;
+ for (uint32_t i = 0; i < sizeof(flashDriver); i++) {
+ if(memwrite_byte(&driverAddress, flashDriver[i]) != TERM_OK) return false;
+ driverAddress++;
+ }
+// if (!bdmLoadMemory(flashDriver, driverAddress, sizeof(flashDriver))) break;
+
+ timer.reset();
+ timer.start();
+ printf("Erasing FLASH chips...\r\n");
+ printf("This can take up to a minute for a T8,\r\n");
+ printf("30s for a T7 or 15s for a T5 ECU.\r\n");
+ // execute the erase algorithm in the BDM driver
+ // write the buffer - should complete within 200 milliseconds
+ // Typical and Maximum Chip Programming times are 9 and 27 seconds for Am29BL802C
+ // Typical Chip erase time for Am29BL802C is 45 secinds, not including 0x00 programming prior to erasure.
+ // Allow for at least worst case 27 seconds programming to 0x00 + 3(?) * 45 typical erase time (162 seconds)
+ // Allow at least 200 seconds erase time 2,000 * (100ms + BDM memread time)
+ // NOTE: 29/39F010 and 29F400 erase times are considerably lower
+
+// if (sysreg_write(0x0, &driverAddress) != TERM_OK) return TERM_ERR;
+// break;
+ do {
+ if (!bdmRunDriver(0x0, 20000)) {
+ printf("WARNING: An error occured when I tried to erase the FLASH chips :-(\r\n");
+ return TERM_ERR;
+ }
+ } while (bdmProcessSyscall() == CONTINUE);
+
+// if (!run_bdm_driver(0x0, 200000)) {
+// printf("WARNING: An error occured when I tried to erase the FLASH chips :-(\r\n");
+// return TERM_ERR;
+// }
+ printf("Erasing took %#.1f seconds.\r\n",timer.read());
+
+ printf("Programming the FLASH chips...\r\n");
// ready to receive data
- printf(" 0.00 %% complete.\r");
- while (curr_addr < flash_size) {
- // receive bytes from BIN file
- //Get a byte - break if no more bytes to get
- if (!fread(&byte_value,1,1,fp)) {
- fclose(fp);
- printf("Error reading the BIN file MODIFIED.HEX");
- break;
- }
- word_value = (byte_value << 8);
- if (!fread(&byte_value,1,1,fp)) {
- fclose(fp);
- printf("Error reading the BIN file MODIFIED.HEX");
+ printf(" 0.00 %% complete.\r");
+ while (curr_addr < flash_size) {
+ // receive bytes from BIN file - break if no more bytes to get
+ if (!fread(file_buffer,1,0x100,fp)) {
+ fclose(fp);
+ printf("Error reading the BIN file MODIFIED.BIN");
+ break;
+ }
+ if (!bdmLoadMemory((uint8_t*)file_buffer, 0x100700, 0x100)) break;
+ // write the buffer - should complete within 200 milliseconds
+ if (!bdmRunDriver(0x0, 200)) break;
+// if (!run_bdm_driver(0x0, 200)) break;
+
+ printf("%6.2f\r", 100*(float)curr_addr/(float)flash_size );
+ // make the activity LED twinkle
+ ACTIVITYLEDON;
+ curr_addr += 0x100;
+ }
break;
}
- word_value |= byte_value;
+ // johnc's original method
+ case AMD29F400B: /// a sort of dummy 'placeholder' as the 'B' chip isn't ever fitted to T7 ECUS
+ default: {
+ timer.reset();
+ timer.start();
+
+ // reset the FLASH chips
+ printf("Reset the FLASH chip(s) to prepare them for Erasing\r\n");
+ if (!reset_func()) return TERM_ERR;
- // write the word if it is not 0xffff
- if (word_value != 0xffff) {
- if (!flash_func(&curr_addr, word_value)) break;
+ switch (type) {
+ // AM29Fxxx chips (retrofitted to Trionic 5.x; original to T7)
+ case AMD29BL802C:
+ case AMD29F400B:
+ case AMD29F400T:
+ case AMD29F010:
+ case SST39SF010:
+ case AMICA29010L:
+ printf("Erasing 29BL802/F400/010 type FLASH chips...\r\n");
+ if (!erase_am29()) {
+ printf("WARNING: An error occured when I tried to erase the FLASH chips :-(\r\n");
+ return TERM_ERR;
+ }
+ break;
+ // AM28F010 chip (Trionic 5.x original)
+ case AMD28F010:
+ case INTEL28F010:
+ case AMD28F512:
+ case INTEL28F512:
+ printf("Erasing 28F010/512 type FLASH chips...\r\n");
+ if (!erase_am28(&curr_addr, &flash_size)) {
+ printf("WARNING: An error occured when I tried to erase the FLASH chips :-(\r\n");
+ return TERM_ERR;
+ }
+ break;
+ case ATMEL29C010:
+ case ATMEL29C512:
+ printf("Atmel FLASH chips do not require ERASEing :-)\r\n");
+ break;
+ default:
+ // unknown flash type - shouldn't get here hence "Strange!"
+ printf("Strange! I couldn't work out how to erase the FLASH chips in the TRIONIC ECU that I am connected to :-(\r\n");
+ return TERM_ERR;
+ }
+
+ timer.stop();
+ printf("Erasing took %#.1f seconds.\r\n",timer.read());
+
+ printf("Programming the FLASH chips...\r\n");
+
+ timer.reset();
+ timer.start();
+
+ uint16_t word_value = 0;
+
+// ready to receive data
+ printf(" 0.00 %% complete.\r");
+ while (curr_addr < flash_size) {
+ // receive bytes from BIN file
+ //Get a byte - break if no more bytes to get
+ if (!fread(&file_buffer[0],1,0x2,fp)) {
+ fclose(fp);
+ printf("Error reading the BIN file MODIFIED.BIN");
+ break;
+ }
+ for(uint32_t i=0; i<2; i++) {
+ (word_value <<= 8) |= file_buffer[i];
+ }
+
+ // write the word if it is not 0xffff
+ if (word_value != 0xffff) {
+ if (!flash_func(&curr_addr, word_value)) break;
+ }
+
+ if (!(curr_addr % 0x80)) {
+ printf("%6.2f\r", 100*(float)curr_addr/(float)flash_size );
+ // make the activity LED twinkle
+ ACTIVITYLEDON;
+ }
+ curr_addr += 2;
+ }
}
- curr_addr += 2;
-
- // make the activity LED twinkle
- ACTIVITYLEDON;
- if (!(curr_addr % 0x80))
- printf("%6.2f\r", 100*(float)curr_addr/(float)flash_size );
}
- printf("\n");
timer.stop();
fclose(fp);
if (curr_addr == flash_size) {
+ printf("100.00\r\n");
printf("Programming took %#.1f seconds.\r\n",timer.read());
// "Just4pleisure;)" 'tag' in the empty space at the end of the FLASH chip
@@ -577,8 +1314,11 @@
// flash_func(&flash_tag[i].addr, (flash_tag[i].val & word_value));
// }
- } else
- printf("WARNING: Oh dear, I couldn't program the FLASH at address 0x%8x.\r\n", curr_addr);
+ } else {
+ printf("\r\n");
+ printf("Programming took %#.1f seconds.\r\n",timer.read());
+ printf("WARNING: Oh dear, I couldn't program the FLASH at address 0x%08x.\r\n", curr_addr);
+ }
// reset flash
return (reset_func() && (curr_addr == flash_size)) ? TERM_OK : TERM_ERR;
@@ -632,13 +1372,15 @@
uint32_t addr = 0x0;
uint16_t verify_value;
- printf(" 0.0 seconds.\r");
- uint8_t err_cnt = ERR_COUNT;
- while (--err_cnt) {
- // typical erase time = 1s
- // Allow up to 25.5 seconds erase time
- wait_ms(100);
- wait_ms(100);
+ printf(" 0.0 seconds.\r");
+ timeout.reset();
+ timeout.start();
+ while (timeout.read() < 200.0) {
+ // Typical and Maximum Chip Programming times are 9 and 27 seconds for Am29BL802C
+ // Typical Chip erase time for Am29BL802C is 45 secinds, not including 0x00 programming prior to erasure.
+ // Allow for at least worst case 27 seconds programming to 0x00 + 3(?) * 45 typical erase time (162 seconds)
+ // Allow at least 200 seconds erase time 2,000 * (100ms + BDM memread time)
+ // NOTE: 29/39F010 and 29F400 erase times are considerably lower
if (memread_word(&verify_value, &addr) == TERM_OK && verify_value == 0xffff) {
// erase completed normally
reset_am29();
@@ -647,11 +1389,10 @@
}
// make the activity LED twinkle
ACTIVITYLEDON;
- printf("%4.1f\r", (float)ERR_COUNT/5 - (float)err_cnt/5 );
+ printf("%5.1f\r", timeout.read());
}
+ // erase failed
printf("\n");
-
- // erase failed
reset_am29();
return false;
}
@@ -682,11 +1423,12 @@
return false;
}
// verify the result
- uint8_t err_cnt = ERR_COUNT;
- while (--err_cnt) {
- // Allow up to approx 2.55 milliseconds program time (255 * ~10us BDM memread time)
- // wait_ms(10);
- wait_us(100);
+ timeout.reset();
+ timeout.start();
+ while (timeout.read_us() < 500) {
+ // Typical and Maximum Word Programming times are 9us and 360us for Am29BL802C
+ // Allow at least 500 microseconds program time 500 * (1us + BDM memread time)
+ // NOTE: 29/39F010 and 29F400 programming times are considerably lower
uint16_t verify_value;
if ((memread_word(&verify_value, addr) == TERM_OK) &&
(verify_value == value)) {
@@ -699,6 +1441,56 @@
return false;
}
+
+//-----------------------------------------------------------------------------
+/**
+Writes a word to a FLASH memory chip and checks the result
+MCU must be in background mode.
+
+@param addr BDM driver address (0 to continue)
+@param maxtime how long to allow driver to execute (milliseconds)
+
+@return succ / fail
+*/
+bool run_bdm_driver(uint32_t addr, uint32_t maxtime)
+{
+ // Start BDM driver and allow it up to 200 milliseconds to update 256 Bytes
+ // Upto 25 pulses per byte, 16us per pulse, 256 Bytes
+ // 25 * 16 * 256 = 102,400us plus overhead for driver code execution time
+ // Allowing up to 200 milliseconds seems like a good allowance.
+ uint32_t driverAddress = addr;
+ if (run_chip(&driverAddress) != TERM_OK) {
+ printf("Failed to start BDM driver.\r\n");
+ return false;
+ }
+ timeout.reset();
+ timeout.start();
+ // T5 ECUs' BDM interface seem to have problems when the running the CPU and
+ // sometimes shows the CPU briefly switching between showing BDM mode or that
+ // the CPU is running.
+ // I 'debounce' the interface state to workaround this erratic bahaviour
+ for (uint32_t debounce = 0; debounce < 5; debounce++) {
+ while (IS_RUNNING) {
+ debounce = 0;
+ if (timeout.read_ms() > maxtime) {
+ printf("Driver did not return to BDM mode.\r\n");
+ timeout.stop();
+ return false;
+ }
+ }
+ wait_us(1);
+ }
+ timeout.stop();
+ // Check return code in D0 register (0 - OK, 1 - FAILED)
+ uint32_t result = 1;
+ if (adreg_read(&result, 0x0) != TERM_OK) {
+ printf("Failed to read BDM register.\r\n");
+ return false;
+ }
+ return (result == 1) ? false : true;
+}
+
+
//-----------------------------------------------------------------------------
/**
Resets a AM28Fxxx flash memory chip. MCU must be in background mode.
@@ -742,10 +1534,11 @@
addr += 2;
// // feedback to host computer
// pc.putc(TERM_OK);
- // make the activity LED twinkle
- ACTIVITYLEDON;
- if (!(addr % 0x80))
+ if (!(addr % 0x80)) {
+ // make the activity LED twinkle
+ ACTIVITYLEDON;
printf("%6.2f\r", 100*(float)addr/(float)*end_addr );
+ }
}
printf("\n");
@@ -777,8 +1570,11 @@
addr++;
// make the activity LED twinkle
ACTIVITYLEDON;
- if (!(addr % 0x80))
+ if (!(addr % 0x80)) {
+ // make the activity LED twinkle
+ ACTIVITYLEDON;
printf("%6.2f\r", 100*(float)addr/(float)*end_addr );
+ }
}
}
printf("\n");
@@ -918,7 +1714,8 @@
uint8_t prep_t5_do(void)
{
-
+ // Make sure that BDM clock is SLOW
+ bdm_clk_mode(SLOW);
// reset and freeze the MC68332/377 chip
if (restart_chip() != TERM_OK) return TERM_ERR;
@@ -940,7 +1737,10 @@
// MC68377 MCR = x111111x01001111 binary after a reset
if ((verify_value & 0x7E4F) == 0x7E4F) {
printf ("I have found a Trionic 8 ECU.\r\n");
-// Set MC68377 to double it's default speed (16 MHz?) (SYNCR)
+ // Stop system protection (MDR bit 0 STOP-SYS-PROT)
+ long_value = 0x00fffa04;
+ if (memwrite_byte(&long_value, 0x01) != TERM_OK) return TERM_ERR;
+ // Set MC68377 to double it's default speed (16 MHz?) (SYNCR)
long_value = 0x00fffa08;
// First set the MFD part (change 4x to 8x)
if (memwrite_word(&long_value, 0x6908) != TERM_OK) return TERM_ERR;
@@ -951,7 +1751,11 @@
// Disable watchdog and monitors (SYPCR)
long_value = 0x00fffa50;
if (memwrite_word(&long_value, 0x0000) != TERM_OK) return TERM_ERR;
- return TERM_OK;
+ // Enable internal 6kByte RAM of 68377 at address 0x00100000 (DPTRAM)
+ long_value = 0x00fff684;
+ if (memwrite_word(&long_value, 0x1000) != TERM_OK) return TERM_ERR;
+ // can use fast or turbo or nitrous BDM clock mode once ECU has been prepped and CPU clock is ??MHz
+// bdm_clk_mode(NITROUS);
}
// MC68332 SIMCR = 0000x00011001111 binary after a reset
//if ((verify_value & 0x00CF) == 0x00CF) {
@@ -985,12 +1789,13 @@
// wait for programming voltage to be ready
wait_ms(10);
// Enable internal 2kByte RAM of 68332 at address 0x00100000 (TRAMBAR)
- //long_value = 0x00fffb04;
- //if (memwrite_word(&long_value, 0x1000) != TERM_OK) return TERM_ERR;
- return TERM_OK;
+ long_value = 0x00fffb04;
+ if (memwrite_word(&long_value, 0x1000) != TERM_OK) return TERM_ERR;
+ // can use fast or turbo BDM clock mode once ECU has been prepped and CPU clock is 16MHz
+// bdm_clk_mode(TURBO);
+// bdm_clk_mode(FAST);
}
-// Unknown MC683xx chip if code reaches this point
- return TERM_ERR;
+ return TERM_OK;
}