linux设备驱动中的总线是什么
linux设备驱动中的总线是什么详细介绍
在 Linux 设备驱动模型中,** 总线(Bus)** 是连接设备(Device)和驱动(Driver)的核心枢纽,用于管理设备与驱动的注册、匹配及通信,是实现硬件抽象和驱动模块化的关键机制。以下是对总线的详细解析:
一、总线的核心作用
- 设备与驱动的桥梁
总线负责维护两个链表:- 设备链表:注册到总线上的所有设备(
struct device)。 - 驱动链表:注册到总线上的所有驱动(
struct device_driver)。
当设备或驱动注册到总线时,总线会尝试通过匹配规则(如设备 ID、名称、厂商信息等)将两者配对,成功后触发驱动的初始化逻辑(如probe函数)。
- 设备链表:注册到总线上的所有设备(
- 标准化管理
屏蔽不同硬件总线的差异(如 PCI、USB、I2C 等),提供统一的接口,使驱动开发者无需关心具体硬件总线的底层细节,只需遵循总线定义的框架编写代码。
二、总线的核心组件
- 总线结构体(
struct bus_type)
内核通过bus_type描述总线,包含以下关键成员:- 名称(name):如 "pci"、"usb"、"platform" 等。
- 匹配函数(match):定义设备与驱动的匹配规则(如按 ID 匹配、按名称匹配)。
- 热插拔支持(hotplug):处理设备插入 / 移除事件(如 USB 设备热插拔)。
- 电源管理接口:管理设备的电源状态(如休眠、唤醒)。
- 设备(
struct device)
代表具体硬件设备,需注册到对应的总线上,包含设备 ID、厂商信息、父设备(如总线本身)等属性。 - 驱动(
struct device_driver)
代表设备驱动,注册到总线上时需声明支持的设备 ID 列表或匹配条件,匹配成功后驱动被激活。
三、常见总线类型
- 硬件总线(物理总线)
- PCI/PCIe:用于连接 PCI 设备(如显卡、网卡),支持热插拔和即插即用。
- USB:管理 USB 设备,通过设备描述符和驱动的 ID 表匹配。
- I2C/SPI/UART:低速外设总线,常见于嵌入式系统,内核为其实现了通用总线框架。
- 虚拟总线(平台总线)
- platform 总线:用于无标准硬件总线的设备(如嵌入式系统中的片上外设,如 GPIO、PWM)。设备和驱动通过名称(如 "leds-gpio")或设备树(Device Tree)描述进行匹配,是嵌入式驱动开发的核心总线。
四、总线的核心功能
- 匹配机制
- ID 表匹配:驱动声明支持的设备 ID 列表(如
struct pci_device_id),设备注册时对比 ID。 - 名称匹配:通过设备与驱动的名称字符串直接匹配(常见于 platform 总线)。
- 设备树匹配:基于 Device Tree 节点的兼容性(compatible)属性匹配(适用于 platform 总线)。
- ID 表匹配:驱动声明支持的设备 ID 列表(如
- 注册与注销
- 设备通过
device_register()注册到总线,驱动通过device_driver_register()注册。 - 匹配成功后,总线调用驱动的
probe函数初始化设备;分离时调用remove函数释放资源。
- 设备通过
- 电源与热插拔管理
- 支持设备电源状态切换(如 ACPI 电源管理)。
- 处理热插拔事件(如 USB 设备插入时触发总线的热插拔回调)。
五、总线的意义
- 模块化驱动开发:驱动只需关注设备逻辑,硬件通信细节由总线框架处理,降低代码冗余。
- 设备即插即用:内核通过总线自动识别设备并加载驱动,无需手动配置(如 U 盘插入自动识别)。
- 统一设备模型:总线是 Linux 设备模型(
/sys/bus/目录)的核心,用户空间可通过 sysfs 接口访问设备和驱动信息。
示例:platform 总线的工作流程
- 设备注册:嵌入式设备通过 Device Tree 或
platform_device结构体注册到 platform 总线,声明名称和资源(如寄存器地址)。 - 驱动注册:驱动通过
platform_driver结构体注册,声明支持的设备名称或兼容列表。 - 匹配触发:总线发现设备与驱动名称匹配,调用驱动的
probe函数,传入设备资源进行初始化。
总之,总线是 Linux 设备驱动模型的 “粘合剂”,通过标准化的接口实现了设备与驱动的解耦,极大简化了复杂硬件系统的管理和驱动开发。