2. 构建媒体设备支持

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

然而请注意,如果

  • 你是个勇者,想尝试新事物;

  • 如果你想报告一个 bug;

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

你应该使用主媒体开发树的 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  --->

Remote Controller support 选项启用遥控器的核心支持[2]

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

HDMI CEC drivers 选项允许选择通过 HDMI 接口接收和/或传输 CEC 代码的平台和 USB 驱动[3]

最后一个选项 (Multimedia support) 启用对摄像头、音视频采集卡和电视的支持。

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

注意

内核提供了一个脚本,而不是使用菜单,它允许直接启用配置选项。要使用内核模块启用媒体支持和遥控器支持,你可以使用

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

2.1.1. 媒体依赖项

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

例如,大多数媒体设备使用串行通信总线与某些外设通信。这种总线称为 I²C (Inter-Integrated Circuit)。为了能够构建对此硬件的支持,必须启用 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  --->

Compile Remote Controller keymap modules 选项为几个流行的遥控器创建按键映射。

LIRC user interface 选项在使用 lirc 程序时添加增强功能,通过启用一个 API,允许用户空间从遥控器接收原始数据。

Support for eBPF programs attached to lirc devices 选项允许使用特殊程序(称为 eBPF),这些程序将允许应用程序向 Linux 内核添加额外的遥控器解码功能。

Remote controller decoders 选项允许选择 Linux 内核将识别的协议。除非你想禁用某个特定解码器,否则建议保持所有子选项启用。

Remote Controller devices 允许你选择支持你的设备所需的驱动。

相同的配置也可以通过 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 drivers 菜单中可用[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 平台构建驱动,强烈建议保持 Autoselect ancillary drivers 选项开启,因为它将自动选择所需的 I²C 辅助驱动。

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

2.1.4.1. Filter media drivers 菜单

此菜单旨在方便 PC 和笔记本电脑硬件的设置。它通过让用户指定所需的媒体驱动类型来工作,选项如下

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

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

一旦此菜单中的选项被选中,构建系统将自动选择所需的核心驱动以支持所选功能。

注意

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

如果你有一张混合卡,你可能需要在菜单中同时启用 Analog TVDigital TV

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

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

一旦你选择了所需的过滤器,符合过滤条件的驱动将在 Media support->Media drivers 子菜单中可用。

2.1.4.2. 不带过滤的 Media Core Support 菜单

如果你禁用 Filter media drivers 菜单,所有符合你系统依赖性的可用驱动都将在 Media drivers 菜单中显示。

然而请注意,你应该首先确保 Media Core Support 菜单包含了你的驱动所需的所有核心功能,否则相应的设备驱动将不会显示。

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. 只构建新的媒体驱动和核心

从开发树运行新的开发内核通常有风险,因为它可能包含实验性更改,可能存在 bug。因此,有一些方法可以使用替代树来只构建新驱动。

有一个 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

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