011a9ec25a11cf3cd49594d95e3735228077f1b0
[processor-sdk/pdk.git] / packages / ti / drv / sciclient / tools / ccsLoadDmsc / j7200 / launch.js
1 /*
2  * Copyright (c) 2018-2019, Texas Instruments Incorporated
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * *  Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  *
12  * *  Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * *  Neither the name of Texas Instruments Incorporated nor the names of
17  *    its contributors may be used to endorse or promote products derived
18  *    from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
33 //
34 //File Name: launch_j7200.js
35 //Description:
36 //   Launch the DMSC firmware and board configuration from R5F.
37 //
38 //Usage:
39 //
40 //From CCS Scripting console
41 //  1. loadJSFile "C:\\ti\\launch_j7200.js"
42 //
43 //Note:
44 //  1. Search for "edit this" to look at changes that need to be edited
45 //     for your usage.
46 //
49 //<!!!!!! EDIT THIS !!!!!>
50 // Set this to 1 to allow loading the GEL files directly from the ccxml file.
51 disableGelLoad = 0;
52 // Set to 1 to use the firmware with Firewalls.
53 if (disableGelLoad == 0)
54 {
55     //Path to GEL files
56     gelFilePath = "k3-avv-repo/framework/gels/K3J7";
57 }
58 //PDK path. Edit this
59 pdkPath = "/ti/j7presi/workarea/pdk";
61 //path to board config elf
62 pathSciclient = pdkPath+"/packages/ti/drv/sciclient/tools/ccsLoadDmsc/j7200/"
63 ccs_init_elf_file = pathSciclient+"sciclient_ccs_init_mcu1_0_release.xer5f";
64 loadSciserverFlag = 1;
65 sciserver_elf_file = pathSciclient+"sciserver_testapp_mcu1_0_release.xer5f";
67 //path to sysfw bin
68 sysfw_bin = pdkPath+"/packages/ti/drv/sciclient/soc/sysfw/binaries/ti-fs-firmware-j7200-gp.bin"
70 //<!!!!!! EDIT THIS !!!!!>
72 // Import the DSS packages into our namespace to save on typing
73 importPackage(Packages.com.ti.debug.engine.scripting)
74 importPackage(Packages.com.ti.ccstudio.scripting.environment)
75 importPackage(Packages.java.lang);
76 importPackage(Packages.java.io);
78 function updateScriptVars()
79 {
80     //Open a debug session
81     dsMCU1_0 = debugServer.openSession( ".*MCU_Cortex_R5_0" );
82     dsDMSC_0 = debugServer.openSession( ".*DMSC_Cortex_M3_0" );
83 }
85 function printVars()
86 {
87     updateScriptVars();
88 }
90 function connectTargets()
91 {
92     /* Set timeout of 20 seconds */
93     script.setScriptTimeout(200000);
94     updateScriptVars();
95     sysResetVar=dsDMSC_0.target.getResetType(1);
96     sysResetVar.issueReset();
97     print("Connecting to DMSC_Cortex_M3_0!");
98     // Connect targets
99     dsDMSC_0.target.connect();
100     print("Fill R5F ATCM memory...");
101     dsDMSC_0.memory.fill(0x61000000, 0, 0x8000, 0);
102     print("Writing While(1) for R5F")
103     dsDMSC_0.memory.writeWord(0, 0x61000000, 0xE59FF004); /* ldr        pc, [pc, #4] */
104     dsDMSC_0.memory.writeWord(0, 0x61000004, 0x38);       /* Address 0x38 */
105     dsDMSC_0.memory.writeWord(0, 0x61000038, 0xEAFFFFFE) /* b          #0x38 */
106     print("Loading DMSC Firmware ... " + sysfw_bin);
107     // Load the DMSC firmware
108     dsDMSC_0.memory.loadRaw(0, 0x40000, sysfw_bin, 32, false);
109     print("DMSC Firmware Load Done...");
110     // Set Stack pointer and Program Counter
111     stackPointer = dsDMSC_0.memory.readWord(0, 0x40000);
112     progCounter = dsDMSC_0.memory.readWord(0, 0x40004);
113     dsDMSC_0.memory.writeRegister("SP", stackPointer);
114     dsDMSC_0.memory.writeRegister("PC", progCounter);
115     print( "DMSC Firmware run starting now...");
116     // Run the DMSC firmware
117     dsDMSC_0.target.runAsynch();
118     print("Connecting to MCU Cortex_R5_0!");
120     // Connect the MCU R5F
121     dsMCU1_0.target.connect();
122     // This is done to support other boot modes. OSPI is the most stable.
123     // MMC is not always stable.
124     bootMode = dsMCU1_0.memory.readWord(0, 0x43000030) & 0xF8;
125     print (" WKUP Boot Mode is " + bootMode);
126     mainBootMode = dsMCU1_0.memory.readWord(0, 0x100030) & 0xFF;
127     print (" Main Boot Mode is " + mainBootMode);
128     if ((bootMode != 0x38) || (mainBootMode != 0x11))
129     {
130         print("Disable MCU Timer for ROM clean up");
131         dsMCU1_0.memory.writeWord(0, 0x40400010, 0x1); /* Write reset to MCU Timer 0. Left running by ROM */
132         dsMCU1_0.memory.writeWord(0, 0x40F80430, 0xFFFFFFFF); /* Clear Pending Interrupts */
133         dsMCU1_0.memory.writeWord(0, 0x40F80018, 0x0); /* Clear Pending Interrupts */
134         // Reset the R5F to be in clean state.
135         dsMCU1_0.target.reset();
136         // Load the board configuration init file.
137         dsMCU1_0.expression.evaluate('GEL_Load("'+ ccs_init_elf_file +'")');
138         // Run Asynchronously
139         dsMCU1_0.target.runAsynch();
140         print ("Running Async");
141         // Halt the R5F and re-run.
142         dsMCU1_0.target.halt();
143     }
144     // Reset the R5F to be in clean state.
145     dsMCU1_0.target.reset();
146     print("Running the board configuration initialization from R5!");
147     // Load the board configuration init file.
148     dsMCU1_0.memory.loadProgram(ccs_init_elf_file);
149     // Halt the R5F and re-run.
150     dsMCU1_0.target.halt();
151     // Run Synchronously for the executable to finish
152     dsMCU1_0.target.run();
153     dsMCU1_0.target.halt();
154     dsMCU1_0.target.reset();
157     dsMCU1_0.target.restart();
158     /* Run the DDR Configuration */
159     print("J7200 Running the DDR configuration... Wait till it completes!");
160     dsDMSC_0.target.halt();
161     dsDMSC_0.expression.evaluate("J7ES_LPDDR4_Config_Late()");
162     dsDMSC_0.target.runAsynch();
165 function disconnectTargets()
167     updateScriptVars();
168     // Reset the R5F to be in clean state.
169     dsMCU1_0.target.reset();
170     // Disconnect targets
171     dsDMSC_0.target.disconnect();
174 function sampleDDRCheck ()
176     print("Running DDR Memory Checks....");
177     dsMCU1_0.memory.fill (0x80000000, 0, 1024, 0xA5A5A5A5);
178     ar = dsMCU1_0.memory.readWord(0, 0x80000000, 1024);
179     fail = 0 
180     for (i = 0; i < ar.length; i++) {
181             x = ar[i]; 
182             if (x != 0xA5A5A5A5)
183             {   
184                 fail = 1;
185             }
186         } 
187     if (fail == 1)
188     {   
189         print ("0x80000000: DDR memory sample check failed !!");
190     }
191     dsMCU1_0.memory.fill (0x81000000, 0, 1024, 0x5A5A5A5A);
192     ar = dsMCU1_0.memory.readWord(0, 0x81000000, 1024);
193     fail = 0 
194     for (i = 0; i < ar.length; i++) {
195             x = ar[i]; 
196             if (x != 0x5a5a5a5a)
197             {   
198                 fail = 1;
199             }
200         } 
201     if (fail == 1)
202     {   
203         print ("0x81000000: DDR memory sample check failed !!");
204     }
208 function loadSciserver()
210     updateScriptVars();
211     print("######################################################################################");
212     print("Loading Sciserver Application on MCU1_0. This will service RM/PM messages");
213     print("If you do not want this to be loaded update the launch script to make loadSciserverFlag = 0");
214     print("If you want to load and run other cores, please run the MCU1_0 core after Sciserver is loaded. ");
215     print("######################################################################################");
216     dsMCU1_0.expression.evaluate('GEL_Load("'+ sciserver_elf_file +'")');
219 function doEverything()
221     printVars();
222     connectTargets();
223     disconnectTargets();
224     sampleDDRCheck ();
225     if (loadSciserverFlag == 1)
226     {
227         loadSciserver();
228     }
229     print("Happy Debugging!!");
232 var ds;
233 var debugServer;
234 var script;
236 // Check to see if running from within CCSv4 Scripting Console
237 var withinCCS = (ds !== undefined);
239 // Create scripting environment and get debug server if running standalone
240 if (!withinCCS)
242     // Import the DSS packages into our namespace to save on typing
243     importPackage(Packages.com.ti.debug.engine.scripting);
244     importPackage(Packages.com.ti.ccstudio.scripting.environment);
245     importPackage(Packages.java.lang);
247     // Create our scripting environment object - which is the main entry point into any script and
248     // the factory for creating other Scriptable ervers and Sessions
249     script = ScriptingEnvironment.instance();
251     // Get the Debug Server and start a Debug Session
252     debugServer = script.getServer("DebugServer.1");
254 else // otherwise leverage existing scripting environment and debug server
256     debugServer = ds;
257     script = env;
260 doEverything();