[mmc subsystem] mmc core(第一章)——概述

建议先参考《[mmc subsystem] 概念与框架》和《[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、框架说明

简单框架图如下:

avatar
(上图摘自蜗窝科技http://www.wowotech.net/comm/mmc_framework_arch.html
如上,主要分成了四个模块:

  • mmc core主模块
  • host模块
  • bus模块
  • card相关模块
    • mmc模块
    • sd模块
    • sdio模块

2、主要工作

按照框架的四个模块来说明其对应负责内容如下:

  • 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。
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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。
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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的实现。后续再说明。
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

三、数据结构说明

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。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
[mcc子系统]是一个在Linux内核中用于支持基于存储介质的通信硬件设备的子系统。它通过提供统一的接口和管理机制来简化不同存储设备的驱动程序的开发和维护。 [mcc子系统]的框架由四个主要组件组成:核心层、总线层、主机层和设备层。核心层提供了与[mcc子系统]相关的数据结构和功能,如驱动程序模型和设备模型。总线层提供了[mcc子系统]与系统总线(如PCI和USB)之间的通信接口,并负责管理和配置[mcc子系统]中的设备。主机层对应于[mcc子系统]的主机控制器,负责与存储设备进行通信和传输数据。设备层则是每个[mcc子系统]设备的驱动程序,它们负责处理硬件与软件之间的通信。 [mcc子系统]的工作流程如下:首先,[mcc子系统]的驱动程序会注册到内核中,并与相应的总线层进行绑定。然后,总线层会扫描系统中的存储设备,并将其实例化为[mcc子系统]的设备对象。主机层会根据设备的类型和通信协议,初始化设备并建立与存储设备之间的通信通道。最后,应用程序通过[mcc子系统]的接口与存储设备进行交互,实现对存储设备的读写操作。 [mcc子系统]的设计目标是提供一个可扩展和可移植的存储设备驱动程序框架,它可以支持不同类型和厂商的存储设备。通过使用[mcc子系统],存储设备的开发和维护工作变得更加简单和高效,大大提高了Linux内核支持存储设备的能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值