6e7db72978735adabb7c9b538fef5b708c2285a3
[sitara-dss-files/am335x-dss-files.git] / am335x-ddr-analysis.dss
1 /*\r
2  * Copyright (c) 2006-2014, Texas Instruments Incorporated\r
3  * All rights reserved.\r
4  *\r
5  * Redistribution and use in source and binary forms, with or without\r
6  * modification, are permitted provided that the following conditions\r
7  * are met:\r
8  *\r
9  * *  Redistributions of source code must retain the above copyright\r
10  *    notice, this list of conditions and the following disclaimer.\r
11  *\r
12  * *  Redistributions in binary form must reproduce the above copyright\r
13  *    notice, this list of conditions and the following disclaimer in the\r
14  *    documentation and/or other materials provided with the distribution.\r
15  *\r
16  * *  Neither the name of Texas Instruments Incorporated nor the names of\r
17  *    its contributors may be used to endorse or promote products derived\r
18  *    from this software without specific prior written permission.\r
19  *\r
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"\r
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\r
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\r
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\r
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\r
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\r
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\r
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\r
29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\r
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
31  *\r
32  */\r
33 \r
34 function d2h(d) {return ("00000000" + (d).toString(16)).slice(-8);}\r
35 \r
36 function printRegisterValue(ds, name, addr)\r
37 {\r
38         value = debugSessionDAP.memory.readWord(0,addr,false);\r
39         value_string = d2h(value);\r
40         file.write(name + " = 0x" + value_string + "\n");\r
41         return value; // return the register value for interrogation\r
42 }\r
43 \r
44 function interpret_cmd_phy_macro(value, index)\r
45 {\r
46         WD1 = (value >> (21+index)) & 1;\r
47         WD0 = (value >> (10+index)) & 1;\r
48         WD = (WD1 << 1) | WD0;\r
49         if (WD == 0) return_string = "Pullup/Pulldown disabled\n";\r
50         if (WD == 1) return_string = "Weak pullup enabled\n";\r
51         if (WD == 2) return_string = "Weak pulldown enabled\n";\r
52         if (WD == 3) return_string = "Weak keeper enabled\n"; \r
53         return return_string;\r
54 }\r
55 \r
56 function interpret_data_phy_macro(value, index)\r
57 {\r
58         WD1 = (value >> (20+index)) & 1;\r
59         WD0 = (value >> (10+index)) & 1;\r
60         WD = (WD1 << 1) | WD0;\r
61         if (WD == 0) return_string = "Pullup/Pulldown disabled\n";\r
62         if (WD == 1) return_string = "Weak pullup enabled\n";\r
63         if (WD == 2) return_string = "Weak pulldown enabled\n";\r
64         if (WD == 3) return_string = "Weak keeper enabled\n"; \r
65         return return_string;\r
66 }\r
67 \r
68 // Build a filename that includes date/time\r
69 var today = new Date();\r
70 var year4digit = today.getFullYear();\r
71 var month2digit = ("0" + (today.getMonth()+1)).slice(-2);\r
72 var day2digit = ("0" + today.getDate()).slice(-2);\r
73 var hour2digit = ("0" + today.getHours()).slice(-2);\r
74 var minutes2digit = ("0" + today.getMinutes()).slice(-2);\r
75 var seconds2digit = ("0" + today.getSeconds()).slice(-2);\r
76 var filename_date = '_' + year4digit + '-' + month2digit + '-' + day2digit + '_' + hour2digit + minutes2digit + seconds2digit; \r
77 var userHomeFolder = System.getProperty("user.home");\r
78 var filename = userHomeFolder + '/Desktop/' + 'am335x-ddr-analysis' + filename_date + '.txt';\r
79 \r
80 file = new java.io.FileWriter(filename);\r
81 \r
82 debugSessionDAP = ds.openSession("*","CS_DAP_DebugSS");\r
83 debugSessionDAP.target.connect();\r
84 \r
85 var reg_val;\r
86 \r
87 // EMIF: SDRAM_CONFIG\r
88 reg_val = printRegisterValue(debugSessionDAP, "EMIF: SDRAM_CONFIG", 0x4C000008);\r
89 var is_ddr3=0;\r
90 var is_ddr2=0;\r
91 var is_lpddr=0;\r
92 if ( (reg_val & 0xE0000000) == (0 << 29) ) {file.write("  * ERROR! Unsupported memory type (DDR1)\n");}\r
93 if ( (reg_val & 0xE0000000) == (1 << 29) ) {is_lpddr=1;}\r
94 if ( (reg_val & 0xE0000000) == (2 << 29) ) {is_ddr2=1;}\r
95 if ( (reg_val & 0xE0000000) == (3 << 29) ) {is_ddr3=1;}\r
96 if (is_ddr3 == 1) {\r
97         file.write("  * Bits 26:24 (reg_ddr_term) set for ");\r
98         if ( (reg_val & 0x07000000) == (0 << 24) ) {file.write("termination disabled (000b)\n");}\r
99         if ( (reg_val & 0x07000000) == (1 << 24) ) {file.write("RZQ/4 (001b)\n");}\r
100         if ( (reg_val & 0x07000000) == (2 << 24) ) {file.write("RZQ/2 (010b)\n");}\r
101         if ( (reg_val & 0x07000000) == (3 << 24) ) {file.write("RZQ/6 (011b)\n");}\r
102         if ( (reg_val & 0x07000000) == (4 << 24) ) {file.write("RZQ/12 (100b)\n");}\r
103         if ( (reg_val & 0x07000000) == (5 << 24) ) {file.write("RZQ/8  (101b)\n");}\r
104         if ( (reg_val & 0x07000000) == (6 << 24) ) {file.write("ERROR\n");}\r
105         if ( (reg_val & 0x07000000) == (7 << 24) ) {file.write("ERROR\n");}\r
106 }\r
107 if (is_ddr2 == 1) {\r
108         file.write("  * Bits 26:24 (reg_ddr_term) set for ");\r
109         if ( (reg_val & 0x07000000) == (0 << 24) ) {file.write("termination disabled (000b)\n");}\r
110         if ( (reg_val & 0x07000000) == (1 << 24) ) {file.write("75 Ohm (001b)\n");}\r
111         if ( (reg_val & 0x07000000) == (2 << 24) ) {file.write("150 Ohm (010b)\n");}\r
112         if ( (reg_val & 0x07000000) == (3 << 24) ) {file.write("50 Ohm (011b)\n");}\r
113         if ( (reg_val & 0x07000000) == (4 << 24) ) {file.write("ERROR\n");}\r
114         if ( (reg_val & 0x07000000) == (5 << 24) ) {file.write("ERROR\n");}\r
115         if ( (reg_val & 0x07000000) == (6 << 24) ) {file.write("ERROR\n");}\r
116         if ( (reg_val & 0x07000000) == (7 << 24) ) {file.write("ERROR\n");}\r
117 }\r
118 if (is_ddr3 == 1) {\r
119         file.write("  * Bits 19:18 (reg_sdram_drive) set for ");\r
120         if ( (reg_val & 0x000C0000) == (0 << 18) ) {file.write("RZQ/6 (00b)\n");}\r
121         if ( (reg_val & 0x000C0000) == (1 << 18) ) {file.write("RZQ/7 (01b)\n");}\r
122         if ( (reg_val & 0x000C0000) == (2 << 18) ) {file.write("ERROR (10b)\n");}\r
123         if ( (reg_val & 0x000C0000) == (3 << 18) ) {file.write("ERROR (11b)\n");}\r
124 }\r
125 if (is_ddr2 == 1) {\r
126         file.write("  * Bits 19:18 (reg_sdram_drive) set for ");\r
127         if ( (reg_val & 0x000C0000) == (0 << 18) ) {file.write("normal drive (00b)\n");}\r
128         if ( (reg_val & 0x000C0000) == (1 << 18) ) {file.write("weak drive (01b)\n");}\r
129         if ( (reg_val & 0x000C0000) == (2 << 18) ) {file.write("ERROR (10b)\n");}\r
130         if ( (reg_val & 0x000C0000) == (3 << 18) ) {file.write("ERROR (11b)\n");}\r
131 }\r
132 if (is_lpddr == 1) {\r
133         file.write("  * Bits 19:18 (reg_sdram_drive) set for ");\r
134         if ( (reg_val & 0x000C0000) == (0 << 18) ) {file.write("full strength (00b)\n");}\r
135         if ( (reg_val & 0x000C0000) == (1 << 18) ) {file.write("half strength (01b)\n");}\r
136         if ( (reg_val & 0x000C0000) == (2 << 18) ) {file.write("quarter strength (10b)\n");}\r
137         if ( (reg_val & 0x000C0000) == (3 << 18) ) {file.write("eighth strength (11b)\n");}\r
138 }\r
139 \r
140 // EMIF: PWR_MGMT_CTRL\r
141 reg_val = printRegisterValue(debugSessionDAP, "EMIF: PWR_MGMT_CTRL", 0x4C000038);\r
142 if ( (reg_val & 0xF0) < 0x90 ) {\r
143         file.write(" * ERROR: Bits 7:4 (reg_sr_tim) are in violation of Maximum Self-Refresh Command Limit\n");\r
144         file.write(" * Please see the silicon errata for more details.\n");\r
145 }\r
146 \r
147 // DDR PHY: DDR_PHY_CTRL_1\r
148 reg_val = printRegisterValue(debugSessionDAP, "DDR PHY: DDR_PHY_CTRL_1", 0x4C0000E4);\r
149 if ( (reg_val & 1<<20) == 0 ) {file.write("  * WARNING: reg_phy_enable_dynamic_pwrdn disabled.\n");}\r
150 file.write("  * Bits 9:8 (reg_phy_rd_local_odt) configured as ");\r
151 if ( (reg_val & 0x300) == (0 << 8) ) {file.write("no termination (00b)\n");}\r
152 if ( (reg_val & 0x300) == (1 << 8) ) {file.write("no termination (01b)\n");}\r
153 if ( (reg_val & 0x300) == (2 << 8) ) {file.write("full thevenin termination\n");}\r
154 if ( (reg_val & 0x300) == (3 << 8) ) {file.write("half thevenin termination\n");}\r
155 \r
156 // Close (Main) DAP session and use M3 DAP to view Control Registers\r
157 debugSessionDAP.target.disconnect();\r
158 debugSessionDAP = ds.openSession("*","CS_DAP_M3");\r
159 debugSessionDAP.target.connect();\r
160 \r
161 // CONTROL: DDR_CMD0_IOCTRL\r
162 reg_val = printRegisterValue(debugSessionDAP, "CONTROL: DDR_CMD0_IOCTRL", 0x44E11404);\r
163 file.write("  * ddr_ba2 " + interpret_cmd_phy_macro(reg_val, 0));\r
164 file.write("  * ddr_wen " + interpret_cmd_phy_macro(reg_val, 1));\r
165 file.write("  * ddr_ba0 " + interpret_cmd_phy_macro(reg_val, 2));\r
166 file.write("  * ddr_a5 " + interpret_cmd_phy_macro(reg_val, 3));\r
167 file.write("  * ddr_ck " + interpret_cmd_phy_macro(reg_val, 4));\r
168 file.write("  * ddr_ckn " + interpret_cmd_phy_macro(reg_val, 5));\r
169 file.write("  * ddr_a3 " + interpret_cmd_phy_macro(reg_val, 6));\r
170 file.write("  * ddr_a4 " + interpret_cmd_phy_macro(reg_val, 7));\r
171 file.write("  * ddr_a8 " + interpret_cmd_phy_macro(reg_val, 8));\r
172 file.write("  * ddr_a9 " + interpret_cmd_phy_macro(reg_val, 9));\r
173 file.write("  * ddr_a6 " + interpret_cmd_phy_macro(reg_val, 10));\r
174 file.write("  * Bits 9:5 control ddr_ck and ddr_ckn\n");\r
175 file.write("    - Slew ");\r
176 if ( (reg_val & 0x300) == (0 << 8) ) {file.write("fastest\n");}\r
177 if ( (reg_val & 0x300) == (1 << 8) ) {file.write("slow\n");}\r
178 if ( (reg_val & 0x300) == (2 << 8) ) {file.write("fast\n");}\r
179 if ( (reg_val & 0x300) == (3 << 8) ) {file.write("slowest\n");}\r
180 var drive_strength_mA = ((reg_val & 0xE0) >> 5) + 5;\r
181 file.write("    - Drive Strength " + drive_strength_mA + " mA\n");\r
182 file.write("  * Bits 4:0 control ddr_ba0, ddr_ba2, ddr_wen, ddr_a[9:8], ddr_a[6:3]\n");\r
183 file.write("    - Slew ");\r
184 if ( (reg_val & 0x18) == (0 << 3) ) {file.write("fastest\n");}\r
185 if ( (reg_val & 0x18) == (1 << 3) ) {file.write("slow\n");}\r
186 if ( (reg_val & 0x18) == (2 << 3) ) {file.write("fast\n");}\r
187 if ( (reg_val & 0x18) == (3 << 3) ) {file.write("slowest\n");}\r
188 var drive_strength_mA = ((reg_val & 0x07) >> 0) + 5;\r
189 file.write("    - Drive Strength " + drive_strength_mA + " mA\n");\r
190 \r
191 // CONTROL: DDR_CMD1_IOCTRL\r
192 reg_val = printRegisterValue(debugSessionDAP, "CONTROL: DDR_CMD1_IOCTRL", 0x44E11408);\r
193 file.write("  * ddr_a15 " + interpret_cmd_phy_macro(reg_val, 1));\r
194 file.write("  * ddr_a2 " + interpret_cmd_phy_macro(reg_val, 2));\r
195 file.write("  * ddr_a12 " + interpret_cmd_phy_macro(reg_val, 3));\r
196 file.write("  * ddr_a7 " + interpret_cmd_phy_macro(reg_val, 4));\r
197 file.write("  * ddr_ba1 " + interpret_cmd_phy_macro(reg_val, 5));\r
198 file.write("  * ddr_a10 " + interpret_cmd_phy_macro(reg_val, 6));\r
199 file.write("  * ddr_a0 " + interpret_cmd_phy_macro(reg_val, 7));\r
200 file.write("  * ddr_a11 " + interpret_cmd_phy_macro(reg_val, 8));\r
201 file.write("  * ddr_casn " + interpret_cmd_phy_macro(reg_val, 9));\r
202 file.write("  * ddr_rasn " + interpret_cmd_phy_macro(reg_val, 10));\r
203 file.write("  * Bits 4:0 control ddr_15, ddr_a[12:10], ddr_a7, ddr_a2, ddr_a0, ddr_ba1, ddr_casn, ddr_rasn\n");\r
204 file.write("    - Slew ");\r
205 if ( (reg_val & 0x18) == (0 << 3) ) {file.write("fastest\n");}\r
206 if ( (reg_val & 0x18) == (1 << 3) ) {file.write("slow\n");}\r
207 if ( (reg_val & 0x18) == (2 << 3) ) {file.write("fast\n");}\r
208 if ( (reg_val & 0x18) == (3 << 3) ) {file.write("slowest\n");}\r
209 var drive_strength_mA = ((reg_val & 0x07) >> 0) + 5;\r
210 file.write("    - Drive Strength " + drive_strength_mA + " mA\n");\r
211 \r
212 // CONTROL: DDR_CMD2_IOCTRL\r
213 reg_val = printRegisterValue(debugSessionDAP, "CONTROL: DDR_CMD2_IOCTRL", 0x44E1140C);\r
214 file.write("  * ddr_cke " + interpret_cmd_phy_macro(reg_val, 0));\r
215 file.write("  * ddr_resetn " + interpret_cmd_phy_macro(reg_val, 1));\r
216 file.write("  * ddr_odt " + interpret_cmd_phy_macro(reg_val, 2));\r
217 file.write("  * ddr_a14 " + interpret_cmd_phy_macro(reg_val, 4));\r
218 file.write("  * ddr_a13 " + interpret_cmd_phy_macro(reg_val, 5));\r
219 file.write("  * ddr_csn0 " + interpret_cmd_phy_macro(reg_val, 6));\r
220 file.write("  * ddr_a1 " + interpret_cmd_phy_macro(reg_val, 8));\r
221 file.write("  * Bits 4:0 control ddr_cke, ddr_resetn, ddr_odt, ddr_csn0, ddr_[a14:13], ddr_a1\n");\r
222 file.write("    - Slew ");\r
223 if ( (reg_val & 0x18) == (0 << 3) ) {file.write("fastest\n");}\r
224 if ( (reg_val & 0x18) == (1 << 3) ) {file.write("slow\n");}\r
225 if ( (reg_val & 0x18) == (2 << 3) ) {file.write("fast\n");}\r
226 if ( (reg_val & 0x18) == (3 << 3) ) {file.write("slowest\n");}\r
227 var drive_strength_mA = ((reg_val & 0x07) >> 0) + 5;\r
228 file.write("    - Drive Strength " + drive_strength_mA + " mA\n");\r
229 \r
230 // CONTROL: DDR_DATA0_IOCTRL\r
231 reg_val = printRegisterValue(debugSessionDAP, "CONTROL: DDR_DATA0_IOCTRL", 0x44E11440);\r
232 file.write("  * ddr_d8 " + interpret_data_phy_macro(reg_val, 0));\r
233 file.write("  * ddr_d9 " + interpret_data_phy_macro(reg_val, 1));\r
234 file.write("  * ddr_d10 " + interpret_data_phy_macro(reg_val, 2));\r
235 file.write("  * ddr_d11 " + interpret_data_phy_macro(reg_val, 3));\r
236 file.write("  * ddr_d12 " + interpret_data_phy_macro(reg_val, 4));\r
237 file.write("  * ddr_d13 " + interpret_data_phy_macro(reg_val, 5));\r
238 file.write("  * ddr_d14 " + interpret_data_phy_macro(reg_val, 6));\r
239 file.write("  * ddr_d15 " + interpret_data_phy_macro(reg_val, 7));\r
240 file.write("  * ddr_dqm1 " + interpret_data_phy_macro(reg_val, 8));\r
241 file.write("  * ddr_dqs1 and ddr_dqsn1 " + interpret_data_phy_macro(reg_val, 9));\r
242 file.write("  * Bits 9:5 control ddr_dqs1, ddr_dqsn1\n");\r
243 file.write("    - Slew ");\r
244 if ( (reg_val & 0x300) == (0 << 8) ) {file.write("fastest\n");}\r
245 if ( (reg_val & 0x300) == (1 << 8) ) {file.write("slow\n");}\r
246 if ( (reg_val & 0x300) == (2 << 8) ) {file.write("fast\n");}\r
247 if ( (reg_val & 0x300) == (3 << 8) ) {file.write("slowest\n");}\r
248 var drive_strength_mA = ((reg_val & 0xE0) >> 5) + 5;\r
249 file.write("    - Drive Strength " + drive_strength_mA + " mA\n");\r
250 file.write("  * Bits 4:0 control ddr_d[15:8], ddr_dqm1\n");\r
251 file.write("    - Slew ");\r
252 if ( (reg_val & 0x18) == (0 << 3) ) {file.write("fastest\n");}\r
253 if ( (reg_val & 0x18) == (1 << 3) ) {file.write("slow\n");}\r
254 if ( (reg_val & 0x18) == (2 << 3) ) {file.write("fast\n");}\r
255 if ( (reg_val & 0x18) == (3 << 3) ) {file.write("slowest\n");}\r
256 var drive_strength_mA = ((reg_val & 0x07) >> 0) + 5;\r
257 file.write("    - Drive Strength " + drive_strength_mA + " mA\n");\r
258 \r
259 // CONTROL: DDR_DATA1_IOCTRL\r
260 reg_val = printRegisterValue(debugSessionDAP, "CONTROL: DDR_DATA1_IOCTRL", 0x44E11444);\r
261 file.write("  * ddr_d0 " + interpret_data_phy_macro(reg_val, 0));\r
262 file.write("  * ddr_d1 " + interpret_data_phy_macro(reg_val, 1));\r
263 file.write("  * ddr_d2 " + interpret_data_phy_macro(reg_val, 2));\r
264 file.write("  * ddr_d3 " + interpret_data_phy_macro(reg_val, 3));\r
265 file.write("  * ddr_d4 " + interpret_data_phy_macro(reg_val, 4));\r
266 file.write("  * ddr_d5 " + interpret_data_phy_macro(reg_val, 5));\r
267 file.write("  * ddr_d6 " + interpret_data_phy_macro(reg_val, 6));\r
268 file.write("  * ddr_d7 " + interpret_data_phy_macro(reg_val, 7));\r
269 file.write("  * ddr_dqm0 " + interpret_data_phy_macro(reg_val, 8));\r
270 file.write("  * ddr_dqs0 and ddr_dqsn0 " + interpret_data_phy_macro(reg_val, 9));\r
271 file.write("  * Bits 9:5 control ddr_dqs0, ddr_dqsn0\n");\r
272 file.write("    - Slew ");\r
273 if ( (reg_val & 0x300) == (0 << 8) ) {file.write("fastest\n");}\r
274 if ( (reg_val & 0x300) == (1 << 8) ) {file.write("slow\n");}\r
275 if ( (reg_val & 0x300) == (2 << 8) ) {file.write("fast\n");}\r
276 if ( (reg_val & 0x300) == (3 << 8) ) {file.write("slowest\n");}\r
277 var drive_strength_mA = ((reg_val & 0xE0) >> 5) + 5;\r
278 file.write("    - Drive Strength " + drive_strength_mA + " mA\n");\r
279 file.write("  * Bits 4:0 control ddr_d[7:0], dqm0\n");\r
280 file.write("    - Slew ");\r
281 if ( (reg_val & 0x18) == (0 << 3) ) {file.write("fastest\n");}\r
282 if ( (reg_val & 0x18) == (1 << 3) ) {file.write("slow\n");}\r
283 if ( (reg_val & 0x18) == (2 << 3) ) {file.write("fast\n");}\r
284 if ( (reg_val & 0x18) == (3 << 3) ) {file.write("slowest\n");}\r
285 var drive_strength_mA = ((reg_val & 0x07) >> 0) + 5;\r
286 file.write("    - Drive Strength " + drive_strength_mA + " mA\n");\r
287 \r
288 // CONTROL: DDR_IO_CTRL\r
289 reg_val = printRegisterValue(debugSessionDAP, "CONTROL: DDR_IO_CTRL", 0x44E10E04);\r
290 if ( (reg_val & (1 << 31)) == (1<<31) ) {\r
291         file.write("  * Bit 31: Overriding DDR_RESETn (expected for DS0).\n");\r
292 } else {\r
293         file.write("  * Bit 31: DDR_RESETn controlled by EMIF.\n");\r
294 }\r
295 if ( (reg_val & (1 << 28)) == 0) {\r
296         file.write("  * Bit 28 (mddr_sel) configured for SSTL, i.e. DDR2/DDR3/DDR3L operation.\n");\r
297         if (is_lpddr == 1) {file.write("ERROR!  Mismatch with SDRAM_CONFIG.\n");}\r
298 }\r
299 else {\r
300         file.write("  * Bit 28 (mddr_sel) configured for LVCMOS, i.e. LPDDR/mDDR operation.\n");\r
301         if (is_ddr2 == 1) {file.write("ERROR!  Mismatch with SDRAM_CONFIG.\n");}\r
302         if (is_ddr3 == 1) {file.write("ERROR!  Mismatch with SDRAM_CONFIG.\n");}\r
303 }\r
304 \r
305 // CONTROL: VTP_CTRL\r
306 reg_val = printRegisterValue(debugSessionDAP, "CONTROL: VTP_CTRL", 0x44E10E0C);\r
307 if ( reg_val == 0 ) {\r
308         file.write("  * VTP disabled (expected in DS0).\n");\r
309 } else {\r
310         file.write("  * VTP not disabled (expected in normal operation, but not DS0).\n");\r
311 }\r
312 \r
313 // CONTROL: VREF_CTRL\r
314 reg_val = printRegisterValue(debugSessionDAP, "CONTROL: VREF_CTRL", 0x44E10E14);\r
315 if ( (reg_val & 1) == 0 ) {\r
316         file.write("  * VREF supplied externally (typical).\n");\r
317 } else {\r
318         file.write("  * Internal VREF (unusual).\n");\r
319 }\r
320 \r
321 // CONTROL: DDR_CKE_CTRL\r
322 reg_val = printRegisterValue(debugSessionDAP, "CONTROL: DDR_CKE_CTRL", 0x44E1131C);\r
323 \r
324 file.close();\r
325 print("Created file " + filename);\r
326 debugSessionDAP.target.disconnect();\r
327 \r