We have a custom 6ulz based board that was built with the 6ull EVK as reference. We are able to load u-boot onto it using uuu in Serial download mode but not able to load the demo OS from the SD2 slot.
On the EVK, we noticed that when we put the board in (Serial Downloader SW602 set to 10) mode and load a u-boot image using uuu tool, it loads u-boot onto memory and then that proceeds to start booting the kernel from the SD card no matter what boot mode we select on SW601 (we tried the SD mode 0010 as well as any other configuration).
When we tried to do the same on our board, it does not work and outputs the following:
Are we supposed to add the SD2 snippet onto mx6ullevk.c file? We added the following code on there hoping that would initialize the SD2 slot. It was a snippet from the mx6ul board file but we did not enable the EMMC rework part of the conditional statement and just had the usdhc2_pads, usdhc2_cd_pad and dat3 apd defined and called them with iomux_v3_setup_multiple_pads() fx under board_mmc_getcd() and board_mmc_init() functions:
static iomux_v3_cfg_t const usdhc2_pads[] = {
MX6_PAD_NAND_RE_B__USDHC2_CLK | MUX_PAD_CTRL(USDHC_PAD_CTRL),
MX6_PAD_NAND_WE_B__USDHC2_CMD | MUX_PAD_CTRL(USDHC_PAD_CTRL),
MX6_PAD_NAND_DATA00__USDHC2_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
MX6_PAD_NAND_DATA01__USDHC2_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
MX6_PAD_NAND_DATA02__USDHC2_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
MX6_PAD_NAND_DATA03__USDHC2_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
};
/*
* The evk board uses DAT3 to detect CD card plugin,
* in u-boot we mux the pin to GPIO when doing board_mmc_getcd.
*/
static iomux_v3_cfg_t const usdhc2_cd_pad =
MX6_PAD_NAND_DATA03__GPIO4_IO05 | MUX_PAD_CTRL(USDHC_DAT3_CD_PAD_CTRL);
static iomux_v3_cfg_t const usdhc2_dat3_pad =
MX6_PAD_NAND_DATA03__USDHC2_DATA3 |
MUX_PAD_CTRL(USDHC_DAT3_CD_PAD_CTRL);
#ifdef CONFIG_FSL_ESDHC
static struct fsl_esdhc_cfg usdhc_cfg[2] = {
{USDHC1_BASE_ADDR, 0, 4},
#if defined(CONFIG_MX6UL_14X14_EVK_EMMC_REWORK)
{USDHC2_BASE_ADDR, 0, 8},
#else
{USDHC2_BASE_ADDR, 0, 4},
#endif
};
#define USDHC1_CD_GPIO IMX_GPIO_NR(1, 19)
#define USDHC1_PWR_GPIO IMX_GPIO_NR(1, 9)
#define USDHC2_CD_GPIO IMX_GPIO_NR(4, 5)
#define USDHC2_PWR_GPIO IMX_GPIO_NR(4, 10)
int board_mmc_getcd(struct mmc *mmc)
{
struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
int ret = 0;
switch (cfg->esdhc_base)
{
case USDHC1_BASE_ADDR:
ret = !gpio_get_value(USDHC1_CD_GPIO);
break;
case USDHC2_BASE_ADDR:
#if defined(CONFIG_MX6UL_14X14_EVK_EMMC_REWORK)
ret = 1;
#else
imx_iomux_v3_setup_pad(usdhc2_cd_pad);
gpio_direction_input(USDHC2_CD_GPIO);
/*
* Since it is the DAT3 pin, this pin is pulled to
* low voltage if no card
*/
ret = gpio_get_value(USDHC2_CD_GPIO);
imx_iomux_v3_setup_pad(usdhc2_dat3_pad);
#endif
break;
}
return ret;
}
int board_mmc_init(bd_t *bis)
{
#ifdef CONFIG_SPL_BUILD
#if defined(CONFIG_MX6UL_14X14_EVK_EMMC_REWORK)
imx_iomux_v3_setup_multiple_pads(usdhc2_emmc_pads,
ARRAY_SIZE(usdhc2_emmc_pads));
#else
imx_iomux_v3_setup_multiple_pads(usdhc2_pads, ARRAY_SIZE(usdhc2_pads));
#endif
gpio_direction_output(USDHC2_PWR_GPIO, 0);
udelay(500);
gpio_direction_output(USDHC2_PWR_GPIO, 1);
usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
return fsl_esdhc_initialize(bis, &usdhc_cfg[1]);
#else
int i, ret;
/*
* According to the board_mmc_init() the following map is done:
* (U-Boot device node) (Physical Port)
* mmc0 USDHC1
* mmc1 USDHC2
*/
for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++)
{
switch (i)
{
case 0:
// imx_iomux_v3_setup_multiple_pads(
// usdhc1_pads, ARRAY_SIZE(usdhc1_pads));
// gpio_direction_input(USDHC1_CD_GPIO);
// usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
// gpio_direction_output(USDHC1_PWR_GPIO, 0);
udelay(500);
// gpio_direction_output(USDHC1_PWR_GPIO, 1);
break;
case 1:
#if defined(CONFIG_MX6UL_14X14_EVK_EMMC_REWORK)
imx_iomux_v3_setup_multiple_pads(
usdhc2_emmc_pads, ARRAY_SIZE(usdhc2_emmc_pads));
#else
imx_iomux_v3_setup_multiple_pads(
usdhc2_pads, ARRAY_SIZE(usdhc2_pads));
#endif
gpio_direction_output(USDHC2_PWR_GPIO, 0);
udelay(500);
gpio_direction_output(USDHC2_PWR_GPIO, 1);
usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
break;
default:
printf("Warning: you configured more USDHC controllers (%d) than supported by the board\n", i + 1);
return -EINVAL;
}
ret = fsl_esdhc_initialize(bis, &usdhc_cfg[i]);
if (ret)
{
printf("Warning: failed to initialize mmc dev %d\n", i);
return ret;
}
}
#endif
return 0;
}
#endif
Any help in clarifying how to get the SD2 slot to be recognized for booting OS would be greatly appreciated.