Sophie Dexter
/
Just4Trionic
Just4Trionic - CAN and BDM FLASH programmer for Saab cars
bdm.cpp@6:2fbcbebed28c, 2016-04-23 (annotated)
- Committer:
- Just4pLeisure
- Date:
- Sat Apr 23 18:31:40 2016 +0000
- Revision:
- 6:2fbcbebed28c
- Parent:
- 5:1775b4b13232
Version 1.6 Faster T7 P-BUS FLASHing algorithm, longer T8 erase timeout fixed BDM register display function
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 | 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 | 5:1775b4b13232 | 41 | #define CMD_BERR_LOW '5' ///< pull BERR low |
Just4pLeisure | 5:1775b4b13232 | 42 | #define CMD_BERR_HIGH '6' ///< pull BERR high |
Just4pLeisure | 5:1775b4b13232 | 43 | #define CMD_BERR_INPUT '7' ///< make BERR an input |
Just4pLeisure | 5:1775b4b13232 | 44 | |
Just4pLeisure | 1:d5452e398b76 | 45 | |
Just4pLeisure | 1:d5452e398b76 | 46 | #define CMDGROUP_MCU 'c' ///< target MCU management commands |
Just4pLeisure | 1:d5452e398b76 | 47 | #define CMD_STOPCHIP 'S' ///< stop |
Just4pLeisure | 1:d5452e398b76 | 48 | #define CMD_RESETCHIP 'R' ///< reset |
Just4pLeisure | 1:d5452e398b76 | 49 | #define CMD_RUNCHIP 'r' ///< run from given address |
Just4pLeisure | 1:d5452e398b76 | 50 | #define CMD_RESTART 's' ///< restart |
Just4pLeisure | 1:d5452e398b76 | 51 | #define CMD_STEP 'b' ///< step |
Just4pLeisure | 1:d5452e398b76 | 52 | |
Just4pLeisure | 1:d5452e398b76 | 53 | #define CMDGROUP_FLASH 'f' |
Just4pLeisure | 1:d5452e398b76 | 54 | #define CMD_GETVERIFY 'v' ///< gets verification status |
Just4pLeisure | 1:d5452e398b76 | 55 | #define CMD_SETVERIFY 'V' ///< sets verification on/off |
Just4pLeisure | 1:d5452e398b76 | 56 | #define CMD_DUMP 'd' ///< dumps memory contents |
Just4pLeisure | 1:d5452e398b76 | 57 | #define CMD_ERASE 'E' ///< erase entire flash memory |
Just4pLeisure | 1:d5452e398b76 | 58 | #define CMD_WRITE 'w' ///< writes to flash memory |
Just4pLeisure | 1:d5452e398b76 | 59 | |
Just4pLeisure | 1:d5452e398b76 | 60 | #define CMDGROUP_MEMORY 'm' ///< target MCU memory commands |
Just4pLeisure | 1:d5452e398b76 | 61 | #define CMD_READBYTE 'b' ///< read byte from memory |
Just4pLeisure | 1:d5452e398b76 | 62 | #define CMD_READWORD 'w' ///< read word (2 bytes) from memory |
Just4pLeisure | 1:d5452e398b76 | 63 | #define CMD_READLONG 'l' ///< read long word (4 bytes) from memory |
Just4pLeisure | 1:d5452e398b76 | 64 | #define CMD_DUMPBYTE 'z' ///< dump byte from memory |
Just4pLeisure | 1:d5452e398b76 | 65 | #define CMD_DUMPWORD 'x' ///< dump word from memory |
Just4pLeisure | 1:d5452e398b76 | 66 | #define CMD_DUMPLONG 'c' ///< dump long word from memory |
Just4pLeisure | 1:d5452e398b76 | 67 | #define CMD_WRITEBYTE 'B' ///< write byte to memory |
Just4pLeisure | 1:d5452e398b76 | 68 | #define CMD_WRITEWORD 'W' ///< write word to memory |
Just4pLeisure | 1:d5452e398b76 | 69 | #define CMD_WRITELONG 'L' ///< write long word to memory |
Just4pLeisure | 1:d5452e398b76 | 70 | #define CMD_FILLBYTE 'f' ///< fill byte in memory |
Just4pLeisure | 1:d5452e398b76 | 71 | #define CMD_FILLWORD 'F' ///< fill word in memory |
Just4pLeisure | 1:d5452e398b76 | 72 | #define CMD_FILLLONG 'M' ///< fill long word in memory |
Just4pLeisure | 1:d5452e398b76 | 73 | |
Just4pLeisure | 1:d5452e398b76 | 74 | #define CMDGROUP_REGISTER 'r' ///< register commands |
Just4pLeisure | 1:d5452e398b76 | 75 | #define CMD_READSYSREG 'r' ///< read system register |
Just4pLeisure | 1:d5452e398b76 | 76 | #define CMD_WRITESYSREG 'W' ///< write system register |
Just4pLeisure | 1:d5452e398b76 | 77 | #define CMD_READADREG 'a' ///< read A/D register |
Just4pLeisure | 1:d5452e398b76 | 78 | #define CMD_WRITEADREG 'A' ///< write A/D register |
Just4pLeisure | 5:1775b4b13232 | 79 | #define CMD_DISPLAYREGS 'd' ///< BD32 like display all registers |
Just4pLeisure | 1:d5452e398b76 | 80 | |
Just4pLeisure | 1:d5452e398b76 | 81 | #define CMDGROUP_TRIONIC 'T' |
Just4pLeisure | 1:d5452e398b76 | 82 | #define CMD_TRIONICDUMP 'D' ///< dumps memory contents |
Just4pLeisure | 1:d5452e398b76 | 83 | #define CMD_TRIONICWRITE 'F' ///< writes to flash memory |
Just4pLeisure | 1:d5452e398b76 | 84 | |
Just4pLeisure | 1:d5452e398b76 | 85 | // static variables |
Just4pLeisure | 1:d5452e398b76 | 86 | static char cmd_buffer[CMD_BUF_LENGTH]; ///< command string buffer |
Just4pLeisure | 1:d5452e398b76 | 87 | static uint32_t cmd_addr; ///< address (optional) |
Just4pLeisure | 1:d5452e398b76 | 88 | static uint32_t cmd_value; ///< value (optional) |
Just4pLeisure | 1:d5452e398b76 | 89 | static uint32_t cmd_result; ///< result |
Just4pLeisure | 1:d5452e398b76 | 90 | |
Just4pLeisure | 1:d5452e398b76 | 91 | // private functions |
Just4pLeisure | 1:d5452e398b76 | 92 | uint8_t execute_bdm_cmd(); |
Just4pLeisure | 1:d5452e398b76 | 93 | |
Just4pLeisure | 1:d5452e398b76 | 94 | void bdm_show_help(); |
Just4pLeisure | 1:d5452e398b76 | 95 | void bdm_show_full_help(); |
Just4pLeisure | 1:d5452e398b76 | 96 | |
Just4pLeisure | 1:d5452e398b76 | 97 | // command argument macros |
Just4pLeisure | 1:d5452e398b76 | 98 | #define CHECK_ARGLENGTH(len) \ |
Just4pLeisure | 1:d5452e398b76 | 99 | if (cmd_length != len + 2) \ |
Just4pLeisure | 1:d5452e398b76 | 100 | return TERM_ERR |
Just4pLeisure | 1:d5452e398b76 | 101 | |
Just4pLeisure | 1:d5452e398b76 | 102 | #define GET_NUMBER(target, offset, len) \ |
Just4pLeisure | 1:d5452e398b76 | 103 | if (!ascii2int(target, cmd_buffer + 2 + offset, len)) \ |
Just4pLeisure | 1:d5452e398b76 | 104 | return TERM_ERR |
Just4pLeisure | 1:d5452e398b76 | 105 | |
Just4pLeisure | 1:d5452e398b76 | 106 | |
Just4pLeisure | 5:1775b4b13232 | 107 | void bdm() |
Just4pLeisure | 5:1775b4b13232 | 108 | { |
Just4pLeisure | 1:d5452e398b76 | 109 | |
Just4pLeisure | 1:d5452e398b76 | 110 | bdm_show_help(); |
Just4pLeisure | 1:d5452e398b76 | 111 | // set up LED pins |
Just4pLeisure | 1:d5452e398b76 | 112 | // SETBIT(LED_DIR, _BV(LED_ERR) | _BV(LED_ACT)); |
Just4pLeisure | 1:d5452e398b76 | 113 | // set up USB_RD and USB_WR pins |
Just4pLeisure | 1:d5452e398b76 | 114 | // SETBIT(USB_RXTX_DIR, _BV(USB_RD) | _BV(USB_WR)); |
Just4pLeisure | 1:d5452e398b76 | 115 | |
Just4pLeisure | 1:d5452e398b76 | 116 | // enable interrupts |
Just4pLeisure | 1:d5452e398b76 | 117 | // sei(); |
Just4pLeisure | 1:d5452e398b76 | 118 | |
Just4pLeisure | 1:d5452e398b76 | 119 | // load configuration from EEPROM |
Just4pLeisure | 1:d5452e398b76 | 120 | // verify_flash = eeprom_read_byte(&ee_verify); |
Just4pLeisure | 1:d5452e398b76 | 121 | |
Just4pLeisure | 1:d5452e398b76 | 122 | // Set some initial values to help with checking if the BDM connector is plugged in |
Just4pLeisure | 1:d5452e398b76 | 123 | PIN_PWR.mode(PullDown); |
Just4pLeisure | 1:d5452e398b76 | 124 | PIN_NC.mode(PullUp); |
Just4pLeisure | 2:bf3a2b29259a | 125 | // PIN_DS.mode(PullUp); |
Just4pLeisure | 1:d5452e398b76 | 126 | PIN_FREEZE.mode(PullUp); |
Just4pLeisure | 1:d5452e398b76 | 127 | PIN_DSO.mode(PullUp); |
Just4pLeisure | 1:d5452e398b76 | 128 | |
Just4pLeisure | 1:d5452e398b76 | 129 | verify_flash = true; |
Just4pLeisure | 1:d5452e398b76 | 130 | |
Just4pLeisure | 1:d5452e398b76 | 131 | // main loop |
Just4pLeisure | 1:d5452e398b76 | 132 | *cmd_buffer = '\0'; |
Just4pLeisure | 1:d5452e398b76 | 133 | char ret; |
Just4pLeisure | 1:d5452e398b76 | 134 | char rx_char; |
Just4pLeisure | 1:d5452e398b76 | 135 | while (true) { |
Just4pLeisure | 1:d5452e398b76 | 136 | // read chars from USB |
Just4pLeisure | 1:d5452e398b76 | 137 | if (pc.readable()) { |
Just4pLeisure | 1:d5452e398b76 | 138 | // turn Error LED off for next command |
Just4pLeisure | 1:d5452e398b76 | 139 | led4 = 0; |
Just4pLeisure | 1:d5452e398b76 | 140 | rx_char = pc.getc(); |
Just4pLeisure | 1:d5452e398b76 | 141 | switch (rx_char) { |
Just4pLeisure | 1:d5452e398b76 | 142 | // 'ESC' key to go back to mbed Just4Trionic 'home' menu |
Just4pLeisure | 1:d5452e398b76 | 143 | case '\e': |
Just4pLeisure | 1:d5452e398b76 | 144 | reset_chip(); |
Just4pLeisure | 1:d5452e398b76 | 145 | return; |
Just4pLeisure | 1:d5452e398b76 | 146 | // end-of-command reached |
Just4pLeisure | 1:d5452e398b76 | 147 | case TERM_OK : |
Just4pLeisure | 1:d5452e398b76 | 148 | // execute command and return flag via USB |
Just4pLeisure | 1:d5452e398b76 | 149 | ret = execute_bdm_cmd(); |
Just4pLeisure | 1:d5452e398b76 | 150 | pc.putc(ret); |
Just4pLeisure | 1:d5452e398b76 | 151 | // reset command buffer |
Just4pLeisure | 1:d5452e398b76 | 152 | *cmd_buffer = '\0'; |
Just4pLeisure | 1:d5452e398b76 | 153 | // light up LED |
Just4pLeisure | 1:d5452e398b76 | 154 | // ret == TERM_OK ? led_on(LED_ACT) : led_on(LED_ERR); |
Just4pLeisure | 1:d5452e398b76 | 155 | ret == TERM_OK ? led3 = 1 : led4 = 1; |
Just4pLeisure | 1:d5452e398b76 | 156 | break; |
Just4pLeisure | 1:d5452e398b76 | 157 | // another command char |
Just4pLeisure | 1:d5452e398b76 | 158 | default: |
Just4pLeisure | 1:d5452e398b76 | 159 | // store in buffer if space permits |
Just4pLeisure | 1:d5452e398b76 | 160 | if (StrLen(cmd_buffer) < CMD_BUF_LENGTH - 1) { |
Just4pLeisure | 1:d5452e398b76 | 161 | StrAddc(cmd_buffer, rx_char); |
Just4pLeisure | 1:d5452e398b76 | 162 | } |
Just4pLeisure | 1:d5452e398b76 | 163 | break; |
Just4pLeisure | 1:d5452e398b76 | 164 | } |
Just4pLeisure | 1:d5452e398b76 | 165 | } |
Just4pLeisure | 1:d5452e398b76 | 166 | } |
Just4pLeisure | 1:d5452e398b76 | 167 | } |
Just4pLeisure | 1:d5452e398b76 | 168 | |
Just4pLeisure | 1:d5452e398b76 | 169 | //----------------------------------------------------------------------------- |
Just4pLeisure | 1:d5452e398b76 | 170 | /** |
Just4pLeisure | 1:d5452e398b76 | 171 | Executes a command and returns result flag (does not transmit the flag |
Just4pLeisure | 1:d5452e398b76 | 172 | itself). |
Just4pLeisure | 1:d5452e398b76 | 173 | |
Just4pLeisure | 1:d5452e398b76 | 174 | @return command flag (success / failure) |
Just4pLeisure | 1:d5452e398b76 | 175 | */ |
Just4pLeisure | 5:1775b4b13232 | 176 | uint8_t execute_bdm_cmd() |
Just4pLeisure | 5:1775b4b13232 | 177 | { |
Just4pLeisure | 1:d5452e398b76 | 178 | uint8_t cmd_length = strlen(cmd_buffer); |
Just4pLeisure | 1:d5452e398b76 | 179 | char cmd = *(cmd_buffer + 1); |
Just4pLeisure | 1:d5452e398b76 | 180 | |
Just4pLeisure | 1:d5452e398b76 | 181 | // command groups |
Just4pLeisure | 1:d5452e398b76 | 182 | switch (*cmd_buffer) { |
Just4pLeisure | 1:d5452e398b76 | 183 | // adapter commands |
Just4pLeisure | 1:d5452e398b76 | 184 | case CMDGROUP_ADAPTER: |
Just4pLeisure | 1:d5452e398b76 | 185 | CHECK_ARGLENGTH(0); |
Just4pLeisure | 1:d5452e398b76 | 186 | switch (cmd) { |
Just4pLeisure | 1:d5452e398b76 | 187 | // get firmware version |
Just4pLeisure | 1:d5452e398b76 | 188 | case CMD_VERSION: |
Just4pLeisure | 1:d5452e398b76 | 189 | printf("%02x", FW_VERSION_MAJOR); |
Just4pLeisure | 1:d5452e398b76 | 190 | printf("%02x", FW_VERSION_MINOR); |
Just4pLeisure | 4:682d96ff6d79 | 191 | printf("\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 192 | return TERM_OK; |
Just4pLeisure | 1:d5452e398b76 | 193 | |
Just4pLeisure | 1:d5452e398b76 | 194 | // get momentary status of BDM pins 0...5 (for debugging) |
Just4pLeisure | 1:d5452e398b76 | 195 | case CMD_PINSTATUS: |
Just4pLeisure | 1:d5452e398b76 | 196 | // printf("%02x", (BDM_PIN & 0x3f)); |
Just4pLeisure | 1:d5452e398b76 | 197 | printf("PWR %d, ", PIN_PWR.read()); |
Just4pLeisure | 1:d5452e398b76 | 198 | printf("NC %d, ", PIN_NC.read()); |
Just4pLeisure | 2:bf3a2b29259a | 199 | // printf("DS %d, ", PIN_DS.read()); |
Just4pLeisure | 1:d5452e398b76 | 200 | printf("FREEZE %d, ", PIN_FREEZE.read()); |
Just4pLeisure | 1:d5452e398b76 | 201 | printf("DSO %d, ", PIN_DSO.read()); |
Just4pLeisure | 4:682d96ff6d79 | 202 | printf("\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 203 | return TERM_OK; |
Just4pLeisure | 1:d5452e398b76 | 204 | |
Just4pLeisure | 1:d5452e398b76 | 205 | // pull BKPT low |
Just4pLeisure | 1:d5452e398b76 | 206 | case CMD_BKPTLOW: |
Just4pLeisure | 1:d5452e398b76 | 207 | return bkpt_low(); |
Just4pLeisure | 1:d5452e398b76 | 208 | |
Just4pLeisure | 1:d5452e398b76 | 209 | // pull BKPT high |
Just4pLeisure | 1:d5452e398b76 | 210 | case CMD_BKPTHIGH: |
Just4pLeisure | 1:d5452e398b76 | 211 | return bkpt_high(); |
Just4pLeisure | 1:d5452e398b76 | 212 | |
Just4pLeisure | 1:d5452e398b76 | 213 | // pull RESET low |
Just4pLeisure | 1:d5452e398b76 | 214 | case CMD_RESETLOW: |
Just4pLeisure | 1:d5452e398b76 | 215 | return reset_low(); |
Just4pLeisure | 1:d5452e398b76 | 216 | |
Just4pLeisure | 1:d5452e398b76 | 217 | // pull RESET high |
Just4pLeisure | 1:d5452e398b76 | 218 | case CMD_RESETHIGH: |
Just4pLeisure | 1:d5452e398b76 | 219 | return reset_high(); |
Just4pLeisure | 5:1775b4b13232 | 220 | |
Just4pLeisure | 5:1775b4b13232 | 221 | // pull BERR low |
Just4pLeisure | 5:1775b4b13232 | 222 | case CMD_BERR_LOW: |
Just4pLeisure | 5:1775b4b13232 | 223 | return berr_low(); |
Just4pLeisure | 5:1775b4b13232 | 224 | |
Just4pLeisure | 5:1775b4b13232 | 225 | // pull BERR high |
Just4pLeisure | 5:1775b4b13232 | 226 | case CMD_BERR_HIGH: |
Just4pLeisure | 5:1775b4b13232 | 227 | return berr_high(); |
Just4pLeisure | 5:1775b4b13232 | 228 | |
Just4pLeisure | 5:1775b4b13232 | 229 | // make BERR an input |
Just4pLeisure | 5:1775b4b13232 | 230 | case CMD_BERR_INPUT: |
Just4pLeisure | 5:1775b4b13232 | 231 | return berr_input(); |
Just4pLeisure | 1:d5452e398b76 | 232 | } |
Just4pLeisure | 1:d5452e398b76 | 233 | break; |
Just4pLeisure | 1:d5452e398b76 | 234 | |
Just4pLeisure | 1:d5452e398b76 | 235 | // MCU management |
Just4pLeisure | 1:d5452e398b76 | 236 | case CMDGROUP_MCU: |
Just4pLeisure | 1:d5452e398b76 | 237 | switch (cmd) { |
Just4pLeisure | 1:d5452e398b76 | 238 | // stop target MCU |
Just4pLeisure | 1:d5452e398b76 | 239 | case CMD_STOPCHIP: |
Just4pLeisure | 1:d5452e398b76 | 240 | return stop_chip(); |
Just4pLeisure | 1:d5452e398b76 | 241 | |
Just4pLeisure | 1:d5452e398b76 | 242 | // reset target MCU |
Just4pLeisure | 1:d5452e398b76 | 243 | case CMD_RESETCHIP: |
Just4pLeisure | 1:d5452e398b76 | 244 | return reset_chip(); |
Just4pLeisure | 1:d5452e398b76 | 245 | |
Just4pLeisure | 1:d5452e398b76 | 246 | // run target MCU from given address |
Just4pLeisure | 1:d5452e398b76 | 247 | case CMD_RUNCHIP: |
Just4pLeisure | 1:d5452e398b76 | 248 | CHECK_ARGLENGTH(8); |
Just4pLeisure | 1:d5452e398b76 | 249 | GET_NUMBER(&cmd_addr, 0, 8); |
Just4pLeisure | 1:d5452e398b76 | 250 | return run_chip(&cmd_addr); |
Just4pLeisure | 1:d5452e398b76 | 251 | |
Just4pLeisure | 1:d5452e398b76 | 252 | // restart |
Just4pLeisure | 1:d5452e398b76 | 253 | case CMD_RESTART: |
Just4pLeisure | 1:d5452e398b76 | 254 | return restart_chip(); |
Just4pLeisure | 1:d5452e398b76 | 255 | |
Just4pLeisure | 1:d5452e398b76 | 256 | // step |
Just4pLeisure | 1:d5452e398b76 | 257 | case CMD_STEP: |
Just4pLeisure | 1:d5452e398b76 | 258 | return step_chip(); |
Just4pLeisure | 1:d5452e398b76 | 259 | } |
Just4pLeisure | 1:d5452e398b76 | 260 | break; |
Just4pLeisure | 1:d5452e398b76 | 261 | |
Just4pLeisure | 1:d5452e398b76 | 262 | // Trionic dumping and flashing |
Just4pLeisure | 1:d5452e398b76 | 263 | case CMDGROUP_FLASH: |
Just4pLeisure | 1:d5452e398b76 | 264 | switch (cmd) { |
Just4pLeisure | 1:d5452e398b76 | 265 | // get verification flag |
Just4pLeisure | 1:d5452e398b76 | 266 | case CMD_GETVERIFY: |
Just4pLeisure | 1:d5452e398b76 | 267 | CHECK_ARGLENGTH(0); |
Just4pLeisure | 1:d5452e398b76 | 268 | printf("%02x", (uint8_t)verify_flash); |
Just4pLeisure | 4:682d96ff6d79 | 269 | printf("\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 270 | return TERM_OK; |
Just4pLeisure | 1:d5452e398b76 | 271 | |
Just4pLeisure | 1:d5452e398b76 | 272 | // set verification flag |
Just4pLeisure | 1:d5452e398b76 | 273 | case CMD_SETVERIFY: |
Just4pLeisure | 1:d5452e398b76 | 274 | CHECK_ARGLENGTH(2); |
Just4pLeisure | 1:d5452e398b76 | 275 | GET_NUMBER(&cmd_addr, 0, 2); |
Just4pLeisure | 1:d5452e398b76 | 276 | verify_flash = (bool)cmd_addr; |
Just4pLeisure | 1:d5452e398b76 | 277 | // eeprom_write_byte(&ee_verify, verify_flash); |
Just4pLeisure | 1:d5452e398b76 | 278 | return TERM_OK; |
Just4pLeisure | 1:d5452e398b76 | 279 | |
Just4pLeisure | 1:d5452e398b76 | 280 | // dump flash contents as block |
Just4pLeisure | 1:d5452e398b76 | 281 | case CMD_DUMP: |
Just4pLeisure | 1:d5452e398b76 | 282 | CHECK_ARGLENGTH(16); |
Just4pLeisure | 1:d5452e398b76 | 283 | GET_NUMBER(&cmd_addr, 0, 8); |
Just4pLeisure | 1:d5452e398b76 | 284 | GET_NUMBER(&cmd_value, 8, 8); |
Just4pLeisure | 1:d5452e398b76 | 285 | return dump_flash(&cmd_addr, &cmd_value); |
Just4pLeisure | 1:d5452e398b76 | 286 | |
Just4pLeisure | 1:d5452e398b76 | 287 | // erase entire flash memory |
Just4pLeisure | 1:d5452e398b76 | 288 | case CMD_ERASE: |
Just4pLeisure | 1:d5452e398b76 | 289 | CHECK_ARGLENGTH(22); |
Just4pLeisure | 1:d5452e398b76 | 290 | GET_NUMBER(&cmd_addr, 6, 8); |
Just4pLeisure | 1:d5452e398b76 | 291 | GET_NUMBER(&cmd_value, 14, 8); |
Just4pLeisure | 1:d5452e398b76 | 292 | return erase_flash(cmd_buffer + 2, &cmd_addr, &cmd_value); |
Just4pLeisure | 1:d5452e398b76 | 293 | |
Just4pLeisure | 1:d5452e398b76 | 294 | // write data block to flash memory |
Just4pLeisure | 1:d5452e398b76 | 295 | case CMD_WRITE: |
Just4pLeisure | 1:d5452e398b76 | 296 | CHECK_ARGLENGTH(14); |
Just4pLeisure | 1:d5452e398b76 | 297 | GET_NUMBER(&cmd_addr, 6, 8); |
Just4pLeisure | 1:d5452e398b76 | 298 | return write_flash(cmd_buffer + 2, &cmd_addr); |
Just4pLeisure | 1:d5452e398b76 | 299 | } |
Just4pLeisure | 1:d5452e398b76 | 300 | break; |
Just4pLeisure | 1:d5452e398b76 | 301 | |
Just4pLeisure | 1:d5452e398b76 | 302 | // memory |
Just4pLeisure | 1:d5452e398b76 | 303 | case CMDGROUP_MEMORY: |
Just4pLeisure | 1:d5452e398b76 | 304 | if (cmd != CMD_FILLBYTE && cmd != CMD_FILLWORD && |
Just4pLeisure | 1:d5452e398b76 | 305 | cmd != CMD_FILLLONG && cmd != CMD_DUMPBYTE && cmd != CMD_DUMPWORD && |
Just4pLeisure | 1:d5452e398b76 | 306 | cmd != CMD_DUMPLONG) { |
Just4pLeisure | 1:d5452e398b76 | 307 | // get memory address |
Just4pLeisure | 1:d5452e398b76 | 308 | if (cmd_length < 10 || !ascii2int(&cmd_addr, cmd_buffer + 2, 8)) { |
Just4pLeisure | 1:d5452e398b76 | 309 | // broken parametre |
Just4pLeisure | 1:d5452e398b76 | 310 | return TERM_ERR; |
Just4pLeisure | 1:d5452e398b76 | 311 | } |
Just4pLeisure | 1:d5452e398b76 | 312 | |
Just4pLeisure | 1:d5452e398b76 | 313 | // get optional value |
Just4pLeisure | 1:d5452e398b76 | 314 | if (cmd_length > 10 && |
Just4pLeisure | 1:d5452e398b76 | 315 | !ascii2int(&cmd_value, cmd_buffer + 10, cmd_length - 10)) { |
Just4pLeisure | 1:d5452e398b76 | 316 | // broken parametre |
Just4pLeisure | 1:d5452e398b76 | 317 | return TERM_ERR; |
Just4pLeisure | 1:d5452e398b76 | 318 | } |
Just4pLeisure | 1:d5452e398b76 | 319 | } |
Just4pLeisure | 1:d5452e398b76 | 320 | |
Just4pLeisure | 1:d5452e398b76 | 321 | switch (cmd) { |
Just4pLeisure | 1:d5452e398b76 | 322 | // read byte |
Just4pLeisure | 1:d5452e398b76 | 323 | case CMD_READBYTE: |
Just4pLeisure | 1:d5452e398b76 | 324 | if (cmd_length != 10 || |
Just4pLeisure | 1:d5452e398b76 | 325 | memread_byte((uint8_t*)(&cmd_result), &cmd_addr) != TERM_OK) { |
Just4pLeisure | 1:d5452e398b76 | 326 | return TERM_ERR; |
Just4pLeisure | 1:d5452e398b76 | 327 | } |
Just4pLeisure | 1:d5452e398b76 | 328 | printf("%02x", (uint8_t)cmd_result); |
Just4pLeisure | 4:682d96ff6d79 | 329 | printf("\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 330 | return TERM_OK; |
Just4pLeisure | 1:d5452e398b76 | 331 | |
Just4pLeisure | 1:d5452e398b76 | 332 | // read word |
Just4pLeisure | 1:d5452e398b76 | 333 | case CMD_READWORD: |
Just4pLeisure | 1:d5452e398b76 | 334 | if (cmd_length != 10 || |
Just4pLeisure | 1:d5452e398b76 | 335 | memread_word((uint16_t*)(&cmd_result), &cmd_addr) != TERM_OK) { |
Just4pLeisure | 1:d5452e398b76 | 336 | return TERM_ERR; |
Just4pLeisure | 1:d5452e398b76 | 337 | } |
Just4pLeisure | 1:d5452e398b76 | 338 | printf("%04X", (uint16_t)cmd_result); |
Just4pLeisure | 4:682d96ff6d79 | 339 | printf("\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 340 | return TERM_OK; |
Just4pLeisure | 1:d5452e398b76 | 341 | |
Just4pLeisure | 1:d5452e398b76 | 342 | // read long word |
Just4pLeisure | 1:d5452e398b76 | 343 | case CMD_READLONG: |
Just4pLeisure | 1:d5452e398b76 | 344 | if (cmd_length != 10 || |
Just4pLeisure | 1:d5452e398b76 | 345 | memread_long(&cmd_result, &cmd_addr) != TERM_OK) { |
Just4pLeisure | 1:d5452e398b76 | 346 | return TERM_ERR; |
Just4pLeisure | 1:d5452e398b76 | 347 | } |
Just4pLeisure | 1:d5452e398b76 | 348 | printf("%08X", cmd_result); |
Just4pLeisure | 4:682d96ff6d79 | 349 | printf("\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 350 | return TERM_OK; |
Just4pLeisure | 1:d5452e398b76 | 351 | |
Just4pLeisure | 1:d5452e398b76 | 352 | // dump byte |
Just4pLeisure | 1:d5452e398b76 | 353 | case CMD_DUMPBYTE: |
Just4pLeisure | 1:d5452e398b76 | 354 | if (cmd_length != 2 || |
Just4pLeisure | 1:d5452e398b76 | 355 | memdump_byte((uint8_t*)(&cmd_result)) != TERM_OK) { |
Just4pLeisure | 1:d5452e398b76 | 356 | return TERM_ERR; |
Just4pLeisure | 1:d5452e398b76 | 357 | } |
Just4pLeisure | 1:d5452e398b76 | 358 | printf("%02x", (uint8_t)cmd_result); |
Just4pLeisure | 4:682d96ff6d79 | 359 | printf("\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 360 | return TERM_OK; |
Just4pLeisure | 1:d5452e398b76 | 361 | |
Just4pLeisure | 1:d5452e398b76 | 362 | // dump word |
Just4pLeisure | 1:d5452e398b76 | 363 | case CMD_DUMPWORD: |
Just4pLeisure | 1:d5452e398b76 | 364 | if (cmd_length != 2 || |
Just4pLeisure | 1:d5452e398b76 | 365 | memdump_word((uint16_t*)(&cmd_result)) != TERM_OK) { |
Just4pLeisure | 1:d5452e398b76 | 366 | return TERM_ERR; |
Just4pLeisure | 1:d5452e398b76 | 367 | } |
Just4pLeisure | 1:d5452e398b76 | 368 | printf("%04X", (uint16_t)cmd_result); |
Just4pLeisure | 4:682d96ff6d79 | 369 | printf("\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 370 | return TERM_OK; |
Just4pLeisure | 1:d5452e398b76 | 371 | |
Just4pLeisure | 1:d5452e398b76 | 372 | // dump long word |
Just4pLeisure | 1:d5452e398b76 | 373 | case CMD_DUMPLONG: |
Just4pLeisure | 1:d5452e398b76 | 374 | if (cmd_length != 2 || |
Just4pLeisure | 1:d5452e398b76 | 375 | memdump_long(&cmd_result) != TERM_OK) { |
Just4pLeisure | 1:d5452e398b76 | 376 | return TERM_ERR; |
Just4pLeisure | 1:d5452e398b76 | 377 | } |
Just4pLeisure | 1:d5452e398b76 | 378 | printf("%08X", cmd_result); |
Just4pLeisure | 4:682d96ff6d79 | 379 | printf("\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 380 | return TERM_OK; |
Just4pLeisure | 1:d5452e398b76 | 381 | |
Just4pLeisure | 1:d5452e398b76 | 382 | // write byte |
Just4pLeisure | 1:d5452e398b76 | 383 | case CMD_WRITEBYTE: |
Just4pLeisure | 1:d5452e398b76 | 384 | return (cmd_length == 12 && |
Just4pLeisure | 1:d5452e398b76 | 385 | memwrite_byte(&cmd_addr, cmd_value) == TERM_OK) ? |
Just4pLeisure | 1:d5452e398b76 | 386 | TERM_OK : TERM_ERR; |
Just4pLeisure | 1:d5452e398b76 | 387 | |
Just4pLeisure | 1:d5452e398b76 | 388 | // write word |
Just4pLeisure | 1:d5452e398b76 | 389 | case CMD_WRITEWORD: |
Just4pLeisure | 1:d5452e398b76 | 390 | return (cmd_length == 14 && |
Just4pLeisure | 1:d5452e398b76 | 391 | memwrite_word(&cmd_addr, cmd_value) == TERM_OK) ? |
Just4pLeisure | 1:d5452e398b76 | 392 | TERM_OK : TERM_ERR; |
Just4pLeisure | 1:d5452e398b76 | 393 | |
Just4pLeisure | 1:d5452e398b76 | 394 | // write long word |
Just4pLeisure | 1:d5452e398b76 | 395 | case CMD_WRITELONG: |
Just4pLeisure | 1:d5452e398b76 | 396 | return (cmd_length == 18 && |
Just4pLeisure | 1:d5452e398b76 | 397 | memwrite_long(&cmd_addr, &cmd_value) == TERM_OK) ? |
Just4pLeisure | 1:d5452e398b76 | 398 | TERM_OK : TERM_ERR; |
Just4pLeisure | 1:d5452e398b76 | 399 | |
Just4pLeisure | 1:d5452e398b76 | 400 | // fill byte |
Just4pLeisure | 1:d5452e398b76 | 401 | case CMD_FILLBYTE: |
Just4pLeisure | 1:d5452e398b76 | 402 | if (cmd_length != 4 || !ascii2int(&cmd_value, cmd_buffer + 2, 2)) { |
Just4pLeisure | 1:d5452e398b76 | 403 | return TERM_ERR; |
Just4pLeisure | 1:d5452e398b76 | 404 | } |
Just4pLeisure | 1:d5452e398b76 | 405 | return (memfill_byte(cmd_value)); |
Just4pLeisure | 1:d5452e398b76 | 406 | |
Just4pLeisure | 1:d5452e398b76 | 407 | // fill word |
Just4pLeisure | 1:d5452e398b76 | 408 | case CMD_FILLWORD: |
Just4pLeisure | 1:d5452e398b76 | 409 | if (cmd_length != 6 || !ascii2int(&cmd_value, cmd_buffer + 2, 4)) { |
Just4pLeisure | 1:d5452e398b76 | 410 | return TERM_ERR; |
Just4pLeisure | 1:d5452e398b76 | 411 | } |
Just4pLeisure | 1:d5452e398b76 | 412 | return (memfill_word(cmd_value)); |
Just4pLeisure | 1:d5452e398b76 | 413 | |
Just4pLeisure | 1:d5452e398b76 | 414 | // fill long word |
Just4pLeisure | 1:d5452e398b76 | 415 | case CMD_FILLLONG: |
Just4pLeisure | 1:d5452e398b76 | 416 | if (cmd_length != 10 || !ascii2int(&cmd_value, cmd_buffer + 2, 8)) { |
Just4pLeisure | 1:d5452e398b76 | 417 | return TERM_ERR; |
Just4pLeisure | 1:d5452e398b76 | 418 | } |
Just4pLeisure | 1:d5452e398b76 | 419 | return (memfill_long(&cmd_value)); |
Just4pLeisure | 1:d5452e398b76 | 420 | } |
Just4pLeisure | 1:d5452e398b76 | 421 | break; |
Just4pLeisure | 1:d5452e398b76 | 422 | |
Just4pLeisure | 1:d5452e398b76 | 423 | // registers |
Just4pLeisure | 1:d5452e398b76 | 424 | case CMDGROUP_REGISTER: |
Just4pLeisure | 1:d5452e398b76 | 425 | // get register code |
Just4pLeisure | 6:2fbcbebed28c | 426 | if (cmd_length == 2) { |
Just4pLeisure | 6:2fbcbebed28c | 427 | if (cmd != CMD_DISPLAYREGS) { |
Just4pLeisure | 5:1775b4b13232 | 428 | // broken parametre |
Just4pLeisure | 6:2fbcbebed28c | 429 | printf("err %s line: %d, cmd_length %d\r\n", __FILE__, __LINE__, cmd_length); |
Just4pLeisure | 5:1775b4b13232 | 430 | return TERM_ERR; |
Just4pLeisure | 5:1775b4b13232 | 431 | } |
Just4pLeisure | 6:2fbcbebed28c | 432 | } else if (cmd_length < 4 || !ascii2int(&cmd_addr, cmd_buffer + 3, 1)) { |
Just4pLeisure | 6:2fbcbebed28c | 433 | // broken parametre |
Just4pLeisure | 6:2fbcbebed28c | 434 | printf("err %s line: %d, cmd_length %d\r\n", __FILE__, __LINE__, cmd_length); |
Just4pLeisure | 6:2fbcbebed28c | 435 | return TERM_ERR; |
Just4pLeisure | 6:2fbcbebed28c | 436 | } |
Just4pLeisure | 6:2fbcbebed28c | 437 | // get optional value |
Just4pLeisure | 6:2fbcbebed28c | 438 | if (cmd_length > 4 && !ascii2int(&cmd_value, cmd_buffer + 4, 8)) { |
Just4pLeisure | 6:2fbcbebed28c | 439 | // broken parametre |
Just4pLeisure | 6:2fbcbebed28c | 440 | printf("err %s line: %d, cmd_length %d\r\n", __FILE__, __LINE__, cmd_length); |
Just4pLeisure | 6:2fbcbebed28c | 441 | return TERM_ERR; |
Just4pLeisure | 1:d5452e398b76 | 442 | } |
Just4pLeisure | 1:d5452e398b76 | 443 | |
Just4pLeisure | 1:d5452e398b76 | 444 | switch (cmd) { |
Just4pLeisure | 1:d5452e398b76 | 445 | // read system register |
Just4pLeisure | 1:d5452e398b76 | 446 | case CMD_READSYSREG: |
Just4pLeisure | 1:d5452e398b76 | 447 | if (cmd_length != 4 || |
Just4pLeisure | 1:d5452e398b76 | 448 | sysreg_read(&cmd_result, (uint8_t)cmd_addr) != TERM_OK) { |
Just4pLeisure | 6:2fbcbebed28c | 449 | printf("err %s line: %d\r\n", __FILE__, __LINE__ ); |
Just4pLeisure | 1:d5452e398b76 | 450 | return TERM_ERR; |
Just4pLeisure | 1:d5452e398b76 | 451 | } |
Just4pLeisure | 1:d5452e398b76 | 452 | printf("%08X", cmd_result); |
Just4pLeisure | 4:682d96ff6d79 | 453 | printf("\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 454 | return TERM_OK; |
Just4pLeisure | 1:d5452e398b76 | 455 | |
Just4pLeisure | 1:d5452e398b76 | 456 | // write system register |
Just4pLeisure | 1:d5452e398b76 | 457 | case CMD_WRITESYSREG: |
Just4pLeisure | 1:d5452e398b76 | 458 | return (cmd_length == 12 && |
Just4pLeisure | 1:d5452e398b76 | 459 | sysreg_write((uint8_t)cmd_addr, &cmd_value) == TERM_OK) ? |
Just4pLeisure | 1:d5452e398b76 | 460 | TERM_OK : TERM_ERR; |
Just4pLeisure | 1:d5452e398b76 | 461 | |
Just4pLeisure | 1:d5452e398b76 | 462 | // read A/D register |
Just4pLeisure | 1:d5452e398b76 | 463 | case CMD_READADREG: |
Just4pLeisure | 1:d5452e398b76 | 464 | if (cmd_length != 4 || |
Just4pLeisure | 1:d5452e398b76 | 465 | adreg_read(&cmd_result, (uint8_t)cmd_addr) != TERM_OK) { |
Just4pLeisure | 6:2fbcbebed28c | 466 | printf("err %s line: %d, cmd_length %d\r\n", __FILE__, __LINE__, cmd_length); |
Just4pLeisure | 1:d5452e398b76 | 467 | return TERM_ERR; |
Just4pLeisure | 1:d5452e398b76 | 468 | } |
Just4pLeisure | 1:d5452e398b76 | 469 | printf("%08X", cmd_result); |
Just4pLeisure | 4:682d96ff6d79 | 470 | printf("\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 471 | return TERM_OK; |
Just4pLeisure | 1:d5452e398b76 | 472 | |
Just4pLeisure | 1:d5452e398b76 | 473 | // write A/D register |
Just4pLeisure | 1:d5452e398b76 | 474 | case CMD_WRITEADREG: |
Just4pLeisure | 1:d5452e398b76 | 475 | return (cmd_length == 12 && |
Just4pLeisure | 1:d5452e398b76 | 476 | adreg_write((uint8_t)cmd_addr, &cmd_value) == TERM_OK) ? |
Just4pLeisure | 1:d5452e398b76 | 477 | TERM_OK : TERM_ERR; |
Just4pLeisure | 5:1775b4b13232 | 478 | |
Just4pLeisure | 5:1775b4b13232 | 479 | // Display all registers |
Just4pLeisure | 5:1775b4b13232 | 480 | case CMD_DISPLAYREGS: |
Just4pLeisure | 6:2fbcbebed28c | 481 | printf(" Register Display\r\n"); |
Just4pLeisure | 5:1775b4b13232 | 482 | printf(" D0-7"); |
Just4pLeisure | 5:1775b4b13232 | 483 | for (uint8_t i = 0; i < 8; i++) { |
Just4pLeisure | 5:1775b4b13232 | 484 | if (adreg_read(&cmd_result, i) != TERM_OK) { |
Just4pLeisure | 6:2fbcbebed28c | 485 | printf("err %s line: %d\r\n", __FILE__, __LINE__ ); |
Just4pLeisure | 5:1775b4b13232 | 486 | return TERM_ERR; |
Just4pLeisure | 5:1775b4b13232 | 487 | } |
Just4pLeisure | 5:1775b4b13232 | 488 | printf(" %08X", cmd_result); |
Just4pLeisure | 5:1775b4b13232 | 489 | } |
Just4pLeisure | 5:1775b4b13232 | 490 | // |
Just4pLeisure | 5:1775b4b13232 | 491 | printf("\r\n"); |
Just4pLeisure | 5:1775b4b13232 | 492 | printf(" A0-7"); |
Just4pLeisure | 5:1775b4b13232 | 493 | for (uint8_t i = 8; i < 16; i++) { |
Just4pLeisure | 5:1775b4b13232 | 494 | if (adreg_read(&cmd_result, i) != TERM_OK) { |
Just4pLeisure | 6:2fbcbebed28c | 495 | printf("err %s line: %d\r\n", __FILE__, __LINE__ ); |
Just4pLeisure | 5:1775b4b13232 | 496 | return TERM_ERR; |
Just4pLeisure | 5:1775b4b13232 | 497 | } |
Just4pLeisure | 5:1775b4b13232 | 498 | printf(" %08X", cmd_result); |
Just4pLeisure | 5:1775b4b13232 | 499 | } |
Just4pLeisure | 5:1775b4b13232 | 500 | printf("\r\n"); |
Just4pLeisure | 5:1775b4b13232 | 501 | // |
Just4pLeisure | 5:1775b4b13232 | 502 | if (sysreg_read(&cmd_result, 0x0) != TERM_OK) { |
Just4pLeisure | 6:2fbcbebed28c | 503 | printf("err %s line: %d\r\n", __FILE__, __LINE__ ); |
Just4pLeisure | 5:1775b4b13232 | 504 | return TERM_ERR; |
Just4pLeisure | 5:1775b4b13232 | 505 | } |
Just4pLeisure | 5:1775b4b13232 | 506 | printf(" RPC %08X", cmd_result); |
Just4pLeisure | 5:1775b4b13232 | 507 | if (sysreg_read(&cmd_result, 0xC) != TERM_OK) { |
Just4pLeisure | 6:2fbcbebed28c | 508 | printf("err %s line: %d\r\n", __FILE__, __LINE__ ); |
Just4pLeisure | 5:1775b4b13232 | 509 | return TERM_ERR; |
Just4pLeisure | 5:1775b4b13232 | 510 | } |
Just4pLeisure | 5:1775b4b13232 | 511 | printf(" USP %08X", cmd_result); |
Just4pLeisure | 5:1775b4b13232 | 512 | if (sysreg_read(&cmd_result, 0xE) != TERM_OK) { |
Just4pLeisure | 6:2fbcbebed28c | 513 | printf("err %s line: %d\r\n", __FILE__, __LINE__ ); |
Just4pLeisure | 5:1775b4b13232 | 514 | return TERM_ERR; |
Just4pLeisure | 5:1775b4b13232 | 515 | } |
Just4pLeisure | 5:1775b4b13232 | 516 | printf(" SFC %08X SR 10S--210---XNZVC\r\n", cmd_result); |
Just4pLeisure | 5:1775b4b13232 | 517 | // |
Just4pLeisure | 5:1775b4b13232 | 518 | if (sysreg_read(&cmd_result, 0x1) != TERM_OK) { |
Just4pLeisure | 6:2fbcbebed28c | 519 | |
Just4pLeisure | 6:2fbcbebed28c | 520 | printf("err %s line: %d\r\n", __FILE__, __LINE__ ); |
Just4pLeisure | 5:1775b4b13232 | 521 | return TERM_ERR; |
Just4pLeisure | 5:1775b4b13232 | 522 | } |
Just4pLeisure | 5:1775b4b13232 | 523 | printf(" CPC %08X", cmd_result); |
Just4pLeisure | 5:1775b4b13232 | 524 | if (sysreg_read(&cmd_result, 0xD) != TERM_OK) { |
Just4pLeisure | 6:2fbcbebed28c | 525 | printf("err %s line: %d\r\n", __FILE__, __LINE__ ); |
Just4pLeisure | 5:1775b4b13232 | 526 | return TERM_ERR; |
Just4pLeisure | 5:1775b4b13232 | 527 | } |
Just4pLeisure | 5:1775b4b13232 | 528 | printf(" SSP %08X", cmd_result); |
Just4pLeisure | 5:1775b4b13232 | 529 | if (sysreg_read(&cmd_result, 0xF) != TERM_OK) { |
Just4pLeisure | 6:2fbcbebed28c | 530 | printf("err %s line: %d\r\n", __FILE__, __LINE__ ); |
Just4pLeisure | 5:1775b4b13232 | 531 | return TERM_ERR; |
Just4pLeisure | 5:1775b4b13232 | 532 | } |
Just4pLeisure | 5:1775b4b13232 | 533 | printf(" DFC %08X", cmd_result); |
Just4pLeisure | 5:1775b4b13232 | 534 | if (sysreg_read(&cmd_result, 0xB) != TERM_OK) { |
Just4pLeisure | 6:2fbcbebed28c | 535 | printf("err %s line: %d\r\n", __FILE__, __LINE__ ); |
Just4pLeisure | 5:1775b4b13232 | 536 | return TERM_ERR; |
Just4pLeisure | 5:1775b4b13232 | 537 | } |
Just4pLeisure | 5:1775b4b13232 | 538 | printf(" %04X ", cmd_result); |
Just4pLeisure | 5:1775b4b13232 | 539 | for (uint32_t i = 0; i < 16; i++) { |
Just4pLeisure | 5:1775b4b13232 | 540 | cmd_result & (1 << (15-i)) ? printf("1") : printf("0"); |
Just4pLeisure | 5:1775b4b13232 | 541 | } |
Just4pLeisure | 5:1775b4b13232 | 542 | printf("\r\n"); |
Just4pLeisure | 5:1775b4b13232 | 543 | // |
Just4pLeisure | 5:1775b4b13232 | 544 | if (sysreg_read(&cmd_result, 0xA)!= TERM_OK) { |
Just4pLeisure | 6:2fbcbebed28c | 545 | printf("err %s line: %d\r\n", __FILE__, __LINE__ ); |
Just4pLeisure | 5:1775b4b13232 | 546 | return TERM_ERR; |
Just4pLeisure | 5:1775b4b13232 | 547 | } |
Just4pLeisure | 5:1775b4b13232 | 548 | printf(" VBR %08X", cmd_result); |
Just4pLeisure | 5:1775b4b13232 | 549 | if (sysreg_read(&cmd_result, 0x8)!= TERM_OK) { |
Just4pLeisure | 6:2fbcbebed28c | 550 | printf("err %s line: %d\r\n", __FILE__, __LINE__ ); |
Just4pLeisure | 5:1775b4b13232 | 551 | return TERM_ERR; |
Just4pLeisure | 5:1775b4b13232 | 552 | } |
Just4pLeisure | 5:1775b4b13232 | 553 | printf(" ATEMP %08X", cmd_result); |
Just4pLeisure | 5:1775b4b13232 | 554 | if (sysreg_read(&cmd_result, 0x9) != TERM_OK) { |
Just4pLeisure | 6:2fbcbebed28c | 555 | printf("err %s line: %d\r\n", __FILE__, __LINE__ ); |
Just4pLeisure | 5:1775b4b13232 | 556 | return TERM_ERR; |
Just4pLeisure | 5:1775b4b13232 | 557 | } |
Just4pLeisure | 5:1775b4b13232 | 558 | printf(" FAR %08X\r\n", cmd_result); |
Just4pLeisure | 5:1775b4b13232 | 559 | // |
Just4pLeisure | 5:1775b4b13232 | 560 | printf(" !CONNNECTED:%d", PIN_NC.read()); |
Just4pLeisure | 5:1775b4b13232 | 561 | printf(" POWER:%d", PIN_PWR.read()); |
Just4pLeisure | 5:1775b4b13232 | 562 | printf(" !RESET:%d", PIN_RESET.read()); |
Just4pLeisure | 5:1775b4b13232 | 563 | printf(" !BUSERR:%d", PIN_BERR.read()); |
Just4pLeisure | 5:1775b4b13232 | 564 | printf(" BKPT/DSCLK:%d", PIN_BKPT.read()); |
Just4pLeisure | 5:1775b4b13232 | 565 | printf(" FREEZE:%d", PIN_FREEZE.read()); |
Just4pLeisure | 5:1775b4b13232 | 566 | printf(" DSO:%d", PIN_DSO.read()); |
Just4pLeisure | 5:1775b4b13232 | 567 | printf(" DSI:%d", PIN_DSI.read()); |
Just4pLeisure | 5:1775b4b13232 | 568 | printf("\r\n"); |
Just4pLeisure | 5:1775b4b13232 | 569 | // |
Just4pLeisure | 5:1775b4b13232 | 570 | return TERM_OK; |
Just4pLeisure | 1:d5452e398b76 | 571 | } |
Just4pLeisure | 1:d5452e398b76 | 572 | break; |
Just4pLeisure | 1:d5452e398b76 | 573 | |
Just4pLeisure | 1:d5452e398b76 | 574 | // Trionic dumping and flashing |
Just4pLeisure | 1:d5452e398b76 | 575 | case CMDGROUP_TRIONIC: |
Just4pLeisure | 1:d5452e398b76 | 576 | |
Just4pLeisure | 1:d5452e398b76 | 577 | switch (cmd) { |
Just4pLeisure | 1:d5452e398b76 | 578 | |
Just4pLeisure | 1:d5452e398b76 | 579 | // dump flash contents to a bin file |
Just4pLeisure | 1:d5452e398b76 | 580 | case CMD_TRIONICDUMP: |
Just4pLeisure | 1:d5452e398b76 | 581 | CHECK_ARGLENGTH(0); |
Just4pLeisure | 1:d5452e398b76 | 582 | return dump_trionic(); |
Just4pLeisure | 1:d5452e398b76 | 583 | |
Just4pLeisure | 1:d5452e398b76 | 584 | // write data block to flash memory |
Just4pLeisure | 1:d5452e398b76 | 585 | case CMD_TRIONICWRITE: |
Just4pLeisure | 1:d5452e398b76 | 586 | CHECK_ARGLENGTH(0); |
Just4pLeisure | 1:d5452e398b76 | 587 | return flash_trionic(); |
Just4pLeisure | 1:d5452e398b76 | 588 | } |
Just4pLeisure | 1:d5452e398b76 | 589 | |
Just4pLeisure | 1:d5452e398b76 | 590 | // show help for BDM commands |
Just4pLeisure | 1:d5452e398b76 | 591 | case 'H': |
Just4pLeisure | 1:d5452e398b76 | 592 | bdm_show_full_help(); |
Just4pLeisure | 1:d5452e398b76 | 593 | return TERM_OK; |
Just4pLeisure | 1:d5452e398b76 | 594 | case 'h': |
Just4pLeisure | 1:d5452e398b76 | 595 | bdm_show_help(); |
Just4pLeisure | 1:d5452e398b76 | 596 | return TERM_OK; |
Just4pLeisure | 1:d5452e398b76 | 597 | default: |
Just4pLeisure | 1:d5452e398b76 | 598 | bdm_show_help(); |
Just4pLeisure | 1:d5452e398b76 | 599 | } |
Just4pLeisure | 1:d5452e398b76 | 600 | |
Just4pLeisure | 6:2fbcbebed28c | 601 | // unknown command |
Just4pLeisure | 1:d5452e398b76 | 602 | return TERM_ERR; |
Just4pLeisure | 1:d5452e398b76 | 603 | } |
Just4pLeisure | 1:d5452e398b76 | 604 | |
Just4pLeisure | 5:1775b4b13232 | 605 | void bdm_show_help() |
Just4pLeisure | 5:1775b4b13232 | 606 | { |
Just4pLeisure | 1:d5452e398b76 | 607 | printf("Just4Trionic BDM Command Menu\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 608 | printf("=============================\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 609 | printf("TD - and DUMP T5 FLASH BIN file\r\n"); |
Just4pLeisure | 6:2fbcbebed28c | 610 | printf("TF - FLASH the update file to the T5\r\n"); |
Just4pLeisure | 6:2fbcbebed28c | 611 | // printf("TF - FLASH the update file to the T5 (and write SRAM)\r\n"); |
Just4pLeisure | 6:2fbcbebed28c | 612 | // printf("Tr - Read SRAM adaption (not done).\r\n"); |
Just4pLeisure | 6:2fbcbebed28c | 613 | // printf("Tw - Write SRAM adaptation (not done).\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 614 | printf("\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 615 | printf("'ESC' - Return to Just4Trionic Main Menu\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 616 | printf("\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 617 | printf("h - Show this help menu\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 618 | printf("\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 619 | return; |
Just4pLeisure | 1:d5452e398b76 | 620 | } |
Just4pLeisure | 5:1775b4b13232 | 621 | void bdm_show_full_help() |
Just4pLeisure | 5:1775b4b13232 | 622 | { |
Just4pLeisure | 1:d5452e398b76 | 623 | printf("Just4Trionic BDM Command Menu\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 624 | printf("=============================\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 625 | printf("TD - and DUMP T5 FLASH BIN file\r\n"); |
Just4pLeisure | 6:2fbcbebed28c | 626 | printf("TF - FLASH the update file to the T5\r\n"); |
Just4pLeisure | 6:2fbcbebed28c | 627 | // printf("TF - FLASH the update file to the T5 (and write SRAM)\r\n"); |
Just4pLeisure | 6:2fbcbebed28c | 628 | // printf("Tr - Read SRAM adaption (not done).\r\n"); |
Just4pLeisure | 6:2fbcbebed28c | 629 | // printf("Tw - Write SRAM adaptation (not done).\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 630 | printf("\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 631 | printf("Adapter Commands - a\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 632 | printf("====================\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 633 | printf("av - display firmware version\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 634 | printf("as - display status of BDM pins\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 635 | printf("a1 - pull BKPT low\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 636 | printf("a2 - pull BKPT high\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 637 | printf("a3 - pull RESET low\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 638 | printf("a4 - pull RESET high\r\n"); |
Just4pLeisure | 5:1775b4b13232 | 639 | printf("a5 - pull BERR low\r\n"); |
Just4pLeisure | 5:1775b4b13232 | 640 | printf("a6 - pull BERR high\r\n"); |
Just4pLeisure | 5:1775b4b13232 | 641 | printf("a7 - make BERR an input\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 642 | printf("\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 643 | printf("MCU Management Commands - c\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 644 | printf("===========================\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 645 | printf("cS - stop MCU\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 646 | printf("cR - reset MCU\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 647 | printf("cr - run from given address\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 648 | printf(" e.g. crCAFEBABE run from address 0xcafebabe\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 649 | printf("cs - restart MCU\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 650 | printf("cb - step MCU\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 651 | printf("\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 652 | printf("MCU FLASH Commands - f\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 653 | printf("======================\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 654 | printf("fv - gets verification status (always verify)\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 655 | printf("fV - sets verification on/off (always on)\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 656 | printf("fd - DUMPs memory contents\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 657 | printf(" e.g. fdSSSSSSSSEEEEEEEE S...E... start and end addresses\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 658 | printf(" e.g. fd0000000000020000 to DUMP T5.2\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 659 | printf(" e.g. fd0000000000040000 to DUMP T5.5\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 660 | printf(" e.g. fd0000000000080000 to DUMP T7\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 661 | printf("fE - Erases entire FLASH memory\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 662 | printf(" e.g. fETTTTTTSSSSSSSSEEEEEEEE T...S...E type, start and end addresses\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 663 | printf(" e.g. fE28f0100000000000020000 erase 28F512 in T5.2\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 664 | printf(" e.g. fE28f0100000000000040000 erase 28F010 in T5.5\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 665 | printf(" e.g. fE29f0100000000000040000 erase 29F010 in T5.5 (addresses not used)\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 666 | printf(" e.g. fE29f4000000000000080000 erase 29F400 in T7 (addresses not used)\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 667 | printf("fw - writes to FLASH memory\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 668 | printf(" Write a batch of long words to flash from a start address\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 669 | printf(" followed by longwords LLLLLLLL, LLLLLLLL etc\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 670 | printf(" Send a break character to stop when doneg"); |
Just4pLeisure | 1:d5452e398b76 | 671 | printf(" e.g. fwTTTTTTSSSSSSSS T...S... type and start address\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 672 | printf(" e.g. fw28f01000004000 start at address 0x004000 T5.2/5.5\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 673 | printf(" e.g. fw29f01000004000 start at address 0x004000 T5.5 with 29F010\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 674 | printf(" e.g. fw29f40000004000 start at address 0x004000 T7\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 675 | printf("\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 676 | printf("MCU Memory Commands - m\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 677 | printf("=======================\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 678 | printf("mbAAAAAAAA - read byte from memory at 0xaaaaaaaa\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 679 | printf("mwAAAAAAAA - read word (2 bytes) from memory\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 680 | printf("mlAAAAAAAA - read long word (4 bytes) from memory\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 681 | printf("mz - dump byte from the next memory address\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 682 | printf("mx - dump word from the next memory address\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 683 | printf("mc - dump long word from the next memory address\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 684 | printf("mBAAAAAAAADD - write byte 0xdd to memory 0xaaaaaaaa\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 685 | printf("mWAAAAAAAADDDD - write word 0xdddd to memory 0xaaaaaaaa\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 686 | printf("mLAAAAAAAADDDDDDD - write long word 0xdddddddd to memory 0xaaaaaaaa\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 687 | printf("mfDD - fill byte 0xdd to next memory address\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 688 | printf("mFDDDD - fill word 0xdddd to next memory address\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 689 | printf("mMDDDDDDDD - fill long word 0xdddddddd to next memory address\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 690 | printf("\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 691 | printf("MCU Register Commands - r\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 692 | printf("=========================\r\n"); |
Just4pLeisure | 5:1775b4b13232 | 693 | printf("rd Display all registers (like BD32)\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 694 | printf("rrRR - read system register RR\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 695 | printf(" 00 - RPC, 01 - PCC, 0B - SR, 0C - USP, 0D - SSP\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 696 | printf(" 0e - SFC, 0f - DFC, 08 - ATEMP, 09 - FAR, 0a - VBR\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 697 | printf("rWRRCAFEBABE - write 0xcafebabe system register RR\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 698 | printf("raAD - read A/D register 0x00-07 D0-D7, 0x08-15 A0-A7\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 699 | printf("rAADCAFEBABE - write 0xcafebabe to A/D register \r\n"); |
Just4pLeisure | 1:d5452e398b76 | 700 | printf("\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 701 | printf("'ESC' - Return to Just4Trionic Main Menu\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 702 | printf("\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 703 | printf("H - Show this help menu\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 704 | printf("\r\n"); |
Just4pLeisure | 1:d5452e398b76 | 705 | return; |
Just4pLeisure | 1:d5452e398b76 | 706 | } |