Improved robustness due to clock inspection/adjustment
authorBrad Griffis <bgriffis@ti.com>
Sat, 14 Nov 2015 01:33:23 +0000 (19:33 -0600)
committerBrad Griffis <bgriffis@ti.com>
Sat, 14 Nov 2015 01:33:23 +0000 (19:33 -0600)
1. Print a message in case where cannot connect at all. (General JTAG
issues.)

2. Initially connect to DAP_M3 to interrogate the state of DEBUGSS_CLK
and EMIF_CLK.

3. Skip analysis of EMIF registers and print message in case where EMIF
clock is disabled (e.g. just before reaching DS0).

4. In case where EMIF is alive, but DEBUGSS_CLK is disabled, temporarily
enable the clock through the DAP_M3, read the EMIF registers of
interest, and then restore DEBUGSS_CLK to its original value.

These enhancements make it much easier to use this script and avoid the
need for kernel changes or poking registers with devmem2.

am335x-ddr-analysis.dss

index 828ff3464bf9c2fd6a6874399b5c4adc4a196dd5..3aa739f7ed2a397ea5ef6ccc1f95875ad84d5c3b 100644 (file)
@@ -77,101 +77,118 @@ var filename_date = '_' + year4digit + '-' + month2digit + '-' + day2digit + '_'
 var userHomeFolder = System.getProperty("user.home");\r
 var filename = userHomeFolder + '/Desktop/' + 'am335x-ddr-analysis' + filename_date + '.txt';\r
 \r
-file = new java.io.FileWriter(filename);\r
-\r
-debugSessionDAP = ds.openSession("*","CS_DAP_DebugSS");\r
-debugSessionDAP.target.connect();\r
-\r
-var reg_val;\r
+debugSessionDAP = ds.openSession("*","CS_DAP_M3");\r
 \r
