第一次寫這方面的文章,也不怎麼會寫吧!之前一直在學習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層主要是對主機控制器進行描述, 這裡以我們公司的***_sdio.c為例子進行分析,我們先採用 static int ***_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 ***sd_platform), &pdev->dev);
mmc->ops = &***_sdio_ops;
……………
***mci_ops 中包含了四個函式:
static struct mmc_host_ops ***mci_ops = ;
我們 從簡單的開始分析,這些函式都會在core部分被呼叫:
***mci_get_ro:這個函式通過從gpio讀取,來判斷我們的卡是否是寫保護的
***mci_card_present: 這個函式通過從gpio讀取來判斷卡是否存在
***mci_set_ios:s3cmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
依據核心層傳遞過來的ios,來設定硬體io,包括引腳配置,使能時鐘,和配置匯流排頻寬。
***mci_request: 這個函式是最主要,也最複雜的函式,實現了命令和資料的傳送和接收,
當core部分需要傳送命令或者傳輸資料時,都會呼叫這個函式,並傳遞mrq 請求。
void ***_sdio_request(struct mmc_host *mmc, struct mmc_request *mrq);
(2)core層
core層完成了不同協議和規範的實現,並為host層的驅動提供了介面函式,在host層我們曾經呼叫的兩個函式:
mmc_alloc_host(sizeof(struct ***mci_host), &pdev->dev);
mmc_add_host(
mmc);
我 們就從這兩個函式入手,來分析core層與host層是如何互動的。
它們的作用主要是掃瞄和初始化sd卡和emmc,並將其新增到系統裝置模型中。其具體的**將在以後的文章中具體分析。
(3)card層
因為sd卡和emmc都是塊裝置,當然需要提供塊裝置的驅動程式,這部分就是實現了將sd卡和emmc如何實現為塊裝置的。這些**都在card資料夾下的block.c檔案中。它主要實現了
建立裝置節點
,通過請求佇列機制進行資料傳輸。
每層都會涉及到核心機制中的很多東西,在以後的文章中會對每乙個函式進行分析。理解的東西不多,還需繼續努力!
驅動 linux裝置驅動 字元裝置驅動開發
preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...
Linux裝置驅動開發
1.操作硬體 讓硬體能夠正常工作 2.要給使用者提供訪問操作硬體的介面 1.字元裝置 特點 操作時,資料都是按照位元組流形式進行 訪問 例子 串列埠,led,按鍵,觸控螢幕,lcd顯示屏,藍芽 gps,gprs,各種感測器,攝像頭,音效卡,震子,電源管理ic等 2.塊裝置 特點 操作時,資料按照一定...
字元裝置驅動開發
一 驅動模組的載入和解除安裝 linux 驅動有兩種執行方式,第一種就是將驅動編譯進 linux 核心中,這樣當 linux 核心啟動的時候就會自動執行驅動程式。第二種就是將驅動編譯成模組 linux 下模組擴充套件名為 ko 在 linux 核心啟動以後使用 insmod 命令載入驅動模組。在除錯...