]> rtime.felk.cvut.cz Git - sysless.git/blob - board/arm/lpc2364_addat/libs/hwinit/startcfg.c
Merge with git://ulan.git.sourceforge.net/gitroot/ulan/sysless
[sysless.git] / board / arm / lpc2364_addat / libs / hwinit / startcfg.c
1 #include "startcfg.h"\r
2 #include <errno.h>              \r
3 #include <lpc2xxx.h>                            /* LPC21xx definitions */\r
4 \r
5 \r
6 // -----------------   PLL part ------------------------\r
7 #define PLL_OFF                 0               // fully disable PLL\r
8 #define PLL_ACTIVE              1               // activate PLL \r
9 #define PLL_CONNECT             3               // connect PLL to Cclk\r
10 \r
11 #define PLL_FEED_1              0xAA    // PLL feed sequence 1\r
12 #define PLL_FEED_2              0x55    // PLL feed sequence 3                                                  \r
13 #define PLL_LOCK_MASK   0x400   // PLL lock mask\r
14 \r
15 \r
16 \r
17 #define PLL_DIV_MASK_2  (0<<5)\r
18 #define PLL_DIV_MASK_4  (1<<5)\r
19 #define PLL_DIV_MASK_8  (2<<5)\r
20 #define PLL_DIV_MASK_16 (3<<5)\r
21 \r
22 // -----------------   MAM part ------------------------\r
23 \r
24 #define MAM_1ST_BOUND   20000\r
25 #define MAM_2ND_BOUND   40000\r
26 #define MAM_TIM_1       1\r
27 #define MAM_TIM_2       2\r
28 #define MAM_TIM_3       3\r
29 \r
30 \r
31 //------------------  code  ----------------------------\r
32 \r
33 void wait(void)\r
34 {\r
35         unsigned int i =2000000;\r
36         while(--i);\r
37 }\r
38 \r
39 \r
40 void deb_led(char leds)\r
41 {\r
42         IO0DIR |= ((1<<21) | (1<<22) | (1<<23) | (1<<24));\r
43 \r
44         if (leds & 0x1) IOSET0 |=  (1<<21);\r
45                 else IOCLR0 |= (1<<21);\r
46 \r
47         if (leds & 0x2) IOSET0 |=  (1<<22);\r
48                 else IOCLR0 |= (1<<22);\r
49 \r
50         if (leds & 0x4) IOSET0 |=  (1<<23);\r
51                 else IOCLR0 |= (1<<23);\r
52 \r
53         if (leds & 0x8) IOSET0 |=  (1<<24);\r
54                 else IOCLR0 |= (1<<24);\r
55 }\r
56 \r
57 \r
58 \r
59 \r
60 \r
61 // setup procesor PLL\r
62 unsigned char init_PLL(char mul,char div, char mode)\r
63 {\r
64         \r
65         unsigned int fcco, cclk; \r
66 \r
67 \r
68         PLLCON = PLL_OFF;               // disable PLL          \r
69         PLLFEED = PLL_FEED_1;   // PLL change sequence\r
70         PLLFEED = PLL_FEED_2;\r
71         \r
72         if (mode == PLL_MODE_DISABLE)\r
73         {\r
74                 return 0;\r
75         }\r
76 \r
77         fcco = FOSC * 2 * (mul + 1) * div ;                     // count Fcco\r
78         if (( FCCO_MIN > fcco)|(fcco >  FCCO_MAX))      // check Fcco range\r
79         {\r
80                 return   ERANGE;\r
81         }\r
82 \r
83         cclk = (mul + 1) * FOSC;                                                        // count cclk\r
84         if (( CCLK_MIN > cclk)|(cclk >  CCLK_MAX))      // check cclk range\r
85         {\r
86                 return   ERANGE;\r
87         }\r
88 \r
89         switch(div)\r
90         {\r
91                 case(PLL_DIV_2):        div = PLL_DIV_MASK_2;\r
92                                                         break;\r
93 \r
94                 case(PLL_DIV_4):        div = PLL_DIV_MASK_4;\r
95                                                         break;\r
96 \r
97                 case(PLL_DIV_8):        div = PLL_DIV_MASK_8;\r
98                                                         break;\r
99 \r
100                 case(PLL_DIV_16):       div = PLL_DIV_MASK_16;\r
101                                                         break;\r
102 \r
103                 default:                        return ERANGE;\r
104         }\r
105 \r
106 \r
107         PLLCFG = mul | div;             // write multiplicator and dividet to PLL config\r
108         PLLCON = PLL_ACTIVE;    // enable PLL           \r
109         PLLFEED = PLL_FEED_1;   // PLL change sequence\r
110         PLLFEED = PLL_FEED_2;\r
111 \r
112         while( (PLLSTAT & PLL_LOCK_MASK) == 0);         // wait for PLL LOCK\r
113 \r
114         PLLCON = PLL_CONNECT;   // connect PLL to Cclk\r
115         PLLFEED = PLL_FEED_1;   // PLL change sequence\r
116         PLLFEED = PLL_FEED_2;\r
117 \r
118         return 0;\r
119 }\r
120 \r
121 \r
122 // get procesor speed\r
123 unsigned int get_sys_speed(void)\r
124 {\r
125         if( (PLLCON & PLL_CONNECT) == PLL_CONNECT) // if PLL is connected return PLL-Cclk speed\r
126         {\r
127         return( FOSC * ((PLLCFG & 0x1F) + 1));\r
128     }\r
129 \r
130         return FOSC;    // if PLL is disabled return native Fosc\r
131 \r
132 }\r
133 \r
134 \r
135 // setup MAM module\r
136 \r
137 unsigned char init_MAM(char mode)\r
138 {\r
139         unsigned int clk;\r
140 \r
141         MAMCR = MAM_OFF;\r
142 \r
143         #ifdef MEM_RAM    // FIXME udelat pomoci linker scriptu\r
144                 return 0;\r
145         #endif\r
146 \r
147 \r
148         if (mode == MAM_OFF) return 0;\r
149         \r
150 \r
151         clk = get_sys_speed();\r
152 \r
153         if(clk > MAM_2ND_BOUND)\r
154         {\r
155                 MAMTIM = MAM_TIM_3; \r
156         } \r
157         else if (clk > MAM_1ST_BOUND) \r
158         {\r
159                 MAMTIM = MAM_TIM_2;\r
160         }\r
161         else MAMTIM = MAM_TIM_1;\r
162 \r
163         MAMCR = mode;\r
164 \r
165         return 0;\r
166 }\r
167 \r
168 // setup APB module\r
169 unsigned char set_APB(char div)\r
170 {\r
171         VPBDIV = div;\r
172         return 0;\r
173 }\r
174 \r
175 \r
176 unsigned int get_apb_speed(void)\r
177 {\r
178         int sysClk,div;\r
179 \r
180         switch( VPBDIV & 0x03)\r
181         {\r
182                 case APB_DIV_1:  div = 1;\r
183                         break;\r
184 \r
185                 case APB_DIV_2:  div = 2;\r
186                         break;\r
187 \r
188                 case APB_DIV_4:  div = 4;\r
189                         break;\r
190 \r
191                 default:  return ERANGE;\r
192         }\r
193 \r
194 \r
195         sysClk = get_sys_speed();\r
196 \r
197         return (sysClk / div);\r
198 \r
199 \r
200 }\r
201 \r
202 \r