Just4Trionic - CAN and BDM FLASH programmer for Saab cars

Dependencies:   mbed

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

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Just4pLeisure 3:92dae9083c83 1 /*******************************************************************************
Just4pLeisure 3:92dae9083c83 2
Just4pLeisure 3:92dae9083c83 3 trionic7.cpp - CAN Bus functions for Just4Trionic by Just4pLeisure
Just4pLeisure 3:92dae9083c83 4 (c) 2011 by Sophie Dexter
Just4pLeisure 3:92dae9083c83 5
Just4pLeisure 3:92dae9083c83 6 This C++ module provides functions for reading and writing the FLASH chips and
Just4pLeisure 3:92dae9083c83 7 SRAM in Trionic7 ECUs. (Writing the adaption data back to SRAM not done yet).
Just4pLeisure 3:92dae9083c83 8
Just4pLeisure 3:92dae9083c83 9 Some functions need an additional 'bootloader' program to be sent to the T5 ECU
Just4pLeisure 3:92dae9083c83 10 before they can be used. These functions are: Identifying the T5 ECU type and
Just4pLeisure 3:92dae9083c83 11 FLASH chips, dumping the FLASH chips, erasing the FLASH chips, writing to the
Just4pLeisure 3:92dae9083c83 12 FLASH chips and calculating the FLASH chips' checksum.
Just4pLeisure 3:92dae9083c83 13
Just4pLeisure 3:92dae9083c83 14 My version of the bootloader, BOOTY.S19, includes some features not in other
Just4pLeisure 3:92dae9083c83 15 bootloaders; identifying the ECU and FLASH chip types, a 'safer' way of dumping
Just4pLeisure 3:92dae9083c83 16 the FLASH chips and the ability to program AMD 29F010 type FLASH chips
Just4pLeisure 3:92dae9083c83 17
Just4pLeisure 3:92dae9083c83 18 ********************************************************************************
Just4pLeisure 3:92dae9083c83 19
Just4pLeisure 3:92dae9083c83 20 WARNING: Use at your own risk, sadly this software comes with no guarantees.
Just4pLeisure 3:92dae9083c83 21 This software is provided 'free' and in good faith, but the author does not
Just4pLeisure 3:92dae9083c83 22 accept liability for any damage arising from its use.
Just4pLeisure 3:92dae9083c83 23
Just4pLeisure 3:92dae9083c83 24 *******************************************************************************/
Just4pLeisure 3:92dae9083c83 25
Just4pLeisure 3:92dae9083c83 26 #include "t7can.h"
Just4pLeisure 3:92dae9083c83 27
Just4pLeisure 3:92dae9083c83 28 // constants
Just4pLeisure 3:92dae9083c83 29 #define CMD_BUF_LENGTH 32 ///< command buffer size
Just4pLeisure 3:92dae9083c83 30
Just4pLeisure 3:92dae9083c83 31 // static variables
Just4pLeisure 3:92dae9083c83 32 static char cmd_buffer[CMD_BUF_LENGTH]; ///< command string buffer
Just4pLeisure 3:92dae9083c83 33
Just4pLeisure 3:92dae9083c83 34 //static uint32_t cmd_addr; ///< address (optional)
Just4pLeisure 3:92dae9083c83 35 //static uint32_t cmd_value; ///< value (optional)
Just4pLeisure 3:92dae9083c83 36 //static uint32_t cmd_result; ///< result
Just4pLeisure 3:92dae9083c83 37
Just4pLeisure 3:92dae9083c83 38 //static uint32_t flash_start = 0;
Just4pLeisure 3:92dae9083c83 39
Just4pLeisure 3:92dae9083c83 40 // private functions
Just4pLeisure 3:92dae9083c83 41 uint8_t execute_t7_cmd();
Just4pLeisure 3:92dae9083c83 42 void t7_can_show_help();
Just4pLeisure 3:92dae9083c83 43 void t7_can_show_full_help();
Just4pLeisure 3:92dae9083c83 44
Just4pLeisure 3:92dae9083c83 45 void t7_can() {
Just4pLeisure 3:92dae9083c83 46 // Start the CAN bus system
Just4pLeisure 3:92dae9083c83 47 // Note that at the moment this is only for T5 ECUs at 615 kbits
Just4pLeisure 3:92dae9083c83 48 can_open();
Just4pLeisure 3:92dae9083c83 49 can_set_speed(500000);
Just4pLeisure 3:92dae9083c83 50
Just4pLeisure 3:92dae9083c83 51 t7_can_show_help();
Just4pLeisure 3:92dae9083c83 52
Just4pLeisure 3:92dae9083c83 53 if (t7_initialise())
Just4pLeisure 3:92dae9083c83 54 printf("Trionic 7 Connection OK\r\n");
Just4pLeisure 3:92dae9083c83 55 else
Just4pLeisure 3:92dae9083c83 56 printf("Trionic 7 Connection Failed\r\n");
Just4pLeisure 3:92dae9083c83 57 // t7_authenticate();
Just4pLeisure 3:92dae9083c83 58 if (t7_authenticate())
Just4pLeisure 3:92dae9083c83 59 printf("Security Key Accepted\r\n");
Just4pLeisure 3:92dae9083c83 60 else
Just4pLeisure 3:92dae9083c83 61 printf("Security Key Failed\r\n");
Just4pLeisure 3:92dae9083c83 62
Just4pLeisure 3:92dae9083c83 63 // main loop
Just4pLeisure 3:92dae9083c83 64 *cmd_buffer = '\0';
Just4pLeisure 3:92dae9083c83 65 char ret;
Just4pLeisure 3:92dae9083c83 66 char rx_char;
Just4pLeisure 3:92dae9083c83 67 while (true) {
Just4pLeisure 3:92dae9083c83 68 // read chars from USB
Just4pLeisure 3:92dae9083c83 69 // send received messages to the pc over USB connection
Just4pLeisure 3:92dae9083c83 70 // This function displays any CAN messages that are 'missed' by the other functions
Just4pLeisure 3:92dae9083c83 71 // Can messages might be 'missed' because they are received after a 'timeout' period
Just4pLeisure 3:92dae9083c83 72 // or because they weren't expected, e.g. if the T5 ECU resets for some reason
Just4pLeisure 3:92dae9083c83 73 // t7_show_can_message();
Just4pLeisure 3:92dae9083c83 74 silent_can_message();
Just4pLeisure 3:92dae9083c83 75 if (pc.readable()) {
Just4pLeisure 3:92dae9083c83 76 // turn Error LED off for next command
Just4pLeisure 3:92dae9083c83 77 led4 = 0;
Just4pLeisure 3:92dae9083c83 78 rx_char = pc.getc();
Just4pLeisure 3:92dae9083c83 79 switch (rx_char) {
Just4pLeisure 3:92dae9083c83 80 // 'ESC' key to go back to mbed Just4Trionic 'home' menu
Just4pLeisure 3:92dae9083c83 81 case '\e':
Just4pLeisure 3:92dae9083c83 82 can_close();
Just4pLeisure 3:92dae9083c83 83 return;
Just4pLeisure 3:92dae9083c83 84 // end-of-command reached
Just4pLeisure 3:92dae9083c83 85 case TERM_OK :
Just4pLeisure 3:92dae9083c83 86 // execute command and return flag via USB
Just4pLeisure 3:92dae9083c83 87 timer.reset();
Just4pLeisure 3:92dae9083c83 88 timer.start();
Just4pLeisure 3:92dae9083c83 89 ret = execute_t7_cmd();
Just4pLeisure 3:92dae9083c83 90 pc.putc(ret);
Just4pLeisure 3:92dae9083c83 91 printf("Completed in %.3f seconds.\r\n", timer.read());
Just4pLeisure 3:92dae9083c83 92 // reset command buffer
Just4pLeisure 3:92dae9083c83 93 *cmd_buffer = '\0';
Just4pLeisure 3:92dae9083c83 94 // light up LED
Just4pLeisure 3:92dae9083c83 95 // ret == TERM_OK ? led_on(LED_ACT) : led_on(LED_ERR);
Just4pLeisure 3:92dae9083c83 96 ret == TERM_OK ? led3 = 1 : led4 = 1;
Just4pLeisure 3:92dae9083c83 97 break;
Just4pLeisure 3:92dae9083c83 98 // another command char
Just4pLeisure 3:92dae9083c83 99 default:
Just4pLeisure 3:92dae9083c83 100 // store in buffer if space permits
Just4pLeisure 3:92dae9083c83 101 if (StrLen(cmd_buffer) < CMD_BUF_LENGTH - 1) {
Just4pLeisure 3:92dae9083c83 102 StrAddc(cmd_buffer, rx_char);
Just4pLeisure 3:92dae9083c83 103 }
Just4pLeisure 3:92dae9083c83 104 break;
Just4pLeisure 3:92dae9083c83 105 }
Just4pLeisure 3:92dae9083c83 106 }
Just4pLeisure 3:92dae9083c83 107 }
Just4pLeisure 3:92dae9083c83 108 }
Just4pLeisure 3:92dae9083c83 109
Just4pLeisure 3:92dae9083c83 110 //-----------------------------------------------------------------------------
Just4pLeisure 3:92dae9083c83 111 /**
Just4pLeisure 3:92dae9083c83 112 Executes a command and returns result flag (does not transmit the flag
Just4pLeisure 3:92dae9083c83 113 itself).
Just4pLeisure 3:92dae9083c83 114
Just4pLeisure 3:92dae9083c83 115 @return command flag (success / failure)
Just4pLeisure 3:92dae9083c83 116 */
Just4pLeisure 3:92dae9083c83 117 uint8_t execute_t7_cmd() {
Just4pLeisure 3:92dae9083c83 118
Just4pLeisure 3:92dae9083c83 119
Just4pLeisure 3:92dae9083c83 120 // uint8_t cmd_length = strlen(cmd_buffer);
Just4pLeisure 3:92dae9083c83 121 // command groups
Just4pLeisure 3:92dae9083c83 122 switch (*cmd_buffer) {
Just4pLeisure 3:92dae9083c83 123 // CHECK_ARGLENGTH(0);
Just4pLeisure 3:92dae9083c83 124 // Get the Symbol Table
Just4pLeisure 3:92dae9083c83 125 case 'i' :
Just4pLeisure 3:92dae9083c83 126 case 'I' :
Just4pLeisure 3:92dae9083c83 127 return t7_initialise()
Just4pLeisure 3:92dae9083c83 128 ? TERM_OK : TERM_ERR;
Just4pLeisure 3:92dae9083c83 129 case 'a' :
Just4pLeisure 3:92dae9083c83 130 case 'A' :
Just4pLeisure 3:92dae9083c83 131 return t7_authenticate()
Just4pLeisure 3:92dae9083c83 132 ? TERM_OK : TERM_ERR;
Just4pLeisure 3:92dae9083c83 133
Just4pLeisure 3:92dae9083c83 134 // Erase the FLASH chips
Just4pLeisure 3:92dae9083c83 135 case 'e':
Just4pLeisure 3:92dae9083c83 136 case 'E':
Just4pLeisure 3:92dae9083c83 137 return t7_erase()
Just4pLeisure 3:92dae9083c83 138 ? TERM_OK : TERM_ERR;
Just4pLeisure 3:92dae9083c83 139 // DUMP the T5 ECU BIN file stored in the FLASH chips
Just4pLeisure 3:92dae9083c83 140 case 'd':
Just4pLeisure 3:92dae9083c83 141 case 'D':
Just4pLeisure 3:92dae9083c83 142 return t7_dump()
Just4pLeisure 3:92dae9083c83 143 ? TERM_OK : TERM_ERR;
Just4pLeisure 3:92dae9083c83 144 // Send a FLASH update file to the T5 ECU
Just4pLeisure 3:92dae9083c83 145 case 'f':
Just4pLeisure 3:92dae9083c83 146 case 'F':
Just4pLeisure 3:92dae9083c83 147 return t7_flash()
Just4pLeisure 3:92dae9083c83 148 ? TERM_OK : TERM_ERR;
Just4pLeisure 3:92dae9083c83 149
Just4pLeisure 3:92dae9083c83 150 case '3':
Just4pLeisure 3:92dae9083c83 151
Just4pLeisure 3:92dae9083c83 152 // Print help
Just4pLeisure 3:92dae9083c83 153 case 'h':
Just4pLeisure 3:92dae9083c83 154 t7_can_show_help();
Just4pLeisure 3:92dae9083c83 155 return TERM_OK;
Just4pLeisure 3:92dae9083c83 156 case 'H':
Just4pLeisure 3:92dae9083c83 157 t7_can_show_full_help();
Just4pLeisure 3:92dae9083c83 158 return TERM_OK;
Just4pLeisure 3:92dae9083c83 159 default:
Just4pLeisure 3:92dae9083c83 160 t7_can_show_help();
Just4pLeisure 3:92dae9083c83 161 break;
Just4pLeisure 3:92dae9083c83 162 }
Just4pLeisure 3:92dae9083c83 163 // unknown command
Just4pLeisure 3:92dae9083c83 164 return TERM_ERR;
Just4pLeisure 3:92dae9083c83 165 }
Just4pLeisure 3:92dae9083c83 166
Just4pLeisure 3:92dae9083c83 167 //
Just4pLeisure 3:92dae9083c83 168 // Trionic7ShowHelp
Just4pLeisure 3:92dae9083c83 169 //
Just4pLeisure 3:92dae9083c83 170 // Displays a list of things that can be done with the T5 ECU.
Just4pLeisure 3:92dae9083c83 171 //
Just4pLeisure 3:92dae9083c83 172 // inputs: none
Just4pLeisure 3:92dae9083c83 173 // return: none
Just4pLeisure 3:92dae9083c83 174 //
Just4pLeisure 3:92dae9083c83 175 void t7_can_show_help() {
Just4pLeisure 3:92dae9083c83 176 printf("Trionic 7 Command Menu\r\n");
Just4pLeisure 3:92dae9083c83 177 printf("======================\r\n");
Just4pLeisure 3:92dae9083c83 178 printf("D - Read and DUMP T7 FLASH BIN file\r\n");
Just4pLeisure 3:92dae9083c83 179 printf("F - FLASH the update file to the T7\r\n");
Just4pLeisure 3:92dae9083c83 180 printf("\r\n");
Just4pLeisure 3:92dae9083c83 181 printf("'ESC' - Return to Just4Trionic Main Menu\r\n");
Just4pLeisure 3:92dae9083c83 182 printf("\r\n");
Just4pLeisure 3:92dae9083c83 183 printf("h - Show this help menu\r\n");
Just4pLeisure 3:92dae9083c83 184 printf("\r\n");
Just4pLeisure 3:92dae9083c83 185 return;
Just4pLeisure 3:92dae9083c83 186 }
Just4pLeisure 3:92dae9083c83 187 //
Just4pLeisure 3:92dae9083c83 188 // t7_can_show_full_help
Just4pLeisure 3:92dae9083c83 189 //
Just4pLeisure 3:92dae9083c83 190 // Displays a complete list of things that can be done with the T5 ECU.
Just4pLeisure 3:92dae9083c83 191 //
Just4pLeisure 3:92dae9083c83 192 // inputs: none
Just4pLeisure 3:92dae9083c83 193 // return: none
Just4pLeisure 3:92dae9083c83 194 //
Just4pLeisure 3:92dae9083c83 195 void t7_can_show_full_help() {
Just4pLeisure 3:92dae9083c83 196 printf("Trionic 7 Command Menu\r\n");
Just4pLeisure 3:92dae9083c83 197 printf("======================\r\n");
Just4pLeisure 3:92dae9083c83 198 printf("D - Read and DUMP T7 FLASH BIN file\r\n");
Just4pLeisure 3:92dae9083c83 199 printf("F - FLASH the update file to the T7\r\n");
Just4pLeisure 3:92dae9083c83 200 printf("\r\n");
Just4pLeisure 3:92dae9083c83 201 printf("\r\n");
Just4pLeisure 3:92dae9083c83 202 printf("i - Send initialisation message to T7\r\n");
Just4pLeisure 3:92dae9083c83 203 printf("a - Send Authentication key to T7\r\n");
Just4pLeisure 3:92dae9083c83 204 printf("d - Dump T7 Bin file\r\n");
Just4pLeisure 3:92dae9083c83 205 printf("\r\n");
Just4pLeisure 3:92dae9083c83 206 printf("'ESC' - Return to Just4Trionic Main Menu\r\n");
Just4pLeisure 3:92dae9083c83 207 printf("\r\n");
Just4pLeisure 3:92dae9083c83 208 printf("H - Show this help menu\r\n");
Just4pLeisure 3:92dae9083c83 209 printf("\r\n");
Just4pLeisure 3:92dae9083c83 210 return;
Just4pLeisure 3:92dae9083c83 211 }
Just4pLeisure 3:92dae9083c83 212
Just4pLeisure 3:92dae9083c83 213