作者:袁冠芳彦源 | 来源:互联网 | 2024-12-05 16:21
声明:本文部分资料和观点借鉴自http://www.wowotech.net/comm/mmc_host_driver.html,特此感谢原作者的贡献。
本文作为Linux MMC框架系列文章的第二篇,聚焦于Host对象的基础架构及其操作机制。
1. 核心数据结构与API
1.1 struct mmc_host
元素名称 |
struct mmc_host |
路径 |
include/linux/mmc/host.h |
职责 |
在Linux内核中,struct mmc_host用于抽象表示MMC主机控制器。
|
属性 |
- parent: 指向父设备的指针,通常是注册此mmc_host的平台设备。
- class_dev: 表示MMC主机在设备模型中的设备实例,隶属于mmc_host_class类。
- index: 主机控制器的索引号,用于区分系统中的多个主机控制器。
- ops: 指向包含所有主机操作函数的结构体struct mmc_host_ops的指针。
- f_min/f_max/f_init: 主机支持的最小、最大及初始时钟频率。
- ocr_avail/ocr_avail_sdio/ocr_avail_sd/ocr_avail_mmc: 各种类型卡支持的电压范围。
- pm_notify: 电源管理相关的通知块。
- max_current_330/max_current_300/max_current_180: 支持的最大电流。
- caps/caps2: 主机具备的能力和其他功能。
- pm_caps: 支持的电源管理特性。
- ... (其他属性省略)
|
操作 |
- mmc_alloc_host: 分配并初始化一个mmc_host结构体。
- mmc_add_host: 将主机设备注册到设备驱动模型中,并初始化硬件。
- mmc_remove_host: 从设备驱动模型中移除主机设备,并断开所有卡与总线的连接。
- mmc_free_host: 释放mmc_host结构体。
- mmc_power_save_host: 对主机进行掉电处理。
- mmc_power_restore_host: 恢复主机的上电状态。
- mmc_detect_change: 检测MMC卡的状态变化。
- mmc_request_done: 处理完一次请求后的回调函数。
- ... (其他操作省略)
|
1.2 struct mmc_host_ops
元素名称 |
struct mmc_host_ops |
路径 |
include/linux/mmc/host.h |
职责 |
该结构体定义了主机控制器必须实现的操作。
|
属性 |
- post_req/pre_req: 支持双缓冲请求处理。
- request: 处理一次传输请求。
- set_ios: 设置I/O总线参数。
- get_ro: 获取卡的读写状态。
- get_cd: 检查卡是否插入。
- enable_sdio_irq: 管理SDIO中断。
- init_card: 初始化卡。
- start_signal_voltage_switch: 开始信号电压切换。
- card_busy: 检查卡是否忙。
- execute_tuning: 执行调谐操作。
- select_drive_strength: 设置驱动强度。
- hw_reset: 硬件重置设备。
- ... (其他属性省略)
|
操作 |
...
|
1.3 struct mmc_ios
元素名称 |
struct mmc_ios |
路径 |
include/linux/mmc/host.h |
职责 |
该结构体定义了当前的I/O总线设置。
|
属性 |
- clock: 当前时钟频率。
- vdd: 供电电压。
- bus_mode: 命令输出模式(开漏或推挽)。
- chip_select: SPI片选模式。
- power_mode: 电源模式。
- bus_width: 总线宽度。
- timing: 时序模式。
- signal_voltage: 信号电压。
- drv_type: 驱动类型。
|
操作 |
...
|
2. 关键流程
2.1 mmc_add_host
mmc_add_host ->
mmc_start_host ->
mmc_detect_change ->
mmc_rescan ->
mmc_rescan_try_freq ->
mmc_attach_mmc
- mmc_add_host: 通常在驱动程序的probe函数中调用,用于注册并初始化SD/MMC设备。
- mmc_start_host: 调用mmc_detect_change启动卡检测工作线程。
- mmc_rescan: 处理边界情况,如卡检测禁用、不可移除卡等,然后调用mmc_rescan_try_freq进行卡扫描。
- mmc_rescan_try_freq: 按照预设频率列表尝试卡的检测,最终调用mmc_attach_mmc。
- mmc_attach_mmc: 完成卡的初始化,并将其注册到MMC总线上。