本文转载自:
定义:eMMC (Embedded Multi Media Card) 采用统一的MMC标准接口, 把高密度NANDFlash以及MMCController封装在一颗BGA芯片中。针对Flash的特性,产品内部已经包含了Flash管理技术,包括错误探测和纠正,flash平均擦写,坏块管理,掉电保护等技术速度:eMMC4.4的读取速度大约为104MB/s、eMMC 4.5则为200MB/s,eMMC 5.0存储产品,其读取速度为400MB/s,但是因为使用的是8位并行界面,因此性能潜力已经基本到达瓶颈趋势:UFS(通用flash存储标准) 2.0有两个版本:HS-G2的理论带宽就有5.8Gbps,也就是超过了740MB/s,HS-G3更是翻番到11.6Gbps,接近了1.5GB/s主流厂商及产品特性:三星镁光东芝mmc接口版本5.1/UFS4.41/4.54.41/4.5型号KMQ7X0000SAMTFC8GACAANATHGBMAG6A2JBAIR电压1.8V2.7V-3.3V2.7V-3.3V读/写速度(MB)250/90100/25100/25EMMC 硬件分区Boot1 和Boot2:这两个区域在存储的稳定性、可靠性及擦除次数上都远比UDA要好 ,所以经常放一些关键数据RPMB:保护性存储,是用来给系统存放一些特殊的、需要进行访问授权的数据(指纹,安全支付)UDA:AP及用户可以进行读写存储的区域,通常其大小为整块EMMC表示大小的93%左右sprd:Boot1:u-boot-spl-16k.binBoot2:u-boot.binRPMB:未使用(指纹相关)UDA:剩余的烧写文件高通:BOOT1:bootloaderBOOT2:boot.imgRPMB:未用(指纹相关)UDA:剩余文件UDA硬件分区上的软件分区MBR:MBR支持最大2TB磁盘,它无法处理大于2TB容量的磁盘。MBR还只支持最多4个主分区;如果这部分数据被覆盖或破坏,很难修复typedef struct _legacy_mbr { u8 boot_code[440]; __le32 unique_mbr_signature; __le16 unknown; struct partition partition_record[4]; __le16 signature;} __packed legacy_mbr;GPT:磁盘驱动器容量可以大得多,大到操作系统和文件系统都没法支持。它同时还支持几乎无限个分区数量,限制只在于操作系统;GPT在整个磁盘上保存了这部分信息的副本,因此它更为健壮typedef struct _gpt_header { __le64 signature; __le32 revision; __le32 header_size; __le32 header_crc32; __le32 reserved1; __le64 my_lba; __le64 alternate_lba; __le64 first_usable_lba; __le64 last_usable_lba; efi_guid_t disk_guid; __le64 partition_entry_lba; __le32 num_partition_entries; __le32 sizeof_partition_entry; __le32 partition_entry_array_crc32;} __packed gpt_header;typedef struct _gpt_entry { efi_guid_t partition_type_guid; efi_guid_t unique_partition_guid; __le64 starting_lba; __le64 ending_lba; gpt_entry_attributes attributes; efi_char16_t partition_name[PARTNAME_SZ];} __packed gpt_entry;EMMC 各阶段工作说明romcode:EMMC初始化主要完成下面的工作:1)设置HC为SDR12模式,CLK为26M,数据线为1bit模式;2)分频系数为66(400K)uboot阶段:struct mmc { struct list_head link; char name[32];//等同于host_name void *priv;//关联host uint voltages; uint version; uint has_init; uint f_min; uint f_max; int high_capacity; uint bus_width; int (*send_cmd)(省略); void (*set_ios)(struct mmc *mmc); int (*init)(struct mmc *mmc); ……..};struct sdhci_host { char *name; void *ioaddr;//EMMC控制器基地址 unsigned int quirks; unsigned int host_caps; unsigned int version; unsigned int clock; struct mmc *mmc;//关联emmc const struct sdhci_ops *ops; int index; void (*set_control_reg)(struct sdhci_host *host); void (*set_clock)(int dev_index, unsigned int div); uint voltages;};Uboot阶段各个parttion的加载过程:1.获取硬件分区2.获取GPT头数据3.获取ENTRY数组数据4.遍历ENTRY数组,寻找匹配分区5.获取该分区block信息6.完成读取kernel中的EMMCEMMC总体架构文件系统:1. 提供管理底层文件系统的功能组件(inode、directory entry、page cache等)2. 提供访问底层文件系统的方法(read、write、open等系统调用)转换为对具体分区具体块的访问Card层:emmc都是块设备,需要提供块设备的驱动程序,这部分就是实现了将emmc如何实现为块设备的。并获取文件系统的request,转发给core层core层:这部分完成了不同协议和规范的实现,并且为HOST层的驱动提供接口函数,调用host层的opshost层:这部分完成AP测主机的初始化,以及对外设emmc卡的初始化和读写。(平时编写驱动需要修改的地方)EMMC probe流程:EMMC 数据读写流程:至此:EMMC在整个手机启动阶段的流程就完成了本人一直在学习研究emmc的原理及应用,文章主要对流程做了介绍,但文章中难免存在疏漏,如有问题请邮件至:Leon_htzw@163.com,同时如有关于emmc细节的问题交流也可以发邮件,谢谢