2. 构建媒体设备支持

第一步是下载内核的源代码,可以通过特定于发行版的源文件或通过内核的主 git 树[1]

请注意,但是,如果

  • 你是一个勇敢的人,想尝试新东西;

  • 如果你想报告一个错误;

  • 如果你正在开发新的补丁

你应该使用主要的媒体开发树 master 分支

在这种情况下,你可以在LinuxTv wiki 页面找到一些有用的信息

2.1. 配置 Linux 内核

你可以使用以下命令访问内核构建选项的菜单

$ make menuconfig

然后,选择所有需要的选项并退出,保存配置。

更改后的配置将在 .config 文件中。它看起来像

...
# CONFIG_RC_CORE is not set
# CONFIG_CEC_CORE is not set
CONFIG_MEDIA_SUPPORT=m
CONFIG_MEDIA_SUPPORT_FILTER=y
...

媒体子系统由这些菜单配置选项控制

Device Drivers --->
    <M> Remote Controller support  --->
    [ ] HDMI CEC RC integration
    [ ] Enable CEC error injection support
    [*] HDMI CEC drivers  --->
    <*> Multimedia support  --->

远程控制器支持 选项启用对远程控制器的核心支持[2]

HDMI CEC RC 集成 选项启用 HDMI CEC 与 Linux 的集成,允许通过 HDMI CEC 接收数据,就像数据是由直接连接到机器的遥控器产生的一样。

HDMI CEC 驱动程序 选项允许选择通过 HDMI 接口接收和/或发送 CEC 代码的平台和 USB 驱动程序[3]

最后一个选项(多媒体支持)启用对相机、音频/视频采集器和电视的支持。

媒体子系统支持可以与主内核一起构建,也可以作为模块构建。对于大多数用例,最好将其构建为模块。

注意

除了使用菜单之外,内核还提供了一个脚本,允许直接启用配置选项。要使用内核模块启用媒体支持和远程控制器支持,可以使用

$ scripts/config -m RC_CORE
$ scripts/config -m MEDIA_SUPPORT

2.1.1. 媒体依赖项

应该注意的是,从干净的配置中启用上述功能通常是不够的。媒体子系统依赖于其他几个 Linux 核心支持才能工作。

例如,大多数媒体设备使用串行通信总线来与某些外围设备进行通信。这种总线称为 I²C(集成电路间)。为了能够为此类硬件构建支持,应该启用 I²C 总线支持,可以通过菜单或使用以下命令:

./scripts/config -m I2C

另一个例子:远程控制器核心需要输入设备的支持,可以使用以下命令启用:

./scripts/config -m INPUT

根据你要启用的特定驱动程序,可能还需要其他核心功能(如 PCI 和/或 USB 支持)。

2.1.2. 启用远程控制器支持

远程控制器菜单允许选择特定设备的驱动程序。它的菜单如下所示:

--- Remote Controller support
<M>   Compile Remote Controller keymap modules
[*]   LIRC user interface
[*]     Support for eBPF programs attached to lirc devices
[*]   Remote controller decoders  --->
[*]   Remote Controller devices  --->

编译远程控制器键映射模块 选项为几种流行的遥控器创建键映射。

LIRC 用户界面 选项在使用 lirc 程序时添加了增强的功能,通过启用 API,允许用户空间从远程控制器接收原始数据。

支持附加到lirc设备的eBPF程序 选项允许使用特殊程序(称为 eBPF),该程序允许应用程序向 Linux 内核添加额外的远程控制器解码功能。

远程控制器解码器 选项允许选择 Linux 内核将识别的协议。除非你想禁用某些特定的解码器,否则建议启用所有子选项。

远程控制器设备 允许你选择支持你的设备所需的驱动程序。

相同的配置也可以通过 script/config 脚本进行设置。例如,为了支持 ITE 遥控器驱动(在 Intel NUC 和一些 ASUS x86 台式机上找到),你可以这样做:

$ scripts/config -e INPUT
$ scripts/config -e ACPI
$ scripts/config -e MODULES
$ scripts/config -m RC_CORE
$ scripts/config -e RC_DEVICES
$ scripts/config -e RC_DECODERS
$ scripts/config -m IR_RC5_DECODER
$ scripts/config -m IR_ITE_CIR

2.1.3. 启用 HDMI CEC 支持

当驱动程序需要时,HDMI CEC 支持会自动设置。因此,你只需要启用需要它的显卡的支持,或者通过现有的 HDMI 驱动程序之一启用支持即可。

HDMI 特定驱动程序可在 HDMI CEC 驱动程序 菜单中找到[4]

--- HDMI CEC drivers
< >   ChromeOS EC CEC driver
< >   Amlogic Meson AO CEC driver
< >   Amlogic Meson G12A AO CEC driver
< >   Generic GPIO-based CEC driver
< >   Samsung S5P CEC driver
< >   STMicroelectronics STiH4xx HDMI CEC driver
< >   STMicroelectronics STM32 HDMI CEC driver
< >   Tegra HDMI CEC driver
< >   SECO Boards HDMI CEC driver
[ ]     SECO Boards IR RC5 support
< >   Pulse Eight HDMI CEC
< >   RainShadow Tech HDMI CEC

