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 的支援已新增到inputattach1.6.0 中。對 Rainshadow Tech 的支援已新增到inputattach1.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 輸入的熱插拔檢測引腳將變為低電平。
此選項可動態更改。