Sophie Dexter
/
Just4Trionic
Just4Trionic - CAN and BDM FLASH programmer for Saab cars
t7utils.cpp@3:92dae9083c83, 2011-06-07 (annotated)
- 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?
User | Revision | Line number | New 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 | } |