概要性了解Linux的总线设备驱动

引言

假如我们的板子上有很多LED,有时候需要操作这个LED,有时候需要操作另一个LED,我们希望代码可以清晰地组织在一起,方便扩展,同时自动为这些具体的设备生成对应的设备文件以供用户空间使用。

在Linux中,可以通过总线设备驱动编程的方法来实现这个需求。

这种方法将驱动程序划分为三个部分:总线 (Bus)、设备 (Device) 和 驱动 (Driver)。

  • 设备: 代表具体的硬件资源,例如一个 LED,同时描述了它的相关硬件信息(如寄存器地址、IRQ 等)。
  • 驱动: 实现了操作该设备的具体逻辑代码。
  • 总线: 负责在设备和驱动之间建立匹配关系,并调用驱动程序对设备进行初始化。

匹配过程可以大致理解为:

  1. 设备代码: 告诉总线有哪些硬件资源需要被驱动。
  2. 总线程序: 根据设备的信息,去查找注册过的驱动程序中是否有能够匹配的驱动。
  3. 驱动程序: 被总线调用后完成设备的初始化,并通过内核 API 为用户空间创建对应的设备文件(如 /dev/led0),这样这些设备就可以被用户访问和使用了。

这种设计具有模块化、可扩展和动态加载的优点,适用于开发复杂的嵌入式系统。

总线设备驱动的相关基础知识

总线设备驱动编程方法是 Linux 驱动模型的重要组成部分。总线、设备和驱动是 Linux 设备模型的核心三大概念。以下是详细价绍:

1. 总线设备驱动的三个基本概念

总线设备驱动编程方法将系统中的硬件划分为三部分:总线 (Bus)设备 (Device)驱动 (Driver),它们通过 Linux 的设备模型进行抽象和管理。

  • 总线 (Bus): 描述一类硬件连接标准(如 I2C、SPI、PCI 等),负责在设备和驱动之间建立匹配关系。
  • 设备 (Device): 表示挂载在某条总线上的具体硬件设备,通常由总线代码创建。
  • 驱动 (Driver): 用于操作某种特定设备的代码实现。

2. 总线设备驱动的结构

在 Linux 驱动模型中,设备和驱动通过总线进行联系,主要通过以下方式实现:

  • struct bus_type: 定义总线类型并实现其操作函数。
  • struct device: 定义具体的硬件设备。
  • struct device_driver: 定义设备驱动。
  • 匹配机制: 设备和驱动通过名字或其他标识符进行匹配,比如使用 id_tableof_match_table

3. 总线设备驱动的实现步骤

以下是实现总线设备驱动的一般步骤:

1. 注册总线

实现和注册总线类型:

static struct bus_type my_bus_type = {
   
   
    .name = "my_bus",
    .match = my_bus_match, // 匹配函数
    .probe = my_bus_probe, // 设备绑定驱动时调用
    .remove = my_bus_remove, // 解绑时调用
};
bus_register(&my_bus_type);

2. 注册设备

创建并注册设备:

static struct device my_device = {
   
   
    .init_name = "my_device",
    .bus = &my_bus_type,
};
device_register(&my_device);

3. 注册驱动

创建并注册驱动:

static struct device_driver my_driver = {
   
   
    .name = "my_device", // 必须与设备名字一致
    .bus = &my_bus_type,
};
driver_register(&my_driver);

4. 匹配设备和驱动

设备和驱动通过总线的 match 函数匹配,一旦匹配成功,就会调用 probe 函数进行初始化。

4. 设备树支持

如果硬件通过设备树描述,总线和设备的关联通常由 of_match_tableacpi_match_table 提供,匹配更加自动化。

5. 总线设备驱动的优点

  • 模块化设计: 硬件抽象更清晰,设备和驱动可以独立开发。
  • 动态管理: 支持动态加载和卸载设备及驱动。
  • 通用性强: 可以适配不同的总线类型。

常见的符合Linux标准的总线设备驱动

符合Linux标准的总线设备驱动被称为标准总线设备驱动 ,以下是常见的 标准总线设备驱动 以及它们的介绍:


1. Platform 总线设备驱动

简介
  • Platform 总线 是一个虚拟的、与硬件无关的总线,主要用于管理 片上系统 (SoC) 上的设备。
  • 适合处理没有明确硬件总线(如 I2C、SPI 等)约束的设备,比如板载 LED、GPIO、按键等。
组成
  • 设备:用 struct platform_device 描述,表示具体硬件资源。
  • 驱动:用 struct platform_driver 描述,实现对硬件的具体操作。
设备与驱动的匹配
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值