-// EMIF: SDRAM_CONFIG\r
-try{\r
-reg_val = printRegisterValue(debugSessionDAP, "EMIF: SDRAM_CONFIG", 0x4C000008);\r
+try {\r
+       debugSessionDAP.target.connect();\r
 } catch (ex) {\r
-file.write(" * EMIF registers are not readable when in DS0 state\n");\r
-file.write(" * If you are attempting to enter DS0 this is normal.\n");\r
-}\r
-var is_ddr3=0;\r
-var is_ddr2=0;\r
-var is_lpddr=0;\r
-if ( (reg_val & 0xE0000000) == (0 << 29) ) {file.write("  * ERROR! Unsupported memory type (DDR1)\n");}\r
-if ( (reg_val & 0xE0000000) == (1 << 29) ) {is_lpddr=1;}\r
-if ( (reg_val & 0xE0000000) == (2 << 29) ) {is_ddr2=1;}\r
-if ( (reg_val & 0xE0000000) == (3 << 29) ) {is_ddr3=1;}\r
-if (is_ddr3 == 1) {\r
-       file.write("  * Bits 26:24 (reg_ddr_term) set for ");\r
-       if ( (reg_val & 0x07000000) == (0 << 24) ) {file.write("termination disabled (000b)\n");}\r
-       if ( (reg_val & 0x07000000) == (1 << 24) ) {file.write("RZQ/4 (001b)\n");}\r
-       if ( (reg_val & 0x07000000) == (2 << 24) ) {file.write("RZQ/2 (010b)\n");}\r
-       if ( (reg_val & 0x07000000) == (3 << 24) ) {file.write("RZQ/6 (011b)\n");}\r
-       if ( (reg_val & 0x07000000) == (4 << 24) ) {file.write("RZQ/12 (100b)\n");}\r
-       if ( (reg_val & 0x07000000) == (5 << 24) ) {file.write("RZQ/8  (101b)\n");}\r
-       if ( (reg_val & 0x07000000) == (6 << 24) ) {file.write("ERROR\n");}\r
-       if ( (reg_val & 0x07000000) == (7 << 24) ) {file.write("ERROR\n");}\r
-}\r
-if (is_ddr2 == 1) {\r
-       file.write("  * Bits 26:24 (reg_ddr_term) set for ");\r
-       if ( (reg_val & 0x07000000) == (0 << 24) ) {file.write("termination disabled (000b)\n");}\r
-       if ( (reg_val & 0x07000000) == (1 << 24) ) {file.write("75 Ohm (001b)\n");}\r
-       if ( (reg_val & 0x07000000) == (2 << 24) ) {file.write("150 Ohm (010b)\n");}\r
-       if ( (reg_val & 0x07000000) == (3 << 24) ) {file.write("50 Ohm (011b)\n");}\r
-       if ( (reg_val & 0x07000000) == (4 << 24) ) {file.write("ERROR\n");}\r
-       if ( (reg_val & 0x07000000) == (5 << 24) ) {file.write("ERROR\n");}\r
-       if ( (reg_val & 0x07000000) == (6 << 24) ) {file.write("ERROR\n");}\r
-       if ( (reg_val & 0x07000000) == (7 << 24) ) {file.write("ERROR\n");}\r
-}\r
-if (is_ddr3 == 1) {\r
-       file.write("  * Bits 19:18 (reg_sdram_drive) set for ");\r
-       if ( (reg_val & 0x000C0000) == (0 << 18) ) {file.write("RZQ/6 (00b)\n");}\r
-       if ( (reg_val & 0x000C0000) == (1 << 18) ) {file.write("RZQ/7 (01b)\n");}\r
-       if ( (reg_val & 0x000C0000) == (2 << 18) ) {file.write("ERROR (10b)\n");}\r
-       if ( (reg_val & 0x000C0000) == (3 << 18) ) {file.write("ERROR (11b)\n");}\r
-}\r
-if (is_ddr2 == 1) {\r
-       file.write("  * Bits 19:18 (reg_sdram_drive) set for ");\r
-       if ( (reg_val & 0x000C0000) == (0 << 18) ) {file.write("normal drive (00b)\n");}\r
-       if ( (reg_val & 0x000C0000) == (1 << 18) ) {file.write("weak drive (01b)\n");}\r
-       if ( (reg_val & 0x000C0000) == (2 << 18) ) {file.write("ERROR (10b)\n");}\r
-       if ( (reg_val & 0x000C0000) == (3 << 18) ) {file.write("ERROR (11b)\n");}\r
-}\r
-if (is_lpddr == 1) {\r
-       file.write("  * Bits 19:18 (reg_sdram_drive) set for ");\r
-       if ( (reg_val & 0x000C0000) == (0 << 18) ) {file.write("full strength (00b)\n");}\r
-       if ( (reg_val & 0x000C0000) == (1 << 18) ) {file.write("half strength (01b)\n");}\r
-       if ( (reg_val & 0x000C0000) == (2 << 18) ) {file.write("quarter strength (10b)\n");}\r
-       if ( (reg_val & 0x000C0000) == (3 << 18) ) {file.write("eighth strength (11b)\n");}\r
+       print("\n ERROR: Could not connect to DAP_M3.\n");\r
 }\r
 \r
-// EMIF: PWR_MGMT_CTRL\r
-try{\r
-reg_val = printRegisterValue(debugSessionDAP, "EMIF: PWR_MGMT_CTRL", 0x4C000038);\r
-} catch (ex) {\r
-file.write(" * EMIF registers are not readable when in DS0 state\n");\r
-file.write(" * If you are attempting to enter DS0 this is normal.\n");\r
-}\r
-if ( (reg_val & 0xF0) < 0x90 ) {\r
-       file.write(" * ERROR: Bits 7:4 (reg_sr_tim) are in violation of Maximum Self-Refresh Command Limit\n");\r
-       file.write(" * Please see the silicon errata for more details.\n");\r
-}\r
+var original_CM_WKUP_DEBUGSS_CLKCTRL = debugSessionDAP.memory.readWord(0,0x44e00414,false);\r
+var original_CM_PER_L3_CLKSTCTRL = debugSessionDAP.memory.readWord(0,0x44E0000C,false);\r
 \r
-// DDR PHY: DDR_PHY_CTRL_1\r
-try{\r
-reg_val = printRegisterValue(debugSessionDAP, "DDR PHY: DDR_PHY_CTRL_1", 0x4C0000E4);\r
-} catch (ex) {\r
-file.write(" * EMIF registers are not readable when in DS0 state\n");\r
-file.write(" * If you are attempting to enter DS0 this is normal.\n");\r
-}\r
-if ( (reg_val & 1<<20) == 0 ) {file.write("  * WARNING: reg_phy_enable_dynamic_pwrdn disabled.\n");}\r
-file.write("  * Bits 9:8 (reg_phy_rd_local_odt) configured as ");\r
-if ( (reg_val & 0x300) == (0 << 8) ) {file.write("no termination (00b)\n");}\r
-if ( (reg_val & 0x300) == (1 << 8) ) {file.write("no termination (01b)\n");}\r
-if ( (reg_val & 0x300) == (2 << 8) ) {file.write("full thevenin termination\n");}\r
-if ( (reg_val & 0x300) == (3 << 8) ) {file.write("half thevenin termination\n");}\r
+file = new java.io.FileWriter(filename);\r
 \r
-// Close (Main) DAP session and use M3 DAP to view Control Registers\r
-debugSessionDAP.target.disconnect();\r
-debugSessionDAP = ds.openSession("*","CS_DAP_M3");\r
-debugSessionDAP.target.connect();\r
+// Only try to read EMIF registers if EMIF clock is enabled\r
+if (original_CM_PER_L3_CLKSTCTRL & 1<<2) {\r
+\r
+       // CM_WKUP_DEBUGSS_CLKCTRL[MODULEMODE] = ENABLED\r
+       debugSessionDAP.expression.evaluate(\r
+               "*((unsigned int*) 0x44e00414 ) |= 0x2;");\r
+\r
+       debugSessionDAP.target.disconnect();  // disconnect from DAP_M3\r
+       \r
+       // Connect to DAP_DebugSS for L3 visibility (EMIF regs)\r
+       debugSessionDAP = ds.openSession("*","CS_DAP_DebugSS");\r
+       debugSessionDAP.target.connect();\r
+       \r
+       var reg_val;\r
+       \r
+       // EMIF: SDRAM_CONFIG\r
+       reg_val = printRegisterValue(debugSessionDAP, "EMIF: SDRAM_CONFIG", 0x4C000008);\r
+\r
+       var is_ddr3=0;\r
+       var is_ddr2=0;\r
+       var is_lpddr=0;\r
+       if ( (reg_val & 0xE0000000) == (0 << 29) ) {file.write("  * ERROR! Unsupported memory type (DDR1)\n");}\r
+       if ( (reg_val & 0xE0000000) == (1 << 29) ) {is_lpddr=1;}\r
+       if ( (reg_val & 0xE0000000) == (2 << 29) ) {is_ddr2=1;}\r
+       if ( (reg_val & 0xE0000000) == (3 << 29) ) {is_ddr3=1;}\r
+       if (is_ddr3 == 1) {\r
+               file.write("  * Bits 26:24 (reg_ddr_term) set for ");\r
+               if ( (reg_val & 0x07000000) == (0 << 24) ) {file.write("termination disabled (000b)\n");}\r
+               if ( (reg_val & 0x07000000) == (1 << 24) ) {file.write("RZQ/4 (001b)\n");}\r
+               if ( (reg_val & 0x07000000) == (2 << 24) ) {file.write("RZQ/2 (010b)\n");}\r
+               if ( (reg_val & 0x07000000) == (3 << 24) ) {file.write("RZQ/6 (011b)\n");}\r
+               if ( (reg_val & 0x07000000) == (4 << 24) ) {file.write("RZQ/12 (100b)\n");}\r
+               if ( (reg_val & 0x07000000) == (5 << 24) ) {file.write("RZQ/8  (101b)\n");}\r
+               if ( (reg_val & 0x07000000) == (6 << 24) ) {file.write("ERROR\n");}\r
+               if ( (reg_val & 0x07000000) == (7 << 24) ) {file.write("ERROR\n");}\r
+       }\r
+       if (is_ddr2 == 1) {\r
+               file.write("  * Bits 26:24 (reg_ddr_term) set for ");\r
+               if ( (reg_val & 0x07000000) == (0 << 24) ) {file.write("termination disabled (000b)\n");}\r
+               if ( (reg_val & 0x07000000) == (1 << 24) ) {file.write("75 Ohm (001b)\n");}\r
+               if ( (reg_val & 0x07000000) == (2 << 24) ) {file.write("150 Ohm (010b)\n");}\r
+               if ( (reg_val & 0x07000000) == (3 << 24) ) {file.write("50 Ohm (011b)\n");}\r
+               if ( (reg_val & 0x07000000) == (4 << 24) ) {file.write("ERROR\n");}\r
+               if ( (reg_val & 0x07000000) == (5 << 24) ) {file.write("ERROR\n");}\r
+               if ( (reg_val & 0x07000000) == (6 << 24) ) {file.write("ERROR\n");}\r
+               if ( (reg_val & 0x07000000) == (7 << 24) ) {file.write("ERROR\n");}\r
+       }\r
+       if (is_ddr3 == 1) {\r
+               file.write("  * Bits 19:18 (reg_sdram_drive) set for ");\r
+               if ( (reg_val & 0x000C0000) == (0 << 18) ) {file.write("RZQ/6 (00b)\n");}\r
+               if ( (reg_val & 0x000C0000) == (1 << 18) ) {file.write("RZQ/7 (01b)\n");}\r
+               if ( (reg_val & 0x000C0000) == (2 << 18) ) {file.write("ERROR (10b)\n");}\r
+               if ( (reg_val & 0x000C0000) == (3 << 18) ) {file.write("ERROR (11b)\n");}\r
+       }\r
+       if (is_ddr2 == 1) {\r
+               file.write("  * Bits 19:18 (reg_sdram_drive) set for ");\r
+               if ( (reg_val & 0x000C0000) == (0 << 18) ) {file.write("normal drive (00b)\n");}\r
+               if ( (reg_val & 0x000C0000) == (1 << 18) ) {file.write("weak drive (01b)\n");}\r
+               if ( (reg_val & 0x000C0000) == (2 << 18) ) {file.write("ERROR (10b)\n");}\r
+               if ( (reg_val & 0x000C0000) == (3 << 18) ) {file.write("ERROR (11b)\n");}\r
+       }\r
+       if (is_lpddr == 1) {\r
+               file.write("  * Bits 19:18 (reg_sdram_drive) set for ");\r
+               if ( (reg_val & 0x000C0000) == (0 << 18) ) {file.write("full strength (00b)\n");}\r
+               if ( (reg_val & 0x000C0000) == (1 << 18) ) {file.write("half strength (01b)\n");}\r
+               if ( (reg_val & 0x000C0000) == (2 << 18) ) {file.write("quarter strength (10b)\n");}\r
+               if ( (reg_val & 0x000C0000) == (3 << 18) ) {file.write("eighth strength (11b)\n");}\r
+       }\r
+       \r
+       // EMIF: PWR_MGMT_CTRL\r
+       reg_val = printRegisterValue(debugSessionDAP, "EMIF: PWR_MGMT_CTRL", 0x4C000038);\r
+       if ( (reg_val & 0xF0) < 0x90 ) {\r
+               file.write(" * ERROR: Bits 7:4 (reg_sr_tim) are in violation of Maximum Self-Refresh Command Limit\n");\r
+               file.write(" * Please see the silicon errata for more details.\n");\r
+       }\r
+       \r
+       // DDR PHY: DDR_PHY_CTRL_1\r
+       reg_val = printRegisterValue(debugSessionDAP, "DDR PHY: DDR_PHY_CTRL_1", 0x4C0000E4);\r
+       if ( (reg_val & 1<<20) == 0 ) {file.write("  * WARNING: reg_phy_enable_dynamic_pwrdn disabled.\n");}\r
+       file.write("  * Bits 9:8 (reg_phy_rd_local_odt) configured as ");\r
+       if ( (reg_val & 0x300) == (0 << 8) ) {file.write("no termination (00b)\n");}\r
+       if ( (reg_val & 0x300) == (1 << 8) ) {file.write("no termination (01b)\n");}\r
+       if ( (reg_val & 0x300) == (2 << 8) ) {file.write("full thevenin termination\n");}\r
+       if ( (reg_val & 0x300) == (3 << 8) ) {file.write("half thevenin termination\n");}\r
+       \r
+       // Close (Main) DAP session and use M3 DAP to view Control Registers\r
+       debugSessionDAP.target.disconnect();\r
+       debugSessionDAP = ds.openSession("*","CS_DAP_M3");\r
+       debugSessionDAP.target.connect();\r
+       \r
+       // Restore CM_WKUP_DEBUGSS_CLKCTRL[MODULEMODE]\r
+       if ( (original_CM_WKUP_DEBUGSS_CLKCTRL & 3) == 0 ) {\r
+               debugSessionDAP.memory.writeWord(0,0x44e00414,original_CM_WKUP_DEBUGSS_CLKCTRL);\r
+       }\r
+} else {\r
+       file.write("Skipping read of EMIF registers since EMIF clock disabled.\n");\r
+       file.write(" * EMIF registers are not readable when in DS0 state\n");\r
+       file.write(" * If you are attempting to enter DS0 this is normal.\n");\r
+}\r
 \r
 // CONTROL: DDR_CMD0_IOCTRL\r
 reg_val = printRegisterValue(debugSessionDAP, "CONTROL: DDR_CMD0_IOCTRL", 0x44E11404);\r
@@ -345,3 +362,17 @@ file.close();
 print("Created file " + filename);\r
 debugSessionDAP.target.disconnect();\r
 \r
+\r
+\r
+//****************************************************************************\r
+// getErrorCode\r
+//****************************************************************************\r
+function getErrorCode(exception)\r
+{\r
+   var ex2 = exception.javaException;\r
+   if (ex2 instanceof Packages.com.ti.ccstudio.scripting.environment.ScriptingException)\r
+   {\r
+      return ex2.getErrorID();\r
+   }\r
+   return 0;\r
+}\r