Just4Trionic - CAN and BDM FLASH programmer for Saab cars

Dependencies:   mbed

Committer:
Just4pLeisure
Date:
Tue Jun 07 12:23:28 2011 +0000
Revision:
3:92dae9083c83
Child:
4:682d96ff6d79
Basic T7 CAN DUMP and FLASH for P-BUS connection only
Requires MyBooty V2.x for T5 CAN FLASHing at 1 Mbps

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 3:92dae9083c83 4 (c) 2011 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 3:92dae9083c83 154 printf(" %% 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 3:92dae9083c83 374 bool t7_flash() {
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 3:92dae9083c83 383 // fopen modified.hex here?
Just4pLeisure 3:92dae9083c83 384 // need lots of fcloses though
Just4pLeisure 3:92dae9083c83 385 printf("Checking the FLASH BIN file...\r\n");
Just4pLeisure 3:92dae9083c83 386 FILE *fp = fopen("/local/modified.hex", "r"); // Open "modified.hex" on the local file system for reading
Just4pLeisure 3:92dae9083c83 387 if (!fp) {
Just4pLeisure 3:92dae9083c83 388 printf("Error: I could not find the BIN file MODIFIED.HEX\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 3:92dae9083c83 450 printf(" %% complete.\r");
Just4pLeisure 3:92dae9083c83 451 while (address < T7FLASHSIZE) {
Just4pLeisure 3:92dae9083c83 452
Just4pLeisure 3:92dae9083c83 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 3:92dae9083c83 455 // data[0] = 0x40; // 0x40 send, | 0x00 (0) messages to follow
Just4pLeisure 3:92dae9083c83 456 data[1] = 0xA1;
Just4pLeisure 3:92dae9083c83 457 data[2] = 0x41; // length+1 (64 Bytes)
Just4pLeisure 3:92dae9083c83 458 // data[2] = 0x11; // length+1 (16 Bytes)
Just4pLeisure 3:92dae9083c83 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 3:92dae9083c83 465 printf("Error reading the BIN file MODIFIED.HEX");
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 3:92dae9083c83 478 //*
Just4pLeisure 3:92dae9083c83 479 for (i = 9; i>=0; i--) {
Just4pLeisure 3:92dae9083c83 480 // for (i = 1; i>=0; i--) {
Just4pLeisure 3:92dae9083c83 481 data[0] = i;
Just4pLeisure 3:92dae9083c83 482 // data[1] = 0xA1;
Just4pLeisure 3:92dae9083c83 483 for ( k = 2; k < 8; k++ )
Just4pLeisure 3:92dae9083c83 484 //data[k] = *(bin + bin_count++);
Just4pLeisure 3:92dae9083c83 485 if (!fread(&data[k],1,1,fp)) {
Just4pLeisure 3:92dae9083c83 486 fclose(fp);
Just4pLeisure 3:92dae9083c83 487 printf("Error reading the BIN file MODIFIED.HEX");
Just4pLeisure 3:92dae9083c83 488 return FALSE;
Just4pLeisure 3:92dae9083c83 489 }
Just4pLeisure 3:92dae9083c83 490 // /* DEBUG info...
Just4pLeisure 3:92dae9083c83 491 // for (k = 0; k < 8; k++ ) printf("0x%02X ", data[k] );
Just4pLeisure 3:92dae9083c83 492 // for (k = 2; k < 8; k++ ) printf("%c ", data[k] );
Just4pLeisure 3:92dae9083c83 493 // printf(" data\r\n");
Just4pLeisure 3:92dae9083c83 494
Just4pLeisure 3:92dae9083c83 495 // printf("%6.2f\r", 100*(float)address/(float)T7FLASHSIZE );
Just4pLeisure 3:92dae9083c83 496 wait_ms(1);
Just4pLeisure 3:92dae9083c83 497 if (!can_send_timeout (T7SEC_ID, data, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 498 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 499 fclose(fp);
Just4pLeisure 3:92dae9083c83 500 return FALSE;
Just4pLeisure 3:92dae9083c83 501 }
Just4pLeisure 3:92dae9083c83 502 }
Just4pLeisure 3:92dae9083c83 503 //*/
Just4pLeisure 3:92dae9083c83 504 address += 0x40;
Just4pLeisure 3:92dae9083c83 505 // address += 0x10;
Just4pLeisure 3:92dae9083c83 506 // address += 0x04;
Just4pLeisure 3:92dae9083c83 507 if (!can_wait_timeout(T7SEC_RX, data, 8, T7LONGERTIMEOUT)) {
Just4pLeisure 3:92dae9083c83 508 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 509 fclose(fp);
Just4pLeisure 3:92dae9083c83 510 return FALSE;
Just4pLeisure 3:92dae9083c83 511 }
Just4pLeisure 3:92dae9083c83 512 // Send acknowledgement
Just4pLeisure 3:92dae9083c83 513 T7_flash_ack[3] = data[0] & 0xBF;
Just4pLeisure 3:92dae9083c83 514 if (!can_send_timeout (T7ACK_ID, T7_flash_ack, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 515 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 516 fclose(fp);
Just4pLeisure 3:92dae9083c83 517 return FALSE;
Just4pLeisure 3:92dae9083c83 518 }
Just4pLeisure 3:92dae9083c83 519 if ( data[3] != 0x76 ) {
Just4pLeisure 3:92dae9083c83 520 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 521 fclose(fp);
Just4pLeisure 3:92dae9083c83 522 return FALSE;
Just4pLeisure 3:92dae9083c83 523 }
Just4pLeisure 3:92dae9083c83 524 if (!(address % 0x80))
Just4pLeisure 3:92dae9083c83 525 printf("%6.2f\r", 100*(float)address/(float)T7FLASHSIZE );
Just4pLeisure 3:92dae9083c83 526 }
Just4pLeisure 3:92dae9083c83 527 printf("\n");
Just4pLeisure 3:92dae9083c83 528 /*
Just4pLeisure 3:92dae9083c83 529 // Send "Request Data Transfer Exit" to Trionic
Just4pLeisure 3:92dae9083c83 530 if (!can_send_timeout (T7SEC_ID, T7_flash_end, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 531 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 532 fclose(fp);
Just4pLeisure 3:92dae9083c83 533 return FALSE;
Just4pLeisure 3:92dae9083c83 534 }
Just4pLeisure 3:92dae9083c83 535 if (!can_wait_timeout(T7SEC_RX, data, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 536 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 537 fclose(fp);
Just4pLeisure 3:92dae9083c83 538 return FALSE;
Just4pLeisure 3:92dae9083c83 539 }
Just4pLeisure 3:92dae9083c83 540 T7_flash_ack[3] = data[0] & 0xBF;
Just4pLeisure 3:92dae9083c83 541 if (!can_send_timeout (T7ACK_ID, T7_flash_ack, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 542 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 543 fclose(fp);
Just4pLeisure 3:92dae9083c83 544 return FALSE;
Just4pLeisure 3:92dae9083c83 545 }
Just4pLeisure 3:92dae9083c83 546 if ( data[3] != 0x77 ) {
Just4pLeisure 3:92dae9083c83 547 printf("Cannot Update FLASH, message refused.\r\n");
Just4pLeisure 3:92dae9083c83 548 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 549 fclose(fp);
Just4pLeisure 3:92dae9083c83 550 return FALSE;
Just4pLeisure 3:92dae9083c83 551 }
Just4pLeisure 3:92dae9083c83 552 // Send "Request Data Transfer Exit" to Trionic
Just4pLeisure 3:92dae9083c83 553 if (!can_send_timeout (T7SEC_ID, T7_flash_exit, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 554 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 555 fclose(fp);
Just4pLeisure 3:92dae9083c83 556 return FALSE;
Just4pLeisure 3:92dae9083c83 557 }
Just4pLeisure 3:92dae9083c83 558 if (!can_wait_timeout(T7SEC_RX, data, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 559 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 560 fclose(fp);
Just4pLeisure 3:92dae9083c83 561 return FALSE;
Just4pLeisure 3:92dae9083c83 562 }
Just4pLeisure 3:92dae9083c83 563 T7_flash_ack[3] = data[0] & 0xBF;
Just4pLeisure 3:92dae9083c83 564 if (!can_send_timeout (T7ACK_ID, T7_flash_ack, 8, T7MESSAGETIMEOUT)) {
Just4pLeisure 3:92dae9083c83 565 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 566 fclose(fp);
Just4pLeisure 3:92dae9083c83 567 return FALSE;
Just4pLeisure 3:92dae9083c83 568 }
Just4pLeisure 3:92dae9083c83 569 if ( data[3] != 0x71 ) {
Just4pLeisure 3:92dae9083c83 570 printf("Cannot Update FLASH, message refused.\r\n");
Just4pLeisure 3:92dae9083c83 571 printf("err t7utils line: %d\r\n", __LINE__ );
Just4pLeisure 3:92dae9083c83 572 fclose(fp);
Just4pLeisure 3:92dae9083c83 573 return FALSE;
Just4pLeisure 3:92dae9083c83 574 }
Just4pLeisure 3:92dae9083c83 575 */
Just4pLeisure 3:92dae9083c83 576 timer.stop();
Just4pLeisure 3:92dae9083c83 577 printf("SUCCESS! Programming the FLASH took %#.1f seconds.\r\n",timer.read());
Just4pLeisure 3:92dae9083c83 578 fclose(fp);
Just4pLeisure 3:92dae9083c83 579 return TRUE;
Just4pLeisure 3:92dae9083c83 580 }