1. 程式人生 > >[mmc subsystem] mmc core(第一章)——概述

[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相關屬性的實現。
    參考《

    [mmc subsystem] mmc core(第四章)——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
avatar
(上圖摘自蝸窩科技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。