1 From abf0610e5250ed69cc542e19f19c8a6812f4914e Mon Sep 17 00:00:00 2001
2 From: Sammy <r62914@freescale.com>
3 Date: Mon, 13 Jul 2009 15:05:16 +0800
4 Subject: [PATCH] ENGR00114178 Support MMC/SD boot and enable dhcp in uboot on MX25
6 1. Support MMC/SD boot in uboot, however, it is disabled default and
7 user needs to enable manually by changing mx25_3stack.h;
8 2. Enable dhcp for network.
10 Signed-off-by: Sammy He <r62914@freescale.com>
12 board/freescale/mx25_3stack/mx25_3stack.c | 85 +++++++++++
13 include/asm-arm/arch-mx25/mmc.h | 16 ++
14 include/asm-arm/arch-mx25/sdhc.h | 218 +++++++++++++++++++++++++++++
15 include/configs/mx25_3stack.h | 38 +++++-
16 4 files changed, 355 insertions(+), 2 deletions(-)
18 diff --git a/board/freescale/mx25_3stack/mx25_3stack.c b/board/freescale/mx25_3stack/mx25_3stack.c
19 index 22559b6..b33eaa1 100644
20 --- a/board/freescale/mx25_3stack/mx25_3stack.c
21 +++ b/board/freescale/mx25_3stack/mx25_3stack.c
23 DECLARE_GLOBAL_DATA_PTR;
25 static u32 system_rev;
26 +volatile u32 *esdhc_base_pointer;
28 u32 get_board_rev(void)
30 @@ -53,6 +54,11 @@ static inline void setup_soc_rev(void)
31 system_rev = 0x25000 + (reg & 0xFF);
34 +inline int is_soc_rev(int rev)
36 + return (system_rev & 0xFF) - rev;
41 gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
42 @@ -61,6 +67,85 @@ int dram_init(void)
46 +#ifdef CONFIG_FSL_MMC
50 + u32 interface_esdhc = 0, val = 0;
52 + interface_esdhc = (readl(CCM_RCSR) & (0x00300000)) >> 20;
54 + switch (interface_esdhc) {
56 + esdhc_base_pointer = (volatile u32 *)MMC_SDHC1_BASE;
58 + writel(0x10, IOMUXC_BASE + 0x190); /* SD1_CMD */
59 + writel(0x10, IOMUXC_BASE + 0x194); /* SD1_CLK */
60 + writel(0x00, IOMUXC_BASE + 0x198); /* SD1_DATA0 */
61 + writel(0x00, IOMUXC_BASE + 0x19c); /* SD1_DATA1 */
62 + writel(0x00, IOMUXC_BASE + 0x1a0); /* SD1_DATA2 */
63 + writel(0x00, IOMUXC_BASE + 0x1a4); /* SD1_DATA3 */
64 + writel(0x06, IOMUXC_BASE + 0x094); /* D12 (SD1_DATA4) */
65 + writel(0x06, IOMUXC_BASE + 0x090); /* D13 (SD1_DATA5) */
66 + writel(0x06, IOMUXC_BASE + 0x08c); /* D14 (SD1_DATA6) */
67 + writel(0x06, IOMUXC_BASE + 0x088); /* D15 (SD1_DATA7) */
68 + writel(0x05, IOMUXC_BASE + 0x010); /* A14 (SD1_WP) */
69 + writel(0x05, IOMUXC_BASE + 0x014); /* A15 (SD1_DET) */
72 + writel(0xD1, IOMUXC_BASE + 0x388); /* SD1_CMD */
73 + writel(0xD1, IOMUXC_BASE + 0x38c); /* SD1_CLK */
74 + writel(0xD1, IOMUXC_BASE + 0x390); /* SD1_DATA0 */
75 + writel(0xD1, IOMUXC_BASE + 0x394); /* SD1_DATA1 */
76 + writel(0xD1, IOMUXC_BASE + 0x398); /* SD1_DATA2 */
77 + writel(0xD1, IOMUXC_BASE + 0x39c); /* SD1_DATA3 */
78 + writel(0xD1, IOMUXC_BASE + 0x28c); /* D12 (SD1_DATA4) */
79 + writel(0xD1, IOMUXC_BASE + 0x288); /* D13 (SD1_DATA5) */
80 + writel(0xD1, IOMUXC_BASE + 0x284); /* D14 (SD1_DATA6) */
81 + writel(0xD1, IOMUXC_BASE + 0x280); /* D15 (SD1_DATA7) */
82 + writel(0xD1, IOMUXC_BASE + 0x230); /* A14 (SD1_WP) */
83 + writel(0xD1, IOMUXC_BASE + 0x234); /* A15 (SD1_DET) */
86 + * Set write protect and card detect gpio as inputs
87 + * A14 (SD1_WP) and A15 (SD1_DET)
89 + val = ~(3 << 0) & readl(GPIO1_BASE + GPIO_GDIR);
90 + writel(val, GPIO1_BASE + GPIO_GDIR);
93 + esdhc_base_pointer = (volatile u32 *)MMC_SDHC2_BASE;
95 + writel(0x16, IOMUXC_BASE + 0x0e8); /* LD8 (SD1_CMD) */
96 + writel(0x16, IOMUXC_BASE + 0x0ec); /* LD9 (SD1_CLK) */
97 + writel(0x06, IOMUXC_BASE + 0x0f0); /* LD10 (SD1_DATA0) */
98 + writel(0x06, IOMUXC_BASE + 0x0f4); /* LD11 (SD1_DATA1) */
99 + writel(0x06, IOMUXC_BASE + 0x0f8); /* LD12 (SD1_DATA2) */
100 + writel(0x06, IOMUXC_BASE + 0x0fc); /* LD13 (SD1_DATA3) */
101 + writel(0x02, IOMUXC_BASE + 0x120); /* CSI_D2 (SD1_DATA4) */
102 + writel(0x02, IOMUXC_BASE + 0x124); /* CSI_D3 (SD1_DATA5) */
103 + writel(0x02, IOMUXC_BASE + 0x128); /* CSI_D4 (SD1_DATA6) */
104 + writel(0x02, IOMUXC_BASE + 0x12c); /* CSI_D5 (SD1_DATA7) */
107 + writel(0xD1, IOMUXC_BASE + 0x2e0); /* LD8 (SD1_CMD) */
108 + writel(0xD1, IOMUXC_BASE + 0x2e4); /* LD9 (SD1_CLK) */
109 + writel(0xD1, IOMUXC_BASE + 0x2e8); /* LD10 (SD1_DATA0) */
110 + writel(0xD1, IOMUXC_BASE + 0x2ec); /* LD11 (SD1_DATA1) */
111 + writel(0xD1, IOMUXC_BASE + 0x2f0); /* LD12 (SD1_DATA2) */
112 + writel(0xD1, IOMUXC_BASE + 0x2f4); /* LD13 (SD1_DATA3) */
113 + writel(0xD1, IOMUXC_BASE + 0x318); /* CSI_D2 (SD1_DATA4) */
114 + writel(0xD1, IOMUXC_BASE + 0x31c); /* CSI_D3 (SD1_DATA5) */
115 + writel(0xD1, IOMUXC_BASE + 0x320); /* CSI_D4 (SD1_DATA6) */
116 + writel(0xD1, IOMUXC_BASE + 0x324); /* CSI_D5 (SD1_DATA7) */
128 diff --git a/include/asm-arm/arch-mx25/mmc.h b/include/asm-arm/arch-mx25/mmc.h
130 index 0000000..5f12934
132 +++ b/include/asm-arm/arch-mx25/mmc.h
135 + * (C) Copyright 2008-2009 Freescale Semiconductor, Inc.
137 + * linux/drivers/mmc/mmc.h
139 + * Author: Vladimir Shebordaev, Igor Oblakov
140 + * Copyright: MontaVista Software Inc.
142 + * This program is free software; you can redistribute it and/or modify
143 + * it under the terms of the GNU General Public License version 2 as
144 + * published by the Free Software Foundation.
146 +#ifndef __MMC_MX25_3STACK_H__
147 +#define __MMC_MX25_3STACK_H__
149 +#endif /* __MMC_MX51_3STACK_H__ */
150 diff --git a/include/asm-arm/arch-mx25/sdhc.h b/include/asm-arm/arch-mx25/sdhc.h
152 index 0000000..5514ad4
154 +++ b/include/asm-arm/arch-mx25/sdhc.h
157 + * Copyright 2008-2009 Freescale Semiconductor, Inc.
159 + * See file CREDITS for list of people who contributed to this
162 + * This program is free software; you can redistribute it and/or
163 + * modify it under the terms of the GNU General Public License as
164 + * published by the Free Software Foundation; either version 2 of
165 + * the License, or (at your option) any later version.
167 + * This program is distributed in the hope that it will be useful,
168 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
169 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
170 + * GNU General Public License for more details.
172 + * You should have received a copy of the GNU General Public License
173 + * along with this program; if not, write to the Free Software
174 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
175 + * MA 02111-1307 USA
181 +#include <linux/types.h>
183 +#define ESDHC_SOFTWARE_RESET_DATA ((u32)0x04000000)
184 +#define ESDHC_SOFTWARE_RESET_CMD ((u32)0x02000000)
185 +#define ESDHC_SOFTWARE_RESET ((u32)0x01000000)
186 +#define ESDHC_CMD_INHIBIT 0x00000003
187 +#define ESDHC_SYSCTL_INITA ((u32)0x08000000)
188 +#define ESDHC_LITTLE_ENDIAN_MODE ((u32)0x00000020)
189 +#define ESDHC_HW_BIG_ENDIAN_MODE ((u32)0x00000010)
190 +#define ESDHC_BIG_ENDIAN_MODE ((u32)0x00000000)
191 +#define ESDHC_ONE_BIT_SUPPORT ((u32)0x00000000)
192 +#define ESDHC_FOUR_BIT_SUPPORT ((u32)0x00000002)
193 +#define ESDHC_EIGHT_BIT_SUPPORT ((u32)0x00000004)
194 +#define ESDHC_CLOCK_ENABLE 0x00000007
195 +#define ESDHC_FREQ_MASK 0xffff0007
196 +#define ESDHC_SYSCTL_FREQ_MASK ((u32)0x000FFFF0)
197 +#define ESDHC_SYSCTL_IDENT_FREQ_TO1 ((u32)0x0000800e)
198 +#define ESDHC_SYSCTL_OPERT_FREQ_TO1 ((u32)0x00000200)
199 +#define ESDHC_SYSCTL_IDENT_FREQ_TO2 ((u32)0x00002040)
200 +#define ESDHC_SYSCTL_OPERT_FREQ_TO2 ((u32)0x00000050)
201 +#define ESDHC_INTERRUPT_ENABLE ((u32)0x007f0133)
202 +#define ESDHC_CLEAR_INTERRUPT ((u32)0x117f01ff)
203 +#define ESDHC_SYSCTL_DTOCV_VAL ((u32)0x000E0000)
204 +#define ESDHC_IRQSTATEN_DTOESEN ((u32)0x00100000)
205 +#define ESDHC_ENDIAN_MODE_MASK ((u32)0x00000030)
206 +#define ESDHC_SYSCTRL_RSTC ((u32)0x02000000)
207 +#define ESDHC_SYSCTRL_RSTD ((u32)0x04000000)
208 +#define ESDHC_CONFIG_BLOCK 0x00010200
209 +#define ESDHC_OPER_TIMEOUT (96 * 100)
210 +#define ESDHC_ACMD41_TIMEOUT (32000)
211 +#define ESDHC_CMD1_TIMEOUT (32000)
212 +#define ESDHC_BLOCK_SHIFT (16)
213 +#define ESDHC_CARD_INIT_TIMEOUT (64)
215 +#define ESDHC_SYSCTL_SDCLKEN_MASK ((u32)0x00000008)
216 +#define ESDHC_PRSSTAT_SDSTB_BIT ((u32)0x00000008)
217 +#define ESDHC_SYSCTL_INPUT_CLOCK_MASK ((u32)0x00000007)
219 +#define ESDHC_BUS_WIDTH_MASK ((u32)0x00000006)
220 +#define ESDHC_DATA_TRANSFER_SHIFT (4)
221 +#define ESDHC_RESPONSE_FORMAT_SHIFT (16)
222 +#define ESDHC_DATA_PRESENT_SHIFT (21)
223 +#define ESDHC_CRC_CHECK_SHIFT (19)
224 +#define ESDHC_CMD_INDEX_CHECK_SHIFT (20)
225 +#define ESDHC_CMD_INDEX_SHIFT (24)
226 +#define ESDHC_BLOCK_COUNT_ENABLE_SHIFT (1)
227 +#define ESDHC_MULTI_SINGLE_BLOCK_SELECT_SHIFT (5)
228 +#define BLK_LEN (512)
229 +#define ESDHC_READ_WATER_MARK_LEVEL_BL_4 ((u32)0x00000001)
230 +#define ESDHC_READ_WATER_MARK_LEVEL_BL_8 ((u32)0x00000002)
231 +#define ESDHC_READ_WATER_MARK_LEVEL_BL_16 ((u32)0x00000004)
232 +#define ESDHC_READ_WATER_MARK_LEVEL_BL_64 ((u32)0x00000010)
233 +#define ESDHC_READ_WATER_MARK_LEVEL_BL_512 ((u32)0x00000080)
235 +#define ESDHC_WRITE_WATER_MARK_LEVEL_BL_4 ((u32)0x00010000)
236 +#define ESDHC_WRITE_WATER_MARK_LEVEL_BL_8 ((u32)0x00020000)
237 +#define ESDHC_WRITE_WATER_MARK_LEVEL_BL_16 ((u32)0x00040000)
238 +#define ESDHC_WRITE_WATER_MARK_LEVEL_BL_64 ((u32)0x00100000)
239 +#define ESDHC_WRITE_WATER_MARK_LEVEL_BL_512 ((u32)0x00800000)
241 +#define WRITE_READ_WATER_MARK_LEVEL 0x00800080
243 +/* Present State register bit masks */
244 +#define ESDHC_PRESENT_STATE_CIHB ((u32)0x00000001)
245 +#define ESDHC_PRESENT_STATE_CDIHB ((u32)0x00000002)
247 +#define ESDHC_FIFO_SIZE (128)
249 +#define ESDHC_STATUS_END_CMD_RESP_MSK ((u32)0x00000001)
250 +#define ESDHC_STATUS_END_CMD_RESP_TIME_MSK ((u32)0x000F0001)
251 +#define ESDHC_STATUS_TIME_OUT_RESP_MSK ((u32)0x00010000)
252 +#define ESDHC_STATUS_RESP_CRC_ERR_MSK ((u32)0x00020000)
253 +#define ESDHC_STATUS_RESP_CMD_INDEX_ERR_MSK ((u32)0x00080000)
254 +#define ESDHC_STATUS_BUF_READ_RDY_MSK ((u32)0x00000020)
255 +#define ESDHC_STATUS_BUF_WRITE_RDY_MSK ((u32)0x00000010)
256 +#define ESDHC_STATUS_TRANSFER_COMPLETE_MSK ((u32)0x00000002)
257 +#define ESDHC_STATUS_DATA_RW_MSK ((u32)0x00700002)
258 +#define ESDHC_STATUS_TRANSFER_COMPLETE_MSK ((u32)0x00000002)
259 +#define ESDHC_STATUS_TIME_OUT_READ_MASK ((u32)0x00100000)
260 +#define ESDHC_STATUS_READ_CRC_ERR_MSK ((u32)0x00200000)
261 +#define ESDHC_STATUS_RESP_CMD_END_BIT_ERR_MSK ((u32)0x00040000)
262 +#define ESDHC_STATUS_RW_DATA_END_BIT_ERR_MSK ((u32)0x00400000)
264 +#define ESDHC_STATUS_TIME_OUT_READ (3200)
265 +#define ESDHC_READ_DATA_TIME_OUT (3200)
266 +#define ESDHC_WRITE_DATA_TIME_OUT (8000)
268 +#define ESDHC_CONFIG_BLOCK_512 ((u32)0x00000200)
269 +#define ESDHC_CONFIG_BLOCK_64 ((u32)0x00000040)
270 +#define ESDHC_CONFIG_BLOCK_8 ((u32)0x00000008)
271 +#define ESDHC_CONFIG_BLOCK_4 ((u32)0x00000004)
273 +#define ESDHC_MAX_BLOCK_COUNT ((u32)0x0000ffff)
290 + RESPONSE_48_CHECK_BUSY
291 +} response_format_t;
297 +} data_present_select;
302 +} crc_check_enable, cmdindex_check_enable, block_count_enable;
307 +} multi_single_block_select;
312 + xfer_type_t data_transfer;
313 + response_format_t response_format;
314 + data_present_select data_present;
315 + crc_check_enable crc_check;
316 + cmdindex_check_enable cmdindex_check;
317 + block_count_enable block_count_enable_check;
318 + multi_single_block_select multi_single_block;
322 + response_format_t format;
331 + HALF_WORD_BIG_ENDIAN,
336 + OPERATING_FREQ = 20000, /* in kHz */
337 + IDENTIFICATION_FREQ = 400 /* in kHz */
340 +enum esdhc_data_status {
341 + ESDHC_DATA_ERR = 3,
345 +enum esdhc_int_cntr_val {
346 + ESDHC_INT_CNTR_END_CD_RESP = 0x4,
347 + ESDHC_INT_CNTR_BUF_WR_RDY = 0x8
350 +enum esdhc_reset_status {
351 + ESDHC_WRONG_RESET = 0,
352 + ESDHC_CORRECT_RESET = 1
360 +extern u32 interface_reset(void);
361 +extern void interface_configure_clock(sdhc_freq_t);
362 +extern void interface_read_response(esdhc_resp_t *);
363 +extern u32 interface_send_cmd_wait_resp(esdhc_cmd_t *);
364 +extern u32 interface_data_read(u32 *, u32);
365 +extern void interface_config_block_info(u32, u32, u32);
366 +extern u32 interface_data_write(u32 *, u32);
367 +extern void interface_clear_interrupt(void);
368 +extern void interface_initialization_active(void);
369 +extern void esdhc_set_cmd_pullup(esdhc_pullup_t pull_up);
370 +extern void esdhc_soft_reset(u32 mask);
371 +extern u32 interface_set_bus_width(u32 bus_width);
372 +/*================================================================================================*/
373 +#endif /* ESDHC_H */
374 diff --git a/include/configs/mx25_3stack.h b/include/configs/mx25_3stack.h
375 index 05b3500..5e343ea 100644
376 --- a/include/configs/mx25_3stack.h
377 +++ b/include/configs/mx25_3stack.h
379 /* #define CONFIG_CMD_DATE */
380 #define CONFIG_CMD_NAND
386 +#define CONFIG_FSL_MMC
388 +#define CONFIG_CMD_MMC
389 +#define CONFIG_DOS_PARTITION
390 +#define CONFIG_CMD_FAT
391 +#define CONFIG_MMC_BASE 0x0 */
393 /* Disabled due to compilation errors in cmd_bootm.c (IMLS seems to require
394 * that CONFIG_NO_FLASH is undefined).
397 #define CONFIG_DRIVER_SMC911X_BASE CS5_BASE*/
399 /*#define CONFIG_HAS_ETH1*/
400 +#define CONFIG_CMD_NET
401 +#define CONFIG_CMD_DHCP
402 #define CONFIG_NET_MULTI 1
403 #define CONFIG_MXC_FEC
405 @@ -174,12 +187,33 @@
407 #define PHYS_SDRAM_1_SIZE (64 * 1024 * 1024)
410 +/* Monitor at beginning of flash */
411 +#if defined(CONFIG_FSL_SF)
412 + #define CONFIG_FSL_ENV_IN_SF
413 +#elif defined(CONFIG_FSL_MMC)
414 + #define CONFIG_FSL_ENV_IN_MMC
415 +#elif defined(CONFIG_CMD_NAND)
416 + #define CONFIG_FSL_ENV_IN_NAND
419 /*-----------------------------------------------------------------------
420 * FLASH and environment organization
422 +#if defined(CONFIG_FSL_ENV_IN_NAND)
423 + #define CONFIG_ENV_IS_IN_NAND 1
424 + #define CONFIG_ENV_OFFSET 0x80000
425 +#elif defined(CONFIG_FSL_ENV_IN_MMC)
426 + #define CONFIG_ENV_IS_IN_MMC 1
427 + #define CONFIG_ENV_OFFSET 0x100000
428 +#elif defined(CONFIG_FSL_ENV_IN_SF)
429 + #define CONFIG_ENV_IS_IN_SPI_FLASH 1
430 + #define CONFIG_ENV_SPI_CS 1
431 + #define CONFIG_ENV_OFFSET 0x100000
433 + #define CONFIG_ENV_IS_NOWHERE 1
436 -#define CONFIG_ENV_IS_IN_NAND 1
437 -#define CONFIG_ENV_OFFSET 0x80000 /* 2nd block */
438 #define CONFIG_ENV_SECT_SIZE (256 * 1024)
439 #define CONFIG_ENV_SIZE CONFIG_ENV_SECT_SIZE