为嵌入式板编写设备驱动程序

Writing device driver for embedded boards

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

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

我来这里是想问问Whosebug的专业人士,我的想法是对的还是我的方法是对的?以及为特殊产品编写设备驱动程序的任何建议?

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

What i understood for now is, product owner has already written some functions to reach peripheral hardware and all i have to do is reaching them with calling some special functions using its .c files. Blockquote

您的理解部分正确 - 电路板供应商已经编写了驱动程序(reading/writing 硬件寄存器的功能)。但是,它并不像 link 对驱动程序的 c 文件进行访问那么简单。

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

在使用来自用户space的驱动程序时,最常见的API是使用表示设备的设备文件并对其进行文件操作。例如,USB 转串口 UART 通常由设备文件 /dev/ttyUSB0 表示,所有与驱动程序的交互都通过此设备文件进行。您可以在 Linux 上搜索 writing character drivers 以获得对此的更多了解。本质上,您的 Linux 内核驱动程序需要创建一个设备文件,并且您需要将在此设备文件上完成的操作(打开、读取、写入、关闭、ioctl)映射到驱动程序中的设备硬件特定函数.

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

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