嵌入式板的写入设备驱动程序

时间:2019-11-08 05:32:30

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

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

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

我在这里向stackoverflow专业人员询问,我是在考虑正确还是在正确的方法上?以及为特殊产品编写设备驱动程序的任何建议?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

  

我现在所了解的是,产品负责人已经编写了一些功能以访问外围硬件,而我要做的就是通过使用其.c文件调用某些特殊功能来达到它们。   引用

您的理解在某种程度上是正确的-电路板供应商已经编写了驱动程序(用于读取/写入硬件寄存器的功能)。但是,它并不像仅链接驱动程序的c文件那样简单。

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

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

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

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