[mmc subsystem] mmc core(第一章)——概述
=========================================================================================================
一、mmc core簡單說明
對應程式碼路徑為drivers/mmc/core/.
0、幾個概念
首先要理解以下幾個概念
- mmc host:對應物理上的mmc控制器(host controller)。對應軟體中的mmc_host結構體。
- mmc card:對應物理上的mmc裝置。對應軟體中的mmc_card結構體。
- mmc driver:用於驅動mmc card,實現對應的實際功能。對應軟體中的mmc_driver。
1、框架說明
簡單框架圖如下:
- mmc core主模組
- host模組
- bus模組
- card相關模組
- mmc模組
- sd模組
- sdio模組
2、主要工作
按照框架的四個模組來說明其對應負責內容如下:
bus模組
對應程式碼bus.c。
抽象出虛擬mmc bus,實現mmc bus的操作。提供bus相關的操作,包括device的註冊以及driver的註冊的API。
參考《[mmc subsystem] mmc core(第三章)——bus模組說明》host模組
對應程式碼host.c。
為底層host controller driver實現mmc host的申請以及註冊的API等等,以及host相關屬性的實現。
參考《card相關模組
mmc type card對應mmc.c、mmc_ops.c
sd type card對應sd.c、sd_ops.c
為對應card實現相應的操作,包括初始化操作、以及對應的匯流排操作集合。負責和對應card協議層相關的東西。
參考《[mmc subsystem] mmc core(第五章)——card相關模組(mmc type card)》-
- mmc bus虛擬匯流排的註冊和維護
- mmc host的管理(host的獲取和釋放)、操作介面(包括host的頻寬配置、時鐘設定,復位操作)等等
- card裝置的抽象,card的管理和操作介面,包括card檢測介面等等。
- 實現基於mmc通訊規範的命令請求的介面以及命令處理的實現。
3、匯流排結構說明
mmc_opt_flow
(上圖摘自蝸窩科技http://www.wowotech.net/comm/mmc_framework_arch.html)
從硬體上來看,每一個mmc host對應一條實際的mmc匯流排。
但是mmc subsystem只存在一條虛擬的mmc bus。並且mmc host並不會作為這個裝置驅動匯流排模型的一個部分。
相應的:
- 在mmc bus上掛載的device是由mmc core根據實際mmc裝置抽象出來的card裝置。
- 在mmc bus上掛載的driver是在card目錄下實現的card driver,用於驅動虛擬card裝置、對接其他subsystem,實現其實際的功能。
二、sys下的節點說明
1、bus節點
mmc bus節點的對應路徑為/sys/bus/mmc。在mmc_register_bus中生成。
簡單示例如下:
在devices目錄下有如下節點
/sys/bus/mmc/devices/mmc0:0001
其中mmc0:0001就是mmc core抽象出來的card裝置,對應於我們板子上的emmc。
對應程式碼參考mmc_alloc_card&mmc_add_card。
在drivers目錄下有如下節點
/sys/bus/mmc/drivers/mmcblk
其中mmcblk就是block.c中實現的card driver。
對應程式碼參考mmc_register_driver。
2、host的class節點
mmc core實現了一個class用於維護和管理mmc host。其對應路徑為/sys/class/mmc_host。
mmc core會為每個註冊到mmc core中的mmc host在該class目錄下新增一個對應的節點。在mmc_add_host中生成。
簡單示例如下:
建立class的程式碼參考mmc_register_host_class
在/sys/class/mmc_host下有如下目錄:
/sys/class/mmc_host/mmc0
/sys/class/mmc_host/mmc1
在msm8916平臺中,註冊了兩個mmc host,而mmc0就是對應alias序號為0的host,而mmc1就是對應alias序號為1的host。
具體程式碼參考mmc_alloc_host。
其中,/sys/class/mmc_host/mmc0下有如下屬性:
clk_scaling clkgate_delay device mmc0:0001 perf power subsystem uevent
具體程式碼參考mmc_add_host。
3、card對應的sys節點
mmc core把mmc裝置抽象為card裝置。
從兩個地方可以找到其對應的sys節點。
簡單示例如下:
以mmc0:0001裝置為例,mmc0表示這個card掛載mmc0這個host上,0001表示card裝置地址為0001(也就是RCA,協議的東西,後續會說明)
(1)/sys/bus/mmc/devices/mmc0:0001(因為是掛在mmc bus上)
(2)/sys/class/mmc_host/mmc0/mmc0:0001(因為card的parent device為mmc host的class device)
具體程式碼參考mmc_alloc_card & mmc_add_card。
其下面有如下屬性:
block cid csd date driver enhanced_area_offset enhanced_area_size erase_size fwrev hwrev
manfid name oemid power preferred_erase_size prv raw_rpmb_size_mult rel_sectors
runtime_pm_timeout serial subsystem type uevent
相應屬性意義參考mmc_type的實現。後續再說明。
4、debug節點
mmc core為每個註冊到core中的host建立了對應的debug節點。
以mmc0這個host為例,其對應節點路徑為/sys/kernel/debug/mmc0
/sys/kernel/debug/mmc0有如下屬性
clk_delay clock ios max_clock mmc0:0001
具體程式碼參考mmc_add_host——》mmc_add_host_debugfs
mmc0:0001下有如下debug屬性:
ext_csd state status wr_pack_stats
具體程式碼參考mmc_add_card——》mmc_add_card_debugfs
三、資料結構說明
1、簡述
- struct mmc_host
mmc core由host controller抽象出來的結構體,用於代表一個mmc host控制器。 - struct mmc_card
mmc core由mmc裝置抽象出來的card裝置的結構體,用於代表一個mmc裝置。 - struct mmc_driver
用於代表一個card drive。 - struct mmc_bus_ops
mmc_bus_ops表示mmc host在總線上的操作集合,由host的card 裝置來決定,mmc type card、sd type card相應的操作集合是不一樣的。 - mmc_command
表示一個mmc命令包 - mmc_data
表示一個mmc資料包 - mmc_request
表示一個mmc請求,包括了mmc命令包(mmc_command)和mmc資料包(mmc_data)。 - mmc_async_req
表示一個mmc非同步請求,包括了mmc_request。