EMMC使用参考
1. 概述¶
以SSD268G黑色开发板为例,可以通过拨码设置启动方式,如下图,当拨码第5、4位分别设置位B、A时即为EMMC启动。第3位设置EMMC数据为4bit或8bit。
以SSD261Q蓝色开发板为例,也是通过拨码设置启动方式,如下图,此开发板使用的是emmc0启动,只支持4bit模式,因此要将拨码全部拨到B端(板上的丝印有错误)
我们发布的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
,如下图:
或者直接使用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进行烧录