Just4Trionic - CAN and BDM FLASH programmer for Saab cars

Dependencies:   mbed

Committer:
Just4pLeisure
Date:
Sat Apr 25 17:07:08 2015 +0000
Revision:
5:1775b4b13232
Parent:
4:682d96ff6d79
Child:
6:2fbcbebed28c
Version 1.5 Is a significant milestone.; ; Supports BDM and CAN read and write of T5.x, T7 and T8 ECU's plus T8 recovery.; A Target Resident Driver for BDM gives a big speed boost.; Supports many alternative replacement FLASH chips for T5.x ECU's;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Just4pLeisure 3:92dae9083c83 1 /*******************************************************************************
Just4pLeisure 3:92dae9083c83 2
Just4pLeisure 3:92dae9083c83 3 t7utils.cpp
Just4pLeisure 4:682d96ff6d79 4 (c) 2011, 2012 by Sophie Dexter
Just4pLeisure 3:92dae9083c83 5 portions (c) Tomi Liljemark (firstname.surname@gmail.com)
Just4pLeisure 3:92dae9083c83 6
Just4pLeisure 3:92dae9083c83 7 This C++ module provides functions for communicating simple messages to and from
Just4pLeisure 3:92dae9083c83 8 the T7 ECU
Just4pLeisure 3:92dae9083c83 9
Just4pLeisure 3:92dae9083c83 10 ********************************************************************************
Just4pLeisure 3:92dae9083c83 11
Just4pLeisure 3:92dae9083c83 12 WARNING: Use at your own risk, sadly this software comes with no guarantees.
Just4pLeisure 3:92dae9083c83 13 This software is provided 'free' and in good faith, but the author does not
Just4pLeisure 3:92dae9083c83 14 accept liability for any damage arising from its use.
Just4pLeisure 3:92dae9083c83 15
Just4pLeisure 3:92dae9083c83 16 *******************************************************************************/
Just4pLeisure 3:92dae9083c83 17
Just4pLeisure 3:92dae9083c83 18 #include "t7utils.h"
Just4pLeisure 3:92dae9083c83 19
Just4pLeisure 3:92dae9083c83 20
Just4pLeisure 3:92dae9083c83 21 //
Just4pLeisure 3:92dae9083c83 22 // t7_initialise
Just4pLeisure 3:92dae9083c83 23 //
Just4pLeisure 3:92dae9083c83 24 // sends an initialisation message to the T7 ECU
Just4pLeisure 3:92dae9083c83 25 // but doesn't displays anything.
Just4pLeisure 3:92dae9083c83 26 //
Just4pLeisure 3:92dae9083c83 27 // inputs: none
Just4pLeisure 3:92dae9083c83 28 // return: bool TRUE if there was a message, FALSE if no message.
Just4pLeisure 3:92dae9083c83 29 //
Just4pLeisure 3:92dae9083c83 30
Just4pLeisure 3:92dae9083c83 31
Just4pLeisure 3:92dae9083c83 32 bool t7_initialise() {
Just4pLeisure 3:92dae9083c83 33 // send a can message to the T7 requesting that it initialises CAN communication with Just4Trionic
Just4pLeisure 3:92dae9083c83 34 char T7TxMsg[] = T7INITMSG;
Just4pLeisure 3:92dae9083c83 35 if (!can_send_timeout (T7CMNDID, T7TxMsg, 8, T7MESSAGETIMEOUT))
Just4pLeisure 3:92dae9083c83 36 return FALSE;
Just4pLeisure 3:92dae9083c83 37 // wait for the T7 to reply
Just4pLeisure 3:92dae9083c83 38 char T7RxMsg[8];
Just4pLeisure 3:92dae9083c83 39 // if a message is not received, has the wrong id
Just4pLeisure 3:92dae9083c83 40 if (!can_wait_timeout(T7RESPID, T7RxMsg, 8, T7MESSAGETIMEOUT))
Just4pLeisure 3:92dae9083c83 41 return FALSE;
Just4pLeisure 3:92dae9083c83 42 /* DEBUG info...
Just4pLeisure 3:92dae9083c83 43 for (int i = 0; i < 8; i++ ) printf("0x%02X ", T7RxMsg[i] );
Just4pLeisure 3:92dae9083c83 44 printf(" init\r\n");
Just4pLeisure 3:92dae9083c83 45 */
Just4pLeisure 3:92dae9083c83 46 return TRUE;
Just4pLeisure 3:92dae9083c83 47 }
Just4pLeisure 3:92dae9083c83 48
Just4pLeisure 3:92dae9083c83 49 //
Just4pLeisure 3:92dae9083c83 50 // t7_authenticate
Just4pLeisure 3:92dae9083c83 51 //
Just4pLeisure 3:92dae9083c83 52 // sends an authentication message to the T7 ECU
Just4pLeisure 3:92dae9083c83 53 // but doesn't displays anything.
Just4pLeisure 3:92dae9083c83 54 //
Just4pLeisure 3:92dae9083c83 55 // inputs: none
Just4pLeisure 3:92dae9083c83 56 // return: bool TRUE if there was a message, FALSE if no message.
Just4pLeisure 3:92dae9083c83 57 //
Just4pLeisure 3:92dae9083c83 58
Just4pLeisure 3:92dae9083c83 59 bool t7_authenticate() {
Just4pLeisure 3:92dae9083c83 60 uint16_t seed, key;
Just4pLeisure 3:92dae9083c83 61 // uint16_t i;
Just4pLeisure 3:92dae9083c83 62 char T7TxAck[] = T7ACK_MSG;
Just4pLeisure 3:92dae9083c83 63 char T7TxMsg[] = T7SEC_MSG;
Just4pLeisure 3:92dae9083c83 64 char T7TxKey[] = T7KEY_MSG;
Just4pLeisure 3:92dae9083c83 65 char T7RxMsg[8];
Just4pLeisure 3:92dae9083c83 66 // Send "Request Seed" to Trionic7
Just4pLeisure 3:92dae9083c83 67 if (!can_send_timeout (T7SEC_ID, T7TxMsg, 8, T7MESSAGETIMEOUT))
Just4pLeisure 3:92dae9083c83 68 return FALSE;
Just4pLeisure 3:92dae9083c83 69 // wait for the T7 to reply
Just4pLeisure 3:92dae9083c83 70 // Read "Seed"
Just4pLeisure 3:92dae9083c83 71 // if a message is not received id return false
Just4pLeisure 3:92dae9083c83 72 if (!can_wait_timeout(T7SEC_RX, T7RxMsg, 8, T7MESSAGETIMEOUT))
Just4pLeisure 3:92dae9083c83 73 return FALSE;
Just4pLeisure 3:92dae9083c83 74 /* DEBUG info...
Just4pLeisure 3:92dae9083c83 75 for (i = 0; i < 8; i++ ) printf("0x%02X ", T7RxMsg[i] );
Just4pLeisure 3:92dae9083c83 76 printf(" seed\r\n");
Just4pLeisure 3:92dae9083c83 77 */
Just4pLeisure 3:92dae9083c83 78 // Send Ack
Just4pLeisure 3:92dae9083c83 79 T7TxAck[3] = T7RxMsg[0] & 0xBF;
Just4pLeisure 3:92dae9083c83 80 if (!can_send_timeout (T7ACK_ID, T7TxAck, 8, T7MESSAGETIMEOUT))
Just4pLeisure 3:92dae9083c83 81 return FALSE;
Just4pLeisure 3:92dae9083c83 82 // Send "Key", try two different methods of calculating the key
Just4pLeisure 3:92dae9083c83 83 seed = T7RxMsg[5] << 8 | T7RxMsg[6];
Just4pLeisure 3:92dae9083c83 84 for (int method = 0; method < 2; method++ ) {
Just4pLeisure 3:92dae9083c83 85 key = seed << 2;
Just4pLeisure 3:92dae9083c83 86 key &= 0xFFFF;
Just4pLeisure 3:92dae9083c83 87 key ^= ( method ? 0x4081 : 0x8142 );
Just4pLeisure 3:92dae9083c83 88 key -= ( method ? 0x1F6F : 0x2356 );
Just4pLeisure 3:92dae9083c83 89 key &= 0xFFFF;
Just4pLeisure 3:92dae9083c83 90 T7TxKey[5] = ( key >> 8 ) & 0xFF;
Just4pLeisure 3:92dae9083c83 91 T7TxKey[6] = key & 0xFF;
Just4pLeisure 3:92dae9083c83 92 if (!can_send_timeout (T7SEC_ID, T7TxKey, 8, T7MESSAGETIMEOUT))
Just4pLeisure 3:92dae9083c83 93 return FALSE;
Just4pLeisure 3:92dae9083c83 94 // Wait for response
Just4pLeisure 3:92dae9083c83 95 // if a message is not received id return false
Just4pLeisure 3:92dae9083c83 96 if (!can_wait_timeout(T7SEC_RX, T7RxMsg, 8, T7MESSAGETIMEOUT))
Just4pLeisure 3:92dae9083c83 97 return FALSE;
Just4pLeisure 3:92dae9083c83 98 /* DEBUG info...
Just4pLeisure 3:92dae9083c83 99 for (i = 0; i < 8; i++ ) printf("0x%02X ", T7RxMsg[i] );
Just4pLeisure 3:92dae9083c83 100 printf(" key %d 0x%02X 0x%02X\r\n", method, T7RxMsg[3], T7RxMsg[5]);
Just4pLeisure 3:92dae9083c83 101 */
Just4pLeisure 3:92dae9083c83 102 // Send Ack
Just4pLeisure 3:92dae9083c83 103 T7TxAck[3] = T7RxMsg[0] & 0xBF;
Just4pLeisure 3:92dae9083c83 104 if (!can_send_timeout (T7ACK_ID, T7TxAck, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 105 /* DEBUG info...
Just4pLeisure 3:92dae9083c83 106 printf("Key ACK message timeout\r\n");
Just4pLeisure 3:92dae9083c83 107 */
Just4pLeisure 3:92dae9083c83 108 return FALSE;
Just4pLeisure 3:92dae9083c83 109 }
Just4pLeisure 3:92dae9083c83 110 if ( T7RxMsg[3] == 0x67 && T7RxMsg[5] == 0x34 ) {
Just4pLeisure 3:92dae9083c83 111 /* DEBUG info...
Just4pLeisure 3:92dae9083c83 112 printf("Key %d Accepted\r\n", method);
Just4pLeisure 3:92dae9083c83 113 */
Just4pLeisure 3:92dae9083c83 114 return TRUE;
Just4pLeisure 3:92dae9083c83 115 } else {
Just4pLeisure 3:92dae9083c83 116 /* DEBUG info...
Just4pLeisure 3:92dae9083c83 117 printf("Key %d Failed\r\n", method);
Just4pLeisure 3:92dae9083c83 118 */
Just4pLeisure 3:92dae9083c83 119 }
Just4pLeisure 3:92dae9083c83 120 }
Just4pLeisure 3:92dae9083c83 121 return FALSE;
Just4pLeisure 3:92dae9083c83 122 }
Just4pLeisure 3:92dae9083c83 123 //
Just4pLeisure 3:92dae9083c83 124 // t7_dump
Just4pLeisure 3:92dae9083c83 125 //
Just4pLeisure 3:92dae9083c83 126 // dumps the T7 BIN File
Just4pLeisure 3:92dae9083c83 127 // but doesn't displays anything.
Just4pLeisure 3:92dae9083c83 128 //
Just4pLeisure 3:92dae9083c83 129 // inputs: none
Just4pLeisure 3:92dae9083c83 130 // return: bool TRUE if there was a message, FALSE if no message.
Just4pLeisure 3:92dae9083c83 131 //
Just4pLeisure 3:92dae9083c83 132
Just4pLeisure 3:92dae9083c83 133 bool t7_dump() {
Just4pLeisure 3:92dae9083c83 134 uint32_t received;
Just4pLeisure 3:92dae9083c83 135 uint8_t byte_count, retries, i;
Just4pLeisure 3:92dae9083c83 136 char T7_dump_jumpa[] = T7DMPJP1A;
Just4pLeisure 3:92dae9083c83 137 char T7_dump_jumpb[] = T7DMPJP1B;
Just4pLeisure 3:92dae9083c83 138 char T7_dump_ack[] = T7DMP_ACK;
Just4pLeisure 3:92dae9083c83 139 char T7_dump_data[] = T7DMPDATA;
Just4pLeisure 3:92dae9083c83 140 char T7_dump_end[] = T7DMP_END;
Just4pLeisure 3:92dae9083c83 141 char T7RxMsg[8];
Just4pLeisure 3:92dae9083c83 142
Just4pLeisure 3:92dae9083c83 143 printf("Creating FLASH dump file...\r\n");
Just4pLeisure 3:92dae9083c83 144 FILE *fp = fopen("/local/original.bin", "w"); // Open "original.bin" on the local file system for writing
Just4pLeisure 3:92dae9083c83 145 if (!fp) {
Just4pLeisure 3:92dae9083c83 146 perror ("The following error occured");
Just4pLeisure 3:92dae9083c83 147 return TERM_ERR;
Just4pLeisure 3:92dae9083c83 148 }
Just4pLeisure 3:92dae9083c83 149
Just4pLeisure 3:92dae9083c83 150 timer.reset();
Just4pLeisure 3:92dae9083c83 151 timer.start();
Just4pLeisure 3:92dae9083c83 152
Just4pLeisure 3:92dae9083c83 153 received = 0;
Just4pLeisure 4:682d96ff6d79 154 printf(" 0.00 %% complete.\r");
Just4pLeisure 3:92dae9083c83 155 while (received < T7FLASHSIZE) {
Just4pLeisure 3:92dae9083c83 156 // T7_dump_jumpa[7] = ((T7FLASHSIZE - received) < 0xEF) ? (T7FLASHSIZE - received) : 0xEF;
Just4pLeisure 3:92dae9083c83 157 T7_dump_jumpb[2] = (received >> 16) & 0xFF;
Just4pLeisure 3:92dae9083c83 158 T7_dump_jumpb[3] = (received >> 8) & 0xFF;
Just4pLeisure 3:92dae9083c83 159 T7_dump_jumpb[4] = received & 0xFF;
Just4pLeisure 3:92dae9083c83 160 // Send read address and length to Trionic
Just4pLeisure 3:92dae9083c83 161 if (!can_send_timeout (T7SEC_ID, T7_dump_jumpa, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 162 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 163 fclose(fp);
Just4pLeisure 3:92dae9083c83 164 return FALSE;
Just4pLeisure 3:92dae9083c83 165 }
Just4pLeisure 3:92dae9083c83 166 if (!can_send_timeout (T7SEC_ID, T7_dump_jumpb, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 167 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 168 fclose(fp);
Just4pLeisure 3:92dae9083c83 169 return FALSE;
Just4pLeisure 3:92dae9083c83 170 }
Just4pLeisure 3:92dae9083c83 171 // Wait for a response
Just4pLeisure 3:92dae9083c83 172 if (!can_wait_timeout(T7SEC_RX, T7RxMsg, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 173 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 174 fclose(fp);
Just4pLeisure 3:92dae9083c83 175 return FALSE;
Just4pLeisure 3:92dae9083c83 176 }
Just4pLeisure 3:92dae9083c83 177 /* DEBUG info...
Just4pLeisure 3:92dae9083c83 178 for (i = 0; i < 8; i++ ) printf("0x%02X ", T7RxMsg[i] );
Just4pLeisure 3:92dae9083c83 179 printf(" seed\r\n");
Just4pLeisure 3:92dae9083c83 180 */
Just4pLeisure 3:92dae9083c83 181 // Send Ack
Just4pLeisure 3:92dae9083c83 182 T7_dump_ack[3] = T7RxMsg[0] & 0xBF;
Just4pLeisure 3:92dae9083c83 183 if (!can_send_timeout (T7ACK_ID, T7_dump_ack, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 184 printf("ERROR Asking1: %5.1f %% done\r\n", 100*(float)received/(float)T7FLASHSIZE);
Just4pLeisure 3:92dae9083c83 185 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 186 fclose(fp);
Just4pLeisure 3:92dae9083c83 187 return FALSE;
Just4pLeisure 3:92dae9083c83 188 }
Just4pLeisure 3:92dae9083c83 189 if ((T7RxMsg[3] != 0x6C) ||(T7RxMsg[4] != 0xF0)) {
Just4pLeisure 3:92dae9083c83 190 printf("ERROR Asking2: %5.1f %% done\r\n", 100*(float)received/(float)T7FLASHSIZE);
Just4pLeisure 3:92dae9083c83 191 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 192 fclose(fp);
Just4pLeisure 3:92dae9083c83 193 return FALSE;
Just4pLeisure 3:92dae9083c83 194 }
Just4pLeisure 3:92dae9083c83 195 // Ask T7 ECU to start sending data
Just4pLeisure 3:92dae9083c83 196 for (retries = 0 ; retries <10 ; retries++ ) {
Just4pLeisure 3:92dae9083c83 197 if (!can_send_timeout (T7SEC_ID, T7_dump_data, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 198 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 199 fclose(fp);
Just4pLeisure 3:92dae9083c83 200 return FALSE;
Just4pLeisure 3:92dae9083c83 201 }
Just4pLeisure 3:92dae9083c83 202 // Read mesages from the T7 ECU
Just4pLeisure 3:92dae9083c83 203 byte_count = 0;
Just4pLeisure 3:92dae9083c83 204 T7RxMsg[0] = 0x00;
Just4pLeisure 3:92dae9083c83 205 while (T7RxMsg[0] != 0x80 && T7RxMsg[0] != 0xC0) {
Just4pLeisure 3:92dae9083c83 206 if (!can_wait_timeout(T7SEC_RX, T7RxMsg, 8, T7MESSAGETIMEOUT))
Just4pLeisure 3:92dae9083c83 207 break;
Just4pLeisure 3:92dae9083c83 208 // Need to process the received data here!
Just4pLeisure 3:92dae9083c83 209 // Send Ack
Just4pLeisure 3:92dae9083c83 210 T7_dump_ack[3] = T7RxMsg[0] & 0xBF;
Just4pLeisure 3:92dae9083c83 211 if (!can_send_timeout (T7ACK_ID, T7_dump_ack, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 212 printf("ERROR processing: %5.1f %% done\r\n", 100*(float)received/(float)T7FLASHSIZE);
Just4pLeisure 3:92dae9083c83 213 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 214 fclose(fp);
Just4pLeisure 3:92dae9083c83 215 return FALSE;
Just4pLeisure 3:92dae9083c83 216 }
Just4pLeisure 3:92dae9083c83 217 // /* DEBUG info...
Just4pLeisure 3:92dae9083c83 218 // for (i = 0; i < 8; i++ ) printf("0x%02X ", T7RxMsg[i] );
Just4pLeisure 3:92dae9083c83 219 // for (i = 2; i < 8; i++ ) printf("%c ", T7RxMsg[i] );
Just4pLeisure 3:92dae9083c83 220 // printf(" data\r\n");
Just4pLeisure 3:92dae9083c83 221 for (i = 2; i < 8; i++ )
Just4pLeisure 3:92dae9083c83 222 file_buffer[byte_count++] = (T7RxMsg[i]);
Just4pLeisure 3:92dae9083c83 223 // */
Just4pLeisure 3:92dae9083c83 224 }
Just4pLeisure 3:92dae9083c83 225 // Success if these conditions met
Just4pLeisure 3:92dae9083c83 226 if (T7RxMsg[0] == 0x80 || T7RxMsg[0] == 0xC0)
Just4pLeisure 3:92dae9083c83 227 break;
Just4pLeisure 3:92dae9083c83 228 // printf("retries: %d\r\n", retries);
Just4pLeisure 3:92dae9083c83 229 }
Just4pLeisure 3:92dae9083c83 230 if (retries > 9) {
Just4pLeisure 3:92dae9083c83 231 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 232 printf("Retries: %d, Done: %5.2f %%\r\n", retries, 100*(float)received/(float)T7FLASHSIZE );
Just4pLeisure 3:92dae9083c83 233 fclose(fp);
Just4pLeisure 3:92dae9083c83 234 return FALSE;
Just4pLeisure 3:92dae9083c83 235 }
Just4pLeisure 3:92dae9083c83 236 // received += 0xEF;
Just4pLeisure 3:92dae9083c83 237 received += 0x80;
Just4pLeisure 3:92dae9083c83 238 // printf("Retries: %d, Done: %5.2f %%\r\n", retries, 100*(float)received/(float)T7FLASHSIZE );
Just4pLeisure 3:92dae9083c83 239 printf("%6.2f\r", 100*(float)received/(float)T7FLASHSIZE );
Just4pLeisure 3:92dae9083c83 240 fwrite((file_buffer + 3), 1, 0x80, fp);
Just4pLeisure 3:92dae9083c83 241 if (ferror (fp)) {
Just4pLeisure 3:92dae9083c83 242 fclose (fp);
Just4pLeisure 3:92dae9083c83 243 printf ("Error writing to the FLASH BIN file.\r\n");
Just4pLeisure 3:92dae9083c83 244 return TERM_ERR;
Just4pLeisure 3:92dae9083c83 245 }
Just4pLeisure 3:92dae9083c83 246 }
Just4pLeisure 3:92dae9083c83 247 printf("\n");
Just4pLeisure 3:92dae9083c83 248 // Send Message to T7 ECU to say that we have finished
Just4pLeisure 3:92dae9083c83 249 if (!can_send_timeout (T7SEC_ID, T7_dump_end, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 250 fclose(fp);
Just4pLeisure 3:92dae9083c83 251 return FALSE;
Just4pLeisure 3:92dae9083c83 252 }
Just4pLeisure 3:92dae9083c83 253 // Wait for response
Just4pLeisure 3:92dae9083c83 254 if (!can_wait_timeout(T7SEC_RX, T7RxMsg, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 255 fclose(fp);
Just4pLeisure 3:92dae9083c83 256 return FALSE;
Just4pLeisure 3:92dae9083c83 257 }
Just4pLeisure 3:92dae9083c83 258 // Send Ack
Just4pLeisure 3:92dae9083c83 259 T7_dump_ack[3] = T7RxMsg[0] & 0xBF;
Just4pLeisure 3:92dae9083c83 260 if (!can_send_timeout (T7ACK_ID, T7_dump_ack, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 261 printf("ERROR closing1: %5.1f %% done\r\n", 100*(float)received/(float)T7FLASHSIZE);
Just4pLeisure 3:92dae9083c83 262 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 263 fclose(fp);
Just4pLeisure 3:92dae9083c83 264 return FALSE;
Just4pLeisure 3:92dae9083c83 265 }
Just4pLeisure 3:92dae9083c83 266 if (T7RxMsg[3] != 0xC2) {
Just4pLeisure 3:92dae9083c83 267 printf("ERROR closing2: %5.1f %% done\r\n", 100*(float)received/(float)T7FLASHSIZE);
Just4pLeisure 3:92dae9083c83 268 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 269 fclose(fp);
Just4pLeisure 3:92dae9083c83 270 return FALSE;
Just4pLeisure 3:92dae9083c83 271 }
Just4pLeisure 3:92dae9083c83 272 timer.stop();
Just4pLeisure 3:92dae9083c83 273 printf("SUCCESS! Getting the FLASH dump took %#.1f seconds.\r\n",timer.read());
Just4pLeisure 3:92dae9083c83 274 fclose(fp);
Just4pLeisure 3:92dae9083c83 275 return TRUE;
Just4pLeisure 3:92dae9083c83 276 }
Just4pLeisure 3:92dae9083c83 277
Just4pLeisure 3:92dae9083c83 278 bool t7_erase() {
Just4pLeisure 3:92dae9083c83 279 char T7_erase_msga[] = { 0x40, 0xA1, 0x02, 0x31, 0x52, 0x00, 0x00, 0x00 };
Just4pLeisure 3:92dae9083c83 280 char T7_erase_msgb[] = { 0x40, 0xA1, 0x02, 0x31, 0x53, 0x00, 0x00, 0x00 };
Just4pLeisure 3:92dae9083c83 281 char T7_erase_confirm[] = { 0x40, 0xA1, 0x01, 0x3E, 0x00, 0x00, 0x00, 0x00 };
Just4pLeisure 3:92dae9083c83 282 char T7_erase_ack[] = { 0x40, 0xA1, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00 };
Just4pLeisure 3:92dae9083c83 283 char data[8];
Just4pLeisure 3:92dae9083c83 284 int i;
Just4pLeisure 3:92dae9083c83 285
Just4pLeisure 3:92dae9083c83 286 printf("Erasing T7 ECU FLASH...\r\n");
Just4pLeisure 3:92dae9083c83 287
Just4pLeisure 3:92dae9083c83 288 data[3] = 0;
Just4pLeisure 3:92dae9083c83 289 i = 0;
Just4pLeisure 3:92dae9083c83 290 while ( data[3] != 0x71 && i < 10) {
Just4pLeisure 3:92dae9083c83 291 // Send "Request to ERASE" to Trionic
Just4pLeisure 3:92dae9083c83 292 if (!can_send_timeout (T7SEC_ID, T7_erase_msga, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 293 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 294 return FALSE;
Just4pLeisure 3:92dae9083c83 295 }
Just4pLeisure 3:92dae9083c83 296 if (!can_wait_timeout(T7SEC_RX, data, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 297 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 298 return FALSE;
Just4pLeisure 3:92dae9083c83 299 }
Just4pLeisure 3:92dae9083c83 300 T7_erase_ack[3] = data[0] & 0xBF;
Just4pLeisure 3:92dae9083c83 301 if (!can_send_timeout (T7ACK_ID, T7_erase_ack, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 302 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 303 return FALSE;
Just4pLeisure 3:92dae9083c83 304 }
Just4pLeisure 3:92dae9083c83 305 wait_ms(100);
Just4pLeisure 3:92dae9083c83 306 i++;
Just4pLeisure 3:92dae9083c83 307 printf(".");
Just4pLeisure 3:92dae9083c83 308 }
Just4pLeisure 3:92dae9083c83 309 printf("\r\n");
Just4pLeisure 3:92dae9083c83 310 // Check to see if erase operation lasted longer than 1 sec...
Just4pLeisure 3:92dae9083c83 311 if (i >=10) {
Just4pLeisure 3:92dae9083c83 312 printf("Second Message took too long'\r\n");
Just4pLeisure 3:92dae9083c83 313 return FALSE;
Just4pLeisure 3:92dae9083c83 314 }
Just4pLeisure 3:92dae9083c83 315 data[3] = 0;
Just4pLeisure 3:92dae9083c83 316 i = 0;
Just4pLeisure 3:92dae9083c83 317 while ( data[3] != 0x71 && i < 200) {
Just4pLeisure 3:92dae9083c83 318 // Send "Request to ERASE" to Trionic
Just4pLeisure 3:92dae9083c83 319 if (!can_send_timeout (T7SEC_ID, T7_erase_msgb, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 320 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 321 return FALSE;
Just4pLeisure 3:92dae9083c83 322 }
Just4pLeisure 3:92dae9083c83 323 if (!can_wait_timeout(T7SEC_RX, data, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 324 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 325 return FALSE;
Just4pLeisure 3:92dae9083c83 326 }
Just4pLeisure 3:92dae9083c83 327 T7_erase_ack[3] = data[0] & 0xBF;
Just4pLeisure 3:92dae9083c83 328 if (!can_send_timeout (T7ACK_ID, T7_erase_ack, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 329 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 330 return FALSE;
Just4pLeisure 3:92dae9083c83 331 }
Just4pLeisure 3:92dae9083c83 332 wait_ms(100);
Just4pLeisure 3:92dae9083c83 333 i++;
Just4pLeisure 3:92dae9083c83 334 printf(".");
Just4pLeisure 3:92dae9083c83 335 }
Just4pLeisure 3:92dae9083c83 336 printf("\r\n");
Just4pLeisure 3:92dae9083c83 337 // Check to see if erase operation lasted longer than 20 sec...
Just4pLeisure 3:92dae9083c83 338 if (i >=200) {
Just4pLeisure 3:92dae9083c83 339 printf("Second Message took too long'\r\n");
Just4pLeisure 3:92dae9083c83 340 return FALSE;
Just4pLeisure 3:92dae9083c83 341 }
Just4pLeisure 3:92dae9083c83 342
Just4pLeisure 3:92dae9083c83 343 // Confirm erase was successful?
Just4pLeisure 3:92dae9083c83 344 // (Note: no acknowledgements used for some reason)
Just4pLeisure 3:92dae9083c83 345 if (!can_send_timeout (T7SEC_ID, T7_erase_confirm, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 346 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 347 return FALSE;
Just4pLeisure 3:92dae9083c83 348 }
Just4pLeisure 3:92dae9083c83 349 if (!can_wait_timeout(T7SEC_RX, data, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 350 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 351 return FALSE;
Just4pLeisure 3:92dae9083c83 352 }
Just4pLeisure 3:92dae9083c83 353 if ( data[3] != 0x7E ) {
Just4pLeisure 3:92dae9083c83 354 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 355 return FALSE;
Just4pLeisure 3:92dae9083c83 356 }
Just4pLeisure 3:92dae9083c83 357 wait_ms(100);
Just4pLeisure 3:92dae9083c83 358 if (!can_send_timeout (T7SEC_ID, T7_erase_confirm, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 359 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 360 return FALSE;
Just4pLeisure 3:92dae9083c83 361 }
Just4pLeisure 3:92dae9083c83 362 if (!can_wait_timeout(T7SEC_RX, data, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 363 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 364 return FALSE;
Just4pLeisure 3:92dae9083c83 365 }
Just4pLeisure 3:92dae9083c83 366 if ( data[3] != 0x7E ) {
Just4pLeisure 3:92dae9083c83 367 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 368 return FALSE;
Just4pLeisure 3:92dae9083c83 369 }
Just4pLeisure 3:92dae9083c83 370 printf("SUCCESS: The FLASH has been erased.\r\n");
Just4pLeisure 3:92dae9083c83 371 return TRUE;
Just4pLeisure 3:92dae9083c83 372 }
Just4pLeisure 3:92dae9083c83 373
Just4pLeisure 4:682d96ff6d79 374 bool t7_flash_raw() {
Just4pLeisure 3:92dae9083c83 375 char T7_flash_jumpa[] = T7FLAJP1A;
Just4pLeisure 3:92dae9083c83 376 char T7_flash_jumpb[] = T7FLAJP1B;
Just4pLeisure 3:92dae9083c83 377 char T7_flash_end[] = T7FLA_END;
Just4pLeisure 3:92dae9083c83 378 char T7_flash_exit[] = T7FLAEXIT;
Just4pLeisure 3:92dae9083c83 379 char T7_flash_ack[] = T7FLA_ACK;
Just4pLeisure 3:92dae9083c83 380 char data[8];
Just4pLeisure 3:92dae9083c83 381 int i, k;
Just4pLeisure 3:92dae9083c83 382
Just4pLeisure 5:1775b4b13232 383 // fopen modified.bin here?
Just4pLeisure 3:92dae9083c83 384 // need lots of fcloses though
Just4pLeisure 3:92dae9083c83 385 printf("Checking the FLASH BIN file...\r\n");
Just4pLeisure 5:1775b4b13232 386 FILE *fp = fopen("/local/modified.bin", "r"); // Open "modified.bin" on the local file system for reading
Just4pLeisure 3:92dae9083c83 387 if (!fp) {
Just4pLeisure 5:1775b4b13232 388 printf("Error: I could not find the BIN file MODIFIED.BIN\r\n");;
Just4pLeisure 3:92dae9083c83 389 return TERM_ERR;
Just4pLeisure 3:92dae9083c83 390 }
Just4pLeisure 3:92dae9083c83 391 // obtain file size - it should match the size of the FLASH chips:
Just4pLeisure 3:92dae9083c83 392 fseek (fp , 0 , SEEK_END);
Just4pLeisure 3:92dae9083c83 393 uint32_t file_size = ftell (fp);
Just4pLeisure 3:92dae9083c83 394 rewind (fp);
Just4pLeisure 3:92dae9083c83 395
Just4pLeisure 3:92dae9083c83 396 // read the initial stack pointer value in the BIN file - it should match the value expected for the type of ECU
Just4pLeisure 3:92dae9083c83 397 uint8_t stack_byte = 0;
Just4pLeisure 3:92dae9083c83 398 uint32_t stack_long = 0;
Just4pLeisure 3:92dae9083c83 399 if (!fread(&stack_byte,1,1,fp)) return TERM_ERR;
Just4pLeisure 3:92dae9083c83 400 stack_long |= (stack_byte << 24);
Just4pLeisure 3:92dae9083c83 401 if (!fread(&stack_byte,1,1,fp)) return TERM_ERR;
Just4pLeisure 3:92dae9083c83 402 stack_long |= (stack_byte << 16);
Just4pLeisure 3:92dae9083c83 403 if (!fread(&stack_byte,1,1,fp)) return TERM_ERR;
Just4pLeisure 3:92dae9083c83 404 stack_long |= (stack_byte << 8);
Just4pLeisure 3:92dae9083c83 405 if (!fread(&stack_byte,1,1,fp)) return TERM_ERR;
Just4pLeisure 3:92dae9083c83 406 stack_long |= stack_byte;
Just4pLeisure 3:92dae9083c83 407 rewind (fp);
Just4pLeisure 3:92dae9083c83 408
Just4pLeisure 3:92dae9083c83 409 if (file_size != T7FLASHSIZE || stack_long != T7POINTER) {
Just4pLeisure 3:92dae9083c83 410 fclose(fp);
Just4pLeisure 3:92dae9083c83 411 printf("The BIN file does not appear to be for a T7 ECU :-(\r\n");
Just4pLeisure 3:92dae9083c83 412 printf("BIN file size: %#010x, FLASH chip size: %#010x, Pointer: %#010x.\r\n", file_size, T7FLASHSIZE, stack_long);
Just4pLeisure 3:92dae9083c83 413 return TERM_ERR;
Just4pLeisure 3:92dae9083c83 414 }
Just4pLeisure 3:92dae9083c83 415
Just4pLeisure 3:92dae9083c83 416 timer.reset();
Just4pLeisure 3:92dae9083c83 417 timer.start();
Just4pLeisure 3:92dae9083c83 418
Just4pLeisure 3:92dae9083c83 419 // Send "Request Download - tool to module" to Trionic
Just4pLeisure 3:92dae9083c83 420 if (!can_send_timeout (T7SEC_ID, T7_flash_jumpa, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 421 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 422 fclose(fp);
Just4pLeisure 3:92dae9083c83 423 return FALSE;
Just4pLeisure 3:92dae9083c83 424 }
Just4pLeisure 3:92dae9083c83 425 if (!can_send_timeout (T7SEC_ID, T7_flash_jumpb, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 426 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 427 fclose(fp);
Just4pLeisure 3:92dae9083c83 428 return FALSE;
Just4pLeisure 3:92dae9083c83 429 }
Just4pLeisure 3:92dae9083c83 430 if (!can_wait_timeout(T7SEC_RX, data, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 431 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 432 fclose(fp);
Just4pLeisure 3:92dae9083c83 433 return FALSE;
Just4pLeisure 3:92dae9083c83 434 }
Just4pLeisure 3:92dae9083c83 435 T7_flash_ack[3] = data[0] & 0xBF;
Just4pLeisure 3:92dae9083c83 436 if (!can_send_timeout (T7ACK_ID, T7_flash_ack, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 437 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 438 fclose(fp);
Just4pLeisure 3:92dae9083c83 439 return FALSE;
Just4pLeisure 3:92dae9083c83 440 }
Just4pLeisure 3:92dae9083c83 441 if ( data[3] != 0x74 ) {
Just4pLeisure 3:92dae9083c83 442 printf("Cannot Update FLASH, message refused.\r\n");
Just4pLeisure 3:92dae9083c83 443 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 444 fclose(fp);
Just4pLeisure 3:92dae9083c83 445 return FALSE;
Just4pLeisure 3:92dae9083c83 446 }
Just4pLeisure 3:92dae9083c83 447
Just4pLeisure 3:92dae9083c83 448 uint32_t address = 0;
Just4pLeisure 3:92dae9083c83 449
Just4pLeisure 4:682d96ff6d79 450 printf(" 0.00 %% complete.\r");
Just4pLeisure 3:92dae9083c83 451 while (address < T7FLASHSIZE) {
Just4pLeisure 3:92dae9083c83 452
Just4pLeisure 4:682d96ff6d79 453 // data[0] = 0x4A; // 0x40 send, | 0x0A (10) messages to follow
Just4pLeisure 3:92dae9083c83 454 // data[0] = 0x42; // 0x40 send, | 0x02 (2) messages to follow
Just4pLeisure 4:682d96ff6d79 455 data[0] = 0x40; // 0x40 send, | 0x00 (0) messages to follow
Just4pLeisure 3:92dae9083c83 456 data[1] = 0xA1;
Just4pLeisure 4:682d96ff6d79 457 // data[2] = 0x41; // length+1 (64 Bytes)
Just4pLeisure 3:92dae9083c83 458 // data[2] = 0x11; // length+1 (16 Bytes)
Just4pLeisure 4:682d96ff6d79 459 data[2] = 0x05; // length+1 (4 Bytes)
Just4pLeisure 3:92dae9083c83 460 data[3] = 0x36; // Data Transfer
Just4pLeisure 3:92dae9083c83 461 for ( k = 4; k < 8; k++ )
Just4pLeisure 3:92dae9083c83 462 //data[k] = *(bin + bin_count++);
Just4pLeisure 3:92dae9083c83 463 if (!fread(&data[k],1,1,fp)) {
Just4pLeisure 3:92dae9083c83 464 fclose(fp);
Just4pLeisure 5:1775b4b13232 465 printf("Error reading the BIN file MODIFIED.BIN\r\n");
Just4pLeisure 3:92dae9083c83 466 return FALSE;
Just4pLeisure 3:92dae9083c83 467 }
Just4pLeisure 3:92dae9083c83 468 // /* DEBUG info...
Just4pLeisure 3:92dae9083c83 469 // for (k = 0; k < 8; k++ ) printf("0x%02X ", data[k] );
Just4pLeisure 3:92dae9083c83 470 // for (k = 2; k < 8; k++ ) printf("%c ", data[k] );
Just4pLeisure 3:92dae9083c83 471 // printf(" data\r\n");
Just4pLeisure 3:92dae9083c83 472
Just4pLeisure 3:92dae9083c83 473 if (!can_send_timeout (T7SEC_ID, data, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 474 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 475 fclose(fp);
Just4pLeisure 3:92dae9083c83 476 return FALSE;
Just4pLeisure 3:92dae9083c83 477 }
Just4pLeisure 4:682d96ff6d79 478 /*
Just4pLeisure 4:682d96ff6d79 479 for (i = 9; i>=0; i--) {
Just4pLeisure 4:682d96ff6d79 480 // for (i = 1; i>=0; i--) {
Just4pLeisure 4:682d96ff6d79 481 data[0] = i;
Just4pLeisure 4:682d96ff6d79 482 // data[1] = 0xA1;
Just4pLeisure 4:682d96ff6d79 483 for ( k = 2; k < 8; k++ )
Just4pLeisure 4:682d96ff6d79 484 //data[k] = *(bin + bin_count++);
Just4pLeisure 4:682d96ff6d79 485 if (!fread(&data[k],1,1,fp)) {
Just4pLeisure 4:682d96ff6d79 486 fclose(fp);
Just4pLeisure 5:1775b4b13232 487 printf("Error reading the BIN file MODIFIED.BIN\r\n");
Just4pLeisure 4:682d96ff6d79 488 return FALSE;
Just4pLeisure 4:682d96ff6d79 489 }
Just4pLeisure 4:682d96ff6d79 490 // /* DEBUG info...
Just4pLeisure 4:682d96ff6d79 491 // for (k = 0; k < 8; k++ ) printf("0x%02X ", data[k] );
Just4pLeisure 4:682d96ff6d79 492 // for (k = 2; k < 8; k++ ) printf("%c ", data[k] );
Just4pLeisure 4:682d96ff6d79 493 // printf(" data\r\n");
Just4pLeisure 4:682d96ff6d79 494
Just4pLeisure 4:682d96ff6d79 495 // printf("%6.2f\r", 100*(float)address/(float)T7FLASHSIZE );
Just4pLeisure 4:682d96ff6d79 496 wait_ms(1);
Just4pLeisure 4:682d96ff6d79 497 // wait_ms(10); // 31/3/12 this longer wait might be needed for i-bus connections...
Just4pLeisure 4:682d96ff6d79 498 if (!can_send_timeout (T7SEC_ID, data, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 4:682d96ff6d79 499 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 4:682d96ff6d79 500 fclose(fp);
Just4pLeisure 4:682d96ff6d79 501 return FALSE;
Just4pLeisure 4:682d96ff6d79 502 }
Just4pLeisure 3:92dae9083c83 503 }
Just4pLeisure 4:682d96ff6d79 504 */
Just4pLeisure 4:682d96ff6d79 505 // address += 0x40;
Just4pLeisure 3:92dae9083c83 506 // address += 0x10;
Just4pLeisure 4:682d96ff6d79 507 address += 0x04;
Just4pLeisure 3:92dae9083c83 508 if (!can_wait_timeout(T7SEC_RX, data, 8, T7LONGERTIMEOUT)) {
Just4pLeisure 3:92dae9083c83 509 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 510 fclose(fp);
Just4pLeisure 3:92dae9083c83 511 return FALSE;
Just4pLeisure 3:92dae9083c83 512 }
Just4pLeisure 3:92dae9083c83 513 // Send acknowledgement
Just4pLeisure 3:92dae9083c83 514 T7_flash_ack[3] = data[0] & 0xBF;
Just4pLeisure 3:92dae9083c83 515 if (!can_send_timeout (T7ACK_ID, T7_flash_ack, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 516 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 517 fclose(fp);
Just4pLeisure 3:92dae9083c83 518 return FALSE;
Just4pLeisure 3:92dae9083c83 519 }
Just4pLeisure 3:92dae9083c83 520 if ( data[3] != 0x76 ) {
Just4pLeisure 3:92dae9083c83 521 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 522 fclose(fp);
Just4pLeisure 3:92dae9083c83 523 return FALSE;
Just4pLeisure 3:92dae9083c83 524 }
Just4pLeisure 3:92dae9083c83 525 if (!(address % 0x80))
Just4pLeisure 3:92dae9083c83 526 printf("%6.2f\r", 100*(float)address/(float)T7FLASHSIZE );
Just4pLeisure 3:92dae9083c83 527 }
Just4pLeisure 3:92dae9083c83 528 printf("\n");
Just4pLeisure 4:682d96ff6d79 529 /*
Just4pLeisure 4:682d96ff6d79 530 // Send "Request Data Transfer Exit" to Trionic
Just4pLeisure 4:682d96ff6d79 531 if (!can_send_timeout (T7SEC_ID, T7_flash_end, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 4:682d96ff6d79 532 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 4:682d96ff6d79 533 fclose(fp);
Just4pLeisure 4:682d96ff6d79 534 return FALSE;
Just4pLeisure 4:682d96ff6d79 535 }
Just4pLeisure 4:682d96ff6d79 536 if (!can_wait_timeout(T7SEC_RX, data, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 4:682d96ff6d79 537 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 4:682d96ff6d79 538 fclose(fp);
Just4pLeisure 4:682d96ff6d79 539 return FALSE;
Just4pLeisure 4:682d96ff6d79 540 }
Just4pLeisure 4:682d96ff6d79 541 T7_flash_ack[3] = data[0] & 0xBF;
Just4pLeisure 4:682d96ff6d79 542 if (!can_send_timeout (T7ACK_ID, T7_flash_ack, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 4:682d96ff6d79 543 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 4:682d96ff6d79 544 fclose(fp);
Just4pLeisure 4:682d96ff6d79 545 return FALSE;
Just4pLeisure 4:682d96ff6d79 546 }
Just4pLeisure 4:682d96ff6d79 547 if ( data[3] != 0x77 ) {
Just4pLeisure 4:682d96ff6d79 548 printf("Cannot Update FLASH, message refused.\r\n");
Just4pLeisure 4:682d96ff6d79 549 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 4:682d96ff6d79 550 fclose(fp);
Just4pLeisure 4:682d96ff6d79 551 return FALSE;
Just4pLeisure 4:682d96ff6d79 552 }
Just4pLeisure 4:682d96ff6d79 553 // Send "Request Data Transfer Exit" to Trionic
Just4pLeisure 4:682d96ff6d79 554 if (!can_send_timeout (T7SEC_ID, T7_flash_exit, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 4:682d96ff6d79 555 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 4:682d96ff6d79 556 fclose(fp);
Just4pLeisure 4:682d96ff6d79 557 return FALSE;
Just4pLeisure 4:682d96ff6d79 558 }
Just4pLeisure 4:682d96ff6d79 559 if (!can_wait_timeout(T7SEC_RX, data, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 4:682d96ff6d79 560 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 4:682d96ff6d79 561 fclose(fp);
Just4pLeisure 4:682d96ff6d79 562 return FALSE;
Just4pLeisure 4:682d96ff6d79 563 }
Just4pLeisure 4:682d96ff6d79 564 T7_flash_ack[3] = data[0] & 0xBF;
Just4pLeisure 4:682d96ff6d79 565 if (!can_send_timeout (T7ACK_ID, T7_flash_ack, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 4:682d96ff6d79 566 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 4:682d96ff6d79 567 fclose(fp);
Just4pLeisure 4:682d96ff6d79 568 return FALSE;
Just4pLeisure 4:682d96ff6d79 569 }
Just4pLeisure 4:682d96ff6d79 570 if ( data[3] != 0x71 ) {
Just4pLeisure 4:682d96ff6d79 571 printf("Cannot Update FLASH, message refused.\r\n");
Just4pLeisure 4:682d96ff6d79 572 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 4:682d96ff6d79 573 fclose(fp);
Just4pLeisure 4:682d96ff6d79 574 return FALSE;
Just4pLeisure 4:682d96ff6d79 575 }
Just4pLeisure 4:682d96ff6d79 576 */
Just4pLeisure 4:682d96ff6d79 577 timer.stop();
Just4pLeisure 4:682d96ff6d79 578 printf("SUCCESS! Programming the FLASH took %#.1f seconds.\r\n",timer.read());
Just4pLeisure 4:682d96ff6d79 579 fclose(fp);
Just4pLeisure 4:682d96ff6d79 580 return TRUE;
Just4pLeisure 4:682d96ff6d79 581 }
Just4pLeisure 4:682d96ff6d79 582
Just4pLeisure 4:682d96ff6d79 583
Just4pLeisure 4:682d96ff6d79 584 bool t7_flash() {
Just4pLeisure 4:682d96ff6d79 585 char T7_flash_jumpa[] = T7FLABINA;
Just4pLeisure 4:682d96ff6d79 586 char T7_flash_jumpb[] = T7FLABINB;
Just4pLeisure 4:682d96ff6d79 587 char T7_flash_jumpc[] = T7FLAHDRA;
Just4pLeisure 4:682d96ff6d79 588 char T7_flash_jumpd[] = T7FLAHDRB;
Just4pLeisure 4:682d96ff6d79 589 char T7_flash_end[] = T7FLA_END;
Just4pLeisure 4:682d96ff6d79 590 char T7_flash_exit[] = T7FLAEXIT;
Just4pLeisure 4:682d96ff6d79 591 char T7_flash_ack[] = T7FLA_ACK;
Just4pLeisure 4:682d96ff6d79 592 char data[8];
Just4pLeisure 4:682d96ff6d79 593 int i, k;
Just4pLeisure 4:682d96ff6d79 594
Just4pLeisure 5:1775b4b13232 595 // fopen modified.bin here?
Just4pLeisure 4:682d96ff6d79 596 // need lots of fcloses though
Just4pLeisure 4:682d96ff6d79 597 printf("Checking the FLASH BIN file...\r\n");
Just4pLeisure 5:1775b4b13232 598 FILE *fp = fopen("/local/modified.bin", "r"); // Open "modified.bin" on the local file system for reading
Just4pLeisure 4:682d96ff6d79 599 if (!fp) {
Just4pLeisure 5:1775b4b13232 600 printf("Error: I could not find the BIN file MODIFIED.BIN\r\n");;
Just4pLeisure 4:682d96ff6d79 601 return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 602 }
Just4pLeisure 4:682d96ff6d79 603 // obtain file size - it should match the size of the FLASH chips:
Just4pLeisure 4:682d96ff6d79 604 fseek (fp , 0 , SEEK_END);
Just4pLeisure 4:682d96ff6d79 605 uint32_t file_size = ftell (fp);
Just4pLeisure 4:682d96ff6d79 606 rewind (fp);
Just4pLeisure 4:682d96ff6d79 607
Just4pLeisure 4:682d96ff6d79 608 // read the initial stack pointer value in the BIN file - it should match the value expected for the type of ECU
Just4pLeisure 4:682d96ff6d79 609 uint8_t stack_byte = 0;
Just4pLeisure 4:682d96ff6d79 610 uint32_t stack_long = 0;
Just4pLeisure 4:682d96ff6d79 611 if (!fread(&stack_byte,1,1,fp)) return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 612 stack_long |= (stack_byte << 24);
Just4pLeisure 4:682d96ff6d79 613 if (!fread(&stack_byte,1,1,fp)) return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 614 stack_long |= (stack_byte << 16);
Just4pLeisure 4:682d96ff6d79 615 if (!fread(&stack_byte,1,1,fp)) return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 616 stack_long |= (stack_byte << 8);
Just4pLeisure 4:682d96ff6d79 617 if (!fread(&stack_byte,1,1,fp)) return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 618 stack_long |= stack_byte;
Just4pLeisure 4:682d96ff6d79 619 rewind (fp);
Just4pLeisure 4:682d96ff6d79 620
Just4pLeisure 4:682d96ff6d79 621 if (file_size != T7FLASHSIZE || stack_long != T7POINTER) {
Just4pLeisure 4:682d96ff6d79 622 fclose(fp);
Just4pLeisure 4:682d96ff6d79 623 printf("The BIN file does not appear to be for a T7 ECU :-(\r\n");
Just4pLeisure 4:682d96ff6d79 624 printf("BIN file size: %#010x, FLASH chip size: %#010x, Pointer: %#010x.\r\n", file_size, T7FLASHSIZE, stack_long);
Just4pLeisure 4:682d96ff6d79 625 return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 626 }
Just4pLeisure 4:682d96ff6d79 627
Just4pLeisure 4:682d96ff6d79 628 timer.reset();
Just4pLeisure 4:682d96ff6d79 629 timer.start();
Just4pLeisure 4:682d96ff6d79 630
Just4pLeisure 4:682d96ff6d79 631 // Send "Request Download - tool to module" to Trionic
Just4pLeisure 4:682d96ff6d79 632 if (!can_send_timeout (T7SEC_ID, T7_flash_jumpa, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 4:682d96ff6d79 633 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 4:682d96ff6d79 634 fclose(fp);
Just4pLeisure 4:682d96ff6d79 635 return FALSE;
Just4pLeisure 4:682d96ff6d79 636 }
Just4pLeisure 4:682d96ff6d79 637 if (!can_send_timeout (T7SEC_ID, T7_flash_jumpb, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 638 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 639 fclose(fp);
Just4pLeisure 3:92dae9083c83 640 return FALSE;
Just4pLeisure 3:92dae9083c83 641 }
Just4pLeisure 3:92dae9083c83 642 if (!can_wait_timeout(T7SEC_RX, data, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 643 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 644 fclose(fp);
Just4pLeisure 3:92dae9083c83 645 return FALSE;
Just4pLeisure 3:92dae9083c83 646 }
Just4pLeisure 3:92dae9083c83 647 T7_flash_ack[3] = data[0] & 0xBF;
Just4pLeisure 3:92dae9083c83 648 if (!can_send_timeout (T7ACK_ID, T7_flash_ack, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 649 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 650 fclose(fp);
Just4pLeisure 3:92dae9083c83 651 return FALSE;
Just4pLeisure 3:92dae9083c83 652 }
Just4pLeisure 4:682d96ff6d79 653 if ( data[3] != 0x74 ) {
Just4pLeisure 3:92dae9083c83 654 printf("Cannot Update FLASH, message refused.\r\n");
Just4pLeisure 3:92dae9083c83 655 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 656 fclose(fp);
Just4pLeisure 3:92dae9083c83 657 return FALSE;
Just4pLeisure 3:92dae9083c83 658 }
Just4pLeisure 4:682d96ff6d79 659
Just4pLeisure 4:682d96ff6d79 660 uint32_t address = 0;
Just4pLeisure 4:682d96ff6d79 661
Just4pLeisure 4:682d96ff6d79 662 printf(" 0.00 %% complete.\r");
Just4pLeisure 4:682d96ff6d79 663 // FLASH main Binary image up to address 0x7B000
Just4pLeisure 4:682d96ff6d79 664 while (address < 0x70000) {
Just4pLeisure 4:682d96ff6d79 665 data[0] = 0x40; // 0x40 send, | 0x00 (0) messages to follow
Just4pLeisure 4:682d96ff6d79 666 data[1] = 0xA1;
Just4pLeisure 4:682d96ff6d79 667 data[2] = 0x05; // length+1 (4 Bytes)
Just4pLeisure 4:682d96ff6d79 668 data[3] = 0x36; // Data Transfer
Just4pLeisure 4:682d96ff6d79 669 for ( k = 4; k < 8; k++ )
Just4pLeisure 4:682d96ff6d79 670 if (!fread(&data[k],1,1,fp)) {
Just4pLeisure 4:682d96ff6d79 671 fclose(fp);
Just4pLeisure 5:1775b4b13232 672 printf("Error reading the BIN file MODIFIED.BIN\r\n");
Just4pLeisure 4:682d96ff6d79 673 return FALSE;
Just4pLeisure 4:682d96ff6d79 674 }
Just4pLeisure 4:682d96ff6d79 675 if (!can_send_timeout (T7SEC_ID, data, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 4:682d96ff6d79 676 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 4:682d96ff6d79 677 fclose(fp);
Just4pLeisure 4:682d96ff6d79 678 return FALSE;
Just4pLeisure 4:682d96ff6d79 679 }
Just4pLeisure 4:682d96ff6d79 680 address += 0x04;
Just4pLeisure 4:682d96ff6d79 681 if (!can_wait_timeout(T7SEC_RX, data, 8, T7LONGERTIMEOUT)) {
Just4pLeisure 4:682d96ff6d79 682 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 4:682d96ff6d79 683 fclose(fp);
Just4pLeisure 4:682d96ff6d79 684 return FALSE;
Just4pLeisure 4:682d96ff6d79 685 }
Just4pLeisure 4:682d96ff6d79 686 // Send acknowledgement
Just4pLeisure 4:682d96ff6d79 687 T7_flash_ack[3] = data[0] & 0xBF;
Just4pLeisure 4:682d96ff6d79 688 if (!can_send_timeout (T7ACK_ID, T7_flash_ack, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 4:682d96ff6d79 689 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 4:682d96ff6d79 690 fclose(fp);
Just4pLeisure 4:682d96ff6d79 691 return FALSE;
Just4pLeisure 4:682d96ff6d79 692 }
Just4pLeisure 4:682d96ff6d79 693 if ( data[3] != 0x76 ) {
Just4pLeisure 4:682d96ff6d79 694 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 4:682d96ff6d79 695 fclose(fp);
Just4pLeisure 4:682d96ff6d79 696 return FALSE;
Just4pLeisure 4:682d96ff6d79 697 }
Just4pLeisure 4:682d96ff6d79 698 if (!(address % 0x80))
Just4pLeisure 4:682d96ff6d79 699 printf("%6.2f\r", 100*(float)address/(float)T7FLASHSIZE );
Just4pLeisure 4:682d96ff6d79 700 }
Just4pLeisure 4:682d96ff6d79 701
Just4pLeisure 4:682d96ff6d79 702 // Send "Request Download - tool to module" to Trionic
Just4pLeisure 4:682d96ff6d79 703 if (!can_send_timeout (T7SEC_ID, T7_flash_jumpc, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 4:682d96ff6d79 704 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 4:682d96ff6d79 705 fclose(fp);
Just4pLeisure 4:682d96ff6d79 706 return FALSE;
Just4pLeisure 4:682d96ff6d79 707 }
Just4pLeisure 4:682d96ff6d79 708 if (!can_send_timeout (T7SEC_ID, T7_flash_jumpd, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 709 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 710 fclose(fp);
Just4pLeisure 3:92dae9083c83 711 return FALSE;
Just4pLeisure 3:92dae9083c83 712 }
Just4pLeisure 3:92dae9083c83 713 if (!can_wait_timeout(T7SEC_RX, data, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 714 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 715 fclose(fp);
Just4pLeisure 3:92dae9083c83 716 return FALSE;
Just4pLeisure 3:92dae9083c83 717 }
Just4pLeisure 3:92dae9083c83 718 T7_flash_ack[3] = data[0] & 0xBF;
Just4pLeisure 3:92dae9083c83 719 if (!can_send_timeout (T7ACK_ID, T7_flash_ack, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 720 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 721 fclose(fp);
Just4pLeisure 3:92dae9083c83 722 return FALSE;
Just4pLeisure 3:92dae9083c83 723 }
Just4pLeisure 4:682d96ff6d79 724 if ( data[3] != 0x74 ) {
Just4pLeisure 3:92dae9083c83 725 printf("Cannot Update FLASH, message refused.\r\n");
Just4pLeisure 3:92dae9083c83 726 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 727 fclose(fp);
Just4pLeisure 3:92dae9083c83 728 return FALSE;
Just4pLeisure 3:92dae9083c83 729 }
Just4pLeisure 4:682d96ff6d79 730
Just4pLeisure 4:682d96ff6d79 731 address = 0x7FF00;
Just4pLeisure 4:682d96ff6d79 732 fseek (fp , 0x7FF00 , SEEK_SET);
Just4pLeisure 4:682d96ff6d79 733
Just4pLeisure 4:682d96ff6d79 734 // FLASH BIN file Header
Just4pLeisure 4:682d96ff6d79 735 while (address < T7FLASHSIZE) {
Just4pLeisure 4:682d96ff6d79 736 data[0] = 0x40; // 0x40 send, | 0x00 (0) messages to follow
Just4pLeisure 4:682d96ff6d79 737 data[1] = 0xA1;
Just4pLeisure 4:682d96ff6d79 738 data[2] = 0x05; // length+1 (4 Bytes)
Just4pLeisure 4:682d96ff6d79 739 data[3] = 0x36; // Data Transfer
Just4pLeisure 4:682d96ff6d79 740 for ( k = 4; k < 8; k++ )
Just4pLeisure 4:682d96ff6d79 741 if (!fread(&data[k],1,1,fp)) {
Just4pLeisure 4:682d96ff6d79 742 fclose(fp);
Just4pLeisure 5:1775b4b13232 743 printf("Error reading the BIN file MODIFIED.BIN\r\n");
Just4pLeisure 4:682d96ff6d79 744 return FALSE;
Just4pLeisure 4:682d96ff6d79 745 }
Just4pLeisure 4:682d96ff6d79 746 if (!can_send_timeout (T7SEC_ID, data, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 4:682d96ff6d79 747 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 4:682d96ff6d79 748 fclose(fp);
Just4pLeisure 4:682d96ff6d79 749 return FALSE;
Just4pLeisure 4:682d96ff6d79 750 }
Just4pLeisure 4:682d96ff6d79 751 address += 0x04;
Just4pLeisure 4:682d96ff6d79 752 if (!can_wait_timeout(T7SEC_RX, data, 8, T7LONGERTIMEOUT)) {
Just4pLeisure 4:682d96ff6d79 753 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 4:682d96ff6d79 754 fclose(fp);
Just4pLeisure 4:682d96ff6d79 755 return FALSE;
Just4pLeisure 4:682d96ff6d79 756 }
Just4pLeisure 4:682d96ff6d79 757 // Send acknowledgement
Just4pLeisure 4:682d96ff6d79 758 T7_flash_ack[3] = data[0] & 0xBF;
Just4pLeisure 4:682d96ff6d79 759 if (!can_send_timeout (T7ACK_ID, T7_flash_ack, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 4:682d96ff6d79 760 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 4:682d96ff6d79 761 fclose(fp);
Just4pLeisure 4:682d96ff6d79 762 return FALSE;
Just4pLeisure 4:682d96ff6d79 763 }
Just4pLeisure 4:682d96ff6d79 764 if ( data[3] != 0x76 ) {
Just4pLeisure 4:682d96ff6d79 765 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 4:682d96ff6d79 766 fclose(fp);
Just4pLeisure 4:682d96ff6d79 767 return FALSE;
Just4pLeisure 4:682d96ff6d79 768 }
Just4pLeisure 4:682d96ff6d79 769 if (!(address % 0x80))
Just4pLeisure 4:682d96ff6d79 770 printf("%6.2f\r", 100*(float)address/(float)T7FLASHSIZE );
Just4pLeisure 4:682d96ff6d79 771 }
Just4pLeisure 4:682d96ff6d79 772
Just4pLeisure 4:682d96ff6d79 773
Just4pLeisure 4:682d96ff6d79 774 printf("\n");
Just4pLeisure 4:682d96ff6d79 775 printf("Restarting T7 ECU");
Just4pLeisure 4:682d96ff6d79 776 /*
Just4pLeisure 4:682d96ff6d79 777 // Send "Request Data Transfer Exit" to Trionic
Just4pLeisure 4:682d96ff6d79 778 if (!can_send_timeout (T7SEC_ID, T7_flash_end, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 4:682d96ff6d79 779 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 4:682d96ff6d79 780 fclose(fp);
Just4pLeisure 4:682d96ff6d79 781 return FALSE;
Just4pLeisure 4:682d96ff6d79 782 }
Just4pLeisure 4:682d96ff6d79 783 if (!can_wait_timeout(T7SEC_RX, data, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 4:682d96ff6d79 784 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 4:682d96ff6d79 785 fclose(fp);
Just4pLeisure 4:682d96ff6d79 786 return FALSE;
Just4pLeisure 4:682d96ff6d79 787 }
Just4pLeisure 4:682d96ff6d79 788 T7_flash_ack[3] = data[0] & 0xBF;
Just4pLeisure 4:682d96ff6d79 789 if (!can_send_timeout (T7ACK_ID, T7_flash_ack, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 4:682d96ff6d79 790 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 4:682d96ff6d79 791 fclose(fp);
Just4pLeisure 4:682d96ff6d79 792 return FALSE;
Just4pLeisure 4:682d96ff6d79 793 }
Just4pLeisure 4:682d96ff6d79 794 if ( data[3] != 0x77 ) {
Just4pLeisure 4:682d96ff6d79 795 printf("Cannot Update FLASH, message refused.\r\n");
Just4pLeisure 4:682d96ff6d79 796 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 4:682d96ff6d79 797 fclose(fp);
Just4pLeisure 4:682d96ff6d79 798 return FALSE;
Just4pLeisure 4:682d96ff6d79 799 }
Just4pLeisure 4:682d96ff6d79 800 //
Just4pLeisure 4:682d96ff6d79 801 // Send "Request Data Transfer Exit" to Trionic
Just4pLeisure 4:682d96ff6d79 802 if (!can_send_timeout (T7SEC_ID, T7_flash_exit, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 4:682d96ff6d79 803 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 4:682d96ff6d79 804 fclose(fp);
Just4pLeisure 4:682d96ff6d79 805 return FALSE;
Just4pLeisure 4:682d96ff6d79 806 }
Just4pLeisure 4:682d96ff6d79 807 if (!can_wait_timeout(T7SEC_RX, data, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 4:682d96ff6d79 808 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 4:682d96ff6d79 809 fclose(fp);
Just4pLeisure 4:682d96ff6d79 810 return FALSE;
Just4pLeisure 4:682d96ff6d79 811 }
Just4pLeisure 4:682d96ff6d79 812 T7_flash_ack[3] = data[0] & 0xBF;
Just4pLeisure 4:682d96ff6d79 813 if (!can_send_timeout (T7ACK_ID, T7_flash_ack, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 4:682d96ff6d79 814 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 4:682d96ff6d79 815 fclose(fp);
Just4pLeisure 4:682d96ff6d79 816 return FALSE;
Just4pLeisure 4:682d96ff6d79 817 }
Just4pLeisure 4:682d96ff6d79 818 if ( data[3] != 0x71 ) {
Just4pLeisure 4:682d96ff6d79 819 printf("Cannot Update FLASH, message refused.\r\n");
Just4pLeisure 4:682d96ff6d79 820 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 4:682d96ff6d79 821 fclose(fp);
Just4pLeisure 4:682d96ff6d79 822 return FALSE;
Just4pLeisure 4:682d96ff6d79 823 }
Just4pLeisure 3:92dae9083c83 824 */
Just4pLeisure 3:92dae9083c83 825 timer.stop();
Just4pLeisure 3:92dae9083c83 826 printf("SUCCESS! Programming the FLASH took %#.1f seconds.\r\n",timer.read());
Just4pLeisure 3:92dae9083c83 827 fclose(fp);
Just4pLeisure 3:92dae9083c83 828 return TRUE;
Just4pLeisure 3:92dae9083c83 829 }