1 //==========================================================================
5 // HAL misc board support code for the board
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.
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.
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
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.
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.
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.
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 //========================================================================*/
42 #include <pkgconf/hal.h>
43 #include <pkgconf/system.h>
45 #include CYGBLD_HAL_PLATFORM_H
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
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
59 #include <cyg/infra/diag.h> // diag_printf
61 // All the MM table layout is here:
62 #include <cyg/hal/hal_mm.h>
64 externC void* memset(void *, int, size_t);
65 static void mxc_fec_setup(void);
66 static void mxc_serial_setup(void);
68 void hal_mmu_init(void)
70 unsigned long ttb_base = RAM_BANK0_BASE + 0x4000;
74 * Set the TTB register
76 asm volatile ("mcr p15,0,%0,c2,c0,0" : : "r"(ttb_base) /*:*/);
79 * Set the Domain Access Control Register
81 i = ARM_ACCESS_DACR_DEFAULT;
82 asm volatile ("mcr p15,0,%0,c3,c0,0" : : "r"(i) /*:*/);
85 * First clear all TT entries - ie Set them to Faulting
87 memset((void *)ttb_base, 0, ARM_FIRST_LEVEL_PAGE_TABLE_SIZE);
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 */
102 // Platform specific initialization
105 unsigned int g_clock_src;
107 void plf_hardware_init(void)
109 g_clock_src = FREQ_24MHZ;
115 static void mxc_serial_setup(void)
119 writel(0, IOMUXC_BASE_ADDR + 0x170);
120 writel(0x1E0, IOMUXC_BASE_ADDR + 0x368);
123 writel(0, IOMUXC_BASE_ADDR + 0x174);
124 writel(0x40, IOMUXC_BASE_ADDR + 0x36c);
127 writel(0, IOMUXC_BASE_ADDR + 0x178);
128 writel(0x1E0, IOMUXC_BASE_ADDR + 0x370);
131 writel(0, IOMUXC_BASE_ADDR + 0x17c);
132 writel(0x40, IOMUXC_BASE_ADDR + 0x374);
135 static void mxc_fec_setup(void)
140 writel(0, IOMUXC_BASE_ADDR + 0x01E8);
141 writel(0x1C0, IOMUXC_BASE_ADDR + 0x03E0);
144 writel(0, IOMUXC_BASE_ADDR + 0x01E4);
145 writel(0x1C0, IOMUXC_BASE_ADDR + 0x03DC);
148 writel(0, IOMUXC_BASE_ADDR + 0x01DC);
149 writel(0x1C0, IOMUXC_BASE_ADDR + 0x03D4);
152 writel(0, IOMUXC_BASE_ADDR + 0x01D0);
153 writel(0x40, IOMUXC_BASE_ADDR + 0x03C8);
156 writel(0, IOMUXC_BASE_ADDR + 0x01D8);
157 writel(0x40, IOMUXC_BASE_ADDR + 0x03D0);
160 writel(0, IOMUXC_BASE_ADDR + 0x01C8);
161 writel(0x40, IOMUXC_BASE_ADDR + 0x03C0);
164 writel(0, IOMUXC_BASE_ADDR + 0x01CC);
165 writel(0x1F0, IOMUXC_BASE_ADDR + 0x03C4);
168 writel(0, IOMUXC_BASE_ADDR + 0x01E0);
169 writel(0x1C0, IOMUXC_BASE_ADDR + 0x03D8);
172 writel(0, IOMUXC_BASE_ADDR + 0x01D4);
173 writel(0x40, IOMUXC_BASE_ADDR + 0x03CC);
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.
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
183 writel(0x5, IOMUXC_BASE_ADDR + 0x001C);
184 writel(0x5, IOMUXC_BASE_ADDR + 0x0094);
186 writel(0x8, IOMUXC_BASE_ADDR + 0x0238); // open drain
187 writel(0x0, IOMUXC_BASE_ADDR + 0x028C); // cmos, no pu/pd
189 /* make the pins output */
190 val = (1 << 3) | readl(GPIO2_BASE_ADDR + GPIO_GDIR);
191 writel(val, GPIO2_BASE_ADDR + GPIO_GDIR);
193 val = (1 << 8) | readl(GPIO4_BASE_ADDR + GPIO_GDIR);
194 writel(val, GPIO4_BASE_ADDR + GPIO_GDIR);
197 val = readl(GPIO2_BASE_ADDR + GPIO_DR) & ~(1 << 3);
198 writel(val, GPIO2_BASE_ADDR + GPIO_DR);
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
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);
212 static void mxc_cspi_setup(void)
216 writel(0, IOMUXC_BASE_ADDR + 0x180);
217 writel(0x1C0, IOMUXC_BASE_ADDR + 0x5c4);
219 writel(0, IOMUXC_BASE_ADDR + 0x184);
220 writel(0x1E0, IOMUXC_BASE_ADDR + 0x5c8);
222 writel(0, IOMUXC_BASE_ADDR + 0x170);
223 writel(0x1C0, IOMUXC_BASE_ADDR + 0x5b4);
225 writel(0, IOMUXC_BASE_ADDR + 0x174);
226 writel(0x1C0, IOMUXC_BASE_ADDR + 0x5b8);
228 writel(0, IOMUXC_BASE_ADDR + 0x17C);
229 writel(0x1E0, IOMUXC_BASE_ADDR + 0x5C0);
232 void mxc_i2c_init(unsigned int module_base)
234 switch(module_base) {
237 writel(0x10, IOMUXC_BASE_ADDR + 0x150); /* I2C1_CLK */
238 writel(0x10, IOMUXC_BASE_ADDR + 0x154); /* I2C1_DAT */
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 */
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 */
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 */
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 */
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 */
266 void mxc_mmc_init(base_address)
270 switch(base_address) {
271 case MMC_SDHC1_BASE_ADDR:
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) */
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) */
301 * Set write protect and card detect gpio as inputs
302 * A14 (SD1_WP) and A15 (SD1_DET)
304 val = ~(3 << 0) & readl(GPIO1_BASE_ADDR + GPIO_GDIR);
305 writel(val, GPIO1_BASE_ADDR + GPIO_GDIR);
308 case MMC_SDHC2_BASE_ADDR:
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) */
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) */
338 #include CYGHWR_MEMORY_LAYOUT_H
340 typedef void code_fun(void);
342 void board_program_new_stack(void *func)
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;
351 stack_ptr = old_stack;
354 static void display_clock_src(void)
357 diag_printf("Clock input is 24 MHz");
359 RedBoot_init(display_clock_src, RedBoot_INIT_LAST);
361 // ------------------------------------------------------------------------