EMMC应用指南

简介

  • 该应用指南基于solution软件版本,主要内容为单emmc的使用、以emmc作为启动教程;该文档适用于sdk得示例与solution应用

单emmc使用教程

  • 单emmc使用方式为,外部挂一个flash或者芯片有一个内置得flash用来存放或者运行code代码,然后外部的emmc只是一个单纯的存储作用。

  • 适用于58系列、52A系列(内置了一个norflash)、56系列外挂了一个nor/nandflash使用sd2接口来挂emmc芯片。

  • 硬件板子适用于mod566(sdio-tf)接口采用sd2,驱动IP为drv_sdio;mod587接口采用sd1,驱动IP为drv_sdhci;EVB567、EVB587。

  • 注:以下教程以mod 566为例,硬件使用sd1接口,驱动IP为sdhci。

确认pinmux配置

  • 请确认emmc接口是否连接到芯片手册上的sd接口。

  • sd接口的pinmux配置请按照如下参考进行配置。

../../_images/emmc_1.png
  • 上电配置接口如下,请在对应的芯片平台的bsp_power.c文件里面添加如下函数:

../../_images/emmc_27.png
  • 上电的调用在对应的芯片平台的bsp_init.c(没有该文件的在bsp_io.c里面)文件的里面:

../../_images/emmc_28.png

excel表配置

  • 由于当前是只是将emmc作为外部存储使用,所以将code以及root分区放在内部nor flash或者外挂nor flash上。基于此excel的配置如下:

  • 设置emmc的大小、blk对齐大小。

../../_images/emmc_5.png
  • 配置emmc的文件系统分区以及目录

../../_images/emmc_6.png

更多的配置请参考“FLASH分区应用笔记”

启动log

  • emmc初始化。

../../_images/emmc_7.png
  • emmc的文件系统挂载。

../../_images/emmc_8.png
  • 如果emmc是第一次mount,则会先将此区域格式化后再mount。

异常排查

初始化失败

  • 先检查emmc的供电是否正常。

  • 供电正常后,再查看emmc上的reset是否为高电平

  • 使用“LightWork.exe”检查emmc的pinmux是否正确。 以566的PA27-SD1_CMD引脚为例

../../_images/emmc_9.png

跟56X的引脚功能表对比

../../_images/emmc_10.png

如果是一致的说明pinmux配置正确,其他引脚不一一列举。

  • 查看时钟是否使能

../../_images/emmc_11.png

如果该“SDEMMC1”为0说明emmc的时钟没使能,需要确认是否有开启emmc的时钟。开启emmc的时钟接口如下:

HAL_RCC_EnableModule(RCC_MOD_SDMMC1);
  • 查看时钟源是否配置

../../_images/emmc_12.png
  • emmc读写超时失败–查看emmc的访问buff地址是在什么区域,去访问emmc时候地址不能在ITCM区域(0x00000000)开头的。需要在sram上或者psram上。并且地址需要进行4字节对齐。

mount失败

需要查看报错原因是什么,一般有如下原因:

  • 文件系统的个数不够,就是menuconfig里面配置的是只mount3个分区,但是excel上面却有4个分区需要mount。 解决方法:出现该错误只需要增加menuconfig的个数即可。

  • emmc里面没有文件系统的LBR分区信息,此种情况一般出现于第一加载emmc分区。 解决方法:进行格式化即可

  • 出现读写超时,该情况一般出现与emmc供电不稳、高频率时走线不规范、emmc的reset被拉低、sd引脚被修改、系统休眠时操作文件系统。 解决方法:可以降低频率进行尝试

emmc启动教程

  • 该步骤适用于芯片只有一个外挂的emmc芯片,或者想将code放在emmc上然后在psram上进行启动的方案。

  • 适用于52x 56x 58x芯片

  • 以下以566 外挂emmc芯片启动作为案例

确认pinmux配置

以上诉相同,不做过多陈述

menuconfig配置

