quick analysis of power domains and modules
authorBrad Griffis <bgriffis@ti.com>
Sat, 14 Nov 2015 01:38:25 +0000 (19:38 -0600)
committerBrad Griffis <bgriffis@ti.com>
Sat, 14 Nov 2015 01:38:25 +0000 (19:38 -0600)
This file should be useful for debugging suspend/resume issues when
trying to enter DeepSleep0 with AM335x.

See this page for more info:

http://processors.wiki.ti.com/index.php/Debugging_AM335x_Suspend-Resume_Issues

am335x-ds0-analysis.dss [new file with mode: 0644]

diff --git a/am335x-ds0-analysis.dss b/am335x-ds0-analysis.dss
new file mode 100644 (file)
index 0000000..941060e
--- /dev/null
@@ -0,0 +1,124 @@
+/*\r
+ * Copyright (c) 2006-2014, Texas Instruments Incorporated\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ *\r
+ * *  Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ *\r
+ * *  Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ *\r
+ * *  Neither the name of Texas Instruments Incorporated nor the names of\r
+ *    its contributors may be used to endorse or promote products derived\r
+ *    from this software without specific prior written permission.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\r
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\r
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\r
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\r
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\r
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\r
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\r
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\r
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+ */\r
+\r
+function d2h(d) {return ("00000000" + (d).toString(16)).slice(-8);}\r
+\r
+function printRegisterValue(ds, name, addr)\r
+{\r
+       value = debugSessionDAP.memory.readWord(0,addr,false);\r
+       value_string = d2h(value);\r
+       file.write(name + " = 0x" + value_string + "\n");\r
+       return value; // return the register value for interrogation\r
+}\r
+\r
+// Build a filename that includes date/time\r
+var today = new Date();\r
+var year4digit = today.getFullYear();\r
+var month2digit = ("0" + (today.getMonth()+1)).slice(-2);\r
+var day2digit = ("0" + today.getDate()).slice(-2);\r
+var hour2digit = ("0" + today.getHours()).slice(-2);\r
+var minutes2digit = ("0" + today.getMinutes()).slice(-2);\r
+var seconds2digit = ("0" + today.getSeconds()).slice(-2);\r
+var filename_date = '_' + year4digit + '-' + month2digit + '-' + day2digit + '_' + hour2digit + minutes2digit + seconds2digit; \r
+var userHomeFolder = System.getProperty("user.home");\r
+var filename = userHomeFolder + '/Desktop/' + 'am335x-ds0-analysis' + filename_date + '.txt';\r
+\r
+debugSessionDAP = ds.openSession("*","CS_DAP_M3");\r
+\r
+try {\r
+       debugSessionDAP.target.connect();\r
+} catch (ex) {\r
+       print("\n ERROR: Could not connect to DAP_M3.\n");\r
+}\r
+\r
+file = new java.io.FileWriter(filename);\r
+\r
+\r
+var reg_val;\r
+\r
+// PRM_MPU: PM_MPU_PWRSTST \r
+reg_val = printRegisterValue(debugSessionDAP, "PRM_MPU: PM_MPU_PWRSTST", 0x44E00E04);\r
+if ( reg_val == 0 ) {\r
+       file.write("  * Cortex A8 is OFF.\n");\r
+} else {\r
+       file.write("  * ERROR: Cortex A8 is still on!\n");\r
+}\r
+\r
+// PRM_GFX: PM_GFX_PWRSTST\r
+reg_val = printRegisterValue(debugSessionDAP, "PRM_GFX: PM_GFX_PWRSTST", 0x44E01110);\r
+if ( reg_val == 0 ) {\r
+       file.write("  * SGX530 is OFF.\n");\r
+} else {\r
+       file.write("  * ERROR: SGX530 is still on!\n");\r
+}\r
+\r
+// PRM_PER: PM_PER_PWRSTST\r
+reg_val = printRegisterValue(debugSessionDAP, "PRM_PER: PM_PER_PWRSTST", 0x44E00C08);\r
+if ( reg_val == 0x00200001 ) {\r
+       file.write(" * PER domain in retention (OCMC RAM retained).\n");\r
+} else if ( reg_val&3 == 3) {\r
+       file.write("  * ERROR: PER domain still on!\n");\r
+       \r
+       // CM_PER: CM_PER_L4LS_CLKSTCTRL\r
+       reg_val = printRegisterValue(debugSessionDAP, "CM_PER: CM_PER_L4LS_CLKSTCTRL", 0x44E00000);\r
+       if ( reg_val & 1<<28 ) {file.write("  * ERROR: TIMER6 active!\n");}\r
+       if ( reg_val & 1<<27 ) {file.write("  * ERROR: TIMER5 active!\n");}\r
+       if ( reg_val & 1<<25 ) {file.write("  * ERROR: SPI active!\n");}\r
+       if ( reg_val & 1<<24 ) {file.write("  * ERROR: I2C active!\n");}\r
+       if ( reg_val & 1<<21 ) {file.write("  * ERROR: GPIO3 active!\n");}\r
+       if ( reg_val & 1<<20 ) {file.write("  * ERROR: GPIO2 active!\n");}\r
+       if ( reg_val & 1<<19 ) {file.write("  * ERROR: GPIO1 active!\n");}\r
+       if ( reg_val & 1<<17 ) {file.write("  * ERROR: LCDC active!\n");}\r
+       if ( reg_val & 1<<16 ) {file.write("  * ERROR: TIMER4 active!\n");}\r
+       if ( reg_val & 1<<15 ) {file.write("  * ERROR: TIMER3 active!\n");}\r
+       if ( reg_val & 1<<14 ) {file.write("  * ERROR: TIMER2 active!\n");}\r
+       if ( reg_val & 1<<13 ) {file.write("  * ERROR: TIMER7 active!\n");}\r
+       if ( reg_val & 1<<11 ) {file.write("  * ERROR: CAN active!\n");}\r
+       if ( reg_val & 1<<10 ) {file.write("  * ERROR: UART active!\n");}\r
+       if ( reg_val & 1<<8 ) {file.write("  * ERROR: L4LS active!\n");}\r
+       \r
+       // CM_PER: CM_PER_L3_CLKSTCTRL\r
+       reg_val = printRegisterValue(debugSessionDAP, "CM_PER: CM_PER_L3_CLKSTCTRL", 0x44E0000C);               \r
+       if ( reg_val & 1<<7 ) {file.write("  * ERROR: MCASP active!\n");}\r
+       if ( reg_val & 1<<6 ) {file.write("  * ERROR: CPTS_RFT active!\n");}    \r
+       if ( reg_val & 1<<4 ) {file.write("  * ERROR: L3 active!\n");}\r
+       if ( reg_val & 1<<3 ) {file.write("  * ERROR: MMC active!\n");}\r
+       if ( reg_val & 1<<2 ) {file.write("  * ERROR: EMIF active!\n");}\r
+} else {\r
+       file.write("  * ERROR:  Manually inspect PER domain.  Unexpected combo.\n");\r
+}\r
+\r
+file.close();\r
+print("Created file " + filename);\r
+debugSessionDAP.target.disconnect();\r
+\r