1 /**
2 * @file serdes_dss.js
3 *
4 * @brief
5 * Java Script file for DSS synchronization of DIAGNOSTIC SERDES test.
7 Example DSS script which runs a K2HK SERDES TX FIR settings sweep with PRBS scan
8 on two devices.
10 Example assumes a board scenario where two devices Lane0 and Lane1 Serdes lanes
11 are hooked up to each other as in the below diagram:
13 Device0 TX0 ----> Device1 RX0
14 Device0 TX1 ----> Device1 RX1
16 Device1 TX0 ----> Device0 RX0
17 Device1 TX1 ----> Device0 RX1
19 Each TX -> RX channel is assumed to be electrical backplane or backplane + cable.
20 No active, intermediary, devices (switches, or re-timers) are assumed in the channel.
22 DSS script loads binaries onto two SoC. Each binary is then synchronized at key
23 steps such that the RX error count of a given TX setting set can be measured.
25 Run on a dual K2HK platform being controlled by a single CCS emulation session
26 Tested out on the 6630K2E dual VDB setup
28 Prerequisite: serdes_dss_prbs_k2k.bat invokes this .js file. Please use serdes_dss_prbs_k2k.bat to run PRBS test
29 *
30 * \par
31 * ============================================================================
32 * @n (C) Copyright 2015, Texas Instruments, Inc.
33 *
34 * Redistribution and use in source and binary forms, with or without
35 * modification, are permitted provided that the following conditions
36 * are met:
37 *
38 * Redistributions of source code must retain the above copyright
39 * notice, this list of conditions and the following disclaimer.
40 *
41 * Redistributions in binary form must reproduce the above copyright
42 * notice, this list of conditions and the following disclaimer in the
43 * documentation and/or other materials provided with the
44 * distribution.
45 *
46 * Neither the name of Texas Instruments Incorporated nor the names of
47 * its contributors may be used to endorse or promote products derived
48 * from this software without specific prior written permission.
49 *
50 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
51 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
52 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
53 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
54 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
55 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
56 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
57 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
58 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
59 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
60 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
61 *
62 */
64 importPackage(Packages.com.ti.debug.engine.scripting)
65 importPackage(Packages.com.ti.ccstudio.scripting.environment)
66 importPackage(Packages.java.lang)
67 importPackage(java.awt)
68 importPackage(java.io)
69 importPackage(java.net)
70 importPackage(java.util)
72 /* Major variables that will need to be modified to match a given CCS/DSS environment on the host PC */
73 /* serdes_dss_prbs_k2k.bat will set the %PDK_INSTALL_PATH% environment variable */
74 var CFG_LOADER_BASE = java.lang.System.getenv("PDK_INSTALL_PATH");
75 var pathLog = CFG_LOADER_BASE + "/ti/diag/serdes_diag/serdes_log_path.xml";
76 var pathXSL = CFG_LOADER_BASE + "/ti/diag/serdes_diag/serdes_xsl_path.xsl";
77 /* Point to the Dual Board Target Configuration File that you have created.
78 Instructions on how to create Dual Board Target Config are shown in Section 9 of serdes_diag\docs\Serdes_Diag_User_Guide.pdf*/
79 var pathCCXML = "C:/K2HK_EVM2EVM.ccxml";
80 /* Point to the executables to run on Board 0 and Board 1 respectively */
81 var pathDSP0 = CFG_LOADER_BASE + "/MyExampleProjects/serdes_diag_prbs_K2KC66ExampleProject/Debug/serdes_diag_prbs_K2KC66ExampleProject.out";
82 var pathDSP1 = CFG_LOADER_BASE + "/MyExampleProjects/serdes_diag_prbs_K2KC66ExampleProject/Debug/serdes_diag_prbs_K2KC66ExampleProject.out";
86 /* DSP core synchronization variables */
87 var dss_lock_key = 0xDEADBEEF;
88 var dss_unlock_key = 0xBEEFFACE;
90 var dss_stall_flag_set = 0xCAFECAFE;
91 var dss_stall_flag_clear = 0xCAFEDEAD;
92 var dss_stall_flag_device0 = 0xCAFEDEAD; /* assume an unstalled device */
93 var dss_stall_flag_device1 = 0xCAFEDEAD; /*assume an unstalled device */
95 var dss_test_complete_flag_set = 0xA5A5A5A5;
97 var dss_test_complete_flag_device0 = 0xDEADBEEF; //assume an unfinished test cycle */
98 var dss_test_complete_flag_device1 = 0xDEADBEEF; //assume an unfinished test cycle */
100 /* CCSv7 naming convention */
101 var sessionName0 = "Texas Instruments XDS2xx USB Onboard Debug Probe_0/C66xx_0";
102 var sessionName1 = "Texas Instruments XDS2xx USB Onboard Debug Probe_1/C66xx_0";
104 /* For CCSv5, note that the emulator naming convention will be different */
105 /* var sessionName0 = "Texas Instruments XDS2xx USB Onboard Emulator_0/C66xx_0"; */
106 /* var sessionName1 = "Texas Instruments XDS2xx USB Onboard Emulator_1/C66xx_0"; */
109 function MemRead(activeDS, addr, wordCnt)
110 {
111 var result;
112 var successful = 0;
114 if (!activeDS.target.isHalted()){
115 /* This command halts the target in order to allow memory reads */
116 activeDS.target.halt();
117 }
119 while (! successful) {
120 try {
121 result = activeDS.memory.readData(0, addr, 32, wordCnt);
122 successful = 1;
123 }
124 catch(err)
125 {
126 print ("Memory read failed! Sleep and retry.\n");
127 java.lang.Thread.sleep(1000);
128 }
129 }
131 activeDS.target.runAsynch();
132 return result;
133 }
136 function MemWrite(activeDS, dst, src, wordCnt)
137 {
138 var successful = 0;
140 if (!activeDS.target.isHalted()){
141 /* This command halts the target in order to allow memory writes */
142 activeDS.target.halt();
143 }
145 while (! successful) {
146 try {
147 activeDS.memory.writeData(0, dst, src, wordCnt);
148 successful = 1;
149 }
150 catch(err)
151 {
152 print ("Memory write failed! Sleep and retry.n");
153 java.lang.Thread.sleep(1000);
154 }
155 }
156 activeDS.target.runAsynch();
157 }
161 function Synchronized_PRBS_Test(script)
162 {
163 script.traceWrite("DSS: Serdes PRBS testing...");
165 /* Setup emulation session, load .out files and start execution of each DSP */
166 script.traceWrite("DSS: Loading DSP program to 1st Keystone2 DSP core...");
167 session0.memory.loadProgram(pathDSP0);
168 script.traceWrite("DSS: Done!");
170 script.traceWrite("DSS: Loading DSP program to 2nd Keystone2 DSP core...");
171 session1.memory.loadProgram(pathDSP1);
172 script.traceWrite("DSS: Done!");
175 var dss_test_complete_flag_addr = session1.symbol.getAddress("serdes_diag_dss_test_complete_flag");
177 var dss_stall_flag3_addr_device0 = session0.symbol.getAddress("serdes_diag_dss_stall_flag3");
178 var dss_stall_flag3_addr_device1 = session1.symbol.getAddress("serdes_diag_dss_stall_flag3");
180 var dss_stall_flag1_addr = session1.symbol.getAddress("serdes_diag_dss_stall_flag1");
181 var dss_stall_flag2_addr = session1.symbol.getAddress("serdes_diag_dss_stall_flag2");
182 var dss_stall_flag3_addr = session1.symbol.getAddress("serdes_diag_dss_stall_flag3");
184 var dss_device_num_0_addr = session1.symbol.getAddress("diag_serdes_device_num");
185 var dss_device_num_1_addr = session1.symbol.getAddress("diag_serdes_device_num");
187 session0.memory.writeWord(0,dss_device_num_0_addr, 0);
188 session1.memory.writeWord(0,dss_device_num_1_addr, 1);
190 session0.breakpoint.removeAll();
191 script.traceWrite("DSS: Removed all breakpoints on 1st Keystone2 DSPs...");
193 session1.breakpoint.removeAll();
194 script.traceWrite("DSS: Removed all breakpoints on 2nd Keystone2 DSPs...");
196 script.traceWrite("DSS: Executing program on 2nd Keystone2 DSPs...");
197 session1.target.runAsynch();
199 script.traceWrite("DSS: Executing program on 1st Keystone2 DSPs...");
200 session0.target.runAsynch();
202 script.traceWrite("DSS: Execution started...");
204 java.lang.Thread.sleep(1000);
206 /*
207 Start polling for the dss_stall_flag_set from both devices
208 Start polling for the dss_test_complete_flag_set from both devices
210 If test is complete, we are done with test loop
211 If stall is detected on both devices, devices are synchronized and should be unlocked to run
213 */
216 while( (dss_test_complete_flag_device0 != dss_test_complete_flag_set) && (dss_test_complete_flag_device1 != dss_test_complete_flag_set) ){
218 /* poll for the stall flag0 being set on both devices */
219 dss_stall_flag3_device0 = session0.memory.readWord(0,dss_stall_flag3_addr_device0);
220 dss_stall_flag3_device1 = session1.memory.readWord(0,dss_stall_flag3_addr_device1);
222 if( (dss_stall_flag3_device0 == dss_stall_flag_set) && (dss_stall_flag3_device1 == dss_stall_flag_set) ){ /*stalled at flag3 */
223 /* set the unlock key0 on both devices since they are both stalled waiting for the DSS to unlock */
224 java.lang.Thread.sleep(1000);
226 server.simultaneous.halt(); /* Halt all CPUs */
228 session0.memory.writeWord(0,dss_stall_key0_addr, dss_unlock_key);
229 session1.memory.writeWord(0,dss_stall_key0_addr, dss_unlock_key);
231 dss_stall_flag_device0 = dss_stall_flag_clear; /*clear flag for next iteration */
232 dss_stall_flag_device1 = dss_stall_flag_clear; /*clear flag for next iteration */
234 server.simultaneous.runAsynch(); /* Run all CPUs */
235 }
237 /* poll for the test complete flag being set on both devices */
238 dss_test_complete_flag_device0 = session0.memory.readWord(0,dss_test_complete_flag_addr);
239 dss_test_complete_flag_device1 = session1.memory.readWord(0,dss_test_complete_flag_addr);
241 script.traceWrite("dss_test_complete_flag_device0: 0x" + dss_test_complete_flag_device0.toString(16).toUpperCase());
242 script.traceWrite("dss_test_complete_flag_device1: 0x" + dss_test_complete_flag_device1.toString(16).toUpperCase());
244 java.lang.Thread.sleep(1000);
245 }
246 }
248 var script = ScriptingEnvironment.instance();
249 script.traceBegin(pathLog, pathXSL);
250 script.traceWrite("Serdes Diag Test Started");
252 var server = script.getServer("DebugServer.1")
253 server.setConfig(pathCCXML);
254 script.traceWrite("DebugServer configured");
256 script.traceWrite("Opening debug sessions for DSP cores...");
257 var session0 = server.openSession(sessionName0);
258 var session1 = server.openSession(sessionName1);
259 script.traceWrite("DebugSession opened");
261 script.traceWrite("Connecting to DSP cores...");
262 session0.target.connect();
263 session1.target.connect();
264 script.traceWrite("Target connected!");
266 script.traceWrite("Resetting target DSP cores!");
267 session0.target.reset();
268 session1.target.reset();
270 java.lang.Thread.sleep(2000);
272 /* As shown below, the PLL can be programmed to run at higher speeds by enabling the corresponding EVM GEL files */
273 session0.expression.evaluate("GEL_LoadGel(\"C:/ti/ccsv7/ccs_base/emulation/boards/xtcievmk2x/gel/xtcievmk2x.gel\")");
274 session1.expression.evaluate("GEL_LoadGel(\"C:/ti/ccsv7/ccs_base/emulation/boards/xtcievmk2x/gel/xtcievmk2x.gel\")");
276 //script.traceWrite("Executing GEL functions...");
277 session0.expression.evaluate("CORE_PLL_INIT_122_88MHZ_to_1_2GHz()");
278 session1.expression.evaluate("CORE_PLL_INIT_122_88MHZ_to_1_2GHz()");
281 Synchronized_PRBS_Test(script);
283 script.traceWrite("Serdes Diag Test Complete");
284 script.traceEnd();
285 quit();