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:
2:bf3a2b29259a
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 bdm.cpp
Just4pLeisure 1:d5452e398b76 4 (c) 2010 by Sophie Dexter
Just4pLeisure 1:d5452e398b76 5
Just4pLeisure 1:d5452e398b76 6 BDM functions for Just4Trionic by Just4pLeisure
Just4pLeisure 1:d5452e398b76 7
Just4pLeisure 1:d5452e398b76 8 A derivative work based on:
Just4pLeisure 1:d5452e398b76 9 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 10 // Firmware for USB BDM v2.0
Just4pLeisure 1:d5452e398b76 11 // (C) johnc, 2009
Just4pLeisure 1:d5452e398b76 12 // $id$
Just4pLeisure 1:d5452e398b76 13 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 14
Just4pLeisure 1:d5452e398b76 15 ********************************************************************************
Just4pLeisure 1:d5452e398b76 16
Just4pLeisure 1:d5452e398b76 17 WARNING: Use at your own risk, sadly this software comes with no guarantees.
Just4pLeisure 1:d5452e398b76 18 This software is provided 'free' and in good faith, but the author does not
Just4pLeisure 1:d5452e398b76 19 accept liability for any damage arising from its use.
Just4pLeisure 1:d5452e398b76 20
Just4pLeisure 1:d5452e398b76 21 *******************************************************************************/
Just4pLeisure 1:d5452e398b76 22
Just4pLeisure 1:d5452e398b76 23 #include "bdm.h"
Just4pLeisure 1:d5452e398b76 24
Just4pLeisure 1:d5452e398b76 25 // constants
Just4pLeisure 1:d5452e398b76 26 #define CMD_BUF_LENGTH 32 ///< command buffer size
Just4pLeisure 1:d5452e398b76 27
Just4pLeisure 1:d5452e398b76 28 // LED constants and macros
Just4pLeisure 1:d5452e398b76 29 #define LED_ONTIME 5 ///< LED 'on' time, ms
Just4pLeisure 1:d5452e398b76 30 #define LED_TCNT (255 - (unsigned char)((unsigned long)(LED_ONTIME * 1000L) \
Just4pLeisure 1:d5452e398b76 31 / (1000000L / (float)((unsigned long)XTAL_CPU / 1024L))))
Just4pLeisure 1:d5452e398b76 32
Just4pLeisure 1:d5452e398b76 33 // command characters
Just4pLeisure 1:d5452e398b76 34 #define CMDGROUP_ADAPTER 'a' ///< adapter commands
Just4pLeisure 1:d5452e398b76 35 #define CMD_VERSION 'v' ///< firmware version
Just4pLeisure 1:d5452e398b76 36 #define CMD_PINSTATUS 's' ///< momentary status of BDM pins
Just4pLeisure 1:d5452e398b76 37 #define CMD_BKPTLOW '1' ///< pull BKPT low
Just4pLeisure 1:d5452e398b76 38 #define CMD_BKPTHIGH '2' ///< pull BKPT high
Just4pLeisure 1:d5452e398b76 39 #define CMD_RESETLOW '3' ///< pull RESET low
Just4pLeisure 1:d5452e398b76 40 #define CMD_RESETHIGH '4' ///< pull RESET high
Just4pLeisure 1:d5452e398b76 41
Just4pLeisure 1:d5452e398b76 42 #define CMDGROUP_MCU 'c' ///< target MCU management commands
Just4pLeisure 1:d5452e398b76 43 #define CMD_STOPCHIP 'S' ///< stop
Just4pLeisure 1:d5452e398b76 44 #define CMD_RESETCHIP 'R' ///< reset
Just4pLeisure 1:d5452e398b76 45 #define CMD_RUNCHIP 'r' ///< run from given address
Just4pLeisure 1:d5452e398b76 46 #define CMD_RESTART 's' ///< restart
Just4pLeisure 1:d5452e398b76 47 #define CMD_STEP 'b' ///< step
Just4pLeisure 1:d5452e398b76 48
Just4pLeisure 1:d5452e398b76 49 #define CMDGROUP_FLASH 'f'
Just4pLeisure 1:d5452e398b76 50 #define CMD_GETVERIFY 'v' ///< gets verification status
Just4pLeisure 1:d5452e398b76 51 #define CMD_SETVERIFY 'V' ///< sets verification on/off
Just4pLeisure 1:d5452e398b76 52 #define CMD_DUMP 'd' ///< dumps memory contents
Just4pLeisure 1:d5452e398b76 53 #define CMD_ERASE 'E' ///< erase entire flash memory
Just4pLeisure 1:d5452e398b76 54 #define CMD_WRITE 'w' ///< writes to flash memory
Just4pLeisure 1:d5452e398b76 55
Just4pLeisure 1:d5452e398b76 56 #define CMDGROUP_MEMORY 'm' ///< target MCU memory commands
Just4pLeisure 1:d5452e398b76 57 #define CMD_READBYTE 'b' ///< read byte from memory
Just4pLeisure 1:d5452e398b76 58 #define CMD_READWORD 'w' ///< read word (2 bytes) from memory
Just4pLeisure 1:d5452e398b76 59 #define CMD_READLONG 'l' ///< read long word (4 bytes) from memory
Just4pLeisure 1:d5452e398b76 60 #define CMD_DUMPBYTE 'z' ///< dump byte from memory
Just4pLeisure 1:d5452e398b76 61 #define CMD_DUMPWORD 'x' ///< dump word from memory
Just4pLeisure 1:d5452e398b76 62 #define CMD_DUMPLONG 'c' ///< dump long word from memory
Just4pLeisure 1:d5452e398b76 63 #define CMD_WRITEBYTE 'B' ///< write byte to memory
Just4pLeisure 1:d5452e398b76 64 #define CMD_WRITEWORD 'W' ///< write word to memory
Just4pLeisure 1:d5452e398b76 65 #define CMD_WRITELONG 'L' ///< write long word to memory
Just4pLeisure 1:d5452e398b76 66 #define CMD_FILLBYTE 'f' ///< fill byte in memory
Just4pLeisure 1:d5452e398b76 67 #define CMD_FILLWORD 'F' ///< fill word in memory
Just4pLeisure 1:d5452e398b76 68 #define CMD_FILLLONG 'M' ///< fill long word in memory
Just4pLeisure 1:d5452e398b76 69
Just4pLeisure 1:d5452e398b76 70 #define CMDGROUP_REGISTER 'r' ///< register commands
Just4pLeisure 1:d5452e398b76 71 #define CMD_READSYSREG 'r' ///< read system register
Just4pLeisure 1:d5452e398b76 72 #define CMD_WRITESYSREG 'W' ///< write system register
Just4pLeisure 1:d5452e398b76 73 #define CMD_READADREG 'a' ///< read A/D register
Just4pLeisure 1:d5452e398b76 74 #define CMD_WRITEADREG 'A' ///< write A/D register
Just4pLeisure 1:d5452e398b76 75
Just4pLeisure 1:d5452e398b76 76 #define CMDGROUP_TRIONIC 'T'
Just4pLeisure 1:d5452e398b76 77 #define CMD_TRIONICDUMP 'D' ///< dumps memory contents
Just4pLeisure 1:d5452e398b76 78 #define CMD_TRIONICWRITE 'F' ///< writes to flash memory
Just4pLeisure 1:d5452e398b76 79
Just4pLeisure 1:d5452e398b76 80 // static variables
Just4pLeisure 1:d5452e398b76 81 static char cmd_buffer[CMD_BUF_LENGTH]; ///< command string buffer
Just4pLeisure 1:d5452e398b76 82 static uint32_t cmd_addr; ///< address (optional)
Just4pLeisure 1:d5452e398b76 83 static uint32_t cmd_value; ///< value (optional)
Just4pLeisure 1:d5452e398b76 84 static uint32_t cmd_result; ///< result
Just4pLeisure 1:d5452e398b76 85
Just4pLeisure 1:d5452e398b76 86 // private functions
Just4pLeisure 1:d5452e398b76 87 uint8_t execute_bdm_cmd();
Just4pLeisure 1:d5452e398b76 88
Just4pLeisure 1:d5452e398b76 89 void bdm_show_help();
Just4pLeisure 1:d5452e398b76 90 void bdm_show_full_help();
Just4pLeisure 1:d5452e398b76 91
Just4pLeisure 1:d5452e398b76 92 // command argument macros
Just4pLeisure 1:d5452e398b76 93 #define CHECK_ARGLENGTH(len) \
Just4pLeisure 1:d5452e398b76 94 if (cmd_length != len + 2) \
Just4pLeisure 1:d5452e398b76 95 return TERM_ERR
Just4pLeisure 1:d5452e398b76 96
Just4pLeisure 1:d5452e398b76 97 #define GET_NUMBER(target, offset, len) \
Just4pLeisure 1:d5452e398b76 98 if (!ascii2int(target, cmd_buffer + 2 + offset, len)) \
Just4pLeisure 1:d5452e398b76 99 return TERM_ERR
Just4pLeisure 1:d5452e398b76 100
Just4pLeisure 1:d5452e398b76 101
Just4pLeisure 1:d5452e398b76 102 void bdm() {
Just4pLeisure 1:d5452e398b76 103
Just4pLeisure 1:d5452e398b76 104 bdm_show_help();
Just4pLeisure 1:d5452e398b76 105 // set up LED pins
Just4pLeisure 1:d5452e398b76 106 // SETBIT(LED_DIR, _BV(LED_ERR) | _BV(LED_ACT));
Just4pLeisure 1:d5452e398b76 107 // set up USB_RD and USB_WR pins
Just4pLeisure 1:d5452e398b76 108 // SETBIT(USB_RXTX_DIR, _BV(USB_RD) | _BV(USB_WR));
Just4pLeisure 1:d5452e398b76 109
Just4pLeisure 1:d5452e398b76 110 // enable interrupts
Just4pLeisure 1:d5452e398b76 111 // sei();
Just4pLeisure 1:d5452e398b76 112
Just4pLeisure 1:d5452e398b76 113 // load configuration from EEPROM
Just4pLeisure 1:d5452e398b76 114 // verify_flash = eeprom_read_byte(&ee_verify);
Just4pLeisure 1:d5452e398b76 115
Just4pLeisure 1:d5452e398b76 116 // Set some initial values to help with checking if the BDM connector is plugged in
Just4pLeisure 1:d5452e398b76 117 PIN_PWR.mode(PullDown);
Just4pLeisure 1:d5452e398b76 118 PIN_NC.mode(PullUp);
Just4pLeisure 2:bf3a2b29259a 119 // PIN_DS.mode(PullUp);
Just4pLeisure 1:d5452e398b76 120 PIN_FREEZE.mode(PullUp);
Just4pLeisure 1:d5452e398b76 121 PIN_DSO.mode(PullUp);
Just4pLeisure 1:d5452e398b76 122
Just4pLeisure 1:d5452e398b76 123 verify_flash = true;
Just4pLeisure 1:d5452e398b76 124
Just4pLeisure 1:d5452e398b76 125 // main loop
Just4pLeisure 1:d5452e398b76 126 *cmd_buffer = '\0';
Just4pLeisure 1:d5452e398b76 127 char ret;
Just4pLeisure 1:d5452e398b76 128 char rx_char;
Just4pLeisure 1:d5452e398b76 129 while (true) {
Just4pLeisure 1:d5452e398b76 130 // read chars from USB
Just4pLeisure 1:d5452e398b76 131 if (pc.readable()) {
Just4pLeisure 1:d5452e398b76 132 // turn Error LED off for next command
Just4pLeisure 1:d5452e398b76 133 led4 = 0;
Just4pLeisure 1:d5452e398b76 134 rx_char = pc.getc();
Just4pLeisure 1:d5452e398b76 135 switch (rx_char) {
Just4pLeisure 1:d5452e398b76 136 // 'ESC' key to go back to mbed Just4Trionic 'home' menu
Just4pLeisure 1:d5452e398b76 137 case '\e':
Just4pLeisure 1:d5452e398b76 138 reset_chip();
Just4pLeisure 1:d5452e398b76 139 return;
Just4pLeisure 1:d5452e398b76 140 // end-of-command reached
Just4pLeisure 1:d5452e398b76 141 case TERM_OK :
Just4pLeisure 1:d5452e398b76 142 // execute command and return flag via USB
Just4pLeisure 1:d5452e398b76 143 ret = execute_bdm_cmd();
Just4pLeisure 1:d5452e398b76 144 pc.putc(ret);
Just4pLeisure 1:d5452e398b76 145 // reset command buffer
Just4pLeisure 1:d5452e398b76 146 *cmd_buffer = '\0';
Just4pLeisure 1:d5452e398b76 147 // light up LED
Just4pLeisure 1:d5452e398b76 148 // ret == TERM_OK ? led_on(LED_ACT) : led_on(LED_ERR);
Just4pLeisure 1:d5452e398b76 149 ret == TERM_OK ? led3 = 1 : led4 = 1;
Just4pLeisure 1:d5452e398b76 150 break;
Just4pLeisure 1:d5452e398b76 151 // another command char
Just4pLeisure 1:d5452e398b76 152 default:
Just4pLeisure 1:d5452e398b76 153 // store in buffer if space permits
Just4pLeisure 1:d5452e398b76 154 if (StrLen(cmd_buffer) < CMD_BUF_LENGTH - 1) {
Just4pLeisure 1:d5452e398b76 155 StrAddc(cmd_buffer, rx_char);
Just4pLeisure 1:d5452e398b76 156 }
Just4pLeisure 1:d5452e398b76 157 break;
Just4pLeisure 1:d5452e398b76 158 }
Just4pLeisure 1:d5452e398b76 159 }
Just4pLeisure 1:d5452e398b76 160 }
Just4pLeisure 1:d5452e398b76 161 }
Just4pLeisure 1:d5452e398b76 162
Just4pLeisure 1:d5452e398b76 163 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 164 /**
Just4pLeisure 1:d5452e398b76 165 Executes a command and returns result flag (does not transmit the flag
Just4pLeisure 1:d5452e398b76 166 itself).
Just4pLeisure 1:d5452e398b76 167
Just4pLeisure 1:d5452e398b76 168 @return command flag (success / failure)
Just4pLeisure 1:d5452e398b76 169 */
Just4pLeisure 1:d5452e398b76 170 uint8_t execute_bdm_cmd() {
Just4pLeisure 1:d5452e398b76 171 uint8_t cmd_length = strlen(cmd_buffer);
Just4pLeisure 1:d5452e398b76 172 char cmd = *(cmd_buffer + 1);
Just4pLeisure 1:d5452e398b76 173
Just4pLeisure 1:d5452e398b76 174 // command groups
Just4pLeisure 1:d5452e398b76 175 switch (*cmd_buffer) {
Just4pLeisure 1:d5452e398b76 176 // adapter commands
Just4pLeisure 1:d5452e398b76 177 case CMDGROUP_ADAPTER:
Just4pLeisure 1:d5452e398b76 178 CHECK_ARGLENGTH(0);
Just4pLeisure 1:d5452e398b76 179 switch (cmd) {
Just4pLeisure 1:d5452e398b76 180 // get firmware version
Just4pLeisure 1:d5452e398b76 181 case CMD_VERSION:
Just4pLeisure 1:d5452e398b76 182 printf("%02x", FW_VERSION_MAJOR);
Just4pLeisure 1:d5452e398b76 183 printf("%02x", FW_VERSION_MINOR);
Just4pLeisure 1:d5452e398b76 184 return TERM_OK;
Just4pLeisure 1:d5452e398b76 185
Just4pLeisure 1:d5452e398b76 186 // get momentary status of BDM pins 0...5 (for debugging)
Just4pLeisure 1:d5452e398b76 187 case CMD_PINSTATUS:
Just4pLeisure 1:d5452e398b76 188 // printf("%02x", (BDM_PIN & 0x3f));
Just4pLeisure 1:d5452e398b76 189 printf("PWR %d, ", PIN_PWR.read());
Just4pLeisure 1:d5452e398b76 190 printf("NC %d, ", PIN_NC.read());
Just4pLeisure 2:bf3a2b29259a 191 // printf("DS %d, ", PIN_DS.read());
Just4pLeisure 1:d5452e398b76 192 printf("FREEZE %d, ", PIN_FREEZE.read());
Just4pLeisure 1:d5452e398b76 193 printf("DSO %d, ", PIN_DSO.read());
Just4pLeisure 1:d5452e398b76 194 return TERM_OK;
Just4pLeisure 1:d5452e398b76 195
Just4pLeisure 1:d5452e398b76 196 // pull BKPT low
Just4pLeisure 1:d5452e398b76 197 case CMD_BKPTLOW:
Just4pLeisure 1:d5452e398b76 198 return bkpt_low();
Just4pLeisure 1:d5452e398b76 199
Just4pLeisure 1:d5452e398b76 200 // pull BKPT high
Just4pLeisure 1:d5452e398b76 201 case CMD_BKPTHIGH:
Just4pLeisure 1:d5452e398b76 202 return bkpt_high();
Just4pLeisure 1:d5452e398b76 203
Just4pLeisure 1:d5452e398b76 204 // pull RESET low
Just4pLeisure 1:d5452e398b76 205 case CMD_RESETLOW:
Just4pLeisure 1:d5452e398b76 206 return reset_low();
Just4pLeisure 1:d5452e398b76 207
Just4pLeisure 1:d5452e398b76 208 // pull RESET high
Just4pLeisure 1:d5452e398b76 209 case CMD_RESETHIGH:
Just4pLeisure 1:d5452e398b76 210 return reset_high();
Just4pLeisure 1:d5452e398b76 211 }
Just4pLeisure 1:d5452e398b76 212 break;
Just4pLeisure 1:d5452e398b76 213
Just4pLeisure 1:d5452e398b76 214 // MCU management
Just4pLeisure 1:d5452e398b76 215 case CMDGROUP_MCU:
Just4pLeisure 1:d5452e398b76 216 switch (cmd) {
Just4pLeisure 1:d5452e398b76 217 // stop target MCU
Just4pLeisure 1:d5452e398b76 218 case CMD_STOPCHIP:
Just4pLeisure 1:d5452e398b76 219 return stop_chip();
Just4pLeisure 1:d5452e398b76 220
Just4pLeisure 1:d5452e398b76 221 // reset target MCU
Just4pLeisure 1:d5452e398b76 222 case CMD_RESETCHIP:
Just4pLeisure 1:d5452e398b76 223 return reset_chip();
Just4pLeisure 1:d5452e398b76 224
Just4pLeisure 1:d5452e398b76 225 // run target MCU from given address
Just4pLeisure 1:d5452e398b76 226 case CMD_RUNCHIP:
Just4pLeisure 1:d5452e398b76 227 CHECK_ARGLENGTH(8);
Just4pLeisure 1:d5452e398b76 228 GET_NUMBER(&cmd_addr, 0, 8);
Just4pLeisure 1:d5452e398b76 229 return run_chip(&cmd_addr);
Just4pLeisure 1:d5452e398b76 230
Just4pLeisure 1:d5452e398b76 231 // restart
Just4pLeisure 1:d5452e398b76 232 case CMD_RESTART:
Just4pLeisure 1:d5452e398b76 233 return restart_chip();
Just4pLeisure 1:d5452e398b76 234
Just4pLeisure 1:d5452e398b76 235 // step
Just4pLeisure 1:d5452e398b76 236 case CMD_STEP:
Just4pLeisure 1:d5452e398b76 237 return step_chip();
Just4pLeisure 1:d5452e398b76 238 }
Just4pLeisure 1:d5452e398b76 239 break;
Just4pLeisure 1:d5452e398b76 240
Just4pLeisure 1:d5452e398b76 241 // Trionic dumping and flashing
Just4pLeisure 1:d5452e398b76 242 case CMDGROUP_FLASH:
Just4pLeisure 1:d5452e398b76 243 switch (cmd) {
Just4pLeisure 1:d5452e398b76 244 // get verification flag
Just4pLeisure 1:d5452e398b76 245 case CMD_GETVERIFY:
Just4pLeisure 1:d5452e398b76 246 CHECK_ARGLENGTH(0);
Just4pLeisure 1:d5452e398b76 247 printf("%02x", (uint8_t)verify_flash);
Just4pLeisure 1:d5452e398b76 248 return TERM_OK;
Just4pLeisure 1:d5452e398b76 249
Just4pLeisure 1:d5452e398b76 250 // set verification flag
Just4pLeisure 1:d5452e398b76 251 case CMD_SETVERIFY:
Just4pLeisure 1:d5452e398b76 252 CHECK_ARGLENGTH(2);
Just4pLeisure 1:d5452e398b76 253 GET_NUMBER(&cmd_addr, 0, 2);
Just4pLeisure 1:d5452e398b76 254 verify_flash = (bool)cmd_addr;
Just4pLeisure 1:d5452e398b76 255 // eeprom_write_byte(&ee_verify, verify_flash);
Just4pLeisure 1:d5452e398b76 256 return TERM_OK;
Just4pLeisure 1:d5452e398b76 257
Just4pLeisure 1:d5452e398b76 258 // dump flash contents as block
Just4pLeisure 1:d5452e398b76 259 case CMD_DUMP:
Just4pLeisure 1:d5452e398b76 260 CHECK_ARGLENGTH(16);
Just4pLeisure 1:d5452e398b76 261 GET_NUMBER(&cmd_addr, 0, 8);
Just4pLeisure 1:d5452e398b76 262 GET_NUMBER(&cmd_value, 8, 8);
Just4pLeisure 1:d5452e398b76 263 return dump_flash(&cmd_addr, &cmd_value);
Just4pLeisure 1:d5452e398b76 264
Just4pLeisure 1:d5452e398b76 265 // erase entire flash memory
Just4pLeisure 1:d5452e398b76 266 case CMD_ERASE:
Just4pLeisure 1:d5452e398b76 267 CHECK_ARGLENGTH(22);
Just4pLeisure 1:d5452e398b76 268 GET_NUMBER(&cmd_addr, 6, 8);
Just4pLeisure 1:d5452e398b76 269 GET_NUMBER(&cmd_value, 14, 8);
Just4pLeisure 1:d5452e398b76 270 return erase_flash(cmd_buffer + 2, &cmd_addr, &cmd_value);
Just4pLeisure 1:d5452e398b76 271
Just4pLeisure 1:d5452e398b76 272 // write data block to flash memory
Just4pLeisure 1:d5452e398b76 273 case CMD_WRITE:
Just4pLeisure 1:d5452e398b76 274 CHECK_ARGLENGTH(14);
Just4pLeisure 1:d5452e398b76 275 GET_NUMBER(&cmd_addr, 6, 8);
Just4pLeisure 1:d5452e398b76 276 return write_flash(cmd_buffer + 2, &cmd_addr);
Just4pLeisure 1:d5452e398b76 277 }
Just4pLeisure 1:d5452e398b76 278 break;
Just4pLeisure 1:d5452e398b76 279
Just4pLeisure 1:d5452e398b76 280 // memory
Just4pLeisure 1:d5452e398b76 281 case CMDGROUP_MEMORY:
Just4pLeisure 1:d5452e398b76 282 if (cmd != CMD_FILLBYTE && cmd != CMD_FILLWORD &&
Just4pLeisure 1:d5452e398b76 283 cmd != CMD_FILLLONG && cmd != CMD_DUMPBYTE && cmd != CMD_DUMPWORD &&
Just4pLeisure 1:d5452e398b76 284 cmd != CMD_DUMPLONG) {
Just4pLeisure 1:d5452e398b76 285 // get memory address
Just4pLeisure 1:d5452e398b76 286 if (cmd_length < 10 || !ascii2int(&cmd_addr, cmd_buffer + 2, 8)) {
Just4pLeisure 1:d5452e398b76 287 // broken parametre
Just4pLeisure 1:d5452e398b76 288 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 289 }
Just4pLeisure 1:d5452e398b76 290
Just4pLeisure 1:d5452e398b76 291 // get optional value
Just4pLeisure 1:d5452e398b76 292 if (cmd_length > 10 &&
Just4pLeisure 1:d5452e398b76 293 !ascii2int(&cmd_value, cmd_buffer + 10, cmd_length - 10)) {
Just4pLeisure 1:d5452e398b76 294 // broken parametre
Just4pLeisure 1:d5452e398b76 295 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 296 }
Just4pLeisure 1:d5452e398b76 297 }
Just4pLeisure 1:d5452e398b76 298
Just4pLeisure 1:d5452e398b76 299 switch (cmd) {
Just4pLeisure 1:d5452e398b76 300 // read byte
Just4pLeisure 1:d5452e398b76 301 case CMD_READBYTE:
Just4pLeisure 1:d5452e398b76 302 if (cmd_length != 10 ||
Just4pLeisure 1:d5452e398b76 303 memread_byte((uint8_t*)(&cmd_result), &cmd_addr) != TERM_OK) {
Just4pLeisure 1:d5452e398b76 304 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 305 }
Just4pLeisure 1:d5452e398b76 306 printf("%02x", (uint8_t)cmd_result);
Just4pLeisure 1:d5452e398b76 307 return TERM_OK;
Just4pLeisure 1:d5452e398b76 308
Just4pLeisure 1:d5452e398b76 309 // read word
Just4pLeisure 1:d5452e398b76 310 case CMD_READWORD:
Just4pLeisure 1:d5452e398b76 311 if (cmd_length != 10 ||
Just4pLeisure 1:d5452e398b76 312 memread_word((uint16_t*)(&cmd_result), &cmd_addr) != TERM_OK) {
Just4pLeisure 1:d5452e398b76 313 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 314 }
Just4pLeisure 1:d5452e398b76 315 printf("%04X", (uint16_t)cmd_result);
Just4pLeisure 1:d5452e398b76 316 return TERM_OK;
Just4pLeisure 1:d5452e398b76 317
Just4pLeisure 1:d5452e398b76 318 // read long word
Just4pLeisure 1:d5452e398b76 319 case CMD_READLONG:
Just4pLeisure 1:d5452e398b76 320 if (cmd_length != 10 ||
Just4pLeisure 1:d5452e398b76 321 memread_long(&cmd_result, &cmd_addr) != TERM_OK) {
Just4pLeisure 1:d5452e398b76 322 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 323 }
Just4pLeisure 1:d5452e398b76 324 printf("%08X", cmd_result);
Just4pLeisure 1:d5452e398b76 325 return TERM_OK;
Just4pLeisure 1:d5452e398b76 326
Just4pLeisure 1:d5452e398b76 327 // dump byte
Just4pLeisure 1:d5452e398b76 328 case CMD_DUMPBYTE:
Just4pLeisure 1:d5452e398b76 329 if (cmd_length != 2 ||
Just4pLeisure 1:d5452e398b76 330 memdump_byte((uint8_t*)(&cmd_result)) != TERM_OK) {
Just4pLeisure 1:d5452e398b76 331 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 332 }
Just4pLeisure 1:d5452e398b76 333 printf("%02x", (uint8_t)cmd_result);
Just4pLeisure 1:d5452e398b76 334 return TERM_OK;
Just4pLeisure 1:d5452e398b76 335
Just4pLeisure 1:d5452e398b76 336 // dump word
Just4pLeisure 1:d5452e398b76 337 case CMD_DUMPWORD:
Just4pLeisure 1:d5452e398b76 338 if (cmd_length != 2 ||
Just4pLeisure 1:d5452e398b76 339 memdump_word((uint16_t*)(&cmd_result)) != TERM_OK) {
Just4pLeisure 1:d5452e398b76 340 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 341 }
Just4pLeisure 1:d5452e398b76 342 printf("%04X", (uint16_t)cmd_result);
Just4pLeisure 1:d5452e398b76 343 return TERM_OK;
Just4pLeisure 1:d5452e398b76 344
Just4pLeisure 1:d5452e398b76 345 // dump long word
Just4pLeisure 1:d5452e398b76 346 case CMD_DUMPLONG:
Just4pLeisure 1:d5452e398b76 347 if (cmd_length != 2 ||
Just4pLeisure 1:d5452e398b76 348 memdump_long(&cmd_result) != TERM_OK) {
Just4pLeisure 1:d5452e398b76 349 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 350 }
Just4pLeisure 1:d5452e398b76 351 printf("%08X", cmd_result);
Just4pLeisure 1:d5452e398b76 352 return TERM_OK;
Just4pLeisure 1:d5452e398b76 353
Just4pLeisure 1:d5452e398b76 354 // write byte
Just4pLeisure 1:d5452e398b76 355 case CMD_WRITEBYTE:
Just4pLeisure 1:d5452e398b76 356 return (cmd_length == 12 &&
Just4pLeisure 1:d5452e398b76 357 memwrite_byte(&cmd_addr, cmd_value) == TERM_OK) ?
Just4pLeisure 1:d5452e398b76 358 TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 359
Just4pLeisure 1:d5452e398b76 360 // write word
Just4pLeisure 1:d5452e398b76 361 case CMD_WRITEWORD:
Just4pLeisure 1:d5452e398b76 362 return (cmd_length == 14 &&
Just4pLeisure 1:d5452e398b76 363 memwrite_word(&cmd_addr, cmd_value) == TERM_OK) ?
Just4pLeisure 1:d5452e398b76 364 TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 365
Just4pLeisure 1:d5452e398b76 366 // write long word
Just4pLeisure 1:d5452e398b76 367 case CMD_WRITELONG:
Just4pLeisure 1:d5452e398b76 368 return (cmd_length == 18 &&
Just4pLeisure 1:d5452e398b76 369 memwrite_long(&cmd_addr, &cmd_value) == TERM_OK) ?
Just4pLeisure 1:d5452e398b76 370 TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 371
Just4pLeisure 1:d5452e398b76 372 // fill byte
Just4pLeisure 1:d5452e398b76 373 case CMD_FILLBYTE:
Just4pLeisure 1:d5452e398b76 374 if (cmd_length != 4 || !ascii2int(&cmd_value, cmd_buffer + 2, 2)) {
Just4pLeisure 1:d5452e398b76 375 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 376 }
Just4pLeisure 1:d5452e398b76 377 return (memfill_byte(cmd_value));
Just4pLeisure 1:d5452e398b76 378
Just4pLeisure 1:d5452e398b76 379 // fill word
Just4pLeisure 1:d5452e398b76 380 case CMD_FILLWORD:
Just4pLeisure 1:d5452e398b76 381 if (cmd_length != 6 || !ascii2int(&cmd_value, cmd_buffer + 2, 4)) {
Just4pLeisure 1:d5452e398b76 382 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 383 }
Just4pLeisure 1:d5452e398b76 384 return (memfill_word(cmd_value));
Just4pLeisure 1:d5452e398b76 385
Just4pLeisure 1:d5452e398b76 386 // fill long word
Just4pLeisure 1:d5452e398b76 387 case CMD_FILLLONG:
Just4pLeisure 1:d5452e398b76 388 if (cmd_length != 10 || !ascii2int(&cmd_value, cmd_buffer + 2, 8)) {
Just4pLeisure 1:d5452e398b76 389 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 390 }
Just4pLeisure 1:d5452e398b76 391 return (memfill_long(&cmd_value));
Just4pLeisure 1:d5452e398b76 392 }
Just4pLeisure 1:d5452e398b76 393 break;
Just4pLeisure 1:d5452e398b76 394
Just4pLeisure 1:d5452e398b76 395 // registers
Just4pLeisure 1:d5452e398b76 396 case CMDGROUP_REGISTER:
Just4pLeisure 1:d5452e398b76 397 // get register code
Just4pLeisure 1:d5452e398b76 398 if (cmd_length < 4 || !ascii2int(&cmd_addr, cmd_buffer + 3, 1)) {
Just4pLeisure 1:d5452e398b76 399 // broken parametre
Just4pLeisure 1:d5452e398b76 400 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 401 }
Just4pLeisure 1:d5452e398b76 402
Just4pLeisure 1:d5452e398b76 403 // get optional value
Just4pLeisure 1:d5452e398b76 404 if (cmd_length > 4 &&
Just4pLeisure 1:d5452e398b76 405 !ascii2int(&cmd_value, cmd_buffer + 4, 8)) {
Just4pLeisure 1:d5452e398b76 406 // broken parametre
Just4pLeisure 1:d5452e398b76 407 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 408 }
Just4pLeisure 1:d5452e398b76 409
Just4pLeisure 1:d5452e398b76 410 switch (cmd) {
Just4pLeisure 1:d5452e398b76 411 // read system register
Just4pLeisure 1:d5452e398b76 412 case CMD_READSYSREG:
Just4pLeisure 1:d5452e398b76 413 if (cmd_length != 4 ||
Just4pLeisure 1:d5452e398b76 414 sysreg_read(&cmd_result, (uint8_t)cmd_addr) != TERM_OK) {
Just4pLeisure 1:d5452e398b76 415 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 416 }
Just4pLeisure 1:d5452e398b76 417 printf("%08X", cmd_result);
Just4pLeisure 1:d5452e398b76 418 return TERM_OK;
Just4pLeisure 1:d5452e398b76 419
Just4pLeisure 1:d5452e398b76 420 // write system register
Just4pLeisure 1:d5452e398b76 421 case CMD_WRITESYSREG:
Just4pLeisure 1:d5452e398b76 422 return (cmd_length == 12 &&
Just4pLeisure 1:d5452e398b76 423 sysreg_write((uint8_t)cmd_addr, &cmd_value) == TERM_OK) ?
Just4pLeisure 1:d5452e398b76 424 TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 425
Just4pLeisure 1:d5452e398b76 426 // read A/D register
Just4pLeisure 1:d5452e398b76 427 case CMD_READADREG:
Just4pLeisure 1:d5452e398b76 428 if (cmd_length != 4 ||
Just4pLeisure 1:d5452e398b76 429 adreg_read(&cmd_result, (uint8_t)cmd_addr) != TERM_OK) {
Just4pLeisure 1:d5452e398b76 430 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 431 }
Just4pLeisure 1:d5452e398b76 432 printf("%08X", cmd_result);
Just4pLeisure 1:d5452e398b76 433 return TERM_OK;
Just4pLeisure 1:d5452e398b76 434
Just4pLeisure 1:d5452e398b76 435 // write A/D register
Just4pLeisure 1:d5452e398b76 436 case CMD_WRITEADREG:
Just4pLeisure 1:d5452e398b76 437 return (cmd_length == 12 &&
Just4pLeisure 1:d5452e398b76 438 adreg_write((uint8_t)cmd_addr, &cmd_value) == TERM_OK) ?
Just4pLeisure 1:d5452e398b76 439 TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 440 }
Just4pLeisure 1:d5452e398b76 441 break;
Just4pLeisure 1:d5452e398b76 442
Just4pLeisure 1:d5452e398b76 443 // Trionic dumping and flashing
Just4pLeisure 1:d5452e398b76 444 case CMDGROUP_TRIONIC:
Just4pLeisure 1:d5452e398b76 445
Just4pLeisure 1:d5452e398b76 446 switch (cmd) {
Just4pLeisure 1:d5452e398b76 447
Just4pLeisure 1:d5452e398b76 448 // dump flash contents to a bin file
Just4pLeisure 1:d5452e398b76 449 case CMD_TRIONICDUMP:
Just4pLeisure 1:d5452e398b76 450 CHECK_ARGLENGTH(0);
Just4pLeisure 1:d5452e398b76 451 return dump_trionic();
Just4pLeisure 1:d5452e398b76 452
Just4pLeisure 1:d5452e398b76 453 // write data block to flash memory
Just4pLeisure 1:d5452e398b76 454 case CMD_TRIONICWRITE:
Just4pLeisure 1:d5452e398b76 455 CHECK_ARGLENGTH(0);
Just4pLeisure 1:d5452e398b76 456 return flash_trionic();
Just4pLeisure 1:d5452e398b76 457 }
Just4pLeisure 1:d5452e398b76 458
Just4pLeisure 1:d5452e398b76 459 // show help for BDM commands
Just4pLeisure 1:d5452e398b76 460 case 'H':
Just4pLeisure 1:d5452e398b76 461 bdm_show_full_help();
Just4pLeisure 1:d5452e398b76 462 return TERM_OK;
Just4pLeisure 1:d5452e398b76 463 case 'h':
Just4pLeisure 1:d5452e398b76 464 bdm_show_help();
Just4pLeisure 1:d5452e398b76 465 return TERM_OK;
Just4pLeisure 1:d5452e398b76 466 default:
Just4pLeisure 1:d5452e398b76 467 bdm_show_help();
Just4pLeisure 1:d5452e398b76 468 }
Just4pLeisure 1:d5452e398b76 469
Just4pLeisure 1:d5452e398b76 470 // unknown command
Just4pLeisure 1:d5452e398b76 471 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 472 }
Just4pLeisure 1:d5452e398b76 473
Just4pLeisure 1:d5452e398b76 474 void bdm_show_help() {
Just4pLeisure 1:d5452e398b76 475 printf("Just4Trionic BDM Command Menu\r\n");
Just4pLeisure 1:d5452e398b76 476 printf("=============================\r\n");
Just4pLeisure 1:d5452e398b76 477 printf("TD - and DUMP T5 FLASH BIN file\r\n");
Just4pLeisure 1:d5452e398b76 478 printf("TF - FLASH the update file to the T5 (and write SRAM)\r\n");
Just4pLeisure 1:d5452e398b76 479 printf("Tr - Read SRAM adaption (not done).\r\n");
Just4pLeisure 1:d5452e398b76 480 printf("Tw - Write SRAM adaptation (not done).\r\n");
Just4pLeisure 1:d5452e398b76 481 printf("\r\n");
Just4pLeisure 1:d5452e398b76 482 printf("'ESC' - Return to Just4Trionic Main Menu\r\n");
Just4pLeisure 1:d5452e398b76 483 printf("\r\n");
Just4pLeisure 1:d5452e398b76 484 printf("h - Show this help menu\r\n");
Just4pLeisure 1:d5452e398b76 485 printf("\r\n");
Just4pLeisure 1:d5452e398b76 486 return;
Just4pLeisure 1:d5452e398b76 487 }
Just4pLeisure 1:d5452e398b76 488 void bdm_show_full_help() {
Just4pLeisure 1:d5452e398b76 489 printf("Just4Trionic BDM Command Menu\r\n");
Just4pLeisure 1:d5452e398b76 490 printf("=============================\r\n");
Just4pLeisure 1:d5452e398b76 491 printf("TD - and DUMP T5 FLASH BIN file\r\n");
Just4pLeisure 1:d5452e398b76 492 printf("TF - FLASH the update file to the T5 (and write SRAM)\r\n");
Just4pLeisure 1:d5452e398b76 493 printf("Tr - Read SRAM adaption (not done).\r\n");
Just4pLeisure 1:d5452e398b76 494 printf("Tw - Write SRAM adaptation (not done).\r\n");
Just4pLeisure 1:d5452e398b76 495 printf("\r\n");
Just4pLeisure 1:d5452e398b76 496 printf("Adapter Commands - a\r\n");
Just4pLeisure 1:d5452e398b76 497 printf("====================\r\n");
Just4pLeisure 1:d5452e398b76 498 printf("av - display firmware version\r\n");
Just4pLeisure 1:d5452e398b76 499 printf("as - display status of BDM pins\r\n");
Just4pLeisure 1:d5452e398b76 500 printf("a1 - pull BKPT low\r\n");
Just4pLeisure 1:d5452e398b76 501 printf("a2 - pull BKPT high\r\n");
Just4pLeisure 1:d5452e398b76 502 printf("a3 - pull RESET low\r\n");
Just4pLeisure 1:d5452e398b76 503 printf("a4 - pull RESET high\r\n");
Just4pLeisure 1:d5452e398b76 504 printf("\r\n");
Just4pLeisure 1:d5452e398b76 505 printf("MCU Management Commands - c\r\n");
Just4pLeisure 1:d5452e398b76 506 printf("===========================\r\n");
Just4pLeisure 1:d5452e398b76 507 printf("cS - stop MCU\r\n");
Just4pLeisure 1:d5452e398b76 508 printf("cR - reset MCU\r\n");
Just4pLeisure 1:d5452e398b76 509 printf("cr - run from given address\r\n");
Just4pLeisure 1:d5452e398b76 510 printf(" e.g. crCAFEBABE run from address 0xcafebabe\r\n");
Just4pLeisure 1:d5452e398b76 511 printf("cs - restart MCU\r\n");
Just4pLeisure 1:d5452e398b76 512 printf("cb - step MCU\r\n");
Just4pLeisure 1:d5452e398b76 513 printf("\r\n");
Just4pLeisure 1:d5452e398b76 514 printf("MCU FLASH Commands - f\r\n");
Just4pLeisure 1:d5452e398b76 515 printf("======================\r\n");
Just4pLeisure 1:d5452e398b76 516 printf("fv - gets verification status (always verify)\r\n");
Just4pLeisure 1:d5452e398b76 517 printf("fV - sets verification on/off (always on)\r\n");
Just4pLeisure 1:d5452e398b76 518 printf("fd - DUMPs memory contents\r\n");
Just4pLeisure 1:d5452e398b76 519 printf(" e.g. fdSSSSSSSSEEEEEEEE S...E... start and end addresses\r\n");
Just4pLeisure 1:d5452e398b76 520 printf(" e.g. fd0000000000020000 to DUMP T5.2\r\n");
Just4pLeisure 1:d5452e398b76 521 printf(" e.g. fd0000000000040000 to DUMP T5.5\r\n");
Just4pLeisure 1:d5452e398b76 522 printf(" e.g. fd0000000000080000 to DUMP T7\r\n");
Just4pLeisure 1:d5452e398b76 523 printf("fE - Erases entire FLASH memory\r\n");
Just4pLeisure 1:d5452e398b76 524 printf(" e.g. fETTTTTTSSSSSSSSEEEEEEEE T...S...E type, start and end addresses\r\n");
Just4pLeisure 1:d5452e398b76 525 printf(" e.g. fE28f0100000000000020000 erase 28F512 in T5.2\r\n");
Just4pLeisure 1:d5452e398b76 526 printf(" e.g. fE28f0100000000000040000 erase 28F010 in T5.5\r\n");
Just4pLeisure 1:d5452e398b76 527 printf(" e.g. fE29f0100000000000040000 erase 29F010 in T5.5 (addresses not used)\r\n");
Just4pLeisure 1:d5452e398b76 528 printf(" e.g. fE29f4000000000000080000 erase 29F400 in T7 (addresses not used)\r\n");
Just4pLeisure 1:d5452e398b76 529 printf("fw - writes to FLASH memory\r\n");
Just4pLeisure 1:d5452e398b76 530 printf(" Write a batch of long words to flash from a start address\r\n");
Just4pLeisure 1:d5452e398b76 531 printf(" followed by longwords LLLLLLLL, LLLLLLLL etc\r\n");
Just4pLeisure 1:d5452e398b76 532 printf(" Send a break character to stop when doneg");
Just4pLeisure 1:d5452e398b76 533 printf(" e.g. fwTTTTTTSSSSSSSS T...S... type and start address\r\n");
Just4pLeisure 1:d5452e398b76 534 printf(" e.g. fw28f01000004000 start at address 0x004000 T5.2/5.5\r\n");
Just4pLeisure 1:d5452e398b76 535 printf(" e.g. fw29f01000004000 start at address 0x004000 T5.5 with 29F010\r\n");
Just4pLeisure 1:d5452e398b76 536 printf(" e.g. fw29f40000004000 start at address 0x004000 T7\r\n");
Just4pLeisure 1:d5452e398b76 537 printf("\r\n");
Just4pLeisure 1:d5452e398b76 538 printf("MCU Memory Commands - m\r\n");
Just4pLeisure 1:d5452e398b76 539 printf("=======================\r\n");
Just4pLeisure 1:d5452e398b76 540 printf("mbAAAAAAAA - read byte from memory at 0xaaaaaaaa\r\n");
Just4pLeisure 1:d5452e398b76 541 printf("mwAAAAAAAA - read word (2 bytes) from memory\r\n");
Just4pLeisure 1:d5452e398b76 542 printf("mlAAAAAAAA - read long word (4 bytes) from memory\r\n");
Just4pLeisure 1:d5452e398b76 543 printf("mz - dump byte from the next memory address\r\n");
Just4pLeisure 1:d5452e398b76 544 printf("mx - dump word from the next memory address\r\n");
Just4pLeisure 1:d5452e398b76 545 printf("mc - dump long word from the next memory address\r\n");
Just4pLeisure 1:d5452e398b76 546 printf("mBAAAAAAAADD - write byte 0xdd to memory 0xaaaaaaaa\r\n");
Just4pLeisure 1:d5452e398b76 547 printf("mWAAAAAAAADDDD - write word 0xdddd to memory 0xaaaaaaaa\r\n");
Just4pLeisure 1:d5452e398b76 548 printf("mLAAAAAAAADDDDDDD - write long word 0xdddddddd to memory 0xaaaaaaaa\r\n");
Just4pLeisure 1:d5452e398b76 549 printf("mfDD - fill byte 0xdd to next memory address\r\n");
Just4pLeisure 1:d5452e398b76 550 printf("mFDDDD - fill word 0xdddd to next memory address\r\n");
Just4pLeisure 1:d5452e398b76 551 printf("mMDDDDDDDD - fill long word 0xdddddddd to next memory address\r\n");
Just4pLeisure 1:d5452e398b76 552 printf("\r\n");
Just4pLeisure 1:d5452e398b76 553 printf("MCU Register Commands - r\r\n");
Just4pLeisure 1:d5452e398b76 554 printf("=========================\r\n");
Just4pLeisure 1:d5452e398b76 555 printf("rrRR - read system register RR\r\n");
Just4pLeisure 1:d5452e398b76 556 printf(" 00 - RPC, 01 - PCC, 0B - SR, 0C - USP, 0D - SSP\r\n");
Just4pLeisure 1:d5452e398b76 557 printf(" 0e - SFC, 0f - DFC, 08 - ATEMP, 09 - FAR, 0a - VBR\r\n");
Just4pLeisure 1:d5452e398b76 558 printf("rWRRCAFEBABE - write 0xcafebabe system register RR\r\n");
Just4pLeisure 1:d5452e398b76 559 printf("raAD - read A/D register 0x00-07 D0-D7, 0x08-15 A0-A7\r\n");
Just4pLeisure 1:d5452e398b76 560 printf("rAADCAFEBABE - write 0xcafebabe to A/D register \r\n");
Just4pLeisure 1:d5452e398b76 561 printf("\r\n");
Just4pLeisure 1:d5452e398b76 562 printf("'ESC' - Return to Just4Trionic Main Menu\r\n");
Just4pLeisure 1:d5452e398b76 563 printf("\r\n");
Just4pLeisure 1:d5452e398b76 564 printf("H - Show this help menu\r\n");
Just4pLeisure 1:d5452e398b76 565 printf("\r\n");
Just4pLeisure 1:d5452e398b76 566 return;
Just4pLeisure 1:d5452e398b76 567 }