Just4Trionic - CAN and BDM FLASH programmer for Saab cars

Dependencies:   mbed

Committer:
Just4pLeisure
Date:
Tue Sep 14 21:02:04 2010 +0000
Revision:
1:d5452e398b76
Parent:
0:e0b964252a05
Child:
2:bf3a2b29259a

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Just4pLeisure 0:e0b964252a05 1 /*******************************************************************************
Just4pLeisure 0:e0b964252a05 2
Just4pLeisure 1:d5452e398b76 3 Just4Trionic by Just4pLeisure
Just4pLeisure 0:e0b964252a05 4 *****************************
Just4pLeisure 1:d5452e398b76 5 (c) 2010 by Sophie Dexter
Just4pLeisure 0:e0b964252a05 6
Just4pLeisure 0:e0b964252a05 7 Whilst I have written this program myself I could not have done it without
Just4pLeisure 0:e0b964252a05 8 a lot of help and the original ideas and programs written by:
Just4pLeisure 0:e0b964252a05 9 Dilemma - Author of the Trionic Suite software programs and general Guru
Just4pLeisure 0:e0b964252a05 10 http://trionic.mobixs.eu/ and http://www.ecuproject.com.
Just4pLeisure 0:e0b964252a05 11 General Failure - Author of the T5CANlib software and regular contributor at
Just4pLeisure 0:e0b964252a05 12 http://www.ecuproject.com.
Just4pLeisure 0:e0b964252a05 13 Tomi Liljemark - Lots of information and programs about the Saab CAN bus
Just4pLeisure 0:e0b964252a05 14 http://pikkupossu.1g.fi/tomi/projects/projects.html.
Just4pLeisure 0:e0b964252a05 15 Scott Howard - Author of the BDM software.
Just4pLeisure 1:d5452e398b76 16 Janis Silins - Valued contributor at http://www.ecuproject.com and creator of
Just4pLeisure 1:d5452e398b76 17 USBBDM. For sharing his BDM software (which also had a very useful method of
Just4pLeisure 1:d5452e398b76 18 entering commands)
Just4pLeisure 1:d5452e398b76 19 Plus inspiration and ideas from many others...
Just4pLeisure 0:e0b964252a05 20
Just4pLeisure 0:e0b964252a05 21 Sophie x
Just4pLeisure 0:e0b964252a05 22
Just4pLeisure 0:e0b964252a05 23 ********************************************************************************
Just4pLeisure 0:e0b964252a05 24
Just4pLeisure 0:e0b964252a05 25 WARNING: Use at your own risk, sadly this software comes with no guarantees.
Just4pLeisure 0:e0b964252a05 26 This software is provided 'free' and in good faith, but the author does not
Just4pLeisure 0:e0b964252a05 27 accept liability for any damage arising from its use.
Just4pLeisure 0:e0b964252a05 28
Just4pLeisure 0:e0b964252a05 29 ********************************************************************************
Just4pLeisure 0:e0b964252a05 30
Just4pLeisure 1:d5452e398b76 31 Version 1.1 (09/2010) - Still very crude way of doing things
Just4pLeisure 1:d5452e398b76 32
Just4pLeisure 1:d5452e398b76 33 Additions since Version 1:
Just4pLeisure 1:d5452e398b76 34 The BDM interface is now working
Just4pLeisure 1:d5452e398b76 35 Based on Janis Silin's BDM software with modifications and additions
Just4pLeisure 1:d5452e398b76 36 Detect which type of FLASH chip is fitted to work out type of ECU
Just4pLeisure 1:d5452e398b76 37 Modifications to FLASH algorithms - I think my algorithms are
Just4pLeisure 1:d5452e398b76 38 closer to the datasheet methods. Still to do:
Just4pLeisure 1:d5452e398b76 39 Separate pulse counters for 28Fxxx erase
Just4pLeisure 1:d5452e398b76 40 DQ7 and DQ5 checking method for 29Fxxx FLASH
Just4pLeisure 1:d5452e398b76 41 Works for T5.5 ECUs with 28F010 and 29F010 chips
Just4pLeisure 1:d5452e398b76 42 Probably works with T5.2 ECUs (chip detection method)
Just4pLeisure 1:d5452e398b76 43 MAY work with T7 ECUs ('prep' method may need changes - I can't test T7)
Just4pLeisure 1:d5452e398b76 44 NOTE: Some of Janis' original BDM commands may not work, or at least
Just4pLeisure 1:d5452e398b76 45 not as originally intended
Just4pLeisure 1:d5452e398b76 46 Lawicell CAN232 interface partially working
Just4pLeisure 1:d5452e398b76 47 Only a few Lawicell message types to open/close, set speed and write
Just4pLeisure 1:d5452e398b76 48 Trionic5 CAN functions
Just4pLeisure 1:d5452e398b76 49 All-in-one 'D' and 'F' commands to DUMP and FLASH BIN files
Just4pLeisure 1:d5452e398b76 50 Lots of checking for errors, either works or says it failed
Just4pLeisure 1:d5452e398b76 51 No need to interpret the cryptic CAN messages anymore
Just4pLeisure 1:d5452e398b76 52 Should now work for T5.2 and T5.5 ECUs
Just4pLeisure 1:d5452e398b76 53 Detects FLASH chip type and works out which ECU is connected T5.2/5.5
Just4pLeisure 1:d5452e398b76 54
Just4pLeisure 1:d5452e398b76 55 ********************************************************************************
Just4pLeisure 1:d5452e398b76 56
Just4pLeisure 1:d5452e398b76 57 Version 1 (04/2010)- The basic CAN functions are working
Just4pLeisure 0:e0b964252a05 58
Just4pLeisure 0:e0b964252a05 59 I have decided to 'release' this software somewhat prematurely because the FLASH
Just4pLeisure 0:e0b964252a05 60 chips in my spare ECU have 'died' and I don't know when I will be able to do
Just4pLeisure 0:e0b964252a05 61 carry on improving and 'polishing' it. This way others will be able to use and
Just4pLeisure 0:e0b964252a05 62 enhance it without having to wait for me.
Just4pLeisure 0:e0b964252a05 63
Just4pLeisure 0:e0b964252a05 64 For now, only option '5' Trionic ECU CAN interface is working. BDM and Lawicell
Just4pLeisure 0:e0b964252a05 65 CAN232 functions are dummies. The intention is to build a complete suite of CAN
Just4pLeisure 0:e0b964252a05 66 software for Trionic5, 7 and 8 ECU types as well as adding a BDM interface to
Just4pLeisure 0:e0b964252a05 67 make an 'all-in-one' USB programming tool.
Just4pLeisure 0:e0b964252a05 68
Just4pLeisure 0:e0b964252a05 69 To make this you will need an mbed system and the CAN circuit from this page:
Just4pLeisure 0:e0b964252a05 70 http://mbed.org/projects/cookbook/wiki/CanBusExample1
Just4pLeisure 0:e0b964252a05 71
Just4pLeisure 0:e0b964252a05 72 Some ideas for the truly creative and adventurous of you is to make a gizmo that
Just4pLeisure 0:e0b964252a05 73 doesn't even need to be connected to a laptop or PC to use, maybe even a self-
Just4pLeisure 0:e0b964252a05 74 contained vesion of Dilemma's CarPC using ideas from this pages:
Just4pLeisure 0:e0b964252a05 75
Just4pLeisure 0:e0b964252a05 76 http://mbed.org/projects/cookbook/wiki/PS2Keyboard
Just4pLeisure 0:e0b964252a05 77 http://mbed.org/projects/cookbook/wiki/PS2Mouse
Just4pLeisure 0:e0b964252a05 78 http://mbed.org/projects/cookbook/wiki/MobileLCD
Just4pLeisure 0:e0b964252a05 79 http://mbed.org/projects/cookbook/wiki/SDCard
Just4pLeisure 0:e0b964252a05 80
Just4pLeisure 0:e0b964252a05 81 *******************************************************************************/
Just4pLeisure 0:e0b964252a05 82
Just4pLeisure 0:e0b964252a05 83 #include "mbed.h"
Just4pLeisure 1:d5452e398b76 84 //
Just4pLeisure 1:d5452e398b76 85 #include "common.h"
Just4pLeisure 1:d5452e398b76 86 #include "bdm.h"
Just4pLeisure 1:d5452e398b76 87 #include "can232.h"
Just4pLeisure 1:d5452e398b76 88 #include "t5can.h"
Just4pLeisure 0:e0b964252a05 89
Just4pLeisure 1:d5452e398b76 90 // constants
Just4pLeisure 1:d5452e398b76 91 #define CMD_BUF_LENGTH 32 ///< command buffer size
Just4pLeisure 0:e0b964252a05 92
Just4pLeisure 1:d5452e398b76 93 // static variables
Just4pLeisure 1:d5452e398b76 94 static char cmd_buffer[CMD_BUF_LENGTH]; ///< command string buffer
Just4pLeisure 0:e0b964252a05 95
Just4pLeisure 1:d5452e398b76 96 // private functions
Just4pLeisure 1:d5452e398b76 97 uint8_t execute_just4trionic_cmd();
Just4pLeisure 1:d5452e398b76 98 void show_just4trionic_help();
Just4pLeisure 0:e0b964252a05 99
Just4pLeisure 0:e0b964252a05 100 int main() {
Just4pLeisure 0:e0b964252a05 101 // fast serial speed
Just4pLeisure 0:e0b964252a05 102 // pc.baud(921600);
Just4pLeisure 0:e0b964252a05 103 pc.baud(115200);
Just4pLeisure 1:d5452e398b76 104
Just4pLeisure 1:d5452e398b76 105 // the address of the function to be attached (leds_off) and the interval (0.1 seconds)
Just4pLeisure 1:d5452e398b76 106 // This 'ticker' turns off the activity LEDs so that they don't stay on if something has gone wrong
Just4pLeisure 1:d5452e398b76 107 ticker.attach(&leds_off, 0.1);
Just4pLeisure 1:d5452e398b76 108
Just4pLeisure 1:d5452e398b76 109 // clear incoming buffer
Just4pLeisure 1:d5452e398b76 110 // sometimes TeraTerm gets 'confused'. johnc does this in his code
Just4pLeisure 1:d5452e398b76 111 // hopefully this will fix the problem
Just4pLeisure 1:d5452e398b76 112 // unfortunately it doesn't, but it seems like a good idea
Just4pLeisure 1:d5452e398b76 113 char rx_char;
Just4pLeisure 1:d5452e398b76 114 while (pc.readable())
Just4pLeisure 1:d5452e398b76 115 rx_char = pc.getc();
Just4pLeisure 1:d5452e398b76 116
Just4pLeisure 1:d5452e398b76 117 show_just4trionic_help();
Just4pLeisure 1:d5452e398b76 118
Just4pLeisure 1:d5452e398b76 119 // main loop
Just4pLeisure 1:d5452e398b76 120 *cmd_buffer = '\0';
Just4pLeisure 1:d5452e398b76 121 char ret;
Just4pLeisure 1:d5452e398b76 122 while (true) {
Just4pLeisure 1:d5452e398b76 123 // read chars from USB
Just4pLeisure 1:d5452e398b76 124 // send received messages to the pc over USB connection
Just4pLeisure 1:d5452e398b76 125 // This function displays any CAN messages that are 'missed' by the other functions
Just4pLeisure 1:d5452e398b76 126 // Can messages might be 'missed' because they are received after a 'timeout' period
Just4pLeisure 1:d5452e398b76 127 // or because they weren't expected, e.g. if the T5 ECU resets for some reason
Just4pLeisure 1:d5452e398b76 128 t5_can_show_can_message();
Just4pLeisure 1:d5452e398b76 129 if (pc.readable()) {
Just4pLeisure 1:d5452e398b76 130 // turn Error LED off for next command
Just4pLeisure 1:d5452e398b76 131 led4 = 0;
Just4pLeisure 1:d5452e398b76 132 rx_char = pc.getc();
Just4pLeisure 1:d5452e398b76 133 switch (rx_char) {
Just4pLeisure 1:d5452e398b76 134 // end-of-command reached
Just4pLeisure 1:d5452e398b76 135 case TERM_OK :
Just4pLeisure 1:d5452e398b76 136 // execute command and return flag via USB
Just4pLeisure 1:d5452e398b76 137 timer.reset();
Just4pLeisure 1:d5452e398b76 138 timer.start();
Just4pLeisure 1:d5452e398b76 139 ret = execute_just4trionic_cmd();
Just4pLeisure 1:d5452e398b76 140 show_just4trionic_help();
Just4pLeisure 1:d5452e398b76 141 pc.putc(ret);
Just4pLeisure 1:d5452e398b76 142 // reset command buffer
Just4pLeisure 1:d5452e398b76 143 *cmd_buffer = '\0';
Just4pLeisure 1:d5452e398b76 144 // light up LED
Just4pLeisure 1:d5452e398b76 145 // ret == TERM_OK ? led_on(LED_ACT) : led_on(LED_ERR);
Just4pLeisure 1:d5452e398b76 146 ret == TERM_OK ? led3 = 1 : led4 = 1;
Just4pLeisure 1:d5452e398b76 147 break;
Just4pLeisure 1:d5452e398b76 148 // another command char
Just4pLeisure 1:d5452e398b76 149 default:
Just4pLeisure 1:d5452e398b76 150 // store in buffer if space permits
Just4pLeisure 1:d5452e398b76 151 if (StrLen(cmd_buffer) < CMD_BUF_LENGTH - 1) {
Just4pLeisure 1:d5452e398b76 152 StrAddc(cmd_buffer, rx_char);
Just4pLeisure 1:d5452e398b76 153 }
Just4pLeisure 1:d5452e398b76 154 break;
Just4pLeisure 1:d5452e398b76 155 }
Just4pLeisure 1:d5452e398b76 156 }
Just4pLeisure 0:e0b964252a05 157 }
Just4pLeisure 0:e0b964252a05 158 }
Just4pLeisure 0:e0b964252a05 159
Just4pLeisure 1:d5452e398b76 160 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 161 /**
Just4pLeisure 1:d5452e398b76 162 Executes a command and returns result flag (does not transmit the flag
Just4pLeisure 1:d5452e398b76 163 itself).
Just4pLeisure 1:d5452e398b76 164
Just4pLeisure 1:d5452e398b76 165 @return command flag (success / failure)
Just4pLeisure 1:d5452e398b76 166 */
Just4pLeisure 1:d5452e398b76 167 uint8_t execute_just4trionic_cmd() {
Just4pLeisure 1:d5452e398b76 168
Just4pLeisure 1:d5452e398b76 169
Just4pLeisure 1:d5452e398b76 170 // uint8_t cmd_length = strlen(cmd_buffer);
Just4pLeisure 1:d5452e398b76 171 // command groups
Just4pLeisure 1:d5452e398b76 172 switch (*cmd_buffer) {
Just4pLeisure 1:d5452e398b76 173 // CHECK_ARGLENGTH(0);
Just4pLeisure 1:d5452e398b76 174 case 'b':
Just4pLeisure 1:d5452e398b76 175 case 'B':
Just4pLeisure 1:d5452e398b76 176 bdm();
Just4pLeisure 1:d5452e398b76 177 return TERM_OK;
Just4pLeisure 1:d5452e398b76 178 case 'o':
Just4pLeisure 1:d5452e398b76 179 case 'O':
Just4pLeisure 1:d5452e398b76 180 can232();
Just4pLeisure 1:d5452e398b76 181 return TERM_OK;
Just4pLeisure 1:d5452e398b76 182 case '5':
Just4pLeisure 1:d5452e398b76 183 t5_can();
Just4pLeisure 1:d5452e398b76 184 return TERM_OK;
Just4pLeisure 1:d5452e398b76 185 case 'h':
Just4pLeisure 1:d5452e398b76 186 case 'H':
Just4pLeisure 1:d5452e398b76 187 return TERM_OK;
Just4pLeisure 1:d5452e398b76 188 default:
Just4pLeisure 1:d5452e398b76 189 break;
Just4pLeisure 1:d5452e398b76 190 }
Just4pLeisure 1:d5452e398b76 191
Just4pLeisure 1:d5452e398b76 192 // unknown command
Just4pLeisure 1:d5452e398b76 193 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 194 }
Just4pLeisure 1:d5452e398b76 195
Just4pLeisure 1:d5452e398b76 196 void show_just4trionic_help() {
Just4pLeisure 0:e0b964252a05 197 printf("Just4Trionic Command Menu\r\n");
Just4pLeisure 0:e0b964252a05 198 printf("=========================\r\n");
Just4pLeisure 1:d5452e398b76 199 printf("b/B - Start BDM interface\r\n");
Just4pLeisure 1:d5452e398b76 200 printf("o/O - Open Lawicel CAN232 type interface\r\n");
Just4pLeisure 0:e0b964252a05 201 printf("5 - Start Trionic5 ECU CAN interface\r\n");
Just4pLeisure 0:e0b964252a05 202 printf("\r\n");
Just4pLeisure 0:e0b964252a05 203 printf("h/H - show this help menu\r\n");
Just4pLeisure 1:d5452e398b76 204 printf("\r\n");
Just4pLeisure 0:e0b964252a05 205 return;
Just4pLeisure 1:d5452e398b76 206 }