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
如果你想使用某些可能依赖于遥控器核心支持的电视卡驱动,也应该启用 Remote Controller support
。
请注意,DRM 子系统也有使用媒体 HDMI CEC 支持的 GPU 驱动。
这些 GPU 特定驱动通过 Device Drivers
下的 Graphics support
菜单选择。
当一个 GPU 驱动支持 HDMI CEC 时,它将自动启用媒体子系统中的 CEC 核心支持。
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
以上内容仅为示例。HDMI 设备的实际选项取决于系统架构,并可能在新的内核版本中有所不同。
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.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
注意
如果
media-build
树更新了,你可能需要运行两次;如果你过去为与当前使用的内核版本不同的内核版本构建过它,你可能需要执行
make distclean
;默认情况下,它将使用与你正在运行的内核中定义的媒体相同的配置选项。
要选择不同的驱动或不同的配置选项,请使用
$ make menuconfig
然后,你可以构建并安装新驱动
$ make && sudo make install
这将覆盖你的内核之前使用的媒体驱动。