linux设备模型及实例

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提供的实现。

原文地址:https://www.cnblogs.com/fanguang/p/12291861.html