Hello, Weidong!
I use eSDHC1 for booting.
My configuration for booting from SD:
#define CONFIG_CMD_MMC
#ifdef CONFIG_CMD_MMC
#define CONFIG_MMC 1
#define CONFIG_GENERIC_MMC
#define CONFIG_IMX_MMC
#define CONFIG_SYS_FSL_ESDHC_NUM 1
#define CONFIG_SYS_FSL_ESDHC_ADDR 0
#define CONFIG_SYS_MMC_ENV_DEV 0
#define CONFIG_DOS_PARTITION 1
#define CONFIG_CMD_FAT 1
#define CONFIG_CMD_EXT2 1
/* detect whether ESDHC1 or ESDHC3 is boot device */
#define CONFIG_DYNAMIC_MMC_DEVNO
#define CONFIG_EMMC_DDR_PORT_DETECT
#define CONFIG_EMMC_DDR_MODE
/* port 1 (ESDHC3) is 8 bit */
#define CONFIG_MMC_8BIT_PORTS 0x2
#endif
#ifdef CONFIG_CMD_MMC
struct fsl_esdhc_cfg esdhc_cfg[2] = {
{MMC_SDHC1_BASE_ADDR, 1, 1},
{MMC_SDHC3_BASE_ADDR, 1, 1},
};
#ifdef CONFIG_DYNAMIC_MMC_DEVNO
int get_mmc_env_devno(void)
{
uint soc_sbmr = readl(SRC_BASE_ADDR + 0x4);
return (soc_sbmr & 0x00300000) ? 1 : 0;
}
#endif
#ifdef CONFIG_EMMC_DDR_PORT_DETECT
int detect_mmc_emmc_ddr_port(struct fsl_esdhc_cfg *cfg)
{
return (MMC_SDHC3_BASE_ADDR == cfg->esdhc_base) ? 1 : 0;
}
#endif
int esdhc_gpio_init(bd_t *bis)
{
s32 status = 0;
u32 index = 0;
u32 cfg = (PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE |
PAD_CTL_PUE_PULL | PAD_CTL_ODE_OPENDRAIN_NONE |
PAD_CTL_DRV_HIGH);
for (index = 0; index < CONFIG_SYS_FSL_ESDHC_NUM; ++index) {
switch (index) {
case 0:
#if 0
/*
*/
/* ESDHC1 CD */
mxc_request_iomux(MX53_PIN_GPIO_1, IOMUX_CONFIG_ALT6);
mxc_iomux_set_pad(MX53_PIN_GPIO_1,
cfg | PAD_CTL_360K_PD);
/* ESDHC1 WP */
mxc_request_iomux(MX53_PIN_DI0_PIN4, IOMUX_CONFIG_ALT3);
mxc_iomux_set_pad(MX53_PIN_DI0_PIN4,
cfg | PAD_CTL_360K_PD |
PAD_CTL_SRE_FAST);
#endif
/* ESDHC1 CLK */
mxc_request_iomux(MX53_PIN_SD1_CLK, IOMUX_CONFIG_ALT0);
mxc_iomux_set_pad(MX53_PIN_SD1_CLK,
cfg | PAD_CTL_100K_PU);
/* ESDHC1 CMD */
mxc_request_iomux(MX53_PIN_SD1_CMD, IOMUX_CONFIG_ALT0);
mxc_iomux_set_pad(MX53_PIN_SD1_CMD,
cfg | PAD_CTL_100K_PU);
/* ESDHC1 DAT0 */
mxc_request_iomux(MX53_PIN_SD1_DATA0,
IOMUX_CONFIG_ALT0);
mxc_iomux_set_pad(MX53_PIN_SD1_DATA0,
cfg | PAD_CTL_100K_PU);
/* ESDHC1 DAT1 */
mxc_request_iomux(MX53_PIN_SD1_DATA1,
IOMUX_CONFIG_ALT0);
mxc_iomux_set_pad(MX53_PIN_SD1_DATA1,
cfg | PAD_CTL_100K_PU);
/* ESDHC1 DAT2 */
mxc_request_iomux(MX53_PIN_SD1_DATA2,
IOMUX_CONFIG_ALT0);
mxc_iomux_set_pad(MX53_PIN_SD1_DATA2,
cfg | PAD_CTL_100K_PU);
/* ESDHC1 DAT3 */
mxc_request_iomux(MX53_PIN_SD1_DATA3,
IOMUX_CONFIG_ALT0);
mxc_iomux_set_pad(MX53_PIN_SD1_DATA3,
cfg | PAD_CTL_100K_PU);
/* ESDHC1 LCTL */
mxc_request_iomux(MX53_PIN_GPIO_18, IOMUX_CONFIG_ALT6);
mxc_iomux_set_pad(MX53_PIN_GPIO_18,
cfg | PAD_CTL_360K_PD);
break;
default:
printf("Warning: you configured more ESDHC controller"
"(%d) as supported by the board(2)\n",
CONFIG_SYS_FSL_ESDHC_NUM);
return status;
}
status |= fsl_esdhc_initialize(bis, &esdhc_cfg[index]);
}
return status;
}
int board_mmc_init(bd_t *bis)
{
if (!esdhc_gpio_init(bis))
return 0;
else
return -1;
}
#endif
And configuration for booting from NAND:
#define CONFIG_CMD_NAND
#if defined(CONFIG_CMD_NAND)
#define CONFIG_MXC_NAND
#define CONFIG_SYS_NAND_MAX_CHIPS 8
#define CONFIG_SYS_MAX_NAND_DEVICE 1
#define CONFIG_SYS_NAND_BASE 0x40000000
#define CONFIG_NAND_FW_16BIT 1 /* 1: 16bit 0: 8bit */
#define CONFIG_CMD_FLASH
#endif
#if defined(CONFIG_MXC_NAND)
void setup_nand(void)
{
u32 cfg = (PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_PULL |
PAD_CTL_100K_PU | PAD_CTL_ODE_OPENDRAIN_NONE |
PAD_CTL_DRV_HIGH);
clk_config(0, 34, NFC_CLK);
/* EMI NAND_WEIM_DA[0] */
mxc_request_iomux(MX53_PIN_EIM_DA0, IOMUX_CONFIG_ALT0);
mxc_iomux_set_pad(MX53_PIN_EIM_DA0, cfg);
/* EMI NAND_WEIM_DA[1] */
mxc_request_iomux(MX53_PIN_EIM_DA1, IOMUX_CONFIG_ALT0);
mxc_iomux_set_pad(MX53_PIN_EIM_DA1, cfg);
/* EMI NAND_WEIM_DA[2] */
mxc_request_iomux(MX53_PIN_EIM_DA2, IOMUX_CONFIG_ALT0);
mxc_iomux_set_pad(MX53_PIN_EIM_DA2, cfg);
/* EMI NAND_WEIM_DA[3] */
mxc_request_iomux(MX53_PIN_EIM_DA3, IOMUX_CONFIG_ALT0);
mxc_iomux_set_pad(MX53_PIN_EIM_DA3, cfg);
/* EMI NAND_WEIM_DA[4] */
mxc_request_iomux(MX53_PIN_EIM_DA4, IOMUX_CONFIG_ALT0);
mxc_iomux_set_pad(MX53_PIN_EIM_DA4, cfg);
/* EMI NAND_WEIM_DA[5] */
mxc_request_iomux(MX53_PIN_EIM_DA5, IOMUX_CONFIG_ALT0);
mxc_iomux_set_pad(MX53_PIN_EIM_DA5, cfg);
/* EMI NAND_WEIM_DA[6] */
mxc_request_iomux(MX53_PIN_EIM_DA6, IOMUX_CONFIG_ALT0);
mxc_iomux_set_pad(MX53_PIN_EIM_DA6, cfg);
/* EMI NAND_WEIM_DA[7] */
mxc_request_iomux(MX53_PIN_EIM_DA7, IOMUX_CONFIG_ALT0);
mxc_iomux_set_pad(MX53_PIN_EIM_DA7, cfg);
/* EMI NAND_WEIM_DA[8] */
mxc_request_iomux(MX53_PIN_EIM_DA8, IOMUX_CONFIG_ALT0);
mxc_iomux_set_pad(MX53_PIN_EIM_DA8, cfg);
/* EMI NAND_WEIM_DA[9] */
mxc_request_iomux(MX53_PIN_EIM_DA9, IOMUX_CONFIG_ALT0);
mxc_iomux_set_pad(MX53_PIN_EIM_DA9, cfg);
/* EMI NAND_WEIM_DA[10] */
mxc_request_iomux(MX53_PIN_EIM_DA10, IOMUX_CONFIG_ALT0);
mxc_iomux_set_pad(MX53_PIN_EIM_DA10, cfg);
/* EMI NAND_WEIM_DA[11] */
mxc_request_iomux(MX53_PIN_EIM_DA11, IOMUX_CONFIG_ALT0);
mxc_iomux_set_pad(MX53_PIN_EIM_DA11, cfg);
/* EMI NAND_WEIM_DA[12] */
mxc_request_iomux(MX53_PIN_EIM_DA12, IOMUX_CONFIG_ALT0);
mxc_iomux_set_pad(MX53_PIN_EIM_DA12, cfg);
/* EMI NAND_WEIM_DA[13] */
mxc_request_iomux(MX53_PIN_EIM_DA13, IOMUX_CONFIG_ALT0);
mxc_iomux_set_pad(MX53_PIN_EIM_DA13, cfg);
/* EMI NAND_WEIM_DA[14] */
mxc_request_iomux(MX53_PIN_EIM_DA14, IOMUX_CONFIG_ALT0);
mxc_iomux_set_pad(MX53_PIN_EIM_DA14, cfg);
/* EMI NAND_WEIM_DA[15] */
mxc_request_iomux(MX53_PIN_EIM_DA15, IOMUX_CONFIG_ALT0);
mxc_iomux_set_pad(MX53_PIN_EIM_DA15, cfg);
/* EMI NANDF_ALE */
mxc_request_iomux(MX53_PIN_NANDF_ALE, IOMUX_CONFIG_ALT0);
mxc_iomux_set_pad(MX53_PIN_NANDF_ALE, cfg | PAD_CTL_HYS_ENABLE);
/* EMI NANDF_CLE */
mxc_request_iomux(MX53_PIN_NANDF_CLE, IOMUX_CONFIG_ALT0);
mxc_iomux_set_pad(MX53_PIN_NANDF_CLE, cfg | PAD_CTL_HYS_ENABLE);
/* EMI NANDF_CS[0] */
mxc_request_iomux(MX53_PIN_NANDF_CS0, IOMUX_CONFIG_ALT0);
mxc_iomux_set_pad(MX53_PIN_NANDF_CS0, cfg | PAD_CTL_HYS_ENABLE);
/* EMI NANDF_RB[0] */
mxc_request_iomux(MX53_PIN_NANDF_RB0, IOMUX_CONFIG_ALT0);
mxc_iomux_set_pad(MX53_PIN_NANDF_RB0, cfg | PAD_CTL_HYS_ENABLE);
/* EMI NANDF_RB_B */
mxc_request_iomux(MX53_PIN_NANDF_RE_B, IOMUX_CONFIG_ALT0);
mxc_iomux_set_pad(MX53_PIN_NANDF_RE_B, cfg | PAD_CTL_HYS_ENABLE);
/* EMI NANDF_WE_B */
mxc_request_iomux(MX53_PIN_NANDF_WE_B, IOMUX_CONFIG_ALT0);
mxc_iomux_set_pad(MX53_PIN_NANDF_WE_B, cfg | PAD_CTL_HYS_ENABLE);
/* EMI NANDF_WP_B */
mxc_request_iomux(MX53_PIN_NANDF_WP_B, IOMUX_CONFIG_ALT0);
mxc_iomux_set_pad(MX53_PIN_NANDF_WP_B, cfg | PAD_CTL_HYS_ENABLE);
}
void setup_nfc(void)
{
volatile unsigned int reg = 0;
reg = readl(NFC_BASE_ADDR + 0x24);
reg &= ~(0x3 << 0);
reg |= (0x1 << 0);
writel(reg, NFC_BASE_ADDR + 0x24);
reg = readl(NFC_BASE_ADDR + 0x28);
reg &= ~((0x7 << 12) | (0x1 << 3));
writel(reg, NFC_BASE_ADDR + 0x28);
}
#endif
Sorry for big post.
>