由于采用的emmc启动方式,因此这里没有OTAM工程 除上诉的配置外,还需要做以下配置。

  • 关闭“OTA_EXT_V3”,因该配置目前只针对nor方案的升级

../../_images/emmc_13.png
  • 打开“OTA_56X_NAND”,这里要是是解决编译报错,这里只是临时修改,后期需要增加以emmc的OTA修改。

../../_images/emmc_14.png

excel表配置

  • 需要关闭其他外部flash的选项,只开SD0。由于566是双psram,因此需要将PSRAM1和2都打开。

../../_images/emmc_15.png
  • 配置code启动地址,以及分区信息。

../../_images/emmc_16.png

更多的配置请参考“FLASH分区应用笔记”

启动log

  • 初始化 以上诉一致

  • 加载文件系统

../../_images/emmc_17.png

异常排查

除开以上的故障外,还有可能出现如下情况。

  • 下载进去启动什么log都没有,出现这种情况可能是emmc在搬到psram里面时候出现了异常。因此需要做如下动作来进行判断。 1、先确认emmc里面的code与下载进去的code是一致的,确认方法采用“SIFLI Butterfli”工具将emmc里面的code读取出来与原始的code进行对比。

../../_images/emmc_18.png

2、再确认emmc搬到psram的代码是否正确,从excel里面去拿到emmc的搬移地址。然后使用jink直接读取出来。 3、请确认emmc搬移到psram的地址,566系列应该是psram1,因此在excel上的code的XIP地址为psram1的地址。 4、正确启动后emmc初始化等异常与上诉一致。

emmc低功耗模式

  • emmc的低功耗分为两种模式;1、掉电模式(SDIO_POWER_PM_ALL_DOWN);2、不掉电模式(SDIO_POWER_PM_UP); 在此之前需要了解一下emmc的供电方式:一般emmc的供电由VCC器件电源与VCCQ颗粒电源;那么emmc的功耗也是Icc与Iccq;具体数据根据各自的规格书进行查询 需要先使能如下配置

1、使能standby模式

../../_images/emmc_21.png

2、使能sdio低功耗模式;默认是不掉电模式

../../_images/emmc_22.png

(注意:目前支持standby模式)

掉电模式(SDIO_POWER_PM_ALL_DOWN)

  • menuconfig配置

../../_images/emmc_23.png

使能后每次睡眠唤醒都会对emmc进行初始化动作,每次耗时约为50ms~60ms

不掉电模式(SDIO_POWER_PM_UP)

  • menuconfig配置

../../_images/emmc_24.png

使能后每次睡眠唤醒只是恢复hcpu端的emmc寄存器即可。

FAQ

常见通用EMMC报错 1、先找对应的FAE人员对齐自己的驱动文件。 2、EMMC裸读写方式,在emmc初始化完成后直接调用如下接口函数。文件引用#include “mmcsd_core.h” addr的基地址为0xa0000000。

../../_images/emmc_25.png

3、出现如图错误,请检查操作emmc的buff地址是否4字节对齐,并且检查地址是否为合法地址,0x00000000开头的为违法地址,其他均为合法地址。

../../_images/emmc_26.png

4、55X上不支持DDR模式 5、emmc读写速率低,请参考emmc读写性能文件。 6、emmc的睡眠唤醒方案请参考硬件设计手册来选择适合自己的方案。 7、emmc finsh指令读写测试指令 带文件系统的读写测试指令如下: fs_read /1.txt 1024 // /1.txt 是要读的文件 1024 是大小。单位是1K fs_write /1.txt 1024 裸读写测试指令如下: fs_read_code 10 85 1024 // 10:要读的起始地址,内部已经有基地址0xa0000000 + 10;85:是buff初始数据;1024:要读的字节数 fs_write_code 10 85 1024 // 10:要写的起始地址,内部已经有基地址0xa0000000 + 10;85:要写入的数据;1024:要写的字节数