我是嵌入式世界的新手。我试图在使用Yocto项目构建的嵌入式Linux系统上编写设备驱动程序。我不知道linux驱动程序是如何工作的,也不知道如何编写新的驱动程序来测试外围设备。
在我的产品文档中,在第569-1199页中有一个叫做"Linux内核驱动程序“的部分。它描述感兴趣的硬件(PCIE,SPI.)驱动程序的设备树源和变量。我现在所理解的是,产品负责人已经编写了一些函数来访问外围硬件,我所要做的就是通过使用它的.c文件调用一些特殊的函数来达到它们。
我在这里是问堆叠溢出的专业人士,我的想法是正确的还是我在正确的道路上?还有关于为特殊产品编写设备驱动程序的建议吗?
发布于 2019-11-08 07:04:28
我现在所理解的是,产品负责人已经编写了一些函数来访问外围硬件,我所要做的就是通过使用它的.c文件调用一些特殊的函数来达到它们。区块报价
您的理解在一定程度上是正确的--董事会供应商已经编写了驱动程序(用于读取/写入硬件寄存器的功能)。然而,它并不像仅仅链接到驱动程序的c文件那么简单。
在Linux中,使用这些驱动程序(驱动程序API)的机制因用例而异。驱动程序可以从用户空间和内核空间访问。这两个空间都有不同的API来与驱动程序交互。Linux内核驱动程序中有很多分层(抽象),大部分工作是熟悉所有涉及的抽象级别。
在使用用户空间的驱动程序时,最常见的API是使用表示设备的设备文件并对其执行文件操作。例如,usb到串行UART通常由设备文件/dev/ttyUSB0 0表示,并且与驱动程序的所有交互都经过这个设备文件。您可以在Linux上搜索编写字符驱动程序,以便对此有更多了解。本质上,您的Linux内核驱动程序需要创建一个设备文件,并且您需要将在这个设备文件上完成的操作(打开、读取、写入、关闭、ioctl)映射到驱动程序中特定于设备硬件的函数。
Linux在此基础上创建特定的驱动子系统。例如,Linux框架缓冲区子系统,它通常用于在显示器上绘制图形。它也是一个设备文件,但是它的操作对于所有的框架缓冲设备来说都是常见的。设备特定的功能将进入另一个单独的驱动程序,其中包含特定于硬件的位。目标很简单,使通用的可重用代码和特定于硬件的比特保持分离。
如果您想直接传递用户空间API和与其他内核代码或驱动程序的接口,您需要编写一个运行在内核空间中的内核模块,在这里,您可以链接到由公共内核驱动程序从供应商导出的函数。这只是给你一个基本的想法,有许多潜在的细节,一旦你真正开始写一些与驱动程序接口的代码。我建议从简单的字符驱动程序开始。你可以跟着这个教程
发布于 2019-11-08 06:11:58
对于嵌入式Linux新手来说,这是一个相当复杂的任务。我认为您应该从学习Linux内核API开始。你也需要一些电子知识。看看一些Linux内核模块编程指南,并尝试为Linux内核编写一些简单的模块。然后,您可以了解内存映射,以及在Linux内核中内存是如何工作的。您需要这些知识,因为在嵌入式世界中,您需要知道如何访问给定的设备。您还需要知道何时使用“易失性”C语言关键字和更多。有很多东西要学..。
https://stackoverflow.com/questions/58760941
复制相似问题