Just4Trionic - CAN and BDM FLASH programmer for Saab cars

Dependencies:   mbed

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");