Sophie Dexter
/
Just4Trionic
Just4Trionic - CAN and BDM FLASH programmer for Saab cars
can232.cpp@3:92dae9083c83, 2011-06-07 (annotated)
- 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?
User | Revision | Line number | New 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 | } |