Just4Trionic - CAN and BDM FLASH programmer for Saab cars

Dependencies:   mbed

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

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Just4pLeisure 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 6:2fbcbebed28c 32 bool t7_initialise()
Just4pLeisure 6:2fbcbebed28c 33 {
Just4pLeisure 3:92dae9083c83 34 // send a can message to the T7 requesting that it initialises CAN communication with Just4Trionic
Just4pLeisure 3:92dae9083c83 35 char T7TxMsg[] = T7INITMSG;
Just4pLeisure 3:92dae9083c83 36 if (!can_send_timeout (T7CMNDID, T7TxMsg, 8, T7MESSAGETIMEOUT))
Just4pLeisure 3:92dae9083c83 37 return FALSE;
Just4pLeisure 3:92dae9083c83 38 // wait for the T7 to reply
Just4pLeisure 3:92dae9083c83 39 char T7RxMsg[8];
Just4pLeisure 3:92dae9083c83 40 // if a message is not received, has the wrong id
Just4pLeisure 3:92dae9083c83 41 if (!can_wait_timeout(T7RESPID, T7RxMsg, 8, T7MESSAGETIMEOUT))
Just4pLeisure 3:92dae9083c83 42 return FALSE;
Just4pLeisure 3:92dae9083c83 43 /* DEBUG info...
Just4pLeisure 3:92dae9083c83 44 for (int i = 0; i < 8; i++ ) printf("0x%02X ", T7RxMsg[i] );
Just4pLeisure 3:92dae9083c83 45 printf(" init\r\n");
Just4pLeisure 3:92dae9083c83 46 */
Just4pLeisure 3:92dae9083c83 47 return TRUE;
Just4pLeisure 3:92dae9083c83 48 }
Just4pLeisure 3:92dae9083c83 49
Just4pLeisure 3:92dae9083c83 50 //
Just4pLeisure 3:92dae9083c83 51 // t7_authenticate
Just4pLeisure 3:92dae9083c83 52 //
Just4pLeisure 3:92dae9083c83 53 // sends an authentication message to the T7 ECU
Just4pLeisure 3:92dae9083c83 54 // but doesn't displays anything.
Just4pLeisure 3:92dae9083c83 55 //
Just4pLeisure 3:92dae9083c83 56 // inputs: none
Just4pLeisure 3:92dae9083c83 57 // return: bool TRUE if there was a message, FALSE if no message.
Just4pLeisure 3:92dae9083c83 58 //
Just4pLeisure 3:92dae9083c83 59
Just4pLeisure 6:2fbcbebed28c 60 bool t7_authenticate()
Just4pLeisure 6:2fbcbebed28c 61 {
Just4pLeisure 3:92dae9083c83 62 uint16_t seed, key;
Just4pLeisure 3:92dae9083c83 63 // uint16_t i;
Just4pLeisure 3:92dae9083c83 64 char T7TxAck[] = T7ACK_MSG;
Just4pLeisure 3:92dae9083c83 65 char T7TxMsg[] = T7SEC_MSG;
Just4pLeisure 3:92dae9083c83 66 char T7TxKey[] = T7KEY_MSG;
Just4pLeisure 3:92dae9083c83 67 char T7RxMsg[8];
Just4pLeisure 3:92dae9083c83 68 // Send "Request Seed" to Trionic7
Just4pLeisure 3:92dae9083c83 69 if (!can_send_timeout (T7SEC_ID, T7TxMsg, 8, T7MESSAGETIMEOUT))
Just4pLeisure 3:92dae9083c83 70 return FALSE;
Just4pLeisure 3:92dae9083c83 71 // wait for the T7 to reply
Just4pLeisure 3:92dae9083c83 72 // Read "Seed"
Just4pLeisure 3:92dae9083c83 73 // if a message is not received id return false
Just4pLeisure 3:92dae9083c83 74 if (!can_wait_timeout(T7SEC_RX, T7RxMsg, 8, T7MESSAGETIMEOUT))
Just4pLeisure 3:92dae9083c83 75 return FALSE;
Just4pLeisure 3:92dae9083c83 76 /* DEBUG info...
Just4pLeisure 3:92dae9083c83 77 for (i = 0; i < 8; i++ ) printf("0x%02X ", T7RxMsg[i] );
Just4pLeisure 3:92dae9083c83 78 printf(" seed\r\n");
Just4pLeisure 3:92dae9083c83 79 */
Just4pLeisure 3:92dae9083c83 80 // Send Ack
Just4pLeisure 3:92dae9083c83 81 T7TxAck[3] = T7RxMsg[0] & 0xBF;
Just4pLeisure 3:92dae9083c83 82 if (!can_send_timeout (T7ACK_ID, T7TxAck, 8, T7MESSAGETIMEOUT))
Just4pLeisure 3:92dae9083c83 83 return FALSE;
Just4pLeisure 3:92dae9083c83 84 // Send "Key", try two different methods of calculating the key
Just4pLeisure 3:92dae9083c83 85 seed = T7RxMsg[5] << 8 | T7RxMsg[6];
Just4pLeisure 3:92dae9083c83 86 for (int method = 0; method < 2; method++ ) {
Just4pLeisure 3:92dae9083c83 87 key = seed << 2;
Just4pLeisure 3:92dae9083c83 88 key &= 0xFFFF;
Just4pLeisure 3:92dae9083c83 89 key ^= ( method ? 0x4081 : 0x8142 );
Just4pLeisure 3:92dae9083c83 90 key -= ( method ? 0x1F6F : 0x2356 );
Just4pLeisure 3:92dae9083c83 91 key &= 0xFFFF;
Just4pLeisure 3:92dae9083c83 92 T7TxKey[5] = ( key >> 8 ) & 0xFF;
Just4pLeisure 3:92dae9083c83 93 T7TxKey[6] = key & 0xFF;
Just4pLeisure 3:92dae9083c83 94 if (!can_send_timeout (T7SEC_ID, T7TxKey, 8, T7MESSAGETIMEOUT))
Just4pLeisure 3:92dae9083c83 95 return FALSE;
Just4pLeisure 3:92dae9083c83 96 // Wait for response
Just4pLeisure 3:92dae9083c83 97 // if a message is not received id return false
Just4pLeisure 3:92dae9083c83 98 if (!can_wait_timeout(T7SEC_RX, T7RxMsg, 8, T7MESSAGETIMEOUT))
Just4pLeisure 3:92dae9083c83 99 return FALSE;
Just4pLeisure 3:92dae9083c83 100 /* DEBUG info...
Just4pLeisure 3:92dae9083c83 101 for (i = 0; i < 8; i++ ) printf("0x%02X ", T7RxMsg[i] );
Just4pLeisure 3:92dae9083c83 102 printf(" key %d 0x%02X 0x%02X\r\n", method, T7RxMsg[3], T7RxMsg[5]);
Just4pLeisure 3:92dae9083c83 103 */
Just4pLeisure 3:92dae9083c83 104 // Send Ack
Just4pLeisure 3:92dae9083c83 105 T7TxAck[3] = T7RxMsg[0] & 0xBF;
Just4pLeisure 3:92dae9083c83 106 if (!can_send_timeout (T7ACK_ID, T7TxAck, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 107 /* DEBUG info...
Just4pLeisure 3:92dae9083c83 108 printf("Key ACK message timeout\r\n");
Just4pLeisure 3:92dae9083c83 109 */
Just4pLeisure 3:92dae9083c83 110 return FALSE;
Just4pLeisure 3:92dae9083c83 111 }
Just4pLeisure 3:92dae9083c83 112 if ( T7RxMsg[3] == 0x67 && T7RxMsg[5] == 0x34 ) {
Just4pLeisure 3:92dae9083c83 113 /* DEBUG info...
Just4pLeisure 3:92dae9083c83 114 printf("Key %d Accepted\r\n", method);
Just4pLeisure 3:92dae9083c83 115 */
Just4pLeisure 3:92dae9083c83 116 return TRUE;
Just4pLeisure 3:92dae9083c83 117 } else {
Just4pLeisure 3:92dae9083c83 118 /* DEBUG info...
Just4pLeisure 3:92dae9083c83 119 printf("Key %d Failed\r\n", method);
Just4pLeisure 3:92dae9083c83 120 */
Just4pLeisure 3:92dae9083c83 121 }
Just4pLeisure 3:92dae9083c83 122 }
Just4pLeisure 3:92dae9083c83 123 return FALSE;
Just4pLeisure 3:92dae9083c83 124 }
Just4pLeisure 3:92dae9083c83 125 //
Just4pLeisure 3:92dae9083c83 126 // t7_dump
Just4pLeisure 3:92dae9083c83 127 //
Just4pLeisure 3:92dae9083c83 128 // dumps the T7 BIN File
Just4pLeisure 3:92dae9083c83 129 // but doesn't displays anything.
Just4pLeisure 3:92dae9083c83 130 //
Just4pLeisure 3:92dae9083c83 131 // inputs: none
Just4pLeisure 3:92dae9083c83 132 // return: bool TRUE if there was a message, FALSE if no message.
Just4pLeisure 3:92dae9083c83 133 //
Just4pLeisure 3:92dae9083c83 134
Just4pLeisure 6:2fbcbebed28c 135 bool t7_dump(bool blockmode)
Just4pLeisure 6:2fbcbebed28c 136 {
Just4pLeisure 3:92dae9083c83 137 uint32_t received;
Just4pLeisure 3:92dae9083c83 138 uint8_t byte_count, retries, i;
Just4pLeisure 3:92dae9083c83 139 char T7_dump_jumpa[] = T7DMPJP1A;
Just4pLeisure 3:92dae9083c83 140 char T7_dump_jumpb[] = T7DMPJP1B;
Just4pLeisure 3:92dae9083c83 141 char T7_dump_ack[] = T7DMP_ACK;
Just4pLeisure 3:92dae9083c83 142 char T7_dump_data[] = T7DMPDATA;
Just4pLeisure 3:92dae9083c83 143 char T7_dump_end[] = T7DMP_END;
Just4pLeisure 3:92dae9083c83 144 char T7RxMsg[8];
Just4pLeisure 3:92dae9083c83 145
Just4pLeisure 3:92dae9083c83 146 printf("Creating FLASH dump file...\r\n");
Just4pLeisure 3:92dae9083c83 147 FILE *fp = fopen("/local/original.bin", "w"); // Open "original.bin" on the local file system for writing
Just4pLeisure 3:92dae9083c83 148 if (!fp) {
Just4pLeisure 3:92dae9083c83 149 perror ("The following error occured");
Just4pLeisure 3:92dae9083c83 150 return TERM_ERR;
Just4pLeisure 3:92dae9083c83 151 }
Just4pLeisure 3:92dae9083c83 152
Just4pLeisure 3:92dae9083c83 153 timer.reset();
Just4pLeisure 3:92dae9083c83 154 timer.start();
Just4pLeisure 3:92dae9083c83 155
Just4pLeisure 3:92dae9083c83 156 received = 0;
Just4pLeisure 4:682d96ff6d79 157 printf(" 0.00 %% complete.\r");
Just4pLeisure 3:92dae9083c83 158 while (received < T7FLASHSIZE) {
Just4pLeisure 3:92dae9083c83 159 // T7_dump_jumpa[7] = ((T7FLASHSIZE - received) < 0xEF) ? (T7FLASHSIZE - received) : 0xEF;
Just4pLeisure 3:92dae9083c83 160 T7_dump_jumpb[2] = (received >> 16) & 0xFF;
Just4pLeisure 3:92dae9083c83 161 T7_dump_jumpb[3] = (received >> 8) & 0xFF;
Just4pLeisure 3:92dae9083c83 162 T7_dump_jumpb[4] = received & 0xFF;
Just4pLeisure 3:92dae9083c83 163 // Send read address and length to Trionic
Just4pLeisure 3:92dae9083c83 164 if (!can_send_timeout (T7SEC_ID, T7_dump_jumpa, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 165 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 166 fclose(fp);
Just4pLeisure 3:92dae9083c83 167 return FALSE;
Just4pLeisure 3:92dae9083c83 168 }
Just4pLeisure 3:92dae9083c83 169 if (!can_send_timeout (T7SEC_ID, T7_dump_jumpb, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 170 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 171 fclose(fp);
Just4pLeisure 3:92dae9083c83 172 return FALSE;
Just4pLeisure 3:92dae9083c83 173 }
Just4pLeisure 3:92dae9083c83 174 // Wait for a response
Just4pLeisure 3:92dae9083c83 175 if (!can_wait_timeout(T7SEC_RX, T7RxMsg, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 176 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 177 fclose(fp);
Just4pLeisure 3:92dae9083c83 178 return FALSE;
Just4pLeisure 3:92dae9083c83 179 }
Just4pLeisure 3:92dae9083c83 180 /* DEBUG info...
Just4pLeisure 3:92dae9083c83 181 for (i = 0; i < 8; i++ ) printf("0x%02X ", T7RxMsg[i] );
Just4pLeisure 3:92dae9083c83 182 printf(" seed\r\n");
Just4pLeisure 3:92dae9083c83 183 */
Just4pLeisure 3:92dae9083c83 184 // Send Ack
Just4pLeisure 3:92dae9083c83 185 T7_dump_ack[3] = T7RxMsg[0] & 0xBF;
Just4pLeisure 3:92dae9083c83 186 if (!can_send_timeout (T7ACK_ID, T7_dump_ack, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 187 printf("ERROR Asking1: %5.1f %% done\r\n", 100*(float)received/(float)T7FLASHSIZE);
Just4pLeisure 3:92dae9083c83 188 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 189 fclose(fp);
Just4pLeisure 3:92dae9083c83 190 return FALSE;
Just4pLeisure 3:92dae9083c83 191 }
Just4pLeisure 3:92dae9083c83 192 if ((T7RxMsg[3] != 0x6C) ||(T7RxMsg[4] != 0xF0)) {
Just4pLeisure 3:92dae9083c83 193 printf("ERROR Asking2: %5.1f %% done\r\n", 100*(float)received/(float)T7FLASHSIZE);
Just4pLeisure 3:92dae9083c83 194 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 195 fclose(fp);
Just4pLeisure 3:92dae9083c83 196 return FALSE;
Just4pLeisure 3:92dae9083c83 197 }
Just4pLeisure 3:92dae9083c83 198 // Ask T7 ECU to start sending data
Just4pLeisure 3:92dae9083c83 199 for (retries = 0 ; retries <10 ; retries++ ) {
Just4pLeisure 3:92dae9083c83 200 if (!can_send_timeout (T7SEC_ID, T7_dump_data, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 201 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 202 fclose(fp);
Just4pLeisure 3:92dae9083c83 203 return FALSE;
Just4pLeisure 3:92dae9083c83 204 }
Just4pLeisure 3:92dae9083c83 205 // Read mesages from the T7 ECU
Just4pLeisure 3:92dae9083c83 206 byte_count = 0;
Just4pLeisure 3:92dae9083c83 207 T7RxMsg[0] = 0x00;
Just4pLeisure 3:92dae9083c83 208 while (T7RxMsg[0] != 0x80 && T7RxMsg[0] != 0xC0) {
Just4pLeisure 3:92dae9083c83 209 if (!can_wait_timeout(T7SEC_RX, T7RxMsg, 8, T7MESSAGETIMEOUT))
Just4pLeisure 3:92dae9083c83 210 break;
Just4pLeisure 3:92dae9083c83 211 // Need to process the received data here!
Just4pLeisure 3:92dae9083c83 212 // Send Ack
Just4pLeisure 3:92dae9083c83 213 T7_dump_ack[3] = T7RxMsg[0] & 0xBF;
Just4pLeisure 3:92dae9083c83 214 if (!can_send_timeout (T7ACK_ID, T7_dump_ack, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 215 printf("ERROR processing: %5.1f %% done\r\n", 100*(float)received/(float)T7FLASHSIZE);
Just4pLeisure 3:92dae9083c83 216 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 217 fclose(fp);
Just4pLeisure 3:92dae9083c83 218 return FALSE;
Just4pLeisure 3:92dae9083c83 219 }
Just4pLeisure 3:92dae9083c83 220 // /* DEBUG info...
Just4pLeisure 3:92dae9083c83 221 // for (i = 0; i < 8; i++ ) printf("0x%02X ", T7RxMsg[i] );
Just4pLeisure 3:92dae9083c83 222 // for (i = 2; i < 8; i++ ) printf("%c ", T7RxMsg[i] );
Just4pLeisure 3:92dae9083c83 223 // printf(" data\r\n");
Just4pLeisure 3:92dae9083c83 224 for (i = 2; i < 8; i++ )
Just4pLeisure 3:92dae9083c83 225 file_buffer[byte_count++] = (T7RxMsg[i]);
Just4pLeisure 3:92dae9083c83 226 // */
Just4pLeisure 3:92dae9083c83 227 }
Just4pLeisure 3:92dae9083c83 228 // Success if these conditions met
Just4pLeisure 3:92dae9083c83 229 if (T7RxMsg[0] == 0x80 || T7RxMsg[0] == 0xC0)
Just4pLeisure 3:92dae9083c83 230 break;
Just4pLeisure 3:92dae9083c83 231 // printf("retries: %d\r\n", retries);
Just4pLeisure 3:92dae9083c83 232 }
Just4pLeisure 3:92dae9083c83 233 if (retries > 9) {
Just4pLeisure 3:92dae9083c83 234 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 235 printf("Retries: %d, Done: %5.2f %%\r\n", retries, 100*(float)received/(float)T7FLASHSIZE );
Just4pLeisure 3:92dae9083c83 236 fclose(fp);
Just4pLeisure 3:92dae9083c83 237 return FALSE;
Just4pLeisure 3:92dae9083c83 238 }
Just4pLeisure 3:92dae9083c83 239 // received += 0xEF;
Just4pLeisure 3:92dae9083c83 240 received += 0x80;
Just4pLeisure 3:92dae9083c83 241 // printf("Retries: %d, Done: %5.2f %%\r\n", retries, 100*(float)received/(float)T7FLASHSIZE );
Just4pLeisure 3:92dae9083c83 242 printf("%6.2f\r", 100*(float)received/(float)T7FLASHSIZE );
Just4pLeisure 3:92dae9083c83 243 fwrite((file_buffer + 3), 1, 0x80, fp);
Just4pLeisure 3:92dae9083c83 244 if (ferror (fp)) {
Just4pLeisure 3:92dae9083c83 245 fclose (fp);
Just4pLeisure 3:92dae9083c83 246 printf ("Error writing to the FLASH BIN file.\r\n");
Just4pLeisure 3:92dae9083c83 247 return TERM_ERR;
Just4pLeisure 3:92dae9083c83 248 }
Just4pLeisure 3:92dae9083c83 249 }
Just4pLeisure 3:92dae9083c83 250 printf("\n");
Just4pLeisure 3:92dae9083c83 251 // Send Message to T7 ECU to say that we have finished
Just4pLeisure 3:92dae9083c83 252 if (!can_send_timeout (T7SEC_ID, T7_dump_end, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 253 fclose(fp);
Just4pLeisure 3:92dae9083c83 254 return FALSE;
Just4pLeisure 3:92dae9083c83 255 }
Just4pLeisure 3:92dae9083c83 256 // Wait for response
Just4pLeisure 3:92dae9083c83 257 if (!can_wait_timeout(T7SEC_RX, T7RxMsg, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 258 fclose(fp);
Just4pLeisure 3:92dae9083c83 259 return FALSE;
Just4pLeisure 3:92dae9083c83 260 }
Just4pLeisure 3:92dae9083c83 261 // Send Ack
Just4pLeisure 3:92dae9083c83 262 T7_dump_ack[3] = T7RxMsg[0] & 0xBF;
Just4pLeisure 3:92dae9083c83 263 if (!can_send_timeout (T7ACK_ID, T7_dump_ack, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 264 printf("ERROR closing1: %5.1f %% done\r\n", 100*(float)received/(float)T7FLASHSIZE);
Just4pLeisure 3:92dae9083c83 265 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 266 fclose(fp);
Just4pLeisure 3:92dae9083c83 267 return FALSE;
Just4pLeisure 3:92dae9083c83 268 }
Just4pLeisure 3:92dae9083c83 269 if (T7RxMsg[3] != 0xC2) {
Just4pLeisure 3:92dae9083c83 270 printf("ERROR closing2: %5.1f %% done\r\n", 100*(float)received/(float)T7FLASHSIZE);
Just4pLeisure 3:92dae9083c83 271 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 272 fclose(fp);
Just4pLeisure 3:92dae9083c83 273 return FALSE;
Just4pLeisure 3:92dae9083c83 274 }
Just4pLeisure 3:92dae9083c83 275 timer.stop();
Just4pLeisure 3:92dae9083c83 276 printf("SUCCESS! Getting the FLASH dump took %#.1f seconds.\r\n",timer.read());
Just4pLeisure 3:92dae9083c83 277 fclose(fp);
Just4pLeisure 3:92dae9083c83 278 return TRUE;
Just4pLeisure 3:92dae9083c83 279 }
Just4pLeisure 3:92dae9083c83 280
Just4pLeisure 6:2fbcbebed28c 281 bool t7_erase()
Just4pLeisure 6:2fbcbebed28c 282 {
Just4pLeisure 6:2fbcbebed28c 283 char T7_erase_msga[] = { 0x40, 0xA1, 0x02, 0x31, 0x52, 0x00, 0x00, 0x00 };
Just4pLeisure 6:2fbcbebed28c 284 char T7_erase_msgb[] = { 0x40, 0xA1, 0x02, 0x31, 0x53, 0x00, 0x00, 0x00 };
Just4pLeisure 6:2fbcbebed28c 285 char T7_erase_confirm[] = { 0x40, 0xA1, 0x01, 0x3E, 0x00, 0x00, 0x00, 0x00 };
Just4pLeisure 3:92dae9083c83 286 char T7_erase_ack[] = { 0x40, 0xA1, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00 };
Just4pLeisure 3:92dae9083c83 287 char data[8];
Just4pLeisure 3:92dae9083c83 288 int i;
Just4pLeisure 3:92dae9083c83 289
Just4pLeisure 3:92dae9083c83 290 printf("Erasing T7 ECU FLASH...\r\n");
Just4pLeisure 3:92dae9083c83 291
Just4pLeisure 3:92dae9083c83 292 data[3] = 0;
Just4pLeisure 3:92dae9083c83 293 i = 0;
Just4pLeisure 3:92dae9083c83 294 while ( data[3] != 0x71 && i < 10) {
Just4pLeisure 3:92dae9083c83 295 // Send "Request to ERASE" to Trionic
Just4pLeisure 3:92dae9083c83 296 if (!can_send_timeout (T7SEC_ID, T7_erase_msga, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 6:2fbcbebed28c 297 printf("err %s line: %d\r\n", __FILE__, __LINE__ );
Just4pLeisure 3:92dae9083c83 298 return FALSE;
Just4pLeisure 3:92dae9083c83 299 }
Just4pLeisure 3:92dae9083c83 300 if (!can_wait_timeout(T7SEC_RX, data, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 6:2fbcbebed28c 301 printf("err %s line: %d\r\n", __FILE__, __LINE__ );
Just4pLeisure 3:92dae9083c83 302 return FALSE;
Just4pLeisure 3:92dae9083c83 303 }
Just4pLeisure 3:92dae9083c83 304 T7_erase_ack[3] = data[0] & 0xBF;
Just4pLeisure 3:92dae9083c83 305 if (!can_send_timeout (T7ACK_ID, T7_erase_ack, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 6:2fbcbebed28c 306 printf("err %s line: %d\r\n", __FILE__, __LINE__ );
Just4pLeisure 3:92dae9083c83 307 return FALSE;
Just4pLeisure 3:92dae9083c83 308 }
Just4pLeisure 3:92dae9083c83 309 wait_ms(100);
Just4pLeisure 3:92dae9083c83 310 i++;
Just4pLeisure 3:92dae9083c83 311 printf(".");
Just4pLeisure 3:92dae9083c83 312 }
Just4pLeisure 3:92dae9083c83 313 printf("\r\n");
Just4pLeisure 3:92dae9083c83 314 // Check to see if erase operation lasted longer than 1 sec...
Just4pLeisure 3:92dae9083c83 315 if (i >=10) {
Just4pLeisure 3:92dae9083c83 316 printf("Second Message took too long'\r\n");
Just4pLeisure 3:92dae9083c83 317 return FALSE;
Just4pLeisure 3:92dae9083c83 318 }
Just4pLeisure 3:92dae9083c83 319 data[3] = 0;
Just4pLeisure 3:92dae9083c83 320 i = 0;
Just4pLeisure 3:92dae9083c83 321 while ( data[3] != 0x71 && i < 200) {
Just4pLeisure 3:92dae9083c83 322 // Send "Request to ERASE" to Trionic
Just4pLeisure 3:92dae9083c83 323 if (!can_send_timeout (T7SEC_ID, T7_erase_msgb, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 6:2fbcbebed28c 324 printf("err %s line: %d\r\n", __FILE__, __LINE__ );
Just4pLeisure 3:92dae9083c83 325 return FALSE;
Just4pLeisure 3:92dae9083c83 326 }
Just4pLeisure 3:92dae9083c83 327 if (!can_wait_timeout(T7SEC_RX, data, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 6:2fbcbebed28c 328 printf("err %s line: %d\r\n", __FILE__, __LINE__ );
Just4pLeisure 3:92dae9083c83 329 return FALSE;
Just4pLeisure 3:92dae9083c83 330 }
Just4pLeisure 3:92dae9083c83 331 T7_erase_ack[3] = data[0] & 0xBF;
Just4pLeisure 3:92dae9083c83 332 if (!can_send_timeout (T7ACK_ID, T7_erase_ack, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 6:2fbcbebed28c 333 printf("err %s line: %d\r\n", __FILE__, __LINE__ );
Just4pLeisure 3:92dae9083c83 334 return FALSE;
Just4pLeisure 3:92dae9083c83 335 }
Just4pLeisure 3:92dae9083c83 336 wait_ms(100);
Just4pLeisure 3:92dae9083c83 337 i++;
Just4pLeisure 3:92dae9083c83 338 printf(".");
Just4pLeisure 3:92dae9083c83 339 }
Just4pLeisure 3:92dae9083c83 340 printf("\r\n");
Just4pLeisure 3:92dae9083c83 341 // Check to see if erase operation lasted longer than 20 sec...
Just4pLeisure 3:92dae9083c83 342 if (i >=200) {
Just4pLeisure 3:92dae9083c83 343 printf("Second Message took too long'\r\n");
Just4pLeisure 3:92dae9083c83 344 return FALSE;
Just4pLeisure 3:92dae9083c83 345 }
Just4pLeisure 3:92dae9083c83 346
Just4pLeisure 3:92dae9083c83 347 // Confirm erase was successful?
Just4pLeisure 3:92dae9083c83 348 // (Note: no acknowledgements used for some reason)
Just4pLeisure 3:92dae9083c83 349 if (!can_send_timeout (T7SEC_ID, T7_erase_confirm, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 6:2fbcbebed28c 350 printf("err %s line: %d\r\n", __FILE__, __LINE__ );
Just4pLeisure 3:92dae9083c83 351 return FALSE;
Just4pLeisure 3:92dae9083c83 352 }
Just4pLeisure 3:92dae9083c83 353 if (!can_wait_timeout(T7SEC_RX, data, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 6:2fbcbebed28c 354 printf("err %s line: %d\r\n", __FILE__, __LINE__ );
Just4pLeisure 3:92dae9083c83 355 return FALSE;
Just4pLeisure 3:92dae9083c83 356 }
Just4pLeisure 3:92dae9083c83 357 if ( data[3] != 0x7E ) {
Just4pLeisure 6:2fbcbebed28c 358 printf("err %s line: %d\r\n", __FILE__, __LINE__ );
Just4pLeisure 3:92dae9083c83 359 return FALSE;
Just4pLeisure 3:92dae9083c83 360 }
Just4pLeisure 3:92dae9083c83 361 wait_ms(100);
Just4pLeisure 3:92dae9083c83 362 if (!can_send_timeout (T7SEC_ID, T7_erase_confirm, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 6:2fbcbebed28c 363 printf("err %s line: %d\r\n", __FILE__, __LINE__ );
Just4pLeisure 3:92dae9083c83 364 return FALSE;
Just4pLeisure 3:92dae9083c83 365 }
Just4pLeisure 3:92dae9083c83 366 if (!can_wait_timeout(T7SEC_RX, data, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 6:2fbcbebed28c 367 printf("err %s line: %d\r\n", __FILE__, __LINE__ );
Just4pLeisure 3:92dae9083c83 368 return FALSE;
Just4pLeisure 3:92dae9083c83 369 }
Just4pLeisure 3:92dae9083c83 370 if ( data[3] != 0x7E ) {
Just4pLeisure 6:2fbcbebed28c 371 printf("FAILURE: Unable to erase the FLASH .\r\n");
Just4pLeisure 3:92dae9083c83 372 return FALSE;
Just4pLeisure 3:92dae9083c83 373 }
Just4pLeisure 3:92dae9083c83 374 printf("SUCCESS: The FLASH has been erased.\r\n");
Just4pLeisure 3:92dae9083c83 375 return TRUE;
Just4pLeisure 3:92dae9083c83 376 }
Just4pLeisure 3:92dae9083c83 377
Just4pLeisure 3:92dae9083c83 378
Just4pLeisure 6:2fbcbebed28c 379 /// Open and check the bin file to make sure that it is a valid T7 BIN file
Just4pLeisure 6:2fbcbebed28c 380 ///
Just4pLeisure 6:2fbcbebed28c 381 /// params full filename including path of the T7 BIN file
Just4pLeisure 6:2fbcbebed28c 382 ///
Just4pLeisure 6:2fbcbebed28c 383 /// returns a pointer to the T7 BIN file
Just4pLeisure 6:2fbcbebed28c 384 /// or a null pointer if it is invalid in some way
Just4pLeisure 6:2fbcbebed28c 385
Just4pLeisure 6:2fbcbebed28c 386 FILE * t7_file_open(const char* fname)
Just4pLeisure 6:2fbcbebed28c 387 {
Just4pLeisure 3:92dae9083c83 388 printf("Checking the FLASH BIN file...\r\n");
Just4pLeisure 6:2fbcbebed28c 389 FILE *fp = fopen(fname, "r"); // Open "modified.bin" on the local file system for reading
Just4pLeisure 3:92dae9083c83 390 if (!fp) {
Just4pLeisure 5:1775b4b13232 391 printf("Error: I could not find the BIN file MODIFIED.BIN\r\n");;
Just4pLeisure 6:2fbcbebed28c 392 return NULL;
Just4pLeisure 3:92dae9083c83 393 }
Just4pLeisure 3:92dae9083c83 394 // obtain file size - it should match the size of the FLASH chips:
Just4pLeisure 3:92dae9083c83 395 fseek (fp , 0 , SEEK_END);
Just4pLeisure 3:92dae9083c83 396 uint32_t file_size = ftell (fp);
Just4pLeisure 3:92dae9083c83 397 rewind (fp);
Just4pLeisure 6:2fbcbebed28c 398 if (file_size != T7FLASHSIZE) {
Just4pLeisure 6:2fbcbebed28c 399 fclose(fp);
Just4pLeisure 6:2fbcbebed28c 400 printf("The BIN file does not appear to be for a T7 ECU :-(\r\n");
Just4pLeisure 6:2fbcbebed28c 401 printf("T7's FLASH chip size is: %#010x bytes.\r\n", T7FLASHSIZE);
Just4pLeisure 6:2fbcbebed28c 402 printf("The BIN's file size is: %#010x bytes.\r\n", file_size);
Just4pLeisure 6:2fbcbebed28c 403 return NULL;
Just4pLeisure 6:2fbcbebed28c 404 }
Just4pLeisure 3:92dae9083c83 405
Just4pLeisure 3:92dae9083c83 406 // read the initial stack pointer value in the BIN file - it should match the value expected for the type of ECU
Just4pLeisure 3:92dae9083c83 407 uint8_t stack_byte = 0;
Just4pLeisure 3:92dae9083c83 408 uint32_t stack_long = 0;
Just4pLeisure 6:2fbcbebed28c 409 for (uint32_t i=0; i<4; i++) {
Just4pLeisure 6:2fbcbebed28c 410 if (!fread(&stack_byte,1,1,fp)) {
Just4pLeisure 6:2fbcbebed28c 411 printf("Error reading the BIN file MODIFIED.BIN\r\n");
Just4pLeisure 6:2fbcbebed28c 412 return NULL;
Just4pLeisure 6:2fbcbebed28c 413 }
Just4pLeisure 6:2fbcbebed28c 414 stack_long <<= 8;
Just4pLeisure 6:2fbcbebed28c 415 stack_long |= stack_byte;
Just4pLeisure 6:2fbcbebed28c 416 }
Just4pLeisure 3:92dae9083c83 417 rewind (fp);
Just4pLeisure 6:2fbcbebed28c 418 if (stack_long != T7POINTER) {
Just4pLeisure 3:92dae9083c83 419 fclose(fp);
Just4pLeisure 3:92dae9083c83 420 printf("The BIN file does not appear to be for a T7 ECU :-(\r\n");
Just4pLeisure 6:2fbcbebed28c 421 printf("A T7 BIN file should start with: %#010x.\r\n", T7POINTER);
Just4pLeisure 6:2fbcbebed28c 422 printf("This file starts with : %#010x.\r\n", stack_long);
Just4pLeisure 6:2fbcbebed28c 423 return NULL;
Just4pLeisure 6:2fbcbebed28c 424 }
Just4pLeisure 6:2fbcbebed28c 425 printf("The BIN file appears to OK :-)\r\n");
Just4pLeisure 6:2fbcbebed28c 426 return fp;
Just4pLeisure 6:2fbcbebed28c 427 }
Just4pLeisure 6:2fbcbebed28c 428
Just4pLeisure 6:2fbcbebed28c 429
Just4pLeisure 6:2fbcbebed28c 430 bool t7_flash_segment(FILE *fp, uint32_t address, uint32_t size, bool blockmode)
Just4pLeisure 6:2fbcbebed28c 431 {
Just4pLeisure 6:2fbcbebed28c 432 char T7_flash_start[] = T7FLASTRT;
Just4pLeisure 6:2fbcbebed28c 433 char T7_flash_size[] = T7FLASIZE;
Just4pLeisure 6:2fbcbebed28c 434 char T7_flash_ack[] = T7FLA_ACK;
Just4pLeisure 6:2fbcbebed28c 435 char data[8];
Just4pLeisure 6:2fbcbebed28c 436
Just4pLeisure 6:2fbcbebed28c 437 int32_t i, k;
Just4pLeisure 6:2fbcbebed28c 438
Just4pLeisure 6:2fbcbebed28c 439 uint32_t current_address = address;
Just4pLeisure 6:2fbcbebed28c 440 uint32_t segment_end = address + size;
Just4pLeisure 6:2fbcbebed28c 441
Just4pLeisure 6:2fbcbebed28c 442 if ((current_address > T7FLASHSIZE) || (segment_end > T7FLASHSIZE)) {
Just4pLeisure 6:2fbcbebed28c 443 printf("Attempting to FLASH outside of FLASH region\r\n");
Just4pLeisure 6:2fbcbebed28c 444 printf("Start Address: %#010x, End Address: %#010x.\r\n", current_address, segment_end);
Just4pLeisure 6:2fbcbebed28c 445 printf("err %s line: %d\r\n", __FILE__, __LINE__ );
Just4pLeisure 6:2fbcbebed28c 446 return FALSE;
Just4pLeisure 3:92dae9083c83 447 }
Just4pLeisure 3:92dae9083c83 448
Just4pLeisure 6:2fbcbebed28c 449 // blocksize can be any size between 1 and 250 (0x01 - 0xFA)
Just4pLeisure 6:2fbcbebed28c 450 // Better performance is realised with a bigger blocksize
Just4pLeisure 6:2fbcbebed28c 451 //
Just4pLeisure 6:2fbcbebed28c 452 // The following convenient sizes to use for testing
Just4pLeisure 6:2fbcbebed28c 453 // 0x04, 0x10 and 0x40
Just4pLeisure 6:2fbcbebed28c 454 // A value of 0x70 is useful when programming the BIN region
Just4pLeisure 6:2fbcbebed28c 455 //uint32_t blocksize = (blockmode == true) ? 0x70 : 0x04;
Just4pLeisure 6:2fbcbebed28c 456 uint32_t blocksize = (blockmode == true) ? 0xFA : 0x04;
Just4pLeisure 6:2fbcbebed28c 457 // Sanity check
Just4pLeisure 6:2fbcbebed28c 458 if (blocksize < 0x01) blocksize = 0x01;
Just4pLeisure 6:2fbcbebed28c 459 if (blocksize > 0xFA) blocksize = 0xFA;
Just4pLeisure 6:2fbcbebed28c 460 uint32_t blockquantity, blockremainder, blockfirst, blockduring;
Just4pLeisure 3:92dae9083c83 461
Just4pLeisure 6:2fbcbebed28c 462 if (fseek (fp , address , SEEK_SET) != 0x0) {
Just4pLeisure 6:2fbcbebed28c 463 printf("Cannot move to file position %#010x.\r\n", current_address);
Just4pLeisure 6:2fbcbebed28c 464 printf("err %s line: %d\r\n", __FILE__, __LINE__ );
Just4pLeisure 3:92dae9083c83 465 return FALSE;
Just4pLeisure 3:92dae9083c83 466 }
Just4pLeisure 6:2fbcbebed28c 467 for(i=0; i<3; i++) {
Just4pLeisure 6:2fbcbebed28c 468 T7_flash_start[6-i] = (address >> (8*i)) & 0xff;
Just4pLeisure 6:2fbcbebed28c 469 T7_flash_size[4-i] = (size >> (8*i)) & 0xff;
Just4pLeisure 6:2fbcbebed28c 470 }
Just4pLeisure 6:2fbcbebed28c 471
Just4pLeisure 6:2fbcbebed28c 472 // Send "Request Download - tool to module" to Trionic for the BIN file code and 'cal' data
Just4pLeisure 6:2fbcbebed28c 473 if (!can_send_timeout (T7SEC_ID, T7_flash_start, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 6:2fbcbebed28c 474 printf("err %s line: %d\r\n", __FILE__, __LINE__ );
Just4pLeisure 6:2fbcbebed28c 475 return FALSE;
Just4pLeisure 6:2fbcbebed28c 476 }
Just4pLeisure 6:2fbcbebed28c 477 if (!can_send_timeout (T7SEC_ID, T7_flash_size, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 6:2fbcbebed28c 478 printf("err %s line: %d\r\n", __FILE__, __LINE__ );
Just4pLeisure 3:92dae9083c83 479 return FALSE;
Just4pLeisure 3:92dae9083c83 480 }
Just4pLeisure 3:92dae9083c83 481 if (!can_wait_timeout(T7SEC_RX, data, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 6:2fbcbebed28c 482 printf("err %s line: %d\r\n", __FILE__, __LINE__ );
Just4pLeisure 3:92dae9083c83 483 return FALSE;
Just4pLeisure 3:92dae9083c83 484 }
Just4pLeisure 3:92dae9083c83 485 T7_flash_ack[3] = data[0] & 0xBF;
Just4pLeisure 3:92dae9083c83 486 if (!can_send_timeout (T7ACK_ID, T7_flash_ack, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 6:2fbcbebed28c 487 printf("err %s line: %d\r\n", __FILE__, __LINE__ );
Just4pLeisure 3:92dae9083c83 488 return FALSE;
Just4pLeisure 3:92dae9083c83 489 }
Just4pLeisure 3:92dae9083c83 490 if ( data[3] != 0x74 ) {
Just4pLeisure 3:92dae9083c83 491 printf("Cannot Update FLASH, message refused.\r\n");
Just4pLeisure 6:2fbcbebed28c 492 printf("err %s line: %d\r\n", __FILE__, __LINE__ );
Just4pLeisure 3:92dae9083c83 493 return FALSE;
Just4pLeisure 3:92dae9083c83 494 }
Just4pLeisure 3:92dae9083c83 495
Just4pLeisure 6:2fbcbebed28c 496 // FLASH main Binary image up to address + size
Just4pLeisure 4:682d96ff6d79 497 printf(" 0.00 %% complete.\r");
Just4pLeisure 6:2fbcbebed28c 498 while (current_address < segment_end) {
Just4pLeisure 6:2fbcbebed28c 499 if ((segment_end - current_address) < blocksize) {
Just4pLeisure 6:2fbcbebed28c 500 blocksize = (segment_end - current_address);
Just4pLeisure 6:2fbcbebed28c 501 wait_ms(T7MESSAGETIMEOUT);
Just4pLeisure 6:2fbcbebed28c 502 }
Just4pLeisure 6:2fbcbebed28c 503 if (blocksize > 4) {
Just4pLeisure 6:2fbcbebed28c 504 blockfirst = 4;
Just4pLeisure 6:2fbcbebed28c 505 blockquantity = (blocksize - blockfirst) / 6;
Just4pLeisure 6:2fbcbebed28c 506 blockremainder = (blocksize - blockfirst) % 6;
Just4pLeisure 6:2fbcbebed28c 507 if (blockremainder != 0) {
Just4pLeisure 6:2fbcbebed28c 508 blockquantity++;
Just4pLeisure 6:2fbcbebed28c 509 }
Just4pLeisure 6:2fbcbebed28c 510 } else {
Just4pLeisure 6:2fbcbebed28c 511 blockfirst = blocksize;
Just4pLeisure 6:2fbcbebed28c 512 blockquantity = 0;
Just4pLeisure 6:2fbcbebed28c 513 blockremainder = 0;
Just4pLeisure 6:2fbcbebed28c 514 }
Just4pLeisure 3:92dae9083c83 515
Just4pLeisure 6:2fbcbebed28c 516 data[0] = 0x40 + blockquantity; // e.g 0x40 send, | 0x0A (10) messages to follow
Just4pLeisure 3:92dae9083c83 517 data[1] = 0xA1;
Just4pLeisure 6:2fbcbebed28c 518 data[2] = blocksize + 1; // length+1 (64 Bytes)
Just4pLeisure 3:92dae9083c83 519 data[3] = 0x36; // Data Transfer
Just4pLeisure 6:2fbcbebed28c 520 if (!fread((data+4),1,blockfirst,fp)) {
Just4pLeisure 6:2fbcbebed28c 521 printf("\nError reading the BIN file MODIFIED.BIN\r\n");
Just4pLeisure 3:92dae9083c83 522 return FALSE;
Just4pLeisure 3:92dae9083c83 523 }
Just4pLeisure 6:2fbcbebed28c 524 #ifdef DEBUG
Just4pLeisure 6:2fbcbebed28c 525 // DEBUG info...
Just4pLeisure 6:2fbcbebed28c 526 for (k = 0; k < 8; k++ ) printf("0x%02X ", data[k] );
Just4pLeisure 6:2fbcbebed28c 527 for (k = 2; k < 8; k++ ) printf("%c ", data[k] );
Just4pLeisure 6:2fbcbebed28c 528 printf(" data\r\n");
Just4pLeisure 6:2fbcbebed28c 529 #endif
Just4pLeisure 6:2fbcbebed28c 530 if (!can_send_timeout (T7SEC_ID, data, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 6:2fbcbebed28c 531 printf("\nerr %s line: %d\r\n", __FILE__, __LINE__ );
Just4pLeisure 6:2fbcbebed28c 532 return FALSE;
Just4pLeisure 6:2fbcbebed28c 533 }
Just4pLeisure 6:2fbcbebed28c 534 if (blocksize > 4) {
Just4pLeisure 6:2fbcbebed28c 535 for (i = (blockquantity-1); i>=0; i--) {
Just4pLeisure 6:2fbcbebed28c 536 data[0] = i;
Just4pLeisure 6:2fbcbebed28c 537 if ((i == 0) && (blockremainder != 0)) {
Just4pLeisure 6:2fbcbebed28c 538 blockduring = blockremainder;
Just4pLeisure 6:2fbcbebed28c 539 } else {
Just4pLeisure 6:2fbcbebed28c 540 blockduring = 6;
Just4pLeisure 3:92dae9083c83 541 }
Just4pLeisure 6:2fbcbebed28c 542 if (!fread((data+2),1,blockduring,fp)) {
Just4pLeisure 6:2fbcbebed28c 543 printf("\nError reading the BIN file MODIFIED.BIN\r\n");
Just4pLeisure 6:2fbcbebed28c 544 return FALSE;
Just4pLeisure 6:2fbcbebed28c 545 }
Just4pLeisure 6:2fbcbebed28c 546 #ifdef DEBUG
Just4pLeisure 6:2fbcbebed28c 547 // DEBUG info...
Just4pLeisure 6:2fbcbebed28c 548 for (k = 0; k < 8; k++ ) printf("0x%02X ", data[k] );
Just4pLeisure 6:2fbcbebed28c 549 for (k = 2; k < 8; k++ ) printf("%c ", data[k] );
Just4pLeisure 6:2fbcbebed28c 550 printf(" data\r\n");
Just4pLeisure 6:2fbcbebed28c 551 printf("%6.2f\r", 100*(float)current_address/(float)T7FLASHSIZE );
Just4pLeisure 6:2fbcbebed28c 552 #endif
Just4pLeisure 6:2fbcbebed28c 553 wait_us(300);
Just4pLeisure 6:2fbcbebed28c 554 // wait_ms(10); // 31/3/12 this longer wait might be needed for i-bus connections...
Just4pLeisure 6:2fbcbebed28c 555 if (!can_send_timeout (T7SEC_ID, data, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 6:2fbcbebed28c 556 printf("\nerr %s line: %d\r\n", __FILE__, __LINE__ );
Just4pLeisure 6:2fbcbebed28c 557 return FALSE;
Just4pLeisure 6:2fbcbebed28c 558 }
Just4pLeisure 6:2fbcbebed28c 559 }
Just4pLeisure 6:2fbcbebed28c 560 }
Just4pLeisure 3:92dae9083c83 561 if (!can_wait_timeout(T7SEC_RX, data, 8, T7LONGERTIMEOUT)) {
Just4pLeisure 6:2fbcbebed28c 562 printf("\nerr %s line: %d\r\n", __FILE__, __LINE__ );
Just4pLeisure 3:92dae9083c83 563 return FALSE;
Just4pLeisure 3:92dae9083c83 564 }
Just4pLeisure 3:92dae9083c83 565 // Send acknowledgement
Just4pLeisure 3:92dae9083c83 566 T7_flash_ack[3] = data[0] & 0xBF;
Just4pLeisure 3:92dae9083c83 567 if (!can_send_timeout (T7ACK_ID, T7_flash_ack, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 6:2fbcbebed28c 568 printf("\nerr %s line: %d\r\n", __FILE__, __LINE__ );
Just4pLeisure 3:92dae9083c83 569 return FALSE;
Just4pLeisure 3:92dae9083c83 570 }
Just4pLeisure 3:92dae9083c83 571 if ( data[3] != 0x76 ) {
Just4pLeisure 6:2fbcbebed28c 572 printf ("\n");
Just4pLeisure 6:2fbcbebed28c 573 //#ifdef DEBUG
Just4pLeisure 6:2fbcbebed28c 574 // DEBUG info...
Just4pLeisure 6:2fbcbebed28c 575 for (k = 0; k < 8; k++ ) printf("%#04x ", data[k] );
Just4pLeisure 6:2fbcbebed28c 576 for (k = 2; k < 8; k++ ) printf("%c ", data[k] );
Just4pLeisure 6:2fbcbebed28c 577 printf(" data\r\n");
Just4pLeisure 6:2fbcbebed28c 578 //#endif
Just4pLeisure 6:2fbcbebed28c 579 printf("Cannot Program Address %#010x.\r\n", current_address);
Just4pLeisure 6:2fbcbebed28c 580 printf("Block Size %#04x, First %#04x, Quantity %#04x, Remainder %#04x\r\n", blocksize, blockfirst, blockquantity, blockremainder);
Just4pLeisure 6:2fbcbebed28c 581 printf("\nerr %s line: %d\r\n", __FILE__, __LINE__ );
Just4pLeisure 4:682d96ff6d79 582 return FALSE;
Just4pLeisure 4:682d96ff6d79 583 }
Just4pLeisure 6:2fbcbebed28c 584 current_address += blocksize;
Just4pLeisure 6:2fbcbebed28c 585 // if (!(current_address % 0x80))
Just4pLeisure 6:2fbcbebed28c 586 printf("%6.2f\r", 100*(float)current_address/(float)T7FLASHSIZE );
Just4pLeisure 6:2fbcbebed28c 587 }
Just4pLeisure 6:2fbcbebed28c 588 if (blockmode == true) wait_ms(T7MESSAGETIMEOUT);
Just4pLeisure 4:682d96ff6d79 589 return TRUE;
Just4pLeisure 4:682d96ff6d79 590 }
Just4pLeisure 4:682d96ff6d79 591
Just4pLeisure 6:2fbcbebed28c 592 bool t7_flash(FILE *fp, bool blockmode)
Just4pLeisure 6:2fbcbebed28c 593 {
Just4pLeisure 6:2fbcbebed28c 594 timer.reset();
Just4pLeisure 6:2fbcbebed28c 595 timer.start();
Just4pLeisure 6:2fbcbebed28c 596 printf("T7 program and caldata\r\n");
Just4pLeisure 6:2fbcbebed28c 597 if (t7_flash_segment(fp, 0x000000, 0x070000, blockmode)) { // T7 program and caldata
Just4pLeisure 6:2fbcbebed28c 598 printf("\nAdaptation data 1\r\n");
Just4pLeisure 6:2fbcbebed28c 599 if (t7_flash_segment(fp, 0x070000, 0x002000, blockmode)) { // Adaptation data 1
Just4pLeisure 6:2fbcbebed28c 600 printf("\nAdaptation data 2\r\n");
Just4pLeisure 6:2fbcbebed28c 601 if (t7_flash_segment(fp, 0x07C000, 0x00280, blockmode)) { // Adaptation data 2
Just4pLeisure 6:2fbcbebed28c 602 printf("\nT7Suite watermark\r\n");
Just4pLeisure 6:2fbcbebed28c 603 if (t7_flash_segment(fp, 0x07FD00, 0x000020, blockmode)) { // T7Suite watermark
Just4pLeisure 6:2fbcbebed28c 604 printf("\nT7 Header\r\n");
Just4pLeisure 6:2fbcbebed28c 605 if (t7_flash_segment(fp, 0x07FF00, 0x000100, blockmode)) { // T7 Header
Just4pLeisure 6:2fbcbebed28c 606 timer.stop();
Just4pLeisure 6:2fbcbebed28c 607 printf("100.00\r\n");
Just4pLeisure 6:2fbcbebed28c 608 printf("SUCCESS! Programming the FLASH took %#.1f seconds.\r\n",timer.read());
Just4pLeisure 6:2fbcbebed28c 609 return true;
Just4pLeisure 6:2fbcbebed28c 610 }
Just4pLeisure 6:2fbcbebed28c 611 }
Just4pLeisure 6:2fbcbebed28c 612 }
Just4pLeisure 6:2fbcbebed28c 613 }
Just4pLeisure 6:2fbcbebed28c 614 }
Just4pLeisure 6:2fbcbebed28c 615 timer.stop();
Just4pLeisure 6:2fbcbebed28c 616 printf("\nFAILURE! Unable to program FLASH after %#.1f seconds.\r\n",timer.read());
Just4pLeisure 6:2fbcbebed28c 617 return false;
Just4pLeisure 6:2fbcbebed28c 618 }
Just4pLeisure 4:682d96ff6d79 619
Just4pLeisure 6:2fbcbebed28c 620 bool t7_recover(FILE *fp)
Just4pLeisure 6:2fbcbebed28c 621 {
Just4pLeisure 6:2fbcbebed28c 622 timer.reset();
Just4pLeisure 6:2fbcbebed28c 623 timer.start();
Just4pLeisure 6:2fbcbebed28c 624 if (t7_flash_segment(fp, 0x000000, 0x080000, false)) { // Entire T7 BIN File
Just4pLeisure 6:2fbcbebed28c 625 timer.stop();
Just4pLeisure 6:2fbcbebed28c 626 printf("100.00\r\n");
Just4pLeisure 6:2fbcbebed28c 627 printf("SUCCESS! Programming the FLASH took %#.1f seconds.\r\n",timer.read());
Just4pLeisure 6:2fbcbebed28c 628 return true;
Just4pLeisure 6:2fbcbebed28c 629 }
Just4pLeisure 6:2fbcbebed28c 630 timer.stop();
Just4pLeisure 6:2fbcbebed28c 631 printf("\nFAILURE! Unable to program FLASH after %#.1f seconds.\r\n",timer.read());
Just4pLeisure 6:2fbcbebed28c 632 return false;
Just4pLeisure 6:2fbcbebed28c 633 }
Just4pLeisure 6:2fbcbebed28c 634
Just4pLeisure 6:2fbcbebed28c 635
Just4pLeisure 6:2fbcbebed28c 636 /// Reset and restart a T7 ECU after a FLASH operation
Just4pLeisure 6:2fbcbebed28c 637 ///
Just4pLeisure 6:2fbcbebed28c 638 /// NOTE: DOESN't WORK !!!
Just4pLeisure 6:2fbcbebed28c 639 ///
Just4pLeisure 6:2fbcbebed28c 640 bool t7_reset()
Just4pLeisure 6:2fbcbebed28c 641 {
Just4pLeisure 4:682d96ff6d79 642 char T7_flash_exit[] = T7FLAEXIT;
Just4pLeisure 4:682d96ff6d79 643 char T7_flash_ack[] = T7FLA_ACK;
Just4pLeisure 6:2fbcbebed28c 644 char T7_flash_end[] = T7FLA_END;
Just4pLeisure 4:682d96ff6d79 645 char data[8];
Just4pLeisure 4:682d96ff6d79 646
Just4pLeisure 6:2fbcbebed28c 647 printf("Restarting T7 ECU");
Just4pLeisure 6:2fbcbebed28c 648 // Send "Request Data Transfer Exit" to Trionic
Just4pLeisure 6:2fbcbebed28c 649 if (!can_send_timeout (T7SEC_ID, T7_flash_end, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 6:2fbcbebed28c 650 printf("err %s line: %d\r\n", __FILE__, __LINE__ );
Just4pLeisure 3:92dae9083c83 651 return FALSE;
Just4pLeisure 3:92dae9083c83 652 }
Just4pLeisure 3:92dae9083c83 653 if (!can_wait_timeout(T7SEC_RX, data, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 6:2fbcbebed28c 654 printf("err %s line: %d\r\n", __FILE__, __LINE__ );
Just4pLeisure 3:92dae9083c83 655 return FALSE;
Just4pLeisure 3:92dae9083c83 656 }
Just4pLeisure 3:92dae9083c83 657 T7_flash_ack[3] = data[0] & 0xBF;
Just4pLeisure 3:92dae9083c83 658 if (!can_send_timeout (T7ACK_ID, T7_flash_ack, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 6:2fbcbebed28c 659 printf("err %s line: %d\r\n", __FILE__, __LINE__ );
Just4pLeisure 3:92dae9083c83 660 return FALSE;
Just4pLeisure 3:92dae9083c83 661 }
Just4pLeisure 6:2fbcbebed28c 662 if ( data[3] != 0x77 ) {
Just4pLeisure 6:2fbcbebed28c 663 printf("Cannot Update FLASH, message refused.\r\n");
Just4pLeisure 6:2fbcbebed28c 664 printf("err %s line: %d\r\n", __FILE__, __LINE__ );
Just4pLeisure 4:682d96ff6d79 665 return FALSE;
Just4pLeisure 4:682d96ff6d79 666 }
Just4pLeisure 6:2fbcbebed28c 667 //
Just4pLeisure 6:2fbcbebed28c 668 // Send "Request Data Transfer Exit" to Trionic
Just4pLeisure 6:2fbcbebed28c 669 if (!can_send_timeout (T7SEC_ID, T7_flash_exit, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 6:2fbcbebed28c 670 printf("err %s line: %d\r\n", __FILE__, __LINE__ );
Just4pLeisure 3:92dae9083c83 671 return FALSE;
Just4pLeisure 3:92dae9083c83 672 }
Just4pLeisure 3:92dae9083c83 673 if (!can_wait_timeout(T7SEC_RX, data, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 6:2fbcbebed28c 674 printf("err %s line: %d\r\n", __FILE__, __LINE__ );
Just4pLeisure 3:92dae9083c83 675 return FALSE;
Just4pLeisure 3:92dae9083c83 676 }
Just4pLeisure 3:92dae9083c83 677 T7_flash_ack[3] = data[0] & 0xBF;
Just4pLeisure 3:92dae9083c83 678 if (!can_send_timeout (T7ACK_ID, T7_flash_ack, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 6:2fbcbebed28c 679 printf("err %s line: %d\r\n", __FILE__, __LINE__ );
Just4pLeisure 3:92dae9083c83 680 return FALSE;
Just4pLeisure 3:92dae9083c83 681 }
Just4pLeisure 6:2fbcbebed28c 682 if ( data[3] != 0x71 ) {
Just4pLeisure 6:2fbcbebed28c 683 printf("err %s line: %d\r\n", __FILE__, __LINE__ );
Just4pLeisure 6:2fbcbebed28c 684 return FALSE;
Just4pLeisure 4:682d96ff6d79 685 }
Just4pLeisure 6:2fbcbebed28c 686 return true;
Just4pLeisure 6:2fbcbebed28c 687 }