Linux MMC framework2-host driver简介
2024-09-15 11:55:43 216人阅读
声明:本文很多内容和思路参考了http://www.wowotech.net/comm/mmc_host_driver.html,对原作者表示感谢!
1.前言
本文是Linux MMC framework的第二篇,将从驱动工程师的角度,介绍MMC host controller driver有关的知识,学习并掌握如何在MMC framework的框架下,编写MMC控制器的驱动程序。同时,通过本篇文章,我们会进一步的理解MMC、SD、SDIO等有关的基础知识。
2.主要数据结构和API
2.1 struct mmc_host
Elemete Name |
struct mmc_host |
Path |
include/linux/mmc/host.h |
Responsiblities |
mmc core使用struct mmc_host来抽象mmc host controller
|
Attributions |
- parent : struct device *类型,指向该mmc host的父设备,一般为注册此mmc_host的platform device
- class_dev:一个struct device类型的变量,是该MMC host在设备模型中作为一个“设备”的体现。当然,人如其名,该设备从属于某一个class(mmc_host_class)
- index:该mmc_host的索引号,因为有可能有多个mmc host controller
- ops:struct mmc_host_ops *类型的指针,包含了此mmc_host所有的操作函数集,见struct mmc_host_ops结构体描述
- f_min、f_max、f_init,该MMC host支持的时钟频率范围,最小频率、最大频率以及初始频率
- ocr_avail:通常的OCR电压范围
- ocr_avail_sdio、ocr_avail_sd、ocr_avail_mmc:sdio sd mmc特定的电压范围
- pm_notify:struct notifier_block类型,电源管理相关的notify
- max_current_330/max_current_300/max_current_180:支持的最大电流
- mmcid:
- caps:host所具备的能力
- caps2:host所具备的其它功能
- pm_caps:mmc_pm_flag_t类型,支持的pm特性
-
- clk_requests:
- clk_delay:
- clk_gated:clk是否已经开启了
- clk_gate_work:struct delayed_work类型
- clk_old:
- clk_lock:spinlock_t 类型,对clk相关临界资源保护
- clk_gate_mutex:struct mutex,保护clk gate的排它锁
- clkgate_delay_attr:struct device_attribute类型
- clkgate_delay:
-
- max_seg_size:一个segment最大为多少字节
- max_segs:最多支持多少segments
- unused:
- max_req_size:一个request的最大字节个数
- max_blk_size:一个mmc block的最大大小
- max_blk_count:一个request的最大block数目
- max_discard_to:最大的discard超时时间(ms)
-
- lock:spinlock_t类型mmc的互斥保护
- ios:struct mmc_ios类型,当前的io总线设置
- ocr:当前的操作电压设置
-
- use_spi_crc:
- claimed:host排他声明
- bus_dead:总线是否被释放
- removed:host是否被移除了
- rescan_disable:是否禁用卡检测,一般初始时禁用,ready后才使能
- rescan_entered:用于非可移除式设备
- card:struct mmc_card *类型,用于连接到这个host的设备
- wq:wait_queue_head_t类型,work队列
- claimer:struct task_struct *类型,host声明的task
- claim_cnt:"claim" nesting count
- detect:struct delayed_work 类型,用于检测卡的work线程
- detect_wake_lock:struct wake_lock
- detect_change:card detect flag
- slot:struct mmc_slot类型;
- bus_ops:struct mmc_bus_ops *类型, current bus driver
- bus_refs:reference counter
- bus_resume_flags:
- sdio_irqs:
- sdio_irq_thread:struct task_struct *类型
- sdio_irq_pending:
- sdio_irq_thread_abort:atomic_t类型
- pm_flags:mmc_pm_flag_t 类型,请求的pm特性
- led:struct led_trigger *类型
- regulator_enabled:regulator状态
- supply:struct mmc_supply类型
- debugfs_root:struct dentry *类型,用于在debugfs中显示相应节点
- areq:struct mmc_async_req *类型, /* active async req */
- context_info:struct mmc_context_info类型,; /* async synchronization info */
- fail_mmc_request:struct fault_attr类型
- actual_clock:Actual HC clock rate
- slotno:used for sdio acpi binding
- private:一个0长度的数组,可以在mmc_alloc_host时指定长度,由host controller driver自行支配
|
Operations |
- struct mmc_host *mmc_alloc_host(int extra, struct device *dev)
分配一个mmc_host结构体,并对其进行初始化
- int mmc_add_host(struct mmc_host *host)
将host device注册进设备驱动模型,并做host硬件的初始化,向PM core 注册notify, 在本函数完成之前,必须能保证host可以使用
- void mmc_remove_host(struct mmc_host *host)
将host device从设备驱动模型移除,并将所有的卡与bus切断连接,向pm core注销notify,将mmc bus掉电
|
2.2 struct mmc_host_ops
Elemete Name |
struct mmc_host_ops |
Path |
include/linux/mmc/host.h |
Responsiblities |
主要包含了host contrller 所需要实现的操作
|
Attributions |
- post_req/pre_req:是为了支持双buffer的请求(一个请求正在处理,同时准备另一个请求)
- request:用来处理一次transfer request
如下的函数可能会sleep,不能在中断上下文中调用:
- set_ios:
- get_ro:获取卡的读写状态,返回0表示可读写卡,返回1表示只读卡,返回-ENOSYS表示不支持,返回其它的负值表示其它错误发生
- get_cd:返回0表示卡未连接,返回1表示卡有连接,返回-ENOSYS表示不支持,返回其它的负值表示其它错误发生
- enable_sdio_irq:
- init_card:
- start_signal_voltage_switch:
- card_busy:
- execute_tuning:根据SD和eMMC卡的不同,调节tuning命令操作码值
- select_drive_strength:设定驱动能力
- hw_reset:对device执行reset操作
- card_event:
|
Operations |
|
TODO
Linux MMC framework2-host driver简介
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉:
投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。