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 介面卡都能支援此功能。一個例子是 Odroid-U3 SBC,它有一個電平轉換器,當 HPD 訊號低時會斷電,從而阻塞 CEC 引腳。即使 SoC 可以在沒有 HPD 的情況下使用 CEC,電平轉換器也會阻止其正常工作。

有一個 CEC 功能標誌可以指示此情況:CEC_CAP_NEEDS_HPD。如果設定,則硬體無法喚醒具有此行為的顯示器。

CEC 應用程式實現者注意事項: 訊息必須是您傳送的第一條訊息,在此之前不要傳送任何其他訊息。某些非常糟糕但不幸的是並非不常見的 CEC 實現,如果它們收到除此訊息以外的任何內容,它們會變得非常混亂,並且不會喚醒。

編寫驅動程式時,測試此功能可能很棘手。有兩種方法可以做到這一點

  1. 獲取一個 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。

  2. 如果您有另一個支援無 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)

https://elabbay.myshopify.com/collections/camera/products/hdmi-af-af-v1a-hdmi-type-a-female-to-hdmi-type-a-female-pass-through-adapter-breakout-board?variant=45533926147

影片質量不穩定,肯定不足以透過 4kp60 (594 MHz) 影片。您可能能夠支援 4kp30,但更可能您將限於 1080p60 (148.5 MHz)。但對於 CEC 測試來說,這已經足夠了。

您需要一個麵包板和一些麵包板線

http://www.dx.com/p/diy-40p-male-to-female-male-to-male-female-to-female-dupont-line-wire-3pcs-356089#.WYLOOXWGN7I

如果您還想監視 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.0cec-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 輸入的熱插拔檢測引腳將變為低電平。

此選項可動態更改。