1.linux设备模型基本概念
BUS(总线):用于关联设备和驱动,代表一个实际的物理总线(如USB、PCI bus)或虚拟总线(如platform bus),总线会提供与总线相关的驱动(driver)和设备(device)注册方法。
Device(设备):系统中的所有硬件设备,描述设备的名字、包含硬件资源、属性等信息。每个设备都有它从属的总线,但是不一定有他对应的驱动。
Class(设备类):一些复杂的设备需要编写很多驱动代码,如USB、EMMC、SD等。class为这些设备(device)提供一个父设备类,实现设备类的公共部分,简化驱动程序的开发。
Driver(驱动):硬件设备的驱动程序,实现对应设备的接口函数,包括初始化,设备基本操作函数等。
2.举例说明:
以emmc设备为例,系统中实现了mmc总线,负责所有智能卡设备及驱动的匹配。
drivers/mmc/core/core.c中的mmc_init()函数中调用mmc_register_bus()注册了mmc总线。
drivers/mmc/core/core.c中的mmc_init()函数中调用mmc_register_host_class()注册了mmc_host类。
2.1 总线mmc
实现如下接口
mmc_register_driver函数用于注册该总线下的驱动程序(mmc_driver类型)。
mmc_alloc_card用于创建总线下的设备(mmc_card类型)。
mmc_add_card用于将设备加入总线。
2.2 mmc总线上的驱动程序注册
driver/mmc/card/block.c的mmc_blk_init函数中注册了mmc_driver类型驱动,驱动实现中会注册块设备(在linux中会枚举出mmcblock的块设备节点)。
2.3 mmc总线上的设备注册
driver/mmc/core/mmc.c中的mmc_attach_mmc函数中实现了mmc_card设备的注册和加入总线。
2.4 class mmc_host
代表多媒体卡控制器类MultiMediaCard
由于emmc设备比较复杂,linux对这类设备抽象出了mmc_host的class 设备。
实现位置drivers/mmc/core/host.c
class 注册函数mmc_register_host_class。
实现如下接口:
mmc_alloc_host 申请class为mmc_host类型的设备,将新申请的设备和class进行关联
mmc_add_host 注册mmc_host类型的设备
mmc_remove_host 注销mmc_host类型的设备
mmc_free_host 释放mmc_host类型的设备
mmc_detect_change 功能辅助函数
接口内部完成公共部分的实现,如:mmc_alloc_host中注册的work mmc_rescan会完成emmc、sd卡的扫描工作。
2.5 sdhci设备
实现安全数字主机控制器接口驱动
实现位置drivers/mmc/host/sdhci.c
sdhci设备对mmc_host设备类进行封装,并实现sdhci特殊部分接口
2.6 platform总线上的emmc设备注册
设备树中定义了名字为“sdhci-dove”的设备
2.7 platform总线上的emmc驱动注册
drivers/mmc/host/sdhci-dove.c中注册了名字为“sdhci-dove”的平台设备驱动
2.8 emmc驱动实现方式
驱动和设备匹配后,驱动程序调用sdhci设备实现接口实现设备驱动的各种操作。
调用sdhci_pltfm_init初始化设备
调用sdhci_add_host增加设备。
设备操作函数也可以使用sdhci提供的实现。