ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Linux Media 子系统 Platform 平台驱动全景指南:从驱动清单到源码实现

2026/9/10 15:20:37 拓冰建站 浏览量
Linux Media 子系统 Platform 平台驱动全景指南:从驱动清单到源码实现 Linux Media 子系统 Platform 平台驱动全景指南从驱动清单到源码实现【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux导读本文以 Linux 内核Documentation/admin-guide/media/platform-cardlist.rst为核心系统梳理 V4L2 媒体子系统中的platform 平台驱动——即那些不依赖 USB、PCI 总线而是直接集成在主板或 SoC 上的媒体驱动它们是嵌入式摄像头、视频编解码、图像处理等场景的核心。读完本文你将掌握平台驱动的完整驱动清单、如何在内核配置Kconfig中启用它们、驱动在源码树中的组织方式以及从配置项到驱动注册的底层实现链路。什么是 Media Platform 驱动在 Linux Media 子系统中设备驱动按总线接入方式可分为三类USB 驱动、PCI 驱动和Platform 驱动。根据 platform-cardlist.rst 的定义platform 驱动专注于提供对主板内建功能的支持它们既不使用 USB 总线也不使用 PCI 总线因此在嵌入式设备上极为常见。这类驱动的典型特征包括直接绑定到 SoC 内部的外设 IP如摄像头接口、视频编解码器、图像缩放/旋转引擎通过 platform bus 注册platform_driver_register/module_platform_driver通常需要配合 Device TreeOF即 Open Firmware 设备树描述硬件拓扑大量依赖 V4L2 sub-device API 与 Media Controller API 构建复杂的媒体管线。Media 子系统为这些多样化设备提供了多套 API包括 Video4LinuxV4L2API、Media Controller API、Digital TVDVBAPI、Remote Controller API 与 HDMI CEC API 等见 intro.rst。platform 驱动正是这些 API 在嵌入式硬件上的主要承载者。在内核配置中启用 Platform 驱动platform 驱动的编译入口统一挂在 drivers/media/platform/Kconfig 中其顶层开关与分类如下配置项含义MEDIA_PLATFORM_DRIVERSMedia platform devices总开关默认yV4L_PLATFORM_DRIVERSV4L 平台设备摄像头采集、显示等SDR_PLATFORM_DRIVERS软件定义无线电平台设备依赖MEDIA_SDR_SUPPORTDVB_PLATFORM_DRIVERS数字电视平台设备依赖MEDIA_DIGITAL_TV_SUPPORTV4L_MEM2MEM_DRIVERSmemory-to-memory 多媒体设备依赖VIDEO_DEVVIDEO_MEM2MEM_DEINTERLACE通用去隔行deinterlaceV4L2 驱动VIDEO_MUX视频总线 N:1 多路复用器驱动其中V4L_MEM2MEM_DRIVERS特指源缓冲区和目标缓冲区都位于系统内存的 V4L2 设备与仅单侧使用内存缓冲的 capture/output 驱动相对典型代表是各类编解码器与 2D 图像加速引擎。各厂商驱动的 Kconfig 通过source指令按字母序引入drivers/media/platform/allegro-dvt/Kconfig drivers/media/platform/amd/Kconfig ... drivers/media/platform/ti/Kconfig drivers/media/platform/xilinx/Kconfig对应的 Makefile 也按目录字母序组织平台相关目录使用obj-y 无条件进入编译具体模块由各子目录 Makefile 依据 CONFIG 决定而两个通用附属驱动则显式挂接 CONFIGobj-$(CONFIG_VIDEO_MEM2MEM_DEINTERLACE) m2m-deinterlace.o obj-$(CONFIG_VIDEO_MUX) video-mux.o从源码结构看平台驱动的 Kconfig 普遍采用如下依赖模式以 TI AM437x VPFE 为例config VIDEO_AM437X_VPFE tristate TI AM437x VPFE video capture driver depends on V4L_PLATFORM_DRIVERS depends on VIDEO_DEV depends on SOC_AM43XX || COMPILE_TEST select MEDIA_CONTROLLER select VIDEO_V4L2_SUBDEV_API select VIDEOBUF2_DMA_CONTIG select V4L2_FWNODE这段配置揭示了平台驱动的通用特征depends on SOC_xxx || COMPILE_TEST驱动绑定特定 SoC同时允许在非目标平台做编译测试select MEDIA_CONTROLLER、select VIDEO_V4L2_SUBDEV_API采集类平台驱动普遍依赖媒体控制器与 sub-device 框架select VIDEOBUF2_DMA_CONTIG嵌入式摄像头通常使用物理连续 DMA 缓冲区模块化编译时生成的模块名与驱动同名如am437x-vpfe。当前支持的 Platform 驱动完整清单以下清单完整取自 platform-cardlist.rst不含 staging 驱动覆盖了从摄像头采集、编解码、图像处理到显示输出的全部已支持平台驱动。驱动名即对应内核模块名。驱动名称 / 说明am437x-vpfeTI AM437x VPFEaspeed-videoAspeed AST2400 和 AST2500atmel-iscATMEL Image Sensor Controller (ISC)atmel-isiATMEL Image Sensor Interface (ISI)cafe_ccicMarvell 88ALP01 (Cafe) CMOS Camera Controllercdns-csi2rxCadence MIPI-CSI2 RX Controllercdns-csi2txCadence MIPI-CSI2 TX Controllercoda-vpuChipsMedia Coda multi-standard codec IPdm355_ccdcTI DM355 CCDC video capturedm644x_ccdcTI DM6446 CCDC video captureexynos-fimc-isEXYNOS4x12 FIMC-IS (Imaging Subsystem)exynos-fimc-liteEXYNOS FIMC-LITE camera interfaceexynos-gscSamsung Exynos G-ScalerexySamsung S5P/EXYNOS4 SoC series Camera Subsystemimx-pxpi.MX Pixel Pipeline (PXP)isdfTI DM365 ISIF video capturemmp_cameraMarvell Armada 610 integrated camera controllermtk_jpegMediatek JPEG Codecmtk-mdpMediatek MDPmtk-vcodec-decMediatek Video Codecmtk-vpuMediatek Video Processor Unitmx2_emmaprpMX2 eMMa-PrPomap3-ispOMAP 3 Cameraomap-voutOMAP2/OMAP3 V4L2-Displaypxa_cameraPXA27x Quick Capture Interfaceqcom-camssQualcomm V4L2 Camera Subsystemrcar-csi2R-Car MIPI CSI-2 Receiverrcar_drifRenesas Digital Radio Interface (DRIF)rcar-fcpRenesas Frame Compression Processorrcar_fdp1Renesas Fine Display Processorrcar_jpuRenesas JPEG Processing Unitrcar-vinR-Car Video Input (VIN)renesas-ceuRenesas Capture Engine Unit (CEU)rockchip-rgaRockchip Raster 2d Graphic Acceleration Units3c-camifSamsung S3C24XX/S3C64XX SoC Camera Interfaces5p-csisS5P/EXYNOS MIPI-CSI2 receiver (MIPI-CSIS)s5p-fimcS5P/EXYNOS4 FIMC/CAMIF camera interfaces5p-g2dSamsung S5P and EXYNOS4 G2D 2d graphics accelerators5p-jpegSamsung S5P/Exynos3250/Exynos4 JPEG codecs5p-mfcSamsung S5P MFC Video Codecsh_veuSuperH VEU mem2mem video processingsh_vouSuperH VOU video outputstm32-dcmiSTM32 Digital Camera Memory Interface (DCMI)stm32-dma2dSTM32 Chrom-Art Accelerator Unitsun4i-csiAllwinner A10 CMOS Sensor Interface Supportsun6i-csiAllwinner V3s Camera Sensor Interfacesun8i-diAllwinner Deinterlacesun8i-rotateAllwinner DE2 rotationti-calTI Memory-to-memory multimedia devicesti-cscTI DVB platform devicesti-vpeTI VPE (Video Processing Engine)venus-encQualcomm Venus V4L2 encoder/decodervia-cameraVIAFB camera controllervideo-muxVideo Multiplexervpif_displayTI DaVinci VPIF V4L2-Displayvpif_captureTI DaVinci VPIF video capturevsp1Renesas VSP1 Video Processing Enginexilinx-tpgXilinx Video Test Pattern Generatorxilinx-videoXilinx Video IP (EXPERIMENTAL)xilinx-vtcXilinx Video Timing ControllerMMC/SDIO DVB 适配器除上述 V4L 平台驱动外文档还单独列出通过 MMC/SDIO 接口接入的 DVB 适配器驱动名称smssdioSiano SMS1xxx 系列基于 SDIO 接口的移动数字电视MDTV该驱动对应drivers/media中的 Siano 相关实现说明 platform 驱动范畴不仅包含板载 SoC 外设也涵盖通过 SDIO 等板内总线连接的功能设备。驱动在源码树中的组织方式当前仓库中平台驱动的源码统一收敛在 drivers/media/platform 目录下按厂商/SoC 家族分子目录管理节选自 Kconfig 的 source 列表allegro-dvt/ amd/ amlogic/ amphion/ arm/ aspeed/ atmel/ broadcom/ cadence/ chips-media/ dreamchip/ imagination/ intel/ marvell/ mediatek/ microchip/ nuvoton/ nvidia/ nxp/ qcom/ raspberrypi/ renesas/ rockchip/ samsung/ st/ sunxi/ synopsys/ ti/ verisilicon/ via/ xilinx/对照上文清单可以清晰看到对应关系例如rcar-vin、rcar-csi2、vsp1、rcar_fdp1等 Renesas 驱动位于renesas/s5p-fimc、s5p-mfc、exynos-gsc等三星驱动位于samsung/mtk-jpeg、mtk-mdp、mtk-vcodec-dec、mtk-vpu位于mediatek/sun4i-csi、sun6i-csi、sun8i-di、sun8i-rotate位于sunxi/qcom-camss、venus-enc位于qcom/stm32-dcmi、stm32-dma2d位于st/。两个不属于特定 SoC 的通用驱动直接放在平台根目录m2m-deinterlace.c通用去隔行与video-mux.c视频多路复用器。典型驱动深度剖析video-mux通用视频总线多路复用器video-mux.c 是清单中Video Multiplexer的源码实现也是理解平台驱动内部结构的最佳范例。从源码结构看它通过struct video_mux封装了一个v4l2_subdev、一个v4l2_async_notifier异步探测子设备、一组media_pad和一个mux_control内核 mux 子系统句柄默认媒体总线格式为MEDIA_BUS_FMT_Y8_1X88 位灰度宽高均为 1在 Kconfig 中依赖V4L_PLATFORM_DRIVERS、VIDEO_DEV OF并select MULTIPLEXER、MEDIA_CONTROLLER、VIDEO_V4L2_SUBDEV_API、REGMAP、V4L2_FWNODE。该驱动通过 mux 控制实现 N:1 视频总线切换多个 sensor 子设备经异步通知器挂接后由 mux 决定哪一路信号进入上游是 Media Controller 图pipeline graph中典型的中间节点。STM32 家族从采集到像素处理st/stm32/Kconfig 展示了同一 SoC 上平台驱动的分层VIDEO_STM32_CSISTM32 Camera Serial Interface将 CSI 暴露为 v4l2 设备模块stm32-csiVIDEO_STM32_DCMIDigital Camera Memory Interface采集接口select VIDEOBUF2_DMA_CONTIG模块stm32-dcmiVIDEO_STM32_DCMIPPDCMI Pixel Processor带 sub-device API支持像素后处理模块stm32-dcmippVIDEO_STM32_DMA2DChrom-Art Accelerator属于V4L_MEM2MEM_DRIVERS分类是专用于图像操作的 memory-to-memory DMA 引擎模块stm32-dma2d。这组驱动清晰地展示了采集接口DCMI/CSI→ 像素处理DCMIPP→ 图像加速DMA2D的完整嵌入式视觉链路且三者分属 V4L 平台驱动与 mem2mem 驱动两个分类。Aspeed板载视频引擎aspeed/Kconfig 中的VIDEO_ASPEED支持 Aspeed AST2400/AST2500 SoC 内置的视频引擎VE可从数字或模拟源采集并压缩视频数据depends on ARCH_ASPEED || COMPILE_TEST且select VIDEOBUF2_DMA_CONTIG。此类驱动常见于服务器 BMC基板管理控制器场景属于典型的不依赖 USB/PCI 的板载媒体硬件。更多可深入阅读的配套文档内核文档树中为若干重点平台驱动提供了专项文档可作为进一步阅读入口qcom_camss.rstQualcomm V4L2 Camera Subsystem配套qcom_camss_graph.dot/qcom_camss_8x96_graph.dot管线图omap3isp.rstOMAP 3 Cameraomap3-isp驱动手册rcar-fdp1.rstRenesas Fine Display Processorrkisp1.rst 与 rkcif.rstRockchip ISP / Camera Interface 系列cafe_ccic.rstMarvell Cafe CMOS 摄像头控制器fimc.rstSamsung FIMC 摄像头接口。如何查阅与验证驱动清单的权威出处即 Documentation/admin-guide/media/platform-cardlist.rst其中明确说明列表不含 staging 目录中的驱动顶层媒体驱动索引见 v4l-drivers.rst 与 cardlist.rstUSB/PCI 驱动清单分别见 usb-cardlist.rst、pci-cardlist.rst在驱动源码中搜索module_platform_driver或platform_driver_register即可确认某个驱动是否为 platform 驱动例如aspeed-video.c、atmel-isi.c、cdns-csi2rx.c、coda-common.c、mtk_jpeg_core.c、mmp-driver.c、pxa_camera.c等文件均以此方式注册编译平台驱动时先在make menuconfig中开启MEDIA_PLATFORM_DRIVERS再按需选择对应厂商配置项多数驱动支持M编译为模块模块名与表格中的 Driver 列一致。结语Platform 驱动是 Linux 媒体子系统在嵌入式领域的基石。通过 platform-cardlist.rst 这张清单可以快速定位某个 SoC 摄像头接口、编解码器或图像加速器对应的内核驱动模块结合 drivers/media/platform 的 Kconfig 与源码则可以进一步理解其依赖关系、缓冲区机制与设备注册方式。对嵌入式开发者而言这份文档既是驱动选型的索引也是深入阅读 V4L2 平台驱动源码的起点。【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考