Sophie Dexter
/
Just4Trionic
Just4Trionic - CAN and BDM FLASH programmer for Saab cars
Diff: bdm.cpp
- Revision:
- 5:1775b4b13232
- Parent:
- 4:682d96ff6d79
- Child:
- 6:2fbcbebed28c
--- a/bdm.cpp Wed Sep 11 11:55:51 2013 +0000 +++ b/bdm.cpp Sat Apr 25 17:07:08 2015 +0000 @@ -38,6 +38,10 @@ #define CMD_BKPTHIGH '2' ///< pull BKPT high #define CMD_RESETLOW '3' ///< pull RESET low #define CMD_RESETHIGH '4' ///< pull RESET high +#define CMD_BERR_LOW '5' ///< pull BERR low +#define CMD_BERR_HIGH '6' ///< pull BERR high +#define CMD_BERR_INPUT '7' ///< make BERR an input + #define CMDGROUP_MCU 'c' ///< target MCU management commands #define CMD_STOPCHIP 'S' ///< stop @@ -72,6 +76,7 @@ #define CMD_WRITESYSREG 'W' ///< write system register #define CMD_READADREG 'a' ///< read A/D register #define CMD_WRITEADREG 'A' ///< write A/D register +#define CMD_DISPLAYREGS 'd' ///< BD32 like display all registers #define CMDGROUP_TRIONIC 'T' #define CMD_TRIONICDUMP 'D' ///< dumps memory contents @@ -99,7 +104,8 @@ return TERM_ERR -void bdm() { +void bdm() +{ bdm_show_help(); // set up LED pins @@ -167,7 +173,8 @@ @return command flag (success / failure) */ -uint8_t execute_bdm_cmd() { +uint8_t execute_bdm_cmd() +{ uint8_t cmd_length = strlen(cmd_buffer); char cmd = *(cmd_buffer + 1); @@ -210,6 +217,18 @@ // pull RESET high case CMD_RESETHIGH: return reset_high(); + + // pull BERR low + case CMD_BERR_LOW: + return berr_low(); + + // pull BERR high + case CMD_BERR_HIGH: + return berr_high(); + + // make BERR an input + case CMD_BERR_INPUT: + return berr_input(); } break; @@ -404,16 +423,20 @@ // registers case CMDGROUP_REGISTER: // get register code - if (cmd_length < 4 || !ascii2int(&cmd_addr, cmd_buffer + 3, 1)) { + if (cmd_length == 2 && (cmd != CMD_DISPLAYREGS)) { // broken parametre return TERM_ERR; - } - - // get optional value - if (cmd_length > 4 && - !ascii2int(&cmd_value, cmd_buffer + 4, 8)) { - // broken parametre - return TERM_ERR; + } else { + if (cmd_length < 4 || !ascii2int(&cmd_addr, cmd_buffer + 3, 1)) { + // broken parametre + return TERM_ERR; + } + // get optional value + if (cmd_length > 4 && + !ascii2int(&cmd_value, cmd_buffer + 4, 8)) { + // broken parametre + return TERM_ERR; + } } switch (cmd) { @@ -448,6 +471,85 @@ return (cmd_length == 12 && adreg_write((uint8_t)cmd_addr, &cmd_value) == TERM_OK) ? TERM_OK : TERM_ERR; + + // Display all registers + case CMD_DISPLAYREGS: + printf(" D0-7"); + for (uint8_t i = 0; i < 8; i++) { + if (adreg_read(&cmd_result, i) != TERM_OK) { + return TERM_ERR; + } + printf(" %08X", cmd_result); + } +// + printf("\r\n"); + printf(" A0-7"); + for (uint8_t i = 8; i < 16; i++) { + if (adreg_read(&cmd_result, i) != TERM_OK) { + return TERM_ERR; + } + printf(" %08X", cmd_result); + } + printf("\r\n"); +// + if (sysreg_read(&cmd_result, 0x0) != TERM_OK) { + return TERM_ERR; + } + printf(" RPC %08X", cmd_result); + if (sysreg_read(&cmd_result, 0xC) != TERM_OK) { + return TERM_ERR; + } + printf(" USP %08X", cmd_result); + if (sysreg_read(&cmd_result, 0xE) != TERM_OK) { + return TERM_ERR; + } + printf(" SFC %08X SR 10S--210---XNZVC\r\n", cmd_result); +// + if (sysreg_read(&cmd_result, 0x1) != TERM_OK) { + return TERM_ERR; + } + printf(" CPC %08X", cmd_result); + if (sysreg_read(&cmd_result, 0xD) != TERM_OK) { + return TERM_ERR; + } + printf(" SSP %08X", cmd_result); + if (sysreg_read(&cmd_result, 0xF) != TERM_OK) { + return TERM_ERR; + } + printf(" DFC %08X", cmd_result); + if (sysreg_read(&cmd_result, 0xB) != TERM_OK) { + return TERM_ERR; + } + printf(" %04X ", cmd_result); + for (uint32_t i = 0; i < 16; i++) { + cmd_result & (1 << (15-i)) ? printf("1") : printf("0"); + } + printf("\r\n"); +// + if (sysreg_read(&cmd_result, 0xA)!= TERM_OK) { + return TERM_ERR; + } + printf(" VBR %08X", cmd_result); + if (sysreg_read(&cmd_result, 0x8)!= TERM_OK) { + return TERM_ERR; + } + printf(" ATEMP %08X", cmd_result); + if (sysreg_read(&cmd_result, 0x9) != TERM_OK) { + return TERM_ERR; + } + printf(" FAR %08X\r\n", cmd_result); +// + printf(" !CONNNECTED:%d", PIN_NC.read()); + printf(" POWER:%d", PIN_PWR.read()); + printf(" !RESET:%d", PIN_RESET.read()); + printf(" !BUSERR:%d", PIN_BERR.read()); + printf(" BKPT/DSCLK:%d", PIN_BKPT.read()); + printf(" FREEZE:%d", PIN_FREEZE.read()); + printf(" DSO:%d", PIN_DSO.read()); + printf(" DSI:%d", PIN_DSI.read()); + printf("\r\n"); +// + return TERM_OK; } break; @@ -482,7 +584,8 @@ return TERM_ERR; } -void bdm_show_help() { +void bdm_show_help() +{ printf("Just4Trionic BDM Command Menu\r\n"); printf("=============================\r\n"); printf("TD - and DUMP T5 FLASH BIN file\r\n"); @@ -496,7 +599,8 @@ printf("\r\n"); return; } -void bdm_show_full_help() { +void bdm_show_full_help() +{ printf("Just4Trionic BDM Command Menu\r\n"); printf("=============================\r\n"); printf("TD - and DUMP T5 FLASH BIN file\r\n"); @@ -512,6 +616,9 @@ printf("a2 - pull BKPT high\r\n"); printf("a3 - pull RESET low\r\n"); printf("a4 - pull RESET high\r\n"); + printf("a5 - pull BERR low\r\n"); + printf("a6 - pull BERR high\r\n"); + printf("a7 - make BERR an input\r\n"); printf("\r\n"); printf("MCU Management Commands - c\r\n"); printf("===========================\r\n"); @@ -563,6 +670,7 @@ printf("\r\n"); printf("MCU Register Commands - r\r\n"); printf("=========================\r\n"); + printf("rd Display all registers (like BD32)\r\n"); printf("rrRR - read system register RR\r\n"); printf(" 00 - RPC, 01 - PCC, 0B - SR, 0C - USP, 0D - SSP\r\n"); printf(" 0e - SFC, 0f - DFC, 08 - ATEMP, 09 - FAR, 0a - VBR\r\n");