Just4Trionic - CAN and BDM FLASH programmer for Saab cars

Dependencies:   mbed

Committer:
Just4pLeisure
Date:
Wed Sep 11 11:55:51 2013 +0000
Revision:
4:682d96ff6d79
Child:
5:1775b4b13232
This update adds T8 CAN DUMP and FLASH capability (recovery still to do)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Just4pLeisure 4:682d96ff6d79 1 /*******************************************************************************
Just4pLeisure 4:682d96ff6d79 2
Just4pLeisure 4:682d96ff6d79 3 trionic8.cpp - CAN Bus functions for Just4Trionic by Just4pLeisure
Just4pLeisure 4:682d96ff6d79 4 (c) 2011, 2012 by Sophie Dexter
Just4pLeisure 4:682d96ff6d79 5
Just4pLeisure 4:682d96ff6d79 6 This C++ module provides functions for reading and writing the FLASH chips and
Just4pLeisure 4:682d96ff6d79 7 SRAM in Trionic8 ECUs. (Writing the adaption data back to SRAM not done yet).
Just4pLeisure 4:682d96ff6d79 8
Just4pLeisure 4:682d96ff6d79 9 Some functions need an additional 'bootloader' program to be sent to the T8 ECU
Just4pLeisure 4:682d96ff6d79 10 before they can be used. These functions are: Identifying the T5 ECU type and
Just4pLeisure 4:682d96ff6d79 11 FLASH chips, dumping the FLASH chips, erasing the FLASH chips, writing to the
Just4pLeisure 4:682d96ff6d79 12 FLASH chips and calculating the FLASH chips' checksum.
Just4pLeisure 4:682d96ff6d79 13
Just4pLeisure 4:682d96ff6d79 14 ********************************************************************************
Just4pLeisure 4:682d96ff6d79 15
Just4pLeisure 4:682d96ff6d79 16 WARNING: Use at your own risk, sadly this software comes with no guarantees.
Just4pLeisure 4:682d96ff6d79 17 This software is provided 'free' and in good faith, but the author does not
Just4pLeisure 4:682d96ff6d79 18 accept liability for any damage arising from its use.
Just4pLeisure 4:682d96ff6d79 19
Just4pLeisure 4:682d96ff6d79 20 *******************************************************************************/
Just4pLeisure 4:682d96ff6d79 21
Just4pLeisure 4:682d96ff6d79 22 #include "t8can.h"
Just4pLeisure 4:682d96ff6d79 23
Just4pLeisure 4:682d96ff6d79 24 // constants
Just4pLeisure 4:682d96ff6d79 25 #define CMD_BUF_LENGTH 32 ///< command buffer size
Just4pLeisure 4:682d96ff6d79 26
Just4pLeisure 4:682d96ff6d79 27 // static variables
Just4pLeisure 4:682d96ff6d79 28 static char cmd_buffer[CMD_BUF_LENGTH]; ///< command string buffer
Just4pLeisure 4:682d96ff6d79 29
Just4pLeisure 4:682d96ff6d79 30 //static uint32_t cmd_addr; ///< address (optional)
Just4pLeisure 4:682d96ff6d79 31 //static uint32_t cmd_value; ///< value (optional)
Just4pLeisure 4:682d96ff6d79 32 //static uint32_t cmd_result; ///< result
Just4pLeisure 4:682d96ff6d79 33
Just4pLeisure 4:682d96ff6d79 34 //static uint32_t flash_start = 0;
Just4pLeisure 4:682d96ff6d79 35
Just4pLeisure 4:682d96ff6d79 36 // private functions
Just4pLeisure 4:682d96ff6d79 37 uint8_t execute_t8_cmd();
Just4pLeisure 4:682d96ff6d79 38 void t8_can_show_help();
Just4pLeisure 4:682d96ff6d79 39 void t8_can_show_full_help();
Just4pLeisure 4:682d96ff6d79 40
Just4pLeisure 4:682d96ff6d79 41 void t8_can()
Just4pLeisure 4:682d96ff6d79 42 {
Just4pLeisure 4:682d96ff6d79 43 // Start the CAN bus system
Just4pLeisure 4:682d96ff6d79 44 // Note that at the moment this is only for T8 ECUs at 500 kbits
Just4pLeisure 4:682d96ff6d79 45 t8_can_show_help();
Just4pLeisure 4:682d96ff6d79 46
Just4pLeisure 4:682d96ff6d79 47 char data[8];
Just4pLeisure 4:682d96ff6d79 48 printf("Trying to listen to CAN P-Bus (500 kBit/s)...\r\n");
Just4pLeisure 4:682d96ff6d79 49 can_configure(2, 500000, 1);
Just4pLeisure 4:682d96ff6d79 50 if (can_wait_timeout(T8ANYMSG, data, 8, T8MESSAGETIMEOUT)) {
Just4pLeisure 4:682d96ff6d79 51 printf("Connected to Saab P-Bus\r\n");
Just4pLeisure 4:682d96ff6d79 52 printf("Switching to P-Bus active mode\r\n");
Just4pLeisure 4:682d96ff6d79 53 can_configure(2, 500000, 0);
Just4pLeisure 4:682d96ff6d79 54 } else {
Just4pLeisure 4:682d96ff6d79 55 printf("I did not receive any P-Bus messages\r\n");
Just4pLeisure 4:682d96ff6d79 56 printf("Switching to P-Bus active mode\r\n");
Just4pLeisure 4:682d96ff6d79 57 can_configure(2, 500000, 0);
Just4pLeisure 4:682d96ff6d79 58 if (can_wait_timeout(T8ANYMSG, data, 8, T8CONNECTTIMEOUT)) {
Just4pLeisure 4:682d96ff6d79 59 printf("Connected to Saab P-Bus\r\n");
Just4pLeisure 4:682d96ff6d79 60 //can_active();
Just4pLeisure 4:682d96ff6d79 61 } else {
Just4pLeisure 4:682d96ff6d79 62 printf("FAILED to connect!\r\n");
Just4pLeisure 4:682d96ff6d79 63 led4 = 1;
Just4pLeisure 4:682d96ff6d79 64 }
Just4pLeisure 4:682d96ff6d79 65 }
Just4pLeisure 4:682d96ff6d79 66
Just4pLeisure 4:682d96ff6d79 67 // main loop
Just4pLeisure 4:682d96ff6d79 68 *cmd_buffer = '\0';
Just4pLeisure 4:682d96ff6d79 69 char ret;
Just4pLeisure 4:682d96ff6d79 70 char rx_char;
Just4pLeisure 4:682d96ff6d79 71 while (true) {
Just4pLeisure 4:682d96ff6d79 72 // read chars from USB
Just4pLeisure 4:682d96ff6d79 73 // send received messages to the pc over USB connection
Just4pLeisure 4:682d96ff6d79 74 // This function displays any CAN messages that are 'missed' by the other functions
Just4pLeisure 4:682d96ff6d79 75 // Can messages might be 'missed' because they are received after a 'timeout' period
Just4pLeisure 4:682d96ff6d79 76 // or because they weren't expected, e.g. if the T5 ECU resets for some reason
Just4pLeisure 4:682d96ff6d79 77 // t7_show_can_message();
Just4pLeisure 4:682d96ff6d79 78 silent_can_message();
Just4pLeisure 4:682d96ff6d79 79 if (pc.readable()) {
Just4pLeisure 4:682d96ff6d79 80 // turn Error LED off for next command
Just4pLeisure 4:682d96ff6d79 81 led4 = 0;
Just4pLeisure 4:682d96ff6d79 82 rx_char = pc.getc();
Just4pLeisure 4:682d96ff6d79 83 switch (rx_char) {
Just4pLeisure 4:682d96ff6d79 84 // 'ESC' key to go back to mbed Just4Trionic 'home' menu
Just4pLeisure 4:682d96ff6d79 85 case '\e':
Just4pLeisure 4:682d96ff6d79 86 can_close();
Just4pLeisure 4:682d96ff6d79 87 return;
Just4pLeisure 4:682d96ff6d79 88 // end-of-command reached
Just4pLeisure 4:682d96ff6d79 89 case TERM_OK :
Just4pLeisure 4:682d96ff6d79 90 // execute command and return flag via USB
Just4pLeisure 4:682d96ff6d79 91 timer.reset();
Just4pLeisure 4:682d96ff6d79 92 timer.start();
Just4pLeisure 4:682d96ff6d79 93 ret = execute_t8_cmd();
Just4pLeisure 4:682d96ff6d79 94 pc.putc(ret);
Just4pLeisure 4:682d96ff6d79 95 printf("Completed in %.3f seconds.\r\n", timer.read());
Just4pLeisure 4:682d96ff6d79 96 // reset command buffer
Just4pLeisure 4:682d96ff6d79 97 *cmd_buffer = '\0';
Just4pLeisure 4:682d96ff6d79 98 // light up LED
Just4pLeisure 4:682d96ff6d79 99 // ret == TERM_OK ? led_on(LED_ACT) : led_on(LED_ERR);
Just4pLeisure 4:682d96ff6d79 100 ret == TERM_OK ? led3 = 1 : led4 = 1;
Just4pLeisure 4:682d96ff6d79 101 break;
Just4pLeisure 4:682d96ff6d79 102 // another command char
Just4pLeisure 4:682d96ff6d79 103 default:
Just4pLeisure 4:682d96ff6d79 104 // store in buffer if space permits
Just4pLeisure 4:682d96ff6d79 105 if (StrLen(cmd_buffer) < CMD_BUF_LENGTH - 1) {
Just4pLeisure 4:682d96ff6d79 106 StrAddc(cmd_buffer, rx_char);
Just4pLeisure 4:682d96ff6d79 107 }
Just4pLeisure 4:682d96ff6d79 108 break;
Just4pLeisure 4:682d96ff6d79 109 }
Just4pLeisure 4:682d96ff6d79 110 }
Just4pLeisure 4:682d96ff6d79 111 }
Just4pLeisure 4:682d96ff6d79 112 }
Just4pLeisure 4:682d96ff6d79 113
Just4pLeisure 4:682d96ff6d79 114 //-----------------------------------------------------------------------------
Just4pLeisure 4:682d96ff6d79 115 /**
Just4pLeisure 4:682d96ff6d79 116 Executes a command and returns result flag (does not transmit the flag
Just4pLeisure 4:682d96ff6d79 117 itself).
Just4pLeisure 4:682d96ff6d79 118
Just4pLeisure 4:682d96ff6d79 119 @return command flag (success / failure)
Just4pLeisure 4:682d96ff6d79 120 */
Just4pLeisure 4:682d96ff6d79 121 uint8_t execute_t8_cmd()
Just4pLeisure 4:682d96ff6d79 122 {
Just4pLeisure 4:682d96ff6d79 123
Just4pLeisure 4:682d96ff6d79 124 char data[8];
Just4pLeisure 4:682d96ff6d79 125 // uint8_t cmd_length = strlen(cmd_buffer);
Just4pLeisure 4:682d96ff6d79 126 // command groups
Just4pLeisure 4:682d96ff6d79 127 switch (*cmd_buffer) {
Just4pLeisure 4:682d96ff6d79 128 // CHECK_ARGLENGTH(0);
Just4pLeisure 4:682d96ff6d79 129 // Get the Symbol Table
Just4pLeisure 4:682d96ff6d79 130 case 'i' :
Just4pLeisure 4:682d96ff6d79 131 if (t8_initialise()) {
Just4pLeisure 4:682d96ff6d79 132 printf("Trionic 8 Connection OK\r\n");
Just4pLeisure 4:682d96ff6d79 133 return TERM_OK;
Just4pLeisure 4:682d96ff6d79 134 } else {
Just4pLeisure 4:682d96ff6d79 135 printf("Trionic 8 Connection Failed\r\n");
Just4pLeisure 4:682d96ff6d79 136 return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 137 }
Just4pLeisure 4:682d96ff6d79 138 // return t7_initialise()
Just4pLeisure 4:682d96ff6d79 139 // ? TERM_OK : TERM_ERR;
Just4pLeisure 4:682d96ff6d79 140 case 'a' :
Just4pLeisure 4:682d96ff6d79 141 case 'A' :
Just4pLeisure 4:682d96ff6d79 142 if (t8_authenticate(0x01)) {
Just4pLeisure 4:682d96ff6d79 143 printf("Security Key Accepted\r\n");
Just4pLeisure 4:682d96ff6d79 144 return TERM_OK;
Just4pLeisure 4:682d96ff6d79 145 } else {
Just4pLeisure 4:682d96ff6d79 146 printf("Security Key Failed\r\n");
Just4pLeisure 4:682d96ff6d79 147 return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 148 }
Just4pLeisure 4:682d96ff6d79 149 // return t7_authenticate()
Just4pLeisure 4:682d96ff6d79 150 // ? TERM_OK : TERM_ERR;
Just4pLeisure 4:682d96ff6d79 151
Just4pLeisure 4:682d96ff6d79 152 // Erase the FLASH chips
Just4pLeisure 4:682d96ff6d79 153 case 'e':
Just4pLeisure 4:682d96ff6d79 154 case 'E':
Just4pLeisure 4:682d96ff6d79 155 return t8_erase()
Just4pLeisure 4:682d96ff6d79 156 ? TERM_OK : TERM_ERR;
Just4pLeisure 4:682d96ff6d79 157 // DUMP the T8 ECU BIN file stored in the FLASH chips
Just4pLeisure 4:682d96ff6d79 158 case 'D':
Just4pLeisure 4:682d96ff6d79 159 if (!t8_authenticate(0x00)) {
Just4pLeisure 4:682d96ff6d79 160 if (!t8_initialise()) {
Just4pLeisure 4:682d96ff6d79 161 printf("Trionic 7 Connection Failed\r\n");
Just4pLeisure 4:682d96ff6d79 162 return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 163 }
Just4pLeisure 4:682d96ff6d79 164 if (!t8_authenticate(0x00)) {
Just4pLeisure 4:682d96ff6d79 165 printf("Security Key Failed\r\n");
Just4pLeisure 4:682d96ff6d79 166 return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 167 }
Just4pLeisure 4:682d96ff6d79 168 }
Just4pLeisure 4:682d96ff6d79 169 case 'd':
Just4pLeisure 4:682d96ff6d79 170 return t8_dump()
Just4pLeisure 4:682d96ff6d79 171 ? TERM_OK : TERM_ERR;
Just4pLeisure 4:682d96ff6d79 172 // Send a FLASH update file to the T8 ECU
Just4pLeisure 4:682d96ff6d79 173 case 'F':
Just4pLeisure 4:682d96ff6d79 174 if (!t8_authenticate(0x00)) {
Just4pLeisure 4:682d96ff6d79 175 if (!t8_initialise()) {
Just4pLeisure 4:682d96ff6d79 176 printf("Trionic 7 Connection Failed\r\n");
Just4pLeisure 4:682d96ff6d79 177 return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 178 }
Just4pLeisure 4:682d96ff6d79 179 if (!t8_authenticate(0x00)) {
Just4pLeisure 4:682d96ff6d79 180 printf("Security Key Failed\r\n");
Just4pLeisure 4:682d96ff6d79 181 return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 182 }
Just4pLeisure 4:682d96ff6d79 183 }
Just4pLeisure 4:682d96ff6d79 184 if (!t8_erase()) {
Just4pLeisure 4:682d96ff6d79 185 printf("Could not Erase FLASH!\r\n");
Just4pLeisure 4:682d96ff6d79 186 return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 187 }
Just4pLeisure 4:682d96ff6d79 188 case 'f':
Just4pLeisure 4:682d96ff6d79 189 return t8_flash()
Just4pLeisure 4:682d96ff6d79 190 ? TERM_OK : TERM_ERR;
Just4pLeisure 4:682d96ff6d79 191 // Try to connect to CAN I-BUS
Just4pLeisure 4:682d96ff6d79 192 case 'I' :
Just4pLeisure 4:682d96ff6d79 193 printf("Trying to open CAN I-Bus (47619 Bit/s)...\r\n");
Just4pLeisure 4:682d96ff6d79 194 can_close();
Just4pLeisure 4:682d96ff6d79 195 //can_monitor();
Just4pLeisure 4:682d96ff6d79 196 can_set_speed(47619);
Just4pLeisure 4:682d96ff6d79 197 can_open();
Just4pLeisure 4:682d96ff6d79 198 if (can_wait_timeout(T8ANYMSG, data, 8, T8CONNECTTIMEOUT)) {
Just4pLeisure 4:682d96ff6d79 199 printf("Connected to Saab I-Bus\r\n");
Just4pLeisure 4:682d96ff6d79 200 //can_active();
Just4pLeisure 4:682d96ff6d79 201 return TERM_OK;
Just4pLeisure 4:682d96ff6d79 202 } else {
Just4pLeisure 4:682d96ff6d79 203 printf("I did not receive any I-Bus messages\r\n");
Just4pLeisure 4:682d96ff6d79 204 printf("FAILED to connect!\r\n");
Just4pLeisure 4:682d96ff6d79 205 return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 206 }
Just4pLeisure 4:682d96ff6d79 207 // Try to connect to CAN P-BUS
Just4pLeisure 4:682d96ff6d79 208 case 'P' :
Just4pLeisure 4:682d96ff6d79 209 printf("Trying to open CAN P-Bus (500 kBit/s)...\r\n");
Just4pLeisure 4:682d96ff6d79 210 can_close();
Just4pLeisure 4:682d96ff6d79 211 //can_monitor();
Just4pLeisure 4:682d96ff6d79 212 can_set_speed(500000);
Just4pLeisure 4:682d96ff6d79 213 can_open();
Just4pLeisure 4:682d96ff6d79 214 if (can_wait_timeout(T8ANYMSG, data, 8, T8CONNECTTIMEOUT)) {
Just4pLeisure 4:682d96ff6d79 215 printf("Connected to Saab P-Bus\r\n");
Just4pLeisure 4:682d96ff6d79 216 //can_active();
Just4pLeisure 4:682d96ff6d79 217 return TERM_OK;
Just4pLeisure 4:682d96ff6d79 218 } else {
Just4pLeisure 4:682d96ff6d79 219 printf("I did not receive any P-Bus messages\r\n");
Just4pLeisure 4:682d96ff6d79 220 printf("FAILED to connect!\r\n");
Just4pLeisure 4:682d96ff6d79 221 return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 222 }
Just4pLeisure 4:682d96ff6d79 223 // Show the VIN code
Just4pLeisure 4:682d96ff6d79 224 case 'v':
Just4pLeisure 4:682d96ff6d79 225 return t8_show_VIN()
Just4pLeisure 4:682d96ff6d79 226 ? TERM_OK : TERM_ERR;
Just4pLeisure 4:682d96ff6d79 227 case 'V':
Just4pLeisure 4:682d96ff6d79 228 return t8_write_VIN()
Just4pLeisure 4:682d96ff6d79 229 ? TERM_OK : TERM_ERR;
Just4pLeisure 4:682d96ff6d79 230 // Print help
Just4pLeisure 4:682d96ff6d79 231 case 'h':
Just4pLeisure 4:682d96ff6d79 232 t8_can_show_help();
Just4pLeisure 4:682d96ff6d79 233 return TERM_OK;
Just4pLeisure 4:682d96ff6d79 234 case 'H':
Just4pLeisure 4:682d96ff6d79 235 t8_can_show_full_help();
Just4pLeisure 4:682d96ff6d79 236 return TERM_OK;
Just4pLeisure 4:682d96ff6d79 237 default:
Just4pLeisure 4:682d96ff6d79 238 t8_can_show_help();
Just4pLeisure 4:682d96ff6d79 239 break;
Just4pLeisure 4:682d96ff6d79 240 }
Just4pLeisure 4:682d96ff6d79 241 // unknown command
Just4pLeisure 4:682d96ff6d79 242 return TERM_ERR;
Just4pLeisure 4:682d96ff6d79 243 }
Just4pLeisure 4:682d96ff6d79 244
Just4pLeisure 4:682d96ff6d79 245 //
Just4pLeisure 4:682d96ff6d79 246 // Trionic7ShowHelp
Just4pLeisure 4:682d96ff6d79 247 //
Just4pLeisure 4:682d96ff6d79 248 // Displays a list of things that can be done with the T5 ECU.
Just4pLeisure 4:682d96ff6d79 249 //
Just4pLeisure 4:682d96ff6d79 250 // inputs: none
Just4pLeisure 4:682d96ff6d79 251 // return: none
Just4pLeisure 4:682d96ff6d79 252 //
Just4pLeisure 4:682d96ff6d79 253 void t8_can_show_help()
Just4pLeisure 4:682d96ff6d79 254 {
Just4pLeisure 4:682d96ff6d79 255 printf("Trionic 8 Command Menu\r\n");
Just4pLeisure 4:682d96ff6d79 256 printf("======================\r\n");
Just4pLeisure 4:682d96ff6d79 257 printf("D - DUMP the T8 ECU FLASH to a file 'ORIGINAL.BIN'\r\n");
Just4pLeisure 4:682d96ff6d79 258 printf("F - FLASH the update file 'MODIFIED.HEX' to the T8\r\n");
Just4pLeisure 4:682d96ff6d79 259 printf("\r\n");
Just4pLeisure 4:682d96ff6d79 260 printf("I - Try to open CAN I-Bus (47619 Bit/s)\r\n");
Just4pLeisure 4:682d96ff6d79 261 printf("P - Try to open CAN P-Bus (500 kBit/s)\r\n");
Just4pLeisure 4:682d96ff6d79 262 printf("\r\n");
Just4pLeisure 4:682d96ff6d79 263 printf("'ESC' - Return to Just4Trionic Main Menu\r\n");
Just4pLeisure 4:682d96ff6d79 264 printf("\r\n");
Just4pLeisure 4:682d96ff6d79 265 printf("h - Show this help menu\r\n");
Just4pLeisure 4:682d96ff6d79 266 printf("\r\n");
Just4pLeisure 4:682d96ff6d79 267 return;
Just4pLeisure 4:682d96ff6d79 268 }
Just4pLeisure 4:682d96ff6d79 269 //
Just4pLeisure 4:682d96ff6d79 270 // t7_can_show_full_help
Just4pLeisure 4:682d96ff6d79 271 //
Just4pLeisure 4:682d96ff6d79 272 // Displays a complete list of things that can be done with the T5 ECU.
Just4pLeisure 4:682d96ff6d79 273 //
Just4pLeisure 4:682d96ff6d79 274 // inputs: none
Just4pLeisure 4:682d96ff6d79 275 // return: none
Just4pLeisure 4:682d96ff6d79 276 //
Just4pLeisure 4:682d96ff6d79 277 void t8_can_show_full_help()
Just4pLeisure 4:682d96ff6d79 278 {
Just4pLeisure 4:682d96ff6d79 279 printf("Trionic 8 Command Menu\r\n");
Just4pLeisure 4:682d96ff6d79 280 printf("======================\r\n");
Just4pLeisure 4:682d96ff6d79 281 printf("D - DUMP the T8 ECU FLASH to a file 'ORIGINAL.BIN'\r\n");
Just4pLeisure 4:682d96ff6d79 282 printf("F - FLASH the update file 'MODIFIED.HEX' to the T8\r\n");
Just4pLeisure 4:682d96ff6d79 283 printf("\r\n");
Just4pLeisure 4:682d96ff6d79 284 printf("I - Try to open CAN I-Bus (47619 Bit/s)\r\n");
Just4pLeisure 4:682d96ff6d79 285 printf("P - Try to open CAN P-Bus (500 kBit/s)\r\n");
Just4pLeisure 4:682d96ff6d79 286 printf("\r\n");
Just4pLeisure 4:682d96ff6d79 287 printf("\r\n");
Just4pLeisure 4:682d96ff6d79 288 printf("i - Send initialisation message to T8\r\n");
Just4pLeisure 4:682d96ff6d79 289 printf("a - Send Authentication key to T8\r\n");
Just4pLeisure 4:682d96ff6d79 290 printf("d - Dump T8 Bin file 'ORIGINAL.BIN'\r\n");
Just4pLeisure 4:682d96ff6d79 291 printf("e - Erase the FLASH in the T8 ECU\r\n");
Just4pLeisure 4:682d96ff6d79 292 printf("f - FLASH the file 'MODIFIED.BIN' to the T8 ECU\r\n");
Just4pLeisure 4:682d96ff6d79 293 printf("v - Display the current VIN code stored in the T8 ECU\r\n");
Just4pLeisure 4:682d96ff6d79 294 printf("V - FLASH the file 'MODIFIED.BIN' to the T8 ECU\r\n");
Just4pLeisure 4:682d96ff6d79 295 printf("\r\n");
Just4pLeisure 4:682d96ff6d79 296 printf("'ESC' - Return to Just4Trionic Main Menu\r\n");
Just4pLeisure 4:682d96ff6d79 297 printf("\r\n");
Just4pLeisure 4:682d96ff6d79 298 printf("H - Show this help menu\r\n");
Just4pLeisure 4:682d96ff6d79 299 printf("\r\n");
Just4pLeisure 4:682d96ff6d79 300 return;
Just4pLeisure 4:682d96ff6d79 301 }
Just4pLeisure 4:682d96ff6d79 302
Just4pLeisure 4:682d96ff6d79 303