writer: nand: evmk2l : Fix issue with writer
[keystone-rtos/mcsdk-tools.git] / program_evm / gel / evmk2e.gel
1 /******************************************************************************\r
2  * Copyright (c) 2012 Texas Instruments Incorporated - http://www.ti.com\r
3  * \r
4  *  Redistribution and use in source and binary forms, with or without \r
5  *  modification, are permitted provided that the following conditions \r
6  *\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  *\r
13  *    Redistributions in binary form must reproduce the above copyright\r
14  *    notice, this list of conditions and the following disclaimer in the     \r
15  *    documentation and/or other materials provided with the   \r
16  *\r
17  *    distribution.\r
18  *\r
19  *\r
20  *    Neither the name of Texas Instruments Incorporated nor the names of\r
21  *    its contributors may be used to endorse or promote products derived\r
22  *    from this software without specific prior written permission.\r
23  *\r
24  *\r
25  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
26  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
27  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
28  *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
29  *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
30  *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
31  *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
32  *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
33  *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
34  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
35  *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
36  * \r
37  *****************************************************************************\r
38  *\r
39  *  Filename:           evmtci6638k2k.gel\r
40  *  Description:        Utility GEL for use with the TCI6638K2K EVM. This GEL has \r
41  *                                              functions that initialize the chip PLL's and the DDR3A  interfaces. \r
42  *                                              \r
43  *                                              It also includes general utilities that are useful for EVM development\r
44  *                        \r
45  *                      More functions will be added as needed. \r
46  *        \r
47  *      Author: Randy Rosales                 \r
48  *      Revision History: \r
49  *\r
50  *      Revision 0.1\r
51  *      -       Initial revision based on the Kepler VDB GEL 32bit_DDR-800_Kepler_PLL_and_DDR3_Init_Silicon_Rev15.gel put together for Kepler bringup by Pragna Paranji\r
52  *  -   Added in GEL system clock frequency estimation functions written by WenZhong Liu to help debug core PLL instability\r
53  *              +       dspPollDSPClockFreq will estimate the clock based on a comparison with windows system clock time\r
54  *   Revision 0.2 - pparanji\r
55  *        - Added DDR3A  memory test capabilities.\r
56  *      Revision 0.3 - pparanji\r
57  *       - Added the following configurations\r
58  *           DDR3A 32bit - DDR800, DDR1066, DDR1333\r
59  *               \r
60  *               DSP core PLL @ 122.88 MHz to 614.4 MHz operation \r
61  *                                              122.88 MHz to 737.28 MHz operation \r
62  *                                              122.88 MHz to 983.04 MHz operation \r
63  *                                              122.88 MHz  to 1.2 GHz operation \r
64  *                                              122.88 MHz  to 1.2 GHz operation \r
65  *                                              \r
66  *               ARM PLL @              100 MHz to 1.0 GHz operation \r
67  *                                              100 MHz to 1.4 GHz operation \r
68  *                                              175 MHz to 1.4 GHz operation \r
69  *        Rev 1.2 -  - pparanji\r
70  *        ------ Updates  DDR3A  to single rank configurations\r
71  *        Rev 1.3 - pparanji\r
72  *        ------  Updated timing on DDR3A-1066 and DDR3A-1333\r
73  *     Rev 1.4 - csmith\r
74  *     ------  Updated PA PLL config and Tetris PLL config\r
75  *\r
76  ---------------------------------------------------------------------------*/\r
77 \r
78 #define GEL_VERSION         1.0\r
79 \r
80 // Timeout definitions\r
81 int _GEL_Global_Timeout1 = 0;\r
82 \r
83 #define TIMEOUT_ID 10\r
84 // Global timeout value\r
85 #define GTIMEOUT 2000\r
86 //*****************************************************\r
87 // Power definitions\r
88 #define PSC_BASE            0x02350000\r
89 #define PSC_PTCMD           *( unsigned int* )( PSC_BASE+0x120 )\r
90 #define PSC_PTSTAT          *( unsigned int* )( PSC_BASE+0x128 )\r
91 #define PSC_PDCTL_BASE      ( PSC_BASE+0x300 )\r
92 #define PSC_MDSTAT_BASE     ( PSC_BASE+0x800 )\r
93 #define PSC_MDCTL_BASE      ( PSC_BASE+0xA00 )\r
94 \r
95 // Modules on power domain 0\r
96 // Always on\r
97 // Modules on power domain 0\r
98 #define LPSC_TSIP      (4)      \r
99 // Modules on power domain 1\r
100 #define LPSC_DEBUG     (5)\r
101 #define LPSC_TETB      (6)      \r
102 \r
103 // Modules on power domain 2\r
104 #define LPSC_PA        (7)\r
105 #define LPSC_SGMII     (8)\r
106 #define LPSC_SA        (9)\r
107 \r
108 // Modules on power domain 3\r
109 #define LPSC_PCIE      (10)\r
110 \r
111 \r
112 // Modules on power domain 5\r
113 #define LPSC_HYPERLINK     (12)\r
114 \r
115 // Modules on power domain 6\r
116 #define LPSC_SR     (13)\r
117 \r
118 // Modules on power domain 7\r
119 #define LPSC_MSMCRAM   (14)\r
120 \r
121 // Modules on power domain 8\r
122 #define LPSC_C66X_COREPAC_0   (15)\r
123 \r
124 // Modules on power domain 16\r
125 #define LPSC_DDR3_0      (23)\r
126 \r
127 // Modules on power domain 18\r
128 #define LPSC_PCIE_1       (27)\r
129 \r
130 // Modules on power domain 29\r
131 #define LPSC_XGE     (50)               \r
132 \r
133 // Modules on power domain 31\r
134 #define LPSC_ARM    (52)\r
135 \r
136 \r
137 // Power domains definitions\r
138 #define PD0         (0)     // Power Domain-0\r
139 #define PD1         (1)     // Power Domain-1\r
140 #define PD2         (2)     // Power Domain-2\r
141 #define PD3         (3)     // Power Domain-3\r
142 #define PD5         (5)     // Power Domain-5\r
143 #define PD6         (6)     // Power Domain-6\r
144 #define PD7         (7)     // Power Domain-7\r
145 #define PD8         (8)     // Power Domain-8\r
146 #define PD16        (16)    // Power Domain-16\r
147 #define PD18        (18)    // Power Domain-18\r
148 #define PD29        (29)    // Power Domain-29\r
149 #define PD31        (31)    // Power Domain-31\r
150 \r
151 #define PSC_SYNCRESET (0x1)\r
152 #define PSC_DISABLE   (0x2)\r
153 #define PSC_ENABLE    (0x3)\r
154 \r
155 #define CHIP_LEVEL_REG              0x02620000\r
156 \r
157 /******************* PLL registers **********************************/\r
158 /*Boot cfg registers*/\r
159 #define KICK0                       *(unsigned int*)(CHIP_LEVEL_REG + 0x0038)\r
160 #define KICK1                       *(unsigned int*)(CHIP_LEVEL_REG + 0x003C)\r
161 #define KICK0_UNLOCK                (0x83E70B13)\r
162 #define KICK1_UNLOCK                (0x95A4F1E0)\r
163 #define KICK_LOCK                   0\r
164 #define TINPSEL                     *(unsigned int*)(CHIP_LEVEL_REG + 0x0300)\r
165 #define TOUTPSEL                    *(unsigned int*)(CHIP_LEVEL_REG + 0x0304)\r
166 #define MAINPLLCTL0                 *(unsigned int*)(CHIP_LEVEL_REG + 0x0350) \r
167 #define MAINPLLCTL1                 *(unsigned int*)(CHIP_LEVEL_REG + 0x0354) \r
168 #define MAIN_PLLD_OFFSET            0\r
169 #define MAIN_PLLD_MASK              0xFFFFFFC0\r
170 #define MAIN_PLLM_OFFSET            12\r
171 #define MAIN_PLLM_MASK              0xFFF80FFF\r
172 #define MAIN_BWADJ0_OFFSET          24\r
173 #define MAIN_BWADJ0_MASK            0x00FFFFFF\r
174 #define MAIN_ENSAT_OFFSET           6\r
175 #define MAIN_ENSAT_MASK             0xFFFFFFBF\r
176 #define MAIN_BWADJ1_OFFSET          0\r
177 #define MAIN_BWADJ1_MASK            0xFFFFFFF0\r
178 \r
179 #define OBSCLKCTL                   *(unsigned int*)(CHIP_LEVEL_REG + 0x0C80)   //TODO: Reserved in K2H datashet\r
180 \r
181 /* PA PLL Registers */\r
182 #define BYPASS_BIT_SHIFT 23\r
183 #define CLKF_BIT_SHIFT   6\r
184 #define CLKD_BIT_SHIFT   0\r
185 #define DEVSTAT    (*((unsigned int *) 0x02620020))\r
186 #define PAPLLCTL0                 *(unsigned int*)(CHIP_LEVEL_REG + 0x0358) \r
187 #define PAPLLCTL1                 *(unsigned int*)(CHIP_LEVEL_REG + 0x035C) \r
188 #define PASSCLKSEL_MASK    (1 << 17)    /* Tells the configuration of the PASSCLKSEL pin */\r
189 #define PA_PLL_BYPASS_MASK (1 << BYPASS_BIT_SHIFT)    /* Tells whether the PA PLL is in BYPASS mode or not */\r
190 #define PA_PLL_CLKOD_MASK  (0x00780000) /* Tells the output divider value for the PA PLL */\r
191 #define PA_PLL_CLKF_MASK   (0x0007FFC0) /* Tells the multiplier value for the PA PLL */\r
192 #define PA_PLL_CLKR_MASK   (0x0000003F) /* Tells the divider value for the PA PLL */\r
193 #define PA_PLL_RESET_MASK  (0x00004000)\r
194 \r
195 \r
196 #define CHIP_MISC1                  *(unsigned int*)(CHIP_LEVEL_REG + 0x0C7C)\r
197 #define ARMPLL_ENABLE_OFFSET        13\r
198 \r
199 \r
200 #define DDR3APLLCTL0                    *(unsigned int*)(CHIP_LEVEL_REG + 0x0360)\r
201 #define DDR3APLLCTL1                    *(unsigned int*)(CHIP_LEVEL_REG + 0x0364)\r
202 \r
203 //******************************************************\r
204 // PLL 1 definitions (DSP and ARM clock and subsystems)\r
205 #define PLL1_BASE                   0x02310000\r
206 #define PLL1_PLLCTL                 (*(unsigned int*)(PLL1_BASE + 0x100))   // PLL1 Control\r
207 #define PLL1_SECCTL                 (*(unsigned int*)(PLL1_BASE + 0x108))   // PLL1 Secondary Control\r
208 #define PLL1_PLLM                   (*(unsigned int*)(PLL1_BASE + 0x110))   // PLL1 Multiplier\r
209 #define PLL1_DIV1                   (*(unsigned int*)(PLL1_BASE + 0x118))   // DIV1 divider\r
210 #define PLL1_DIV2                   (*(unsigned int*)(PLL1_BASE + 0x11C))   // DIV2 divider\r
211 #define PLL1_DIV3                   (*(unsigned int*)(PLL1_BASE + 0x120))   // DIV3 divider\r
212 #define PLL1_CMD                    (*(unsigned int*)(PLL1_BASE + 0x138))   // CMD control\r
213 #define PLL1_STAT                   (*(unsigned int*)(PLL1_BASE + 0x13C))   // STAT control\r
214 #define PLL1_ALNCTL                 (*(unsigned int*)(PLL1_BASE + 0x140))   // ALNCTL control\r
215 #define PLL1_DCHANGE                (*(unsigned int*)(PLL1_BASE + 0x144))   // DCHANGE status\r
216 #define PLL1_CKEN                   (*(unsigned int*)(PLL1_BASE + 0x148))   // CKEN control\r
217 #define PLL1_CKSTAT                 (*(unsigned int*)(PLL1_BASE + 0x14C))   // CKSTAT status\r
218 #define PLL1_SYSTAT                 (*(unsigned int*)(PLL1_BASE + 0x150))   // SYSTAT status\r
219 #define PLL1_DIV4                   (*(unsigned int*)(PLL1_BASE + 0x160))   // DIV4 divider\r
220 #define PLL1_DIV5                   (*(unsigned int*)(PLL1_BASE + 0x164))   // DIV5 divider\r
221 #define PLL1_DIV6                   (*(unsigned int*)(PLL1_BASE + 0x168))   // DIV6 divider\r
222 #define PLL1_DIV7                   (*(unsigned int*)(PLL1_BASE + 0x16C))   // DIV7 divider\r
223 #define PLL1_DIV8                   (*(unsigned int*)(PLL1_BASE + 0x170))   // DIV8 divider\r
224 #define PLL1_DIV9                   (*(unsigned int*)(PLL1_BASE + 0x174))   // DIV9 divider\r
225 #define PLL1_DIV10                  (*(unsigned int*)(PLL1_BASE + 0x178))   // DIV10 divider\r
226 #define PLL1_DIV11                  (*(unsigned int*)(PLL1_BASE + 0x17C))   // DIV11 divider\r
227 #define PLL1_DIV12                  (*(unsigned int*)(PLL1_BASE + 0x180))   // DIV12 divider\r
228 #define PLL1_DIV13                  (*(unsigned int*)(PLL1_BASE + 0x184))   // DIV13 divider\r
229 #define PLL1_DIV14                  (*(unsigned int*)(PLL1_BASE + 0x188))   // DIV14 divider\r
230 #define PLL1_DIV15                  (*(unsigned int*)(PLL1_BASE + 0x18C))   // DIV15 divider\r
231 #define PLL1_DIV16                  (*(unsigned int*)(PLL1_BASE + 0x190))   // DIV16 divider\r
232 #define PLLPWRDN_OFFSET             1\r
233 #define PLLPWRDN_MASK               0xFFFFFFFD\r
234 #define PLLRST_OFFSET               3\r
235 #define PLLRST_MASK                 0xFFFFFFF7\r
236 #define PLLENSRC_OFFSET             5\r
237 #define PLLENSRC_MASK               0xFFFFFFDF\r
238 #define PLLEN_OFFSET                0\r
239 #define PLLEN_MASK                  0xFFFFFFFE\r
240 #define OUTPUT_DIVIDE_OFFSET        19\r
241 #define OUTPUT_DIVIDE_MASK          0xFF87FFFF    \r
242 #define BYPASS_OFFSET               23\r
243 #define BYPASS_MASK                 0xFF7FFFFF\r
244 #define PLLM_OFFSET                 0\r
245 #define PLLM_MASK                   0xFFFFFFC0\r
246 #define GOSET_OFFSET                0\r
247 #define GOSET_MASK                  0xFFFFFFFE\r
248 #define GOSTAT_OFFSET               0\r
249 #define GOSTAT_MASK                 0xFFFFFFFE\r
250 \r
251 #define OUTPUT_DIVIDE_OFFSET        19\r
252 #define OUTPUT_DIVIDE_MASK          0xFF87FFFF   \r
253 \r
254 // ARMPLL definitions\r
255 #define SEC_PLLCTL0_PLLM_OFFSET     6\r
256 #define SEC_PLLCTL0_PLLM_MASK       0xFFFF003F\r
257 #define SEC_PLLCTL0_BWADJ_OFFSET    24\r
258 #define SEC_PLLCTL0_BWADJ_MASK      0x00FFFFFF\r
259 #define SEC_PLLCTL0_OD_OFFSET       19\r
260 #define SEC_PLLCTL0_OD_MASK         0xFF87FFFF\r
261 #define SEC_PLLCTL0_BYPASS_OFFSET   23\r
262 #define SEC_PLLCTL0_BYPASS_MASK     0xFF7FFFFF\r
263 #define SEC_PLLCTL1_RESET_OFFSET    14\r
264 #define SEC_PLLCTL1_RESET_MASK      0xFFFFBFFF\r
265 #define SEC_PLLCTL1_PWRDWN_OFFSET   15\r
266 #define SEC_PLLCTL1_PWRDWN_MASK     0xFFFF7FFF\r
267 #define SEC_PLLCTL1_ENSTAT_OFFSET   6\r
268 #define SEC_PLLCTL1_ENSTAT_MASK     0xFFFFFFBF\r
269 \r
270 /*----------------DDR3A Register definition---------------------*/\r
271 \r
272 #define DDR3A_BASE_ADDR (0x21010000)\r
273 #define DDR3A_STATUS   (*(int*)(DDR3A_BASE_ADDR + 0x00000004))\r
274 #define DDR3A_SDCFG    (*(int*)(DDR3A_BASE_ADDR + 0x00000008))\r
275 #define DDR3A_SDRFC    (*(int*)(DDR3A_BASE_ADDR + 0x00000010))\r
276 #define DDR3A_SDTIM1   (*(int*)(DDR3A_BASE_ADDR + 0x00000018))\r
277 #define DDR3A_SDTIM2   (*(int*)(DDR3A_BASE_ADDR + 0x0000001C))\r
278 #define DDR3A_SDTIM3   (*(int*)(DDR3A_BASE_ADDR + 0x00000020))\r
279 #define DDR3A_SDTIM4   (*(int*)(DDR3A_BASE_ADDR + 0x00000028))\r
280 #define DDR3A_ZQCFG    (*(int*)(DDR3A_BASE_ADDR + 0x000000C8))\r
281 #define DDR3A_TMPALRT  (*(int*)(DDR3A_BASE_ADDR + 0x000000CC))\r
282 #define DDR3A_DDRPHYC  (*(int*)(DDR3A_BASE_ADDR + 0x000000E4))\r
283 \r
284 #define DDR3A_PHY_CFG_BASE (0x02329000)\r
285 #define DDR3A_PIR    (*(int*)(DDR3A_PHY_CFG_BASE + 0x00000004))\r
286 #define DDR3A_PGCR0  (*(int*)(DDR3A_PHY_CFG_BASE + 0x00000008))\r
287 #define DDR3A_PGCR1  (*(int*)(DDR3A_PHY_CFG_BASE + 0x0000000C))\r
288 #define DDR3A_PGCR2  (*(int*)(DDR3A_PHY_CFG_BASE + 0x0000008C))\r
289 #define DDR3A_PGSR0  (*(int*)(DDR3A_PHY_CFG_BASE + 0x00000010))\r
290 #define DDR3A_PGSR1  (*(int*)(DDR3A_PHY_CFG_BASE + 0x00000014))\r
291 #define DDR3A_PLLCR  (*(int*)(DDR3A_PHY_CFG_BASE + 0x00000018))\r
292 #define DDR3A_PTR0   (*(int*)(DDR3A_PHY_CFG_BASE + 0x0000001C))\r
293 #define DDR3A_PTR1   (*(int*)(DDR3A_PHY_CFG_BASE + 0x00000020))\r
294 #define DDR3A_PTR2   (*(int*)(DDR3A_PHY_CFG_BASE + 0x00000024))\r
295 #define DDR3A_PTR3   (*(int*)(DDR3A_PHY_CFG_BASE + 0x00000028))\r
296 #define DDR3A_PTR4   (*(int*)(DDR3A_PHY_CFG_BASE + 0x0000002C))\r
297 #define DDR3A_DSGCR  (*(int*)(DDR3A_PHY_CFG_BASE + 0x00000040))\r
298 #define DDR3A_DCR    (*(int*)(DDR3A_PHY_CFG_BASE + 0x00000044))\r
299 #define DDR3A_MR0    (*(int*)(DDR3A_PHY_CFG_BASE + 0x00000054))\r
300 #define DDR3A_MR1    (*(int*)(DDR3A_PHY_CFG_BASE + 0x00000058))\r
301 #define DDR3A_MR2    (*(int*)(DDR3A_PHY_CFG_BASE + 0x0000005C))\r
302 #define DDR3A_DTCR   (*(int*)(DDR3A_PHY_CFG_BASE + 0x00000068))\r
303 #define DDR3A_DTPR0  (*(int*)(DDR3A_PHY_CFG_BASE + 0x00000048))\r
304 #define DDR3A_DTPR1  (*(int*)(DDR3A_PHY_CFG_BASE + 0x0000004C))\r
305 #define DDR3A_DTPR2  (*(int*)(DDR3A_PHY_CFG_BASE + 0x00000050))\r
306 \r
307 #define DDR3A_ZQ0CR1  (*(int*)(DDR3A_PHY_CFG_BASE + 0x00000184))\r
308 #define DDR3A_ZQ1CR1  (*(int*)(DDR3A_PHY_CFG_BASE + 0x00000194))\r
309 #define DDR3A_ZQ2CR1  (*(int*)(DDR3A_PHY_CFG_BASE + 0x000001A4))\r
310 #define DDR3A_ZQ3CR1  (*(int*)(DDR3A_PHY_CFG_BASE + 0x000001B4))\r
311 \r
312 #define DDR3A_DATX8_8 (*(int*)(DDR3A_PHY_CFG_BASE + 0x000003C0))\r
313 \r
314 \r
315 #define DDR3_TEST_START_ADDRESS (*(int*)(0x80000000))\r
316 \r
317 #define IODDRM_MASK            0x00000180  \r
318 #define ZCKSEL_MASK            0x01800000\r
319 #define CL_MASK                            0x00000072\r
320 #define WR_MASK                            0x00000E00\r
321 #define BL_MASK                            0x00000003\r
322 #define RRMODE_MASK            0x00040000\r
323 #define UDIMM_MASK             0x20000000\r
324 #define BYTEMASK_MASK          0x0000FC00\r
325 #define MPRDQ_MASK             0x00000080\r
326 #define PDQ_MASK               0x00000070\r
327 #define NOSRA_MASK             0x08000000\r
328 #define ECC_MASK               0x00000001\r
329 #define RRMODE_MASK            0x00040000\r
330 \r
331 #define DDR3A_DX0GSR0 (*(int*)(DDR3A_PHY_CFG_BASE + 0x000001C4)) //0x71\r
332 #define DDR3A_DX1GSR0 (*(int*)(DDR3A_PHY_CFG_BASE + 0x00000204)) //0x81\r
333 #define DDR3A_DX2GSR0 (*(int*)(DDR3A_PHY_CFG_BASE + 0x00000244)) //0x91\r
334 #define DDR3A_DX3GSR0 (*(int*)(DDR3A_PHY_CFG_BASE + 0x00000284)) //0xA1\r
335 #define DDR3A_DX4GSR0 (*(int*)(DDR3A_PHY_CFG_BASE + 0x000002C4)) //0xB1\r
336 #define DDR3A_DX5GSR0 (*(int*)(DDR3A_PHY_CFG_BASE + 0x00000304)) //0xC1\r
337 #define DDR3A_DX6GSR0 (*(int*)(DDR3A_PHY_CFG_BASE + 0x00000344)) //0xD1\r
338 #define DDR3A_DX7GSR0 (*(int*)(DDR3A_PHY_CFG_BASE + 0x00000384)) //0xE1\r
339 #define DDR3A_DX8GSR0 (*(int*)(DDR3A_PHY_CFG_BASE + 0x000003C4)) //0xF1\r
340 \r
341 #define DDR3A_TEST_START_ADDRESS (0x80000000)\r
342 \r
343 #define DDR3A_TEST_END_ADDRESS   (DDR3A_TEST_START_ADDRESS + (4 * 100))\r
344 #define DDR3A_BASE_ADDRESS        0x80000000\r
345 \r
346 \r
347 \r
348 #define TETRIS_BASE                 0x01E80000\r
349 \r
350 #define TETRIS_CPU0_PTCMD           *(unsigned int*)(TETRIS_BASE + 0x0400)\r
351 #define TETRIS_CPU0_PDSTAT          *(unsigned int*)(TETRIS_BASE + 0x0404)\r
352 #define TETRIS_CPU0_PDCTL           *(unsigned int*)(TETRIS_BASE + 0x0408)\r
353 \r
354 #define TETRIS_CPU1_PTCMD           *(unsigned int*)(TETRIS_BASE + 0x040C)\r
355 #define TETRIS_CPU1_PDSTAT          *(unsigned int*)(TETRIS_BASE + 0x0410)\r
356 #define TETRIS_CPU1_PDCTL           *(unsigned int*)(TETRIS_BASE + 0x0414)\r
357 \r
358 #define TETRIS_CPU2_PTCMD           *(unsigned int*)(TETRIS_BASE + 0x0418)\r
359 #define TETRIS_CPU2_PDSTAT          *(unsigned int*)(TETRIS_BASE + 0x041C)\r
360 #define TETRIS_CPU2_PDCTL           *(unsigned int*)(TETRIS_BASE + 0x0420)\r
361 \r
362 #define TETRIS_CPU3_PTCMD           *(unsigned int*)(TETRIS_BASE + 0x0424)\r
363 #define TETRIS_CPU3_PDSTAT          *(unsigned int*)(TETRIS_BASE + 0x0428)\r
364 #define TETRIS_CPU3_PDCTL           *(unsigned int*)(TETRIS_BASE + 0x042C)\r
365 \r
366 #define SECPLLCTL0                  *(unsigned int*)(CHIP_LEVEL_REG + 0x0370)\r
367 #define SECPLLCTL1                  *(unsigned int*)(CHIP_LEVEL_REG + 0x0374)\r
368 unsigned int read_val;\r
369 \r
370 /****************************************************************************\r
371  *\r
372  * NAME\r
373  *      OnTargetConnect\r
374  *\r
375  * PURPOSE:\r
376  *      Setup almost everything ready for a new debug session:\r
377  *      DSP modules and EVM board modules, at target connection.\r
378  *      Do nothing if target is in realtime mode.\r
379  *      This routine is called when you connect to the target board.\r
380  *\r
381  *      IMPORTANT: this routine won't attempt to connect to the target\r
382  *      if the target is not in real-time mode and that the dsp boot\r
383  *      mode switches are not set in emulation boot mode.\r
384  *\r
385  * USAGE\r
386  *      This routine is a callback routine and called by CCS only.\r
387  *\r
388  * RETURN VALUE\r
389  *      NONE\r
390  *\r
391  * REFERENCE\r
392  *\r
393  ****************************************************************************/\r
394 OnTargetConnect()\r
395 {\r
396         /*------------------------------------------------------*/\r
397         /* GEL_Reset() is used to deal with the worst case      */\r
398         /* senario of unknown target state.  If for some reason */\r
399         /* a reset is not desired upon target connection,       */\r
400         /* GEL_Reset() may be removed and replaced with         */\r
401         /* something "less brutal" like a cache initialization  */\r
402         /* function.                                            */\r
403         /*------------------------------------------------------*/\r
404         //GEL_Reset();\r
405         //xmc_setup();\r
406         //ddr3_setup();\r
407 \r
408         GEL_TextOut("\nConnecting Target...\n");\r
409 \r
410         // Check if target is not in real-time mode. If it is in stop mode,\r
411         // initialize everything. In real-time mode, do nothing to connect\r
412         // unobtrusively...\r
413         if (!GEL_IsInRealtimeMode())\r
414         {\r
415                 // Validates if emulation boot mode\r
416                 if (DEVSTAT & 0x0000000E)\r
417                 {\r
418                         GEL_TextOut("No initialization performed since bootmode = %x \n",,,,,(DEVSTAT >> 1 ) & 0xF);\r
419                         GEL_TextOut("You can manually initialize with GlobalDefaultSetup\n");\r
420                 }\r
421                 else\r
422                 {\r
423                         // Comment the following line at production application test\r
424                         // when the application need to initialize everything, but not the\r
425                         // GEL file.\r
426                         Global_Default_Setup_Silent();\r
427                 }\r
428         } else {\r
429                 GEL_TextOut("No initialization performed in real time mode\n");\r
430         }\r
431 }\r
432 \r
433 /*--------------------------------------------------------------*/\r
434 /* OnReset()                                                    */\r
435 /* This function is called by CCS when you do Debug->Resest.    */\r
436 /* The goal is to put the C6x into a known good state with      */\r
437 /* respect to cache, edma and interrupts.                       */\r
438 /*--------------------------------------------------------------*/\r
439 OnReset( int nErrorCode )\r
440 {\r
441 }\r
442 \r
443 /*--------------------------------------------------------------*/\r
444 /* xmc_setup()                                                  */\r
445 /* XMC MPAX register setting to access DDR3 config space        */\r
446 /*--------------------------------------------------------------*/\r
447 \r
448 #define XMC_BASE_ADDR (0x08000000)\r
449 #define XMPAX2_L     (*(int*)(XMC_BASE_ADDR + 0x00000010))\r
450 #define XMPAX2_H     (*(int*)(XMC_BASE_ADDR + 0x00000014))\r
451 \r
452 xmc_setup()\r
453 {\r
454         /* mapping for ddr emif registers XMPAX*2 */\r
455 \r
456         XMPAX2_L =  0x121010FF;  /* replacement addr + perm */\r
457         XMPAX2_H =  0x2101000B;    /* base addr + seg size (64KB)*/     //"1B"-->"B" by xj\r
458         GEL_TextOut("XMC setup complete.\n");\r
459 }\r
460 \r
461 /****************************************************************************\r
462  *\r
463  * NAME\r
464  *      Global_Default_Setup_Silent\r
465  *\r
466  * PURPOSE:\r
467  *      Setup almost everything ready for a new debug session:\r
468  *      DSP modules and EVM board modules.\r
469  *\r
470  * USAGE\r
471  *      This routine can be called as:\r
472  *\r
473  *      Global_Default_Setup_Silent()\r
474  *\r
475  * RETURN VALUE\r
476  *      NONE\r
477  *\r
478  * REFERENCE\r
479  *\r
480  ****************************************************************************/\r
481 Global_Default_Setup_Silent()\r
482 {\r
483         float gel_ver = GEL_VERSION;\r
484 \r
485         // Set DSP cache to pre defined values...\r
486         GEL_TextOut( "TCI6636K2E GEL file Ver is %f \n",,,,, (float) (gel_ver/1.0));\r
487 \r
488         //Set_DSP_Cache();\r
489 \r
490         // Only core 0 can set these\r
491         if (DNUM == 0)\r
492         {\r
493                 // Setup main PLL DSP @ 1 GHz\r
494                 Set_Pll1(3); // call Set_Pll1 with index = 3 -> 100 MHz to 1 GHz operation\r
495 \r
496                 // Setup all Power Domains on\r
497                 Set_Psc_All_On();\r
498 \r
499                 // Setup PA PLL\r
500                 PaPllConfig();\r
501 \r
502                 GEL_TextOut("DDR begin\n");\r
503                 xmc_setup();\r
504                 ddr3A_64bit_DDR1600_setup();\r
505                 GEL_TextOut("DDR done\n");\r
506         }\r
507 }\r
508 \r
509 /****************************************************************************\r
510  *\r
511  * NAME\r
512  *      Set_PSC_State\r
513  *\r
514  * PURPOSE:\r
515  *      Set a new power state for the specified domain id in a power controler\r
516  *      domain. Wait for the power transition to complete.\r
517  *\r
518  * USAGE\r
519  *      This routine can be called as:\r
520  *\r
521  *      Set_PSC_State(unsigned int pd,unsigned int id,unsigned int state)\r
522  *\r
523  *      pd    - (i) power domain.\r
524  *\r
525  *      id    - (i) module id to use for module in the specified power domain\r
526  *\r
527  *      state - (i) new state value to set\r
528  *                  0 = RESET\r
529  *                  1 = SYNC RESET\r
530  *                  2 = DISABLE\r
531  *                  3 = ENABLE\r
532  *\r
533  * RETURN VALUE\r
534  *      0 if ok, !=0 for error\r
535  *\r
536  * REFERENCE\r
537  *\r
538  ****************************************************************************/\r
539 Set_PSC_State(unsigned int pd,unsigned int id,unsigned int state)\r
540 {\r
541         unsigned int* mdctl;\r
542         unsigned int* mdstat;\r
543         unsigned int* pdctl;\r
544         int ret=0;\r
545 \r
546         // Only core0 can set PSC\r
547         if (DNUM == 0)\r
548         {\r
549                 mdctl = ( unsigned int* )(PSC_MDCTL_BASE + ( 4 * id ));\r
550                 mdstat = ( unsigned int* )( PSC_MDSTAT_BASE + ( 4 * id ));\r
551                 pdctl = ( unsigned int* )(PSC_PDCTL_BASE + ( 4 * pd ));\r
552 \r
553                 // If state is already set, do nothing\r
554                 if ( ( *mdstat & 0x1f ) == state )\r
555                 {\r
556                         return(0);\r
557                 }\r
558 \r
559                 // Wait for GOSTAT to clear\r
560                 Set_Timeout(GTIMEOUT);\r
561                 while( Get_Timeout() && (PSC_PTSTAT & (0x1 << pd)) != 0 );\r
562 \r
563                 // Check if we got timeout error while waiting\r
564                 if (!Get_Timeout())\r
565                 {\r
566                         GEL_TextOut( "Set_PSC_State... Timeout Error #01 pd=%d, md=%d!\n",,2,,,pd,id);\r
567                         ret=1;\r
568                 }\r
569                 else\r
570                 {\r
571                         // Set power domain control\r
572                         *pdctl = (*pdctl) | 0x00000001;\r
573 \r
574                         // Set MDCTL NEXT to new state\r
575                         *mdctl = ((*mdctl) & ~(0x1f)) | state;\r
576 \r
577                         // Start power transition by setting PTCMD GO to 1\r
578                         PSC_PTCMD = (PSC_PTCMD) | (0x1<<pd);\r
579 \r
580                         // Wait for PTSTAT GOSTAT to clear\r
581                         Set_Timeout(GTIMEOUT);\r
582                         while( Get_Timeout() && (PSC_PTSTAT & (0x1 << pd)) != 0 );\r
583 \r
584                         // Check if we got timeout error while waiting\r
585                         if (!Get_Timeout())\r
586                         {\r
587                                 GEL_TextOut( "Set_PSC_State... Timeout Error #02 pd=%d, md=%d!\n",,2,,,pd,id);\r
588                                 ret=2;\r
589                         }\r
590                         else\r
591                         {\r
592                                 // Verify state changed\r
593                                 Set_Timeout(GTIMEOUT);\r
594                                 while(Get_Timeout() && ( *mdstat & 0x1f ) != state );\r
595 \r
596                                 // Check if we got timeout error while waiting\r
597                                 if (!Get_Timeout())\r
598                                 {\r
599                                         GEL_TextOut( "Set_PSC_State... Timeout Error #03 pd=%d, md=%d!\n",,2,,,pd,id);\r
600                                         ret=3;\r
601                                 }\r
602                         }\r
603                 }\r
604 \r
605                 // Kill the currently running timeout\r
606                 Kill_Timeout();\r
607         }\r
608         else\r
609         {\r
610                 GEL_TextOut("DSP core #%d cannot set PSC.\n",,2,,,DNUM);\r
611         }\r
612 \r
613         return(ret);\r
614 }\r
615 \r
616 /****************************************************************************\r
617  *\r
618  * NAME\r
619  *      Set_Timeout\r
620  *\r
621  * PURPOSE:\r
622  *      Starts a timeout period of msec. The running timeout period can be\r
623  *      query with Get_Timeout. To kill a running timeout before the end,\r
624  *      call Kill_Timeout. Only one timeout period can be used at any time.\r
625  *      A timeout period can be used to measure a period of time while doing\r
626  *      anything else. Not accurate, sets timer at least as big as desired.\r
627  *\r
628  * USAGE\r
629  *      This routine can be called as:\r
630  *\r
631  *      Set_Timeout(msec)\r
632  *\r
633  *      msec - (i) timeout period in msec (not very precise < sec range)\r
634  *\r
635  * RETURN VALUE\r
636  *      NONE\r
637  *\r
638  * REFERENCE\r
639  *\r
640  ****************************************************************************/\r
641 Set_Timeout(msec)\r
642 {\r
643         // Cancel the current timer if not already expired\r
644         GEL_CancelTimer(TIMEOUT_ID);\r
645 \r
646         // Starts the timeout period\r
647         _GEL_Global_Timeout1=1;\r
648 \r
649         // Setup a callback routine with specified timeout\r
650         GEL_SetTimer(msec, TIMEOUT_ID, "_Timeout_Callback()");\r
651 }\r
652 \r
653 /****************************************************************************\r
654  *\r
655  * NAME\r
656  *      Get_Timeout\r
657  *\r
658  * PURPOSE:\r
659  *      Query the running state of a timeout period started by Set_Timeout.\r
660  *      (see Set_Timeout for more info).\r
661  *\r
662  * USAGE\r
663  *      This routine can be called as:\r
664  *\r
665  *      Get_Timeout()\r
666  *\r
667  * RETURN VALUE\r
668  *      0:expired, 1:running\r
669  *\r
670  * REFERENCE\r
671  *\r
672  ****************************************************************************/\r
673 Get_Timeout()\r
674 {\r
675         if (!_GEL_Global_Timeout1)\r
676         {\r
677                 // Cancel the current timer\r
678                 GEL_CancelTimer(TIMEOUT_ID);\r
679         }\r
680 \r
681         // Return the global timeout status 1=running, 0=expired\r
682         return _GEL_Global_Timeout1;\r
683 }\r
684 \r
685 /****************************************************************************\r
686  *\r
687  * NAME\r
688  *      Kill_Timeout\r
689  *\r
690  * PURPOSE:\r
691  *      Cancel a running timeout period before it expires\r
692  *      (see Set_Timeout for more info).\r
693  *\r
694  * USAGE\r
695  *      This routine can be called as:\r
696  *\r
697  *      Kill_Timeout()\r
698  *\r
699  * RETURN VALUE\r
700  *      NONE\r
701  *\r
702  * REFERENCE\r
703  *\r
704  ****************************************************************************/\r
705 Kill_Timeout()\r
706 {\r
707         // Cancel the current timer\r
708         GEL_CancelTimer(TIMEOUT_ID);\r
709 \r
710         // The timeout period is expired\r
711         _GEL_Global_Timeout1=0;\r
712 }\r
713 \r
714 /****************************************************************************\r
715  *\r
716  * NAME\r
717  *      _Timeout_Callback\r
718  *\r
719  * PURPOSE:\r
720  *      Internal Callback function used by Set_timeout\r
721  *      (see Set_Timeout for more info).\r
722  *\r
723  * USAGE\r
724  *      This routine must not be called by itself.\r
725  *\r
726  * RETURN VALUE\r
727  *      NONE\r
728  *\r
729  * REFERENCE\r
730  *\r
731  ****************************************************************************/\r
732 _Timeout_Callback()\r
733 {\r
734         // The timeout period is expired\r
735         _GEL_Global_Timeout1=0;\r
736 }\r
737 \r
738 \r
739 /****************************************************************************\r
740  *\r
741  * NAME\r
742  *      Set_Psc_All_On\r
743  *\r
744  * PURPOSE:\r
745  *      Enable all PSC modules and DSP power domains on ALWAYSON, and wait\r
746  *      for these power transitions to complete.\r
747  *\r
748  * USAGE\r
749  *      This routine can be called as:\r
750  *\r
751  *      Set_Psc_All_On()\r
752  *\r
753  * RETURN VALUE\r
754  *      NONE\r
755  *\r
756  * REFERENCE\r
757  *\r
758  ****************************************************************************/\r
759 hotmenu Set_Psc_All_On( )\r
760 {\r
761         unsigned int i=0;\r
762 \r
763         // Only core0 can set PSC\r
764         if (DNUM == 0)\r
765         {\r
766                 GEL_TextOut( "Power on all PSC modules and DSP domains... \n");\r
767 \r
768                 Set_PSC_State(PD0, LPSC_TSIP, PSC_ENABLE);\r
769                 Set_PSC_State(PD1, LPSC_DEBUG, PSC_ENABLE);\r
770                 Set_PSC_State(PD1, LPSC_TETB, PSC_ENABLE);\r
771                 Set_PSC_State(PD2, LPSC_PA, PSC_ENABLE);\r
772                 Set_PSC_State(PD2, LPSC_SGMII, PSC_ENABLE);\r
773 //              Set_PSC_State(PD2, LPSC_SA, PSC_ENABLE);\r
774                 Set_PSC_State(PD3, LPSC_PCIE, PSC_ENABLE);\r
775                 Set_PSC_State(PD5, LPSC_HYPERLINK, PSC_ENABLE);\r
776                 Set_PSC_State(PD6, LPSC_SR, PSC_ENABLE);\r
777                 Set_PSC_State(PD7, LPSC_MSMCRAM, PSC_ENABLE);\r
778                 Set_PSC_State(PD8, LPSC_C66X_COREPAC_0, PSC_ENABLE);\r
779                 Set_PSC_State(PD16, LPSC_DDR3_0, PSC_ENABLE);\r
780                 Set_PSC_State(PD18, LPSC_PCIE_1, PSC_ENABLE);\r
781                 Set_PSC_State(PD29, LPSC_XGE, PSC_ENABLE);\r
782                 Set_PSC_State(PD31, LPSC_ARM, PSC_ENABLE);\r
783 \r
784                 GEL_TextOut( "Power on all PSC modules and DSP domains... Done.\n" );\r
785         }\r
786         else\r
787         {\r
788                 GEL_TextOut("DSP core #%d cannot set PSC.\n",,2,,,DNUM);\r
789         }\r
790 }\r
791 \r
792 \r
793 //********************************************************************************************************************************\r
794 //********************************************************************************************************************************\r
795 /*\r
796    Set_Pll1() - This function executes the main PLL initialization \r
797    sequence needed to get the main PLL up after coming out of an initial power up \r
798    before it is locked or after it is already locked.\r
799 \r
800    Index value determines multiplier, divier used and clock reference assumed for \r
801    output display. \r
802  */\r
803 Set_Pll1(int index)\r
804 {\r
805         int i, TEMP;\r
806         unsigned int BYPASS_val;     \r
807         unsigned int BWADJ_val;     \r
808         unsigned int OD_val;            \r
809 \r
810         float CLKIN_val;\r
811         unsigned int PLLM_val;\r
812         unsigned int PLLD_val;\r
813         unsigned int PLLDIV3_val; //example value for SYSCLK2 (from 6614 spec) Default /2 - Fast Peripherals, (L2, MSMC, DDR3 EMIF, EDMA0...)\r
814         unsigned int PLLDIV4_val; //example value for SYSCLK3 (from 6614 spec) Default /3 - Switch Fabric\r
815         unsigned int PLLDIV7_val; //example value for SYSCLK6 (from 6614 spec) Defualt /6 - Slow Peripherals (UART, SPI, I2C, GPIO...)\r
816 \r
817         unsigned int debug_info_on;\r
818         unsigned int delay;\r
819 \r
820         if(index == 1){                  // 100 MHz -> 614.28 MHz\r
821                 CLKIN_val   = 100;       // setup CLKIN to 614.28 MHz\r
822                 PLLM_val    = 43;        // setup PLLM (PLL multiplier) to x43\r
823                 PLLD_val    = 1;         // setup PLLD (reference divider) to /1\r
824                 OD_val      = 7;         // setup OD to /7\r
825         }\r
826         else if(index == 2){             // 100MHz -> 737.5 MHz\r
827                 CLKIN_val   = 100;       // setup CLKIN to 100 MHz\r
828                 PLLM_val    = 59;        // setup PLLM (PLL multiplier) to x59\r
829                 PLLD_val    = 1;         // setup PLLD (reference divider) to /1\r
830                 OD_val      = 8;         // setup OD to  /8\r
831         }\r
832 \r
833         else if(index == 3){             // 100MHz -> 1 GHz\r
834                 CLKIN_val   = 100;       // setup CLKIN to 100 MHz\r
835                 PLLM_val    = 20;        // setup PLLM (PLL multiplier) to x20\r
836                 PLLD_val    = 1;         // setup PLLD (reference divider) to /1\r
837                 OD_val      = 2;         // setup OD to  /2\r
838         }\r
839 \r
840         else if(index == 4){             // 100 MHz -> 1.2 GHz\r
841                 CLKIN_val   = 100;       // setup CLKIN to 100 MHz\r
842                 PLLM_val    = 24;        // setup PLLM (PLL multiplier) to x24\r
843                 PLLD_val    = 1;         // setup PLLD (reference divider) to /1\r
844                 OD_val      = 2;         // setup OD to  /2\r
845         }\r
846         else if(index == 5){             // 100 MHz -> 1.35 GHz\r
847                 CLKIN_val   = 100;       // setup CLKIN to 100 MHz\r
848                 PLLM_val    = 27;        // setup PLLM (PLL multiplier) to x27\r
849                 PLLD_val    = 1;         // setup PLLD (reference divider) to /1\r
850                 OD_val      = 2;            // setup OD to /2\r
851         }\r
852 \r
853 \r
854 \r
855 \r
856         PLLDIV3_val = 3;            // setup PLL output divider 3 to /3\r
857         PLLDIV4_val = 5;            // setup PLL output divider 4 to /3\r
858         PLLDIV7_val = 6;            // setup PLL output divider 7 to /6\r
859 \r
860         BYPASS_val      = PLL1_SECCTL & ~BYPASS_MASK;   // get value of the BYPASS field\r
861         BWADJ_val       = (PLLM_val) >> 1;              // setup BWADJ to be 1/2 the value of PLLM\r
862         //OD_val          = 2;                            // setup OD to a fixed /2\r
863 \r
864         debug_info_on   = 1;\r
865         delay           = 1000; // fix this!\r
866 \r
867         /* Step 1: Unlock Boot Config Registers */\r
868         KICK0 = KICK0_UNLOCK;\r
869         KICK1 = KICK1_UNLOCK;\r
870 \r
871         /* Step 2: Check if SECCTL bypass is low or high indicating what state the Main PLL is currently in. if \r
872        the Main PLL is in bypass still (not yet setup) execute the following steps.  */\r
873 \r
874         if(BYPASS_val != 0x00000000){ // PLL bypass enabled - Execute PLL setup for PLL fresh out of power on reset\r
875                 if(debug_info_on){\r
876                         GEL_TextOut("Detected PLL bypass enabled: SECCTL[BYPASS] = %x\n",,,,, BYPASS_val);\r
877                 }\r
878                 /* Step 2a: Set MAINPLLCTL1[ENSAT] = 1 - This enables proper biasing of PLL analog circuitry */            \r
879                 MAINPLLCTL1 |= (1 << MAIN_ENSAT_OFFSET); \r
880                 if(debug_info_on){\r
881                         GEL_TextOut("(2a) MAINPLLCTL1 = %x\n",,,,, MAINPLLCTL1);\r
882                 }        \r
883 \r
884                 /* Step 2b: Set PLLCTL[PLLEN] = 0 This enables bypass in PLL controller MUX */        \r
885                 PLL1_PLLCTL &= ~(1 << PLLEN_OFFSET);        \r
886                 if(debug_info_on){    \r
887                         GEL_TextOut("(2b) PLLCTL = %x\n",,,,, PLL1_PLLCTL);\r
888                 }    \r
889 \r
890                 /* Step 2c: Set PLLCTL[PLLENSRC] = 0 - This enables PLLEN to control PLL controller MUX */    \r
891                 PLL1_PLLCTL &= ~(1 << PLLENSRC_OFFSET);\r
892                 if(debug_info_on){    \r
893                         GEL_TextOut("(2c) PLLCTL = %x\n",,,,, PLL1_PLLCTL);\r
894                 }    \r
895 \r
896                 /* Step 2d: Wait 4 reference clock cycles (slowest of ALTCORE or SYSCLK) to make sure \r
897            that the PLL controller MUX switches properly to bypass. */\r
898                 if(debug_info_on){    \r
899                         GEL_TextOut("(2d) Delay...\n",,,,,);\r
900                 }        \r
901                 for(i = 0; i < delay; i++); // this delay is much more than required         \r
902 \r
903                 /* Step 2e: Set SECCTL[BYPASS] = 1 - enables bypass in PLL MUX */    \r
904                 PLL1_SECCTL |= (1 << BYPASS_OFFSET);        \r
905                 if(debug_info_on){    \r
906                         GEL_TextOut("(2e) SECCTL = %x\n",,,,, PLL1_SECCTL);\r
907                 }    \r
908 \r
909                 /* Step 2f: Set PLLCTL[PLLPWRDN] = 1 - power down the PLL */        \r
910                 PLL1_PLLCTL |= (1 << PLLPWRDN_OFFSET);\r
911                 if(debug_info_on){    \r
912                         GEL_TextOut("(2f) PLLCTL = %x\n",,,,, PLL1_PLLCTL);\r
913                 }    \r
914 \r
915                 /* Step 2g: Wait for at least 5us for the PLL to power down */\r
916                 if(debug_info_on){    \r
917                         GEL_TextOut("(2g) Delay...\n",,,,,);\r
918                 }    \r
919                 for(i = 0; i < delay; i++); // this delay is much more than required \r
920 \r
921                 /* Step 2h: Set PLLCTL[PLLPWRDN] = 0 - Power the PLL back up */    \r
922                 PLL1_PLLCTL &= ~(1 << PLLPWRDN_OFFSET);\r
923                 if(debug_info_on){    \r
924                         GEL_TextOut("(2h) PLLCTL = %x\n",,,,, PLL1_PLLCTL);\r
925                 }            \r
926 \r
927         }\r
928         else{ // PLL bypass disabled - Execute PLL setup for PLL that has previously been locked (skip to Step 3)\r
929                 if(debug_info_on){    \r
930                         GEL_TextOut("Detected PLL bypass disabled: SECCTL[BYPASS] = %x\n",,,,, BYPASS_val);\r
931                 }\r
932 \r
933                 /* Step 3a: Set PLLCTL[PLLEN] = 0 This enables bypass in PLL controller MUX */        \r
934                 PLL1_PLLCTL &= ~(1 << PLLEN_OFFSET);        \r
935                 if(debug_info_on){    \r
936                         GEL_TextOut("(3a) PLLCTL = %x\n",,,,, PLL1_PLLCTL);\r
937                 }    \r
938 \r
939                 /* Step 3b: Set PLLCTL[PLLENSRC] = 0 - This enables PLLEN to control PLL controller MUX */    \r
940                 PLL1_PLLCTL &= ~(1 << PLLENSRC_OFFSET);\r
941                 if(debug_info_on){    \r
942                         GEL_TextOut("(3b) PLLCTL = %x\n",,,,, PLL1_PLLCTL);\r
943                 }\r
944 \r
945                 /* Step 3c: Wait 4 reference clock cycles (slowest of ALTCORE or SYSCLK) to make sure \r
946            that the PLL controller MUX switches properly to bypass. */\r
947                 if(debug_info_on){    \r
948                         GEL_TextOut("(3c) Delay...\n",,,,,);\r
949                 }        \r
950                 for(i = 0; i < delay; i++); // this delay is much more than required       \r
951 \r
952         }\r
953 \r
954 \r
955         /* Step 4: Programming PLLM[5:0] in the PLLM register of the PLL controller and\r
956        programming PLLM[12:6] in the MAINPLLCTL0 register */        \r
957         PLL1_PLLM &= PLLM_MASK;             // clear the PLLM[5:0] bit field\r
958         PLL1_PLLM |= ~PLLM_MASK & (PLLM_val - 1);   // set the PLLM[5:0] bit field to the 6 LSB of PLLM_val\r
959 \r
960         if(debug_info_on){\r
961                 GEL_TextOut("(4)PLLM[PLLM] = %x\n",,,,, PLL1_PLLM);\r
962         }    \r
963 \r
964         MAINPLLCTL0 &= MAIN_PLLM_MASK;      // clear the PLLM[12:6] bit field\r
965         MAINPLLCTL0 |= ~MAIN_PLLM_MASK & (( (PLLM_val - 1) >> 6) << MAIN_PLLM_OFFSET);  // set the PLLM[12:6] bit field to the 7 MSB of PLL_val\r
966 \r
967         if(debug_info_on){\r
968                 GEL_TextOut("MAINPLLCTL0 = %x\n",,,,, MAINPLLCTL0);\r
969         }\r
970 \r
971         /* Step 5: Programming BWADJ[7:0] in the MAINPLLCTL0 register and BWADJ[11:8] in MAINPLLCTL1 register */            \r
972         MAINPLLCTL0 &= MAIN_BWADJ0_MASK;    // clear the MAIN_BWADJ0 bit field\r
973         MAINPLLCTL0 |= ~MAIN_BWADJ0_MASK & ((BWADJ_val - 1) << MAIN_BWADJ0_OFFSET); // set the MAIN_BWADJ[7:0] bit field to the 8 LSB of BWADJ_val\r
974 \r
975         if(debug_info_on){\r
976                 GEL_TextOut("(5) MAINPLLCTL0 = %x\n",,,,, MAINPLLCTL0);\r
977         }\r
978 \r
979         MAINPLLCTL1 &= MAIN_BWADJ1_MASK;    // clear the MAIN_BWADJ1 bit field\r
980         MAINPLLCTL1 |= ~MAIN_BWADJ1_MASK & (( (BWADJ_val - 1) >> 8) << MAIN_BWADJ1_OFFSET); // set the MAIN_BWADJ[11:8] bit field to the 4 MSB of BWADJ_val\r
981 \r
982         if(debug_info_on){\r
983                 GEL_TextOut("(5) MAINPLLCTL1 = %x\n",,,,, MAINPLLCTL1);\r
984         }\r
985 \r
986         /* Step 6: Programming PLLD[5:0] in the MAINPLLCTL0 register */            \r
987         MAINPLLCTL0 &= MAIN_PLLD_MASK;      // clear the PLLD bit field\r
988         MAINPLLCTL0 |= ~MAIN_PLLD_MASK & (PLLD_val - 1);    // set the PLLD[5:0] bit field of PLLD to PLLD_val\r
989 \r
990         if(debug_info_on){\r
991                 GEL_TextOut("(6) MAINPLLCTL0 = %x\n",,,,, MAINPLLCTL0);\r
992         }\r
993 \r
994         /* Step 7: Programming OD[3:0] in the SECCTL register */            \r
995         PLL1_SECCTL &= OUTPUT_DIVIDE_MASK;  // clear the OD bit field\r
996         PLL1_SECCTL |= ~OUTPUT_DIVIDE_MASK & (OD_val - 1) << OUTPUT_DIVIDE_OFFSET;  // set the OD[3:0] bit field of PLLD to OD_val    \r
997 \r
998         if(debug_info_on){\r
999                 GEL_TextOut("(7) SECCTL = %x\n",,,,, PLL1_SECCTL);\r
1000         }\r
1001 \r
1002         /* Step 8: Following steps are needed to change the default output dividers */            \r
1003 \r
1004         /* Step 8a: Check that the GOSTAT bit in PLLSTAT is cleared to show that no GO\r
1005        operation is currently in progress*/\r
1006         if(debug_info_on){    \r
1007                 GEL_TextOut("(8a) Delay...\n",,,,,);\r
1008         }    \r
1009         while((PLL1_STAT) & 0x00000001);\r
1010 \r
1011         /* Step 8b: Program the RATIO field in PLLDIVn to the desired new divide-down rate.\r
1012        If RATIO field is changed, the PLL controller will flag the change in the\r
1013        corresponding bit of DCHANGE*/\r
1014         PLL1_DIV3 = (PLLDIV3_val-1) | 0x8000;  //Set PLLDIV3\r
1015         PLL1_DIV4 = (PLLDIV4_val-1) | 0x8000;  //Set PLLDIV4\r
1016         PLL1_DIV7 = (PLLDIV7_val-1) | 0x8000;  //Set PLLDIV7\r
1017 \r
1018         if(debug_info_on){\r
1019                 GEL_TextOut("PLL1_DIV3 = %x\n",,,,, PLL1_DIV3);\r
1020                 GEL_TextOut("PLL1_DIV4 = %x\n",,,,, PLL1_DIV4);\r
1021                 GEL_TextOut("PLL1_DIV7 = %x\n",,,,, PLL1_DIV7);\r
1022         }\r
1023 \r
1024         /* Step 8c: Set GOSET bit in PLLCMD to initiate the GO operation to change the divide\r
1025        values and align the SYSCLKs as programmed */\r
1026         PLL1_CMD |= 0x00000001;\r
1027 \r
1028         /*Step 8d/e: Read the GOSTAT bit in PLLSTAT to make sure the bit returns to 0 to\r
1029       indicate that the GO operation has completed */\r
1030         if(debug_info_on){    \r
1031                 GEL_TextOut("(8d/e) Delay...\n",,,,,);\r
1032         }    \r
1033         while((PLL1_STAT) & 0x00000001);\r
1034 \r
1035         /* Step 9: Set PLLCTL[PLLRST] = 1 - Assert PLL reset (Previously Step 3)*/        \r
1036         PLL1_PLLCTL |= (1 << PLLRST_OFFSET);\r
1037 \r
1038         /* Step 10: Wait for the at least 7us for the PLL reset properly (128 CLKIN1 cycles) */        \r
1039         if(debug_info_on){    \r
1040                 GEL_TextOut("(10) Delay...\n",,,,,);\r
1041         }    \r
1042         for(i=0;i<delay;i++);\r
1043 \r
1044         /* Step 11: Set PLLCTL[PLLRST] = 0 - De-Assert PLL reset */        \r
1045         PLL1_PLLCTL &= ~(1 << PLLRST_OFFSET);\r
1046 \r
1047         /* Step 12: Wait for PLL to lock (2000 CLKIN1 cycles) */\r
1048         if(debug_info_on){    \r
1049                 GEL_TextOut("(12) Delay...\n",,,,,);\r
1050         }    \r
1051         for(i=0;i<delay;i++);\r
1052 \r
1053         /* Step 13: In SECCTL, write BYPASS = 0 (enable PLL mux to switch to PLL mode) */\r
1054         PLL1_SECCTL &= ~(1 << BYPASS_OFFSET);        \r
1055         if(debug_info_on){    \r
1056                 GEL_TextOut("(13) SECCTL = %x\n",,,,, PLL1_SECCTL);\r
1057         }    \r
1058         if(debug_info_on){    \r
1059                 GEL_TextOut("(Delay...\n",,,,,);\r
1060         }    \r
1061         for(i=0;i<delay;i++);\r
1062         if(debug_info_on){    \r
1063                 GEL_TextOut("(Delay...\n",,,,,);\r
1064         }    \r
1065         for(i=0;i<delay;i++);\r
1066 \r
1067         /* Step 14: In PLLCTL, write PLLEN = 1 to enable PLL mode */\r
1068         PLL1_PLLCTL |= (1 << PLLEN_OFFSET);        \r
1069         if(debug_info_on){    \r
1070                 GEL_TextOut("(14) PLLCTL = %x\n",,,,, PLL1_PLLCTL);\r
1071         }    \r
1072 \r
1073         /* Step 15: Lock Boot Config Registers */\r
1074         KICK0 = 0x00000000;\r
1075         KICK1 = 0x00000000;\r
1076 \r
1077         GEL_TextOut("PLL has been configured (CLKIN * PLLM / PLLD / PLLOD = PLLOUT):\n",,,,,);\r
1078         GEL_TextOut("PLL has been configured (%f MHz * %d / %d / %d = %f MHz)\n",,,,, CLKIN_val, PLLM_val, PLLD_val,OD_val,(CLKIN_val * PLLM_val / PLLD_val / OD_val) );\r
1079 \r
1080 }\r
1081 \r
1082 \r
1083 //TODO: May need to change, as currently information is not available\r
1084 Set_Tetris_Pll(int index)\r
1085 {\r
1086 \r
1087         unsigned int BWADJ_val;     \r
1088         unsigned int OD_val;            \r
1089         unsigned int PLLM_val;\r
1090         float CLKIN_val;\r
1091         int i;\r
1092 \r
1093         GEL_TextOut("Switching on ARM Core 0\n",,,,,);\r
1094         TETRIS_CPU0_PDCTL   = 0x00000000;\r
1095         TETRIS_CPU0_PTCMD   = 0x00000001;    \r
1096 \r
1097         GEL_TextOut("Switching on ARM Core 1\n",,,,,);\r
1098         TETRIS_CPU1_PDCTL   = 0x00000000;\r
1099         TETRIS_CPU1_PTCMD   = 0x00000001;    \r
1100 \r
1101         GEL_TextOut("Switching on ARM Core 2\n",,,,,);\r
1102         TETRIS_CPU2_PDCTL   = 0x00000000;\r
1103         TETRIS_CPU2_PTCMD   = 0x00000001;    \r
1104 \r
1105         GEL_TextOut("Switching on ARM Core 3\n",,,,,);\r
1106         TETRIS_CPU3_PDCTL   = 0x00000000;\r
1107         TETRIS_CPU3_PTCMD   = 0x00000001;\r
1108 \r
1109         if(index == 1){              // 100 MHz -> 1.0 GHz\r
1110                 CLKIN_val   = 125;          // setup CLKIN to 125 MHz\r
1111                 PLLM_val    = 16;           // setup PLLM (PLL multiplier) to x20\r
1112                 OD_val      = 2;            // setup OD to a fixed /2\r
1113         }\r
1114         else if(index == 2){            // 100 MHz -> 1.4 GHz\r
1115                 CLKIN_val   = 125;          // setup CLKIN to 125 MHz\r
1116                 PLLM_val    = 22;           // setup PLLM (PLL multiplier) to x28\r
1117                 OD_val      = 2;            // setup OD to a fixed /2\r
1118         }\r
1119         else if(index == 3){            // 174.825MHz -> 1.4 GHz                //TODO: From where this freq will be available? Not shown in schematic.\r
1120 \r
1121                 CLKIN_val   = 174.825;      // setup CLKIN to 174.825 MHz\r
1122                 PLLM_val    = 16;           // setup PLLM (PLL multiplier) to x16\r
1123                 OD_val      = 2;            // setup OD to a fixed /2\r
1124         }\r
1125 \r
1126         BWADJ_val       = (PLLM_val-1) >> 1;            // setup BWADJ to be 1/2 the value of PLLM\r
1127         OD_val          = 2;                            // setup OD to a fixed /2\r
1128 \r
1129         /* Step 1: Unlock Boot Config Registers */\r
1130         KICK0 = KICK0_UNLOCK;\r
1131         KICK1 = KICK1_UNLOCK;\r
1132 \r
1133         //Step 1 : Assert SEC PLL Reset\r
1134         SECPLLCTL1 = ((1 << SEC_PLLCTL1_RESET_OFFSET) | (1 << SEC_PLLCTL1_ENSTAT_OFFSET));\r
1135 \r
1136         //Step 2 : Change CLKF/OD/BWADJ etc. for SEC PLL\r
1137         SECPLLCTL0 = ((BWADJ_val << SEC_PLLCTL0_BWADJ_OFFSET) |\r
1138                         ((OD_val-1) << SEC_PLLCTL0_OD_OFFSET)|\r
1139                         ((PLLM_val-1) << SEC_PLLCTL0_PLLM_OFFSET));\r
1140 \r
1141         //Step 3 : Make sure the resets are held for 5us\r
1142         for(i = 0; i < 200000; i++);\r
1143 \r
1144         //Step 4 : Remove SEC PLL reset\r
1145         SECPLLCTL1 = (1 << SEC_PLLCTL1_ENSTAT_OFFSET);\r
1146 \r
1147         //Step 5 : Wait for PLL to lock (4000 CLKIN1 cycles)\r
1148         for(i = 0; i < 4000; i++);\r
1149 \r
1150         //Step 6 : Get the PLL out of Bypass\r
1151         //SECPLLCTL0 &= ~(1 << SEC_PLLCTL0_BYPASS_OFFSET);\r
1152         CHIP_MISC1 |= (1 << ARMPLL_ENABLE_OFFSET); \r
1153 \r
1154 \r
1155         //Step 6 : Lock Boot Config Registers\r
1156         KICK0 = 0x00000000;\r
1157         KICK1 = 0x00000000;\r
1158 \r
1159         GEL_TextOut("ARM PLL has been configured (%f MHz * %d / %d = %f MHz)\n",,,,, CLKIN_val, PLLM_val, OD_val, (CLKIN_val * PLLM_val)/OD_val);\r
1160 \r
1161 }\r
1162 \r
1163 \r
1164 /* Set the desired PA PLL configuration */\r
1165 PaPllConfig()\r
1166 {\r
1167         unsigned int passclksel = (DEVSTAT & PASSCLKSEL_MASK);\r
1168         unsigned int papllctl0val_orig = PAPLLCTL0;\r
1169         unsigned int papllctl1val_orig = PAPLLCTL1;\r
1170         unsigned int papllctl0val_final;\r
1171         unsigned int papllctl1val_final;\r
1172         unsigned int papllclkf = 19; //204; // 204; 20 (if PASSREFCLK == 100mhz) Multiply by clkf + 1\r
1173         unsigned int papllclkd = 0;  //11;  // 11;   1 (if PASSREFCLK == 100mhz) Divide by clkd + 1\r
1174         unsigned int i = 0;\r
1175 \r
1176         if (passclksel != PASSCLKSEL_MASK) GEL_TextOut("WARNING: SYSCLK is the input to the PA PLL.\n");\r
1177 \r
1178         /* Unlock Chip Level Registers */\r
1179         KICK0 = KICK0_UNLOCK;\r
1180         KICK1 = KICK1_UNLOCK;\r
1181 \r
1182         // PAPLLCTL1 = PAPLLCTL1 | 0x00000040; //Set ENSAT = 1; Set PLL Select to 0 (for SYCLK0 as input of PASS)\r
1183         PAPLLCTL1 = PAPLLCTL1 | 0x00002040; //Set ENSAT = 1; Set PLL Select to 1 (for PA PLL as input of PASS)  \r
1184 \r
1185         /*in PAPLLCTL0, clear bypass bit to set the PA PLL in Bypass Mode*/\r
1186         //PAPLLCTL0 &= ~(1<<BYPASS_BIT_SHIFT); // Not setting Bypass bit\r
1187         PAPLLCTL0 |=  (1<<BYPASS_BIT_SHIFT); // Actually setting bypass bit\r
1188 \r
1189         /*Wait 4 cycles for the slowest of PLLOUT or reference clock source (CLKIN)*/\r
1190         for(i=0;i<100;i++);\r
1191 \r
1192         /*In PAPLLCTL1, write PLL reset bit to put the PLL in reset*/\r
1193         PAPLLCTL1 |= PA_PLL_RESET_MASK;\r
1194 \r
1195         /* Program the multiplier value */\r
1196         PAPLLCTL0 &= (~PA_PLL_CLKF_MASK);          //clear multiplier value\r
1197         PAPLLCTL0 &= (~PA_PLL_CLKR_MASK);          //clear divider value\r
1198         PAPLLCTL0 |= (papllclkf<<CLKF_BIT_SHIFT);  // set PLLM\r
1199         PAPLLCTL0 |= (papllclkd<<CLKD_BIT_SHIFT);  // set PLLD\r
1200 \r
1201 \r
1202         PAPLLCTL0 &= 0x00FFFFFF;\r
1203         PAPLLCTL0 |= ((((papllclkf + 1)>>1)-1)<<24);\r
1204 \r
1205         //PAPLLCTL1 = PAPLLCTL1 | 0x00002000;\r
1206 \r
1207         /*Wait for PLL to properly reset (128 CLKIN1 cycles) */\r
1208         for(i=0;i<1000;i++);\r
1209 \r
1210         /* take the PA PLL out of reset */\r
1211         PAPLLCTL1 &= (~PA_PLL_RESET_MASK);\r
1212 \r
1213         /*Wait for PLL to lock (2000 CLKIN1 cycles) */\r
1214         for(i=0;i<5000;i++);\r
1215 \r
1216         /* enable PLL mode */\r
1217         PAPLLCTL0 &= ~(1<<BYPASS_BIT_SHIFT); // actually setting PLL MODE\r
1218 \r
1219         for(i=0;i<4000;i++);\r
1220 \r
1221         /* Lock Chip Level Registers */\r
1222         KICK0 = KICK_LOCK;\r
1223         KICK1 = KICK_LOCK;\r
1224 \r
1225         papllctl0val_final = PAPLLCTL0;\r
1226         papllctl1val_final = PAPLLCTL1;\r
1227 \r
1228         GEL_TextOut("Completed PA PLL Setup\n");\r
1229         GEL_TextOut("PAPLLCTL0 - before: 0x%x\t after: 0x%x\n",,,,, papllctl0val_orig, papllctl0val_final);\r
1230         GEL_TextOut("PAPLLCTL1 - before: 0x%x\t after: 0x%x\n",,,,, papllctl1val_orig, papllctl1val_final);\r
1231 \r
1232         if ((papllctl0val_final != 0x09080500) || (papllctl1val_final != 0x00002040))\r
1233         {\r
1234                 return 1;\r
1235         }\r
1236 \r
1237         return 0;\r
1238 \r
1239 }\r
1240 \r
1241 //*************************************************************************************************\r
1242 //*************************************************************************************************\r
1243 //*************************************************************************************************\r
1244 //*************************************************************************************************\r
1245 //*************************************************************************************************\r
1246 //*************************************************************************************************\r
1247 \r
1248 //--------DDR3A Memory test----------------------\r
1249 \r
1250 ddr3A_memory_test ()\r
1251 {\r
1252         unsigned int index, value;\r
1253 \r
1254         GEL_TextOut( "DDR3A memory test... Started\n" );\r
1255 \r
1256         /* Write a pattern */\r
1257         for (index = DDR3A_TEST_START_ADDRESS; index < DDR3A_TEST_END_ADDRESS; index += 4) {\r
1258                 *index = index;\r
1259         }\r
1260 \r
1261         /* Read and check the pattern */\r
1262         for (index = DDR3A_TEST_START_ADDRESS; index < DDR3A_TEST_END_ADDRESS; index += 4) {\r
1263 \r
1264                 value = *index;\r
1265 \r
1266                 if (value  != index) {\r
1267                         GEL_TextOut( "DDR3A memory test... Failed\n" );\r
1268                         return -1;\r
1269                 }\r
1270         }\r
1271 \r
1272         /* Write a pattern for complementary values */\r
1273         for (index = DDR3A_TEST_START_ADDRESS; index < DDR3A_TEST_END_ADDRESS; index += 4) {\r
1274                 *index = ~index;\r
1275         }\r
1276 \r
1277         /* Read and check the pattern */\r
1278         for (index = DDR3A_TEST_START_ADDRESS; index < DDR3A_TEST_END_ADDRESS; index += 4) {\r
1279 \r
1280                 value = *index;\r
1281 \r
1282                 if (value  != ~index) {\r
1283                         GEL_TextOut( "DDR3A memory test... Failed\n" );\r
1284                         return -1;\r
1285                 }\r
1286         }\r
1287 \r
1288         GEL_TextOut( "DDR3A memory test... Passed\n" );\r
1289         return 0;\r
1290 \r
1291 }\r
1292 \r
1293 \r
1294 \r
1295 /****************************************************************************\r
1296  *\r
1297  * NAME\r
1298  *      Setup_Memory_Map\r
1299  *\r
1300  * PURPOSE:\r
1301  *      Setup the Memory Map for EVMC6678L.\r
1302  *      Defined memory location avoid debugger access outside these locations.\r
1303  *\r
1304  * USAGE\r
1305  *      This routine can be called as:\r
1306  *\r
1307  *      Setup_Memory_Map()\r
1308  *\r
1309  * RETURN VALUE\r
1310  *      NONE\r
1311  *\r
1312  * REFERENCE\r
1313  *      Based on TMS320C6678 datasheet.\r
1314  *\r
1315  ****************************************************************************/\r
1316 hotmenu Setup_Memory_Map( )\r
1317 {\r
1318         GEL_TextOut("Setup_Memory_Map...\n",,);\r
1319 \r
1320         GEL_MapOn( );\r
1321         GEL_MapReset( );\r
1322 \r
1323         GEL_MapAddStr( 0x00000000, 0, 0x21400000, "R|W|AS4", 0 );   // \r
1324         GEL_MapAddStr( 0x21400000,0, 0x00000080, "R|W|AS4", 0 );   // Hyperlink Config (remote) \r
1325         //GEL_MapAddStr( 0x21400080,0, 0x00000080, "R|W|AS4", 0 );   // Hyperlink Config (remote)\r
1326         GEL_MapAddStr( 0x21400200, 0, 0xdebffe00, "R|W|AS4", 0 );   // \r
1327         GEL_TextOut( "Setup_Memory_Map... Done.\n" );\r
1328 }\r
1329 \r
1330 /*----------------------------------------------------- DDR3A : DDR800, 32bit--------------------------------------------------------------------------*/\r
1331 ddr3A_32bit_DDR800_setup()\r
1332 {\r
1333         unsigned int multiplier = 3;\r
1334         unsigned int divider = 0;\r
1335         int temp;\r
1336         unsigned int OD_val = 2;\r
1337         KICK0 = 0x83E70B13;\r
1338         KICK1 = 0x95A4F1E0;\r
1339 \r
1340 \r
1341         //1.    Poll for IDONE=1 in the PHY General Status Register 0 (address offset 0x010).\r
1342         do { \r
1343                 read_val = DDR3A_PGSR0;\r
1344         } while ((read_val&0x00000001) != 0x00000001);\r
1345 \r
1346         //4.    Clocks are enabled and frequency is stable---------------------------------------\r
1347         //DDR3A PLL setup       \r
1348         GEL_TextOut ( "DDR3 PLL (PLL2) Setup ... \n");\r
1349         //DDR3APLLCTL0 = DDR3APLLCTL0 & 0xFF7FFFFF;\r
1350         //      Set ENSAT = 1\r
1351         DDR3APLLCTL1 |= 0x00000040;\r
1352         // Put the PLL in PLL Mode  \r
1353         DDR3APLLCTL0 |= 0x00800000;\r
1354         // In PLL Controller, reset the PLL (bit 13 in DDR3APLLCTL1 register) \r
1355         DDR3APLLCTL1 |= 0x00002000;\r
1356         // Program the necessary multipliers/dividers and BW adjustments            \r
1357         // Set the divider values \r
1358         DDR3APLLCTL0 &= ~(0x0000003F);\r
1359         DDR3APLLCTL0 |= (divider & 0x0000003F);\r
1360         /* Step 7: Programming OD[3:0] in the SECCTL register */            \r
1361         DDR3APLLCTL0 &= OUTPUT_DIVIDE_MASK;  // clear the OD bit field\r
1362         DDR3APLLCTL0 |= ~OUTPUT_DIVIDE_MASK & (OD_val - 1) << OUTPUT_DIVIDE_OFFSET;  // set the OD[3:0] bit field of PLLD to OD_val    \r
1363 \r
1364         /* Set the Multipler values */\r
1365         DDR3APLLCTL0 &= ~(0x0007FFC0);\r
1366         DDR3APLLCTL0 |= ((multiplier << 6) & 0x0007FFC0 );\r
1367         temp = ((multiplier + 1) >> 1) - 1;\r
1368         DDR3APLLCTL0 &= ~(0xFF000000); \r
1369         DDR3APLLCTL0 |= ((temp << 24) & 0xFF000000);\r
1370         DDR3APLLCTL1 &= ~(0x0000000F);\r
1371         DDR3APLLCTL1 |= ((temp >> 8) & 0x0000000F);\r
1372         //In DDR3PLLCTL1, write PLLRST = 0 to bring PLL out of reset \r
1373         DDR3APLLCTL1 &= ~(0x00002000);\r
1374         // Put the PLL in PLL Mode  \r
1375         DDR3APLLCTL0 &= ~(0x00800000); // ReSet the Bit 23\r
1376         GEL_TextOut( "DDR3 PLL Setup complete, DDR3A clock now running at 400MHz.\n" );\r
1377         //DDR3A PLL setup complete ---------------------------------------\r
1378 \r
1379         /*------------------------- Start PHY Configuration -------------------------------*/\r
1380 \r
1381         //DDR3A_PGCR1 = 0x0280C487;\r
1382 \r
1383         //5.a   Program FRQSEL in the PLL Control Register (address offset 0x018).\r
1384         DDR3A_PLLCR = 0xDC000; //Set FRQSEL=11, for ctl_clk between 166-275MHz\r
1385 \r
1386         //5.b.  Program WLSTEP=1, IODDRM=1, and ZCKSEL in the PHY General Configuration Register 1 (address offset 0x00C). \r
1387         DDR3A_PGCR1 |= (1 << 2); //WLSTEP = 1\r
1388 \r
1389         DDR3A_PGCR1 &= ~(IODDRM_MASK);\r
1390         DDR3A_PGCR1 |= (( 1 << 7) & IODDRM_MASK);\r
1391 \r
1392 \r
1393         DDR3A_PGCR1 &= ~(ZCKSEL_MASK);\r
1394         DDR3A_PGCR1 |= (( 1 << 23) & ZCKSEL_MASK);\r
1395 \r
1396 \r
1397         //5.c.  Program PHY Timing Parameters Register 0-4 (address offset 0x01C - 0x02C).\r
1398 \r
1399         DDR3A_PTR0 = 0x42C21590;\r
1400 \r
1401         DDR3A_PTR1 = 0xCFC712B3;\r
1402 \r
1403         // Maintaining default values of Phy Timing Parameters Register 2 in PUB\r
1404 \r
1405         DDR3A_PTR3 = 0x04430D40;//0x18061A80; \r
1406 \r
1407         DDR3A_PTR4 = 0x06413880;//0x0AAE7100;\r
1408 \r
1409         //5.d.  Program PDQ, MPRDQ, and BYTEMASK in the DRAM Configuration Register (address offset 0x044). \r
1410         //              All other fields must be left at their default values.\r
1411 \r
1412         DDR3A_DCR &= ~(PDQ_MASK); //PDQ = 0\r
1413         DDR3A_DCR &= ~(MPRDQ_MASK); //MPRDQ = 0\r
1414 \r
1415         DDR3A_DCR &= ~(BYTEMASK_MASK);\r
1416         DDR3A_DCR |= (( 1 << 10) & BYTEMASK_MASK);\r
1417 \r
1418 \r
1419         DDR3A_DCR &= ~(NOSRA_MASK);\r
1420         DDR3A_DCR |= (( 1 << 27) & NOSRA_MASK);\r
1421 \r
1422 \r
1423         DDR3A_DCR &= ~(UDIMM_MASK);\r
1424         DDR3A_DCR |= (( 1 << 29) & UDIMM_MASK);\r
1425 \r
1426 \r
1427         //5.e.  Program DRAM Timing Parameters Register 0-2 (address offset 0x048 - 0x050). \r
1428 \r
1429         DDR3A_DTPR0 = 0x008F6633; //0x50CE6644;\r
1430         DDR3A_DTPR1 = 0x12820180;\r
1431         DDR3A_DTPR2 = 0x50022A00;\r
1432 \r
1433         //5.f.  Program BL=0, CL, WR, and PD=1 in the Mode Register 0 (address offset 0x054). \r
1434         //All other fields must be left at their default values.\r
1435 \r
1436         DDR3A_MR0 = 0x00001620;\r
1437 \r
1438 \r
1439         //5.g.  Program DIC, RTT, and TDQS in the Mode Register 1 (address offset 0x058). \r
1440         //All other fields must be left at their default values.\r
1441 \r
1442         DDR3A_MR1 = 0x00000006;\r
1443 \r
1444 \r
1445         //---------------------------------------------------------------------------------------------------------                                     \r
1446 \r
1447         //5.h.  Program Mode Register 2 (address offset 0x05C).\r
1448         // Maintaining default values of Program Mode Register 2\r
1449         DDR3A_MR2 = 0x00000040;\r
1450 \r
1451         //5.i.  Program DTMPR=1, DTEXD, DTEXG, RANKEN=1 or 3, and RFSHDT=7 in the Data Training Configuration Register (address offset 0x068). \r
1452         //All other fields must be left at their default values.\r
1453         DDR3A_DTCR = 0x710035C7; //0x710035C7;\r
1454 \r
1455         //5.j.  Program tREFPRD=(5*tREFI/ddr_clk_period) in the PHY General Configuration Register 2 (address offset 0x08C). \r
1456         //All other fields must be left at their default values.\r
1457 \r
1458         DDR3A_PGCR2 = 0x00F03D09; //NOBUB = 0, FXDLAT = 0       \r
1459         //DDR3A_PGCR2 = 0x00F83D09; //NOBUB = 0, FXDLAT = 1 \r
1460 \r
1461         //Set Impedence Register        \r
1462         DDR3A_ZQ0CR1 = 0x0000007B; \r
1463         DDR3A_ZQ1CR1 = 0x0000007B;\r
1464         DDR3A_ZQ2CR1 = 0x0000007B;\r
1465 \r
1466 \r
1467         //6.    Re-trigger PHY initialization in DDR PHY through the VBUSP interface.\r
1468         //6.a.  Program 0x00000033 to the PHY Initialization Register (address offset 0x004) to re-trigger PLL, ZCAL, and DCAL initialization.\r
1469 \r
1470         DDR3A_PIR = 0x00000033;\r
1471 \r
1472         //6.b.  Poll for IDONE=1 in the PHY General Status Register 0 (address offset 0x010).\r
1473         do { \r
1474                 read_val = DDR3A_PGSR0;\r
1475         } while ((read_val&0x00000001) != 0x00000001);\r
1476 \r
1477         //---------------------------------------------------------------------------------------------------------                                     \r
1478 \r
1479 \r
1480 \r
1481         // 7.   Trigger DDR3 initialization and leveling/training in DDR PHY through the VBUSP interface.\r
1482         // a.   If using a 16-bit wide DDR interface, program DXEN=0 in the DATX8 2-7 General Configuration Registers (address offsets 0x240, 0x280, 0x2C0, 0x300, 0x340, and 0x380) to disable the leveling/training for the upper byte lanes.\r
1483         // b.   If using a 32-bit wide DDR interface, program DXEN=0 in the DATX8 4-7 General Configuration Registers (address offsets 0x2C0, 0x300, 0x340, and 0x380) to disable the leveling/training for the upper byte lanes.\r
1484         // c.   If ECC is not required, program DXEN=0 in the DATX8 8 General Configuration Register (address offset 0x3C0) to disable the leveling/training for the ECC byte lane.\r
1485         // NOTE: Setup supports 64-bit by default,  ECC enable by default.\r
1486 \r
1487         //7.d.  Program 0x0000XF81 to the PHY Initialization Register (address offset 0x004) to trigger DDR3 initialization and leveling/training sequences \r
1488 \r
1489         DDR3A_PIR = 0x0000FF81; //WLADJ - ON\r
1490         //DDR3A_PIR = 0x00000781;  //WLADJ - OFF\r
1491 \r
1492         //---------------------------------------------------------------------------------------------------------                                     \r
1493 \r
1494         //7.e.  Poll for IDONE=1 in the PHY General Status Register 0 (address offset 0x010).\r
1495         do {              \r
1496                 read_val = DDR3A_PGSR0;\r
1497         } while ((read_val&0x00000001) != 0x00000001);\r
1498 \r
1499 \r
1500         /* End PHY Configuration */             \r
1501         //---------------------------------------------------------------------------------------------------------                                     \r
1502         /* START EMIF INITIALIZATION\r
1503   ++++++++++++++++++SDCFG Register Calculation+++++++++++++++++++\r
1504   | 31 - 29  | 28 |27 - 25 | 24   | 23 - 22| 21 - 17 |\r
1505   |SDRAM_TYPE|Rsvd|DDR_TERM| DDQS | DYN_ODT|  Rsvd   |\r
1506   |  0x011   |  0 | 0x011  | 0x1  |   0x00 |   0x0   |\r
1507 \r
1508   | 16-14 |13 - 12 |  11 - 8 |  7   |6 - 5 |  4  |  3  |  2  |  1 - 0  |\r
1509   |   CWL | NM     |   CL    | Rsvd |IBANK | Rsvd|EBANK| Rsvd|PAGE_SIZE|\r
1510   |  0x11 | 0x00   |  0x1110 |  0x0 | 0x11 | 0x0 |  0  |  0  |   0x10  |\r
1511   SDCFG = 0x0110 0011 0010 0010 0011 0011 1011 0010\r
1512   SDCFG = 0x6700486A;//0x63223332\r
1513 \r
1514   SDRAM_TYPE = 3\r
1515   DDR_TERM = 3 (RZQ/4 = 1; RZQ/6=3)\r
1516   DDQS = 1 \r
1517   DYN_ODT = 0 \r
1518 \r
1519   CWL = 3 (CWL5=0; CWL6=1; CWL7=2; CWL8=3)\r
1520   NM = 0 (64-bit=0, 32-bit=1, 16-bit=2)\r
1521   CL = 14 (CL5=2; CL6=4; CL7=6; CL8=8; CL9=10; CL10=12; CL11=14)\r
1522   IBANK = 3 (8bank)\r
1523   EBANK = 0 (0 - pad_cs_o_n[0] , 1 - pad_cs_o_n[1:0])\r
1524   PAGE_SIZE = 2 (1024page-size=2; 2048page-size=3)\r
1525          */\r
1526         /* Start DDR3A EMIF Configuration */\r
1527         //8.    Configure the EMIF through the VBUSM interface.\r
1528         //8.a.  Program all EMIF MMR\92s.\r
1529         DDR3A_SDCFG    = 0x62001462     ; //0x6200046A\r
1530 \r
1531         DDR3A_SDTIM1   = 0x0A385022;\r
1532         DDR3A_SDTIM2   = 0x00001CA5;\r
1533         DDR3A_SDTIM3   = 0x210DFF22;\r
1534         DDR3A_SDTIM4   = 0x533F03FF;\r
1535 \r
1536         DDR3A_ZQCFG    = 0x70073200;    \r
1537         //8.b.  Program reg_initref_dis=0 in the SDRAM Refresh Control Register (address offset 0x10).\r
1538         DDR3A_SDRFC = 0x00000C34;\r
1539 \r
1540         GEL_TextOut("DDR3A initialization complete \n");\r
1541         /* End  DDR3A EMIF Configuration */\r
1542 \r
1543 }       \r
1544 \r
1545 \r
1546 /*----------------------------------------------------- DDR3A : DDR1066, 32bit--------------------------------------------------------------------------*/\r
1547 ddr3A_32bit_DDR1066_setup()\r
1548 {\r
1549 \r
1550         unsigned int multiplier = 15;\r
1551         unsigned int divider = 0;\r
1552         int temp;\r
1553         unsigned int OD_val = 6;\r
1554         KICK0 = 0x83E70B13;\r
1555         KICK1 = 0x95A4F1E0;\r
1556 \r
1557 \r
1558         //1.    Poll for IDONE=1 in the PHY General Status Register 0 (address offset 0x010).\r
1559         do { \r
1560                 read_val = DDR3A_PGSR0;\r
1561         } while ((read_val&0x00000001) != 0x00000001);\r
1562 \r
1563         //4.    Clocks are enabled and frequency is stable---------------------------------------\r
1564         //DDR3A PLL setup       \r
1565         GEL_TextOut ( "DDR3 PLL (PLL2) Setup ... \n");\r
1566         //DDR3APLLCTL0 = DDR3APLLCTL0 & 0xFF7FFFFF;\r
1567         //      Set ENSAT = 1\r
1568         DDR3APLLCTL1 |= 0x00000040;\r
1569         // Put the PLL in PLL Mode  \r
1570         DDR3APLLCTL0 |= 0x00800000;\r
1571         // In PLL Controller, reset the PLL (bit 13 in DDR3APLLCTL1 register) \r
1572         DDR3APLLCTL1 |= 0x00002000;\r
1573         // Program the necessary multipliers/dividers and BW adjustments            \r
1574         // Set the divider values \r
1575         DDR3APLLCTL0 &= ~(0x0000003F);\r
1576         DDR3APLLCTL0 |= (divider & 0x0000003F);\r
1577         /* Step 7: Programming OD[3:0] in the SECCTL register */            \r
1578         DDR3APLLCTL0 &= OUTPUT_DIVIDE_MASK;  // clear the OD bit field\r
1579         DDR3APLLCTL0 |= ~OUTPUT_DIVIDE_MASK & (OD_val - 1) << OUTPUT_DIVIDE_OFFSET;  // set the OD[3:0] bit field of PLLD to OD_val    \r
1580 \r
1581         /* Set the Multipler values */\r
1582         DDR3APLLCTL0 &= ~(0x0007FFC0);\r
1583         DDR3APLLCTL0 |= ((multiplier << 6) & 0x0007FFC0 );\r
1584         temp = ((multiplier + 1) >> 1) - 1;\r
1585         DDR3APLLCTL0 &= ~(0xFF000000); \r
1586         DDR3APLLCTL0 |= ((temp << 24) & 0xFF000000);\r
1587         DDR3APLLCTL1 &= ~(0x0000000F);\r
1588         DDR3APLLCTL1 |= ((temp >> 8) & 0x0000000F);\r
1589         //In DDR3PLLCTL1, write PLLRST = 0 to bring PLL out of reset \r
1590         DDR3APLLCTL1 &= ~(0x00002000);\r
1591         // Put the PLL in PLL Mode  \r
1592         DDR3APLLCTL0 &= ~(0x00800000); // ReSet the Bit 23\r
1593         GEL_TextOut( "DDR3 PLL Setup complete, DDR3A clock now running at 533MHz.\n" );\r
1594         //DDR3A PLL setup complete ---------------------------------------\r
1595 \r
1596         /*------------------------- Start PHY Configuration -------------------------------*/\r
1597 \r
1598         //DDR3A_PGCR1 = 0x0280C487;\r
1599 \r
1600         //5.a   Program FRQSEL in the PLL Control Register (address offset 0x018).\r
1601         DDR3A_PLLCR = 0xDC000; //Set FRQSEL=11, for ctl_clk between 166-275MHz\r
1602 \r
1603         //5.b.  Program WLSTEP=1, IODDRM=1, and ZCKSEL in the PHY General Configuration Register 1 (address offset 0x00C). \r
1604         DDR3A_PGCR1 |= (1 << 2); //WLSTEP = 1\r
1605 \r
1606         DDR3A_PGCR1 &= ~(IODDRM_MASK);\r
1607         DDR3A_PGCR1 |= (( 1 << 7) & IODDRM_MASK);\r
1608 \r
1609 \r
1610         DDR3A_PGCR1 &= ~(ZCKSEL_MASK);\r
1611         DDR3A_PGCR1 |= (( 1 << 23) & ZCKSEL_MASK);\r
1612 \r
1613 \r
1614         //5.c.  Program PHY Timing Parameters Register 0-4 (address offset 0x01C - 0x02C).\r
1615 \r
1616         DDR3A_PTR0 = 0x426213CF;\r
1617 \r
1618         DDR3A_PTR1 = 0xCFC712B3;        \r
1619 \r
1620         // Maintaining default values of Phy Timing Parameters Register 2 in PUB\r
1621 \r
1622         DDR3A_PTR3 = 0x05B411AA;//0x09041104;//0x18061A80; \r
1623 \r
1624         DDR3A_PTR4 = 0x0855A0AA;//0x0AAE7100;\r
1625 \r
1626         //5.d.  Program PDQ, MPRDQ, and BYTEMASK in the DRAM Configuration Register (address offset 0x044). \r
1627         //              All other fields must be left at their default values.\r
1628 \r
1629         DDR3A_DCR &= ~(PDQ_MASK); //PDQ = 0\r
1630 \r
1631         DDR3A_DCR &= ~(MPRDQ_MASK); //MPRDQ = 0\r
1632 \r
1633         DDR3A_DCR &= ~(BYTEMASK_MASK);\r
1634         DDR3A_DCR |= (( 1 << 10) & BYTEMASK_MASK);\r
1635 \r
1636 \r
1637         DDR3A_DCR &= ~(NOSRA_MASK);\r
1638         DDR3A_DCR |= (( 1 << 27) & NOSRA_MASK);\r
1639 \r
1640         //DDR3A_DCR &= ~(UDIMM_MASK);\r
1641         //DDR3A_DCR |= (( 1 << 29) & UDIMM_MASK);\r
1642 \r
1643         //RRMODE\r
1644         //DDR3A_DSGCR &= ~(RRMODE_MASK); //RR_MODE = 0\r
1645 \r
1646         //DDR3A_DSGCR &= ~(RRMODE_MASK); //RR_MODE = 1\r
1647         //DDR3A_DSGCR |= (( 1 << 18) & RRMODE_MASK);\r
1648 \r
1649 \r
1650         //5.e.  Program DRAM Timing Parameters Register 0-2 (address offset 0x048 - 0x050). \r
1651 \r
1652         DDR3A_DTPR0 = 0x54D47744;//0x6D148844;     //0x6D148844; 0x69137764 ---changed in rev 1.3\r
1653 \r
1654         DDR3A_DTPR1 = 0x1282AA00;//0x12845A00;\r
1655         DDR3A_DTPR2 = 0x50023200;\r
1656 \r
1657         //5.f.  Program BL=0, CL, WR, and PD=1 in the Mode Register 0 (address offset 0x054). \r
1658         //All other fields must be left at their default values.\r
1659 \r
1660         DDR3A_MR0 = 0x00001830;    //0x00001870; \r
1661 \r
1662 \r
1663         //5.g.  Program DIC, RTT, and TDQS in the Mode Register 1 (address offset 0x058). \r
1664         //All other fields must be left at their default values.\r
1665 \r
1666         DDR3A_MR1 =  0x00000006; //0x00000044;  ---changed in rev 1.3\r
1667 \r
1668 \r
1669         //---------------------------------------------------------------------------------------------------------                                     \r
1670 \r
1671         //5.h.  Program Mode Register 2 (address offset 0x05C).\r
1672         // Maintaining default values of Program Mode Register 2\r
1673         DDR3A_MR2 = 0x00000048;  //18   ---changed in rev 1.3\r
1674 \r
1675 \r
1676         //5.i.  Program DTMPR=1, DTEXD, DTEXG, RANKEN=1 or 3, and RFSHDT=7 in the Data Training Configuration Register (address offset 0x068). \r
1677         //All other fields must be left at their default values.\r
1678         DDR3A_DTCR = 0x710035C7; //0x730035C7;\r
1679 \r
1680         //5.j.  Program tREFPRD=(5*tREFI/ddr_clk_period) in the PHY General Configuration Register 2 (address offset 0x08C). \r
1681         //All other fields must be left at their default values.\r
1682 \r
1683         DDR3A_PGCR2 = 0x00F05161; //NOBUB = 0, FXDLAT = 0       \r
1684         //DDR3A_PGCR2 = 0x00F83D09; //NOBUB = 0, FXDLAT = 1 \r
1685 \r
1686 \r
1687         //Set Impedence Register        \r
1688         DDR3A_ZQ0CR1 = 0x0000007B; \r
1689         DDR3A_ZQ1CR1 = 0x0000007B;\r
1690         DDR3A_ZQ2CR1 = 0x0000007B;\r
1691 \r
1692 \r
1693 \r
1694         //6.    Re-trigger PHY initialization in DDR PHY through the VBUSP interface.\r
1695         //6.a.  Program 0x00000033 to the PHY Initialization Register (address offset 0x004) to re-trigger PLL, ZCAL, and DCAL initialization.\r
1696 \r
1697         DDR3A_PIR = 0x00000033;\r
1698 \r
1699         //6.b.  Poll for IDONE=1 in the PHY General Status Register 0 (address offset 0x010).\r
1700         do { \r
1701                 read_val = DDR3A_PGSR0;\r
1702         } while ((read_val&0x00000001) != 0x00000001);\r
1703 \r
1704         //---------------------------------------------------------------------------------------------------------                                     \r
1705 \r
1706 \r
1707 \r
1708         // 7.   Trigger DDR3 initialization and leveling/training in DDR PHY through the VBUSP interface.\r
1709         // a.   If using a 16-bit wide DDR interface, program DXEN=0 in the DATX8 2-7 General Configuration Registers (address offsets 0x240, 0x280, 0x2C0, 0x300, 0x340, and 0x380) to disable the leveling/training for the upper byte lanes.\r
1710         // b.   If using a 32-bit wide DDR interface, program DXEN=0 in the DATX8 4-7 General Configuration Registers (address offsets 0x2C0, 0x300, 0x340, and 0x380) to disable the leveling/training for the upper byte lanes.\r
1711         // c.   If ECC is not required, program DXEN=0 in the DATX8 8 General Configuration Register (address offset 0x3C0) to disable the leveling/training for the ECC byte lane.\r
1712         // NOTE: Setup supports 64-bit by default,  ECC enable by default.\r
1713 \r
1714         //7.d.  Program 0x0000XF81 to the PHY Initialization Register (address offset 0x004) to trigger DDR3 initialization and leveling/training sequences \r
1715 \r
1716         DDR3A_PIR = 0x0000FF81; //WLADJ - ON\r
1717         //DDR3A_PIR = 0x00000781;  //WLADJ - OFF\r
1718 \r
1719 \r
1720         //---------------------------------------------------------------------------------------------------------                                     \r
1721 \r
1722         //7.e.  Poll for IDONE=1 in the PHY General Status Register 0 (address offset 0x010).\r
1723         do {              \r
1724                 read_val = DDR3A_PGSR0;\r
1725         } while ((read_val&0x00000001) != 0x00000001);\r
1726 \r
1727 \r
1728         /* End PHY Configuration */             \r
1729         //---------------------------------------------------------------------------------------------------------                                     \r
1730         /* START EMIF INITIALIZATION\r
1731   ++++++++++++++++++SDCFG Register Calculation+++++++++++++++++++\r
1732   | 31 - 29  | 28 |27 - 25 | 24   | 23 - 22| 21 - 17 |\r
1733   |SDRAM_TYPE|Rsvd|DDR_TERM| DDQS | DYN_ODT|  Rsvd   |\r
1734   |  0x011   |  0 | 0x011  | 0x1  |   0x00 |   0x0   |\r
1735 \r
1736   | 16-14 |13 - 12 |  11 - 8 |  7   |6 - 5 |  4  |  3  |  2  |  1 - 0  |\r
1737   |   CWL | NM     |   CL    | Rsvd |IBANK | Rsvd|EBANK| Rsvd|PAGE_SIZE|\r
1738   |  0x11 | 0x00   |  0x1110 |  0x0 | 0x11 | 0x0 |  0  |  0  |   0x10  |\r
1739   SDCFG = 0x0110 0011 0010 0010 0011 0011 1011 0010\r
1740   SDCFG = 0x6700486A;//0x63223332\r
1741 \r
1742   SDRAM_TYPE = 3\r
1743   DDR_TERM = 3 (RZQ/4 = 1; RZQ/6=3)\r
1744   DDQS = 1 \r
1745   DYN_ODT = 0 \r
1746 \r
1747   CWL = 3 (CWL5=0; CWL6=1; CWL7=2; CWL8=3)\r
1748   NM = 0 (64-bit=0, 32-bit=1, 16-bit=2)\r
1749   CL = 14 (CL5=2; CL6=4; CL7=6; CL8=8; CL9=10; CL10=12; CL11=14)\r
1750   IBANK = 3 (8bank)\r
1751   EBANK = 0 (0 - pad_cs_o_n[0] , 1 - pad_cs_o_n[1:0])\r
1752   PAGE_SIZE = 2 (1024page-size=2; 2048page-size=3)\r
1753          */\r
1754         /* Start DDR3A EMIF Configuration */\r
1755         //8.    Configure the EMIF through the VBUSM interface.\r
1756         //8.a.  Program all EMIF MMR\92s.\r
1757         DDR3A_SDCFG    = 0x62005662; //0x62005662;\r
1758         DDR3A_SDTIM1   = 0x0E4C6833; //0x0E4C6833;//0x0E4C6833;\r
1759         DDR3A_SDTIM2   = 0x00001CC6;  //0x00001CE7;\r
1760         DDR3A_SDTIM3   = 0x3169FF32; //0x323DFF32;\r
1761         DDR3A_SDTIM4   = 0x533F054F; //0x533F08AF;\r
1762 \r
1763         DDR3A_ZQCFG    = 0x70073200;//0xF0073200;       \r
1764         //8.b.  Program reg_initref_dis=0 in the SDRAM Refresh Control Register (address offset 0x10).\r
1765         DDR3A_SDRFC = 0x00001045;\r
1766 \r
1767         GEL_TextOut("DDR3A initialization complete \n");\r
1768         /* End  DDR3A EMIF Configuration */\r
1769 \r
1770 }\r
1771 \r
1772 /*--------------------------------------------------\r
1773                         DDR3A : DDR1333,32bit  \r
1774 ---------------------------------------------------*/\r
1775 \r
1776 ddr3A_32bit_DDR1333_setup()     \r
1777 {\r
1778         unsigned int multiplier = 19;\r
1779         unsigned int divider = 0;\r
1780         int temp;\r
1781         unsigned int OD_val = 6;\r
1782         KICK0 = 0x83E70B13;\r
1783         KICK1 = 0x95A4F1E0;\r
1784 \r
1785 \r
1786         //1.    Poll for IDONE=1 in the PHY General Status Register 0 (address offset 0x010).\r
1787         do { \r
1788                 read_val = DDR3A_PGSR0;\r
1789         } while ((read_val&0x00000001) != 0x00000001);\r
1790 \r
1791         //4.    Clocks are enabled and frequency is stable---------------------------------------\r
1792         //DDR3A PLL setup       \r
1793         GEL_TextOut ( "DDR3 PLL (PLL2) Setup ... \n");\r
1794         //DDR3APLLCTL0 = DDR3APLLCTL0 & 0xFF7FFFFF;\r
1795         //      Set ENSAT = 1\r
1796         DDR3APLLCTL1 |= 0x00000040;\r
1797         // Put the PLL in PLL Mode  \r
1798         DDR3APLLCTL0 |= 0x00800000;\r
1799         // In PLL Controller, reset the PLL (bit 13 in DDR3APLLCTL1 register) \r
1800         DDR3APLLCTL1 |= 0x00002000;\r
1801         // Program the necessary multipliers/dividers and BW adjustments            \r
1802         // Set the divider values \r
1803         DDR3APLLCTL0 &= ~(0x0000003F);\r
1804         DDR3APLLCTL0 |= (divider & 0x0000003F);\r
1805         /* Step 7: Programming OD[3:0] in the SECCTL register */            \r
1806         DDR3APLLCTL0 &= OUTPUT_DIVIDE_MASK;  // clear the OD bit field\r
1807         DDR3APLLCTL0 |= ~OUTPUT_DIVIDE_MASK & (OD_val - 1) << OUTPUT_DIVIDE_OFFSET;  // set the OD[3:0] bit field of PLLD to OD_val    \r
1808 \r
1809         /* Set the Multipler values */\r
1810         DDR3APLLCTL0 &= ~(0x0007FFC0);\r
1811         DDR3APLLCTL0 |= ((multiplier << 6) & 0x0007FFC0 );\r
1812         temp = ((multiplier + 1) >> 1) - 1;\r
1813         DDR3APLLCTL0 &= ~(0xFF000000); \r
1814         DDR3APLLCTL0 |= ((temp << 24) & 0xFF000000);\r
1815         DDR3APLLCTL1 &= ~(0x0000000F);\r
1816         DDR3APLLCTL1 |= ((temp >> 8) & 0x0000000F);\r
1817         //In DDR3PLLCTL1, write PLLRST = 0 to bring PLL out of reset \r
1818         DDR3APLLCTL1 &= ~(0x00002000);\r
1819         // Put the PLL in PLL Mode  \r
1820         DDR3APLLCTL0 &= ~(0x00800000); // ReSet the Bit 23\r
1821         GEL_TextOut( "DDR3 PLL Setup complete, DDR3A clock now running at 666 MHz.\n" );\r
1822         //DDR3A PLL setup complete ---------------------------------------\r
1823 \r
1824         /*------------------------- Start PHY Configuration -------------------------------*/\r
1825 \r
1826         //DDR3A_PGCR1 = 0x0280C487;\r
1827 \r
1828         //5.a   Program FRQSEL in the PLL Control Register (address offset 0x018).\r
1829         DDR3A_PLLCR = 0x0005C000; //Set FRQSEL=01, for ctl_clk between 225-385MHz\r
1830 \r
1831         //5.b.  Program WLSTEP=1, IODDRM=1, and ZCKSEL in the PHY General Configuration Register 1 (address offset 0x00C). \r
1832         DDR3A_PGCR1 |= (1 << 2); //WLSTEP = 1\r
1833 \r
1834         DDR3A_PGCR1 &= ~(IODDRM_MASK);\r
1835         DDR3A_PGCR1 |= (( 1 << 7) & IODDRM_MASK);\r
1836 \r
1837 \r
1838         DDR3A_PGCR1 &= ~(ZCKSEL_MASK);\r
1839         DDR3A_PGCR1 |= (( 1 << 23) & ZCKSEL_MASK);\r
1840 \r
1841 \r
1842         //5.c.  Program PHY Timing Parameters Register 0-4 (address offset 0x01C - 0x02C).\r
1843 \r
1844         DDR3A_PTR0 = 0x426213CF;\r
1845 \r
1846         DDR3A_PTR1 = 0xCFC712B3;\r
1847 \r
1848         // Maintaining default values of Phy Timing Parameters Register 2 in PUB\r
1849 \r
1850         DDR3A_PTR3 = 0x07151615;//0x072515C2; //0x0B4515C2;//0x18061A80; \r
1851 \r
1852         DDR3A_PTR4 = 0x0A6A08D5;//0x0AAE7100;\r
1853 \r
1854         //5.d.  Program PDQ, MPRDQ, and BYTEMASK in the DRAM Configuration Register (address offset 0x044). \r
1855         //              All other fields must be left at their default values.\r
1856 \r
1857         DDR3A_DCR &= ~(PDQ_MASK); //PDQ = 0\r
1858 \r
1859         DDR3A_DCR &= ~(MPRDQ_MASK); //MPRDQ = 0\r
1860 \r
1861         DDR3A_DCR &= ~(BYTEMASK_MASK);\r
1862         DDR3A_DCR |= (( 1 << 10) & BYTEMASK_MASK);\r
1863 \r
1864 \r
1865         DDR3A_DCR &= ~(NOSRA_MASK);\r
1866         DDR3A_DCR |= (( 1 << 27) & NOSRA_MASK);\r
1867 \r
1868 \r
1869         //DDR3A_DCR &= ~(UDIMM_MASK);\r
1870         //DDR3A_DCR |= (( 1 << 29) & UDIMM_MASK);\r
1871 \r
1872 \r
1873         //5.e.  Program DRAM Timing Parameters Register 0-2 (address offset 0x048 - 0x050). \r
1874 \r
1875         DDR3A_DTPR0 = 0xAD189955;//0x85589975;//0x8558AA55;\r
1876         DDR3A_DTPR1 = 0x12835A80;//0x12835A80;//0x12857280;\r
1877         DDR3A_DTPR2 = 0x5002C200;\r
1878 \r
1879         //5.f.  Program BL=0, CL, WR, and PD=1 in the Mode Register 0 (address offset 0x054). \r
1880         //All other fields must be left at their default values.\r
1881 \r
1882         DDR3A_MR0 = 0x00001A60; //50\r
1883 \r
1884 \r
1885         //5.g.  Program DIC, RTT, and TDQS in the Mode Register 1 (address offset 0x058). \r
1886         //All other fields must be left at their default values.\r
1887 \r
1888         DDR3A_MR1 = 0x00000006;\r
1889 \r
1890 \r
1891         //---------------------------------------------------------------------------------------------------------                                     \r
1892 \r
1893         //5.h.  Program Mode Register 2 (address offset 0x05C).\r
1894         // Maintaining default values of Program Mode Register 2\r
1895         DDR3A_MR2 = 0x00000050;\r
1896 \r
1897         //5.i.  Program DTMPR=1, DTEXD, DTEXG, RANKEN=1 or 3, and RFSHDT=7 in the Data Training Configuration Register (address offset 0x068). \r
1898         //All other fields must be left at their default values.\r
1899         DDR3A_DTCR = 0x710035C7; //0x730035C7;\r
1900 \r
1901         //5.j.  Program tREFPRD=(5*tREFI/ddr_clk_period) in the PHY General Configuration Register 2 (address offset 0x08C). \r
1902         //All other fields must be left at their default values.\r
1903 \r
1904         DDR3A_PGCR2 = 0x00F065B9; //NOBUB = 0, FXDLAT = 0       \r
1905         //DDR3A_PGCR2 = 0x00F83D09; //NOBUB = 0, FXDLAT = 1 \r
1906 \r
1907         //Set Impedence Register        \r
1908         DDR3A_ZQ0CR1 = 0x0000007B; \r
1909         DDR3A_ZQ1CR1 = 0x0000007B;\r
1910         DDR3A_ZQ2CR1 = 0x0000007B;\r
1911         //DDR3A_ZQ3CR1 = 0x0000005D;\r
1912 \r
1913         //6.    Re-trigger PHY initialization in DDR PHY through the VBUSP interface.\r
1914         //6.a.  Program 0x00000033 to the PHY Initialization Register (address offset 0x004) to re-trigger PLL, ZCAL, and DCAL initialization.\r
1915 \r
1916         DDR3A_PIR = 0x00000033;\r
1917 \r
1918         //6.b.  Poll for IDONE=1 in the PHY General Status Register 0 (address offset 0x010).\r
1919         do { \r
1920                 read_val = DDR3A_PGSR0;\r
1921         } while ((read_val&0x00000001) != 0x00000001);\r
1922 \r
1923         //---------------------------------------------------------------------------------------------------------                                     \r
1924 \r
1925 \r
1926 \r
1927         // 7.   Trigger DDR3 initialization and leveling/training in DDR PHY through the VBUSP interface.\r
1928         // a.   If using a 16-bit wide DDR interface, program DXEN=0 in the DATX8 2-7 General Configuration Registers (address offsets 0x240, 0x280, 0x2C0, 0x300, 0x340, and 0x380) to disable the leveling/training for the upper byte lanes.\r
1929         // b.   If using a 32-bit wide DDR interface, program DXEN=0 in the DATX8 4-7 General Configuration Registers (address offsets 0x2C0, 0x300, 0x340, and 0x380) to disable the leveling/training for the upper byte lanes.\r
1930         // c.   If ECC is not required, program DXEN=0 in the DATX8 8 General Configuration Register (address offset 0x3C0) to disable the leveling/training for the ECC byte lane.\r
1931         // NOTE: Setup supports 64-bit by default,  ECC enable by default.\r
1932 \r
1933         //7.d.  Program 0x0000XF81 to the PHY Initialization Register (address offset 0x004) to trigger DDR3 initialization and leveling/training sequences \r
1934 \r
1935         DDR3A_PIR = 0x0000FF81; //WLADJ - ON\r
1936         //DDR3A_PIR = 0x00000781;  //WLADJ - OFF\r
1937 \r
1938 \r
1939         //---------------------------------------------------------------------------------------------------------                                     \r
1940 \r
1941         //7.e.  Poll for IDONE=1 in the PHY General Status Register 0 (address offset 0x010).\r
1942         do {              \r
1943                 read_val = DDR3A_PGSR0;\r
1944         } while ((read_val&0x00000001) != 0x00000001);\r
1945 \r
1946 \r
1947         /* End PHY Configuration */             \r
1948         //---------------------------------------------------------------------------------------------------------                                     \r
1949         /* START EMIF INITIALIZATION\r
1950   ++++++++++++++++++SDCFG Register Calculation+++++++++++++++++++\r
1951   | 31 - 29  | 28 |27 - 25 | 24   | 23 - 22| 21 - 17 |\r
1952   |SDRAM_TYPE|Rsvd|DDR_TERM| DDQS | DYN_ODT|  Rsvd   |\r
1953   |  0x011   |  0 | 0x011  | 0x1  |   0x00 |   0x0   |\r
1954 \r
1955   | 16-14 |13 - 12 |  11 - 8 |  7   |6 - 5 |  4  |  3  |  2  |  1 - 0  |\r
1956   |   CWL | NM     |   CL    | Rsvd |IBANK | Rsvd|EBANK| Rsvd|PAGE_SIZE|\r
1957   |  0x11 | 0x00   |  0x1110 |  0x0 | 0x11 | 0x0 |  0  |  0  |   0x10  |\r
1958   SDCFG = 0x0110 0011 0010 0010 0011 0011 1011 0010\r
1959   SDCFG = 0x6700486A;//0x63223332\r
1960 \r
1961   SDRAM_TYPE = 3\r
1962   DDR_TERM = 3 (RZQ/4 = 1; RZQ/6=3)\r
1963   DDQS = 1 \r
1964   DYN_ODT = 0 \r
1965 \r
1966   CWL = 3 (CWL5=0; CWL6=1; CWL7=2; CWL8=3)\r
1967   NM = 0 (64-bit=0, 32-bit=1, 16-bit=2)\r
1968   CL = 14 (CL5=2; CL6=4; CL7=6; CL8=8; CL9=10; CL10=12; CL11=14)\r
1969   IBANK = 3 (8bank)\r
1970   EBANK = 0 (0 - pad_cs_o_n[0] , 1 - pad_cs_o_n[1:0])\r
1971   PAGE_SIZE = 2 (1024page-size=2; 2048page-size=3)\r
1972          */\r
1973         /* Start DDR3A EMIF Configuration */\r
1974         //8.    Configure the EMIF through the VBUSM interface.\r
1975         //8.a.  Program all EMIF MMR\92s.\r
1976         DDR3A_SDCFG    = 0x62009C62; // 9A62//0x62008C62        ;//0x6600CE62=single rank,0x6600CE6A=dual rank\r
1977 \r
1978         DDR3A_SDTIM1   = 0x125C7C44;\r
1979         DDR3A_SDTIM2   = 0x00001D08;\r
1980         DDR3A_SDTIM3   = 0x31C1FF43;\r
1981         DDR3A_SDTIM4   = 0x543F06AF;\r
1982 \r
1983         DDR3A_ZQCFG    = 0x70073200;    \r
1984         //8.b.  Program reg_initref_dis=0 in the SDRAM Refresh Control Register (address offset 0x10).\r
1985         DDR3A_SDRFC = 0x00001457;\r
1986 \r
1987         GEL_TextOut("DDR3A initialization complete \n");\r
1988         /* End  DDR3A EMIF Configuration */\r
1989 }\r
1990 \r
1991 \r
1992 /*--------------------------------------------------\r
1993                         DDR3A : DDR1600,64bit  \r
1994 ---------------------------------------------------*/\r
1995 \r
1996 ddr3A_64bit_DDR1600_setup()     \r
1997 {\r
1998         unsigned int multiplier = 7;\r
1999         unsigned int divider = 0;\r
2000         int temp;\r
2001         unsigned int OD_val = 2;\r
2002         KICK0 = 0x83E70B13;\r
2003         KICK1 = 0x95A4F1E0;\r
2004 \r
2005 \r
2006         //1.    Poll for IDONE=1 in the PHY General Status Register 0 (address offset 0x010).\r
2007         do { \r
2008                 read_val = DDR3A_PGSR0;\r
2009         } while ((read_val&0x00000001) != 0x00000001);\r
2010 \r
2011         //4.    Clocks are enabled and frequency is stable---------------------------------------\r
2012         //DDR3A PLL setup       \r
2013         GEL_TextOut ( "DDR3 PLL (PLL2) Setup ... \n");\r
2014         //DDR3APLLCTL0 = DDR3APLLCTL0 & 0xFF7FFFFF;\r
2015         //      Set ENSAT = 1\r
2016         DDR3APLLCTL1 |= 0x00000040;\r
2017         // Put the PLL in PLL Mode  \r
2018         DDR3APLLCTL0 |= 0x00800000;\r
2019         // In PLL Controller, reset the PLL (bit 13 in DDR3APLLCTL1 register) \r
2020         DDR3APLLCTL1 |= 0x00002000;\r
2021         // Program the necessary multipliers/dividers and BW adjustments            \r
2022         // Set the divider values \r
2023         DDR3APLLCTL0 &= ~(0x0000003F);\r
2024         DDR3APLLCTL0 |= (divider & 0x0000003F);\r
2025         /* Step 7: Programming OD[3:0] in the SECCTL register */            \r
2026         DDR3APLLCTL0 &= OUTPUT_DIVIDE_MASK;  // clear the OD bit field\r
2027         DDR3APLLCTL0 |= ~OUTPUT_DIVIDE_MASK & (OD_val - 1) << OUTPUT_DIVIDE_OFFSET;  // set the OD[3:0] bit field of PLLD to OD_val    \r
2028 \r
2029         /* Set the Multipler values */\r
2030         DDR3APLLCTL0 &= ~(0x0007FFC0);\r
2031         DDR3APLLCTL0 |= ((multiplier << 6) & 0x0007FFC0 );\r
2032         temp = ((multiplier + 1) >> 1) - 1;\r
2033         DDR3APLLCTL0 &= ~(0xFF000000); \r
2034         DDR3APLLCTL0 |= ((temp << 24) & 0xFF000000);\r
2035         DDR3APLLCTL1 &= ~(0x0000000F);\r
2036         DDR3APLLCTL1 |= ((temp >> 8) & 0x0000000F);\r
2037         //In DDR3PLLCTL1, write PLLRST = 0 to bring PLL out of reset \r
2038         DDR3APLLCTL1 &= ~(0x00002000);\r
2039         // Put the PLL in PLL Mode  \r
2040         DDR3APLLCTL0 &= ~(0x00800000); // ReSet the Bit 23\r
2041         GEL_TextOut( "DDR3 PLL Setup complete, DDR3A clock now running at 666 MHz.\n" );\r
2042         //DDR3A PLL setup complete ---------------------------------------\r
2043 \r
2044         /*------------------------- Start PHY Configuration -------------------------------*/\r
2045 \r
2046         //DDR3A_PGCR1 = 0x0280C487;\r
2047 \r
2048         //5.a   Program FRQSEL in the PLL Control Register (address offset 0x018).\r
2049         DDR3A_PLLCR = 0x1C000; //Set FRQSEL=00, for ctl_clk between 335-533MHz\r
2050 \r
2051         //5.b.  Program WLSTEP=1, IODDRM=1, and ZCKSEL in the PHY General Configuration Register 1 (address offset 0x00C). \r
2052         DDR3A_PGCR1 |= (1 << 2); //WLSTEP = 1\r
2053 \r
2054         DDR3A_PGCR1 &= ~(IODDRM_MASK);\r
2055         DDR3A_PGCR1 |= (( 1 << 7) & IODDRM_MASK);\r
2056 \r
2057 \r
2058         DDR3A_PGCR1 &= ~(ZCKSEL_MASK);\r
2059         DDR3A_PGCR1 |= (( 1 << 23) & ZCKSEL_MASK);\r
2060 \r
2061 \r
2062         //5.c.  Program PHY Timing Parameters Register 0-4 (address offset 0x01C - 0x02C).\r
2063 \r
2064         DDR3A_PTR0 = 0x426213CF;\r
2065 \r
2066         DDR3A_PTR1 = 0xCFC712B3;\r
2067 \r
2068         // Maintaining default values of Phy Timing Parameters Register 2 in PUB\r
2069 \r
2070         DDR3A_PTR3 = 0x08861A80;//0x072515C2; //0x0B4515C2;//0x18061A80; \r
2071 \r
2072         DDR3A_PTR4 = 0x0C827100;//0x0AAE7100;\r
2073 \r
2074         //5.d.  Program PDQ, MPRDQ, and BYTEMASK in the DRAM Configuration Register (address offset 0x044). \r
2075         //              All other fields must be left at their default values.\r
2076 \r
2077         DDR3A_DCR &= ~(PDQ_MASK); //PDQ = 0\r
2078 \r
2079         DDR3A_DCR &= ~(MPRDQ_MASK); //MPRDQ = 0\r
2080 \r
2081         DDR3A_DCR &= ~(BYTEMASK_MASK);\r
2082         DDR3A_DCR |= (( 1 << 10) & BYTEMASK_MASK);\r
2083 \r
2084 \r
2085         DDR3A_DCR &= ~(NOSRA_MASK);\r
2086         DDR3A_DCR |= (( 1 << 27) & NOSRA_MASK);\r
2087 \r
2088 \r
2089         //DDR3A_DCR &= ~(UDIMM_MASK);\r
2090         //DDR3A_DCR |= (( 1 << 29) & UDIMM_MASK);\r
2091 \r
2092 \r
2093         //5.e.  Program DRAM Timing Parameters Register 0-2 (address offset 0x048 - 0x050). \r
2094 \r
2095         DDR3A_DTPR0 = 0x011CBB66;//0x85589975;//0x8558AA55;\r
2096         DDR3A_DTPR1 = 0x12840300;//0x12835A80;//0x12857280;\r
2097         DDR3A_DTPR2 = 0x5002CE00;\r
2098 \r
2099         //5.f.  Program BL=0, CL, WR, and PD=1 in the Mode Register 0 (address offset 0x054). \r
2100         //All other fields must be left at their default values.\r
2101 \r
2102         DDR3A_MR0 = 0x00001C70; //50\r
2103 \r
2104 \r
2105         //5.g.  Program DIC, RTT, and TDQS in the Mode Register 1 (address offset 0x058). \r
2106         //All other fields must be left at their default values.\r
2107 \r
2108         DDR3A_MR1 = 0x00000006;\r
2109 \r
2110 \r
2111         //---------------------------------------------------------------------------------------------------------                                     \r
2112 \r
2113         //5.h.  Program Mode Register 2 (address offset 0x05C).\r
2114         // Maintaining default values of Program Mode Register 2\r
2115         DDR3A_MR2 = 0x00000058;\r
2116 \r
2117         //5.i.  Program DTMPR=1, DTEXD, DTEXG, RANKEN=1 or 3, and RFSHDT=7 in the Data Training Configuration Register (address offset 0x068). \r
2118         //All other fields must be left at their default values.\r
2119         DDR3A_DTCR = 0x710035C7; //0x730035C7;\r
2120 \r
2121         //5.j.  Program tREFPRD=(5*tREFI/ddr_clk_period) in the PHY General Configuration Register 2 (address offset 0x08C). \r
2122         //All other fields must be left at their default values.\r
2123 \r
2124         DDR3A_PGCR2 = 0x00F07A12; //NOBUB = 0, FXDLAT = 0       \r
2125         //DDR3A_PGCR2 = 0x00F83D09; //NOBUB = 0, FXDLAT = 1 \r
2126 \r
2127         //Set Impedence Register        \r
2128         DDR3A_ZQ0CR1 = 0x0000007B; \r
2129         DDR3A_ZQ1CR1 = 0x0000007B;\r
2130         DDR3A_ZQ2CR1 = 0x0000007B;\r
2131         //DDR3A_ZQ3CR1 = 0x0000005D;\r
2132 \r
2133         //6.    Re-trigger PHY initialization in DDR PHY through the VBUSP interface.\r
2134         //6.a.  Program 0x00000033 to the PHY Initialization Register (address offset 0x004) to re-trigger PLL, ZCAL, and DCAL initialization.\r
2135 \r
2136         DDR3A_PIR = 0x00000033;\r
2137 \r
2138         //6.b.  Poll for IDONE=1 in the PHY General Status Register 0 (address offset 0x010).\r
2139         do { \r
2140                 read_val = DDR3A_PGSR0;\r
2141         } while ((read_val&0x00000001) != 0x00000001);\r
2142 \r
2143         //---------------------------------------------------------------------------------------------------------                                     \r
2144 \r
2145 \r
2146 \r
2147         // 7.   Trigger DDR3 initialization and leveling/training in DDR PHY through the VBUSP interface.\r
2148         // a.   If using a 16-bit wide DDR interface, program DXEN=0 in the DATX8 2-7 General Configuration Registers (address offsets 0x240, 0x280, 0x2C0, 0x300, 0x340, and 0x380) to disable the leveling/training for the upper byte lanes.\r
2149         // b.   If using a 32-bit wide DDR interface, program DXEN=0 in the DATX8 4-7 General Configuration Registers (address offsets 0x2C0, 0x300, 0x340, and 0x380) to disable the leveling/training for the upper byte lanes.\r
2150         // c.   If ECC is not required, program DXEN=0 in the DATX8 8 General Configuration Register (address offset 0x3C0) to disable the leveling/training for the ECC byte lane.\r
2151         // NOTE: Setup supports 64-bit by default,  ECC enable by default.\r
2152 \r
2153         //7.d.  Program 0x0000XF81 to the PHY Initialization Register (address offset 0x004) to trigger DDR3 initialization and leveling/training sequences \r
2154 \r
2155         DDR3A_PIR = 0x0000FF81; //WLADJ - ON\r
2156         //DDR3A_PIR = 0x00000781;  //WLADJ - OFF\r
2157 \r
2158 \r
2159         //---------------------------------------------------------------------------------------------------------                                     \r
2160 \r
2161         //7.e.  Poll for IDONE=1 in the PHY General Status Register 0 (address offset 0x010).\r
2162         do {              \r
2163                 read_val = DDR3A_PGSR0;\r
2164         } while ((read_val&0x00000001) != 0x00000001);\r
2165 \r
2166 \r
2167         /* End PHY Configuration */             \r
2168         //---------------------------------------------------------------------------------------------------------                                     \r
2169         /* START EMIF INITIALIZATION\r
2170   ++++++++++++++++++SDCFG Register Calculation+++++++++++++++++++\r
2171   | 31 - 29  | 28 |27 - 25 | 24   | 23 - 22| 21 - 17 |\r
2172   |SDRAM_TYPE|Rsvd|DDR_TERM| DDQS | DYN_ODT|  Rsvd   |\r
2173   |  0x011   |  0 | 0x011  | 0x1  |   0x00 |   0x0   |\r
2174 \r
2175   | 16-14 |13 - 12 |  11 - 8 |  7   |6 - 5 |  4  |  3  |  2  |  1 - 0  |\r
2176   |   CWL | NM     |   CL    | Rsvd |IBANK | Rsvd|EBANK| Rsvd|PAGE_SIZE|\r
2177   |  0x11 | 0x00   |  0x1110 |  0x0 | 0x11 | 0x0 |  0  |  0  |   0x10  |\r
2178   SDCFG = 0x0110 0011 0010 0010 0011 0011 1011 0010\r
2179   SDCFG = 0x6700486A;//0x63223332\r
2180 \r
2181   SDRAM_TYPE = 3\r
2182   DDR_TERM = 3 (RZQ/4 = 1; RZQ/6=3)\r
2183   DDQS = 1 \r
2184   DYN_ODT = 0 \r
2185 \r
2186   CWL = 3 (CWL5=0; CWL6=1; CWL7=2; CWL8=3)\r
2187   NM = 0 (64-bit=0, 32-bit=1, 16-bit=2)\r
2188   CL = 14 (CL5=2; CL6=4; CL7=6; CL8=8; CL9=10; CL10=12; CL11=14)\r
2189   IBANK = 3 (8bank)\r
2190   EBANK = 0 (0 - pad_cs_o_n[0] , 1 - pad_cs_o_n[1:0])\r
2191   PAGE_SIZE = 2 (1024page-size=2; 2048page-size=3)\r
2192          */\r
2193         /* Start DDR3A EMIF Configuration */\r
2194         //8.    Configure the EMIF through the VBUSM interface.\r
2195         //8.a.  Program all EMIF MMR\92s.\r
2196         DDR3A_SDCFG    = 0x6200CE62; // 9A62//0x62008C62        ;//0x6600CE62=single rank,0x6600CE6A=dual rank\r
2197 \r
2198         DDR3A_SDTIM1   = 0x166C9455;\r
2199         DDR3A_SDTIM2   = 0x00001D4A;\r
2200         DDR3A_SDTIM3   = 0x321DFF53;\r
2201         DDR3A_SDTIM4   = 0x543F07FF;\r
2202 \r
2203         DDR3A_ZQCFG    = 0x042D3B70;//0x70073200;       \r
2204         //8.b.  Program reg_initref_dis=0 in the SDRAM Refresh Control Register (address offset 0x10).\r
2205         DDR3A_SDRFC = 0x00001869;\r
2206 \r
2207         GEL_TextOut("DDR3A initialization complete \n");\r
2208         /* End  DDR3A EMIF Configuration */\r
2209 }\r
2210 \r
2211 \r
2212 /*--------------------------------------------------\r
2213                         DDR3A : DDR1600,32bit  \r
2214 ---------------------------------------------------*/\r
2215 \r
2216 ddr3A_32bit_DDR1600_setup()     \r
2217 {\r
2218         unsigned int multiplier = 7;\r
2219         unsigned int divider = 0;\r
2220         int temp;\r
2221         unsigned int OD_val = 2;\r
2222         KICK0 = 0x83E70B13;\r
2223         KICK1 = 0x95A4F1E0;\r
2224 \r
2225 \r
2226         //1.    Poll for IDONE=1 in the PHY General Status Register 0 (address offset 0x010).\r
2227         do { \r
2228                 read_val = DDR3A_PGSR0;\r
2229         } while ((read_val&0x00000001) != 0x00000001);\r
2230 \r
2231         //4.    Clocks are enabled and frequency is stable---------------------------------------\r
2232         //DDR3A PLL setup       \r
2233         GEL_TextOut ( "DDR3 PLL (PLL2) Setup ... \n");\r
2234         //DDR3APLLCTL0 = DDR3APLLCTL0 & 0xFF7FFFFF;\r
2235         //      Set ENSAT = 1\r
2236         DDR3APLLCTL1 |= 0x00000040;\r
2237         // Put the PLL in PLL Mode  \r
2238         DDR3APLLCTL0 |= 0x00800000;\r
2239         // In PLL Controller, reset the PLL (bit 13 in DDR3APLLCTL1 register) \r
2240         DDR3APLLCTL1 |= 0x00002000;\r
2241         // Program the necessary multipliers/dividers and BW adjustments            \r
2242         // Set the divider values \r
2243         DDR3APLLCTL0 &= ~(0x0000003F);\r
2244         DDR3APLLCTL0 |= (divider & 0x0000003F);\r
2245         /* Step 7: Programming OD[3:0] in the SECCTL register */            \r
2246         DDR3APLLCTL0 &= OUTPUT_DIVIDE_MASK;  // clear the OD bit field\r
2247         DDR3APLLCTL0 |= ~OUTPUT_DIVIDE_MASK & (OD_val - 1) << OUTPUT_DIVIDE_OFFSET;  // set the OD[3:0] bit field of PLLD to OD_val    \r
2248 \r
2249         /* Set the Multipler values */\r
2250         DDR3APLLCTL0 &= ~(0x0007FFC0);\r
2251         DDR3APLLCTL0 |= ((multiplier << 6) & 0x0007FFC0 );\r
2252         temp = ((multiplier + 1) >> 1) - 1;\r
2253         DDR3APLLCTL0 &= ~(0xFF000000); \r
2254         DDR3APLLCTL0 |= ((temp << 24) & 0xFF000000);\r
2255         DDR3APLLCTL1 &= ~(0x0000000F);\r
2256         DDR3APLLCTL1 |= ((temp >> 8) & 0x0000000F);\r
2257         //In DDR3PLLCTL1, write PLLRST = 0 to bring PLL out of reset \r
2258         DDR3APLLCTL1 &= ~(0x00002000);\r
2259         // Put the PLL in PLL Mode  \r
2260         DDR3APLLCTL0 &= ~(0x00800000); // ReSet the Bit 23\r
2261         GEL_TextOut( "DDR3 PLL Setup complete, DDR3A clock now running at 666 MHz.\n" );\r
2262         //DDR3A PLL setup complete ---------------------------------------\r
2263 \r
2264         /*------------------------- Start PHY Configuration -------------------------------*/\r
2265 \r
2266         //DDR3A_PGCR1 = 0x0280C487;\r
2267 \r
2268         //5.a   Program FRQSEL in the PLL Control Register (address offset 0x018).\r
2269         DDR3A_PLLCR = 0x1C000; //Set FRQSEL=00, for ctl_clk between 335-533MHz\r
2270 \r
2271         //5.b.  Program WLSTEP=1, IODDRM=1, and ZCKSEL in the PHY General Configuration Register 1 (address offset 0x00C). \r
2272         DDR3A_PGCR1 |= (1 << 2); //WLSTEP = 1\r
2273 \r
2274         DDR3A_PGCR1 &= ~(IODDRM_MASK);\r
2275         DDR3A_PGCR1 |= (( 1 << 7) & IODDRM_MASK);\r
2276 \r
2277 \r
2278         DDR3A_PGCR1 &= ~(ZCKSEL_MASK);\r
2279         DDR3A_PGCR1 |= (( 1 << 23) & ZCKSEL_MASK);\r
2280 \r
2281 \r
2282         //5.c.  Program PHY Timing Parameters Register 0-4 (address offset 0x01C - 0x02C).\r
2283 \r
2284         DDR3A_PTR0 = 0x426213CF;\r
2285 \r
2286         DDR3A_PTR1 = 0xCFC712B3;\r
2287 \r
2288         // Maintaining default values of Phy Timing Parameters Register 2 in PUB\r
2289 \r
2290         DDR3A_PTR3 = 0x08861A80;//0x072515C2; //0x0B4515C2;//0x18061A80; \r
2291 \r
2292         DDR3A_PTR4 = 0x0C827100;//0x0AAE7100;\r
2293 \r
2294         //5.d.  Program PDQ, MPRDQ, and BYTEMASK in the DRAM Configuration Register (address offset 0x044). \r
2295         //              All other fields must be left at their default values.\r
2296 \r
2297         DDR3A_DCR &= ~(PDQ_MASK); //PDQ = 0\r
2298 \r
2299         DDR3A_DCR &= ~(MPRDQ_MASK); //MPRDQ = 0\r
2300 \r
2301         DDR3A_DCR &= ~(BYTEMASK_MASK);\r
2302         DDR3A_DCR |= (( 1 << 10) & BYTEMASK_MASK);\r
2303 \r
2304 \r
2305         DDR3A_DCR &= ~(NOSRA_MASK);\r
2306         DDR3A_DCR |= (( 1 << 27) & NOSRA_MASK);\r
2307 \r
2308 \r
2309         //DDR3A_DCR &= ~(UDIMM_MASK);\r
2310         //DDR3A_DCR |= (( 1 << 29) & UDIMM_MASK);\r
2311 \r
2312 \r
2313         //5.e.  Program DRAM Timing Parameters Register 0-2 (address offset 0x048 - 0x050). \r
2314 \r
2315         DDR3A_DTPR0 = 0x011CBB66;//0x85589975;//0x8558AA55;\r
2316         DDR3A_DTPR1 = 0x12840300;//0x12835A80;//0x12857280;\r
2317         DDR3A_DTPR2 = 0x5002CE00;\r
2318 \r
2319         //5.f.  Program BL=0, CL, WR, and PD=1 in the Mode Register 0 (address offset 0x054). \r
2320         //All other fields must be left at their default values.\r
2321 \r
2322         DDR3A_MR0 = 0x00001C70; //50\r
2323 \r
2324 \r
2325         //5.g.  Program DIC, RTT, and TDQS in the Mode Register 1 (address offset 0x058). \r
2326         //All other fields must be left at their default values.\r
2327 \r
2328         DDR3A_MR1 = 0x00000006;\r
2329 \r
2330 \r
2331         //---------------------------------------------------------------------------------------------------------                                     \r
2332 \r
2333         //5.h.  Program Mode Register 2 (address offset 0x05C).\r
2334         // Maintaining default values of Program Mode Register 2\r
2335         DDR3A_MR2 = 0x00000058;\r
2336 \r
2337         //5.i.  Program DTMPR=1, DTEXD, DTEXG, RANKEN=1 or 3, and RFSHDT=7 in the Data Training Configuration Register (address offset 0x068). \r
2338         //All other fields must be left at their default values.\r
2339         DDR3A_DTCR = 0x710035C7; //0x730035C7;\r
2340 \r
2341         //5.j.  Program tREFPRD=(5*tREFI/ddr_clk_period) in the PHY General Configuration Register 2 (address offset 0x08C). \r
2342         //All other fields must be left at their default values.\r
2343 \r
2344         DDR3A_PGCR2 = 0x00F07A12; //NOBUB = 0, FXDLAT = 0       \r
2345         //DDR3A_PGCR2 = 0x00F83D09; //NOBUB = 0, FXDLAT = 1 \r
2346 \r
2347         //Set Impedence Register        \r
2348         DDR3A_ZQ0CR1 = 0x0000007B; \r
2349         DDR3A_ZQ1CR1 = 0x0000007B;\r
2350         DDR3A_ZQ2CR1 = 0x0000007B;\r
2351         //DDR3A_ZQ3CR1 = 0x0000005D;\r
2352 \r
2353         //6.    Re-trigger PHY initialization in DDR PHY through the VBUSP interface.\r
2354         //6.a.  Program 0x00000033 to the PHY Initialization Register (address offset 0x004) to re-trigger PLL, ZCAL, and DCAL initialization.\r
2355 \r
2356         DDR3A_PIR = 0x00000033;\r
2357 \r
2358         //6.b.  Poll for IDONE=1 in the PHY General Status Register 0 (address offset 0x010).\r
2359         do { \r
2360                 read_val = DDR3A_PGSR0;\r
2361         } while ((read_val&0x00000001) != 0x00000001);\r
2362 \r
2363         //---------------------------------------------------------------------------------------------------------                                     \r
2364 \r
2365 \r
2366 \r
2367         // 7.   Trigger DDR3 initialization and leveling/training in DDR PHY through the VBUSP interface.\r
2368         // a.   If using a 16-bit wide DDR interface, program DXEN=0 in the DATX8 2-7 General Configuration Registers (address offsets 0x240, 0x280, 0x2C0, 0x300, 0x340, and 0x380) to disable the leveling/training for the upper byte lanes.\r
2369         // b.   If using a 32-bit wide DDR interface, program DXEN=0 in the DATX8 4-7 General Configuration Registers (address offsets 0x2C0, 0x300, 0x340, and 0x380) to disable the leveling/training for the upper byte lanes.\r
2370         // c.   If ECC is not required, program DXEN=0 in the DATX8 8 General Configuration Register (address offset 0x3C0) to disable the leveling/training for the ECC byte lane.\r
2371         // NOTE: Setup supports 64-bit by default,  ECC enable by default.\r
2372 \r
2373         //7.d.  Program 0x0000XF81 to the PHY Initialization Register (address offset 0x004) to trigger DDR3 initialization and leveling/training sequences \r
2374 \r
2375         DDR3A_PIR = 0x0000FF81; //WLADJ - ON\r
2376         //DDR3A_PIR = 0x00000781;  //WLADJ - OFF\r
2377 \r
2378 \r
2379         //---------------------------------------------------------------------------------------------------------                                     \r
2380 \r
2381         //7.e.  Poll for IDONE=1 in the PHY General Status Register 0 (address offset 0x010).\r
2382         do {              \r
2383                 read_val = DDR3A_PGSR0;\r
2384         } while ((read_val&0x00000001) != 0x00000001);\r
2385 \r
2386 \r
2387         /* End PHY Configuration */             \r
2388         //---------------------------------------------------------------------------------------------------------                                     \r
2389         /* START EMIF INITIALIZATION\r
2390   ++++++++++++++++++SDCFG Register Calculation+++++++++++++++++++\r
2391   | 31 - 29  | 28 |27 - 25 | 24   | 23 - 22| 21 - 17 |\r
2392   |SDRAM_TYPE|Rsvd|DDR_TERM| DDQS | DYN_ODT|  Rsvd   |\r
2393   |  0x011   |  0 | 0x011  | 0x1  |   0x00 |   0x0   |\r
2394 \r
2395   | 16-14 |13 - 12 |  11 - 8 |  7   |6 - 5 |  4  |  3  |  2  |  1 - 0  |\r
2396   |   CWL | NM     |   CL    | Rsvd |IBANK | Rsvd|EBANK| Rsvd|PAGE_SIZE|\r
2397   |  0x11 | 0x00   |  0x1110 |  0x0 | 0x11 | 0x0 |  0  |  0  |   0x10  |\r
2398   SDCFG = 0x0110 0011 0010 0010 0011 0011 1011 0010\r
2399   SDCFG = 0x6700486A;//0x63223332\r
2400 \r
2401   SDRAM_TYPE = 3\r
2402   DDR_TERM = 3 (RZQ/4 = 1; RZQ/6=3)\r
2403   DDQS = 1 \r
2404   DYN_ODT = 0 \r
2405 \r
2406   CWL = 3 (CWL5=0; CWL6=1; CWL7=2; CWL8=3)\r
2407   NM = 0 (64-bit=0, 32-bit=1, 16-bit=2)\r
2408   CL = 14 (CL5=2; CL6=4; CL7=6; CL8=8; CL9=10; CL10=12; CL11=14)\r
2409   IBANK = 3 (8bank)\r
2410   EBANK = 0 (0 - pad_cs_o_n[0] , 1 - pad_cs_o_n[1:0])\r
2411   PAGE_SIZE = 2 (1024page-size=2; 2048page-size=3)\r
2412          */\r
2413         /* Start DDR3A EMIF Configuration */\r
2414         //8.    Configure the EMIF through the VBUSM interface.\r
2415         //8.a.  Program all EMIF MMR\92s.\r
2416         DDR3A_SDCFG    = 0x6200DE62; // 9A62//0x62008C62        ;//0x6600CE62=single rank,0x6600CE6A=dual rank\r
2417 \r
2418         DDR3A_SDTIM1   = 0x166C9455;\r
2419         DDR3A_SDTIM2   = 0x00001D4A;\r
2420         DDR3A_SDTIM3   = 0x321DFF53;\r
2421         DDR3A_SDTIM4   = 0x543F07FF;\r
2422 \r
2423         DDR3A_ZQCFG    = 0x70073200;    \r
2424         //8.b.  Program reg_initref_dis=0 in the SDRAM Refresh Control Register (address offset 0x10).\r
2425         DDR3A_SDRFC = 0x00001869;\r
2426 \r
2427         GEL_TextOut("DDR3A initialization complete \n");\r
2428         /* End  DDR3A EMIF Configuration */\r
2429 }\r
2430 \r
2431 /*--------------------------------------------------------------*/\r
2432 /* TCI66x MENU                                              */\r
2433 /*--------------------------------------------------------------*/\r
2434 \r
2435 menuitem "TCI66x Functions";\r
2436 \r
2437 /****************************************************************************\r
2438  *\r
2439  * NAME\r
2440  *      Global_Default_Setup\r
2441  *\r
2442  * PURPOSE:\r
2443  *      Setup almost everything ready for a new debug session:\r
2444  *      DSP modules and EVM board modules.\r
2445  *\r
2446  * USAGE\r
2447  *      This routine can be called as:\r
2448  *\r
2449  *      Global_Default_Setup()\r
2450  *\r
2451  * RETURN VALUE\r
2452  *      NONE\r
2453  *\r
2454  * REFERENCE\r
2455  *\r
2456  ****************************************************************************/\r
2457 hotmenu Global_Default_Setup()\r
2458 {\r
2459         GEL_TextOut( "Global Default Setup...\n" );\r
2460         Global_Default_Setup_Silent();\r
2461         GEL_TextOut( "Global Default Setup... Done.\n" );\r
2462 }\r
2463 \r
2464 hotmenu Reset()\r
2465 {\r
2466         GEL_Reset();\r
2467 }\r
2468 \r
2469 hotmenu InitXMC()\r
2470 {\r
2471         xmc_setup();\r
2472 }\r
2473 \r
2474 hotmenu CORE_PLL_INIT_100MHZ_to_614_28MHz()\r
2475 {\r
2476         Set_Pll1(1); // call Set_Pll1 with index = 1 -> 100 MHz to 614.28 MHz operation \r
2477 }\r
2478 \r
2479 hotmenu CORE_PLL_INIT_100MHZ_to_737_5MHz()\r
2480 {\r
2481         Set_Pll1(2); // call Set_Pll1 with index = 2 -> 100 MHz to 737.5 MHz operation \r
2482 }\r
2483 \r
2484 hotmenu CORE_PLL_INIT_100MHZ_to_1GHz()\r
2485 {\r
2486         Set_Pll1(3); // call Set_Pll1 with index = 3 -> 100 MHz to 1 GHz operation \r
2487 }\r
2488 \r
2489 hotmenu CORE_PLL_INIT_100MHZ_to_1_2GHz()\r
2490 {\r
2491         Set_Pll1(4); // call Set_Pll1 with index = 4 -> 100 MHz  to 1.2 GHz operation \r
2492 }\r
2493 \r
2494 \r
2495 hotmenu CORE_PLL_INIT_100MHZ_to_1_35Gz()\r
2496 {\r
2497         Set_Pll1(5); // call Set_Pll1 with index = 5 -> 100 MHz  to 1.35 GHz operation \r
2498 }\r
2499 \r
2500 hotmenu TETRIS_POWERUP_AND_PLL_INIT_100MHZ_to_1000MHz()\r
2501 {\r
2502         Set_Tetris_Pll(1); // 100 MHz to 1.0 GHz operation \r
2503 }\r
2504 \r
2505 hotmenu TETRIS_POWERUP_AND_PLL_INIT_100MHZ_to_1400MHz()\r
2506 {\r
2507         Set_Tetris_Pll(2); // 100 MHz to 1.4 GHz operation \r
2508 }\r
2509 \r
2510 hotmenu TETRIS_POWERUP_AND_PLL_INIT_175MHZ_to_1400MHz()\r
2511 {\r
2512         Set_Tetris_Pll(3); // 175 MHz to 1.4 GHz operation \r
2513 }\r
2514 \r
2515 \r
2516 hotmenu PA_PLL_COnfig()\r
2517 {\r
2518         PaPllConfig();\r
2519 }\r
2520 \r
2521 hotmenu InitDDR3A_32bit_DDR800()\r
2522 {\r
2523         ddr3A_32bit_DDR800_setup();\r
2524 }   \r
2525 \r
2526 hotmenu InitDDR3A_32bit_DDR1066()\r
2527 {\r
2528         ddr3A_32bit_DDR1066_setup();\r
2529\r
2530 hotmenu InitDDR3A_32bit_DDR1333()\r
2531 {\r
2532         ddr3A_32bit_DDR1333_setup();\r
2533 }   \r
2534 \r
2535 hotmenu InitDDR3A_32bit_DDR1600()\r
2536 {\r
2537         ddr3A_32bit_DDR1600_setup();\r
2538\r
2539 hotmenu InitDDR3A_64bit_DDR1600()\r
2540 {\r
2541         ddr3A_64bit_DDR1600_setup();\r
2542\r
2543 ///* Function to enable CORE PLL observation clock for PLL output *///\r
2544 hotmenu ENABLE_CORE_PLL_OBSCLK()\r
2545 {\r
2546         /* Unlock Chip Level Registers */\r
2547         KICK0 = KICK0_UNLOCK;\r
2548         KICK1 = KICK1_UNLOCK;\r
2549 \r
2550         /* set bit 1 to enable power to the CORE PLL observation clock, clear bit 0 to view the CORE PLL observation (output) clock */\r
2551         OBSCLKCTL |= (1 << 1);  /* set bit 1 to enable power to the observation clock */\r
2552         OBSCLKCTL &= ~(1 << 0); /* clear bit 0 to view the CORE PLL clock */ \r
2553 \r
2554         /* Lock Chip Level Registers */\r
2555         KICK0 = 0x00000000;\r
2556         KICK1 = 0x00000000;\r
2557 \r
2558         GEL_TextOut("CORE PLL observation clock enabled and configured to show CORE PLL output\n");\r
2559 }\r
2560 \r
2561 /* Function to enable DDR PLL observation clock for PLL output */\r
2562 hotmenu ENABLE_DDR_PLL_OBSCLK ()\r
2563 {\r
2564         /* Unlock Chip Level Registers */\r
2565         KICK0 = KICK0_UNLOCK;\r
2566         KICK1 = KICK1_UNLOCK;\r
2567 \r
2568         /* set bit 1 to enable power to the CORE PLL observation clock, clear bit 0 to view the CORE PLL observation (output) clock */\r
2569         OBSCLKCTL |= (1 << 3);  /* set bit 3 to enable power to the observation clock */\r
2570         OBSCLKCTL |= (1 << 2);  /* set bit 2 to view the DDR PLL clock */ \r
2571 \r
2572         /* Lock Chip Level Registers */\r
2573         //KICK0 = 0x00000000;\r
2574         // KICK1 = 0x00000000;\r
2575 \r
2576         GEL_TextOut("DDR PLL observation clock enabled and configured to show DDR PLL output\n");\r
2577 }\r
2578 \r
2579 hotmenu ENABLE_ARM_PLL_OBSCLK ()\r
2580 {\r
2581         /* Unlock Chip Level Registers */\r
2582         KICK0 = KICK0_UNLOCK;\r
2583         KICK1 = KICK1_UNLOCK;\r
2584 \r
2585         /* set bit 1 to enable power to the CORE PLL observation clock, clear bit 0 to view the CORE PLL observation (output) clock */\r
2586         //OBSCLKCTL |= (1 << 3);  /* set bit 3 to enable power to the observation clock */\r
2587         OBSCLKCTL |= (1 << 6);  /* set bit 2 to view the DDR PLL clock */ \r
2588 \r
2589         /* Lock Chip Level Registers */\r
2590         KICK0 = 0x00000000;\r
2591         KICK1 = 0x00000000;\r
2592 \r
2593         GEL_TextOut("DDR PLL observation clock enabled and configured to show DDR PLL output\n");\r
2594 }\r
2595 \r
2596 hotmenu ENABLE_PA_PLL_OBSCLK ()\r
2597 {\r
2598         /* Unlock Chip Level Registers */\r
2599         KICK0 = KICK0_UNLOCK;\r
2600         KICK1 = KICK1_UNLOCK;\r
2601 \r
2602         /* set bit 1 to enable power to the CORE PLL observation clock, clear bit 0 to view the CORE PLL observation (output) clock */\r
2603         OBSCLKCTL |= (1 << 4);  /* set bit 3 to enable power to the observation clock */\r
2604         OBSCLKCTL |= (1 << 5);  /* set bit 2 to view the DDR PLL clock */ \r
2605 \r
2606         /* Lock Chip Level Registers */\r
2607         KICK0 = 0x00000000;\r
2608         KICK1 = 0x00000000;\r
2609 \r
2610         GEL_TextOut("DDR PLL observation clock enabled and configured to show DDR PLL output\n");\r
2611 }\r
2612 \r
2613 hotmenu ddr3A_write_read_test()\r
2614 {\r
2615         //int data_set[4];\r
2616         //= {0xAAAAAAAA, 0x55555555, 0xFFFFFFFF, 0x00000000};\r
2617         unsigned int write_data = 0xAAAAAAAA;\r
2618         unsigned int read_data = 0x0;\r
2619         unsigned int errors = 0;\r
2620         int dw;\r
2621         unsigned int i, mem_start, mem_size, mem_location;\r
2622         mem_start = DDR3A_BASE_ADDRESS + (DNUM * 0x01000000);\r
2623         mem_size = 0x100;\r
2624         for(dw=0;dw<4;dw++)\r
2625         {\r
2626                 if (dw == 0) write_data = 0xAAAAAAAA;\r
2627                 if (dw == 1) write_data = 0x55555555;\r
2628                 if (dw == 2) write_data = 0xFFFFFFFF;\r
2629                 if (dw == 3) write_data = 0x00000000;\r
2630                 mem_location = mem_start;\r
2631                 GEL_TextOut( "Memory Test Write Core: %d, Mem Start: 0x%x, Mem Size: 0x%x, value: 0x%x ...\n",,2,,,DNUM,mem_start,mem_size,write_data);\r
2632                 for(i=0;i<mem_size;i++)\r
2633                 {\r
2634                         *( unsigned int* )(mem_location) = write_data;\r
2635                         mem_location += 4;\r
2636                 }\r
2637                 mem_location = mem_start;\r
2638                 GEL_TextOut( "Memory Test Read Core: %d, Mem Start: 0x%x, Mem Size: 0x%x ...\n",,2,,,DNUM,mem_start,mem_size);\r
2639                 for (i=0;i<mem_size;i++)\r
2640                 {\r
2641                         read_data = *( unsigned int* )(mem_location);\r
2642                         if (read_data != write_data)\r
2643                         {\r
2644                                 GEL_TextOut("DDR3 Data Error: DSP Core: %d, Mem Addr: 0x%x, read: 0x%x, expected: 0x%x \n",,2,,,DNUM,(DDR3_BASE_ADDRESS + (i * 4)),read_data,write_data);\r
2645                                 errors++;\r
2646                         }\r
2647                         mem_location += 4;\r
2648                 }\r
2649                 if (errors == 0)\r
2650                 {\r
2651                         GEL_TextOut( "Memory Test Done, no errors found.\n" );\r
2652                 }\r
2653                 else\r
2654                 {\r
2655                         GEL_TextOut("Memory Test Done, %d errors were encounterd. \n",,2,,,errors);\r
2656                 }\r
2657         }\r
2658         GEL_TextOut( "All Memory Test Completed on core: %d with %d errors.\n",,2,,,DNUM,errors);\r
2659 \r
2660 }\r
2661 \r
2662 menuitem "DSP CLOCK Estimation";\r
2663 \r
2664 #define TIMER_TSC             (1)    // The timer used for polling TSCH/TSCL  \r
2665 #define TIMER_TSC_POLL_PERIOD (10)   // Every 10 seconds\r
2666 unsigned int gPollPeriod = TIMER_TISC_POLL_PERIOD;\r
2667 unsigned int gTSCL = 0;\r
2668 unsigned int gTSCH = 0;              // Global var for holding previous read of TSCL/H\r
2669 unsigned int gNumberPoll=0;          // Number of pulling */\r
2670 unsigned int gLoopCount=0;\r
2671 \r
2672 \r
2673 \r
2674 hotmenu dspEnableTsc()\r
2675 {\r
2676         //GEL_TextOut( "dspEnableTsc - write a value to TSCL to enable it\n" );\r
2677         if( GEL_IsHalted() ) {\r
2678                 TSCL = 0;  // A write to TSCL will enable TSC (timestamp counter)\r
2679                 GEL_Run();\r
2680         } else {\r
2681                 GEL_Halt();\r
2682                 TSCL = 0;\r
2683                 GEL_Run();\r
2684         }\r
2685 }\r
2686 \r
2687 \r
2688 hotmenu dspDumpTsc()\r
2689 {\r
2690         unsigned int tscl, tsch;\r
2691         tscl = TSCL;  /* note: need to read TSCL first */\r
2692         tsch = TSCH;\r
2693         GEL_TextOut( "dspEnableTsc - TSCH=%x, TSCL=%x\n",,,,, tscl, tsch );\r
2694 }\r
2695 \r
2696 \r
2697 dspPollTsc()\r
2698 {\r
2699         unsigned int tscl, tsch;\r
2700         unsigned long long tsc1, tsc2;\r
2701 \r
2702         if( gLoopCount <= gNumberPoll) { \r
2703                 //GEL_EnableRealtime();\r
2704                 GEL_Halt();\r
2705                 tscl = TSCL;            /* The read time can be considered as variations */\r
2706                 tsch = TSCH;            /* The read won't cause variation */\r
2707                 //GEL_DisableRealtime();\r
2708                 GEL_Run();\r
2709                 tsc2  = (((unsigned long long) tsch)<<32) +  tscl;\r
2710                 tsc1  = (((unsigned long long)gTSCH)<<32) + gTSCL;\r
2711                 gTSCL = tscl;\r
2712                 gTSCH = tsch;\r
2713 \r
2714                 //tsc1 = (tsc2-tsc1)/TIMER_TSC_POLL_PERIOD;\r
2715                 tsc1 = (tsc2-tsc1)/gPollPeriod;\r
2716 \r
2717                 GEL_TextOut( "dspPollTsc - [TSCH,TSCL] = [%x, %x], freq=%dhz, i=%d\n",,,,,\r
2718                                 gTSCH, gTSCL, (tsc1), gLoopCount);\r
2719         }\r
2720 \r
2721         if( gLoopCount>=gNumberPoll ) {\r
2722                 dspCancelTscTimer();\r
2723         } else {  \r
2724                 gLoopCount++;\r
2725         }\r
2726 }\r
2727 \r
2728 \r
2729 //\r
2730 // To cancel the Timer - TIMER_TSC, after using it. Otherwise, it will continue running.\r
2731 //\r
2732 hotmenu dspCancelTscTimer()\r
2733 {\r
2734         GEL_TextOut( "dspCancelTscTimer\n");\r
2735         GEL_CancelTimer( TIMER_TSC );\r
2736 }\r
2737 \r
2738 \r
2739 //\r
2740 // To poll the DSP clock.\r
2741 //\r
2742 dialog dspPollDSPClockFreq(\r
2743                 pollPeriod   "Polling period (sec) - the longer, the more accurate!",\r
2744                 numberOfPoll "Number of Polls" )\r
2745 {\r
2746         gPollPeriod = pollPeriod;\r
2747 \r
2748         GEL_TextOut( "dspPollDSPClockFreq with - pollPeriod=%dsec, numberOfPoll=%d\n"\r
2749                         ,,,,, gPollPeriod, numberOfPoll);\r
2750 \r
2751         gNumberPoll = numberOfPoll-1;\r
2752         gLoopCount  = 0;\r
2753         dspEnableTsc();\r
2754 \r
2755         // Get the initial value of TSC\r
2756         //GEL_EnableRealtime();\r
2757         GEL_Halt();\r
2758         gTSCL = TSCL;            /* The read time can be considered as variations */\r
2759         gTSCH = TSCH;            /* The read won't cause variation */\r
2760         //GEL_DisableRealtime();\r
2761         GEL_Run();\r
2762 \r
2763         GEL_SetTimer( gPollPeriod*1000, TIMER_TSC, "dspPollTsc()");\r
2764 \r
2765 }\r
2766 \r
2767 \r
2768 \r
2769 #define MDIO_VERSION_REG            (*(unsigned int *) (0x24200F00 + 0x00))\r
2770 /* mdio_user_access_reg */\r
2771 #define MDIO_USER_ACCESS_REG            (*(unsigned int *) (0x24200F00 + 0x80))\r
2772 #define MDIO_USER_CONTROL_REG            (*(unsigned int *) (0x24200F00 + 0x04))\r
2773 #define MDIO_USER_INT_MASK_REG            (*(unsigned int *) (0x24200F00 + 0x28))\r
2774 \r
2775 /* shift and mask for MDIO_USER_ACCESS_REG */\r
2776 #define CSL_MDIO_USER_ACCESS_REG_DATA_MASK (0x0000FFFFu)\r
2777 #define CSL_MDIO_USER_ACCESS_REG_DATA_SHIFT (0x00000000u)\r
2778 #define CSL_MDIO_USER_ACCESS_REG_DATA_RESETVAL (0x00000000u)\r
2779 \r
2780 #define CSL_MDIO_USER_ACCESS_REG_PHYADR_MASK (0x001F0000u)\r
2781 #define CSL_MDIO_USER_ACCESS_REG_PHYADR_SHIFT (0x00000010u)\r
2782 #define CSL_MDIO_USER_ACCESS_REG_PHYADR_RESETVAL (0x00000000u)\r
2783 \r
2784 #define CSL_MDIO_USER_ACCESS_REG_REGADR_MASK (0x03E00000u)\r
2785 #define CSL_MDIO_USER_ACCESS_REG_REGADR_SHIFT (0x00000015u)\r
2786 #define CSL_MDIO_USER_ACCESS_REG_REGADR_RESETVAL (0x00000000u)\r
2787 \r
2788 #define CSL_MDIO_USER_ACCESS_REG_ACK_MASK (0x20000000u)\r
2789 #define CSL_MDIO_USER_ACCESS_REG_ACK_SHIFT (0x0000001Du)\r
2790 #define CSL_MDIO_USER_ACCESS_REG_ACK_RESETVAL (0x00000000u)\r
2791 \r
2792 #define CSL_MDIO_USER_ACCESS_REG_WRITE_MASK (0x40000000u)\r
2793 #define CSL_MDIO_USER_ACCESS_REG_WRITE_SHIFT (0x0000001Eu)\r
2794 #define CSL_MDIO_USER_ACCESS_REG_WRITE_RESETVAL (0x00000000u)\r
2795 \r
2796 #define CSL_MDIO_USER_ACCESS_REG_GO_MASK (0x80000000u)\r
2797 #define CSL_MDIO_USER_ACCESS_REG_GO_SHIFT (0x0000001Fu)\r
2798 #define CSL_MDIO_USER_ACCESS_REG_GO_RESETVAL (0x00000000u)\r
2799 \r
2800 /*\r
2801 #define CSL_FMK(PER_REG_FIELD, val)                                         \\r
2802     (((val) << CSL_##PER_REG_FIELD##_SHIFT) & CSL_##PER_REG_FIELD##_MASK)\r
2803 \r
2804 #define CSL_FEXT(reg, PER_REG_FIELD)                                        \\r
2805     (((reg) & CSL_##PER_REG_FIELD##_MASK) >> CSL_##PER_REG_FIELD##_SHIFT)\r
2806 #endif\r
2807  */\r
2808 \r
2809 /* the Field MaKe macro */\r
2810 #define CSL_FMK(SHIFT, MASK, val)               (((val) << SHIFT) & MASK)\r
2811 \r
2812 /* the Field EXTract macro */\r
2813 #define CSL_FEXT(reg, SHIFT, MASK)              (((reg) & MASK) >> SHIFT)\r
2814 \r
2815 \r
2816 #define PHY_REG_PAGE_ADDR 22\r
2817 \r
2818 phy_hwwrite(unsigned short phy_addr, unsigned short addr, unsigned short val)\r
2819 {\r
2820         unsigned int retVal=1;\r
2821         unsigned int i, delay=2000;\r
2822         \r
2823         MDIO_USER_ACCESS_REG   =  CSL_FMK (CSL_MDIO_USER_ACCESS_REG_GO_SHIFT, CSL_MDIO_USER_ACCESS_REG_GO_MASK, 1u) |\r
2824                         CSL_FMK (CSL_MDIO_USER_ACCESS_REG_WRITE_SHIFT, CSL_MDIO_USER_ACCESS_REG_WRITE_MASK, 1) |\r
2825                         CSL_FMK (CSL_MDIO_USER_ACCESS_REG_REGADR_SHIFT, CSL_MDIO_USER_ACCESS_REG_REGADR_MASK, addr) |\r
2826                         CSL_FMK (CSL_MDIO_USER_ACCESS_REG_PHYADR_SHIFT, CSL_MDIO_USER_ACCESS_REG_PHYADR_MASK, phy_addr) |\r
2827                         CSL_FMK (CSL_MDIO_USER_ACCESS_REG_DATA_SHIFT, CSL_MDIO_USER_ACCESS_REG_DATA_MASK, val);\r
2828 \r
2829         \r
2830         while(1)\r
2831         {\r
2832                 retVal=CSL_FEXT(MDIO_USER_ACCESS_REG, CSL_MDIO_USER_ACCESS_REG_GO_SHIFT, CSL_MDIO_USER_ACCESS_REG_GO_MASK);\r
2833                 if(retVal == 0)\r
2834                         break;\r
2835 \r
2836                 for(i = 0; i < delay; i++); // this delay is much more than required   \r
2837 \r
2838         }\r
2839 }\r
2840 \r
2841 phy_hwread(unsigned short phy_addr, unsigned short addr, unsigned short *val)\r
2842 {\r
2843 \r
2844         MDIO_USER_ACCESS_REG =  CSL_FMK (CSL_MDIO_USER_ACCESS_REG_GO_SHIFT, CSL_MDIO_USER_ACCESS_REG_GO_MASK, 1u) |\r
2845                         CSL_FMK (CSL_MDIO_USER_ACCESS_REG_REGADR_SHIFT, CSL_MDIO_USER_ACCESS_REG_REGADR_MASK, addr) |\r
2846                         CSL_FMK (CSL_MDIO_USER_ACCESS_REG_PHYADR_SHIFT, CSL_MDIO_USER_ACCESS_REG_PHYADR_MASK, phy_addr);\r
2847 \r
2848         PHYREG0_waitResultsAck(*val, ack);\r
2849 \r
2850         if(!ack)\r
2851                 GEL_TextOut("Reg read error for PHY: %d\n",,,,, phy_addr);\r
2852 }\r
2853 \r
2854 #define PHYREG0_waitResultsAck( results, ack ) {                                        \\r
2855                 results = CSL_FEXT( MDIO_USER_ACCESS_REG, CSL_MDIO_USER_ACCESS_REG_DATA_SHIFT, CSL_MDIO_USER_ACCESS_REG_DATA_MASK);        \\r
2856                 ack = CSL_FEXT( MDIO_USER_ACCESS_REG, CSL_MDIO_USER_ACCESS_REG_ACK_SHIFT, CSL_MDIO_USER_ACCESS_REG_ACK_MASK); }\r
2857 \r
2858 phy_miiread (unsigned short phyaddr, unsigned short page, unsigned int addr, unsigned short *val)\r
2859 {\r
2860         phy_hwwrite(phyaddr, PHY_REG_PAGE_ADDR, page);\r
2861         phy_hwread(phyaddr, addr, val);\r
2862 }\r
2863 \r
2864 phy_miiwrite(unsigned short phyaddr, unsigned short page, unsigned short addr, unsigned short val)\r
2865 {\r
2866         phy_hwwrite(phyaddr, PHY_REG_PAGE_ADDR, page);\r
2867         phy_hwwrite(phyaddr, addr, val);\r
2868 }\r
2869 \r
2870 _setupPhy(unsigned short phyaddr)\r
2871 {\r
2872         unsigned short val;\r
2873 \r
2874         GEL_TextOut("Staring Setup for PHY: %d\n",,,,, phyaddr);\r
2875 \r
2876         /* Register settings as per RN section 3.1 */\r
2877         phy_hwwrite(phyaddr, 22, 0x00ff);\r