IMX6 EMMC、SD卡启动引脚配置及uboot修改为SD2启动
開發(fā)環(huán)境
平臺:imx6dl
內(nèi)核:linux-4.1.15
uboot:2014
問題描述
在IMX6中SD卡啟動(dòng)通常都是用SD3系列的引腳去作為SD卡槽的引腳,如下圖。
總有些意外,比如這次的這塊電路板,就是用的SD2系列引腳作為SD卡的卡槽。如下圖
這就導(dǎo)致了按照之前的撥碼開關(guān)去啟動(dòng),完全沒有串口打印信息,就相當(dāng)于SD卡啟動(dòng)失敗,CPU無法找到SD卡中的uboot加載到內(nèi)存中啟動(dòng)。這就不得不去看IMX6的芯片手冊中的啟動(dòng)設(shè)置那些內(nèi)容了。
相關(guān)配置
接下來挑著重點(diǎn)來看手冊,首先是定位到如下圖的位置,這是BOOT_CFGX對應(yīng)的引腳。
本次的重點(diǎn)在最后一個(gè)圖中的BOOT_CFG2[4:3]這一行的配置,原來是是USDHC-3是作為SD3啟動(dòng)的,但是現(xiàn)在需要SD2啟動(dòng),則需要配置成USDHC-2,也就是01。由上述引腳對應(yīng)表可以得出EIM_DA11(BOOT_CFG[3]),EIM_DA12(BOOT_CFG[4]),再直白點(diǎn)就是EIM_DA11配成高電平,EIM_DA12配成低電平。
修改uboot為SD2啟動(dòng)
如果當(dāng)上面的配置修改好后,按理說SD卡啟動(dòng)就會(huì)有uboot打印信息,有可能卡在檢測不到SD2,然后啟動(dòng)不起來。
打印類似的串口信息:
通過打印信息去uboot源碼中找到調(diào)用的函數(shù),定位到common/board_r.c
int initr_mmc(void) {puts("MMC: ");mmc_initialize(gd->bd);return 0; }mmc_initialize(),定位到driver/mmc/mmc.c
int mmc_initialize(bd_t *bis) {INIT_LIST_HEAD (&mmc_devices);cur_dev_num = 0;if (board_mmc_init(bis) < 0)cpu_mmc_init(bis);#ifndef CONFIG_SPL_BUILDprint_mmc_devices(','); #endifdo_preinit();return 0; }int mmc_start_init(struct mmc *mmc) {int err;/* we pretend there's no card when init is NULL */if (mmc_getcd(mmc) == 0 || mmc->cfg->ops->init == NULL) {mmc->has_init = 0; #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)printf("MMC: no card present\n"); #endifreturn NO_CARD_ERR;}//......省略if (err == TIMEOUT) {err = mmc_send_op_cond(mmc);if (err && err != IN_PROGRESS) { #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)printf("Card did not respond to voltage select!\n"); #endifreturn UNUSABLE_ERR;}}//......省略 }追蹤board_mmc_init()函數(shù),board_mmc_getcd()函數(shù)在board/freescale/mx6sabresd/mx6sabresd.c文件上。
int board_mmc_init(bd_t *bis) {s32 status = 0;int i;/** According to the board_mmc_init() the following map is done:* (U-boot device node) (Physical Port)* mmc0 SD2* mmc1 SD3* mmc2 eMMC*/for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) {switch (i) {case 0:imx_iomux_v3_setup_multiple_pads(usdhc2_pads, ARRAY_SIZE(usdhc2_pads));gpio_direction_input(USDHC2_CD_GPIO);usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);break;case 1:imx_iomux_v3_setup_multiple_pads(usdhc3_pads, ARRAY_SIZE(usdhc3_pads));gpio_direction_input(USDHC3_CD_GPIO);usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);break;case 2:imx_iomux_v3_setup_multiple_pads(usdhc4_pads, ARRAY_SIZE(usdhc4_pads));usdhc_cfg[2].sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK);break;default:printf("Warning: you configured more USDHC controllers""(%d) then supported by the board (%d)\n",i + 1, CONFIG_SYS_FSL_USDHC_NUM);return status;}status |= fsl_esdhc_initialize(bis, &usdhc_cfg[i]);}return status; }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 USDHC2_BASE_ADDR:ret = 1;//ret = !gpio_get_value(USDHC2_CD_GPIO);break;case USDHC3_BASE_ADDR:ret = !gpio_get_value(USDHC3_CD_GPIO);break;case USDHC4_BASE_ADDR:ret = 1; /* eMMC/uSDHC4 is always present */break;}return ret; }為什么檢測不到SD卡尼?有很大可能是因?yàn)閎oard_mmc_getcd獲取不到正確的CD引腳,導(dǎo)致了return返回值為0,打印出了“MMC: no card present”。
解決辦法:把ret = !gpio_get_value(USDHC2_CD_GPIO);屏蔽了或者#define USDHC2_CD_GPIO IMX_GPIO_NR(7, 13)設(shè)置一個(gè)正確的CD腳。我本次使用了前者。完成了這一步,就大功告成了。
總結(jié)
以上是生活随笔為你收集整理的IMX6 EMMC、SD卡启动引脚配置及uboot修改为SD2启动的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MQ Cannot convert f
- 下一篇: kodi android 卡顿,分享n1