图书前言

前    言

Linux是世界上发展最快的操作系统之一,在过去的几年里,Linux内核得到了显著的发展,可以支持各种嵌入式设备,其子系统也得到了改进,并增加了许多新功能。

本书提供了有关Linux内核主题的较为全面的讨论(例如,市面图书中通常较少涉及的视频和音频框架,本书也有专门章节进行介绍)。我们将深入研究一些最复杂和最具影响力的Linux内核框架,如PCI、用于SoC的ALSA和Video4Linux2(V4L2),并在此过程中提供了一些专业技巧提示和最佳实践。

除此之外,本书还将讨论如何利用NVMEM和Watchdog(看门狗)等框架,以及如何处理特殊设备类型,如多功能设备(multi-function device,MFD)等。

通读本书之后,相信你能够编写非常实用可靠的设备驱动程序,并将它们与一些最复杂的Linux内核框架集成,包括V4L2和ALSA SoC。

本书读者

本书主要面向嵌入式爱好者和开发人员、Linux系统管理员和内核黑客。无论你是软件开发人员、系统架构师还是制造商(电子爱好者),只要你希望深入了解Linux驱动程序开发,那么本书就适合你。

内容介绍

本书共分为3篇14章,具体内容如下。

  第1篇为“用于嵌入式设备驱动程序开发的内核核心框架”,包括第1~4章。

  第1章为“嵌入式开发人员需要掌握的Linux内核概念”,详细介绍了内核锁API,Linux内核中的等待、感知和阻塞,工作延迟机制和Linux内核中断管理等。

  第2章为“regmap API应用”,简要介绍了regmap及其数据结构、regmap和IRQ管理、链接IRQ、regmap IRQ API和数据结构等,并演示了如何利用regmap API来简化中断管理和抽象寄存器访问。

  第3章为“深入研究MFD子系统和syscon API”,重点介绍了Linux内核中的MFD驱动程序及其API和结构,并讨论了syscon和simple-mfd辅助函数。

  第4章为“通用时钟框架”,详细解释了Linux内核时钟框架,并探讨了生产者和使用者设备驱动程序,以及它们的设备树绑定。

  第2篇为“嵌入式Linux系统中的多媒体和节能”,包括第5~10章。

  第5章为“ALSA SoC框架—利用编解码器和平台类驱动程序”,讨论了编解码器和平台设备的ALSA驱动程序开发,并介绍了kcontrol和数字音频电源管理(digital audio power management,DAPM)等概念。

  第6章为“ALSA SoC框架—深入了解机器类驱动程序”,深入研究了 ALSA机器类驱动程序开发,并展示了如何将编解码器和平台绑定在一起以及如何定义音频路由。

  第7章为“V4L2和视频采集设备驱动程序揭秘”,描述了V4L2的关键概念。本章侧重于桥接视频设备,介绍了子设备的概念,并涵盖了它们各自的设备驱动程序。

  第8章为“集成V4L2异步和媒体控制器框架”,详细介绍了异步探测的概念,这样你就不必关心桥接设备和子设备探测顺序。此外,本章还介绍了媒体控制器框架,以提供自定义的视频路由和视频管道。

  第9章为“从用户空间利用V4L2 API”,逐一枚举和介绍了用户空间V4L2 API。本章首先讨论了如何编写C语言代码,以便从视频设备中打开、配置和获取数据,然后演示了如何通过用户空间视频相关工具(如v4l2-ctl和media-ctl)来编写尽可能少的代码。

  第10章为“Linux内核电源管理”,讨论了基于Linux系统的电源管理,并介绍了如何编写具有功耗意识的设备驱动程序。

  第3篇为“与其他Linux内核子系统保持同步”,包括第11~14章。

  第11章为“编写PCI设备驱动程序”,详细阐释了PCI子系统并介绍了其Linux内核的实现。本章还演示了如何编写PCI设备驱动程序。

  第12章为“利用NVMEM框架”,描述了Linux非易失性内存(Non-Volatile Memory,NVEM)子系统。本章阐释了如何编写提供者和使用者驱动程序以及它们的设备树绑定,并展示了如何从用户空间利用此类设备。

  第13章为“看门狗设备驱动程序”,提供了对Linux内核看门狗子系统的准确描述。本章首先介绍了看门狗设备驱动程序,然后逐步阐释了子系统的核心,讨论了一些关键概念(如预超时和调控器)。最后,还介绍了如何从用户空间管理子系统。

  第14章为“Linux内核调试技巧和最佳实践”,重点介绍了使用Linux内核嵌入式工具(如 Ftrace和oops消息分析)最常用的Linux内核调试和跟踪技术。

充分利用本书

为了充分利用本书,你需要一些C语言和系统编程知识。此外,本书内容组织基于假设你熟悉Linux系统及其大部分基本命令。

本书软硬件和操作系统需求如表P-1所示。

表P-1  本书操作系统需求

本书涵盖的软硬件 操作系统需求

一台具有良好网络带宽和足够磁盘空间和内存的计算机,可下载和构建Linux内核 最好是任何基于Debian的发行版

市场上的任何Cortex-A嵌入式板(如Udoo、Raspberry Pi和BeagleBone) Yocto/Buildroot或任何特定于供应商的操作系统

表P-1中未列出的任何必要软件包将在具体章节中介绍。

下载彩色图像

我们还提供了一个PDF文件,其中包含本书中使用的屏幕截图/图表的彩色图像。可以通过以下地址下载:

http://www.packtpub.com/sites/default/files/downloads/9781789342048_ColorImages.pdf

本书约定

本书中使用了许多文本约定。

(1)Code In Text:表示文本中的代码字、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟URL、用户输入和Twitter句柄等。以下段落就是一个示例:

以下链接可能有助于你了解可能的值:

https://linuxtv.org/downloads/v4l-dvb-apis/userspace-api/

mediactl/media-types.html

(2)有关代码块的设置如下所示:

static int fake_probe( struct i2c_client *client,

const struct i2c_device_id *id)

{

     [...]

    mutex_init(&data->mutex); 

     [...]

}

(3)当我们希望让你注意代码块的特定部分时,相关行或项目以粗体字给出:

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;

}

(4)任何命令行输入或输出都采用如下所示的粗体代码形式:

# echo 1 >/sys/module/printk/parameters/time

# cat /sys/module/printk/parameters/time

(5)术语或重要单词采用中英文对照形式,在括号内保留其英文原文。示例如下:

随着时间的推移,媒体支持已成为系统级芯片(System on Chip,SoC)的必需品和销售卖点,它变得越来越复杂。这些媒体IP核心的复杂性使得获取传感器数据需要由软件设置整个管道(由多个子设备组成)。基于设备树的系统的异步特性意味着这些子设备的设置和探测并不简单,异步框架(Async Framework)由此应运而生。

(6)本书还使用了以下两个图标。

 表示警告或重要的注意事项。

 表示提示或小技巧。