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: t7utils.cpp
- Revision:
- 6:2fbcbebed28c
- Parent:
- 5:1775b4b13232
diff -r 1775b4b13232 -r 2fbcbebed28c t7utils.cpp
--- a/t7utils.cpp Sat Apr 25 17:07:08 2015 +0000
+++ b/t7utils.cpp Sat Apr 23 18:31:40 2016 +0000
@@ -29,7 +29,8 @@
//
-bool t7_initialise() {
+bool t7_initialise()
+{
// send a can message to the T7 requesting that it initialises CAN communication with Just4Trionic
char T7TxMsg[] = T7INITMSG;
if (!can_send_timeout (T7CMNDID, T7TxMsg, 8, T7MESSAGETIMEOUT))
@@ -56,7 +57,8 @@
// return: bool TRUE if there was a message, FALSE if no message.
//
-bool t7_authenticate() {
+bool t7_authenticate()
+{
uint16_t seed, key;
// uint16_t i;
char T7TxAck[] = T7ACK_MSG;
@@ -130,7 +132,8 @@
// return: bool TRUE if there was a message, FALSE if no message.
//
-bool t7_dump() {
+bool t7_dump(bool blockmode)
+{
uint32_t received;
uint8_t byte_count, retries, i;
char T7_dump_jumpa[] = T7DMPJP1A;
@@ -275,10 +278,11 @@
return TRUE;
}
-bool t7_erase() {
- char T7_erase_msga[] = { 0x40, 0xA1, 0x02, 0x31, 0x52, 0x00, 0x00, 0x00 };
- char T7_erase_msgb[] = { 0x40, 0xA1, 0x02, 0x31, 0x53, 0x00, 0x00, 0x00 };
- char T7_erase_confirm[] = { 0x40, 0xA1, 0x01, 0x3E, 0x00, 0x00, 0x00, 0x00 };
+bool t7_erase()
+{
+ char T7_erase_msga[] = { 0x40, 0xA1, 0x02, 0x31, 0x52, 0x00, 0x00, 0x00 };
+ char T7_erase_msgb[] = { 0x40, 0xA1, 0x02, 0x31, 0x53, 0x00, 0x00, 0x00 };
+ char T7_erase_confirm[] = { 0x40, 0xA1, 0x01, 0x3E, 0x00, 0x00, 0x00, 0x00 };
char T7_erase_ack[] = { 0x40, 0xA1, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00 };
char data[8];
int i;
@@ -290,16 +294,16 @@
while ( data[3] != 0x71 && i < 10) {
// Send "Request to ERASE" to Trionic
if (!can_send_timeout (T7SEC_ID, T7_erase_msga, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
+ printf("err %s line: %d\r\n", __FILE__, __LINE__ );
return FALSE;
}
if (!can_wait_timeout(T7SEC_RX, data, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
+ printf("err %s line: %d\r\n", __FILE__, __LINE__ );
return FALSE;
}
T7_erase_ack[3] = data[0] & 0xBF;
if (!can_send_timeout (T7ACK_ID, T7_erase_ack, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
+ printf("err %s line: %d\r\n", __FILE__, __LINE__ );
return FALSE;
}
wait_ms(100);
@@ -317,16 +321,16 @@
while ( data[3] != 0x71 && i < 200) {
// Send "Request to ERASE" to Trionic
if (!can_send_timeout (T7SEC_ID, T7_erase_msgb, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
+ printf("err %s line: %d\r\n", __FILE__, __LINE__ );
return FALSE;
}
if (!can_wait_timeout(T7SEC_RX, data, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
+ printf("err %s line: %d\r\n", __FILE__, __LINE__ );
return FALSE;
}
T7_erase_ack[3] = data[0] & 0xBF;
if (!can_send_timeout (T7ACK_ID, T7_erase_ack, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
+ printf("err %s line: %d\r\n", __FILE__, __LINE__ );
return FALSE;
}
wait_ms(100);
@@ -343,487 +347,341 @@
// Confirm erase was successful?
// (Note: no acknowledgements used for some reason)
if (!can_send_timeout (T7SEC_ID, T7_erase_confirm, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
+ printf("err %s line: %d\r\n", __FILE__, __LINE__ );
return FALSE;
}
if (!can_wait_timeout(T7SEC_RX, data, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
+ printf("err %s line: %d\r\n", __FILE__, __LINE__ );
return FALSE;
}
if ( data[3] != 0x7E ) {
- printf("err t7utils line: %d\r\n", __LINE__ );
+ printf("err %s line: %d\r\n", __FILE__, __LINE__ );
return FALSE;
}
wait_ms(100);
if (!can_send_timeout (T7SEC_ID, T7_erase_confirm, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
+ printf("err %s line: %d\r\n", __FILE__, __LINE__ );
return FALSE;
}
if (!can_wait_timeout(T7SEC_RX, data, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
+ printf("err %s line: %d\r\n", __FILE__, __LINE__ );
return FALSE;
}
if ( data[3] != 0x7E ) {
- printf("err t7utils line: %d\r\n", __LINE__ );
+ printf("FAILURE: Unable to erase the FLASH .\r\n");
return FALSE;
}
printf("SUCCESS: The FLASH has been erased.\r\n");
return TRUE;
}
-bool t7_flash_raw() {
- char T7_flash_jumpa[] = T7FLAJP1A;
- char T7_flash_jumpb[] = T7FLAJP1B;
- char T7_flash_end[] = T7FLA_END;
- char T7_flash_exit[] = T7FLAEXIT;
- char T7_flash_ack[] = T7FLA_ACK;
- char data[8];
- int i, k;
- // fopen modified.bin here?
- // need lots of fcloses though
+/// Open and check the bin file to make sure that it is a valid T7 BIN file
+///
+/// params full filename including path of the T7 BIN file
+///
+/// returns a pointer to the T7 BIN file
+/// or a null pointer if it is invalid in some way
+
+FILE * t7_file_open(const char* fname)
+{
printf("Checking the FLASH BIN file...\r\n");
- FILE *fp = fopen("/local/modified.bin", "r"); // Open "modified.bin" on the local file system for reading
+ FILE *fp = fopen(fname, "r"); // Open "modified.bin" on the local file system for reading
if (!fp) {
printf("Error: I could not find the BIN file MODIFIED.BIN\r\n");;
- return TERM_ERR;
+ return NULL;
}
// obtain file size - it should match the size of the FLASH chips:
fseek (fp , 0 , SEEK_END);
uint32_t file_size = ftell (fp);
rewind (fp);
+ if (file_size != T7FLASHSIZE) {
+ fclose(fp);
+ printf("The BIN file does not appear to be for a T7 ECU :-(\r\n");
+ printf("T7's FLASH chip size is: %#010x bytes.\r\n", T7FLASHSIZE);
+ printf("The BIN's file size is: %#010x bytes.\r\n", file_size);
+ return NULL;
+ }
// 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;
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;
+ for (uint32_t i=0; i<4; i++) {
+ if (!fread(&stack_byte,1,1,fp)) {
+ printf("Error reading the BIN file MODIFIED.BIN\r\n");
+ return NULL;
+ }
+ stack_long <<= 8;
+ stack_long |= stack_byte;
+ }
rewind (fp);
-
- if (file_size != T7FLASHSIZE || stack_long != T7POINTER) {
+ if (stack_long != T7POINTER) {
fclose(fp);
printf("The BIN file does not appear to be for a T7 ECU :-(\r\n");
- printf("BIN file size: %#010x, FLASH chip size: %#010x, Pointer: %#010x.\r\n", file_size, T7FLASHSIZE, stack_long);
- return TERM_ERR;
+ printf("A T7 BIN file should start with: %#010x.\r\n", T7POINTER);
+ printf("This file starts with : %#010x.\r\n", stack_long);
+ return NULL;
+ }
+ printf("The BIN file appears to OK :-)\r\n");
+ return fp;
+}
+
+
+bool t7_flash_segment(FILE *fp, uint32_t address, uint32_t size, bool blockmode)
+{
+ char T7_flash_start[] = T7FLASTRT;
+ char T7_flash_size[] = T7FLASIZE;
+ char T7_flash_ack[] = T7FLA_ACK;
+ char data[8];
+
+ int32_t i, k;
+
+ uint32_t current_address = address;
+ uint32_t segment_end = address + size;
+
+ if ((current_address > T7FLASHSIZE) || (segment_end > T7FLASHSIZE)) {
+ printf("Attempting to FLASH outside of FLASH region\r\n");
+ printf("Start Address: %#010x, End Address: %#010x.\r\n", current_address, segment_end);
+ printf("err %s line: %d\r\n", __FILE__, __LINE__ );
+ return FALSE;
}
- timer.reset();
- timer.start();
+ // blocksize can be any size between 1 and 250 (0x01 - 0xFA)
+ // Better performance is realised with a bigger blocksize
+ //
+ // The following convenient sizes to use for testing
+ // 0x04, 0x10 and 0x40
+ // A value of 0x70 is useful when programming the BIN region
+ //uint32_t blocksize = (blockmode == true) ? 0x70 : 0x04;
+ uint32_t blocksize = (blockmode == true) ? 0xFA : 0x04;
+ // Sanity check
+ if (blocksize < 0x01) blocksize = 0x01;
+ if (blocksize > 0xFA) blocksize = 0xFA;
+ uint32_t blockquantity, blockremainder, blockfirst, blockduring;
- // Send "Request Download - tool to module" to Trionic
- if (!can_send_timeout (T7SEC_ID, T7_flash_jumpa, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
+ if (fseek (fp , address , SEEK_SET) != 0x0) {
+ printf("Cannot move to file position %#010x.\r\n", current_address);
+ printf("err %s line: %d\r\n", __FILE__, __LINE__ );
return FALSE;
}
- if (!can_send_timeout (T7SEC_ID, T7_flash_jumpb, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
+ for(i=0; i<3; i++) {
+ T7_flash_start[6-i] = (address >> (8*i)) & 0xff;
+ T7_flash_size[4-i] = (size >> (8*i)) & 0xff;
+ }
+
+ // Send "Request Download - tool to module" to Trionic for the BIN file code and 'cal' data
+ if (!can_send_timeout (T7SEC_ID, T7_flash_start, 8, T7MESSAGETIMEOUT)) {
+ printf("err %s line: %d\r\n", __FILE__, __LINE__ );
+ return FALSE;
+ }
+ if (!can_send_timeout (T7SEC_ID, T7_flash_size, 8, T7MESSAGETIMEOUT)) {
+ printf("err %s line: %d\r\n", __FILE__, __LINE__ );
return FALSE;
}
if (!can_wait_timeout(T7SEC_RX, data, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
+ printf("err %s line: %d\r\n", __FILE__, __LINE__ );
return FALSE;
}
T7_flash_ack[3] = data[0] & 0xBF;
if (!can_send_timeout (T7ACK_ID, T7_flash_ack, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
+ printf("err %s line: %d\r\n", __FILE__, __LINE__ );
return FALSE;
}
if ( data[3] != 0x74 ) {
printf("Cannot Update FLASH, message refused.\r\n");
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
+ printf("err %s line: %d\r\n", __FILE__, __LINE__ );
return FALSE;
}
- uint32_t address = 0;
-
+// FLASH main Binary image up to address + size
printf(" 0.00 %% complete.\r");
- while (address < T7FLASHSIZE) {
+ while (current_address < segment_end) {
+ if ((segment_end - current_address) < blocksize) {
+ blocksize = (segment_end - current_address);
+ wait_ms(T7MESSAGETIMEOUT);
+ }
+ if (blocksize > 4) {
+ blockfirst = 4;
+ blockquantity = (blocksize - blockfirst) / 6;
+ blockremainder = (blocksize - blockfirst) % 6;
+ if (blockremainder != 0) {
+ blockquantity++;
+ }
+ } else {
+ blockfirst = blocksize;
+ blockquantity = 0;
+ blockremainder = 0;
+ }
-// data[0] = 0x4A; // 0x40 send, | 0x0A (10) messages to follow
-// data[0] = 0x42; // 0x40 send, | 0x02 (2) messages to follow
- data[0] = 0x40; // 0x40 send, | 0x00 (0) messages to follow
+ data[0] = 0x40 + blockquantity; // e.g 0x40 send, | 0x0A (10) messages to follow
data[1] = 0xA1;
-// data[2] = 0x41; // length+1 (64 Bytes)
-// data[2] = 0x11; // length+1 (16 Bytes)
- data[2] = 0x05; // length+1 (4 Bytes)
+ data[2] = blocksize + 1; // length+1 (64 Bytes)
data[3] = 0x36; // Data Transfer
- for ( k = 4; k < 8; k++ )
- //data[k] = *(bin + bin_count++);
- if (!fread(&data[k],1,1,fp)) {
- fclose(fp);
- printf("Error reading the BIN file MODIFIED.BIN\r\n");
- return FALSE;
- }
-// /* DEBUG info...
-// for (k = 0; k < 8; k++ ) printf("0x%02X ", data[k] );
-// for (k = 2; k < 8; k++ ) printf("%c ", data[k] );
-// printf(" data\r\n");
-
- if (!can_send_timeout (T7SEC_ID, data, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
+ if (!fread((data+4),1,blockfirst,fp)) {
+ printf("\nError reading the BIN file MODIFIED.BIN\r\n");
return FALSE;
}
- /*
- for (i = 9; i>=0; i--) {
- // for (i = 1; i>=0; i--) {
- data[0] = i;
- // data[1] = 0xA1;
- for ( k = 2; k < 8; k++ )
- //data[k] = *(bin + bin_count++);
- if (!fread(&data[k],1,1,fp)) {
- fclose(fp);
- printf("Error reading the BIN file MODIFIED.BIN\r\n");
- return FALSE;
- }
- // /* DEBUG info...
- // for (k = 0; k < 8; k++ ) printf("0x%02X ", data[k] );
- // for (k = 2; k < 8; k++ ) printf("%c ", data[k] );
- // printf(" data\r\n");
-
- // printf("%6.2f\r", 100*(float)address/(float)T7FLASHSIZE );
- wait_ms(1);
- // wait_ms(10); // 31/3/12 this longer wait might be needed for i-bus connections...
- if (!can_send_timeout (T7SEC_ID, data, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
- return FALSE;
- }
+#ifdef DEBUG
+// DEBUG info...
+ for (k = 0; k < 8; k++ ) printf("0x%02X ", data[k] );
+ for (k = 2; k < 8; k++ ) printf("%c ", data[k] );
+ printf(" data\r\n");
+#endif
+ if (!can_send_timeout (T7SEC_ID, data, 8, T7MESSAGETIMEOUT)) {
+ printf("\nerr %s line: %d\r\n", __FILE__, __LINE__ );
+ return FALSE;
+ }
+ if (blocksize > 4) {
+ for (i = (blockquantity-1); i>=0; i--) {
+ data[0] = i;
+ if ((i == 0) && (blockremainder != 0)) {
+ blockduring = blockremainder;
+ } else {
+ blockduring = 6;
}
- */
-// address += 0x40;
-// address += 0x10;
- address += 0x04;
+ if (!fread((data+2),1,blockduring,fp)) {
+ printf("\nError reading the BIN file MODIFIED.BIN\r\n");
+ return FALSE;
+ }
+#ifdef DEBUG
+// DEBUG info...
+ for (k = 0; k < 8; k++ ) printf("0x%02X ", data[k] );
+ for (k = 2; k < 8; k++ ) printf("%c ", data[k] );
+ printf(" data\r\n");
+ printf("%6.2f\r", 100*(float)current_address/(float)T7FLASHSIZE );
+#endif
+ wait_us(300);
+// wait_ms(10); // 31/3/12 this longer wait might be needed for i-bus connections...
+ if (!can_send_timeout (T7SEC_ID, data, 8, T7MESSAGETIMEOUT)) {
+ printf("\nerr %s line: %d\r\n", __FILE__, __LINE__ );
+ return FALSE;
+ }
+ }
+ }
if (!can_wait_timeout(T7SEC_RX, data, 8, T7LONGERTIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
+ printf("\nerr %s line: %d\r\n", __FILE__, __LINE__ );
return FALSE;
}
// Send acknowledgement
T7_flash_ack[3] = data[0] & 0xBF;
if (!can_send_timeout (T7ACK_ID, T7_flash_ack, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
+ printf("\nerr %s line: %d\r\n", __FILE__, __LINE__ );
return FALSE;
}
if ( data[3] != 0x76 ) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
- return FALSE;
- }
- if (!(address % 0x80))
- printf("%6.2f\r", 100*(float)address/(float)T7FLASHSIZE );
- }
- printf("\n");
- /*
- // Send "Request Data Transfer Exit" to Trionic
- if (!can_send_timeout (T7SEC_ID, T7_flash_end, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
- return FALSE;
- }
- if (!can_wait_timeout(T7SEC_RX, data, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
- return FALSE;
- }
- T7_flash_ack[3] = data[0] & 0xBF;
- if (!can_send_timeout (T7ACK_ID, T7_flash_ack, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
+ printf ("\n");
+//#ifdef DEBUG
+// DEBUG info...
+ for (k = 0; k < 8; k++ ) printf("%#04x ", data[k] );
+ for (k = 2; k < 8; k++ ) printf("%c ", data[k] );
+ printf(" data\r\n");
+//#endif
+ printf("Cannot Program Address %#010x.\r\n", current_address);
+ printf("Block Size %#04x, First %#04x, Quantity %#04x, Remainder %#04x\r\n", blocksize, blockfirst, blockquantity, blockremainder);
+ printf("\nerr %s line: %d\r\n", __FILE__, __LINE__ );
return FALSE;
}
- if ( data[3] != 0x77 ) {
- printf("Cannot Update FLASH, message refused.\r\n");
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
- return FALSE;
- }
- // Send "Request Data Transfer Exit" to Trionic
- if (!can_send_timeout (T7SEC_ID, T7_flash_exit, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
- return FALSE;
- }
- if (!can_wait_timeout(T7SEC_RX, data, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
- return FALSE;
- }
- T7_flash_ack[3] = data[0] & 0xBF;
- if (!can_send_timeout (T7ACK_ID, T7_flash_ack, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
- return FALSE;
- }
- if ( data[3] != 0x71 ) {
- printf("Cannot Update FLASH, message refused.\r\n");
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
- return FALSE;
- }
- */
- timer.stop();
- printf("SUCCESS! Programming the FLASH took %#.1f seconds.\r\n",timer.read());
- fclose(fp);
+ current_address += blocksize;
+// if (!(current_address % 0x80))
+ printf("%6.2f\r", 100*(float)current_address/(float)T7FLASHSIZE );
+ }
+ if (blockmode == true) wait_ms(T7MESSAGETIMEOUT);
return TRUE;
}
+bool t7_flash(FILE *fp, bool blockmode)
+{
+ timer.reset();
+ timer.start();
+ printf("T7 program and caldata\r\n");
+ if (t7_flash_segment(fp, 0x000000, 0x070000, blockmode)) { // T7 program and caldata
+ printf("\nAdaptation data 1\r\n");
+ if (t7_flash_segment(fp, 0x070000, 0x002000, blockmode)) { // Adaptation data 1
+ printf("\nAdaptation data 2\r\n");
+ if (t7_flash_segment(fp, 0x07C000, 0x00280, blockmode)) { // Adaptation data 2
+ printf("\nT7Suite watermark\r\n");
+ if (t7_flash_segment(fp, 0x07FD00, 0x000020, blockmode)) { // T7Suite watermark
+ printf("\nT7 Header\r\n");
+ if (t7_flash_segment(fp, 0x07FF00, 0x000100, blockmode)) { // T7 Header
+ timer.stop();
+ printf("100.00\r\n");
+ printf("SUCCESS! Programming the FLASH took %#.1f seconds.\r\n",timer.read());
+ return true;
+ }
+ }
+ }
+ }
+ }
+ timer.stop();
+ printf("\nFAILURE! Unable to program FLASH after %#.1f seconds.\r\n",timer.read());
+ return false;
+}
-bool t7_flash() {
- char T7_flash_jumpa[] = T7FLABINA;
- char T7_flash_jumpb[] = T7FLABINB;
- char T7_flash_jumpc[] = T7FLAHDRA;
- char T7_flash_jumpd[] = T7FLAHDRB;
- char T7_flash_end[] = T7FLA_END;
+bool t7_recover(FILE *fp)
+{
+ timer.reset();
+ timer.start();
+ if (t7_flash_segment(fp, 0x000000, 0x080000, false)) { // Entire T7 BIN File
+ timer.stop();
+ printf("100.00\r\n");
+ printf("SUCCESS! Programming the FLASH took %#.1f seconds.\r\n",timer.read());
+ return true;
+ }
+ timer.stop();
+ printf("\nFAILURE! Unable to program FLASH after %#.1f seconds.\r\n",timer.read());
+ return false;
+}
+
+
+/// Reset and restart a T7 ECU after a FLASH operation
+///
+/// NOTE: DOESN't WORK !!!
+///
+bool t7_reset()
+{
char T7_flash_exit[] = T7FLAEXIT;
char T7_flash_ack[] = T7FLA_ACK;
+ char T7_flash_end[] = T7FLA_END;
char data[8];
- int i, k;
-
- // fopen modified.bin here?
- // need lots of fcloses though
- printf("Checking the FLASH BIN file...\r\n");
- FILE *fp = fopen("/local/modified.bin", "r"); // Open "modified.bin" on the local file system for reading
- if (!fp) {
- 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:
- fseek (fp , 0 , SEEK_END);
- uint32_t file_size = ftell (fp);
- 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;
- 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;
- rewind (fp);
-
- if (file_size != T7FLASHSIZE || stack_long != T7POINTER) {
- fclose(fp);
- printf("The BIN file does not appear to be for a T7 ECU :-(\r\n");
- printf("BIN file size: %#010x, FLASH chip size: %#010x, Pointer: %#010x.\r\n", file_size, T7FLASHSIZE, stack_long);
- return TERM_ERR;
- }
-
- timer.reset();
- timer.start();
-
- // Send "Request Download - tool to module" to Trionic
- if (!can_send_timeout (T7SEC_ID, T7_flash_jumpa, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
- return FALSE;
- }
- if (!can_send_timeout (T7SEC_ID, T7_flash_jumpb, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
+ printf("Restarting T7 ECU");
+ // Send "Request Data Transfer Exit" to Trionic
+ if (!can_send_timeout (T7SEC_ID, T7_flash_end, 8, T7MESSAGETIMEOUT)) {
+ printf("err %s line: %d\r\n", __FILE__, __LINE__ );
return FALSE;
}
if (!can_wait_timeout(T7SEC_RX, data, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
+ printf("err %s line: %d\r\n", __FILE__, __LINE__ );
return FALSE;
}
T7_flash_ack[3] = data[0] & 0xBF;
if (!can_send_timeout (T7ACK_ID, T7_flash_ack, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
- return FALSE;
- }
- if ( data[3] != 0x74 ) {
- printf("Cannot Update FLASH, message refused.\r\n");
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
+ printf("err %s line: %d\r\n", __FILE__, __LINE__ );
return FALSE;
}
-
- uint32_t address = 0;
-
- printf(" 0.00 %% complete.\r");
-// FLASH main Binary image up to address 0x7B000
- while (address < 0x70000) {
- data[0] = 0x40; // 0x40 send, | 0x00 (0) messages to follow
- data[1] = 0xA1;
- data[2] = 0x05; // length+1 (4 Bytes)
- data[3] = 0x36; // Data Transfer
- for ( k = 4; k < 8; k++ )
- if (!fread(&data[k],1,1,fp)) {
- fclose(fp);
- printf("Error reading the BIN file MODIFIED.BIN\r\n");
- return FALSE;
- }
- if (!can_send_timeout (T7SEC_ID, data, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
- return FALSE;
- }
- address += 0x04;
- if (!can_wait_timeout(T7SEC_RX, data, 8, T7LONGERTIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
- return FALSE;
- }
- // Send acknowledgement
- T7_flash_ack[3] = data[0] & 0xBF;
- if (!can_send_timeout (T7ACK_ID, T7_flash_ack, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
- return FALSE;
- }
- if ( data[3] != 0x76 ) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
- return FALSE;
- }
- if (!(address % 0x80))
- printf("%6.2f\r", 100*(float)address/(float)T7FLASHSIZE );
- }
-
- // Send "Request Download - tool to module" to Trionic
- if (!can_send_timeout (T7SEC_ID, T7_flash_jumpc, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
+ if ( data[3] != 0x77 ) {
+ printf("Cannot Update FLASH, message refused.\r\n");
+ printf("err %s line: %d\r\n", __FILE__, __LINE__ );
return FALSE;
}
- if (!can_send_timeout (T7SEC_ID, T7_flash_jumpd, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
+ //
+ // Send "Request Data Transfer Exit" to Trionic
+ if (!can_send_timeout (T7SEC_ID, T7_flash_exit, 8, T7MESSAGETIMEOUT)) {
+ printf("err %s line: %d\r\n", __FILE__, __LINE__ );
return FALSE;
}
if (!can_wait_timeout(T7SEC_RX, data, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
+ printf("err %s line: %d\r\n", __FILE__, __LINE__ );
return FALSE;
}
T7_flash_ack[3] = data[0] & 0xBF;
if (!can_send_timeout (T7ACK_ID, T7_flash_ack, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
- return FALSE;
- }
- if ( data[3] != 0x74 ) {
- printf("Cannot Update FLASH, message refused.\r\n");
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
+ printf("err %s line: %d\r\n", __FILE__, __LINE__ );
return FALSE;
}
-
- address = 0x7FF00;
- fseek (fp , 0x7FF00 , SEEK_SET);
-
-// FLASH BIN file Header
- while (address < T7FLASHSIZE) {
- data[0] = 0x40; // 0x40 send, | 0x00 (0) messages to follow
- data[1] = 0xA1;
- data[2] = 0x05; // length+1 (4 Bytes)
- data[3] = 0x36; // Data Transfer
- for ( k = 4; k < 8; k++ )
- if (!fread(&data[k],1,1,fp)) {
- fclose(fp);
- printf("Error reading the BIN file MODIFIED.BIN\r\n");
- return FALSE;
- }
- if (!can_send_timeout (T7SEC_ID, data, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
- return FALSE;
- }
- address += 0x04;
- if (!can_wait_timeout(T7SEC_RX, data, 8, T7LONGERTIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
- return FALSE;
- }
- // Send acknowledgement
- T7_flash_ack[3] = data[0] & 0xBF;
- if (!can_send_timeout (T7ACK_ID, T7_flash_ack, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
- return FALSE;
- }
- if ( data[3] != 0x76 ) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
- return FALSE;
- }
- if (!(address % 0x80))
- printf("%6.2f\r", 100*(float)address/(float)T7FLASHSIZE );
+ if ( data[3] != 0x71 ) {
+ printf("err %s line: %d\r\n", __FILE__, __LINE__ );
+ return FALSE;
}
-
-
- printf("\n");
- printf("Restarting T7 ECU");
-/*
- // Send "Request Data Transfer Exit" to Trionic
- if (!can_send_timeout (T7SEC_ID, T7_flash_end, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
- return FALSE;
- }
- if (!can_wait_timeout(T7SEC_RX, data, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
- return FALSE;
- }
- T7_flash_ack[3] = data[0] & 0xBF;
- if (!can_send_timeout (T7ACK_ID, T7_flash_ack, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
- return FALSE;
- }
- if ( data[3] != 0x77 ) {
- printf("Cannot Update FLASH, message refused.\r\n");
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
- return FALSE;
- }
-//
- // Send "Request Data Transfer Exit" to Trionic
- if (!can_send_timeout (T7SEC_ID, T7_flash_exit, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
- return FALSE;
- }
- if (!can_wait_timeout(T7SEC_RX, data, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
- return FALSE;
- }
- T7_flash_ack[3] = data[0] & 0xBF;
- if (!can_send_timeout (T7ACK_ID, T7_flash_ack, 8, T7MESSAGETIMEOUT)) {
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
- return FALSE;
- }
- if ( data[3] != 0x71 ) {
- printf("Cannot Update FLASH, message refused.\r\n");
- printf("err t7utils line: %d\r\n", __LINE__ );
- fclose(fp);
- return FALSE;
- }
-*/
- timer.stop();
- printf("SUCCESS! Programming the FLASH took %#.1f seconds.\r\n",timer.read());
- fclose(fp);
- return TRUE;
-}
\ No newline at end of file
+ return true;
+}