【问题标题】:Accessing pins of Linux hardware inside device driver在设备驱动程序中访问 Linux 硬件的引脚
【发布时间】:2023-04-01 18:20:01
【问题描述】:

我阅读了this excellent DIY article 关于编写 Linux 设备驱动程序的内容,但我仍然没有在此处的主要项目中看到“森林中的森林”。最终,最终用户软件(在用户空间中)需要与硬件进行通信(设备驱动程序正在驱动/包装/适应)。硬件由电力驱动,因此需要将软件命令转换为高/低信号(1 和 0),然后将其推送到电路和连接的硬件中。一个愚蠢的简单例子:

# Send a connected LED device a command to turn on at the software layer:
led.turnOn();

# In the device driver, somehow, translate this to 0x01 (1, or 00000001):
void turnOn() {
    int signal = 1;

    # Now, *somehow*, push this to the hardware with the following pinout (see below):
}

# Pinout
0   ---------------->  /----------\
0   ---------------->  |          |
0   ---------------->  |          |
0   ---------------->  | Hardware |
0   ---------------->  |          |
0   ---------------->  |          |
0   ---------------->  |          |
1   ---------------->  \----------/

我没有看到的是:在设备驱动程序 C 代码中,我如何从底层硬件设备读取/写入字节/数据?

我能看到的唯一理论是,也许是因为 Linux 设备被视为用户空间的“文件”(dev/led),也许将数据(例如 0x01)写入dev/led 是我们向其发送命令的方式连接的设备;也许从设备读取数据就是我们从设备读取数据的方式。

我是朝着正确的方向前进,还是偏离了轨道?

【问题讨论】:

    标签: linux linux-device-driver kernel-module device-driver


    【解决方案1】:

    这实际上取决于设备的性质以及它与系统的连接方式——它可能是内存映射的,或者映射到某种可寻址的 I/O 空间,或者是在诸如 PCI-e 或以 USB 为例。重点是在驱动程序中对此进行抽象,这样程序员就不必关心底层细节。

    例如,对于 PCI 设备,板卡可能会映射到物理地址范围。在此范围内,您可以访问某些寄存器来控制硬件。假设您有一个带有单个 32 位寄存器的简单 I/O 卡,并且该卡映射到物理地址 0xf0000000。该寄存器用于控制 32 个 LED 输出,您要打开 LED 0:

    volatile uint32_t * const my_card_register = (uint32_t *) 0xf0000000;
                                          // address of PCI card register
    *my_card_register |= 0x00000001;      // set bit 0 in register to turn on LED
    

    【讨论】:

    • 感谢@Paul R (+1),让我们继续使用您的总线 (USB/PCI) 示例 - 这可能如何工作/看起来?我真的在这里寻找细节,再次感谢!
    • 没问题 - 上面添加了简单的示例。
    • 再次感谢@Paul R(再次+1)-最后一个问题/跟进:现在我看到了这一点,我想知道是什么决定/设置了物理地址(在你的例子中@987654323 @) 首先?
    • 好吧,对于像 PCI 这样的东西,每个板卡都可以映射到一块物理地址空间 - 细节有些粗糙,您设置的方式将取决于平台/操作系统。最好的办法是查看您感兴趣的任何操作系统和设备类型的驱动程序的源代码,以了解它们如何处理所有低级细节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多