1
From 70ec2b9f6873f6a6bd7e7d97421e62b0b3312966 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