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
如果要使用某些可能依赖于远程控制器核心支持的电视卡驱动程序,也应启用 远程控制器支持
。
请注意,DRM 子系统也有使用媒体 HDMI CEC 支持的 GPU 驱动程序。
这些特定于 GPU 的驱动程序通过 设备驱动程序
下的 图形支持
菜单选择。
当 GPU 驱动程序支持 HDMI CEC 时,它将自动在媒体子系统启用 CEC 核心支持。
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
以上内容只是一个示例。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 平台构建驱动程序,否则强烈建议保持 自动选择辅助驱动程序
选项开启,因为它会自动选择所需的 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. 仅构建新的媒体驱动程序和核心¶
从开发树运行新的开发内核通常是有风险的,因为它可能包含可能存在错误的的实验性更改。因此,有一些方法可以使用备用树仅构建新的驱动程序。
有一个 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
这将覆盖你的内核先前使用的媒体驱动程序。