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
58 #include <cyg/hal/mx51_iomux.h>
59 #include <cyg/io/mxc_i2c.h>
60 #include <cyg/io/imx_nfc.h>
61 #include <cyg/infra/diag.h> // diag_printf
63 // All the MM table layout is here:
64 #include <cyg/hal/hal_mm.h>
65 #include <cyg/io/imx_spi.h>
67 externC void* memset(void *, int, size_t);
68 extern nfc_iomuxsetup_func_t *nfc_iomux_setup;
70 unsigned int cpld_base_addr;
72 struct spi_v2_3_reg spi_nor_reg;
73 struct imx_spi_dev imx_spi_nor = {
74 base : CSPI2_BASE_ADDR,
76 ss_pol : IMX_SPI_ACTIVE_LOW,
83 imx_spi_init_func_t *spi_nor_init;
84 imx_spi_xfer_func_t *spi_nor_xfer;
86 void hal_mmu_init(void)
88 unsigned long ttb_base = RAM_BANK0_BASE + 0x4000;
92 * Set the TTB register
94 asm volatile ("mcr p15,0,%0,c2,c0,0" : : "r"(ttb_base) /*:*/);
97 * Set the Domain Access Control Register
99 i = ARM_ACCESS_DACR_DEFAULT;
100 asm volatile ("mcr p15,0,%0,c3,c0,0" : : "r"(i) /*:*/);
103 * First clear all TT entries - ie Set them to Faulting
105 memset((void *)ttb_base, 0, ARM_FIRST_LEVEL_PAGE_TABLE_SIZE);
107 /* Actual Virtual Size Attributes Function */
108 /* Base Base MB cached? buffered? access permissions */
109 /* xxx00000 xxx00000 */
110 X_ARM_MMU_SECTION(0x000, 0x200, 0x1, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* ROM */
111 X_ARM_MMU_SECTION(0x1FF, 0x1FF, 0x001, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* IRAM */
112 X_ARM_MMU_SECTION(0x300, 0x300, 0x100, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* GPU */
113 X_ARM_MMU_SECTION(0x400, 0x400, 0x200, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* IPUv3D */
114 X_ARM_MMU_SECTION(0x600, 0x600, 0x300, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* periperals */
115 X_ARM_MMU_SECTION(0x900, 0x000, 0x080, ARM_CACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* SDRAM */
116 X_ARM_MMU_SECTION(0x900, 0x900, 0x080, ARM_CACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* SDRAM */
117 X_ARM_MMU_SECTION(0x900, 0x980, 0x080, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* SDRAM 0:128M*/
118 X_ARM_MMU_SECTION(0xA00, 0xA00, 0x100, ARM_CACHEABLE, ARM_BUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* SDRAM */
119 X_ARM_MMU_SECTION(0xB80, 0xB80, 0x10, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* CS1 EIM control*/
120 X_ARM_MMU_SECTION(0xCC0, 0xCC0, 0x040, ARM_UNCACHEABLE, ARM_UNBUFFERABLE, ARM_ACCESS_PERM_RW_RW); /* CS4/5/NAND Flash buffer */
123 void mxc_i2c_init(unsigned int module_base)
127 switch (module_base) {
129 reg = IOMUXC_BASE_ADDR + 0x210; // i2c SDA
131 reg = IOMUXC_BASE_ADDR + 0x600;
133 reg = IOMUXC_BASE_ADDR + 0x9B4;
136 reg = IOMUXC_BASE_ADDR + 0x224; // i2c SCL
138 reg = IOMUXC_BASE_ADDR + 0x614;
140 reg = IOMUXC_BASE_ADDR + 0x9B0;
144 /* Workaround for Atlas Lite */
145 writel(0x0, IOMUXC_BASE_ADDR + 0x3CC); // i2c SCL
146 writel(0x0, IOMUXC_BASE_ADDR + 0x3D0); // i2c SDA
147 reg = readl(GPIO1_BASE_ADDR + 0x0);
148 reg |= 0xC; // write a 1 on the SCL and SDA lines
149 writel(reg, GPIO1_BASE_ADDR + 0x0);
150 reg = readl(GPIO1_BASE_ADDR + 0x4);
151 reg |= 0xC; // configure GPIO lines as output
152 writel(reg, GPIO1_BASE_ADDR + 0x4);
153 reg = readl(GPIO1_BASE_ADDR + 0x0);
154 reg &= ~0x4 ; // set SCL low for a few milliseconds
155 writel(reg, GPIO1_BASE_ADDR + 0x0);
158 writel(reg, GPIO1_BASE_ADDR + 0x0);
160 reg = readl(GPIO1_BASE_ADDR + 0x4);
161 reg &= ~0xC; // configure GPIO lines back as input
162 writel(reg, GPIO1_BASE_ADDR + 0x4);
163 writel(0x12, IOMUXC_BASE_ADDR + 0x3CC); // i2c SCL
164 writel(0x3, IOMUXC_BASE_ADDR + 0x9B8);
165 writel(0x1ed, IOMUXC_BASE_ADDR + 0x7D4);
167 writel(0x12, IOMUXC_BASE_ADDR + 0x3D0); // i2c SDA
168 writel(0x3, IOMUXC_BASE_ADDR + 0x9BC);
169 writel(0x1ed, IOMUXC_BASE_ADDR + 0x7D8);
172 diag_printf("Invalid I2C base: 0x%x\n", module_base);
177 void mxc_ata_iomux_setup(void)
179 // config NANDF_WE_B pad for pata instance DIOW port
180 // config_pad_mode(NANDF_WE_B, ALT1);
181 writel(0x1, IOMUXC_SW_MUX_CTL_PAD_NANDF_WE_B);
182 writel(0x2004, IOMUXC_SW_PAD_CTL_PAD_NANDF_WE_B);
184 // config NANDF_RE_B pad for pata instance DIOR port
185 // config_pad_mode(NANDF_RE_B, ALT1);
186 writel(0x1, IOMUXC_SW_MUX_CTL_PAD_NANDF_RE_B);
187 writel(0x2004, IOMUXC_SW_PAD_CTL_PAD_NANDF_RE_B);
189 writel(0x1, IOMUXC_SW_MUX_CTL_PAD_NANDF_ALE);
190 writel(0x2004, IOMUXC_SW_PAD_CTL_PAD_NANDF_ALE);
192 // config NANDF_CLE pad for pata instance PATA_RESET_B port
193 // config_pad_mode(NANDF_CLE, ALT1);
194 writel(0x1, IOMUXC_SW_MUX_CTL_PAD_NANDF_CLE);
195 writel(0x2004, IOMUXC_SW_PAD_CTL_PAD_NANDF_CLE);
197 // config NANDF_WP_B pad for pata instance DMACK port
198 // config_pad_mode(NANDF_WP_B, ALT1);
199 writel(0x1, IOMUXC_SW_MUX_CTL_PAD_NANDF_WP_B);
200 writel(0x2004, IOMUXC_SW_PAD_CTL_PAD_NANDF_WP_B);
202 // config NANDF_RB0 pad for pata instance DMARQ port
203 // config_pad_mode(NANDF_RB0, 0x1);
204 writel(0x1, IOMUXC_SW_MUX_CTL_PAD_NANDF_RB0);
205 writel(0x2004, IOMUXC_SW_PAD_CTL_PAD_NANDF_RB0);
207 // config NANDF_RB1 pad for pata instance IORDY port
208 // config_pad_mode(NANDF_RB1, 0x1);
209 writel(0x1, IOMUXC_SW_MUX_CTL_PAD_NANDF_RB1);
210 writel(0x2004, IOMUXC_SW_PAD_CTL_PAD_NANDF_RB1);
212 // config NANDF_RB5 pad for pata instance INTRQ port
213 // config_pad_mode(NANDF_RB5, 0x1);
214 writel(0x1, IOMUXC_SW_MUX_CTL_PAD_GPIO_NAND);
215 writel(0x2004, IOMUXC_SW_PAD_CTL_PAD_GPIO_NAND);
217 // config NANDF_CS2 pad for pata instance CS_0 port
218 // config_pad_mode(NANDF_CS2, 0x1);
219 writel(0x1, IOMUXC_SW_MUX_CTL_PAD_NANDF_CS2);
220 writel(0x2004, IOMUXC_SW_PAD_CTL_PAD_NANDF_CS2);
222 // config NANDF_CS3 pad for pata instance CS_1 port
223 // config_pad_mode(NANDF_CS3, 0x1);
224 writel(0x1, IOMUXC_SW_MUX_CTL_PAD_NANDF_CS3);
225 writel(0x2004, IOMUXC_SW_PAD_CTL_PAD_NANDF_CS3);
227 // config NANDF_CS4 pad for pata instance DA_0 port
228 // config_pad_mode(NANDF_CS4, 0x1);
229 writel(0x1, IOMUXC_SW_MUX_CTL_PAD_NANDF_CS4);
230 writel(0x2004, IOMUXC_SW_PAD_CTL_PAD_NANDF_CS4);
232 // config NANDF_CS5 pad for pata instance DA_1 port
233 // config_pad_mode(NANDF_CS5, 0x1);
234 writel(0x1, IOMUXC_SW_MUX_CTL_PAD_NANDF_CS5);
235 writel(0x2004, IOMUXC_SW_PAD_CTL_PAD_NANDF_CS5);
237 // config NANDF_CS6 pad for pata instance DA_2 port
238 // config_pad_mode(NANDF_CS6, 0x1);
239 writel(0x1, IOMUXC_SW_MUX_CTL_PAD_NANDF_CS6);
240 writel(0x2004, IOMUXC_SW_PAD_CTL_PAD_NANDF_CS6);
242 // config NANDF_D15 pad for pata instance PATA_DATA[15] port
243 // config_pad_mode(NANDF_D15, 0x1);
244 writel(0x1, IOMUXC_SW_MUX_CTL_PAD_NANDF_D15);
245 writel(0x2004, IOMUXC_SW_PAD_CTL_PAD_NANDF_D15);
247 // config NANDF_D14 pad for pata instance PATA_DATA[14] port
248 // config_pad_mode(NANDF_D14, 0x1);
249 writel(0x1, IOMUXC_SW_MUX_CTL_PAD_NANDF_D14);
250 writel(0x2004, IOMUXC_SW_PAD_CTL_PAD_NANDF_D14);
252 // config NANDF_D13 pad for pata instance PATA_DATA[13] port
253 // config_pad_mode(NANDF_D13, 0x1);
254 writel(0x1, IOMUXC_SW_MUX_CTL_PAD_NANDF_D13);
255 writel(0x2004, IOMUXC_SW_PAD_CTL_PAD_NANDF_D13);
257 // config NANDF_D12 pad for pata instance PATA_DATA[12] port
258 // config_pad_mode(NANDF_D12, 0x1);
259 writel(0x1, IOMUXC_SW_MUX_CTL_PAD_NANDF_D12);
260 writel(0x2004, IOMUXC_SW_PAD_CTL_PAD_NANDF_D12);
262 // config NANDF_D11 pad for pata instance PATA_DATA[11] port
263 // config_pad_mode(NANDF_D11, 0x1);
264 writel(0x1, IOMUXC_SW_MUX_CTL_PAD_NANDF_D11);
265 writel(0x2004, IOMUXC_SW_PAD_CTL_PAD_NANDF_D11);
267 // config NANDF_D10 pad for pata instance PATA_DATA[10] port
268 // config_pad_mode(NANDF_D10, 0x1);
269 writel(0x1, IOMUXC_SW_MUX_CTL_PAD_NANDF_D10);
270 writel(0x2004, IOMUXC_SW_PAD_CTL_PAD_NANDF_D10);
272 // config NANDF_D9 pad for pata instance PATA_DATA[9] port
273 // config_pad_mode(NANDF_D9, 0x1);
274 writel(0x1, IOMUXC_SW_MUX_CTL_PAD_NANDF_D9);
275 writel(0x2004, IOMUXC_SW_PAD_CTL_PAD_NANDF_D9);
277 // config NANDF_D8 pad for pata instance PATA_DATA[8] port
278 // config_pad_mode(NANDF_D8, 0x1);
279 writel(0x1, IOMUXC_SW_MUX_CTL_PAD_NANDF_D8);
280 writel(0x2004, IOMUXC_SW_PAD_CTL_PAD_NANDF_D8);
282 // config NANDF_D7 pad for pata instance PATA_DATA[7] port
283 // config_pad_mode(NANDF_D7, 0x1);
284 writel(0x1, IOMUXC_SW_MUX_CTL_PAD_NANDF_D7);
285 writel(0x2004, IOMUXC_SW_PAD_CTL_PAD_NANDF_D7);
287 // config NANDF_D6 pad for pata instance PATA_DATA[6] port
288 // config_pad_mode(NANDF_D6, 0x1);
289 writel(0x1, IOMUXC_SW_MUX_CTL_PAD_NANDF_D6);
290 writel(0x2004, IOMUXC_SW_PAD_CTL_PAD_NANDF_D6);
292 // config NANDF_D5 pad for pata instance PATA_DATA[5] port
293 // config_pad_mode(NANDF_D5, 0x1);
294 writel(0x1, IOMUXC_SW_MUX_CTL_PAD_NANDF_D5);
295 writel(0x2004, IOMUXC_SW_PAD_CTL_PAD_NANDF_D5);
297 // config NANDF_D4 pad for pata instance PATA_DATA[4] port
298 // config_pad_mode(NANDF_D4, 0x1);
299 writel(0x1, IOMUXC_SW_MUX_CTL_PAD_NANDF_D4);
300 writel(0x2004, IOMUXC_SW_PAD_CTL_PAD_NANDF_D4);
302 // config NANDF_D3 pad for pata instance PATA_DATA[3] port
303 // config_pad_mode(NANDF_D3, 0x1);
304 writel(0x1, IOMUXC_SW_MUX_CTL_PAD_NANDF_D3);
305 writel(0x2004, IOMUXC_SW_PAD_CTL_PAD_NANDF_D3);
307 // config NANDF_D2 pad for pata instance PATA_DATA[2] port
308 // config_pad_mode(NANDF_D2, 0x1);
309 writel(0x1, IOMUXC_SW_MUX_CTL_PAD_NANDF_D2);
310 writel(0x2004, IOMUXC_SW_PAD_CTL_PAD_NANDF_D2);
312 // config NANDF_D1 pad for pata instance PATA_DATA[1] port
313 // config_pad_mode(NANDF_D1, 0x1);
314 writel(0x1, IOMUXC_SW_MUX_CTL_PAD_NANDF_D1);
315 writel(0x2004, IOMUXC_SW_PAD_CTL_PAD_NANDF_D1);
317 // config NANDF_D0 pad for pata instance PATA_DATA[0] port
318 // config_pad_mode(NANDF_D0, 0x1);
319 writel(0x1, IOMUXC_SW_MUX_CTL_PAD_NANDF_D0);
320 writel(0x2004, IOMUXC_SW_PAD_CTL_PAD_NANDF_D0);
323 static void mxc_fec_setup(void)
325 volatile unsigned int reg;
327 /* No FEC support for TO 2.0 and higher yet */
328 if (((system_rev >> MAJOR_NUMBER_OFFSET) & 0xf) >= 0x2)
331 writel(0x2, IOMUXC_BASE_ADDR + 0x0390);
332 writel(0x180, IOMUXC_BASE_ADDR + 0x085C);
333 writel(0x1, IOMUXC_BASE_ADDR + 0x09D0);
336 writel(0x2, IOMUXC_BASE_ADDR + 0x0388);
337 writel(0x180, IOMUXC_BASE_ADDR + 0x0854);
338 writel(0x1, IOMUXC_BASE_ADDR + 0x09C4);
341 writel(0x2, IOMUXC_BASE_ADDR + 0x038c);
342 writel(0x180, IOMUXC_BASE_ADDR + 0x0858);
343 writel(0x1, IOMUXC_BASE_ADDR + 0x09C8);
346 writel(0x2, IOMUXC_BASE_ADDR + 0x0384);
347 writel(0x180, IOMUXC_BASE_ADDR + 0x0850);
348 writel(0x1, IOMUXC_BASE_ADDR + 0x9A8);
351 writel(0x2, IOMUXC_BASE_ADDR + 0x0394);
352 writel(0x180, IOMUXC_BASE_ADDR + 0x0860);
353 writel(0x1, IOMUXC_BASE_ADDR + 0x09B4);
356 writel(0x2, IOMUXC_BASE_ADDR + 0x0398);
357 writel(0x5, IOMUXC_BASE_ADDR + 0x864);
360 writel(0x2, IOMUXC_BASE_ADDR + 0x0380);
361 writel(0x5, IOMUXC_BASE_ADDR + 0x084C);
364 writel(0x2, IOMUXC_BASE_ADDR + 0x034C);
365 writel(0x5, IOMUXC_BASE_ADDR + 0x0818);
368 writel(0x2, IOMUXC_BASE_ADDR + 0x0350);
369 writel(0x1CD, IOMUXC_BASE_ADDR + 0x081C);
370 writel(0x1, IOMUXC_BASE_ADDR + 0x09B0);
373 writel(0x2, IOMUXC_BASE_ADDR + 0x0344);
374 writel(0x5, IOMUXC_BASE_ADDR + 0x0810);
377 writel(0x2, IOMUXC_BASE_ADDR + 0x0360);
378 writel(0x180, IOMUXC_BASE_ADDR + 0x082C);
379 writel(0x1, IOMUXC_BASE_ADDR + 0x09CC);
382 writel(0x2, IOMUXC_BASE_ADDR + 0x0348);
383 writel(0x180, IOMUXC_BASE_ADDR + 0x0814);
384 writel(0x1, IOMUXC_BASE_ADDR + 0x09AC);
387 writel(0x2, IOMUXC_BASE_ADDR + 0x0354);
388 writel(0x180, IOMUXC_BASE_ADDR + 0x0820);
389 writel(0x1, IOMUXC_BASE_ADDR + 0x09B8);
392 writel(0x2, IOMUXC_BASE_ADDR + 0x0374);
393 writel(0x5, IOMUXC_BASE_ADDR + 0x0840);
396 writel(0x2, IOMUXC_BASE_ADDR + 0x0358);
397 writel(0x180, IOMUXC_BASE_ADDR + 0x0824);
398 writel(0x1, IOMUXC_BASE_ADDR + 0x09BC);
401 writel(0x2, IOMUXC_BASE_ADDR + 0x0378);
402 writel(0x5, IOMUXC_BASE_ADDR + 0x0844);
405 writel(0x2, IOMUXC_BASE_ADDR + 0x035C);
406 writel(0x180, IOMUXC_BASE_ADDR + 0x0828);
407 writel(0x1, IOMUXC_BASE_ADDR + 0x09C0);
410 writel(0x2, IOMUXC_BASE_ADDR + 0x037C);
411 writel(0x5, IOMUXC_BASE_ADDR + 0x0848);
413 reg = readl(GPIO3_BASE_ADDR + 0x0);
414 reg &= ~0x40; // Lower reset line
415 writel(reg, GPIO3_BASE_ADDR + 0x0);
417 reg = readl(GPIO3_BASE_ADDR + 0x4);
418 reg |= 0x40; // configure GPIO lines as output
419 writel(reg, GPIO3_BASE_ADDR + 0x4);
421 /* Reset the ethernet controller over GPIO */
422 writel(0x4, IOMUXC_BASE_ADDR + 0x02CC);
423 writel(0xC5, IOMUXC_BASE_ADDR + 0x078C);
427 reg = readl(GPIO3_BASE_ADDR + 0x0);
429 writel(reg, GPIO3_BASE_ADDR + 0x0);
432 static void mxc_nfc_iomux_setup(void)
434 writel(0x0, IOMUXC_BASE_ADDR + 0x108);
435 writel(0x0, IOMUXC_BASE_ADDR + 0x10C);
436 writel(0x0, IOMUXC_BASE_ADDR + 0x110);
437 writel(0x0, IOMUXC_BASE_ADDR + 0x114);
438 writel(0x0, IOMUXC_BASE_ADDR + 0x118);
439 writel(0x0, IOMUXC_BASE_ADDR + 0x11C);
440 writel(0x0, IOMUXC_BASE_ADDR + 0x120);
441 writel(0x0, IOMUXC_BASE_ADDR + 0x124);
442 writel(0x0, IOMUXC_BASE_ADDR + 0x128);
443 writel(0x0, IOMUXC_BASE_ADDR + 0x12C);
444 writel(0x0, IOMUXC_BASE_ADDR + 0x130);
445 writel(0x0, IOMUXC_BASE_ADDR + 0x134);
446 writel(0x0, IOMUXC_BASE_ADDR + 0x138);
447 writel(0x0, IOMUXC_BASE_ADDR + 0x13C);
448 writel(0x0, IOMUXC_BASE_ADDR + 0x140);
449 writel(0x0, IOMUXC_BASE_ADDR + 0x144);
450 writel(0x0, IOMUXC_BASE_ADDR + 0x148);
451 writel(0x0, IOMUXC_BASE_ADDR + 0x14C);
452 writel(0x0, IOMUXC_BASE_ADDR + 0x150);
453 writel(0x0, IOMUXC_BASE_ADDR + 0x154);
454 writel(0x0, IOMUXC_BASE_ADDR + 0x158);
455 writel(0x0, IOMUXC_BASE_ADDR + 0x15C);
456 writel(0x0, IOMUXC_BASE_ADDR + 0x160);
457 writel(0x0, IOMUXC_BASE_ADDR + 0x164);
458 writel(0x0, IOMUXC_BASE_ADDR + 0x168);
459 writel(0x0, IOMUXC_BASE_ADDR + 0x16C);
460 writel(0x0, IOMUXC_BASE_ADDR + 0x170);
461 writel(0x0, IOMUXC_BASE_ADDR + 0x174);
462 writel(0x0, IOMUXC_BASE_ADDR + 0x178);
463 writel(0x0, IOMUXC_BASE_ADDR + 0x17C);
464 writel(0x0, IOMUXC_BASE_ADDR + 0x180);
465 writel(0x0, IOMUXC_BASE_ADDR + 0x184);
466 writel(0x0, IOMUXC_BASE_ADDR + 0x188);
467 writel(0x0, IOMUXC_BASE_ADDR + 0x18C);
468 writel(0x0, IOMUXC_BASE_ADDR + 0x190);
471 #define REV_ATLAS_LITE_2_0 0x20
473 void setup_core_voltages(void)
475 struct mxc_i2c_request rq;
476 unsigned char buf[4];
478 if (i2c_init(I2C2_BASE_ADDR, 170000) == 0) {
484 if (((system_rev >> MAJOR_NUMBER_OFFSET) & 0xf) <= 0x2) {
485 /* Set core voltage to 1.1V */
488 buf[2] = (buf[2] & (~0x1F)) | 0x14;
491 /* Setup VCC (SW2) to 1.25 */
494 buf[2] = (buf[2] & (~0x1F)) | 0x1A;
497 /* Setup 1V2_DIG1 (SW3) to 1.25 */
500 buf[2] = (buf[2] & (~0x1F)) | 0x1A;
503 /* Raise the core frequency to 800MHz */
504 writel(0x0, CCM_BASE_ADDR + CLKCTL_CACRR);
507 /* Setup VCC (SW2) to 1.225 */
510 buf[2] = (buf[2] & (~0x1F)) | 0x19;
513 /* Setup 1V2_DIG1 (SW3) to 1.2 */
516 buf[2] = (buf[2] & (~0x1F)) | 0x18;
523 if (((buf[2] & 0x1F) < REV_ATLAS_LITE_2_0) || (((buf[1] >> 1) & 0x3) == 0)) {
524 /* Set switchers in PWM mode for Atlas 2.0 and lower */
525 /* Setup the switcher mode for SW1 & SW2*/
528 buf[2] = (buf[2] & (~0xF)) | 0x5;
529 buf[1] = (buf[1] & (~0x3C)) | 0x14;
532 /* Setup the switcher mode for SW3 & SW4*/
535 buf[2] = (buf[2] & (~0xF)) | 0x5;
536 buf[1] = (buf[1] & (~0xF)) | 0x5;
539 /* Set switchers in Auto in NORMAL mode & STANDBY mode for Atlas 2.0a */
540 /* Setup the switcher mode for SW1 & SW2*/
543 buf[2] = (buf[2] & (~0xF)) | 0x8;
544 buf[1] = (buf[1] & (~0x3C)) | 0x20;
547 /* Setup the switcher mode for SW3 & SW4*/
550 buf[2] = (buf[2] & (~0xF)) | 0x8;
551 buf[1] = (buf[1] & (~0xF)) | 0x8;
558 // Platform specific initialization
561 void plf_hardware_init(void)
563 unsigned long sw_rest_reg, weim_base;
565 setup_core_voltages();
567 writel(0, IOMUXC_BASE_ADDR + 0xF4);
568 weim_base = WEIM_BASE_ADDR + 0x78;
569 writel(0x00410089, weim_base + CSGCR1);
570 writel(0x00000002, weim_base + CSGCR2);
571 // RWSC=50, RADVA=2, RADVN=6, OEA=0, OEN=0, RCSA=0, RCSN=0
572 writel(0x32260000, weim_base + CSRCR1);
574 writel(0x00000000, weim_base + CSRCR2);
575 // WAL=0, WBED=1, WWSC=50, WADVA=2, WADVN=6, WEA=0, WEN=0, WCSA=0, WCSN=0
576 writel(0x72080F00, weim_base + CSWCR1);
577 cpld_base_addr = CS5_BASE_ADDR;
579 /* Reset interrupt status reg */
580 writew(0x1F, cpld_base_addr + PBC_INT_REST);
581 writew(0x00, cpld_base_addr + PBC_INT_REST);
582 writew(0xFFFF, cpld_base_addr + PBC_INT_MASK);
584 /* Reset the XUART and Ethernet controllers */
585 sw_rest_reg = readw(cpld_base_addr + PBC_SW_RESET);
587 writew(sw_rest_reg, cpld_base_addr + PBC_SW_RESET);
589 writew(sw_rest_reg, cpld_base_addr + PBC_SW_RESET);
593 writel(0x0, IOMUXC_BASE_ADDR + 0x228);
594 writel(0x1C5, IOMUXC_BASE_ADDR + 0x618);
596 writel(0x0, IOMUXC_BASE_ADDR + 0x22c);
597 writel(0x1C5, IOMUXC_BASE_ADDR + 0x61c);
599 writel(0x0, IOMUXC_BASE_ADDR + 0x230);
600 writel(0x1C4, IOMUXC_BASE_ADDR + 0x620);
602 writel(0x0, IOMUXC_BASE_ADDR + 0x234);
603 writel(0x1C4, IOMUXC_BASE_ADDR + 0x624);
604 // enable GPIO1_9 for CLKO and GPIO1_8 for CLKO2
605 writel(0x00000004, 0x73fa83E8);
606 writel(0x00000004, 0x73fa83Ec);
608 // enable ARM clock div by 8
609 writel(0x010900F0, CCM_BASE_ADDR + CLKCTL_CCOSR);
610 #ifdef MXCFLASH_SELECT_NAND
611 nfc_iomux_setup = (nfc_iomuxsetup_func_t*)mxc_nfc_iomux_setup;
615 spi_nor_init = (imx_spi_init_func_t *)imx_spi_init_v2_3;
616 spi_nor_xfer = (imx_spi_xfer_func_t *)imx_spi_xfer_v2_3;
620 void mxc_ipu_iomux_config(void)
622 // configure display data0~17 for Epson panel
623 CONFIG_PIN(IOMUXC_SW_MUX_CTL_PAD_DISP1_DAT0, IOMUX_PIN_SION_REGULAR|IOMUX_SW_MUX_CTL_ALT0);
624 CONFIG_PAD(IOMUXC_SW_PAD_CTL_PAD_DISP1_DAT0, 0x5);
625 CONFIG_PIN(IOMUXC_SW_MUX_CTL_PAD_DISP1_DAT1, IOMUX_PIN_SION_REGULAR|IOMUX_SW_MUX_CTL_ALT0);
626 CONFIG_PAD(IOMUXC_SW_PAD_CTL_PAD_DISP1_DAT1, 0x5);
627 CONFIG_PIN(IOMUXC_SW_MUX_CTL_PAD_DISP1_DAT2, IOMUX_PIN_SION_REGULAR|IOMUX_SW_MUX_CTL_ALT0);
628 CONFIG_PAD(IOMUXC_SW_PAD_CTL_PAD_DISP1_DAT2,0x5);
629 CONFIG_PIN(IOMUXC_SW_MUX_CTL_PAD_DISP1_DAT3, IOMUX_PIN_SION_REGULAR|IOMUX_SW_MUX_CTL_ALT0);
630 CONFIG_PAD(IOMUXC_SW_PAD_CTL_PAD_DISP1_DAT3, 0x5);
631 CONFIG_PIN(IOMUXC_SW_MUX_CTL_PAD_DISP1_DAT4, IOMUX_PIN_SION_REGULAR|IOMUX_SW_MUX_CTL_ALT0);
632 CONFIG_PAD(IOMUXC_SW_PAD_CTL_PAD_DISP1_DAT4, 0x5);
633 CONFIG_PIN(IOMUXC_SW_MUX_CTL_PAD_DISP1_DAT5, IOMUX_PIN_SION_REGULAR|IOMUX_SW_MUX_CTL_ALT0);
634 CONFIG_PAD(IOMUXC_SW_PAD_CTL_PAD_DISP1_DAT5, 0x5);
635 CONFIG_PIN(IOMUXC_SW_MUX_CTL_PAD_DISP1_DAT6, IOMUX_PIN_SION_REGULAR|IOMUX_SW_MUX_CTL_ALT0);
636 CONFIG_PAD(IOMUXC_SW_PAD_CTL_PAD_DISP1_DAT6, 0x5);
637 CONFIG_PIN(IOMUXC_SW_MUX_CTL_PAD_DISP1_DAT7, IOMUX_PIN_SION_REGULAR|IOMUX_SW_MUX_CTL_ALT0);
638 CONFIG_PAD(IOMUXC_SW_PAD_CTL_PAD_DISP1_DAT7, 0x5);
639 CONFIG_PIN(IOMUXC_SW_MUX_CTL_PAD_DISP1_DAT8, IOMUX_PIN_SION_REGULAR|IOMUX_SW_MUX_CTL_ALT0);
640 CONFIG_PAD(IOMUXC_SW_PAD_CTL_PAD_DISP1_DAT8, 0x5);
641 CONFIG_PIN(IOMUXC_SW_MUX_CTL_PAD_DISP1_DAT9, IOMUX_PIN_SION_REGULAR|IOMUX_SW_MUX_CTL_ALT0);
642 CONFIG_PAD(IOMUXC_SW_PAD_CTL_PAD_DISP1_DAT9, 0x5);
643 CONFIG_PIN(IOMUXC_SW_MUX_CTL_PAD_DISP1_DAT10, IOMUX_PIN_SION_REGULAR|IOMUX_SW_MUX_CTL_ALT0);
644 CONFIG_PAD(IOMUXC_SW_PAD_CTL_PAD_DISP1_DAT10, 0x5);
645 CONFIG_PAD(IOMUXC_SW_PAD_CTL_PAD_DISP1_DAT11, 0x5);
646 CONFIG_PIN(IOMUXC_SW_MUX_CTL_PAD_DISP1_DAT12, IOMUX_PIN_SION_REGULAR|IOMUX_SW_MUX_CTL_ALT0);
647 CONFIG_PAD(IOMUXC_SW_PAD_CTL_PAD_DISP1_DAT12, 0x5);
648 CONFIG_PIN(IOMUXC_SW_MUX_CTL_PAD_DISP1_DAT13, IOMUX_PIN_SION_REGULAR|IOMUX_SW_MUX_CTL_ALT0);
649 CONFIG_PAD(IOMUXC_SW_PAD_CTL_PAD_DISP1_DAT13, 0x5);
650 CONFIG_PIN(IOMUXC_SW_MUX_CTL_PAD_DISP1_DAT14, IOMUX_PIN_SION_REGULAR|IOMUX_SW_MUX_CTL_ALT0);
651 CONFIG_PAD(IOMUXC_SW_PAD_CTL_PAD_DISP1_DAT14, 0x5);
652 CONFIG_PIN(IOMUXC_SW_MUX_CTL_PAD_DISP1_DAT15, IOMUX_PIN_SION_REGULAR|IOMUX_SW_MUX_CTL_ALT0);
653 CONFIG_PAD(IOMUXC_SW_PAD_CTL_PAD_DISP1_DAT15, 0x5);
654 CONFIG_PIN(IOMUXC_SW_MUX_CTL_PAD_DISP1_DAT16, IOMUX_PIN_SION_REGULAR|IOMUX_SW_MUX_CTL_ALT0);
655 CONFIG_PAD(IOMUXC_SW_PAD_CTL_PAD_DISP1_DAT16, 0x5);
656 CONFIG_PIN(IOMUXC_SW_MUX_CTL_PAD_DISP1_DAT17, IOMUX_PIN_SION_REGULAR|IOMUX_SW_MUX_CTL_ALT0);
657 CONFIG_PAD(IOMUXC_SW_PAD_CTL_PAD_DISP1_DAT17, 0x5);
659 // DI1_PIN2 and DI1_PIN3, configured to be HSYNC and VSYNC of Epson LCD
660 CONFIG_PIN(IOMUXC_SW_MUX_CTL_PAD_DI1_PIN2, IOMUX_PIN_SION_REGULAR|IOMUX_SW_MUX_CTL_ALT0);
661 CONFIG_PIN(IOMUXC_SW_MUX_CTL_PAD_DI1_PIN3, IOMUX_PIN_SION_REGULAR|IOMUX_SW_MUX_CTL_ALT0);
664 // No IOMUX configuration required, as there is no IOMUXing for this pin
667 // No IOMUX configuration required, as there is no IOMUXing for this pin
669 // configure this pin to be the SER_DISP_CS
671 CONFIG_PIN(IOMUXC_SW_MUX_CTL_PAD_DI1_D1_CS, IOMUX_PIN_SION_REGULAR|IOMUX_SW_MUX_CTL_ALT4);
672 CONFIG_PIN(IOMUXC_SW_PAD_CTL_PAD_DI1_D1_CS,0x85);
674 // configure to be DISPB1_SER_RS
675 CONFIG_PIN(IOMUXC_SW_MUX_CTL_PAD_DI_GP1, IOMUX_PIN_SION_REGULAR|IOMUX_SW_MUX_CTL_ALT0);
676 CONFIG_PAD(IOMUXC_SW_PAD_CTL_PAD_DI_GP1, 0x85);
677 // configure to be SER_DISP1_CLK
678 CONFIG_PIN(IOMUXC_SW_MUX_CTL_PAD_DI_GP2, IOMUX_PIN_SION_REGULAR|IOMUX_SW_MUX_CTL_ALT0);
679 CONFIG_PAD(IOMUXC_SW_PAD_CTL_PAD_DI_GP2, 0x85);
680 // configure to be DISPB1_SER_DIO
681 CONFIG_PIN(IOMUXC_SW_MUX_CTL_PAD_DI_GP3, IOMUX_PIN_SION_REGULAR|IOMUX_SW_MUX_CTL_ALT0);
682 CONFIG_PAD(IOMUXC_SW_PAD_CTL_PAD_DI_GP3, 0xC5);
683 // configure to be DISPB1_SER_DIN
684 CONFIG_PIN(IOMUXC_SW_MUX_CTL_PAD_DI_GP4, IOMUX_PIN_SION_REGULAR|IOMUX_SW_MUX_CTL_ALT0);
685 CONFIG_PAD(IOMUXC_SW_PAD_CTL_PAD_DI_GP4, 0xC4);
687 CONFIG_PIN(IOMUXC_SW_MUX_CTL_PAD_DI1_D0_CS, IOMUX_PIN_SION_REGULAR|IOMUX_SW_MUX_CTL_ALT1);
688 CONFIG_PAD(IOMUXC_SW_PAD_CTL_PAD_DI1_D0_CS, 0x85);
690 CONFIG_PIN(IOMUXC_SW_MUX_CTL_PAD_DI1_PIN11, IOMUX_PIN_SION_REGULAR|IOMUX_SW_MUX_CTL_ALT1);
691 CONFIG_PAD(IOMUXC_SW_PAD_CTL_PAD_DI1_PIN11, 0x85);
693 CONFIG_PIN(IOMUXC_SW_MUX_CTL_PAD_DI1_PIN12, IOMUX_PIN_SION_REGULAR|IOMUX_SW_MUX_CTL_ALT1);
694 CONFIG_PAD(IOMUXC_SW_PAD_CTL_PAD_DI1_PIN12, 0x85);
696 CONFIG_PIN(IOMUXC_SW_MUX_CTL_PAD_DI1_PIN13, IOMUX_PIN_SION_REGULAR|IOMUX_SW_MUX_CTL_ALT1);
697 CONFIG_PAD(IOMUXC_SW_PAD_CTL_PAD_DI1_PIN13, 0x85);
701 void mxc_mmc_init(unsigned int base_address)
703 switch(base_address) {
704 case MMC_SDHC1_BASE_ADDR:
705 /* SD1 CMD, SION bit */
706 writel(0x10, IOMUXC_BASE_ADDR + 0x394);
707 /* Configure SW PAD */
709 writel(0xd5, IOMUXC_BASE_ADDR + 0x79C);
711 writel(0xd5, IOMUXC_BASE_ADDR + 0x7A0);
713 writel(0xd5, IOMUXC_BASE_ADDR + 0x7A4);
715 writel(0xd5, IOMUXC_BASE_ADDR + 0x7A8);
717 writel(0xd5, IOMUXC_BASE_ADDR + 0x7AC);
719 writel(0xd5, IOMUXC_BASE_ADDR + 0x7B0);
726 void increase_core_voltage(bool i)
728 unsigned char buf[4];
729 struct mxc_i2c_request rq;
731 if (i2c_init(I2C2_BASE_ADDR, 170000) == 0) {
741 buf[2] = (buf[2] & (~0x1F)) | 0x17; //1.175
742 //buf[2] = (buf[2] & (~0x1F)) | 0x18; //1.2
744 buf[2] = (buf[2] & (~0x1F)) | 0x12;
748 diag_printf("Cannot increase core voltage, failed to initialize I2C2\n");
752 void io_cfg_spi(struct imx_spi_dev *dev)
757 case CSPI1_BASE_ADDR:
759 case CSPI2_BASE_ADDR:
760 // Select mux mode: ALT2 mux port: MOSI of instance: ecspi2
761 writel(0x2, IOMUXC_BASE_ADDR + 0x154);
762 writel(0x105, IOMUXC_BASE_ADDR + 0x53C);
764 // Select mux mode: ALT2 mux port: MISO of instance: ecspi2.
765 writel(0x2, IOMUXC_BASE_ADDR + 0x128);
766 writel(0x105, IOMUXC_BASE_ADDR + 0x504);
768 // de-select SS0 of instance: ecspi1.
769 writel(0x2, IOMUXC_BASE_ADDR + 0x298);
770 writel(0x85, IOMUXC_BASE_ADDR + 0x698);
771 // Select mux mode: ALT2 mux port: SS1 of instance: ecspi2.
772 writel(0x2, IOMUXC_BASE_ADDR + 0x160);
773 writel(0x105, IOMUXC_BASE_ADDR + 0x548);
775 // Select mux mode: ALT3 mux port: GPIO mode
776 writel(0x3, IOMUXC_BASE_ADDR + 0x150);
777 writel(0xE0, IOMUXC_BASE_ADDR + 0x538);
778 reg = readl(GPIO3_BASE_ADDR + 0x0);
779 reg |= 0x1000000; // write a 1
780 writel(reg, GPIO3_BASE_ADDR + 0x0);
781 reg = readl(GPIO3_BASE_ADDR + 0x4);
782 reg |= 0x1000000; // configure GPIO lines as output
783 writel(reg, GPIO3_BASE_ADDR + 0x4);
785 // Select mux mode: ALT2 mux port: SCLK of instance: ecspi2.
786 writel(0x2, IOMUXC_BASE_ADDR + 0x124);
787 writel(0x105, IOMUXC_BASE_ADDR + 0x500);
795 #include CYGHWR_MEMORY_LAYOUT_H
797 typedef void code_fun(void);
799 void board_program_new_stack(void *func)
801 register CYG_ADDRESS stack_ptr asm("sp");
802 register CYG_ADDRESS old_stack asm("r4");
803 register code_fun *new_func asm("r0");
804 old_stack = stack_ptr;
805 stack_ptr = CYGMEM_REGION_ram + CYGMEM_REGION_ram_SIZE - sizeof(CYG_ADDRESS);
806 new_func = (code_fun*)func;
808 stack_ptr = old_stack;