Just4Trionic - CAN and BDM FLASH programmer for Saab cars

Dependencies:   mbed

Revision:
3:92dae9083c83
Child:
4:682d96ff6d79
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/t7can.cpp	Tue Jun 07 12:23:28 2011 +0000
@@ -0,0 +1,213 @@
+/*******************************************************************************
+
+trionic7.cpp - CAN Bus functions for Just4Trionic by Just4pLeisure
+(c) 2011 by Sophie Dexter
+
+This C++ module provides functions for reading and writing the FLASH chips and
+SRAM in Trionic7 ECUs. (Writing the adaption data back to SRAM not done yet).
+
+Some functions need an additional 'bootloader' program to be sent to the T5 ECU
+before they can be used. These functions are: Identifying the T5 ECU type and
+FLASH chips, dumping the FLASH chips, erasing the FLASH chips, writing to the
+FLASH chips and calculating the FLASH chips' checksum.
+
+My version of the bootloader, BOOTY.S19, includes some features not in other
+bootloaders; identifying the ECU and FLASH chip types, a 'safer' way of dumping
+the FLASH chips and the ability to program AMD 29F010 type FLASH chips
+
+********************************************************************************
+
+WARNING: Use at your own risk, sadly this software comes with no guarantees.
+This software is provided 'free' and in good faith, but the author does not
+accept liability for any damage arising from its use.
+
+*******************************************************************************/
+
+#include "t7can.h"
+
+// constants
+#define CMD_BUF_LENGTH      32              ///< command buffer size
+
+// static variables
+static char cmd_buffer[CMD_BUF_LENGTH];     ///< command string buffer
+
+//static uint32_t cmd_addr;                   ///< address (optional)
+//static uint32_t cmd_value;                  ///< value    (optional)
+//static uint32_t cmd_result;                 ///< result
+
+//static uint32_t flash_start = 0;
+
+// private functions
+uint8_t execute_t7_cmd();
+void t7_can_show_help();
+void t7_can_show_full_help();
+
+void t7_can() {
+    // Start the CAN bus system
+    // Note that at the moment this is only for T5 ECUs at 615 kbits
+    can_open();
+    can_set_speed(500000);
+
+    t7_can_show_help();
+
+    if (t7_initialise())
+        printf("Trionic 7 Connection OK\r\n");
+    else
+        printf("Trionic 7 Connection Failed\r\n");
+//    t7_authenticate();
+    if (t7_authenticate())
+        printf("Security Key Accepted\r\n");
+    else
+        printf("Security Key Failed\r\n");
+
+    // main loop
+    *cmd_buffer = '\0';
+    char ret;
+    char rx_char;
+    while (true) {
+        // read chars from USB
+        // send received messages to the pc over USB connection
+        // This function displays any CAN messages that are 'missed' by the other functions
+        // Can messages might be 'missed' because they are received after a 'timeout' period
+        // or because they weren't expected, e.g. if the T5 ECU resets for some reason
+//        t7_show_can_message();
+        silent_can_message();
+        if (pc.readable()) {
+            // turn Error LED off for next command
+            led4 = 0;
+            rx_char = pc.getc();
+            switch (rx_char) {
+                    // 'ESC' key to go back to mbed Just4Trionic 'home' menu
+                case '\e':
+                    can_close();
+                    return;
+                    // end-of-command reached
+                case TERM_OK :
+                    // execute command and return flag via USB
+                    timer.reset();
+                    timer.start();
+                    ret = execute_t7_cmd();
+                    pc.putc(ret);
+                    printf("Completed in %.3f seconds.\r\n", timer.read());
+                    // reset command buffer
+                    *cmd_buffer = '\0';
+                    // light up LED
+                    //                    ret == TERM_OK ? led_on(LED_ACT) : led_on(LED_ERR);
+                    ret == TERM_OK ? led3 = 1 : led4 = 1;
+                    break;
+                    // another command char
+                default:
+                    // store in buffer if space permits
+                    if (StrLen(cmd_buffer) < CMD_BUF_LENGTH - 1) {
+                        StrAddc(cmd_buffer, rx_char);
+                    }
+                    break;
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+/**
+    Executes a command and returns result flag (does not transmit the flag
+    itself).
+
+    @return                    command flag (success / failure)
+*/
+uint8_t execute_t7_cmd() {
+
+
+//    uint8_t cmd_length = strlen(cmd_buffer);
+    // command groups
+    switch (*cmd_buffer) {
+//            CHECK_ARGLENGTH(0);
+            // Get the Symbol Table
+        case 'i' :
+        case 'I' :
+            return t7_initialise()
+                   ? TERM_OK : TERM_ERR;
+        case 'a' :
+        case 'A' :
+            return t7_authenticate()
+                   ? TERM_OK : TERM_ERR;
+
+            // Erase the FLASH chips
+        case 'e':
+        case 'E':
+            return t7_erase()
+                   ? TERM_OK : TERM_ERR;
+            // DUMP the T5 ECU BIN file stored in the FLASH chips
+        case 'd':
+        case 'D':
+            return t7_dump()
+                   ? TERM_OK : TERM_ERR;
+            // Send a FLASH update file to the T5 ECU
+        case 'f':
+        case 'F':
+            return t7_flash()
+                   ? TERM_OK : TERM_ERR;
+
+        case '3':
+
+            // Print help
+        case 'h':
+            t7_can_show_help();
+            return TERM_OK;
+        case 'H':
+            t7_can_show_full_help();
+            return TERM_OK;
+        default:
+            t7_can_show_help();
+            break;
+    }
+    // unknown command
+    return TERM_ERR;
+}
+
+//
+// Trionic7ShowHelp
+//
+// Displays a list of things that can be done with the T5 ECU.
+//
+// inputs:    none
+// return:    none
+//
+void t7_can_show_help() {
+    printf("Trionic 7 Command Menu\r\n");
+    printf("======================\r\n");
+    printf("D - Read and DUMP T7 FLASH BIN file\r\n");
+    printf("F - FLASH the update file to the T7\r\n");
+    printf("\r\n");
+    printf("'ESC' - Return to Just4Trionic Main Menu\r\n");
+    printf("\r\n");
+    printf("h  - Show this help menu\r\n");
+    printf("\r\n");
+    return;
+}
+//
+// t7_can_show_full_help
+//
+// Displays a complete list of things that can be done with the T5 ECU.
+//
+// inputs:    none
+// return:    none
+//
+void t7_can_show_full_help() {
+    printf("Trionic 7 Command Menu\r\n");
+    printf("======================\r\n");
+    printf("D - Read and DUMP T7 FLASH BIN file\r\n");
+    printf("F - FLASH the update file to the T7\r\n");
+    printf("\r\n");
+    printf("\r\n");
+    printf("i - Send initialisation message to T7\r\n");
+    printf("a - Send Authentication key to T7\r\n");
+    printf("d - Dump T7 Bin file\r\n");
+    printf("\r\n");
+    printf("'ESC' - Return to Just4Trionic Main Menu\r\n");
+    printf("\r\n");
+    printf("H  - Show this help menu\r\n");
+    printf("\r\n");
+    return;
+}
+
+