Linux 是世界上发展最快的操作系统之一,在过去的几年中,随着其改进的子系统和许多新功能,Linux 内核已经显著地发展为支持各种各样的嵌入式设备。
精通 Linux 设备驱动开发全面涵盖了视频和音频框架等通常不涉及的内核主题。 您将深入研究一些最复杂和最有影响力的 Linux 内核框架,例如 PCI、ALSA for SoC 和 Video4Linux2,并在此过程中获得专家提示和最佳实践。 除此之外,您还将学习如何利用 NVMEM 和 WatchDog 等框架。 一旦本书让您开始使用 Linux 内核帮助器,您将逐渐了解如何使用特殊的设备类型,如多功能设备(MFD),然后是视频和音频设备驱动。
到本书结束时,您将能够编写坚如磐石的设备驱动,并将它们与一些最复杂的 Linux 内核框架集成在一起,包括 V4L2 和 ALSA SoC。
本书主要面向嵌入式爱好者和开发人员、Linux 系统管理员和内核黑客。 无论您是软件开发人员、系统架构师还是制造商(电子产品爱好者),如果您想深入研究 Linux 驱动开发,这本书都适合您。
第 1 章,面向嵌入式开发人员的 Linux 内核概念介绍了用于锁定、阻塞 I/O、延迟工作和中断管理的 Linux 内核帮助器。
第 2 章,利用 Regmap API 和简化代码概述 Regmap 框架,并说明如何利用其 API 简化中断管理和抽象寄存器访问。
第 3 章深入研究 MFD 子系统和 Syscon API,重点介绍 Linux 内核中的 MFD 驱动、它们的 API 和它们的结构,并介绍syscon
和simple-mfd
帮助器。
第 4 章,冲击公共时钟框架解释了 Linux 内核时钟框架,并探索了生产者和消费者设备驱动,以及它们的设备树绑定。
第 5 章,ALSA SoC 框架-利用编解码器和平台类驱动,讨论编解码器和平台设备的 ALSA 驱动开发,并介绍kcontrol
和数字音频电源管理(DAPM)等概念。
第 6 章,ALSA SoC 框架-深入研究机器类驱动,深入研究 ALSA 机器类驱动开发,并向您展示如何将编解码器和平台绑定在一起,以及如何定义音频路由。
第 7 章,揭开 V4L2 和视频捕获设备驱动的神秘面纱描述了 V4L2 的关键概念。 它主要介绍网桥视频设备,引入子设备的概念,并介绍它们各自的设备驱动。
第 8 章,与 V4L2 异步和媒体控制器框架集成,介绍了异步探测的概念,因此您不必关心网桥和子设备探测顺序。 最后,本章介绍了媒体控制器框架,以提供视频路由和视频管道定制。
第 9 章,利用用户空间的 V4L2 API结束了我们关于 V4L2 的教学系列,并从用户空间处理 V4L2。 它首先教您如何编写 C 代码,以便从视频设备打开、配置和获取数据。 然后向您展示如何利用与用户空间视频相关的工具(如v4l2-ctl
和media-ctl
)编写尽可能少的代码。
第 10 章,Linux 内核电源管理讨论基于 Linux 的系统上的电源管理,并教您如何编写节能设备驱动。
第 11 章,编写 PCI 设备驱动处理 PCI 子系统,并向您介绍其 Linux 内核实现。 本章还介绍如何编写 PCI 设备驱动。
第 12 章,利用 NVMEM 框架描述了 Linux非易失性存储器(NVEM)子系统。 它首先教您如何编写提供者和使用者驱动以及它们的设备树绑定。 然后,它将向您展示如何最大限度地利用设备的用户空间。
第 13 章,看门狗设备驱动提供了 Linux 内核看门狗子系统的准确描述。 它首先向您介绍 Watchdog 设备驱动,然后逐步带您了解子系统的核心,并介绍一些关键概念,如预超时和调控器。 接近尾声时,本章将教您如何从用户空间管理子系统。
第 14 章,Linux 内核调试提示和最佳实践重点介绍了使用内核嵌入式工具(如ftrace
和 OOPS 消息分析)最常用的 Linux 内核调试和跟踪技术。
为了最大限度地利用本书,需要一些 C 和系统编程知识。 此外,本书的内容假定您熟悉 Linux 系统及其大部分基本命令。
上表中未列出的任何必要的软件包将在各自的章节中进行说明。
如果您使用的是这本书的电子版,我们建议您自己键入代码。 这样做可以帮助您避免与复制和粘贴代码相关的任何潜在错误。
我们还提供了一个 PDF 文件,其中包含本书中使用的屏幕截图/图表的彩色图像。 您可以在此处下载:http://www.packtpub.com/sites/default/files/downloads/9781789342048_ColorImages.pdf。
本书中使用了许多文本约定。
Code in text
:指示文本中的代码字、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 句柄。 这里有一个例子:“这里没有使用任何request_irq()
系列方法请求父 IRQ,因为gpiochip_set_chained_irqchip()
将在幕后调用irq_set_chained_handler_and_data()
。”
代码块设置如下:
static int fake_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
[...]
mutex_init(&data->mutex);
[...]
}
当我们希望您注意代码块的特定部分时,相关行或项将以粗体显示:
static int __init my_init(void)
{
pr_info('Wait queue example\n');
INIT_WORK(&wrk, work_handler);
schedule_work(&wrk);
pr_info('Going to sleep %s\n', __FUNCTION__);
wait_event_interruptible(my_wq, condition != 0);
pr_info('woken up by the work job\n');
return 0;}
任何命令行输入或输出都如下所示:
# echo 1 >/sys/module/printk/parameters/time
# cat /sys/module/printk/parameters/time
粗体:表示您在屏幕上看到的新术语、重要单词或单词。 这里有一个例子:“引入了Simple-mfdhelper 来处理零 conf/hacks 子设备注册,引入了syscon来与其他设备共享设备的内存区域。”
提示或重要说明
看起来就像这样。
欢迎读者的反馈。
一般反馈:如果您对本书的任何方面有疑问,请在邮件主题中提及书名,并向我们发送电子邮件至[email protected]
。
勘误表:虽然我们已经竭尽全力确保内容的准确性,但错误还是会发生。 如果您在这本书中发现了错误,请向我们报告,我们将不胜感激。 请访问www.Packtpub.com/support/errata,选择您的图书,单击勘误表提交表链接,然后输入详细信息。
盗版:如果您在互联网上遇到任何形式的非法复制我们的作品,请您提供地址或网站名称,我们将不胜感激。 请拨打[email protected]
与我们联系,并提供该材料的链接。
如果您有兴趣成为一名作者:如果有一个您擅长的主题,并且您有兴趣撰写或投稿一本书,请访问Auths.Packtpub.com。
请留下评论。 一旦你阅读并使用了这本书,为什么不在你购买它的网站上留下评论呢? 这样,潜在读者就可以看到并使用您不偏不倚的意见来做出购买决定,我们 Packt 可以了解您对我们产品的看法,我们的作者也可以看到您对他们的书的反馈。 谢谢!
有关 Packt 的更多信息,请访问Packt.com。