2.1.4. 启用媒体支持

“媒体”菜单比“遥控器”菜单有更多选项。选择后,您应该看到以下选项:

--- Media support
[ ] Filter media drivers
[*] Autoselect ancillary drivers
    Media device types --->
    Media core support --->
    Video4Linux options --->
    Media controller options --->
    Digital TV options --->
    HDMI CEC options --->
    Media drivers --->
    Media ancillary drivers --->

除非你确切知道自己在做什么,或者你想为 SoC 平台构建驱动程序,否则强烈建议保持 自动选择辅助驱动程序 选项开启,因为它会自动选择所需的 I²C 辅助驱动程序。

现在有两种选择媒体设备驱动程序的方式,如下所述。

2.1.4.1. 筛选媒体驱动程序 菜单

此菜单旨在简化 PC 和笔记本电脑硬件的设置。它的工作原理是让用户指定所需的媒体驱动程序类型,选项如下:

[ ] Cameras and video grabbers
[ ] Analog TV
[ ] Digital TV
[ ] AM/FM radio receivers/transmitters
[ ] Software defined radio
[ ] Platform-specific devices
[ ] Test drivers

因此,如果你只想添加对相机或视频采集器的支持,只需选择第一个选项。允许多个选项。

选择此菜单上的选项后,构建系统将自动选择所需的核心驱动程序,以支持所选功能。

注意

大多数电视卡都是混合的:它们同时支持模拟电视和数字电视。

如果你有混合卡,你可能需要在菜单中同时启用 模拟电视数字电视

使用此选项时,媒体支持核心功能的默认设置通常足以提供驱动程序的基本功能。但是,你可以使用以下每个 媒体支持 子菜单下的设置,手动启用一些所需的额外(可选)功能。

Media core support --->
Video4Linux options --->
Media controller options --->
Digital TV options --->
HDMI CEC options --->

选择所需的筛选器后,与筛选条件匹配的驱动程序将在 媒体支持->媒体驱动程序 子菜单中可用。

2.1.4.2. 不进行筛选的 媒体核心支持 菜单

如果禁用 筛选媒体驱动程序 菜单,则系统可用的、满足其依赖关系的所有驱动程序都应显示在 媒体驱动程序 菜单中。

但是请注意,你应首先确保 媒体核心支持 菜单具有驱动程序所需的所有核心功能,否则将不会显示相应的设备驱动程序。

2.1.5. 示例

为了为 此表 上列出的其中一个板启用模块化支持,并使用模块化媒体核心模块,.config 文件应包含以下行:

CONFIG_MODULES=y
CONFIG_USB=y
CONFIG_I2C=y
CONFIG_INPUT=y
CONFIG_RC_CORE=m
CONFIG_MEDIA_SUPPORT=m
CONFIG_MEDIA_SUPPORT_FILTER=y
CONFIG_MEDIA_ANALOG_TV_SUPPORT=y
CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y
CONFIG_MEDIA_USB_SUPPORT=y
CONFIG_VIDEO_CX231XX=y
CONFIG_VIDEO_CX231XX_DVB=y

2.2. 构建和安装新内核

一旦 .config 文件包含所需的一切,构建所需的全部操作就是运行 make 命令

$ make

然后安装新内核及其模块

$ sudo make modules_install
$ sudo make install

2.3. 仅构建新的媒体驱动程序和核心

从开发树运行新的开发内核通常是有风险的,因为它可能包含可能存在错误的的实验性更改。因此,有一些方法可以使用备用树仅构建新的驱动程序。

有一个 Linux 内核反向移植项目,其中包含旨在针对稳定内核编译的较新驱动程序。

LinuxTV 开发人员负责维护媒体子系统,他们还维护一个反向移植树,其中包含每天从最新内核更新的媒体驱动程序。此树可在以下位置获得:

https://git.linuxtv.org/media_build.git/

应该注意的是,虽然为测试目的使用 media_build 树应该相对安全,但不保证它会在随机内核上工作(甚至构建)。维护此树是采用“尽力而为”的原则,因为我们有时间来解决其中的问题。

如果你发现它有任何问题,请随时将补丁提交到 Linux 媒体子系统的邮件列表:media@vger.kernel.org。如果你提交 media-build 的新补丁,请在电子邮件的主题中添加 [PATCH media-build]

在使用之前,你应该运行

$ ./build

注意

  1. 如果 media-build 树已更新,你可能需要运行两次;

  2. 如果过去为与你当前使用的内核版本不同的内核版本构建过它,你可能需要执行 make distclean

  3. 默认情况下,它将对媒体使用与正在运行的内核上定义的相同的配置选项。

为了选择不同的驱动程序或不同的配置选项,请使用

$ make menuconfig

然后,你可以构建并安装新的驱动程序

$ make && sudo make install

这将覆盖你的内核先前使用的媒体驱动程序。