This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

eMMC support

I am working on a project which will use AM3784, and we want to use eMMC chip as main non-volatile memory. To evaluate eMMC with AM3784, I am trying to use a MMCplus card (Transcend MMCplus 256MB) with TI 814x EVM board by plugging MMC/SD interafce. But u-boot cannot detect the card, however after Linux boot-up from NFS, Linux can detect it and there is no problem on mounting/reading/writing. Following are more details about my test.

 1) u-boot and Linux are from EXSDK-5.05.02.00 (latest package for 814x evm).

 2) EVM board is boot up from NOR chip in u-boot boot-up stage. So that I can use u-boot command “mmcinfo”.

 3) When using SD card from EVM board package, there is no issue on card detection. But when using the MMCplus card, I got error generated from  u-boot/drivers/mmc/omap_hsmmc.c  line:253:

------------------------------

        if ((mmc_stat & IE_CTO) != 0)

                return TIMEOUT;

------------------------------

Can anyone help to give some inside about the failure? How to make the MMCplus working in u-boot on 814x EVM board?

 Regards,

Yong Zou

  • Hi Yong Zou,

    When you are in the u-boot prompt, before "mmcinfo", please try with the below command:

    TI8148_EVM#mmc rescan 0

    Regards,
    Pavel

  • Hi Pavel,

    Thanks a lot for the help.

    I tried the command "mmc rescan 0", I got same failure: Card did not respond to voltage select!

    Regards,

    Yong

  • Yong Zou,

    Please also note that MMCplus requires 8-bit data bus, while MMC requires 4-bit data bus (the default in u-boot is 4-bit):

    http://www.hardwarebook.info/MMCplus

    http://www.hardwarebook.info/MMC

    In the case where you can detect and work with MMCplus (in the linux kernel), could you please provide me the values of the below registers:

    MMC1.MMCHS_CON[5]DW8 (phys address 0x481D812C)

    MMC1.MMCHS_HCTL[1] DTW (phys address 0x481D8228)

    PINCNTL1  (phys address 0x48140800)

    PINCNTL2  (phys address 0x48140804)

    PINCNTL3  (phys address 0x48140808)

    PINCNTL4  (phys address 0x4814080C)

    PINCNTL5  (phys address 0x48140810)

    PINCNTL6  (phys address 0x48140814)

    PINCNTL9  (phys address 0x48140820)

    PINCNTL10  (phys address 0x48140824)

    PINCNTL11  (phys address 0x48140828)

    PINCNTL12  (phys address 0x4814082C)

    PINCNTL13  (phys address 0x48140830)

    Regarding u-boot, when you boot from non-MMC (UART, NOR, NAND, etc), the default mode is 1-bit. When you boot from MMC, the default mode is 4-bit. So, please also provide me these registers values in the non-working case (in u-boot).

    Regards,
    Pavel

  • Hi Pavel,

    Here is the values in those registers.

    MMC1.MMCHS_CON[5]DW8 (phys address 0x481D812C)

    u-boot: 0x00000600

    kernel:  0x00000700

    MMC1.MMCHS_HCTL[1] DTW (phys address 0x481D8228)

    u-boot: 0x00000d00

    kernel:  0x00000d02

    PINCNTL1  (phys address 0x48140800)

    u-boot: 0x00060001

    kernel:  0x00060001

    PINCNTL2  (phys address 0x48140804)

    u-boot: 0x000e0001

    kernel:  0x000e0001

    PINCNTL3  (phys address 0x48140808)

    u-boot: 0x000e0001

    kernel:  0x000e0001

    PINCNTL4  (phys address 0x4814080C)

    u-boot: 0x000e0001

    kernel:  0x000e0001

    PINCNTL5  (phys address 0x48140810)

    u-boot: 0x000e0001

    kernel:  0x000e0001

    PINCNTL6  (phys address 0x48140814)

    u-boot: 0x000e0001

    kernel:  0x000e0001

    PINCNTL9  (phys address 0x48140820)

    u-boot: 0x000e0001

    kernel:  0x000e0001

    PINCNTL10  (phys address 0x48140824)

    u-boot: 0x000e0001

    kernel:  0x000e0001

    PINCNTL11  (phys address 0x48140828)

    u-boot: 0x000e0001

    kernel:  0x000e0001

    PINCNTL12  (phys address 0x4814082C)

    u-boot: 0x000e0001

    kernel: 

    PINCNTL13  (phys address 0x48140830)

    u-boot: 0x000e0001

    kernel:  0x000e0001

    Regards,

    Yong

  • Yong,

    YONG ZOU said:

    MMC1.MMCHS_HCTL[1] DTW (phys address 0x481D8228)

    u-boot: 0x00000d00

    kernel:  0x00000d02

    Looks like your MMCplus card works in 4-bit mode in the linux kernel, while you have 1-bit mode in the u-boot. Can you try manually switch from 1-bit to 4-bit mode in the u-boot?

    This is what I have when boot the uboot from UART (non-MMC boot):

    U-Boot 2010.06 (Jul 24 2014 - 14:49:25)

    TI8148-GP rev 2.1

    ARM clk: 600MHz
    DDR clk: 400MHz

    I2C:   ready
    DRAM:  2 GiB
    NAND:  HW ECC BCH8 Selected
    256 MiB
    MMC:   OMAP SD/MMC: 0

    The MMC/SD controller is initialized, as I have the "MMC:   OMAP SD/MMC: 0" message. Is it the same at your side?

    At this point I have no MMC card inserted in the DM814x EVM, and I have bit DTW = 0 (1-bit data width), and the below message:

    TI8148_EVM#mmcinfo
    Card did not respond to voltage select!
    Device: OMAP SD/MMC
    Manufacturer ID: 0
    OEM: 0
    Name: Tran Speed: 0
    Rd Block Len: 0
    MMC version 0.0
    High Capacity: No
    Capacity: 0
    Bus Width: 1-bit

    Then, when I insert the SD card (ADATA micro SDHC, 4GB, plugged in micro SD Adapter), the SD card is autodetected:

    TI8148_EVM#mmcinfo
    Device: OMAP SD/MMC
    Manufacturer ID: 3
    OEM: 5344
    Name: SU04G
    Tran Speed: 25000000
    Rd Block Len: 512
    SD version 2.0
    High Capacity: Yes
    Capacity: 3965190144
    Bus Width: 4-bit

    And bit DTW is auto set to 1 (4-bit data width).

    By some reason, your MMCplus card can not be autodetected by the u-boot. So, can you try setting bit DTW to 1 manually, then insert the MMCplus card, will that make any difference?

    TI8148_EVM#mw 0x481D8228 0xD02 1

    BR
    Pavel

  • Other thing we can try is to hardcode the u-boot for 4-bit mode:

    ti-ezsdk_dm814x-evm_5_05_02_00/board-support/u-boot-2010.06-psp04.04.00.01/drivers/mmc/omap_hsmmc.c

    static void mmc_set_ios(struct mmc *mmc)
    {

        hsmmc_t *mmc_base = (hsmmc_t *)mmc->priv;
        unsigned int dsor = 0;
        ulong start;

        mmc->bus_width = 4;

        /* configue bus width */
        switch (mmc->bus_width) {

    .......

    }

    Regards,
    Pavel