拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Linux 内核 HDMI CEC 完全指南:硬件支持、CEC 调试器搭建与 USB/Extron 驱动配置

Linux 内核 HDMI CEC 完全指南硬件支持、CEC 调试器搭建与 USB/Extron 驱动配置【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux本文以 Linux 内核Documentation/admin-guide/media/cec.rst官方文档为核心系统讲解内核 CEC 框架的硬件支持矩阵发射器/接收器/USB Dongle、cec-ctl等用户态工具、DP-to-HDMI 转接线的 CEC 隧道可用性、USB CEC Dongle 的 udev/systemd 全自动配置、无 HPD 场景的Image View On唤醒机制以及如何用树莓派 4B 手工搭建一个低层 CEC 调试器。读完本文你将能够在内核源码中定位 CEC 各驱动实现、为 USB CEC 设备配置开机自启与休眠恢复、按文档步骤复现 CEC 无 HPD 唤醒测试、并正确配置 Extron DA HD 4K PLUS 分屏放大器的 CEC 驱动模块参数。一、主线内核支持的 CEC 硬件全景Linux 内核通过统一的 media CEC 框架代码位于 drivers/media/cec/核心实现在 core/cec-core.c、core/cec-adap.c把不同硬件的 CEC 能力抽象为/dev/cecX字符设备。官方文档 admin-guide/media/cec.rst 列出了主线中支持的全部硬件1.1 HDMI 发射器Transmitters硬件说明Exynos4 / Exynos5实现于 platform/s5p/s5p_cec.cSTIH4xx实现于 platform/sti/stih-cec.cV4L2 adv7511与 DRM 侧 adv7511 是不同驱动但同一硬件stm32实现于 platform/stm32/stm32-cec.cAllwinner A10 (sun4i)使用 CEC Pin Framework 直接驱动 CEC 引脚Raspberry Pi实现于 arch/arm 中的 BCM27xx 相关驱动dw-hdmiDesignWare/Synopsis IP大量 SoC 复用amlogicmeson ao-cec 与 ao-cec-g12a见 platform/meson/ao-cec.cdrm adv7511 / adv7533I2C 桥接芯片omap4 / tegrategra 实现见 platform/tegra/tegra_cec.crk3288 / rk3399Rockchip 系列tda998xI2C 驱动见 i2c/tda9950.c含 tda9950 家族DisplayPort CEC-Tunneling-over-AUXi915、nouveau、amdgpu 三家 GPU 驱动支持ChromeOS EC CEC实现于 platform/cros-ec/cros-ec-cec.cSECO boards (UDOO x86)实现于 platform/seco/seco-cec.cChrontel CH7322实现于 i2c/ch7322.c1.2 HDMI 接收器Receivers主线支持 adv7604/11/12、adv7842、tc358743 三类接收端芯片。1.3 USB Dongle 与其他Pulse-Eight驱动实现于 usb/pulse8/pulse8-cec.c提供模块选项persistent_config默认关闭设为 1 时驱动会把当前配置写入设备内部 EEPROM下次接入 USB 口时自动恢复。源码中该参数定义为module_param(persistent_config, int, 0644)即运行期也可通过/sys/module/pulse8_cec/parameters/persistent_config修改。RainShadow Tech驱动位于 usb/rainshadow/rainshadow-cec.c。注意该驱动不支持Pulse-Eight 的persistent_config模块选项——硬件本身支持但作者明确无计划实现欢迎补丁。Extron DA HD 4K PLUSHDMI 分配放大器详见本文第七节。vivid模拟一个 CEC 接收器加发射器可在没有真实 CEC 硬件时测试 CEC 应用。cec-gpio驱动位于 platform/cec-gpio/cec-gpio.c把 CEC 引脚接到任意 GPIO 即可控制 CEC 线并且支持错误注入是调试利器。1.4 一个容易踩的坑NTP 时钟漂移破坏 CEC 时序cec-gpio 和 Allwinner A10以及所有使用 CEC Pin Framework 直接驱动 CEC 引脚的驱动依赖高精度定时器来保证总线时序。而 NTP 守护进程会通过加速/减速系统时钟来同步时间——默认情况下 chronyd 会按 1/12 的比例调整时钟足以让 CEC 时序超出规范。解决方法是在chronyd.conf中加入一行maxslewrate 40000这把时钟频率变化限制在 1/25 以内CEC 时序即可保持在规范范围内。使用 GPIO 型 CEC 适配器的开发者务必注意此点。二、用户态工具cec-ctl、cec-compliance 与 cec-followerCEC 框架配套工具位于 linuxtv 的 v4l-utils 项目中三个核心工具为utils/cec-ctl控制 CEC 设备配置逻辑/物理地址、收发命令、监听总线utils/cec-compliance对远端 CEC 设备做符合性测试utils/cec-follower模拟一个 CEC follower 设备。两个值得知道的特性CEC Hospitality Profilecec-ctl支持该档案用于部分酒店显示屏场景libcec 兼容Pulse-Eight 开源的 libcec 库已支持 Linux CEC 框架上层应用可以跨平台调用。至于 CEC 规范本身它属于 HDMI 规范的一部分HDMI 1.3 规范可自由获取就 CEC 而言与 HDMI 1.4 基本一致对大多数场景足够。三、DisplayPort 转 HDMI 转接线CEC 隧道可用性清单背景知识大多数 DP-to-HDMI 转接线不支持CEC Tunneling即使声称支持很多实际上根本没有把 CEC 引脚接出来。结果就是内核虽然创建了一个 CEC 设备但它孤立于世界——永远看不到总线上其他 CEC 设备。3.1 如何验证转接线是否真的支持 CEC把 DP-to-HDMI 转接线接到一台支持 CEC 的设备通常是电视然后执行cec-ctl --playback # 把 PC 配置为 CEC Playback 设备 cec-ctl -S # 显示 CEC 拓扑cec-ctl -S应当至少显示两个 CEC 设备你自己和所连接的设备通常是电视。只有两者都出现才说明转接线的 CEC 引脚与隧道功能都正常。3.2 已知可用的转接芯片与型号从作者的实际经验看只在 Parade PS175、PS176、PS186 芯片组以及 MegaChips 2900 上验证过成功MegaChips 28x0 声称支持 CEC但从未被观察到正常工作。USB-C 转 HDMI可用型号Samsung Multiport Adapter EE-PW700Kramer ADC-U31C/HFClub3D CAC-2504USB 3.1 Type-C 转 HDMI 2.04K/60Hz 主动式DisplayPort 转 HDMI可用型号Club3D CAC-1080DP 1.4 转 HDMI 2.0bCableCreationSKU: CD07124K HDR 主动式适配器HP DisplayPort to HDMI True 4k AdapterP/N 2JA63AAMini-DisplayPort 转 HDMI可用型号Club3D CAC-1180mini DP 1.4 转 HDMI 2.0b几条关键经验结论被动转接头永远不会工作必须使用主动式active转接头上表中的 Club3D 适配器全部基于MegaChips 2900Club3D 其他型号基于 PS176 且没有连接 CEC 引脚所以只有列出的三款 Club3D 型号已知可用从经验推断MegaChips 2900 方案总体上大概率可用PS176 则碰运气多数失败PS186 的参考设计改进了 CEC 引脚连接大概率可用。四、USB CEC Dongle 的完整部署udev 规则 systemd 服务USB CEC Dongle 在系统里表现为/dev/ttyACMX串口设备需要inputattach工具来创建/dev/cecX设备Pulse-Eight 支持自inputattach1.6.0 起RainShadow Tech 支持自inputattach1.6.1 起。4.1 udev 规则接入时自动拉起 systemd 服务创建 udev 规则匹配 ttyACM 设备及对应 USB 厂商/产品 IDSUBSYSTEMtty, KERNELttyACM[0-9]*, ATTRS{idVendor}2548, ATTRS{idProduct}1002, ACTIONadd, TAGsystemd, ENV{SYSTEMD_WANTS}pulse8-cec-inputattach%k.service SUBSYSTEMtty, KERNELttyACM[0-9]*, ATTRS{idVendor}2548, ATTRS{idProduct}1001, ACTIONadd, TAGsystemd, ENV{SYSTEMD_WANTS}pulse8-cec-inputattach%k.service SUBSYSTEMtty, KERNELttyACM[0-9]*, ATTRS{idVendor}04d8, ATTRS{idProduct}ff59, ACTIONadd, TAGsystemd, ENV{SYSTEMD_WANTS}rainshadow-cec-inputattach%k.service其中2548:1001/1002是 Pulse-Eight 的 USB ID04d8:ff59是 RainShadow Tech 的 USB ID%k会把内核设备名如ttyACM0作为实例参数传给模板服务。4.2 两个模板 systemd 服务Pulse-Eight创建/lib/systemd/system/pulse8-cec-inputattach.service[Unit] Descriptioninputattach for pulse8-cec device on %I [Service] Typesimple ExecStart/usr/bin/inputattach --pulse8-cec /dev/%IRainShadow Tech创建/lib/systemd/system/rainshadow-cec-inputattach.service[Unit] Descriptioninputattach for rainshadow-cec device on %I [Service] Typesimple ExecStart/usr/bin/inputattach --rainshadow-cec /dev/%I4.3 休眠/唤醒支持inputattach 在前台运行时系统休眠会打断它。为此创建/lib/systemd/system/restart-cec-inputattach.service在suspend.target之后重新拉起[Unit] Descriptionrestart inputattach for cec devices Aftersuspend.target [Service] Typeforking ExecStart/bin/bash -c for d in /dev/serial/by-id/usb-Pulse-Eight*; do /usr/bin/inputattach --daemon --pulse8-cec $d; done; for d in /dev/serial/by-id/usb-RainShadow_Tech*; do /usr/bin/inputattach --daemon --rainshadow-cec $d; done [Install] WantedBysuspend.target然后执行systemctl enable restart-cec-inputattach注意这里使用/dev/serial/by-id/usb-Pulse-Eight*之类的稳定符号链接而非易变的/dev/ttyACM*。4.4 让物理地址随 EDID 变化自动更新CEC 物理地址应反映设备在 HDMI 拓扑中的位置。Dongle 场景下可以用cec-ctl的-E选项监听 EDID 文件变化并自动更新物理地址cec-ctl -E /sys/class/drm/card0-DP-1/edid这假设 Dongle 接在card0-DP-1输出上用xrandr可确认实际使用的输出该命令会持续轮询 EDID 变化并在变化时更新 Physical Address。要开机自动运行可用 croncrontab -e添加reboot /usr/local/bin/cec-ctl -E /sys/class/drm/card0-DP-1/edid限制此方法只适用于把 EDID 暴露在/sys/class/drm下的显示驱动例如 i915。五、CEC Without HPD无热插拔检测下的唤醒5.1 问题背景某些显示设备进入待机模式后 HPDHDMI Hotplug Detect信号消失但 CEC 仍然可用——此时连接设备可以发送Image View OnCEC 消息来唤醒显示器。遗憾的是并非所有硬件都支持例如 Odroid-U3 单板机有一个电平转换芯片HPD 拉低时该芯片掉电从而物理阻断CEC 引脚。即便 SoC 本身支持无 HPD 的 CEC电平转换器也会让这条路走不通。5.2 CEC_CAP_NEEDS_HPD 能力标志内核为此提供了 CEC capability flagCEC_CAP_NEEDS_HPD定义见 include/uapi/linux/cec.h在 core/cec-core.c 的 capability 汇总逻辑中使用Exynos s5p_cec 驱动即设置了它。一旦设置说明该硬件无法唤醒具有上述行为的显示设备。驱动开发者应如实上报此标志。对 CEC 应用实现者的忠告Image View On必须是发送的第一条消息在此之前不要发任何其他消息——一些糟糕但相当常见的 CEC 实现在收到其他消息后会彻底混乱拒绝被唤醒。5.3 无 HPD 能力的两种测试方法方法一用 Pulse-Eight dongle 当假显示器用 HDMI 线把被测设备连到 Pulse-Eight dongle但不要把 dongle 接到显示器配置 dongle 并开启监听cec-ctl -p0.0.0.0 --tv sudo cec-ctl -M在被测设备上执行cec-ctl --playback此时应报告物理地址为f.f.f.f表示总线上没有发现其他设备接着发送cec-ctl -t0 --image-view-onPulse-Eight 应能收到Image View On消息收不到就说明某处硬件或软件阻断了 CEC 消息的发出。为确认接线本身没问题把 Pulse-Eight 接到一台 CEC 显示器后重复上述命令此时有 HPD命令应当能正常到达 Pulse-Eight。方法二两块 Linux CEC 设备互连如果手上有另一台支持无 HPD CEC的 Linux 设备可以直接把两个 HDMI 输出对接。这样正好没有 HPD这正是测试想要的状态而第二台设备可以监听 CEC 引脚其余步骤同方法一。若 CEC 消息在无 HPD 时无法通过需要排查原因通常是硬件限制无法修复或软件在 HPD 拉低时关掉了 CEC 控制器需要修改驱动。六、微控制器实现的 CEC广播消息的时序风险部分显示器的 CEC 由微控制器采样总线实现。这类实现未必有问题但一些存在时序缺陷且只有接上低层 CEC 调试器才能发现。典型症状CEC 发送方把 CEC 线拉高或拉低的时间超出规范允许值。对定向消息directed messages影响不大——超时时消息不会被 ACK会自动重传但对广播消息没有任何这样的兜底机制。文档给出的应对建议稳妥做法是把部分广播消息发送两次以降低丢失概率Standby和Active Source是最值得这样处理的两个消息。七、用树莓派 4B 自制低层 CEC 调试器借助树莓派 4B 和几个廉价元件可以自制一个低层 CEC 调试器。核心部件是一个 HDMI 母-母直通转接板全焊接型Type A 母对母 breakout board配合面包板与杜邦线若还想监测 HPD 和 5V 线需要一个 5V 转 3.3V 电平转换器。透传视频质量有限肯定不足以透传 4Kp60594 MHz也许能到 4Kp30更现实的极限是 1080p60148.5 MHz——对 CEC 测试完全够用。7.1 接线HDMI 母头的地线 → 树莓派的任意 GND 引脚HDMI 母头的CEC 引脚→ GPIO 6 和 GPIO 7可选 HPD 引脚 → 经电平转换器 → GPIO 23 和 GPIO 12可选 5V 引脚 → 经电平转换器 → GPIO 25 和 GPIO 22。监测 HPD/5V 不是必需的但有辅助价值。7.2 设备树配置在arch/arm/boot/dts/bcm2711-rpi-4-b.dts中加入如下节点把 cec-gpio 驱动挂接起来cec6 { compatible cec-gpio; cec-gpios gpio 6 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN); hpd-gpios gpio 23 GPIO_ACTIVE_HIGH; v5-gpios gpio 25 GPIO_ACTIVE_HIGH; }; cec7 { compatible cec-gpio; cec-gpios gpio 7 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN); hpd-gpios gpio 12 GPIO_ACTIVE_HIGH; v5-gpios gpio 22 GPIO_ACTIVE_HIGH; };没接 HPD 或 5V 线的话直接删掉对应行即可。此配置创建两个cec-gpio 设备一个用于收发 CEC 命令另一个用于监听。用未配置的 CEC 适配器做监听会走 GPIO 中断路径监听精度非常高。若只想监听流量一个实例就够最小配置就是一个 HDMI 母-母直通板加两根杜邦线一根接 HDMI 地线到树莓派 GND一根接 HDMI CEC 引脚到 GPIO 6。7.3 使用错误注入error injection的使用文档见 cec-pin-error-inj.rst开启CONFIG_CEC_PIN_ERROR_INJ后/sys/kernel/debug/cec/cecX/error-inj提供 rx/tx 两类注入命令NACK 注入、低驱动条件、字节增删、位时序拉伸、仲裁丢失模拟等是验证 CEC 适配器抗错能力的理想手段。实现位于 core/cec-pin-error-inj.ccec-ctl --monitor-pin做低层总线嗅探与分析--store-pin把 CEC 流量存盘--analyze-pin事后分析也可以把它当作一个正经的 CEC 设备来配置cec-ctl --tv -p0.0.0.0或cec-ctl --playback -p1.0.0.0。八、Extron DA HD 4K PLUS CEC 适配器驱动该驱动面向 Extron DA HD 4K PLUS 系列 HDMI 分配放大器2/4/6 口型号均支持源码位于 usb/extron-da-hd-4k-plus/extron-da-hd-4k-plus.c串口协议解析在同目录 cec-splitter.c。前提条件固件版本必须 ≥ 1.02.0001注意较老的硬件修订版存在 CEC 电压问题可能导致 CEC 无法工作硬件修订E34814 及以后已修复。8.1 两种工作模式手动模式默认用户态程序需手动控制 HDMI Input 和所有 HDMI Output 的 CEC。控制力最全但也最复杂自动模式设置模块选项vendor_id即进入此模式。此时驱动接管 CEC 管理把在 input 口收到的 CEC 消息分发到各 output 口并处理 HPD 变化等事务。自动分发覆盖的 CEC 消息为StandbyImage View On与Text View OnGive Device Power StatusSet System Audio ModeRequest Current Latency自动模式下仍可用/dev/cecX直接与所连设备通信但配置全由驱动负责。8.2 模块选项详解源码中这些选项以module_param声明类型与权限如下表选项类型/权限作用debugint, 0644设为 1 时打印全部串口流量vendor_iduint, 0444上报给连接显示设备的 CEC Vendor ID设置后启用 CEC 自动分发模式见 8.1manufacturer_namestring三位字符制造商名用于 HDMI Input 的 EDID不设置时由用户态负责配置 EDID设置后驱动自动维护 EDID且不再允许手动设置 HDMI Input 的 EDIDhpd_never_lowbool, 0644设置后 HDMI Input 的 HPD 恒为高即使没有输出设备连接不设置默认时若所有 HDMI Output 的 HPD 均拉低则 Input HPD 也拉低。该选项可动态修改8.3 EDID 自动协商逻辑默认情况下用户态负责根据所连显示设备的 EDID 来设置 HDMI Input 的 EDID。设置manufacturer_name后驱动会自动按所连显示设备支持的分辨率更新 EDID。当前驱动只支持两档若所有所连显示设备都支持 4Kp60则在 HDMI Input 上通告 4Kp60 的 EDID否则回退到仅报告 1080p60 的 EDID。8.4 调试与状态驱动状态可查看/sys/kernel/debug/cec/cecX/status结合debug1模块参数观察串口原始流量可定位握手失败、HPD 时序等问题驱动通过串口状态字节把发送结果映射为CEC_TX_STATUS_NACK | CEC_TX_STATUS_MAX_RETRIES、CEC_TX_STATUS_OK或CEC_TX_STATUS_ERROR再经cec_transmit_done()上报到核心框架——即用户态从write()到/dev/cecX返回的 -113/0 等状态码源头就在这里。九、小结把文档能力映射到仓库源码文档主题仓库对应位置CEC 核心框架drivers/media/cec/core/cec-core.c / cec-adap.c / cec-api.c / cec-notifier.cCEC Pin 框架与错误注入drivers/media/cec/core/cec-pin.c、cec-pin-error-inj.ccec-gpio调试器/GPIO 复用drivers/media/cec/platform/cec-gpio/cec-gpio.cPulse-Eight / RainShadow USB 驱动drivers/media/cec/usb/Extron 分配放大器驱动drivers/media/cec/usb/extron-da-hd-4k-plus/CEC 错误注入文档Documentation/userspace-api/media/cec/cec-pin-error-inj.rst本文所依据的官方文档Documentation/admin-guide/media/cec.rst至此你既掌握了 CEC 框架有哪些硬件、装什么工具、怎么部署的实操层面udev systemd cec-ctl cron 的全自动链路也拿到了为什么不通的排查手段CEC_CAP_NEEDS_HPD 判断、Image View On首消息约定、cec-gpio 调试器与错误注入以及面向分屏放大器等特殊设备的驱动配置Extron 四个模块选项与双模式。【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门