6

所以我在摆弄 Raspberry Pi,我突然想到“所有这些驱动程序来自哪里”。就像专门针对我在它们身上使用的 SNES 控制器一样……到底有人是怎么想出如何写的。

我对 C 非常了解,而且 C++...好吧。但这一直是我有点想的事情。这很酷,因为它足够低,可以理解硬件方面可能发生的事情......但也很适合了解操作系统。

我从哪里开始这样的事情?我猜对 Windows 这样做会有所不同。

谢谢

4

2 回答 2

4

在我看来,这里确实有两个问题实际上并没有太大的关系。

第一个是“Linux 对设备驱动程序有什么要求?” 这几乎总是会通过阅读文档来回答。尽管设备驱动程序文档可能(可以说)不如编写普通程序的文档那么彻底、完整、易于阅读等,但它仍然相当不错。与普通代码最大的区别可能是调试,这通常是通过简单地用printk.

另一个问题类似于:“您如何确定特定硬件(如 SNES 控制器)使用什么协议(或“协议”)。当您开发普通硬盘驱动器或键盘之类的东西时,您可以只需遵循文档即可。您可能(至少在我的经验中经常这样做)发现您需要补偿硬件中的一些错误,但除此之外,它(再次)是相当正常的编程。在相当多的几个中最大的挑战这些情况只是决定如何将相关的特定设备呈现给系统的其余部分。对于像硬盘驱动器这样的东西通常很容易,但对于像人机界面设备这样的东西,它可能更具挑战性(例如,您是否想将其呈现为自身,或者你想模拟一些现有类型的设备,比如键盘或鼠标?)

对于没有真正记录的硬件,事情可能会变得更加困难。查看逻辑信号的真正通用工具是逻辑分析仪。如果您有使用知名硬件接口的东西(例如 PS/2 键盘/鼠标、USB、SATA),您可以找到更专业的工具(和/或逻辑分析仪的附加组件),让生活变得更美好更轻松。像 NES 或 SNES 控制器之类的东西几乎肯定会使用专有接口,因此对于这些,您最终可能会使用逻辑分析仪。幸运的是,它们也可能是一个非常狭窄、缓慢的接口,因此逻辑分析仪不需要非常快或支持大量通道。

使用逻辑分析仪,您可以查看所有单独的信号,但对于专有接口,您几乎可以确定哪些信号在做什么。在典型情况下,您至少会拥有一些相当明显的信息:电源、接地,很可能是时钟,等等。在很多情况下,您很快就会发现,即使它没有公开记录,它也可能遵循一些众所周知的协议,如 I 2 C、SPI 等。

于 2013-11-04T05:08:07.023 回答
2

Linux 设备驱动程序是您想要的书。

在您等待本书到来时,我可以告诉您,了解硬件如何工作以及 Linux 内核如何工作只是成功的一半。您还需要了解特定设备的硬件级接口。希望你能找到这方面的文档,但这可能很困难。

有关某人如何通过查看来自 Windows 驱动程序的命令来提出 Linux 驱动程序的示例,请参阅此相关问题: 如何为 Linux 编写低级设备驱动程序?

对于 Windows,该过程实际上并没有太大的不同。所有概念仍然相同,因为它是相同的硬件。当然,差异在于细节。

于 2013-11-04T05:04:03.573 回答