【问题标题】:Writing device driver for embedded boards为嵌入式板编写设备驱动程序
【发布时间】:2023-03-23 22:47:02
【问题描述】:

我是嵌入式世界的新手。我正在尝试在使用 Yocto 项目构建的嵌入式 Linux 系统上编写设备驱动程序。我不完全知道 linux 驱动程序是如何工作的,以及如何编写一个新的驱动程序来测试外围设备。

在我的产品documentation 中,在第 569 - 1199 页中有一个名为“Linux 内核驱动程序”的部分。它描述了感兴趣的硬件(PCIE,SPI ....)的设备树源和驱动程序变量。我现在所理解的是,产品所有者已经编写了一些函数来访问外围硬件,而我所要做的就是使用它的 .c 文件调用一些特殊函数来达到它们。

我来这里是想问问 stackoverflow 专业人士,我的想法是对的还是走在正确的道路上?以及为特殊产品编写设备驱动程序的任何建议?

【问题讨论】:

标签: linux-kernel embedded linux-device-driver embedded-linux yocto


【解决方案1】:

我现在的理解是,产品所有者已经编写了一些函数来访问外围硬件,我所要做的就是使用它的 .c 文件调用一些特殊函数来实现它们。 块引用

您的理解部分正确 - 主板供应商已经编写了驱动程序(用于读取/写入硬件寄存器的函数)。但是,它并不像链接驱动程序的 c 文件那么简单。

在 Linux 中,使用这些驱动程序(驱动程序 API)的机制因用例而异。可以从用户空间和内核空间访问驱动程序。这两个空间都有不同的 API 来与驱动程序交互。 Linux 内核驱动程序中有很多分层(抽象),其中很大一部分工作是熟悉所涉及的所有抽象级别。

从用户空间使用驱动程序时,最常见的 API 是使用代表设备的设备文件并对其进行文件操作。例如,USB 转串行 UART 通常由设备文件 /dev/ttyUSB0 表示,与驱动程序的所有交互都通过该设备文件进行。您可以搜索在 Linux 上编写字符驱动程序以对此有更多了解。实质上,您的 Linux 内核驱动程序需要创建一个设备文件,并且您需要将对该设备文件执行的操作(打开、读取、写入、关闭、ioctl)映射到驱动程序中特定于设备硬件的函数。

Linux 在此基础上创建特定的驱动子系统。例如,Linux framebuffer 子系统,通常用于在显示器上绘制图形。它也是一个设备文件,但具有所有帧缓冲设备通用的操作。特定于设备的功能将进入另一个包含硬件特定位的单独驱动程序。目标很简单,将通用可重用代码和硬件特定位分开。

如果你想绕过用户空间 API 并直接与其他内核代码或驱动程序接口,你需要编写一个在内核空间中运行的内核模块,在这里,你可以链接到通用内核导出的函数来自供应商的驱动程序。这只是为了给你一个基本的想法,一旦你真正开始编写一些与驱动程序接口的代码,就会有很多潜在的细节被揭开。我建议从简单的字符驱动程序开始。你可以关注这个tutorial

【讨论】:

    【解决方案2】:

    恐怕对于嵌入式 Linux 新手来说,这是一项相当复杂的任务。我认为你应该从学习 Linux 内核 API 开始。你还需要一些电子知识。看看一些 Linux 内核模块编程指南,并尝试为 Linux 内核编写一些简单的模块。然后你可以了解内存映射以及内存在 Linux 内核中是如何工作的。您需要这些知识,因为在嵌入式世界中,您需要知道如何访问给定的设备。您还需要知道何时使用“volatile”C 语言关键字等等。很多东西要学...

    【讨论】:

    • 感谢您的回答。我开始学习将字符设备编写为内核模块。我已经阅读了一些关于还有用户空间设备驱动程序的帖子。您知道何时使用内核设备驱动程序以及何时使用用户空间设备驱动程序吗?还有你说的“Memory Map”是如何使用mmap、malloc、ioctl等函数的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多