]> git.kernelconcepts.de Git - karo-tx-redboot.git/blob - packages/hal/arm/mx25/3stack/v2_0/src/board_misc.c
Initial revision
[karo-tx-redboot.git] / packages / hal / arm / mx25 / 3stack / v2_0 / src / board_misc.c
1 //==========================================================================
2 //
3 //      board_misc.c
4 //
5 //      HAL misc board support code for the board
6 //
7 //==========================================================================
8 //####ECOSGPLCOPYRIGHTBEGIN####
9 // -------------------------------------------
10 // This file is part of eCos, the Embedded Configurable Operating System.
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
12 //
13 // eCos is free software; you can redistribute it and/or modify it under
14 // the terms of the GNU General Public License as published by the Free
15 // Software Foundation; either version 2 or (at your option) any later version.
16 //
17 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
18 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
19 // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
20 // for more details.
21 //
22 // You should have received a copy of the GNU General Public License along
23 // with eCos; if not, write to the Free Software Foundation, Inc.,
24 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
25 //
26 // As a special exception, if other files instantiate templates or use macros
27 // or inline functions from this file, or you compile this file and link it
28 // with other works to produce a work based on this file, this file does not
29 // by itself cause the resulting work to be covered by the GNU General Public
30 // License. However the source code for this file must still be made available
31 // in accordance with section (3) of the GNU General Public License.
32 //
33 // This exception does not invalidate any other reasons why a work based on
34 // this file might be covered by the GNU General Public License.
35 //
36 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
37 // at http://sources.redhat.com/ecos/ecos-license/
38 // -------------------------------------------
39 //####ECOSGPLCOPYRIGHTEND####
40 //========================================================================*/
41
42 #include <pkgconf/hal.h>
43 #include <pkgconf/system.h>
44 #include <redboot.h>
45 #include CYGBLD_HAL_PLATFORM_H
46
47 #include <cyg/infra/cyg_type.h>         // base types
48 #include <cyg/infra/cyg_trac.h>         // tracing macros
49 #include <cyg/infra/cyg_ass.h>          // assertion macros
50
51 #include <cyg/hal/hal_io.h>             // IO macros
52 #include <cyg/hal/hal_arch.h>           // Register state info
53 #include <cyg/hal/hal_diag.h>
54 #include <cyg/hal/hal_intr.h>           // Interrupt names
55 #include <cyg/hal/hal_cache.h>
56 #include <cyg/hal/hal_soc.h>         // Hardware definitions
57 #include <cyg/hal/fsl_board.h>             // Platform specifics
58
59 #include <cyg/infra/diag.h>             // diag_printf
60
61 // All the MM table layout is here:
62 #include <cyg/hal/hal_mm.h>
63
64 externC void* memset(void *, int, size_t);
65 static void mxc_fec_setup(void);
66 static void mxc_serial_setup(void);
67
68 void hal_mmu_init(void)
69 {
70     unsigned long ttb_base = RAM_BANK0_BASE + 0x4000;
71     unsigned long i;
72
73     /*
74      * Set the TTB register
75      */
76     asm volatile ("mcr  p15,0,%0,c2,c0,0" : : "r"(ttb_base) /*:*/);
77
78     /*
79      * Set the Domain Access Control Register
80      */
81     i = ARM_ACCESS_DACR_DEFAULT;
82     asm volatile ("mcr  p15,0,%0,c3,c0,0" : : "r"(i) /*:*/);
83
84     /*
85      * First clear all TT entries - ie Set them to Faulting
86      */
87     memset((void *)ttb_base, 0, ARM_FIRST_LEVEL_PAGE_TABLE_SIZE);
88
89     /*              Actual   Virtual  Size   Attributes                                                    Function  */
90     /*              Base     Base     MB     cached?           buffered?        access permissions                 */
91     /*              xxx00000 xxx00000                                                                                */
92     X_ARM_MMU_SECTION(0x000, 0xF00,   0x001, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* ROM */
93     X_ARM_MMU_SECTION(0x400, 0x400,   0x400, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* Internal Regsisters upto SDRAM*/
94     X_ARM_MMU_SECTION(0x800, 0x000,   0x080, ARM_CACHEABLE,   ARM_BUFFERABLE,   ARM_ACCESS_PERM_RW_RW); /* SDRAM 0:128M*/
95     X_ARM_MMU_SECTION(0x800, 0x800,   0x080, ARM_CACHEABLE,   ARM_BUFFERABLE,   ARM_ACCESS_PERM_RW_RW); /* SDRAM 0:128M*/
96     X_ARM_MMU_SECTION(0x800, 0x880,   0x080, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* SDRAM 0:128M*/
97     X_ARM_MMU_SECTION(0xB00, 0xB00,   0x20,  ARM_CACHEABLE,   ARM_BUFFERABLE,   ARM_ACCESS_PERM_RW_RW); /* PSRAM */
98     X_ARM_MMU_SECTION(0xB20, 0xB20,   0x1E0, ARM_UNCACHEABLE, ARM_UNBUFFERABLE,ARM_ACCESS_PERM_RW_RW); /* ESDCTL, WEIM, M3IF, EMI, NFC, External I/O */
99 }
100
101 //
102 // Platform specific initialization
103 //
104
105 unsigned int g_clock_src;
106
107 void plf_hardware_init(void)
108 {
109     g_clock_src = FREQ_24MHZ;
110
111     mxc_serial_setup();
112     mxc_fec_setup();
113 }
114
115 static void mxc_serial_setup(void)
116 {
117         // UART1
118         /*RXD1*/
119         writel(0, IOMUXC_BASE_ADDR + 0x170);
120         writel(0x1E0, IOMUXC_BASE_ADDR + 0x368);
121
122         /*TXD1*/
123         writel(0, IOMUXC_BASE_ADDR + 0x174);
124         writel(0x40, IOMUXC_BASE_ADDR + 0x36c);
125
126         /*RTS1*/
127         writel(0, IOMUXC_BASE_ADDR + 0x178);
128         writel(0x1E0, IOMUXC_BASE_ADDR + 0x370);
129
130         /*CTS1*/
131         writel(0, IOMUXC_BASE_ADDR + 0x17c);
132         writel(0x40, IOMUXC_BASE_ADDR + 0x374);
133 }
134
135 static void mxc_fec_setup(void)
136 {
137         unsigned int val;
138
139         /* FEC_TX_CLK */
140         writel(0, IOMUXC_BASE_ADDR + 0x01E8);
141         writel(0x1C0, IOMUXC_BASE_ADDR + 0x03E0);
142
143         /* FEC_RX_DV */
144         writel(0, IOMUXC_BASE_ADDR + 0x01E4);
145         writel(0x1C0, IOMUXC_BASE_ADDR + 0x03DC);
146
147         /* FEC_RDATA0 */
148         writel(0, IOMUXC_BASE_ADDR + 0x01DC);
149         writel(0x1C0, IOMUXC_BASE_ADDR + 0x03D4);
150
151         /* FEC_TDATA0 */
152         writel(0, IOMUXC_BASE_ADDR + 0x01D0);
153         writel(0x40, IOMUXC_BASE_ADDR + 0x03C8);
154
155         /* FEC_TX_EN */
156         writel(0, IOMUXC_BASE_ADDR + 0x01D8);
157         writel(0x40, IOMUXC_BASE_ADDR + 0x03D0);
158
159         /* FEC_MDC */
160         writel(0, IOMUXC_BASE_ADDR + 0x01C8);
161         writel(0x40, IOMUXC_BASE_ADDR + 0x03C0);
162
163         /* FEC_MDIO */
164         writel(0, IOMUXC_BASE_ADDR + 0x01CC);
165         writel(0x1F0, IOMUXC_BASE_ADDR + 0x03C4);
166
167         /* FEC_RDATA1 */
168         writel(0, IOMUXC_BASE_ADDR + 0x01E0);
169         writel(0x1C0, IOMUXC_BASE_ADDR + 0x03D8);
170
171         /* FEC_TDATA1 */
172         writel(0, IOMUXC_BASE_ADDR + 0x01D4);
173         writel(0x40, IOMUXC_BASE_ADDR + 0x03CC);
174
175         /* 
176          * Set up the FEC_RESET_B and FEC_ENABLE GPIO pins.
177          * Assert FEC_RESET_B, then power up the PHY by asserting
178          * FEC_ENABLE, at the same time lifting FEC_RESET_B.
179          *
180          * FEC_RESET_B: gpio2[3] is ALT 5 mode of pin A17
181          * FEC_ENABLE_B: gpio4[8] is ALT 5 mode of pin D12
182          */
183         writel(0x5, IOMUXC_BASE_ADDR + 0x001C);
184         writel(0x5, IOMUXC_BASE_ADDR + 0x0094);
185
186         writel(0x8, IOMUXC_BASE_ADDR + 0x0238); // open drain
187         writel(0x0, IOMUXC_BASE_ADDR + 0x028C); // cmos, no pu/pd
188
189         /* make the pins output */
190         val = (1 << 3) | readl(GPIO2_BASE_ADDR + GPIO_GDIR);
191         writel(val, GPIO2_BASE_ADDR + GPIO_GDIR);
192
193         val = (1 << 8) | readl(GPIO4_BASE_ADDR + GPIO_GDIR);
194         writel(val, GPIO4_BASE_ADDR + GPIO_GDIR);
195
196         /* drop PHY power */
197         val = readl(GPIO2_BASE_ADDR + GPIO_DR) & ~(1 << 3);
198         writel(val, GPIO2_BASE_ADDR + GPIO_DR);
199
200         /* assert reset */
201         val = readl(GPIO4_BASE_ADDR + GPIO_DR) & ~(1 << 8);
202         writel(val, GPIO4_BASE_ADDR + GPIO_DR);
203         hal_delay_us(2);        // spec says 1us min
204
205         /* turn on power & lift reset */
206         val = (1 << 3) | readl(GPIO2_BASE_ADDR + GPIO_DR);
207         writel(val, GPIO2_BASE_ADDR + GPIO_DR);
208         val = (1 << 8) | readl(GPIO4_BASE_ADDR + GPIO_DR);
209         writel(val, GPIO4_BASE_ADDR + GPIO_DR);
210 }
211
212 static void mxc_cspi_setup(void)
213 {
214         /*CSPI1*/
215         /*SCLK*/
216         writel(0, IOMUXC_BASE_ADDR + 0x180);
217         writel(0x1C0, IOMUXC_BASE_ADDR + 0x5c4);
218         /*SPI_RDY*/
219         writel(0, IOMUXC_BASE_ADDR + 0x184);
220         writel(0x1E0, IOMUXC_BASE_ADDR + 0x5c8);
221         /*MOSI*/
222         writel(0, IOMUXC_BASE_ADDR + 0x170);
223         writel(0x1C0, IOMUXC_BASE_ADDR + 0x5b4);
224         /*MISO*/
225         writel(0, IOMUXC_BASE_ADDR + 0x174);
226         writel(0x1C0, IOMUXC_BASE_ADDR + 0x5b8);
227         /*SS1*/
228         writel(0, IOMUXC_BASE_ADDR + 0x17C);
229         writel(0x1E0, IOMUXC_BASE_ADDR + 0x5C0);
230 }
231
232 void mxc_i2c_init(unsigned int module_base)
233 {
234         switch(module_base) {
235         case I2C_BASE_ADDR:
236                 /* Pins: SION */
237                 writel(0x10, IOMUXC_BASE_ADDR + 0x150);         /* I2C1_CLK */
238                 writel(0x10, IOMUXC_BASE_ADDR + 0x154);         /* I2C1_DAT */
239
240                 /* Pads: HYS, 100k Pull-up, open drain */
241                 writel(0x1E8, IOMUXC_BASE_ADDR + 0x348);        /* I2C1_CLK */
242                 writel(0x1E8, IOMUXC_BASE_ADDR + 0x34c);        /* I2C1_DAT */
243                 break;
244         case I2C2_BASE_ADDR:
245                 /* Pins: ALT1 (of FEC_RDATA1, FEC_RX_DV pins), SION */
246                 writel(0x11, IOMUXC_BASE_ADDR + 0x1e0);         /* I2C2_CLK */
247                 writel(0x11, IOMUXC_BASE_ADDR + 0x1e4);         /* I2C2_DAT */
248
249                 /* Pads: HYS, 100k Pull-up, open drain */
250                 writel(0x1E8, IOMUXC_BASE_ADDR + 0x3d8);        /* I2C2_CLK */
251                 writel(0x1E8, IOMUXC_BASE_ADDR + 0x3dc);        /* I2C2_DAT */
252                 break;
253         case I2C3_BASE_ADDR:
254                 /* Pins: ALT2 (of HSYNC, VSYNC pins), SION */
255                 writel(0x12, IOMUXC_BASE_ADDR + 0x108);         /* I2C3_CLK */
256                 writel(0x12, IOMUXC_BASE_ADDR + 0x10c);         /* I2C3_DAT */
257
258                 /* Pads: HYS, 100k Pull-up, open drain */
259                 writel(0x1E8, IOMUXC_BASE_ADDR + 0x300);        /* I2C2_CLK */
260                 writel(0x1E8, IOMUXC_BASE_ADDR + 0x304);        /* I2C2_DAT */
261                 break;
262         default:
263                 break;
264         }
265 }
266 void mxc_mmc_init(base_address)
267 {
268         unsigned int val;
269
270         switch(base_address) {
271         case MMC_SDHC1_BASE_ADDR:
272                 /* Pins */
273                 writel(0x10, IOMUXC_BASE_ADDR + 0x190); /* SD1_CMD */
274                 writel(0x10, IOMUXC_BASE_ADDR + 0x194); /* SD1_CLK */
275                 writel(0x00, IOMUXC_BASE_ADDR + 0x198); /* SD1_DATA0 */
276                 writel(0x00, IOMUXC_BASE_ADDR + 0x19c); /* SD1_DATA1 */
277                 writel(0x00, IOMUXC_BASE_ADDR + 0x1a0); /* SD1_DATA2 */
278                 writel(0x00, IOMUXC_BASE_ADDR + 0x1a4); /* SD1_DATA3 */
279                 writel(0x06, IOMUXC_BASE_ADDR + 0x094); /* D12 (SD1_DATA4) */
280                 writel(0x06, IOMUXC_BASE_ADDR + 0x090); /* D13 (SD1_DATA5) */
281                 writel(0x06, IOMUXC_BASE_ADDR + 0x08c); /* D14 (SD1_DATA6) */
282                 writel(0x06, IOMUXC_BASE_ADDR + 0x088); /* D15 (SD1_DATA7) */
283                 writel(0x05, IOMUXC_BASE_ADDR + 0x010); /* A14 (SD1_WP) */
284                 writel(0x05, IOMUXC_BASE_ADDR + 0x014); /* A15 (SD1_DET) */
285
286                 /* Pads */
287                 writel(0xD1, IOMUXC_BASE_ADDR + 0x388); /* SD1_CMD */
288                 writel(0xD1, IOMUXC_BASE_ADDR + 0x38c); /* SD1_CLK */
289                 writel(0xD1, IOMUXC_BASE_ADDR + 0x390); /* SD1_DATA0 */
290                 writel(0xD1, IOMUXC_BASE_ADDR + 0x394); /* SD1_DATA1 */
291                 writel(0xD1, IOMUXC_BASE_ADDR + 0x398); /* SD1_DATA2 */
292                 writel(0xD1, IOMUXC_BASE_ADDR + 0x39c); /* SD1_DATA3 */
293                 writel(0xD1, IOMUXC_BASE_ADDR + 0x28c); /* D12 (SD1_DATA4) */
294                 writel(0xD1, IOMUXC_BASE_ADDR + 0x288); /* D13 (SD1_DATA5) */
295                 writel(0xD1, IOMUXC_BASE_ADDR + 0x284); /* D14 (SD1_DATA6) */
296                 writel(0xD1, IOMUXC_BASE_ADDR + 0x280); /* D15 (SD1_DATA7) */
297                 writel(0xD1, IOMUXC_BASE_ADDR + 0x230); /* A14 (SD1_WP) */
298                 writel(0xD1, IOMUXC_BASE_ADDR + 0x234); /* A15 (SD1_DET) */
299
300                 /*
301                  * Set write protect and card detect gpio as inputs
302                  * A14 (SD1_WP) and A15 (SD1_DET)
303                  */
304                 val = ~(3 << 0) & readl(GPIO1_BASE_ADDR + GPIO_GDIR);
305                 writel(val, GPIO1_BASE_ADDR + GPIO_GDIR);
306
307                 break;
308         case MMC_SDHC2_BASE_ADDR:
309                 /* Pins */
310                 writel(0x16, IOMUXC_BASE_ADDR + 0x0e8); /* LD8 (SD1_CMD) */
311                 writel(0x16, IOMUXC_BASE_ADDR + 0x0ec); /* LD9 (SD1_CLK) */
312                 writel(0x06, IOMUXC_BASE_ADDR + 0x0f0); /* LD10 (SD1_DATA0) */
313                 writel(0x06, IOMUXC_BASE_ADDR + 0x0f4); /* LD11 (SD1_DATA1) */
314                 writel(0x06, IOMUXC_BASE_ADDR + 0x0f8); /* LD12 (SD1_DATA2) */
315                 writel(0x06, IOMUXC_BASE_ADDR + 0x0fc); /* LD13 (SD1_DATA3) */
316                 writel(0x02, IOMUXC_BASE_ADDR + 0x120); /* CSI_D2 (SD1_DATA4) */
317                 writel(0x02, IOMUXC_BASE_ADDR + 0x124); /* CSI_D3 (SD1_DATA5) */
318                 writel(0x02, IOMUXC_BASE_ADDR + 0x128); /* CSI_D4 (SD1_DATA6) */
319                 writel(0x02, IOMUXC_BASE_ADDR + 0x12c); /* CSI_D5 (SD1_DATA7) */
320
321                 /* Pads */
322                 writel(0xD1, IOMUXC_BASE_ADDR + 0x2e0); /* LD8 (SD1_CMD) */
323                 writel(0xD1, IOMUXC_BASE_ADDR + 0x2e4); /* LD9 (SD1_CLK) */
324                 writel(0xD1, IOMUXC_BASE_ADDR + 0x2e8); /* LD10 (SD1_DATA0) */
325                 writel(0xD1, IOMUXC_BASE_ADDR + 0x2ec); /* LD11 (SD1_DATA1) */
326                 writel(0xD1, IOMUXC_BASE_ADDR + 0x2f0); /* LD12 (SD1_DATA2) */
327                 writel(0xD1, IOMUXC_BASE_ADDR + 0x2f4); /* LD13 (SD1_DATA3) */
328                 writel(0xD1, IOMUXC_BASE_ADDR + 0x318); /* CSI_D2 (SD1_DATA4) */
329                 writel(0xD1, IOMUXC_BASE_ADDR + 0x31c); /* CSI_D3 (SD1_DATA5) */
330                 writel(0xD1, IOMUXC_BASE_ADDR + 0x320); /* CSI_D4 (SD1_DATA6) */
331                 writel(0xD1, IOMUXC_BASE_ADDR + 0x324); /* CSI_D5 (SD1_DATA7) */
332
333         default:
334                 break;
335         }
336 }
337
338 #include CYGHWR_MEMORY_LAYOUT_H
339
340 typedef void code_fun(void);
341
342 void board_program_new_stack(void *func)
343 {
344     register CYG_ADDRESS stack_ptr asm("sp");
345     register CYG_ADDRESS old_stack asm("r4");
346     register code_fun *new_func asm("r0");
347     old_stack = stack_ptr;
348     stack_ptr = CYGMEM_REGION_ram + CYGMEM_REGION_ram_SIZE - sizeof(CYG_ADDRESS);
349     new_func = (code_fun*)func;
350     new_func();
351     stack_ptr = old_stack;
352 }
353
354 static void display_clock_src(void)
355 {
356     diag_printf("\n");
357     diag_printf("Clock input is 24 MHz");
358 }
359 RedBoot_init(display_clock_src, RedBoot_INIT_LAST);
360
361 // ------------------------------------------------------------------------