使用Raspberry Pi学习Linux驱动程序开发


13

我想为一些实际的硬件设备编写Linux设备驱动程序。什么样的Raspberry Pi外设很合适?基本上,我需要以下内容:

  1. 对于初学者来说,它必须足够小(最多几个月,几个星期更好)。

  2. 数据表必须可用。起初,我在考虑USB以太网适配器,但看起来数据表非常有限。

有任何想法吗?可能就像使串行控制台通过GPIO工作一样?


2
Linux驱动程序是内核模块,从技术上讲它们根本不需要与硬件有任何关系,因此,您要尝试的第一件事可能是char设备接口-即提供提供可以为了某些琐碎的目的而被读取和/或写入(类似于proc中的内容)。
goldilocks

我做了所有这些,完成了教程,并为伪设备编写了内核模块,并阅读了有关内核/驱动程序开发的书籍。一切都很好,但是现在我想使用真正的硬件
。– ivan

Greg KH 前阵子写了这本书(在某些方面可能有些过时了):linuxjournal.com/article/7353因此,有一些带有公共数据表的USB设备。他在那里有一些逆向工程技巧(我不想用任何过于复杂的方法来做)。GPIO引脚的材料我想通常可以使用现有的I2C等驱动程序来工作,但是您可以忽略它并自己做一些事情。
goldilocks

Answers:


4

与复杂的设备和/或复杂的总线接口时,很难学习编写驱动程序。因此,我建议您使用一些简单且众所周知的设备(忽略其驱动程序在内核中的现有实现),例如通常与微控制器一起使用的I²C/ SPI设备。例如,您可以找到Arduino社区“支持”的任何设备(这意味着它具有库/文档),然后尝试将其与RaspberryPi一起使用。

如果这还不够,或者您不想购买过多的硬件,则可以自己创建一个。只需获取一些微控制器(例如atmega之类的东西),创建一个使其成为某种设备的程序,然后尝试使用Linux驱动程序与其进行接口即可。这样,您可以轻松创建可模拟不同类别设备的程序。而且由于您将自己编写“固件”,因此它将帮助您调试问题。

为此,您需要一些微控制器编程技能,但是学习Arduino的编程并不难,而且我认为无论如何,这对于驱动程序程序员都是有用的知识。


如何通过GPIO引脚在软件中实现串行通信?例如,将串行连接到PC,并尝试至少输出一些内容到控制台。可行吗?
ivan 2013年

@ivan:我不确定我是否理解正确。如果说串行是指UART / rs232,而用软件是指对它进行位冲击,则由于时序限制,这是不可能的。另一方面,如果您要使用RaspberryPi UART硬件(重新)实现Linux串行设备,那当然是可行的。我相信有关此硬件所需的所有信息都可以在BCM2835 ARM Peripherals文档中找到。但是请记住,要使用它,您首先必须禁用内核中的现有驱动程序。
2013年

谢谢,但是您确定无法进行位撞击UART吗?我找到了此链接:ganssle.com/articles/auart.htm,因此对于低波特率和至少仅实现发送部分(看起来更容易),它看起来可能可行。
伊万

@ivan:本文似乎与具有通用操作系统(如Linux)的系统无关。在UART中,您具有真正严格的时序约束,如果没有实时操作系统,这些约束将很难满足。话虽这么说,可能有可能以低波特率执行此操作,但它可能并非真正可靠。
2013年

看起来您是正确的:raspberrypi.stackexchange.com/questions/1987/…(但是那里有一个有趣的解决方案)。再次感谢你的帮助。
ivan

3

我个人将从一个非常简单的设备开始,例如一个或多个直接连接到GPIO引脚的LED。

您可以购买准备插入的设备,也可以自己连接设备。

我之所以建议这样做的原因是,调试驱动程序通常要比普通程序困难得多,因此,入门的简单挑战很有用,然后您可以将该代码用作调试更复杂设备的方法( GPIO引脚以连接到示波器),其中定时很重要。

如果有兴趣,可以在此处找到LedBorg的内核驱动程序,该源应该是一个合理简单的示例,用于定期驱动GPIO引脚。


嗨,@ PiBorg。您能否告诉一些资源来帮助我学习为设备(例如直接连接到GPIO引脚的一个或多个LED)编写简单驱动程序的代码?
萨加尔(Sagar)2015年

0

您可以编写硬件驱动程序的最简单的“设备”(如果您需要硬件驱动程序开发)也可以像LED一样简单(我添加了引号,因为从技术上讲LED不是设备,但它仍然是硬件),如@PiBorg所建议。

其他选择将是一些易于接口的设备/组件,例如光敏电阻,无源红外传感器(简称:PIR),温度传感器,PC风扇(最好是4线风扇,它不仅使您可以监控而且可以控制风扇)。 RPM),LED点矩阵等。基本上,这种简单的设备将使您对硬件的了解最少(以便您可以看到和触摸实际完成的工作),同时,您可以了解许多用于更复杂的设备的主题,其中复杂性主要来自他们使用的协议。

还请注意,您无需花太多精力去研究内核模块。当然,如果您想这样做,没人会阻止您。:)

这是连接无源红外传感器的示例(我将在PIR交付时立即进行测试:3)。您可以开始研究并开始更深入地研究Linux内核,以了解如何创建与PIR配合使用的内核驱动程序。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.