4. HDMI CEC¶
4.1. 主线支持的硬件¶
HDMI 发送器
Exynos4
Exynos5
STIH4xx HDMI CEC
V4L2 adv7511 (相同的硬件,但与 drm adv7511 的驱动程序不同)
stm32
全志 A10 (sun4i)
树莓派
dw-hdmi (Synopsis IP)
amlogic (meson ao-cec 和 ao-cec-g12a)
drm adv7511/adv7533
omap4
tegra
rk3288, rk3399
tda998x
i915、nouveau 和 amdgpu 上的 DisplayPort CEC-Tunneling-over-AUX
ChromeOS EC CEC
SECO 开发板 (UDOO x86) 的 CEC。
Chrontel CH7322
HDMI 接收器
adv7604/11/12
adv7842
tc358743
USB 加密狗(有关如何使用这些加密狗的更多信息,请参阅下文)
Pulse-Eight: pulse8-cec 驱动程序实现了以下模块选项:
persistent_config
:默认情况下此选项为关闭,但当设置为 1 时,驱动程序会将当前设置存储到设备的内部 EEPROM 中,并在下次设备连接到 USB 端口时恢复。RainShadow Tech. 注意:此驱动程序不支持 Pulse-Eight 驱动程序的 persistent_config 模块选项。硬件支持它,但我没有计划添加此功能。但我接受补丁 :-)。
Extron DA HD 4K PLUS HDMI 分配放大器。有关更多信息,请参阅Extron DA HD 4K PLUS CEC 适配器驱动程序。
其他
vivid: 模拟 CEC 接收器和 CEC 发送器。可用于在没有实际 CEC 硬件的情况下测试 CEC 应用程序。
cec-gpio. 如果 CEC 引脚连接到 GPIO 引脚,则可以通过此驱动程序控制 CEC 线。这也支持错误注入。
cec-gpio 和全志 A10(或任何其他使用 CEC 引脚框架直接驱动 CEC 引脚的驱动程序):CEC 引脚框架使用高分辨率定时器。这些定时器受 NTP 守护程序的影响,NTP 守护程序会加速或减慢时钟以与官方时间同步。chronyd 服务器默认会将时钟增加或减少 1/12。这将导致 CEC 时序超出规范。要解决此问题,请在 chronyd.conf 中添加一行“maxslewrate 40000”。这将时钟频率变化限制在 1/25,从而使 CEC 时序保持在规范范围内。
4.2. 实用工具¶
实用工具可在此处获得:https://git.linuxtv.org/v4l-utils.git
utils/cec-ctl
:控制 CEC 设备
utils/cec-compliance
:测试远程 CEC 设备的兼容性
utils/cec-follower
:模拟 CEC 从属设备
请注意,cec-ctl
支持 CEC 酒店配置文件,该配置文件用于某些酒店显示器。请参阅http://www.htng.org。
请注意,libcec 库 (https://github.com/Pulse-Eight/libcec) 支持 Linux CEC 框架。
如果您想获取 CEC 规范,请查看 HDMI 维基百科页面的参考资料:https://en.wikipedia.org/wiki/HDMI。CEC 是 HDMI 规范的一部分。HDMI 1.3 是免费提供的(与 CEC 相关的 HDMI 1.4 非常相似),对于大多数情况应该足够了。
4.3. 带有工作 CEC 的 DisplayPort 转 HDMI 适配器¶
背景:大多数适配器不支持 CEC 隧道功能,而那些支持的适配器中,许多实际上没有连接 CEC 引脚。不幸的是,这意味着虽然创建了一个 CEC 设备,但它实际上是世界上唯一的,永远无法看到其他 CEC 设备。
这是一个已知工作的适配器列表,它们既具有 CEC 隧道功能,又正确连接了 CEC 引脚。如果您发现工作但不在列表中的适配器,请给我留言。
测试方法:将您的 DP 转 HDMI 适配器连接到支持 CEC 的设备(通常是电视),然后运行
cec-ctl --playback # Configure the PC as a CEC Playback device
cec-ctl -S # Show the CEC topology
cec-ctl -S
命令应显示至少两个 CEC 设备,我们自己和您连接的 CEC 设备(即通常是电视)。
一般注意事项:我只见过 Parade PS175、PS176 和 PS186 芯片组以及 MegaChips 2900 配合使用。虽然 MegaChips 28x0 声称支持 CEC,但我从未见过它工作。
4.3.1. USB-C 转 HDMI¶
三星多端口适配器 EE-PW700: https://www.samsung.com/ie/support/model/EE-PW700BBEGWW/
Kramer ADC-U31C/HF: https://www.kramerav.com/product/ADC-U31C/HF
Club3D CAC-2504: https://www.club-3d.com/en/detail/2449/usb_3.1_type_c_to_hdmi_2.0_uhd_4k_60hz_active_adapter/
4.3.2. DisplayPort 转 HDMI¶
Club3D CAC-1080: https://www.club-3d.com/en/detail/2442/displayport_1.4_to_hdmi_2.0b_hdr/
CableCreation (SKU: CD0712): https://www.cablecreation.com/products/active-displayport-to-hdmi-adapter-4k-hdr
惠普 DisplayPort 转 HDMI True 4k 适配器 (P/N 2JA63AA): https://www.hp.com/us-en/shop/pdp/hp-displayport-to-hdmi-true-4k-adapter
4.3.3. Mini-DisplayPort 转 HDMI¶
Club3D CAC-1180: https://www.club-3d.com/en/detail/2443/mini_displayport_1.4_to_hdmi_2.0b_hdr/
请注意,无源适配器永远无法工作,您需要有源适配器。
此列表中的 Club3D 适配器均基于 MegaChips 2900。其他 Club3D 适配器基于 PS176,并且没有连接 CEC 引脚,因此只有上述三个 Club3D 适配器已知可以工作。
我怀疑基于 MegaChips 2900 的设计通常可能可以工作,而 PS176 则更像是碰运气(大部分失败)。PS186 很可能连接了 CEC 引脚,看起来他们更改了该芯片组的参考设计。
4.4. USB CEC 加密狗¶
这些加密狗显示为/dev/ttyACMX
设备,需要inputattach
实用程序来创建/dev/cecX
设备。对 Pulse-Eight 的支持已添加到inputattach
1.6.0 中。对 Rainshadow Tech 的支持已添加到inputattach
1.6.1 中。
您还需要 udev 规则来自动启动 systemd 服务
SUBSYSTEM=="tty", KERNEL=="ttyACM[0-9]*", ATTRS{idVendor}=="2548", ATTRS{idProduct}=="1002", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}+="pulse8-cec-inputattach@%k.service"
SUBSYSTEM=="tty", KERNEL=="ttyACM[0-9]*", ATTRS{idVendor}=="2548", ATTRS{idProduct}=="1001", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}+="pulse8-cec-inputattach@%k.service"
SUBSYSTEM=="tty", KERNEL=="ttyACM[0-9]*", ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="ff59", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}+="rainshadow-cec-inputattach@%k.service"
以及这些 systemd 服务
对于 Pulse-Eight,创建 /lib/systemd/system/pulse8-cec-inputattach@.service
[Unit]
Description=inputattach for pulse8-cec device on %I
[Service]
Type=simple
ExecStart=/usr/bin/inputattach --pulse8-cec /dev/%I
对于 RainShadow Tech,创建 /lib/systemd/system/rainshadow-cec-inputattach@.service
[Unit]
Description=inputattach for rainshadow-cec device on %I
[Service]
Type=simple
ExecStart=/usr/bin/inputattach --rainshadow-cec /dev/%I
为了获得正确的挂起/恢复支持,请创建:/lib/systemd/system/restart-cec-inputattach.service
[Unit]
Description=restart inputattach for cec devices
After=suspend.target
[Service]
Type=forking
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]
WantedBy=suspend.target
并运行systemctl enable restart-cec-inputattach
。
当 EDID 更改时自动设置 CEC 设备的物理地址,您可以使用带有-E
选项的cec-ctl
cec-ctl -E /sys/class/drm/card0-DP-1/edid
这假设加密狗连接到 card0-DP-1 输出(xrandr
会告诉您使用哪个输出),它将轮询 EDID 的更改并在发生更改时更新物理地址。
要自动运行此命令,您可以使用 cron。使用crontab -e
编辑 crontab 并添加此行
@reboot /usr/local/bin/cec-ctl -E /sys/class/drm/card0-DP-1/edid
这仅适用于在/sys/class/drm
中暴露 EDID 的显示驱动程序,例如 i915 驱动程序。
4.5. 无 HPD 的 CEC¶
某些显示器在待机模式下没有 HDMI 热插拔检测信号(HPD),但 CEC 仍然启用,因此连接的设备可以发送
有一个 CEC 功能标志可以指示此情况:CEC_CAP_NEEDS_HPD
。如果设置,则硬件无法唤醒具有此行为的显示器。
CEC 应用程序实现者注意事项:
编写驱动程序时,测试此功能可能很棘手。有两种方法可以做到这一点
获取一个 Pulse-Eight USB CEC 加密狗,将 HDMI 线从您的设备连接到 Pulse-Eight,但不要将 Pulse-Eight 连接到显示器。
现在配置 Pulse-Eight 加密狗
cec-ctl -p0.0.0.0 --tv
并开始监控
sudo cec-ctl -M
在您正在测试的设备上运行
cec-ctl --playback
它应该报告物理地址为 f.f.f.f。现在运行此命令
cec-ctl -t0 --image-view-on
Pulse-Eight 应该看到
消息。如果没有,那么某些东西(硬件和/或软件)正在阻止 CEC 消息发出。 为确保接线正确,只需将 Pulse-Eight 连接到支持 CEC 的显示器,并在您的设备上运行相同的命令:现在有 HPD,因此您应该会看到命令到达 Pulse-Eight。
如果您有另一个支持无 HPD 的 CEC 的 Linux 设备,那么您可以将您的设备连接到该设备。是的,您可以将两个 HDMI 输出连接在一起。您将没有 HPD(这是我们此测试所需要的),但第二个设备可以监视 CEC 引脚。
否则,请使用与 1 中相同的命令。
如果 CEC 消息在没有 HPD 的情况下无法通过,则需要找出原因。通常,这要么是硬件限制,要么是软件在 HPD 变为低电平时关闭了 CEC 核心。前者当然无法纠正,后者可能需要驱动程序更改。
4.6. 微控制器与 CEC¶
我们已经在显示器中看到了一些使用微控制器来采样总线的 CEC 实现。这不一定是个问题,但有些实现存在时序问题。除非您可以连接低级 CEC 调试器(请参阅下一节),否则这很难发现。
您会看到 CEC 发送器将 CEC 线保持高电平或低电平的时间超过允许的时间。对于定向消息,这不是问题,因为如果发生这种情况,消息将不会被确认并会重新传输。对于广播消息,不存在这种机制。
目前尚不清楚如何解决这个问题。明智的做法可能是广播一些消息两次,以减少它们丢失的可能性。特别是
4.7. 制作 CEC 调试器¶
通过使用 Raspberry Pi 4B 和一些廉价组件,您可以制作自己的低级 CEC 调试器。
关键组件是这些 HDMI 母对母直通连接器之一(全焊接类型 1)
视频质量不稳定,肯定不足以通过 4kp60 (594 MHz) 视频。您可能能够支持 4kp30,但更可能您将限于 1080p60 (148.5 MHz)。但对于 CEC 测试来说,这已经足够了。
您需要一个面包板和一些面包板线
如果您还想监视 HPD 和/或 5V 线,则需要一个 5V 转 3.3V 电平转换器
https://www.adafruit.com/product/757
(这只是我购买这些组件的地方,您可以在许多其他地方购买类似的东西)。
HDMI 连接器的地线当然需要连接到 Raspberry Pi 的地线。
HDMI 连接器的 CEC 引脚需要连接到这些引脚:GPIO 6 和 GPIO 7。HDMI 连接器的可选 HPD 引脚应通过电平转换器连接到这些引脚:GPIO 23 和 GPIO 12。HDMI 连接器的可选 5V 引脚应通过电平转换器连接到这些引脚:GPIO 25 和 GPIO 22。监视 HPD 和 5V 线不是必需的,但它很有帮助。
在 arch/arm/boot/dts/bcm2711-rpi-4-b.dts
中添加的此设备树将正确连接 cec-gpio 驱动程序
cec@6 {
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>;
};
cec@7 {
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 线,那么只需删除这些行。
此 DTS 更改将启用两个 CEC GPIO 设备:我通常使用一个来发送/接收 CEC 命令,另一个用于监视。如果您使用未配置的 CEC 适配器进行监视,那么它将使用 GPIO 中断,这使得监视非常准确。
如果您只想监视流量,那么单个实例就足够了。最小配置是一个 HDMI 母对母直通连接器和两条母对母面包板线:一条用于将 HDMI 地线连接到 Raspberry Pi 上的地线,另一条用于将 HDMI CEC 引脚连接到 Raspberry Pi 上的 GPIO 6。
有关如何使用错误注入的文档在此处:CEC 引脚框架错误注入。
cec-ctl --monitor-pin
将执行低级 CEC 总线嗅探和分析。您还可以使用--store-pin
将 CEC 流量存储到文件中,然后使用--analyze-pin
稍后进行分析。
您还可以通过使用cec-ctl --tv -p0.0.0.0
或cec-ctl --playback -p1.0.0.0
对其进行配置,将其用作功能齐全的 CEC 设备。
4.8. Extron DA HD 4K PLUS CEC 适配器驱动程序¶
此驱动程序适用于 Extron DA HD 4K PLUS 系列 HDMI 分配放大器:https://www.extron.com/product/dahd4kplusseries
支持 2、4 和 6 端口型号。
需要固件版本 1.02.0001 或更高版本。
请注意,旧版本的 Extron 硬件存在 CEC 电压问题,这可能意味着 CEC 将无法工作。此问题已在硬件版本 E34814 及更高版本中修复。
CEC 支持有两种模式:第一种是手动模式,其中用户空间必须手动控制 HDMI 输入和所有 HDMI 输出的 CEC。虽然这提供了完全控制,但它也很复杂。
第二种是自动模式,如果设置了模块选项vendor_id
,则选择此模式。在这种情况下,驱动程序会控制 CEC,并且输入中收到的 CEC 消息将分发到输出。仍然可以使用 /dev/cecX 设备直接与连接的设备通信,但由驱动程序配置所有内容并处理热插拔检测更改等事宜。
驱动程序还负责 EDID:创建 /dev/videoX 设备以读取 EDID 并(对于 HDMI 输入端口)设置 EDID。
默认情况下,用户空间负责根据连接显示器的 EDID 设置 HDMI 输入的 EDID。但是,如果设置了manufacturer_name
模块选项,则驱动程序将根据连接显示器支持的分辨率自动更新 HDMI 输入的 EDID,并且将无法再手动设置 HDMI 输入的 EDID。目前,驱动程序仅支持 1080p60 和 4kp60 分辨率:如果所有连接的显示器都支持 4kp60,则它将在 HDMI 输入上宣传 4kp60,否则它将回退到仅报告 1080p60 的 EDID。
Extron 的状态报告在/sys/kernel/debug/cec/cecX/status
中。
extron-da-hd-4k-plus 驱动程序实现了以下模块选项
4.8.1. debug
¶
如果设置为 1,则显示所有串口流量。
4.8.2. vendor_id
¶
要报告给连接显示器的 CEC 供应商 ID。
如果设置,驱动程序将负责将输入中收到的 CEC 消息分发到 HDMI 输出。这适用于以下 CEC 消息
和
如果未设置,则由用户空间负责,并且必须手动配置 HDMI 输入和 HDMI 输出的 CEC 设备。
4.8.3. manufacturer_name
¶
一个三字符的制造商名称,用于 HDMI 输入的 EDID 中。如果未设置,则由用户空间负责配置 EDID。如果设置,则驱动程序将根据连接显示器支持的分辨率自动更新 EDID,并且将无法再手动设置 HDMI 输入的 EDID。
4.8.4. hpd_never_low
¶
如果设置,则 HDMI 输入的热插拔检测引脚将始终为高电平,即使没有连接任何设备到 HDMI 输出。如果未设置(默认),则如果 HDMI 输出的所有检测到的热插拔检测引脚也为低电平,则 HDMI 输入的热插拔检测引脚将变为低电平。
此选项可动态更改。