am335x-bbb-pru-startup.js initial commit
authorBrad Griffis <bgriffis@ti.com>
Tue, 17 Nov 2015 22:16:39 +0000 (16:16 -0600)
committerBrad Griffis <bgriffis@ti.com>
Tue, 17 Nov 2015 22:16:39 +0000 (16:16 -0600)
Script for simplifying connection to BBB PRU via JTAG

Derived from example script here:
http://processors.wiki.ti.com/index.php/Debug_Configuration_Initialization_Scripts

Documentation for this script and its usage available here:
http://processors.wiki.ti.com/index.php/PRU-ICSS_Debug_on_AM335x

am335x-bbb-pru-startup.js [new file with mode: 0644]

diff --git a/am335x-bbb-pru-startup.js b/am335x-bbb-pru-startup.js
new file mode 100644 (file)
index 0000000..52ceaa8
--- /dev/null
@@ -0,0 +1,232 @@
+/*\r
+ *\r
+ * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/ \r
+ * \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   \r
+ *    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 \r
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+ *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
+ *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
+ *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
+ *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
+ *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
+ *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
+ *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+*/\r
+\r
+\r
+//----------------------------------------------------------------------------\r
+// Purpose: Prepare the AM335x SOC so CCS can connect to the PRU as if it were\r
+// any other standalone CPU.  \r
+//\r
+// This script is only intended to be used as described in \r
+// http://processors.wiki.ti.com/index.php/PRU-ICSS_Debug_on_AM335x\r
+// In particular, it does NOT WORK as a standalone script.  \r
+//\r
+// Presumptions:\r
+// - Target system is BeagleBone Black or BeagleBone White\r
+// - The target configuration has launched\r
+// - PRU connection occurs after this script runs\r
+//----------------------------------------------------------------------------\r
+\r
+//----------------------------------------------------------------------------\r
+// Constants\r
+//----------------------------------------------------------------------------\r
+var AM335X_INPUT_EN   = 1 << 5;\r
+var AM335X_PULL_DISA  = 1 << 3;\r
+var AM335X_PIN_OUTPUT = AM335X_PULL_DISA;\r
+var AM335X_PIN_INPUT  = AM335X_INPUT_EN | AM335X_PULL_DISA;\r
+\r
+//----------------------------------------------------------------------------\r
+// Invoke the main function in this file\r
+//----------------------------------------------------------------------------\r
+startup_pru();\r
+\r
+//****************************************************************************\r
+// STARTUP_PRU\r
+//****************************************************************************\r
+function startup_pru()\r
+{\r
+   var errCode = 0;\r
+\r
+   //-------------------------------------------------------------------------\r
+   // Import the DSS packages into our namespace to save on typing\r
+   //-------------------------------------------------------------------------\r
+   importPackage(Packages.com.ti.debug.engine.scripting);\r
+   importPackage(Packages.com.ti.ccstudio.scripting.environment);\r
+   importPackage(Packages.java.lang);\r
+\r
+   //-------------------------------------------------------------------------\r
+   // Create our scripting environment object - which is the main entry\r
+   // point into any script and the factory for creating other Scriptable\r
+   // servers and Sessions\r
+   //-------------------------------------------------------------------------\r
+   script = ScriptingEnvironment.instance();\r
+\r
+   //-------------------------------------------------------------------------\r
+   // Get the Debug Server and start a Debug Session\r
+   //-------------------------------------------------------------------------\r
+   debugServer = script.getServer("DebugServer.1");\r
+\r
+   //-------------------------------------------------------------------------\r
+   // Open a session on the Debug Access Port (DAP)\r
+   //-------------------------------------------------------------------------\r
+   var debugSessionDAP = debugServer.openSession("*", "CS_DAP_M3");\r
+\r
+   //-------------------------------------------------------------------------\r
+   // Connect to the DAP.  Error check.\r
+   //-------------------------------------------------------------------------\r
+   print("Connecting to DAP");\r
+   try\r
+   {\r
+      debugSessionDAP.target.connect();\r
+   }\r
+   catch (ex)\r
+   {\r
+      throw "Aborting!";\r
+   }\r
+\r
+   //-------------------------------------------------------------------------\r
+   // Init steps for PRU carried out by the DAP\r
+   //-------------------------------------------------------------------------\r
+   print("Enabling JTAG clock");\r
+   debugSessionDAP.expression.evaluate(\r
+      "*((unsigned int*) 0x44e00414 ) |= 0x02;");\r
+\r
+   print("Configuring PRU pins");\r
+   PRU_PINMUX_Config(debugSessionDAP.memory);\r
+   \r
+   print("Enabling ICSS clock");\r
+   debugSessionDAP.expression.evaluate(\r
+      "*((unsigned int*) 0x44e00140 ) = 0x02;");\r
+   debugSessionDAP.expression.evaluate(\r
+      "*((unsigned int*) 0x44E000E8 ) = 0x02;");\r
+\r
+   print("Resetting ICSS");\r
+   debugSessionDAP.expression.evaluate(\r
+      "*((unsigned int*) 0x44E00C00 ) |= 0x2;");\r
+   debugSessionDAP.expression.evaluate(\r
+      "*((unsigned int*) 0x44E00C00 ) &= ~0x2;");\r
+\r
+   print("Done");\r
+}\r
+\r
+//****************************************************************************\r
+// PRU_PINMUX_Config\r
+//****************************************************************************\r
+function PRU_PINMUX_Config(dsDAP_mem)\r
+{\r
+   // GEL_TextOut("****** PRU Cape GPI/O PINMUX is being configured  ***** \n","Output",1,1,1);\r
+\r
+   //-------------------------------------------------------------------------\r
+   // LEDS\r
+   //-------------------------------------------------------------------------\r
+   //red led  = pru0 r30_3  ARM pin c12\r
+   dsDAP_mem.writeData(0, 0x44e1099c, AM335X_PIN_OUTPUT | 5, 32); //mode 5\r
+\r
+   //green led = pru0 r30_2 arm pin d12\r
+   dsDAP_mem.writeData(0, 0x44e10998, AM335X_PIN_OUTPUT | 5, 32); //mode 5\r
+\r
+   //blue led  = pru0 r30_0 arm pin a13\r
+   dsDAP_mem.writeData(0, 0x44e10990, AM335X_PIN_OUTPUT | 5, 32); //mode 5\r
+\r
+   //orange led = pru0 r30_1 arm pin b13 \r
+   dsDAP_mem.writeData(0, 0x44e10994, AM335X_PIN_OUTPUT | 5, 32); //mode 5\r
+\r
+   //RGB_0 led = pru1 r30_2 arm pin r3 \r
+   dsDAP_mem.writeData(0, 0x44e108AC, AM335X_PIN_OUTPUT | 5, 32); //mode 5\r
+\r
+   //RGB_1 led = pru1 r30_3 arm pin r4 \r
+   dsDAP_mem.writeData(0, 0x44e108B0, AM335X_PIN_OUTPUT | 5, 32); //mode 5\r
+\r
+   //RGB_2 led = pru0 r30_4 arm pin t1 \r
+   dsDAP_mem.writeData(0, 0x44e108B4, AM335X_PIN_OUTPUT | 5, 32); //mode 5\r
+\r
+   //-------------------------------------------------------------------------\r
+   // Switches\r
+   //-------------------------------------------------------------------------\r
+   //switch 1 = pru0 r31_5 c13\r
+   dsDAP_mem.writeData(0, 0x44e109a4, AM335X_PIN_INPUT  | 6, 32); //mode 6\r
+\r
+   //switch 2 = pru0 r31_7 a14 \r
+   dsDAP_mem.writeData(0, 0x44e109ac, AM335X_PIN_INPUT  | 6, 32); //mode 6\r
+\r
+   //-------------------------------------------------------------------------\r
+   // Audio\r
+   //-------------------------------------------------------------------------\r
+   //audio data pr1 r30_0 r1 \r
+   dsDAP_mem.writeData(0, 0x44e108a0, AM335X_PIN_OUTPUT | 5, 32); //mode 5\r
+\r
+   //audio clk pr1 r30_1 r2\r
+   dsDAP_mem.writeData(0, 0x44e108a4, AM335X_PIN_OUTPUT | 5, 32); //mode 5\r
+\r
+   //audio sync pr1 r30_2 r3\r
+   dsDAP_mem.writeData(0, 0x44e108a8, AM335X_PIN_OUTPUT | 5, 32); //mode 5\r
+\r
+   //-------------------------------------------------------------------------\r
+   // UART\r
+   //-------------------------------------------------------------------------\r
+   //Uart txd d15\r
+   dsDAP_mem.writeData(0, 0x44e10984, AM335X_PIN_OUTPUT | 5, 32); //mode 5\r
+\r
+   //UART rxd d16\r
+   dsDAP_mem.writeData(0, 0x44e10980, AM335X_PIN_INPUT  | 5, 32); //mode 5\r
+\r
+   //UART rts b17\r
+   dsDAP_mem.writeData(0, 0x44e1097C, AM335X_PIN_OUTPUT | 5, 32); //mode 5\r
+\r
+   //UART cts a17\r
+   dsDAP_mem.writeData(0, 0x44e10978, AM335X_PIN_INPUT  | 5, 32); //mode 5\r
+\r
+   //-------------------------------------------------------------------------\r
+   // LCD\r
+   //-------------------------------------------------------------------------\r
+   //lcd rs t3 \r
+   dsDAP_mem.writeData(0, 0x44e108B8, AM335X_PIN_OUTPUT | 4, 32); //mode 4\r
+\r
+   //lcd r/w t4\r
+   dsDAP_mem.writeData(0, 0x44e108BC, AM335X_PIN_OUTPUT | 4, 32); //mode 4\r
+\r
+   //lcd e v5 \r
+   dsDAP_mem.writeData(0, 0x44e108E8, AM335X_PIN_OUTPUT | 4, 32); //mode 4\r
+\r
+   //lcd data4 b16 \r
+   dsDAP_mem.writeData(0, 0x44e10958, AM335X_PIN_OUTPUT | 6, 32); //mode 6\r
+\r
+   //lcd data5 a16\r
+   dsDAP_mem.writeData(0, 0x44e1095C, AM335X_PIN_OUTPUT | 6, 32); //mode 6\r
+\r
+   //lcd data6 u5 \r
+   dsDAP_mem.writeData(0, 0x44e108e0, AM335X_PIN_OUTPUT | 4, 32); //mode 4\r
+\r
+   //lcd data7 r5 \r
+   dsDAP_mem.writeData(0, 0x44e108e4, AM335X_PIN_OUTPUT | 4, 32); //mode 4     \r
+\r
+   //-------------------------------------------------------------------------\r
+   // TEMP SENSOR\r
+   //-------------------------------------------------------------------------\r
+   //gpmc ad14 - input (GPI direct)\r
+   dsDAP_mem.writeData(0, 0x44E10838, AM335X_PIN_INPUT  | 6, 32); //mode 6\r
+\r
+   //lcd data7 - output (DIGIO)\r
+   dsDAP_mem.writeData(0, 0x44E108BC, AM335X_PIN_OUTPUT | 4, 32); //mode 4\r
+}\r