定義:
eMMC (Embedded Multi Media Card) 采用統(tǒng)一的MMC標準接口, 把高密度NANDFlash以及MMCController封裝在一顆BGA芯片中。針對Flash的特性,產(chǎn)品內部已經(jīng)包含了Flash管理技術,包括錯誤探測和糾正,flash平均擦寫,壞塊管理,掉電保護等技術
速度:
eMMC4.4的讀取速度大約為104MB/s、eMMC 4.5則為200MB/s,eMMC 5.0存儲產(chǎn)品,其讀取速度為400MB/s,但是因為使用的是8位并行界面,因此性能潛力已經(jīng)基本到達瓶頸
趨勢:
UFS(通用flash存儲標準) 2.0有兩個版本:HS-G2的理論帶寬就有5.8Gbps,也就是超過了740MB/s,HS-G3更是翻番到11.6Gbps,接近了1.5GB/s
主流廠商及產(chǎn)品特性:
mmc接口版本5.1/UFS4.41/4.54.41/4.5
型號KMQ7X0000SAMTFC8GACAANATHGBMAG6A2JBAIR
電壓1.8V2.7V-3.3V2.7V-3.3V
讀/寫速度(MB)250/90100/25100/25
EMMC 硬件分區(qū)

Boot1 和Boot2:這兩個區(qū)域在存儲的穩(wěn)定性、可靠性及擦除次數(shù)上都遠比UDA要好 ,所以經(jīng)常放一些關鍵數(shù)據(jù)
RPMB:保護性存儲,是用來給系統(tǒng)存放一些特殊的、需要進行訪問授權的數(shù)據(jù)(指紋,安全支付)
UDA:AP及用戶可以進行讀寫存儲的區(qū)域,通常其大小為整塊EMMC表示大小的93%左右
sprd:
Boot1:u-boot-spl-16k.bin
Boot2:u-boot.bin
RPMB:未使用(指紋相關)
UDA:剩余的燒寫文件
高通:
BOOT1:bootloader
BOOT2:boot.img
RPMB:未用(指紋相關)
UDA:剩余文件
UDA硬件分區(qū)上的軟件分區(qū)

?
MBR:MBR支持最大2TB磁盤,它無法處理大于2TB容量的磁盤。MBR還只支持最多4個主分區(qū);如果這部分數(shù)據(jù)被覆蓋或破壞,很難修復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:磁盤驅動器容量可以大得多,大到操作系統(tǒng)和文件系統(tǒng)都沒法支持。它同時還支持幾乎無限個分區(qū)數(shù)量,限制只在于操作系統(tǒng);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,數(shù)據(jù)線為1bit模式;
2)分頻系數(shù)為66(400K)
uboot階段:

struct mmc {
struct list_head link;
char name[32];//等同于host_name
void *priv;//關聯(lián)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;//關聯(lián)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.獲取硬件分區(qū)
2.獲取GPT頭數(shù)據(jù)
3.獲取ENTRY數(shù)組數(shù)據(jù)
4.遍歷ENTRY數(shù)組,尋找匹配分區(qū)
5.獲取該分區(qū)block信息
6.完成讀取
kernel中的EMMC
EMMC總體架構

文件系統(tǒng):
1. 提供管理底層文件系統(tǒng)的功能組件(inode、directory entry、page cache等)
2. 提供訪問底層文件系統(tǒng)的方法(read、write、open等系統(tǒng)調用)
轉換為對具體分區(qū)具體塊的訪問
Card層:
emmc都是塊設備,需要提供塊設備的驅動程序,這部分就是實現(xiàn)了將emmc如何實現(xiàn)為塊設備的。并獲取文件系統(tǒng)的request,轉發(fā)給core層
core層:
這部分完成了不同協(xié)議和規(guī)范的實現(xiàn),并且為HOST層的驅動提供接口函數(shù),調用host層的ops
host層:
這部分完成AP測主機的初始化,以及對外設emmc卡的初始化和讀寫。(平時編寫驅動需要修改的地方)

EMMC probe流程:

EMMC 數(shù)據(jù)讀寫流程:

電子發(fā)燒友App































評論