NUC970系列资料之EMMC的使用

NUC970系列资料之EMMC的使用

1 NUC970的EMMC介绍

NUC970的emmc接口是由FMI来实现的。EMMC的管脚是和nand flash的管脚复用的,即EMMC接口与nand flash接口是二选一的关系,选用EMMC就不能选用nand flash。

clip_image002

support eMMC 4-bit mode

对应管脚:emmc_cmd、eMMC_CLK、emmc_data3、emmc_data0、emmc_data1、emmc_data2

PC口:PC4、PC5、PC3、PC0、PC1、PC2

PI口:PI5、PI6、PI7、PI8、PI9、PI10

Emmc启动的设定:

PA[1:0]:01 boot from eMMC and pin PC[5:0] or PI[10:5] used as the eMMC functionality

IP Programming: eMMC

l Initialize FMI

FMI: FMI_CTL[SWRST]

DMA: FMI_DMACTL[SWRST]; FMI_DMACTL[DMACEN]

l eMMC Command

Initialize eMMC: FMI_CTL[eMMC_EN]; FMI_EMMCCTL[SWRST]

Clear interrupt flag and enable interrupt

Set DMAC: FMI_DMASA; FMI_DMABCNT

Issue eMMC command:

FMI_EMMCCMD

FMI_EMMCCTL[CMD_CODE]

FMI_EMMCCTL[DO_EN / DI_EN / RI_EN / CO_EN]

Wait the interrupt happen and read response FMI_EMMCRESPx

l eMMC state machine (eMMC Spec.)

clip_image004

eMMC Initial Flow

clip_image006

eMMC Data Transfer Flow

2 emmc启动的u-boot配置及编译

本文针对的nuc970 u-boot版本,github上的nuc970的bsp上的版本:

https://github.com/OpenNuvoton/NUC970_U-Boot_v2016.11.git

获取办法: #git clone https://github.com/OpenNuvoton/NUC970_U-Boot_v2016.11.git

2.1 u-boot配置

Include/configs/nuc970_evb.h的主要修改点

修改使用存储设备,及环境变量存放的位置:

注释掉下面几项:

/* #define CONFIG_SYS_USE_SPIFLASH */

/* #define CONFIG_SYS_USE_NANDFLASH */

/* #define CONFIG_ENV_IS_IN_NAND */

打开下面一项:

#define CONFIG_ENV_IS_IN_MMC

配置EMMC相关项,打开如下几项:

#define CONFIG_MMC

#define CONFIG_GENERIC_MMC

#define CONFIG_NUC970_EMMC

Configs/nuc970_defconfig主要修改点

注销下面两项:

# CONFIG_SPL=y

# CONFIG_NAND_NUC970=y

打开下面两项:

CONFIG_NUC970_MMC=y

CONFIG_NUC970_SD_PORT0=y

2.2 u-boot编译

清除

#make distclean

配置u-boot

#make nuc970_defconfig

编译u-boot

#make CROSS_COMPILE=arm-linux-

#export CROSS_COMPILE=arm-linux-

#make

2.3 u-boot环境变量设置

Emmc启动时环境变量

bootargs=noinitrd root=/dev/mmcblk0p1 rw rootfstype=ext4 rootdelay=2 console=ttyS0,115200n8 rdinit=/sbin/init mem=64M

bootcmd=mmc dev 1;mmc read 0x7fc0 0x1000 0x6000;bootm 0x7fc0

3 emmc启动的内核配置与编译

3.1 emmc相关配置

配置FMI接口的功能,选择emmc功能

Device Drivers —>

Generic Driver Options —>

<*> Nuvoton NUC970 FMI function selection

Select FMI device to support (Support EMMC Flash) —>

配置emmc的管脚

Device Drivers —>

<*>MMC/SD/SDIO card support —>

<*> MMC block device driver

-*- Nuvoton NUC970 eMMC support

NUC970 eMMC pin selection (Port C) —>

其中:

Port C for nuc972: NUC970 eMMC pin selection (Port C) —>

Port I for nuc977: NUC970 eMMC pin selection (Port I) —>

配置ext4文件系统支持

File systems —>

<*> The Extended 4 (ext4) filesystem

[*] Use ext4 for ext2/ext3 file systems

配置FAT文件系统支持

File systems —>

DOS/FAT/NT Filesystems —>

<*> MSDOS fs support

<*> VFAT (windows-95) fs support

(437) Default codepage for FAT

(iso8895-1) Default iocharset for FAT

3.2 内核编译

#make uImage

4 Emmc 烧写

4.1烧写u-boot

clip_image008

4.2烧写环境变量

clip_image010

4.3烧写kernel

clip_image012

4.4烧写ext4文件系统

clip_image014

由于nuwriter没有针对ext4的工具,所以需要通过format,在emmc上建立一个分区,即在MBR上写一个分区信息。

Ext4分区镜像的制作:

我在网上找到制作ext4的工具。

获取该工具的命令如下:

git clone https://github.com/EpicAOSP/make_ext4.git

制作ext4文件命令如下:

./bin/make_ext4fs -l 40M -s  rootfs.ext4img rootfs_qt

./bin/simg2img rootfs.ext4img rootfs.ext4.img

网上的说明

http://blog.csdn.net/kangear/article/details/46333915

4.5 格式化FAT分区

clip_image016

预留sectors的计算:

预留的偏移地址是:0x1600000

预留的sectors=0x1600000/512