ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux 内核 Media 子系统编译指南:从 Kconfig 选项到 cx231xx 模块化 TV 驱动

Linux 内核 Media 子系统编译指南:从 Kconfig 选项到 cx231xx 模块化 TV 驱动 Linux 内核 Media 子系统编译指南从 Kconfig 选项到 cx231xx 模块化 TV 驱动【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux本文以 Linux 内核官方文档 Building support for a media device 为核心系统讲解如何为摄像头、电视卡、收音机等媒体设备配置、编译并安装内核支持涵盖make menuconfig与scripts/config两种配置方式、Media/RC/CEC 三大配置块的完整选项语义、I²C/INPUT 等依赖项以及如何单独构建 media 驱动backports 方式。读完本篇你将能够独立产出一个包含指定媒体驱动的内核并理解每个 Kconfig 选项在内核源码中的真实依赖关系。一、获取源码主线树与媒体开发树文档首先指出内核源码可以从发行版提供的源包或内核主 git 树获取。但对以下三类场景文档明确建议使用 media 子系统的主开发树master分支想尝试新特性、愿意承担风险的实验者需要报告 bug 的开发者正在编写新补丁的贡献者。该开发树位于 LinuxTV 基础设施上git.linuxtv.org/media.git配套的操作说明可在 LinuxTV wiki 中参考。对于只想构建当前仓库版本的用户直接使用仓库本身即本文对应的 Linux 内核源码树即可。二、配置内核menuconfig 与 scripts/config 双通道2.1 使用 make menuconfig 图形菜单最直观的方式是打开内核构建选项菜单$ make menuconfig选择所需选项后保存退出修改结果落在内核源码根目录的.config文件中形如... # CONFIG_RC_CORE is not set # CONFIG_CEC_CORE is not set CONFIG_MEDIA_SUPPORTm CONFIG_MEDIA_SUPPORT_FILTERy ...2.2 使用 scripts/config 脚本直接设置除菜单外内核提供 scripts/config 脚本可以直接以命令行方式启用配置项适合脚本化批量配置。启用媒体支持与遥控器支持并编译为模块的最小命令为$ scripts/config -m RC_CORE $ scripts/config -m MEDIA_SUPPORT其中-m表示设置为模块M。2.3 顶层菜单Media 子系统的四个入口媒体相关支持由Device Drivers下的这组选项控制Device Drivers --- M Remote Controller support --- [ ] HDMI CEC RC integration [ ] Enable CEC error injection support [ ] HDMI CEC drivers --- * Multimedia support ---各选项的含义与源码级依赖如下对应 drivers/media/Kconfig 顶部的source结构RC 与 CEC 菜单被显式声明为不依赖MEDIA_SUPPORT菜单项对应 Kconfig作用与源码依据Remote Controller supportRC_CORE遥控器核心支持。从 drivers/media/rc/Kconfig 可见它depends on INPUT——这就是文档后面强调media 依赖 core 功能的典型案例HDMI CEC RC integrationMEDIA_CEC_RC将 HDMI CEC 接收的遥控数据转发进 RC 框架如同遥控器直接插在机器上。drivers/media/cec/Kconfig 中其依赖为depends on CEC_CORE RC_COREEnable CEC error injection supportCEC_PIN_ERROR_INJ通过 debugfs 做 CEC 错误注入依赖CEC_PIN DEBUG_FS主要用于驱动开发调试HDMI CEC driversMEDIA_CEC_SUPPORT选择通过 HDMI 接口收发 CEC 码的平台与 USB 驱动。注意 drivers/media/cec/Kconfig 中的说明DRM 子系统的 GPU 驱动也使用 media 的 HDMI CEC 支持那些 GPU 驱动在Graphics support菜单下选择支持 HDMI CEC 的 GPU 驱动会自动启用 media 侧的 CEC 核心Multimedia supportMEDIA_SUPPORT摄像头、音视频采集卡与 TV 支持总开关可编译进内核Y或作为模块M。tristate类型、依赖HAS_IOMEM文档建议大多数场景下将媒体子系统编译为模块M是更优选择便于驱动热插拔与独立更新。三、Media 依赖项从干净配置启用 media 通常不够文档特别提醒从一个干净配置clean config直接启用上面的选项通常不够——media 子系统依赖多个内核核心功能I²C 总线大多数媒体设备通过 I²CInter-Integrated Circuit串行总线与调谐器、前端等外设通信需启用 I²C 总线支持./scripts/config -m I2C这一点在源码中可以得到印证drivers/media/Kconfig 中MEDIA_SUBDRV_AUTOSELECT自动选择附属驱动直接select I2C和select I2C_MUX。输入设备INPUT遥控器核心要求输入设备支持./scripts/config -m INPUT这与 drivers/media/rc/Kconfig 中RC_CORE depends on INPUT严格对应。其他核心功能如 PCI、USB则取决于你要启用的具体驱动。四、启用 Remote Controller 支持遥控器菜单结构如下--- 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 ---逐项说明均可在 drivers/media/rc/Kconfig 中找到定义Compile Remote Controller keymap modulesRC_MAP为多种常见遥控器编译键位映射表。从 drivers/media/rc/keymaps/Kconfig 可知它是tristate、默认y帮助文本还提到 v4l-utils 包中的ir-keytable工具可在用户态加载同样的 RC 映射表因此不用遥控器的系统可以将其关闭。LIRC user interfaceLIRC启用/dev/lirc*接口让用户态接收遥控器的原始rawIR 数据——这是 IR 发射blasting与 lirc 守护进程所必需的。Support for eBPF programs attached to lirc devicesBPF_LIRC_MODE2允许通过BPF_PROG_ATTACH将 eBPF 程序挂载到 lirc 设备仅限 raw IR 接收器用 eBPF 程序为内核补充内核自带解码器不支持的协议解码能力。源码中其依赖为BPF_SYSCALL、RC_COREy和LIRC。Remote controller decodersRC_DECODERS选择内核可识别的 IR 协议NEC、RC-5、RC-6、Sony、JVC、Sanyo、Sharp 等。文档建议除非要刻意禁用某个解码器否则保持全部子选项启用。Remote Controller devicesRC_DEVICES选择适配你硬件的 IR 接收/发射驱动。4.1 实战用 scripts/config 配置 ITE 遥控器驱动文档给出了一个完整的脚本化示例支持 ITE 遥控器驱动常见于 Intel NUC 及部分华硕 x86 台式机即ite-cir模块$ 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从 drivers/media/rc/Kconfig 中IR_ITE_CIR的定义可以看到它的依赖为PNP || COMPILE_TEST与HAS_IOPORT——这解释了上面命令里ACPI被启用PNP/ACPI 是这类集成 IR 硬件的发现通道。此外文档脚注强调如果你要使用某些 TV 卡驱动即使不需要 IR也应启用 RC_CORE因为那些驱动可能依赖遥控器核心支持否则无法编译。五、启用 HDMI CEC 支持HDMI CEC 支持在驱动需要时自动被选中你只需启用一个需要它的显卡驱动或某个现有 HDMI CEC 驱动即可无需手工打开 CEC 核心。HDMI 专用驱动位于HDMI CEC drivers菜单。文档给出的示例菜单内容脚注说明实际可选项取决于系统架构随内核版本可能变化--- 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六、启用 Media 支持选中Multimedia 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 ---6.1 Autoselect ancillary drivers文档强烈建议除非你完全清楚自己在做什么或正在为 SoC 平台构建驱动否则保持Autoselect ancillary drivers开启。它会为你自动选中所需的 I²C 附属驱动调谐器、传感器、前端等。源码印证drivers/media/Kconfig 中MEDIA_SUBDRV_AUTOSELECT的帮助文本警告误关附属驱动会导致设备无法调谐或缺少所需解调器并且该选项默认y if MEDIA_SUPPORT_FILTER同时select I2C/select I2C_MUX。6.2 路径一Filter media drivers 过滤菜单面向 PC/笔记本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例如只要摄像头/采集卡选第一项即可可以多选。从 drivers/media/Kconfig 可见这七个选项正是MEDIA_CAMERA_SUPPORT、MEDIA_ANALOG_TV_SUPPORT、MEDIA_DIGITAL_TV_SUPPORT、MEDIA_RADIO_SUPPORT、MEDIA_SDR_SUPPORT、MEDIA_PLATFORM_SUPPORT、MEDIA_TEST_SUPPORT且它们均default y if !MEDIA_SUPPORT_FILTER——即一旦关闭过滤全部默认打开。两个值得注意的细节均来自 Kconfig 帮助文本与文档 note 呼应混合电视卡多数 TV 卡是混合卡同时支持模拟与数字 TV。持有混合卡时可能需要在菜单中同时启用Analog TV和Digital TV。默认核心功能够用使用过滤选项后媒体核心功能的默认值通常已足以提供驱动的基本功能你也可以手动进入下列子菜单启用额外可选功能Media core support --- Video4Linux options --- Media controller options --- Digital TV options --- HDMI CEC options ---选中过滤条件后符合条件的驱动将出现在Media support → Media drivers子菜单中。6.3 路径二关闭过滤手工面对 Media Core Support如果关闭Filter media drivers那么所有依赖条件满足的驱动都会显示在Media drivers菜单中。但文档提醒此时你必须先确保Media Core Support菜单包含了你的驱动所需的全部核心功能否则对应的设备驱动根本不会显示出来。源码印证drivers/media/Kconfig 中MEDIA_SUPPORT_FILTER的帮助文本明确写了不勾选它时所有非可选的媒体核心功能都会被启用所有媒体设备驱动都会被显示。核心支持由类型开关自动推导例如VIDEO_DEVVideo4Linux core的默认值由MEDIA_CAMERA_SUPPORT || MEDIA_ANALOG_TV_SUPPORT || MEDIA_RADIO_SUPPORT || MEDIA_SDR_SUPPORT || MEDIA_PLATFORM_SUPPORT || MEDIA_TEST_SUPPORT之一置位DVB_CORE依赖MEDIA_DIGITAL_TV_SUPPORTMEDIA_CONTROLLERMedia Controller API在摄像头/模拟 TV/数字 TV/平台设备任一项启用时默认打开。七、完整示例为 cx231xx USB 电视卡构建模块化支持文档给出的实战案例为 cx231xx 卡列表 中列出的某块板卡启用模块化支持media 核心全部为模块。此时.config应包含CONFIG_MODULESy CONFIG_USBy CONFIG_I2Cy CONFIG_INPUTy CONFIG_RC_COREm CONFIG_MEDIA_SUPPORTm CONFIG_MEDIA_SUPPORT_FILTERy CONFIG_MEDIA_ANALOG_TV_SUPPORTy CONFIG_MEDIA_DIGITAL_TV_SUPPORTy CONFIG_MEDIA_USB_SUPPORTy CONFIG_VIDEO_CX231XXy CONFIG_VIDEO_CX231XX_DVBy这份配置与源码依赖链完全吻合drivers/media/usb/cx231xx/Kconfig 中VIDEO_CX231XX的依赖为VIDEO_DEV I2C I2C_MUX——所以必须同时有USB、I2C且它select了VIDEO_TUNER、VIDEO_TVEEPROM、VIDEOBUF2_VMALLOC、VIDEO_CX25840、VIDEO_CX2341X等附属组件对应菜单中的 Autoselect 机制。VIDEO_CX231XX_DVB依赖DVB_CORE并在MEDIA_SUBDRV_AUTOSELECT开启时自动select一批调谐器MEDIA_TUNER_XC5000、MEDIA_TUNER_TDA18271、DVB_SI2165等——这正是混合卡同时打开 Analog TV 与 Digital TV在 Kconfig 层面的体现。八、构建并安装新内核.config就绪后构建与安装的完整流程为$ make $ sudo make modules_install $ sudo make install九、只构建新的 media 驱动与核心backports 方案从开发树运行整套新内核通常有风险可能包含有 bug 的实验性改动因此更稳妥的做法是只把新的 media 驱动编译成模块叠加到你现有的稳定内核上。文档介绍了两条途径Linux Kernel backports 项目包含针对稳定内核编译的新版驱动LinuxTV 维护的 media_build 回移树git.linuxtv.org/media_build.git/仅含 media 驱动从最新内核每日更新。文档对该树的免责声明必须了解用于测试相对安全但不保证在任意随机内核上能编译或工作——它按best-efforts原则维护。发现问题可向 media 子系统邮件列表mediavger.kernel.org提交补丁主题行加[PATCH media-build]前缀。使用流程$ ./build三条注意事项文档 note 原文要点若media-build树更新过可能需要在更新后再运行一次./build如果之前针对不同版本的内核构建过该树可能需要先执行make distclean默认情况下它会复用你当前运行内核中的 media 配置选项。若要选择不同驱动或不同配置选项$ make menuconfig然后构建并安装新驱动$ make sudo make install这将覆盖你内核此前使用的 media 驱动从而在不换内核的情况下获得最新 media 子系统的功能。十、要点回顾Media 子系统的配置入口是Device Drivers下的Remote Controller supportRC_CORE、HDMI CEC三项与Multimedia supportMEDIA_SUPPORTRC 与 CEC 核心不依赖MEDIA_SUPPORT可独立存在drivers/media/Kconfig 顶部注释明确说明。干净配置启用 media 后务必补齐 I²C、INPUT以及按驱动需要补齐 PCI/USB 等总线支持。遥控器配置链为INPUT → RC_CORE → RC_MAP/RC_DECODERS/RC_DEVICESeBPF 解码扩展额外要求BPF_SYSCALL LIRC。PC 场景优先使用Filter media driversAutoselect ancillary drivers混合电视卡要同时勾选 Analog 与 Digital TV。不想换内核时用 backports / media_build 树单独构建 media 模块./build后make sudo make install即可覆盖旧驱动。配置语义的最终依据是 drivers/media/Kconfig、drivers/media/rc/Kconfig、drivers/media/cec/Kconfig 与各驱动自身的 Kconfig 文件官方文档见 Documentation/admin-guide/media/building.rst。【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表