1. 程式人生 > >EMMC 介紹【轉】

EMMC 介紹【轉】

本文轉載自:https://blog.csdn.net/u014645605/article/details/52061034

定義:

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/UFS
    

4.41/4.5
    

4.41/4.5

型號
    

KMQ7X0000SA
    

MTFC8GACAANA
    

THGBMAG6A2JBAIR

電壓
    

1.8V
    

2.7V-3.3V
    

2.7V-3.3V

讀/寫速度(MB)
    

250/90
    

100/25
    

100/25



EMMC 硬體分割槽


Boot1 和Boot2:這兩個區域在儲存的穩定性、可靠性及擦除次數上都遠比UDA要好 ,所以經常放一些關鍵資料


RPMB:保護性儲存,是用來給系統存放一些特殊的、需要進行訪問授權的資料(指紋,安全支付)


UDA:AP及使用者可以進行讀寫儲存的區域,通常其大小為整塊EMMC表示大小的93%左右



sprd:

Boot1:u-boot-spl-16k.bin

Boot2:u-boot.bin

RPMB:未使用(指紋相關)

UDA:剩餘的燒寫檔案

高通:

BOOT1:bootloader

BOOT2:boot.img

RPMB:未用(指紋相關)

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中的EMMC


EMMC總體架構

檔案系統:
1. 提供管理底層檔案系統的功能元件(inode、directory entry、page cache等)
2. 提供訪問底層檔案系統的方法(read、write、open等系統呼叫)
轉換為對具體分割槽具體塊的訪問

Card層:
emmc都是塊裝置,需要提供塊裝置的驅動程式,這部分就是實現了將emmc如何實現為塊裝置的。並獲取檔案系統的request,轉發給core層

core層:
這部分完成了不同協議和規範的實現,並且為HOST層的驅動提供介面函式,呼叫host層的ops
host層:
這部分完成AP測主機的初始化,以及對外設emmc卡的初始化和讀寫。(平時編寫驅動需要修改的地方)


EMMC probe流程:


EMMC 資料讀寫流程:




至此:EMMC在整個手機啟動階段的流程就完成了