一、host簡單說明 host,也可以理解為host controller,是指mmc匯流排上的主機端,mmc匯流排的控制器,每個host controller對應一條mmc匯流排。 host controller會控制命令線、數據線和時鐘線,從而實現mmc匯流排上的通訊。 上層發送mmc請求時,就是通過h ...
一、host簡單說明
host,也可以理解為host controller,是指mmc匯流排上的主機端,mmc匯流排的控制器,每個host controller對應一條mmc匯流排。
host controller會控制命令線、數據線和時鐘線,從而實現mmc匯流排上的通訊。 上層發送mmc請求時,就是通過host controller產生對應的mmc通訊時序,下發至mmc設備,與mmc設備通訊。
註意,host的部分主要是實現card的通訊和檢測,不去負責card的具體功能。
二、host驅動簡單說明
1、host driver路徑
平臺實現mmc驅動,核心內容就是要實現host controller的驅動。
在mmc subsystem中,把host controller的驅動都放在了/drivers/mmc/host目錄下。
2、host controller要做的事情
通過《mmc core》一系列的說明,可以知道一個host driver要做的事情如下:
- 申請mmc_host
- 設置mmc_host的成員,包括操作集等等
- 完成host controller的初始化(哪些方面的初始化)
- 註冊mmc_host,註冊之後會去搜索card
補充說明:應實際的card設備(emmc card、mmc card、sd card),mmc core部分已經實現了其協議中初始化的部分,而其card設備具體功能的實現則是在card模塊中進行實現。host驅動只負責card的通訊和檢測等等,並不會去實現card的具體功能。!!!
三、sdhci類host
1、SDHC說明
註意,不同於SDHC\SDXC的概念。這裡是指一種標準。
SDHC:Secure Digital(SD) Host Controller,是指一套sd host控制器的設計標準,其寄存器偏移以及意義都有一定的規範,並且提供了對應的驅動程式,方便vendor進行host controller的開發。
vendor按照這套標準設計host controller之後,可以直接使用sdhci driver來實現host controller的使用,(qcom和samsung都使用了這套標準)。而vendor只需要實現平臺相關的部分、如clock、pinctrl、power等等的部分即可。
關於這個標準,我們可以參考《SDHC_Ver3.00_Final_110225》。
註意,強調一下,這是一種mmc host controller的設計標準,其本質上還是屬於mmc host。並且,其相容mmc type card,而不是說只能使用於sd type card。
2、sdhci類host說明
我們將符合sdhci標準的host稱之為sdhci類host。
例如:三星s5pv210平臺上的mmc host設計就使用了sdhci的標準,因此符合的就屬於sdhci類host,具體代碼對應(sdhci-s3c.c)。
像/drivers/mmc/host目錄一些命名為“sdhci-XXXX.c”(sdhci-pltfm除外)的驅動都表示對應的host是sdhci類host。
後續,我們將這種標準當作一種控制器,也就是把host和controller獨立開來。例如高通的sd host使用了sdhc的標準,那麼我們可以理解為msm host中包含了sdhci controller,這樣的理解有助於後續理解整體的代碼架構。
因為目前主流平臺的mmc host基本上都是用了sdhci標準,故後續主要學習sdhci類host的代碼。
四、幾個host結構體的關聯關係
1、幾個host結構體的說明
對於sdhci類host來說,我們會遇到如下幾個關於host的結構體
- 和平臺相關的host(struct sdhci_msm_host)
平臺會制定自己的host結構體來管理自己的一些資源和狀態。
例如高通用struct sdhci_msm_host來定義自己的host,在《host(第四章)——host實例(sdhci-msm說明)》中介紹。
對應代碼:drivers/mmc/host/sdhci-s3c.c、drivers/mmc/host/sdhci-msm.c
- sdhci_host
對於sdhci類host(也就是符合sdhci標準)的host來說,直接通過sdhci core來實現host controller的使用。
而sdhci core會為對應的host抽象出對應的struct sdhci_host結構體進行管理。
在《host(第二章)——sdhci》中介紹。
對應代碼:drivers/mmc/host/sdhci.c
- sdhci_pltfm_host
雖然平臺host符合sdhci標準,但是有些內容是由平臺決定,但是又是sdhci core需要的,這部分內容被封裝到sdhci_pltfm_data中。
相應的,平臺設備的host可以通過sdhci_pltfm_host來實現和sdhci_host的關聯。
在《host(第四章)——host實例(sdhci-msm說明)》中介紹。
對應代碼:drivers/mmc/host/sdhci-pltfm.c
- mmc_host
在《mmc core》系列中已經說明過。
mmc core通過struct mmc_host來管理host。不管是什麼類型的host,最終都是要實現出對應的mmc_host註冊到mmc core中交由mmc管理。
對應代碼:drivers/mmc/core/host.c
2、幾個host結構體之間的關聯
- 從代碼上具體關聯如下:
sdhci_host->mmc = mmc_host
sdhci_host->private = sdhci_pltfm_host
sdhci_pltfm_host->priv = sdhci_msm_host
platform_get_drvdata(sdhci_msm_host->struct platform_device) = sdhci_host
sdhci_msm_host->mmc = mmc_host