1.1.2 Building support for a media device
第一步是下载内核源代码,可以通过特定于发行版的源文件或内核的主git树下载。
然而需要注意的是,如果:
• 你是个冒险家,想尝试新的东西;
• 如果你要报告一个错误;
• 如果你正在开发新的补丁。
你应该使用主媒体开发树的主分支:
https://git.linuxtv.org/media_tree.git/
在这种情况下,您可以在LinuxTv维基页面上找到一些有用的信息:
How to Obtain, Build and Install V4L-DVB Device Drivers - LinuxTVWiki
1.1.2.1 Configuring the Linux Kernel
你可以通过以下方式访问内核构建选项菜单:
$ 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”选项启用了对远程控制器的核心支持;
“HDMI CEC RC integration”选项启用了HDMI CEC与Linux的集成,允许通过HDMI CEC接收数据,就像它是由直接连接到机器上的遥控器产生的一样。
“HDMI CEC drivers”选项允许选择通过HDMI接口接收和/或传输CEC代码的平台和USB驱动程序。
最后一个选项(多媒体支持)启用了对摄像头、音视频捕捉设备和电视的支持。
媒体子系统支持可以与主内核一起构建,也可以作为模块构建。对于大多数用例,最好将其构建为模块。
注意:内核不需要使用菜单提供了一个脚本,允许直接启用配置选项。要使用内核模块启用媒体支持和远程控制器支持,您可以使用以下命令:
$ scripts/config -m RC_CORE
$ scripts/config -m MEDIA_SUPPORT
Media dependencies
需要注意的是,从干净配置启用上述选项通常是不够的。媒体子系统依赖于其他几个Linux核心支持才能工作。
例如,大多数媒体设备使用串行通信总线与某些外围设备进行通信。这种总线称为I2C(Inter-Integrated Circuit)。为了能够构建对这种硬件的支持,应该启用I2C总线支持,可以通过菜单或以下命令来实现:
./scripts/config -m I2C
另一个例子:远程控制器核心需要输入设备支持,可以通过以下命令启用其支持:
./scripts/config -m INPUT
根据您要启用的特定驱动程序,可能还需要其他的核心功能(例如PCI和/或USB支持)。
Enabling Remote Controller Support
远程控制器菜单允许选择特定设备的驱动程序。其菜单如下所示:
--- 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内核将识别的协议。除非您要禁用某个特定解码器,否则建议保持所有子选项启用。
“远程控制器设备”选项允许您选择需要支持您的设备所需的驱动程序。
同样的配置也可以通过脚本/配置脚本来设置。例如,为了支持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
Enabling HDMI CEC Support
当驱动程序需要时,HDMI CEC支持会自动设置。因此,您只需要为需要支持它的显卡或现有的HDMI驱动程序之一启用支持即可。
专门的HDMI驱动程序可在HDMI CEC驱动程序菜单中找到:
--- 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
Enabling Media Support
“媒体”菜单的选项比“远程控制器”菜单的选项更多。一旦选择了“媒体”菜单,您应该会看到以下选项:
--- 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平台构建驱动程序,否则强烈建议保持“自动选择辅助驱动程序”选项打开,因为它将自动选择所需的I2C辅助驱动程序。
现在有两种选择媒体设备驱动程序的方法,如下所述。
Filter media drivers menu
此菜单旨在为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 --->
选择所需的过滤器后,与过滤条件匹配的驱动程序将在“媒体支持”->“媒体驱动程序”子菜单中可用。
Media Core Support menu without filtering
如果禁用“过滤媒体驱动程序”菜单,则应显示所有可用于您的系统且其依赖项已满足的驱动程序在“媒体驱动程序”菜单中。
但是请注意,您首先必须确保“媒体核心支持”菜单具备驱动程序所需的所有核心功能,否则相应的设备驱动程序将不会显示。
Example
为了启用模块化媒体核心模块的其中一个在此表中列出的板子的支持,`.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
1.1.2.2 Building and installing a new Kernel
一旦.config文件中拥有了所需的所有内容,构建的关键步骤只需要运行make命令:
$ make
然后安装新内核和模块:
$ sudo make modules_install
$ sudo make install
1.1.2.3 Building just the new media drivers and core
从开发树运行新的开发内核通常比较危险,因为它可能有实验性的更改,可能会存在一些bug。因此,有一些方法可以使用替代树来仅构建新驱动程序。
有一个名为Linux内核后向移植项目(Linux Kernel backports project),其中包含了新的驱动程序,面向稳定内核进行编译。
LinuxTV开发人员负责维护媒体子系统,他们还维护了一个后向移植树,其中只包含每天从最新内核更新的媒体驱动程序。这样的树可在以下网址获取:media_build.git - Build system to compile media subsystem on legacy kernels
需要注意的是,虽然使用 `media_build` 树进行测试目的应该相对安全,但不能保证它能在任意内核上工作(甚至能否成功构建)。这个树是基于“尽力而为”的原则进行维护,只要时间允许我们修复其中的问题。
如果您在使用过程中发现了任何问题,请随时将补丁提交到Linux媒体子系统的邮件列表:media@vger.kernel.org。如果您提交了一个新的媒体构建补丁,请在电子邮件主题中添加`[PATCH media-build]`。
在使用之前,您需要运行以下命令:
$ ./build
注意:
1)如果`media-build`树被更新,您可能需要运行两次。
2)如果您曾经为不同于当前使用的内核版本构建过它,则需要使用`make distclean`进行清理。
3)默认情况下,它将使用与您正在运行的内核相同的配置选项。
为了选择不同的驱动程序或不同的配置选项,请使用:
$ make menuconfig
然后,你可以编译并安装新内核:
$ make && sudo make install
这会覆盖先前内核使用的媒体驱动程序。