1. 程式人生 > >關於EMMC和SD卡-裝置驅動(1)

關於EMMC和SD卡-裝置驅動(1)

eMMC和SD卡都是將快閃記憶體控制器和NAND Flash封裝在一起,只是介面不同,eMMC一般是BGA封裝,焊接在PCB上,SD卡單獨封裝,使用SDIO介面通訊。

origin: http://blog.csdn.net/Do_or_Die/article/details/40260101

第一次寫這方面的文章,也不怎麼會寫吧!之前一直在學習uboot程式碼,其實提到裝置驅動就不得不提到核心機制,所以學習驅動必須學習核心機制,希望和所有初學者一起學習、交流!

我主要從事eMMC/SD卡裝置驅動的開發,提起SD卡大家都知道就是手機裡面的那張小儲存卡,而emmc可能就不太清楚了,其實用過手機或平板的都知道,廠商經常會說自己的ROM 16G、32G等,其實這個ROM已經不是當初的概念了,現在這個ROM是用nandflash或者emmc代替,emmc比nandflash的傳輸速度更快,底層的開發更加方便,不用考慮nandflash的壞塊處理。所以大家買手機或者平板是可關注下ROM用的是什麼晶片。

SD卡和emmc的介面和傳輸協議都類似,所以它們程式碼都放在/common/drive/mmc/資料夾下,按照驅動的架構分為三層分別存放在三個資料夾下面/mmc/card,/mmc/core,/mmc/host 三個資料夾下,接下來我主要分析下emmc/sd卡的驅動框架結構,具體程式碼有待繼續學習。

emmc/sd都屬於塊裝置驅動,而塊裝置驅動是核心驅動中最難的一種,下面是一個典型的塊裝置驅動的架構,它包括了應用層、核心驅動、硬體三層。

按照這個框架來實現emmc/sd卡的驅動模型,主要是實現其中的核心空間和硬體層。

其實理解驅動框架,主要是理解各個層之間是如何進行通訊的。下面就此分析其中的通訊機制。

(1)Host層

Host層主要是對主機控制器進行描述, 這裡以我們公司的xxx_sdio.c為例子進行分析,我們先採用 static int xxx_sdio_probe(struct platform_device *pdev)註冊了一個平臺裝置,接下來重點關注probe函 數。在這個函式中,host層與core層的聯絡是通過下面三句實現的。首先分配一個mmc_host結構體,接下來對操作該結構體的函式賦值mmc->ops,待會我一一介紹。中間還對mmc結構的很多成員進行了賦值,最後將mmc結構加入到mmc子系統,mmc_alloc_host,以及mmc_add_host 的具體做了什麼事情,以後我們具體分析,這三句是些mmc層驅動必須包含的。
mmc = mmc_alloc_host(sizeof(struct xxxsd_platform), &pdev->dev);
mmc->ops     = &xxx_sdio_ops;
……………
xxxmci_ops 中包含了四個函式:
static struct mmc_host_ops xxxmci_ops = {
    .request    = xxxmci_request,
    .set_ios    = xxxmci_set_ios,
    .get_ro        = xxxmci_get_ro,
    .get_cd        = xxxmci_card_present,

};
我們 從簡單的開始分析,這些函式都會在core部分被呼叫:
xxxmci_get_ro:這個函式通過從GPIO讀取,來判斷我們的卡是否是防寫的
xxxmci_card_present: 這個函式通過從GPIO讀取來判斷卡是否存在
xxxmci_set_ios:s3cmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
依據核心層傳遞過來的ios,來設定硬體IO,包括引腳配置,使能時鐘,和配置匯流排頻寬。
xxxmci_request: 這個函式是最主要,也最複雜的函式,實現了命令和資料的傳送和接收,
當core部分需要傳送命令或者傳輸資料時,都會呼叫這個函式,並傳遞mrq 請求。

void xxx_sdio_request(struct mmc_host *mmc, struct mmc_request *mrq);

(2)core層

CORE層完成了不同協議和規範的實現,併為HOST層的驅動提供了介面函式,在HOST層我們曾經呼叫的兩個函式:
mmc_alloc_host(sizeof(struct xxxmci_host), &pdev->dev);
mmc_add_host(mmc );
我 們就從這兩個函式入手,來分析CORE層與HOST層是如何互動的。

它們的作用主要是掃描和初始化SD卡和emmc,並將其新增到系統裝置模型中。其具體的程式碼將在以後的文章中具體分析。

(3)CARD層
因為SD卡和emmc都是塊裝置,當然需要提供塊裝置的驅動程式,這部分就是實現了將SD卡和emmc如何實現為塊裝置的。這些程式碼都在CARD資料夾下的block.c檔案中。它主要實現了建立裝置節點通過請求佇列機制進行資料傳輸。

每層都會涉及到核心機制中的很多東西,在以後的文章中會對每一個函式進行分析。理解的東西不多,還需繼續努力!