]> git.sur5r.net Git - armstart-ibdap/blob - src/system_LPC11Uxx.c
Fix build
[armstart-ibdap] / src / system_LPC11Uxx.c
1 /******************************************************************************\r
2  * @file     system_LPC11Uxx.c\r
3  * @purpose  CMSIS Cortex-M3 Device Peripheral Access Layer Source File\r
4  *           for the NXP LPC13xx Device Series\r
5  * @version  V1.10\r
6  * @date     24. November 2010\r
7  *\r
8  * @note\r
9  * Copyright (C) 2009-2010 ARM Limited. All rights reserved.\r
10  *\r
11  * @par\r
12  * ARM Limited (ARM) is supplying this software for use with Cortex-M \r
13  * processor based microcontrollers.  This file can be freely distributed \r
14  * within development tools that are supporting such ARM based processors. \r
15  *\r
16  * @par\r
17  * THIS SOFTWARE IS PROVIDED "AS IS".  NO WARRANTIES, WHETHER EXPRESS, IMPLIED\r
18  * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF\r
19  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.\r
20  * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR\r
21  * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.\r
22  *\r
23  ******************************************************************************/\r
24 \r
25 \r
26 #include <stdint.h>\r
27 #include "LPC11Uxx.h"\r
28 \r
29 /*\r
30 //-------- <<< Use Configuration Wizard in Context Menu >>> ------------------\r
31 */\r
32 \r
33 /*--------------------- Clock Configuration ----------------------------------\r
34 //\r
35 // <e> Clock Configuration\r
36 //   <h> System Oscillator Control Register (SYSOSCCTRL)\r
37 //     <o1.0>      BYPASS: System Oscillator Bypass Enable\r
38 //                     <i> If enabled then PLL input (sys_osc_clk) is fed\r
39 //                     <i> directly from XTALIN and XTALOUT pins.\r
40 //     <o1.9>      FREQRANGE: System Oscillator Frequency Range\r
41 //                     <i> Determines frequency range for Low-power oscillator.\r
42 //                   <0=> 1 - 20 MHz\r
43 //                   <1=> 15 - 25 MHz\r
44 //   </h>\r
45 //\r
46 //   <h> Watchdog Oscillator Control Register (WDTOSCCTRL)\r
47 //     <o2.0..4>   DIVSEL: Select Divider for Fclkana\r
48 //                     <i> wdt_osc_clk = Fclkana/ (2 � (1 + DIVSEL))\r
49 //                   <0-31>\r
50 //     <o2.5..8>   FREQSEL: Select Watchdog Oscillator Analog Output Frequency (Fclkana)\r
51 //                   <0=> Undefined\r
52 //                   <1=> 0.5 MHz\r
53 //                   <2=> 0.8 MHz\r
54 //                   <3=> 1.1 MHz\r
55 //                   <4=> 1.4 MHz\r
56 //                   <5=> 1.6 MHz\r
57 //                   <6=> 1.8 MHz\r
58 //                   <7=> 2.0 MHz\r
59 //                   <8=> 2.2 MHz\r
60 //                   <9=> 2.4 MHz\r
61 //                   <10=> 2.6 MHz\r
62 //                   <11=> 2.7 MHz\r
63 //                   <12=> 2.9 MHz\r
64 //                   <13=> 3.1 MHz\r
65 //                   <14=> 3.2 MHz\r
66 //                   <15=> 3.4 MHz\r
67 //   </h>\r
68 //\r
69 //   <h> System PLL Control Register (SYSPLLCTRL)\r
70 //                   <i> F_clkout = M * F_clkin = F_CCO / (2 * P)\r
71 //                   <i> F_clkin must be in the range of  10 MHz to  25 MHz\r
72 //                   <i> F_CCO   must be in the range of 156 MHz to 320 MHz\r
73 //     <o3.0..4>   MSEL: Feedback Divider Selection\r
74 //                     <i> M = MSEL + 1\r
75 //                   <0-31>\r
76 //     <o3.5..6>   PSEL: Post Divider Selection\r
77 //                   <0=> P = 1\r
78 //                   <1=> P = 2\r
79 //                   <2=> P = 4\r
80 //                   <3=> P = 8\r
81 //   </h>\r
82 //\r
83 //   <h> System PLL Clock Source Select Register (SYSPLLCLKSEL)\r
84 //     <o4.0..1>   SEL: System PLL Clock Source\r
85 //                   <0=> IRC Oscillator\r
86 //                   <1=> System Oscillator\r
87 //                   <2=> Reserved\r
88 //                   <3=> Reserved\r
89 //   </h>\r
90 //\r
91 //   <h> Main Clock Source Select Register (MAINCLKSEL)\r
92 //     <o5.0..1>   SEL: Clock Source for Main Clock\r
93 //                   <0=> IRC Oscillator\r
94 //                   <1=> Input Clock to System PLL\r
95 //                   <2=> WDT Oscillator\r
96 //                   <3=> System PLL Clock Out\r
97 //   </h>\r
98 //\r
99 //   <h> System AHB Clock Divider Register (SYSAHBCLKDIV)\r
100 //     <o6.0..7>   DIV: System AHB Clock Divider\r
101 //                     <i> Divides main clock to provide system clock to core, memories, and peripherals.\r
102 //                     <i> 0 = is disabled\r
103 //                   <0-255>\r
104 //   </h>\r
105 //\r
106 //   <h> USB PLL Control Register (USBPLLCTRL)\r
107 //                   <i> F_clkout = M * F_clkin = F_CCO / (2 * P)\r
108 //                   <i> F_clkin must be in the range of  10 MHz to  25 MHz\r
109 //                   <i> F_CCO   must be in the range of 156 MHz to 320 MHz\r
110 //     <o7.0..4>   MSEL: Feedback Divider Selection\r
111 //                     <i> M = MSEL + 1\r
112 //                   <0-31>\r
113 //     <o7.5..6>   PSEL: Post Divider Selection\r
114 //                   <0=> P = 1\r
115 //                   <1=> P = 2\r
116 //                   <2=> P = 4\r
117 //                   <3=> P = 8\r
118 //   </h>\r
119 //\r
120 //   <h> USB PLL Clock Source Select Register (USBPLLCLKSEL)\r
121 //     <o8.0..1>   SEL: USB PLL Clock Source\r
122 //                     <i> USB PLL clock source must be switched to System Oscillator for correct USB operation\r
123 //                   <0=> IRC Oscillator\r
124 //                   <1=> System Oscillator\r
125 //                   <2=> Reserved\r
126 //                   <3=> Reserved\r
127 //   </h>\r
128 //\r
129 //   <h> USB Clock Source Select Register (USBCLKSEL)\r
130 //     <o9.0..1>   SEL: System PLL Clock Source\r
131 //                   <0=> USB PLL out\r
132 //                   <1=> Main clock\r
133 //                   <2=> Reserved\r
134 //                   <3=> Reserved\r
135 //   </h>\r
136 //\r
137 //   <h> USB Clock Divider Register (USBCLKDIV)\r
138 //     <o10.0..7>  DIV: USB Clock Divider\r
139 //                     <i> Divides USB clock to 48 MHz.\r
140 //                     <i> 0 = is disabled\r
141 //                   <0-255>\r
142 //   </h>\r
143 // </e>\r
144 */\r
145 #define CLOCK_SETUP           1\r
146 #define SYSOSCCTRL_Val        0x00000000              // Reset: 0x000\r
147 #define WDTOSCCTRL_Val        0x00000000              // Reset: 0x000\r
148 #define SYSPLLCTRL_Val        0x00000023              // Reset: 0x000\r
149 #define SYSPLLCLKSEL_Val      0x00000001              // Reset: 0x000\r
150 #define MAINCLKSEL_Val        0x00000003              // Reset: 0x000\r
151 #define SYSAHBCLKDIV_Val      0x00000001              // Reset: 0x001\r
152 #define USBPLLCTRL_Val        0x00000023              // Reset: 0x000\r
153 #define USBPLLCLKSEL_Val      0x00000001              // Reset: 0x000\r
154 #define USBCLKSEL_Val         0x00000000              // Reset: 0x000\r
155 #define USBCLKDIV_Val         0x00000000              // Reset: 0x001\r
156 \r
157 #define PDRUNCFGUSEMASK 0x0000E800\r
158 #define PDRUNCFGMASKTMP 0x000005FF\r
159 \r
160 /*\r
161 //-------- <<< end of configuration section >>> ------------------------------\r
162 */\r
163 \r
164 /*----------------------------------------------------------------------------\r
165   Check the register settings\r
166  *----------------------------------------------------------------------------*/\r
167 #define CHECK_RANGE(val, min, max)                ((val < min) || (val > max))\r
168 #define CHECK_RSVD(val, mask)                     (val & mask)\r
169 \r
170 /* Clock Configuration -------------------------------------------------------*/\r
171 #if (CHECK_RSVD((SYSOSCCTRL_Val),  ~0x00000003))\r
172    #error "SYSOSCCTRL: Invalid values of reserved bits!"\r
173 #endif\r
174 \r
175 #if (CHECK_RSVD((WDTOSCCTRL_Val),  ~0x000001FF))\r
176    #error "WDTOSCCTRL: Invalid values of reserved bits!"\r
177 #endif\r
178 \r
179 #if (CHECK_RANGE((SYSPLLCLKSEL_Val), 0, 2))\r
180    #error "SYSPLLCLKSEL: Value out of range!"\r
181 #endif\r
182 \r
183 #if (CHECK_RSVD((SYSPLLCTRL_Val),  ~0x000001FF))\r
184    #error "SYSPLLCTRL: Invalid values of reserved bits!"\r
185 #endif\r
186 \r
187 #if (CHECK_RSVD((MAINCLKSEL_Val),  ~0x00000003))\r
188    #error "MAINCLKSEL: Invalid values of reserved bits!"\r
189 #endif\r
190 \r
191 #if (CHECK_RANGE((SYSAHBCLKDIV_Val), 0, 255))\r
192    #error "SYSAHBCLKDIV: Value out of range!"\r
193 #endif\r
194 \r
195 #if (CHECK_RANGE((USBPLLCLKSEL_Val), 0, 1))\r
196    #error "USBPLLCLKSEL: Value out of range!"\r
197 #endif\r
198 \r
199 #if (CHECK_RSVD((USBPLLCTRL_Val),  ~0x000001FF))\r
200    #error "USBPLLCTRL: Invalid values of reserved bits!"\r
201 #endif\r
202 \r
203 #if (CHECK_RANGE((USBCLKSEL_Val), 0, 1))\r
204    #error "USBCLKSEL: Value out of range!"\r
205 #endif\r
206 \r
207 #if (CHECK_RANGE((USBCLKDIV_Val), 0, 255))\r
208    #error "USBCLKDIV: Value out of range!"\r
209 #endif\r
210 \r
211 \r
212 /*----------------------------------------------------------------------------\r
213   DEFINES\r
214  *----------------------------------------------------------------------------*/\r
215     \r
216 /*----------------------------------------------------------------------------\r
217   Define clocks\r
218  *----------------------------------------------------------------------------*/\r
219 #define __XTAL            (12000000UL)    /* Oscillator frequency             */\r
220 #define __SYS_OSC_CLK     (    __XTAL)    /* Main oscillator frequency        */\r
221 #define __IRC_OSC_CLK     (12000000UL)    /* Internal RC oscillator frequency */\r
222 \r
223 \r
224 #define __FREQSEL   ((WDTOSCCTRL_Val >> 5) & 0x0F)\r
225 #define __DIVSEL   (((WDTOSCCTRL_Val & 0x1F) << 1) + 2)\r
226 \r
227 #if (CLOCK_SETUP)                         /* Clock Setup              */\r
228   #if  (__FREQSEL ==  0)\r
229     #define __WDT_OSC_CLK        ( 0)                  /* undefined */\r
230   #elif (__FREQSEL ==  1)\r
231     #define __WDT_OSC_CLK        ( 500000 / __DIVSEL)\r
232   #elif (__FREQSEL ==  2)\r
233     #define __WDT_OSC_CLK        ( 800000 / __DIVSEL)\r
234   #elif (__FREQSEL ==  3)\r
235     #define __WDT_OSC_CLK        (1100000 / __DIVSEL)\r
236   #elif (__FREQSEL ==  4)\r
237     #define __WDT_OSC_CLK        (1400000 / __DIVSEL)\r
238   #elif (__FREQSEL ==  5)\r
239     #define __WDT_OSC_CLK        (1600000 / __DIVSEL)\r
240   #elif (__FREQSEL ==  6)\r
241     #define __WDT_OSC_CLK        (1800000 / __DIVSEL)\r
242   #elif (__FREQSEL ==  7)\r
243     #define __WDT_OSC_CLK        (2000000 / __DIVSEL)\r
244   #elif (__FREQSEL ==  8)\r
245     #define __WDT_OSC_CLK        (2200000 / __DIVSEL)\r
246   #elif (__FREQSEL ==  9)\r
247     #define __WDT_OSC_CLK        (2400000 / __DIVSEL)\r
248   #elif (__FREQSEL == 10)\r
249     #define __WDT_OSC_CLK        (2600000 / __DIVSEL)\r
250   #elif (__FREQSEL == 11)\r
251     #define __WDT_OSC_CLK        (2700000 / __DIVSEL)\r
252   #elif (__FREQSEL == 12)\r
253     #define __WDT_OSC_CLK        (2900000 / __DIVSEL)\r
254   #elif (__FREQSEL == 13)\r
255     #define __WDT_OSC_CLK        (3100000 / __DIVSEL)\r
256   #elif (__FREQSEL == 14)\r
257     #define __WDT_OSC_CLK        (3200000 / __DIVSEL)\r
258   #else\r
259     #define __WDT_OSC_CLK        (3400000 / __DIVSEL)\r
260   #endif\r
261 \r
262   /* sys_pllclkin calculation */\r
263   #if   ((SYSPLLCLKSEL_Val & 0x03) == 0)\r
264     #define __SYS_PLLCLKIN           (__IRC_OSC_CLK)\r
265   #elif ((SYSPLLCLKSEL_Val & 0x03) == 1)\r
266     #define __SYS_PLLCLKIN           (__SYS_OSC_CLK)\r
267   #else\r
268     #define __SYS_PLLCLKIN           (0)\r
269   #endif\r
270 \r
271   #define  __SYS_PLLCLKOUT         (__SYS_PLLCLKIN * ((SYSPLLCTRL_Val & 0x01F) + 1))\r
272 \r
273   /* main clock calculation */\r
274   #if   ((MAINCLKSEL_Val & 0x03) == 0)\r
275     #define __MAIN_CLOCK             (__IRC_OSC_CLK)\r
276   #elif ((MAINCLKSEL_Val & 0x03) == 1)\r
277     #define __MAIN_CLOCK             (__SYS_PLLCLKIN)\r
278   #elif ((MAINCLKSEL_Val & 0x03) == 2)\r
279     #if (__FREQSEL ==  0)\r
280       #error "MAINCLKSEL: WDT Oscillator selected but FREQSEL is undefined!"\r
281     #else\r
282       #define __MAIN_CLOCK           (__WDT_OSC_CLK)\r
283     #endif\r
284   #elif ((MAINCLKSEL_Val & 0x03) == 3)\r
285     #define __MAIN_CLOCK             (__SYS_PLLCLKOUT)\r
286   #else\r
287     #define __MAIN_CLOCK             (0)\r
288   #endif\r
289 \r
290   #define __SYSTEM_CLOCK             (__MAIN_CLOCK / SYSAHBCLKDIV_Val)         \r
291 \r
292 #else\r
293   #define __SYSTEM_CLOCK             (__IRC_OSC_CLK)\r
294 #endif  // CLOCK_SETUP \r
295 \r
296 \r
297 /*----------------------------------------------------------------------------\r
298   Clock Variable definitions\r
299  *----------------------------------------------------------------------------*/\r
300 uint32_t SystemCoreClock = __SYSTEM_CLOCK;/*!< System Clock Frequency (Core Clock)*/\r
301 \r
302 \r
303 /*----------------------------------------------------------------------------\r
304   Clock functions\r
305  *----------------------------------------------------------------------------*/\r
306 void SystemCoreClockUpdate (void)            /* Get Core Clock Frequency      */\r
307 {\r
308   uint32_t wdt_osc = 0;\r
309 \r
310   /* Determine clock frequency according to clock register values             */\r
311   switch ((LPC_SYSCON->WDTOSCCTRL >> 5) & 0x0F) {\r
312     case 0:  wdt_osc =       0; break;\r
313     case 1:  wdt_osc =  500000; break;\r
314     case 2:  wdt_osc =  800000; break;\r
315     case 3:  wdt_osc = 1100000; break;\r
316     case 4:  wdt_osc = 1400000; break;\r
317     case 5:  wdt_osc = 1600000; break;\r
318     case 6:  wdt_osc = 1800000; break;\r
319     case 7:  wdt_osc = 2000000; break;\r
320     case 8:  wdt_osc = 2200000; break;\r
321     case 9:  wdt_osc = 2400000; break;\r
322     case 10: wdt_osc = 2600000; break;\r
323     case 11: wdt_osc = 2700000; break;\r
324     case 12: wdt_osc = 2900000; break;\r
325     case 13: wdt_osc = 3100000; break;\r
326     case 14: wdt_osc = 3200000; break;\r
327     case 15: wdt_osc = 3400000; break;\r
328   }\r
329   wdt_osc /= ((LPC_SYSCON->WDTOSCCTRL & 0x1F) << 1) + 2;\r
330  \r
331   switch (LPC_SYSCON->MAINCLKSEL & 0x03) {\r
332     case 0:                             /* Internal RC oscillator             */\r
333       SystemCoreClock = __IRC_OSC_CLK;\r
334       break;\r
335     case 1:                             /* Input Clock to System PLL          */\r
336       switch (LPC_SYSCON->SYSPLLCLKSEL & 0x03) {\r
337           case 0:                       /* Internal RC oscillator             */\r
338             SystemCoreClock = __IRC_OSC_CLK;\r
339             break;\r
340           case 1:                       /* System oscillator                  */\r
341             SystemCoreClock = __SYS_OSC_CLK;\r
342             break;\r
343           case 2:                       /* Reserved                           */\r
344           case 3:                       /* Reserved                           */\r
345             SystemCoreClock = 0;\r
346             break;\r
347       }\r
348       break;\r
349     case 2:                             /* WDT Oscillator                     */\r
350       SystemCoreClock = wdt_osc;\r
351       break;\r
352     case 3:                             /* System PLL Clock Out               */\r
353       switch (LPC_SYSCON->SYSPLLCLKSEL & 0x03) {\r
354           case 0:                       /* Internal RC oscillator             */\r
355             if (LPC_SYSCON->SYSPLLCTRL & 0x180) {\r
356               SystemCoreClock = __IRC_OSC_CLK;\r
357             } else {\r
358               SystemCoreClock = __IRC_OSC_CLK * ((LPC_SYSCON->SYSPLLCTRL & 0x01F) + 1);\r
359             }\r
360             break;\r
361           case 1:                       /* System oscillator                  */\r
362             if (LPC_SYSCON->SYSPLLCTRL & 0x180) {\r
363               SystemCoreClock = __SYS_OSC_CLK;\r
364             } else {\r
365               SystemCoreClock = __SYS_OSC_CLK * ((LPC_SYSCON->SYSPLLCTRL & 0x01F) + 1);\r
366             }\r
367             break;\r
368           case 2:                       /* Reserved                           */\r
369           case 3:                       /* Reserved                           */\r
370             SystemCoreClock = 0;\r
371             break;\r
372       }\r
373       break;\r
374   }\r
375 \r
376   SystemCoreClock /= LPC_SYSCON->SYSAHBCLKDIV;  \r
377 \r
378 }\r
379 \r
380 __STATIC_INLINE void SYSCTL_PowerDown(uint32_t powerdownmask)\r
381 {\r
382         uint32_t pdrun;\r
383 \r
384         pdrun = LPC_SYSCON->PDRUNCFG & PDRUNCFGMASKTMP;\r
385         pdrun |= (powerdownmask & PDRUNCFGMASKTMP);\r
386         LPC_SYSCON->PDRUNCFG = (pdrun | PDRUNCFGUSEMASK);\r
387 }\r
388 \r
389 __STATIC_INLINE void SYSCTL_PowerUp(uint32_t powerupmask)\r
390 {\r
391         uint32_t pdrun;\r
392 \r
393         pdrun = LPC_SYSCON->PDRUNCFG & PDRUNCFGMASKTMP;\r
394         pdrun &= ~(powerupmask & PDRUNCFGMASKTMP);\r
395 \r
396         LPC_SYSCON->PDRUNCFG = (pdrun | PDRUNCFGUSEMASK);\r
397 }\r
398 \r
399 __STATIC_INLINE void FLASH_SetFLASHAccess(uint32_t clks)\r
400 {\r
401         uint32_t tmp = LPC_FLASHCTRL->FLASHCFG & (~(0x3));\r
402 \r
403         /* Don't alter upper bits */\r
404         LPC_FLASHCTRL->FLASHCFG = tmp | clks;\r
405 }\r
406 \r
407 /**\r
408  * Initialize the system\r
409  *\r
410  * @param  none\r
411  * @return none\r
412  *\r
413  * @brief  Setup the microcontroller system.\r
414  *         Initialize the System.\r
415  */\r
416 void SystemInit (void) {\r
417   volatile uint32_t i;\r
418 \r
419 #if (CLOCK_SETUP)                                 /* Clock Setup              */\r
420 \r
421 #if ((SYSPLLCLKSEL_Val & 0x03) == 1)\r
422   //LPC_SYSCON->PDRUNCFG     &= ~(1 << 5);          /* Power-up System Osc      */\r
423   SYSCTL_PowerUp ((1 << 5));\r
424   //LPC_SYSCON->SYSOSCCTRL    = SYSOSCCTRL_Val;\r
425   for (i = 0; i < 0x100; i++) __NOP();\r
426 #endif\r
427 \r
428   LPC_SYSCON->SYSPLLCLKSEL  = SYSPLLCLKSEL_Val;   /* Select PLL Input         */\r
429   LPC_SYSCON->SYSPLLCLKUEN  = 0x00;               /* Toggle Update Register   */\r
430   LPC_SYSCON->SYSPLLCLKUEN  = 0x01;\r
431   //while (!(LPC_SYSCON->SYSPLLCLKUEN & 0x01));     /* Wait Until Updated       */\r
432 \r
433 #if ((MAINCLKSEL_Val & 0x03) == 3)                /* Main Clock is PLL Out    */\r
434   SYSCTL_PowerDown (1 << 7);\r
435   LPC_SYSCON->SYSPLLCTRL    = SYSPLLCTRL_Val;\r
436   //LPC_SYSCON->PDRUNCFG     &= ~(1 << 7);          /* Power-up SYSPLL          */\r
437   SYSCTL_PowerUp ((1 << 7));\r
438   while (!(LPC_SYSCON->SYSPLLSTAT & 0x01));           /* Wait Until PLL Locked    */\r
439 #endif\r
440 \r
441 #if (((MAINCLKSEL_Val & 0x03) == 2) )\r
442   SYSCTL_PowerDown (1 << 6);\r
443   LPC_SYSCON->WDTOSCCTRL    = WDTOSCCTRL_Val;\r
444   //LPC_SYSCON->PDRUNCFG     &= ~(1 << 6);          /* Power-up WDT Clock       */\r
445   SYSCTL_PowerUp ((1 << 6));\r
446   for (i = 0; i < 200; i++) __NOP();\r
447 #endif\r
448 \r
449   LPC_SYSCON->SYSAHBCLKDIV  = SYSAHBCLKDIV_Val;\r
450 \r
451   FLASH_SetFLASHAccess (FLASHCFG_50MHZ_CPU);\r
452 \r
453   LPC_SYSCON->MAINCLKSEL    = MAINCLKSEL_Val;     /* Select PLL Clock Output  */\r
454   LPC_SYSCON->MAINCLKUEN    = 0x00;               /* Toggle Update Register   */\r
455   LPC_SYSCON->MAINCLKUEN    = 0x01;\r
456   //while (!(LPC_SYSCON->MAINCLKUEN & 0x01));       /* Wait Until Updated       */\r
457 \r
458 #if ((USBCLKSEL_Val & 0x003) == 0)                /* USB clock is USB PLL out */\r
459   //SYSCTL_PowerDown (1 << 8);\r
460   LPC_SYSCON->USBPLLCLKSEL  = USBPLLCLKSEL_Val;   /* Select PLL Input         */\r
461   LPC_SYSCON->USBPLLCLKUEN  = 0x00;               /* Toggle Update Register   */\r
462   LPC_SYSCON->USBPLLCLKUEN  = 0x01;\r
463   //while (!(LPC_SYSCON->USBPLLCLKUEN & 0x01));     /* Wait Until Updated       */\r
464   LPC_SYSCON->USBPLLCTRL    = USBPLLCTRL_Val;\r
465   SYSCTL_PowerUp (1 << 8);\r
466   while (!(LPC_SYSCON->USBPLLSTAT   & 0x01));     /* Wait Until PLL Locked    */\r
467   //LPC_SYSCON->USBCLKSEL     = 0x00;               /* Select USB PLL           */\r
468 \r
469 #if ((USBCLKDIV_Val & 0x1FF) != 0)                /* USB clock is used        */\r
470   SYSCTL_PowerDown (1 << 10);\r
471   LPC_SYSCON->USBCLKSEL     = USBCLKSEL_Val;      /* Select USB Clock         */\r
472   LPC_SYSCON->USBCLKDIV     = USBCLKDIV_Val;      /* Set USB clock divider    */\r
473   //LPC_SYSCON->PDRUNCFG     &= ~(1 << 10);         /* Power-up USB PHY         */\r
474   SYSCTL_PowerUp (1 << 10);\r
475 #endif\r
476 \r
477 \r
478 \r
479 #else                                             /* USB clock is not used    */                        \r
480   LPC_SYSCON->PDRUNCFG     |=  (1 << 10);         /* Power-down USB PHY       */\r
481   LPC_SYSCON->PDRUNCFG     |=  (1 <<  8);         /* Power-down USB PLL       */\r
482 #endif\r
483 \r
484 #endif\r
485 \r
486   /* System clock to the IOCON needs to be enabled or\r
487   most of the I/O related peripherals won't work. */\r
488   LPC_SYSCON->SYSAHBCLKCTRL |= (1<<16);\r
489 \r
490   LPC_IOCON->PIO0_3 = 1; // USB_VBUS\r
491   LPC_IOCON->PIO0_6 = 1; // USB_CONNECT\r
492 \r
493   LPC_SYSCON->SYSAHBCLKCTRL |= 1 << 26;\r
494 \r
495 }\r