EMMC使用参考


1. 概述

以SSD268G黑色开发板为例,可以通过拨码设置启动方式,如下图,当拨码第5、4位分别设置位B、A时即为EMMC启动。第3位设置EMMC数据为4bit或8bit。

pic

以SSD261Q蓝色开发板为例,也是通过拨码设置启动方式,如下图,此开发板使用的是emmc0启动,只支持4bit模式,因此要将拨码全部拨到B端(板上的丝印有错误)

pic

我们发布的SDK包中三个config(dispcam_m6_emmc_*默认使用的是4bit模式,不同的开发板需使用不同的config编译,请根据环境搭建文档中的表格选择正确的配置文件。


2. 切换为8bit模式

用户需使用8bit模式的话需修改uboot、kernel的配置以及projcet目录下的升级包构建脚本。根据所使用的config选择正常的配置文件进行修改,以dispcam_m6_emmc.glibc-9.1.0-ext4.016a.512x512.bga2.demo_defconfig为例

2.1 uboot修改

  • 修改总线位宽

    diff --git a/drivers/mstar/emmc/inc/config/eMMC_mercury6_uboot.h b/drivers/mstar/emmc/inc/config/eMMC_mercury6_uboot.h
    --- a/drivers/mstar/emmc/inc/config/eMMC_mercury6_uboot.h
    +++ b/drivers/mstar/emmc/inc/config/eMMC_mercury6_uboot.h
    -#define EMMC_WORKING_BUS_CFG                4 //bus=1:4:8
    +#define EMMC_WORKING_BUS_CFG                8 //bus=1:4:8
    
  • 重新编译uboot并替换到project下的同名文件

    开发板使用的是emmc1,默认配置为mercury6_emmc1_defconfig

    make mercury6_emmc1_defconfig
    make clean
    make
    cp u-boot.xz.img.bin ../project/board/m6/boot/emmc/uboot/016A/
    

2.2 kernel修改

  • 修改dts中emmc的bus-width及slotnum

    diff --git a/arch/arm/boot/dts/mercury6.dtsi b/arch/arm/boot/dts/mercury6.dtsi
    --- a/arch/arm/boot/dts/mercury6.dtsi
    +++ b/arch/arm/boot/dts/mercury6.dtsi
    emmc {
        compatible = "sstar_mci";
        //clocks =<&CLK_sd>, <&CLK_ecc>;
        clocks =<&CLK_sd>, <&CLK_sdio>;
        interrupts =  <GIC_SPI INT_IRQ_SD IRQ_TYPE_LEVEL_HIGH>;
    -   bus-width = <4>;
    +   bus-width = <8>;
        status = "ok";
    };
    
    sdmmc {
        compatible = "sstar,sdmmc";
    -   slotnum = <2>;
    +   slotnum = <1>;
    
  • 注释掉padmux中有使用到emmc1引脚的配置

    diff --git a/arch/arm/boot/dts/mercury6-ssc016a-s01a-dispcam-padmux.dtsi b/arch/arm/boot/dts/mercury6-ssc016a-s01a-dispcam-padmux.dtsi
    --- a/arch/arm/boot/dts/mercury6-ssc016a-s01a-dispcam-padmux.dtsi
    +++ b/arch/arm/boot/dts/mercury6-ssc016a-s01a-dispcam-padmux.dtsi
    -#if 1
    +#if 0
        //SDMMC1
        <PAD_SD1_D1              PINMUX_FOR_SD1_MODE_1           MDRV_PUSE_SDIO1_D1>,
        <PAD_SD1_D0              PINMUX_FOR_SD1_MODE_1           MDRV_PUSE_SDIO1_D0>,
        <PAD_SD1_CLK             PINMUX_FOR_SD1_MODE_1           MDRV_PUSE_SDIO1_CLK>,
        <PAD_SD1_CMD             PINMUX_FOR_SD1_MODE_1           MDRV_PUSE_SDIO1_CMD>,
        <PAD_SD1_D3              PINMUX_FOR_SD1_MODE_1           MDRV_PUSE_SDIO1_D3>,
        <PAD_SD1_D2              PINMUX_FOR_SD1_MODE_1           MDRV_PUSE_SDIO1_D2>,
        <PAD_SD1_GPIO0           PINMUX_FOR_GPIO_MODE            MDRV_PUSE_SDIO1_PWR>,
        <PAD_SD1_CDZ             PINMUX_FOR_SD1_CDZ_MODE_1       MDRV_PUSE_SDIO1_CDZ>,
    #endif
    

2.3 project构建脚本修改

在升级及启动时会通过mmc bootbus设置emmc的总线位宽,命令格式为:

mmc bootbus [dev] [boot_bus_width] [reset_boot_bus_width] [boot_mode]

第二个参数boot_bus_width即为总线位宽,1为4bit,2为8bit。

  • 修改project下的image/configs/m6/script_emmc.mk文件,如下:

    diff --git a/image/configs/m6/script_emmc.mk b/image/configs/m6/script_emmc.mk
    --- a/image/configs/m6/script_emmc.mk
    +++ b/image/configs/m6/script_emmc.mk
    - @echo mmc bootbus 0 1 0 0 >> $(SCRIPTDIR)/[[$(patsubst %_emmc__script,%,$@)
    + @echo mmc bootbus 0 2 0 0 >> $(SCRIPTDIR)/[[$(patsubst %_emmc__script,%,$@)
    
    - echo mmc bootbus 0 1 0 0 >> $(SCRIPTDIR)/set_config; \
    + echo mmc bootbus 0 2 0 0 >> $(SCRIPTDIR)/set_config; \
    
  • 构建升级包

    make dispcam_m6_emmc.glibc-9.1.0-ext4.016a.512x512.bga2.demo_defconfig
    make image
    

3. 使用EMMC0启动

若是用户自己设计的硬件使用EMMC0启动的话需要修改uboot及kernel的配置

3.1 uboot修改

设置CONFIG_MS_USE_EMMC0=y,如下图:

pic

或者直接使用mercury6_emmc_defconfig重编并release uboot到project目录


3.2 kernel修改

  • 修改defconfig文件,设置CONFIG_SELECT_EMMC0=y 如前面提到的dispcam_m6_emmc.glibc-9.1.0-ext4.016a.512x512.bga2.demo_defconfig配置对应的kernel配置为arch/arm/configs/mercury6_ssc016a_s01a_emmc_dispcam_defconfig,修改如下:

    diff --git a/arch/arm/configs/mercury6_ssc016a_s01a_emmc_dispcam_defconfig b/arch/arm/configs/mercury6_ssc016a_s01a_emmc_dispcam_defconfig
    --- a/arch/arm/configs/mercury6_ssc016a_s01a_emmc_dispcam_defconfig
    +++ b/arch/arm/configs/mercury6_ssc016a_s01a_emmc_dispcam_defconfig
    -# CONFIG_SELECT_EMMC0 is not set
    +CONFIG_SELECT_EMMC0=y
    
  • 注释掉padmux中有使用到emmc0引脚的配置,与前面“切换为8bit模式”中的“kernel修改”类似,请参考前文的相关内容。


4. 升级

请参考《开发环境搭建参考》下的4.5. 对EMMC进行烧录