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
Parent:
1:d5452e398b76
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 1:d5452e398b76 1 /*******************************************************************************
Just4pLeisure 1:d5452e398b76 2
Just4pLeisure 1:d5452e398b76 3 can232.cpp
Just4pLeisure 1:d5452e398b76 4 (c) 2010 by Sophie Dexter
Just4pLeisure 1:d5452e398b76 5 portions (c) 2009, 2010 by Janis Silins (johnc)
Just4pLeisure 1:d5452e398b76 6
Just4pLeisure 1:d5452e398b76 7 Lawicel CAN232 type functions for Just4Trionic by Just4pLeisure
Just4pLeisure 1:d5452e398b76 8
Just4pLeisure 1:d5452e398b76 9 ********************************************************************************
Just4pLeisure 1:d5452e398b76 10
Just4pLeisure 1:d5452e398b76 11 WARNING: Use at your own risk, sadly this software comes with no guarantees.
Just4pLeisure 1:d5452e398b76 12 This software is provided 'free' and in good faith, but the author does not
Just4pLeisure 1:d5452e398b76 13 accept liability for any damage arising from its use.
Just4pLeisure 1:d5452e398b76 14
Just4pLeisure 1:d5452e398b76 15 *******************************************************************************/
Just4pLeisure 1:d5452e398b76 16
Just4pLeisure 1:d5452e398b76 17 #include "can232.h"
Just4pLeisure 1:d5452e398b76 18
Just4pLeisure 1:d5452e398b76 19 // constants
Just4pLeisure 1:d5452e398b76 20 #define CMD_BUF_LENGTH 32 ///< command buffer size
Just4pLeisure 1:d5452e398b76 21
Just4pLeisure 1:d5452e398b76 22 // command characters
Just4pLeisure 1:d5452e398b76 23
Just4pLeisure 1:d5452e398b76 24 #define CMD_CLOSE 'C' ///< Close the CAN device
Just4pLeisure 1:d5452e398b76 25 #define CMD_OPEN 'O' ///< Open the CAN device (do this before an S/s command)
Just4pLeisure 1:d5452e398b76 26
Just4pLeisure 1:d5452e398b76 27 #define CMD_PRESET_SPEED 'S' ///< Sn: set preconfigured speeds
Just4pLeisure 1:d5452e398b76 28 #define CMD_SPEED_0 '0' ///< 10 kbits
Just4pLeisure 1:d5452e398b76 29 #define CMD_SPEED_1 '1' ///< 20 kbits
Just4pLeisure 1:d5452e398b76 30 #define CMD_SPEED_2 '2' ///< 50 kbits
Just4pLeisure 1:d5452e398b76 31 #define CMD_SPEED_3 '3' ///< 100 kbits
Just4pLeisure 1:d5452e398b76 32 #define CMD_SPEED_4 '4' ///< 125 kbits
Just4pLeisure 1:d5452e398b76 33 #define CMD_SPEED_5 '5' ///< 250 kbits
Just4pLeisure 1:d5452e398b76 34 #define CMD_SPEED_6 '6' ///< 500 kbits
Just4pLeisure 1:d5452e398b76 35 #define CMD_SPEED_7 '7' ///< 800 kbits
Just4pLeisure 1:d5452e398b76 36 #define CMD_SPEED_8 '8' ///< 1 mbits
Just4pLeisure 1:d5452e398b76 37 #define CMD_DIRECT_SPEED 's' ///< sxxyy: set the CAN bus speed registers directly
Just4pLeisure 1:d5452e398b76 38 ///< xx: BTR0 register setting
Just4pLeisure 1:d5452e398b76 39 ///< yy: BTR1 register setting
Just4pLeisure 1:d5452e398b76 40
Just4pLeisure 1:d5452e398b76 41 #define CMD_SEND_11BIT 't' ///< tiiildd..: send 11 bit id CAN frame
Just4pLeisure 1:d5452e398b76 42 ///< iii: identfier 0x0..0x7ff
Just4pLeisure 1:d5452e398b76 43 ///< l: Number of data bytes in CAN frame 0..8
Just4pLeisure 1:d5452e398b76 44 ///< dd..: data byte values 0x0..0xff (l pairs)
Just4pLeisure 1:d5452e398b76 45 #define CMD_SEND_29BIT 'T' ///< Tiiiiiiiildd..: send 29 bit id CAN frame
Just4pLeisure 1:d5452e398b76 46 ///< iiiiiiii: identifier 0x0..0x1fffffff
Just4pLeisure 1:d5452e398b76 47 ///< l: Number of data bytes in CAN frame 0..8
Just4pLeisure 1:d5452e398b76 48 ///< dd..: data byte values 0x0..0xff (l pairs)
Just4pLeisure 1:d5452e398b76 49
Just4pLeisure 1:d5452e398b76 50
Just4pLeisure 1:d5452e398b76 51 #define CMD_READ_FLAGS 'F' ///< Read flags !?!
Just4pLeisure 1:d5452e398b76 52
Just4pLeisure 1:d5452e398b76 53 #define CMD_ACCEPT_CODE 'M' ///< Mxxxxxxxx: Acceptance code e.g. 0x00000000 } accept
Just4pLeisure 1:d5452e398b76 54 #define CMD_ACCEPT_MASK 'm' ///< mxxxxxxxx: Acceptance mask e.g. 0xffffffff } all
Just4pLeisure 1:d5452e398b76 55
Just4pLeisure 1:d5452e398b76 56 #define CMD_VERSION 'V' ///< Replies with Firmware and hardware version numbers; 2 bytes each
Just4pLeisure 1:d5452e398b76 57 #define CMD_SERIAL_NUMBER 'N' ///< Replies with serial number; 4 bytes
Just4pLeisure 1:d5452e398b76 58
Just4pLeisure 1:d5452e398b76 59 #define CMD_TIMESTAMP 'Z' ///< Zn: n=0 means timestamp off, n=1 means timestamp is on
Just4pLeisure 1:d5452e398b76 60 ///< Replies a value in milliseconds with two bytes 0x0..0xfa5f
Just4pLeisure 1:d5452e398b76 61 ///< equivalent to 0..60 seconds
Just4pLeisure 1:d5452e398b76 62
Just4pLeisure 1:d5452e398b76 63
Just4pLeisure 1:d5452e398b76 64
Just4pLeisure 1:d5452e398b76 65 // static variables
Just4pLeisure 1:d5452e398b76 66 static char cmd_buffer[CMD_BUF_LENGTH]; ///< command string buffer
Just4pLeisure 1:d5452e398b76 67 static uint32_t can_id; ///< can message id
Just4pLeisure 1:d5452e398b76 68 static uint32_t can_len; ///< can message length
Just4pLeisure 1:d5452e398b76 69 static uint8_t can_msg[8]; ///< can message frame - up to 8 bytes
Just4pLeisure 1:d5452e398b76 70
Just4pLeisure 1:d5452e398b76 71 // private functions
Just4pLeisure 1:d5452e398b76 72 uint8_t execute_can_cmd();
Just4pLeisure 1:d5452e398b76 73
Just4pLeisure 1:d5452e398b76 74 // command argument macros
Just4pLeisure 1:d5452e398b76 75 #define CHECK_ARGLENGTH(len) \
Just4pLeisure 1:d5452e398b76 76 if (cmd_length != len + 2) \
Just4pLeisure 1:d5452e398b76 77 return TERM_ERR
Just4pLeisure 1:d5452e398b76 78
Just4pLeisure 1:d5452e398b76 79 #define GET_NUMBER(target, offset, len) \
Just4pLeisure 1:d5452e398b76 80 if (!ascii2int(target, cmd_buffer + 2 + offset, len)) \
Just4pLeisure 1:d5452e398b76 81 return TERM_ERR
Just4pLeisure 1:d5452e398b76 82
Just4pLeisure 1:d5452e398b76 83
Just4pLeisure 1:d5452e398b76 84
Just4pLeisure 1:d5452e398b76 85 void can232() {
Just4pLeisure 1:d5452e398b76 86
Just4pLeisure 1:d5452e398b76 87 // main loop
Just4pLeisure 1:d5452e398b76 88 *cmd_buffer = '\0';
Just4pLeisure 1:d5452e398b76 89 char ret;
Just4pLeisure 1:d5452e398b76 90 char rx_char;
Just4pLeisure 1:d5452e398b76 91 can_open();
Just4pLeisure 1:d5452e398b76 92 can.attach(&show_can_message);
Just4pLeisure 1:d5452e398b76 93 // bool (*reset_func)();
Just4pLeisure 1:d5452e398b76 94 while (true) {
Just4pLeisure 1:d5452e398b76 95 // read chars from USB
Just4pLeisure 1:d5452e398b76 96 // Trionic5ShowCANMessage();
Just4pLeisure 1:d5452e398b76 97 if (pc.readable()) {
Just4pLeisure 1:d5452e398b76 98 rx_char = pc.getc();
Just4pLeisure 1:d5452e398b76 99 switch (rx_char) {
Just4pLeisure 1:d5452e398b76 100 // 'ESC' key to go back to mbed Just4Trionic 'home' menu
Just4pLeisure 1:d5452e398b76 101 case '\e':
Just4pLeisure 1:d5452e398b76 102 can_close();
Just4pLeisure 1:d5452e398b76 103 can.attach(NULL);
Just4pLeisure 1:d5452e398b76 104 return;
Just4pLeisure 1:d5452e398b76 105 // end-of-command reached
Just4pLeisure 1:d5452e398b76 106 case TERM_OK :
Just4pLeisure 1:d5452e398b76 107 // execute command and return flag via USB
Just4pLeisure 1:d5452e398b76 108 ret = execute_can_cmd();
Just4pLeisure 1:d5452e398b76 109 pc.putc(ret);
Just4pLeisure 1:d5452e398b76 110 // reset command buffer
Just4pLeisure 1:d5452e398b76 111 *cmd_buffer = '\0';
Just4pLeisure 1:d5452e398b76 112 // light up LED
Just4pLeisure 1:d5452e398b76 113 // ret == TERM_OK ? led_on(LED_ACT) : led_on(LED_ERR);
Just4pLeisure 1:d5452e398b76 114 ret == TERM_OK ? led3 = 1 : led4 = 1;
Just4pLeisure 1:d5452e398b76 115 break;
Just4pLeisure 1:d5452e398b76 116 // another command char
Just4pLeisure 1:d5452e398b76 117 default:
Just4pLeisure 1:d5452e398b76 118 // store in buffer if space permits
Just4pLeisure 1:d5452e398b76 119 if (StrLen(cmd_buffer) < CMD_BUF_LENGTH - 1) {
Just4pLeisure 1:d5452e398b76 120 StrAddc(cmd_buffer, rx_char);
Just4pLeisure 1:d5452e398b76 121 }
Just4pLeisure 1:d5452e398b76 122 break;
Just4pLeisure 1:d5452e398b76 123 }
Just4pLeisure 1:d5452e398b76 124 }
Just4pLeisure 1:d5452e398b76 125 }
Just4pLeisure 1:d5452e398b76 126 }
Just4pLeisure 1:d5452e398b76 127
Just4pLeisure 1:d5452e398b76 128 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 129 /**
Just4pLeisure 1:d5452e398b76 130 Executes a command and returns result flag (does not transmit the flag
Just4pLeisure 1:d5452e398b76 131 itself).
Just4pLeisure 1:d5452e398b76 132
Just4pLeisure 1:d5452e398b76 133 @return command flag (success / failure)
Just4pLeisure 1:d5452e398b76 134 */
Just4pLeisure 1:d5452e398b76 135
Just4pLeisure 1:d5452e398b76 136 uint8_t execute_can_cmd() {
Just4pLeisure 1:d5452e398b76 137 uint8_t cmd_length = strlen(cmd_buffer);
Just4pLeisure 1:d5452e398b76 138 char cmd = *(cmd_buffer + 1);
Just4pLeisure 1:d5452e398b76 139
Just4pLeisure 1:d5452e398b76 140 // command groups
Just4pLeisure 1:d5452e398b76 141 switch (*cmd_buffer) {
Just4pLeisure 1:d5452e398b76 142 // adapter commands
Just4pLeisure 1:d5452e398b76 143 case CMD_SEND_11BIT:
Just4pLeisure 1:d5452e398b76 144 if (cmd_length < 7) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 145 GET_NUMBER(&can_id, -1, 3);
Just4pLeisure 1:d5452e398b76 146 GET_NUMBER(&can_len, 2, 1);
Just4pLeisure 1:d5452e398b76 147 if (cmd_length < (4 + (can_len * 2))) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 148 for (uint8_t i = 0; i < (uint8_t)can_len; i++) {
Just4pLeisure 1:d5452e398b76 149 uint32_t result;
Just4pLeisure 1:d5452e398b76 150 GET_NUMBER(&result, (3 + (i * 2)), 2);
Just4pLeisure 1:d5452e398b76 151 can_msg[i] = (uint8_t)result;
Just4pLeisure 1:d5452e398b76 152 }
Just4pLeisure 1:d5452e398b76 153 return (can_send_timeout (can_id, (char*)can_msg, (uint8_t)can_len, 500)) ? TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 154
Just4pLeisure 1:d5452e398b76 155 case CMD_SEND_29BIT:
Just4pLeisure 1:d5452e398b76 156 break;
Just4pLeisure 1:d5452e398b76 157
Just4pLeisure 1:d5452e398b76 158 case CMD_CLOSE:
Just4pLeisure 1:d5452e398b76 159 can_close();
Just4pLeisure 1:d5452e398b76 160 return TERM_OK;
Just4pLeisure 1:d5452e398b76 161 case CMD_OPEN:
Just4pLeisure 1:d5452e398b76 162 can_open();
Just4pLeisure 1:d5452e398b76 163 return TERM_OK;
Just4pLeisure 1:d5452e398b76 164
Just4pLeisure 1:d5452e398b76 165 case CMD_PRESET_SPEED:
Just4pLeisure 1:d5452e398b76 166 CHECK_ARGLENGTH(0);
Just4pLeisure 1:d5452e398b76 167 switch (cmd) {
Just4pLeisure 1:d5452e398b76 168 // get firmware version
Just4pLeisure 1:d5452e398b76 169 case CMD_SPEED_0:
Just4pLeisure 1:d5452e398b76 170 return (can.frequency(10000)) ? TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 171 case CMD_SPEED_1:
Just4pLeisure 1:d5452e398b76 172 return (can.frequency(20000)) ? TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 173 case CMD_SPEED_2:
Just4pLeisure 1:d5452e398b76 174 return (can.frequency(50000)) ? TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 175 case CMD_SPEED_3:
Just4pLeisure 1:d5452e398b76 176 return (can.frequency(100000)) ? TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 177 case CMD_SPEED_4:
Just4pLeisure 1:d5452e398b76 178 return (can.frequency(125000)) ? TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 179 case CMD_SPEED_5:
Just4pLeisure 1:d5452e398b76 180 return (can.frequency(250000)) ? TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 181 case CMD_SPEED_6:
Just4pLeisure 1:d5452e398b76 182 return (can.frequency(500000)) ? TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 183 case CMD_SPEED_7:
Just4pLeisure 1:d5452e398b76 184 return (can.frequency(800000)) ? TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 185 case CMD_SPEED_8:
Just4pLeisure 1:d5452e398b76 186 return (can.frequency(1000000)) ? TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 187 }
Just4pLeisure 1:d5452e398b76 188 break;
Just4pLeisure 1:d5452e398b76 189
Just4pLeisure 1:d5452e398b76 190 case CMD_DIRECT_SPEED:
Just4pLeisure 1:d5452e398b76 191 CHECK_ARGLENGTH(0);
Just4pLeisure 1:d5452e398b76 192 switch (cmd) {
Just4pLeisure 1:d5452e398b76 193 case CMD_SPEED_0:
Just4pLeisure 1:d5452e398b76 194 return (can.frequency(47619)) ? TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 195 case CMD_SPEED_1:
Just4pLeisure 1:d5452e398b76 196 return (can.frequency(500000)) ? TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 197 case CMD_SPEED_2:
Just4pLeisure 1:d5452e398b76 198 return (can.frequency(615000)) ? TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 199 }
Just4pLeisure 1:d5452e398b76 200 break;
Just4pLeisure 1:d5452e398b76 201 }
Just4pLeisure 1:d5452e398b76 202
Just4pLeisure 1:d5452e398b76 203 // unknown command
Just4pLeisure 1:d5452e398b76 204 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 205 }