Linux 设备驱动程序模型Linux 设备驱动程序模型Linux 设备驱动程序模型Linux 设备驱动程序模型
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

Linux 设备驱动程序模型

一般来说,任何操作系统都需要一个特定于该设备的软件。该软件了解设备功能,是操作系统和硬件之间的中间层。设备驱动程序是用于该软件的术语。在本文中,我们将讨论 Linux 如何处理设备和设备驱动程序。简单来说,我们将探索Linux的设备驱动程序框架。

描述

通常,在任何板或平台上,都存在多个设备,并且这些设备通过一些物理线路或协议相互连接。这些连接协议称为总线。有多种可用的总线协议。例子有 I2C、SPI、AHB、APB、PCI 等。让我们以 EEPROM 存储设备为例。 EEPROM通过I2C总线与系统连接。 CPU将使用I2C协议从EEPROM读取/写入数据。从 CPU 端来看,该协议处理将由 I2C 协议控制器完成。 CPU 上的 I2C 控制器充当主设备。 EEPROM 充当从设备。 I2C 的所有详细信息均可在 I2C 规范中找到。

在基于 Linux 的 ARM 系统中,EEPROM 设备是在设备树的帮助下填充的。在设备树中定义 EEPROM 就足以在系统中声明设备。通过这个设备树条目,Linux 内核将在启动时创建设备实例。当Linux启动时,它会解析设备树并创建设备树中定义的设备的实例。

在Linux中创建了这个设备,但是Linux将无法理解该设备。对于设备通信/操作,需要特定于设备的特殊软件。这将被称为设备的设备驱动程序。回到 EEPROM 示例,需要 EEPROM 设备驱动程序从 EEPROM 读取/写入数据。

为了将设备驱动程序绑定到特定设备,需要一个兼容的字符串。 Linux 内核使用兼容字符串在启动时探测设备的特定驱动程序。 Linux 内核还提供了可以在运行时加载设备驱动程序的灵活性。唯一的条件是平台启动不需要驱动程序。后来添加到内核的设备驱动程序被编译为内核对象。这些是以 .ko 形式出现的文件。 insmod 命令用于在正在运行的内核上添加内核对象。

当设备驱动程序探测到设备后,就可以使用设备进行操作。 Linux 内核中初始化 EEPROM 驱动程序后,即可对 EEPROM 设备进行读/写操作。 EEPROM 驱动程序初始化设备并向 Linux 内核提供读/写 EEPROM 的功能。

让我们以 EEPROM 设备驱动程序 AT24 为例,该设备的源代码可以在以下链接找到:https://github.com/torvalds/linux/blob/master/drivers/misc/eeprom/at24.c

该驱动程序支持非常广泛的 EEPROM 设备,如驱动程序 Atmel AT24C 或 * MicroChip 24LC 等的注释中所述。

以下是创建设备实例时需要添加的设备树信息:

eeprom@50 {

    compatible = "atmel,24c32";

    reg = <0x50>;

    pagesize = <32>;

}

这应该添加到连接该 EEPROM 设备的特定 i2c 控制器节点。

正如我们所看到的,有一个兼容的字符串。这是Linux内核用来定位EEPROM设备的设备驱动程序的信息。

要获取 Linux 系统上存在的设备和设备的信息,sysfs 条目是最好的地方。

对于系统上的每个设备和驱动程序,内核都会创建 sysfs 条目。用户可以参考这些sysfs文件来诊断系统。

如果我们看到Linux内核中sys目录的内容:

/sys/bus:系统中存在的所有总线都列在其中。

还可以看到I2c总线。当我们讨论 i2c 设备示例时。在bus目录中,我们有i2c总线目录。

对于 sysfs 中的任何总线,我们将拥有该总线上存在的所有设备和驱动程序。我们看一下i2c总线的内容:

如果我们进一步浏览设备和驱动程序目录,我们将获得Linux内核已知的设备和驱动程序的完整列表。

在设备内部,我们可以看到系统中存在多个 i2c 总线。 I2c-0、i2c-1、i2c-5 等是不同的 i2c 总线。 0-0018和0-001a是i2c-0上的从设备。 1-0050 和 1-0068 是总线号上的 i2c 从设备。 1 即 i2c-1。

在驱动程序目录中,我们有所有 i2c 从设备驱动程序的列表。

回到我们的 EEPROM 设备示例,1-0050 是 EEPROM 从设备。如果我们进一步深入 1-0050 目录,我们将看到如下所示的内容:

这为我们提供了有关控制该设备的驱动程序的知识。在快照中,我们可以看到 AT24 驱动程序控制系统中存在的 EEPROM。这是链接到该 EEPROM 设备的驱动程序。

为了从用户空间访问 EEPROM 设备,驱动程序创建了文件“eeprom”,该文件也可以在快照中看到。

要读取 8K EEPROM 数据并转储到文件,可以使用 dd 命令,如下所示:

dd if=/sys/bus/i2c/devices/1-0050/eeprom of=eeprom_data.bin bs=1K count=8

从日志中可以看出,从EEPROM中读取了8K字节并写入了eeprom_data.bin文件中。该 bin 文件将包含 EEPROM 数据。 dd 命令是 Linux 世界中最流行、最常用的命令。

就像这个 EEPROM 设备一样,其他 i2c 设备也必须遵循 Linux 内核提供的指南。其他I2c设备可以是RTC、Toch屏幕等。总的来说,该设备驱动框架甚至适用于i2c范围之外的设备。

它可以是 SPI 设备或任何其他设备。将创建一个设备实例和另一个驱动程序实例。设备和驱动程序都将通过总线驱动程序链接/连接。这是Linux 中的通用设备驱动程序框架。

驱动程序的绑定与解绑

驱动程序与设备的绑定是将驱动程序关联或链接到可以控制或理解它的设备的过程。当我们取消驱动程序与设备的链接时,取消绑定是相反的过程。

所有驱动程序中都存在 sysfs 文件。文件名有绑定和取消绑定。这些是可用于绑定和取消绑定的文件。以下是 EEPROM 驱动 AT24 的快照:

解除驱动与设备的绑定

正如我们所看到的,设备实例存在于 at24 内部。这意味着设备已经链接。我们可以回显设备名称来解除驱动程序与设备的绑定。

在快照中可以看到驱动程序与设备的解除绑定。

echo 1-0050 > /sys/bus/i2c/drivers/at24/unbind;是完成解除绑定的命令。执行此命令后,设备不存在。因此,该设备现在未与驱动程序链接。

驱动程序与设备的绑定

echo 1-0050 > /sys/bus/i2c/drivers/at24/bind;是将驱动程序与设备绑定的命令。

第一个 ls 命令显示 AT24 目录中不存在设备详细信息,这意味着该设备未与任何驱动程序链接。其次,我们发出命令将设备与驱动程序链接起来。结果,我们看到设备信息被填充到驱动程序目录中。因此,驱动程序已成功链接到设备。

驱动程序与设备绑定成功后才能访问设备。

结论

我们以 i2c EEPROM 设备为例讨论了 Linux 内核中的设备驱动框架。我们探索了设备树中 EEPROM 设备的创建以及驱动程序与设备的链接。对 sysfs 文件进行了一些探索,它提供了有关 Linux 内核中存在的设备和驱动程序的非常好的诊断信息。我们看到了借助 dd 命令访问 EEPROM 的示例。我们还了解了涉及设备、驱动程序和总线的通用框架。最后,我们还提到了从用户空间手动绑定和解除绑定驱动程序和设备的方法。

©2015-2025 艾丽卡 support@alaica.com