IMX6 u-boot v2017 boot from MMC mmc_init: -110 error

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

IMX6 u-boot v2017 boot from MMC mmc_init: -110 error

Jump to solution
4,486 Views
david_schmidt
Contributor II

Hello community,

I have a problem regarding booting from MMC on my custom IMX6Dual board, using U-Boot version branch imx_v2017.03_4.9.51_imx8_beta2.

On most of my boards the boot process works. I can select my mmc dev 1 and get the following trace log:

boot_mmc_good_log - Pastebin.com 

switch to partitions #0, OK
mmc1(part 0) is current device

But on some of the boards, selecting mmc dev 1 fails with the following trace logs:

boot_mmc_bad_log - Pastebin.com 

mmc_init: -110, time 128

This is the code that fails in drivers/mmc/mmc.c in function static int mmc_startup(struct mmc *mmc):

/* Put the Card in Identify Mode */
cmd.cmdidx = mmc_host_is_spi(mmc) ? MMC_CMD_SEND_CID :
MMC_CMD_ALL_SEND_CID; /* cmd not supported in spi */
cmd.resp_type = MMC_RSP_R2;
cmd.cmdarg = 0;

do {
     err = mmc_send_cmd(mmc, &cmd, NULL);
} while (err && retries-- > 0);

if (err)
    return err;

This problem did not occur on my boards with the U-Boot v2014 version.

How can I resolve this issue?

Tags (2)
0 Kudos
Reply
1 Solution
3,348 Views
david_schmidt
Contributor II

So I found the issue that caused the init_error.

In drivers/mmc/mmc.c in function static int mmc_send_op_cond(struct mmc *mmc):

changing the OCR busy flag evaluation from 

if (mmc->ocr & OCR_BUSY)
            break;

to

if (!(mmc->ocr & OCR_BUSY))
            break;

and the MMC is initialized properly. I honestly have no idea why this flag is assumed to be inverted.

Thanks anyway for the help!

View solution in original post

0 Kudos
Reply
8 Replies
3,349 Views
david_schmidt
Contributor II

So I found the issue that caused the init_error.

In drivers/mmc/mmc.c in function static int mmc_send_op_cond(struct mmc *mmc):

changing the OCR busy flag evaluation from 

if (mmc->ocr & OCR_BUSY)
            break;

to

if (!(mmc->ocr & OCR_BUSY))
            break;

and the MMC is initialized properly. I honestly have no idea why this flag is assumed to be inverted.

Thanks anyway for the help!

0 Kudos
Reply
3,348 Views
david_schmidt
Contributor II

Hi Igor,

thank you for the response.

Unfortunately I get the same error with the imx_v2017.03_4.9.88 branch.

How can I tweak the MMC driver?

0 Kudos
Reply
3,348 Views
igorpadykov
NXP Employee
NXP Employee

Hi David

one can check

https://community.nxp.com/thread/332110 

~igor

0 Kudos
Reply
3,348 Views
david_schmidt
Contributor II

Hi Igor,

thank you for the tip.

Sadly, increasing the driver strength of the MMC pins by changing:

#define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP |            \
    PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm |         \
    PAD_CTL_SRE_FAST | PAD_CTL_HYS)

to 

#define USDHC_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE | \
PAD_CTL_PUS_22K_UP | PAD_CTL_SPEED_LOW | \
PAD_CTL_DSE_120ohm | PAD_CTL_SRE_FAST | PAD_CTL_HYS)

did not help either. I still get the mmc_init error.

The strange thing is, with the version 2014 of u-boot, I don't get this error accessing MMC.

On some boards, the first selection of my mmc dev 1 works, but the second selection of mmc dev 1 fails with the init error.

Is there anything else I could try?

0 Kudos
Reply
3,348 Views
david_schmidt
Contributor II

Hi Igor,

can you help me what other parts you mean? Most other solutions seem to be related to the linux kernel, but because the MMC device is not found, I can't boot into kernel.

I know the DDR settings and the hardware are not the issue, because everything worked with u-boot v2014 and kernel 3.14.

Porting to new u-boot now and the problem appeared. 

The MMC is soldered directy to the board.

0 Kudos
Reply
3,348 Views
igorpadykov
NXP Employee
NXP Employee

Hi David

different emmc parts may have different drive strengths, so you can try

with any other available emmc. i.MX drive strength may be adjusted in linux dts file,

for example:

        pinctrl_usdhc2: usdhc2grp {
            fsl,pins = <
                MX6QDL_PAD_SD2_CMD__SD2_CMD        0x17059

during boot, please check sect.Table 8-14. USDHC boot eFUSE descriptions

i.MX6DQ Reference Manual
https://www.nxp.com/docs/en/reference-manual/IMX6DQRM.pdf

BOOT_CFG2[0]  Override pad settings 1 - Use PAD_SETTINGS values

Best regards
igor

0 Kudos
Reply
3,348 Views
igorpadykov
NXP Employee
NXP Employee

Hi David

one can try with other emmc parts as in the case

eMMC 8GB to 4GB - crash on linux (yocto) boot 

Best regards
igor

0 Kudos
Reply
3,348 Views
igorpadykov
NXP Employee
NXP Employee

Hi David

in general one try to tweak driver strength of i.mx, emmc signals, however

imx_v2017.03_4.9.51_imx8_beta2 was not tested with i.MX6DQ, recommended to use imx_v2017.03_4.9.88

uboot-imx - i.MX U-Boot 

link below shows which software versions should be used for each i.mx family

i.MX Software|NXP 

Best regards
igor
-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------

0 Kudos
Reply