Sophie Dexter
/
Just4Trionic
Just4Trionic - CAN and BDM FLASH programmer for Saab cars
t7utils.cpp@6:2fbcbebed28c, 2016-04-23 (annotated)
- 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?
User | Revision | Line number | New 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 | } |