書(shū)接上文, 自從知道了 DDC/CI 這個(gè)大部分顯示器都支持的好用功能之后, 就愉快的跑去香橙派上使用了. 結(jié)果, 不支持 ? 這是什么情況 ?? 樹(shù)莓派都支持, 香橙派居然不支持 ?
一通研究之后發(fā)現(xiàn), 還真的是硬件不支持 ! 這怎么行 ? 俗話說(shuō)的好, 有條件要上, 沒(méi)有條件創(chuàng)造條件也要上 !
最終, 在堅(jiān)持不懈的努力之下, 以不足 5 元 (3.4 元) 的硬件成本, 在香橙派上成功實(shí)現(xiàn)了 DDC/CI 功能.
相關(guān)文章:
- 《顯示器的隱藏功能: 顯示數(shù)據(jù)通道命令接口 (DDC/CI)》
http://www.reibang.com/p/18d88c69fecf
目錄
- 1 香橙派 zero3 不支持 DDC/CI
- 2 H618 處理器的 DesignWare HDMI 控制器不支持 DDC/CI
- 2.1 香橙派 HDMI i2c 總線沒(méi)有從機(jī)地址
37
- 2.2 查找相關(guān)的 Linux 內(nèi)核驅(qū)動(dòng)代碼
- 2.3 DesignWare HDMI 硬件不支持
- 2.1 香橙派 HDMI i2c 總線沒(méi)有從機(jī)地址
- 3 旁路引出 HDMI 的 i2c
- 4 測(cè)試成功
- 5 總結(jié)與展望
1 香橙派 zero3 不支持 DDC/CI
測(cè)試設(shè)備: 香橙派 Orange pi Zero3 (內(nèi)存 1GB, 處理器 全志 H618)
操作系統(tǒng): Debian 12 (官方鏡像, Linux 6.1)
話不多說(shuō), 直接使用 ddcutil
進(jìn)行測(cè)試:
orangepi@orangepizero3 ~> ddcutil detect
Invalid display
I2C bus: /dev/i2c-5
DRM connector: card0-HDMI-A-1
EDID synopsis:
Mfg id: GVE - UNK
Model:
Product code: 9491 (0x2513)
Serial number:
Binary serial number: 1 (0x00000001)
Manufacture year: 2022, Week: 29
DDC communication failed
This appears to be a laptop display. Laptop displays do not support DDC/CI.
嗯 ? 什么情況 ??
同一個(gè)顯示器, 使用 HDMI 連接 PC (ArchLinux) 就是正常的啊:
> ddcutil detect
Display 1
I2C bus: /dev/i2c-2
DRM connector: card1-HDMI-A-1
EDID synopsis:
Mfg id: GVE - UNK
Model:
Product code: 9491 (0x2513)
Serial number:
Binary serial number: 1 (0x00000001)
Manufacture year: 2022, Week: 29
VCP version: 2.2
> ddcutil getvcp 10
VCP code 0x10 (Brightness ): current value = 0, max value = 100
系統(tǒng)版本信息:
orangepi@orangepizero3 ~> uname -a
Linux orangepizero3 6.1.31-sun50iw9 #1.0.0 SMP Mon Jul 3 13:44:03 CST 2023 aarch64 GNU/Linux
orangepi@orangepizero3 ~> neofetch
_,met$$$$$gg. orangepi@orangepizero3
,g$$$$$$$$$$$$$$$P. ----------------------
,g$$P" """Y$$.". OS: Debian GNU/Linux 12 (bookworm) aarch64
,$$P' `$$$. Host: OrangePi Zero3
',$$P ,ggs. `$$b: Kernel: 6.1.31-sun50iw9
`d$$' ,$P"' . $$$ Uptime: 3 days, 4 hours, 40 mins
$$P d$' , $$P Packages: 1281 (dpkg)
$$: $$. - ,d$$' Shell: fish 3.6.0
$$; Y$b._ _,d$P' Resolution: 1920x1080
Y$$. `.`"Y$$$$P"' Terminal: /dev/pts/0
`$$b "-.__ CPU: (4) @ 1.512GHz
`Y$$ Memory: 513MiB / 981MiB
`Y$$.
`$$b.
`Y$$b.
`"Y$b._
`"""
orangepi@orangepizero3 ~> ddcutil --version
ddcutil 1.4.1
Built with support for USB connected displays.
Built without function failure simulation.
Built with libdrm services.
Copyright (C) 2015-2023 Sanford Rockowitz
License GPLv2: GNU GPL version 2 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
2 H618 處理器的 DesignWare HDMI 控制器不支持 DDC/CI
2.1 香橙派 HDMI i2c 總線沒(méi)有從機(jī)地址 37
我們知道, DDC/CI 功能是通過(guò) i2c 總線實(shí)現(xiàn)的, 那看看 i2c 是什么情況:
orangepi@orangepizero3 ~> /sbin/i2cdetect -l
i2c-3 i2c mv64xxx_i2c adapter I2C adapter
i2c-4 i2c mv64xxx_i2c adapter I2C adapter
i2c-5 i2c DesignWare HDMI I2C adapter
可以看到, i2c-5
名稱 DesignWare HDMI
, 這個(gè)應(yīng)該就是 HDMI 的 i2c 總線.
orangepi@orangepizero3 ~> /sbin/i2cdetect -y -r 5
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: 30 -- -- -- -- -- -- -- -- -- 3a -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- 4a 4b -- -- -- --
50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
下面是 PC (ArchLinux) 連接同一個(gè)顯示器的情況:
> i2cdetect -y 2
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- 37 -- -- 3a -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- 4a 4b -- -- -- --
50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
這是 i2c 從機(jī)的地址, 其中 50
用于 EDID (獲取顯示器信息), 37
用于 DDC/CI.
香橙派 HDMI i2c 有 50
地址, 所以 EDID 功能正常. 然而, 別的從機(jī)地址都有, 就是沒(méi)有該死的 37
地址 !
這種情況好奇怪啊, 你說(shuō) i2c 不正常吧, 它有 50
地址, EDID 正常, 別的從機(jī)地址也都有. 你說(shuō) i2c 正常吧, 它就是沒(méi)有從機(jī)地址 37
. 你說(shuō)氣人不氣人 !
2.2 查找相關(guān)的 Linux 內(nèi)核驅(qū)動(dòng)代碼
我們?nèi)?Linux 代碼中找找, 搜索關(guān)鍵詞 DesignWare
. 然后找到了文件 linux-6.6.8/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
第 421 行:
static int dw_hdmi_i2c_xfer(struct i2c_adapter *adap,
struct i2c_msg *msgs, int num)
{
struct dw_hdmi *hdmi = i2c_get_adapdata(adap);
struct dw_hdmi_i2c *i2c = hdmi->i2c;
u8 addr = msgs[0].addr;
int i, ret = 0;
if (addr == DDC_CI_ADDR)
/*
* The internal I2C controller does not support the multi-byte
* read and write operations needed for DDC/CI.
* TOFIX: Blacklist the DDC/CI address until we filter out
* unsupported I2C operations.
*/
return -EOPNOTSUPP;
同一個(gè)文件第 42 行:
#define DDC_CI_ADDR 0x37
嗯, 破案了, 原來(lái) Linux 內(nèi)核驅(qū)動(dòng)代碼中, 故意屏蔽了從機(jī)地址 37
! 所以才會(huì)別的從機(jī)地址都有, 就是 37
沒(méi)有.
但是, 為啥呢 ?
2.3 DesignWare HDMI 硬件不支持
使用 git blame
查找這段代碼對(duì)應(yīng)的提交, 找到了 bee447e224b2645911c5d06e35dc90d8433fcef6
:
drm/bridge: dw-hdmi: Refuse DDC/CI transfers on the internal I2C controller
The DDC/CI protocol involves sending a multi-byte request to the
display via I2C, which is typically followed by a multi-byte
response. The internal I2C controller only allows single byte
reads/writes or reads of 8 sequential bytes, hence DDC/CI is not
supported when the internal I2C controller is used. The I2C
transfers complete without errors, however the data in the response
is garbage. Abort transfers to/from slave address 0x37 (DDC) with
-EOPNOTSUPP, to make it evident that the communication is failing.
Signed-off-by: Matthias Kaehlcke <mka@chromium.org>
Reviewed-by: Douglas Anderson <dianders@chromium.org>
Reviewed-by: Sean Paul <sean@poorly.run>
Acked-by: Neil Armstrong <narmstrong@baylibre.com>
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191002124354.v2.1.I709dfec496f5f0b44a7b61dcd4937924da8d8382@changeid
這是一個(gè) 5 年前 (2019 年) 的內(nèi)核提交. 大致意思是說(shuō), H618 芯片使用的 DesignWare HDMI 接口 IP 內(nèi)置的 i2c 功能并不是通用的 i2c 硬件, 只支持讀寫單個(gè)字節(jié), 或讀取不超過(guò) 8 個(gè)的連續(xù)字節(jié). 所以在硬件級(jí)別就不支持 DDC/CI 功能 (需要連續(xù)讀寫多個(gè)字節(jié)). 內(nèi)核中的驅(qū)動(dòng)只是在模擬一個(gè) i2c 硬件, 但是無(wú)法使用 i2c 的全部功能.
好了, 這下實(shí)錘是硬件不支持了.
相關(guān)鏈接:
- https://github.com/torvalds/linux/commit/bee447e224b2645911c5d06e35dc90d8433fcef6
- https://patchwork.freedesktop.org/patch/319153/?series=63919&rev=2
3 旁路引出 HDMI 的 i2c
i2c 總線支持多主機(jī)多從機(jī), 也就是多個(gè)設(shè)備可以同時(shí)連接在一條總線上, 其中任意設(shè)備都可以在任意時(shí)間充當(dāng)主機(jī), 發(fā)起數(shù)據(jù)傳輸. i2c 總線有仲裁功能, 即使兩個(gè)主機(jī)同時(shí)發(fā)起通信, 數(shù)據(jù)也不會(huì)丟失, 總線仍然可以正常工作.
雖然香橙派的 HDMI i2c 不支持 DDC/CI, 但是香橙派還有別的板載 i2c 接口, 如圖:
(來(lái)源: http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-Zero-3.html)
那么, 如果把 HDMI 中的 i2c 旁路引出, 連接到板載的 i2c 接口, 是不是就能使用 DDC/CI 呢 ?
為了實(shí)現(xiàn)這個(gè)目標(biāo), 一種簡(jiǎn)單粗暴的方法是, 直接剝開(kāi) HDMI 線纜, 找到 i2c 的 SCL, SDA 這兩條信號(hào)線, 接線 !
但是, 想做的更優(yōu)雅一些: KiCad, 啟動(dòng) !
這是原理圖, 很簡(jiǎn)單: 兩個(gè) HDMI 接頭, 20 根線直接對(duì)應(yīng)連接 (直通), 另有一個(gè)排針, 旁路引出 13 ~ 19 號(hào)所有的低速信號(hào)線. (1 ~ 12 是 HDMI 的 4 組 TMDS 高速差分信號(hào)線)
嘉立創(chuàng) PCB 打樣.
焊接之后. 這塊 PCB 成本 2.5 元, 元件成本總計(jì) 0.88 元, 所以 PCBA 成本 3.4 元 (每片).
4 測(cè)試成功
如圖所示接線:
從香橙派出來(lái) micro-HDMI 轉(zhuǎn) HDMI 短線, 進(jìn)旁路電路板, 另一頭 HDMI 線纜再接顯示器. i2c 兩根線 SCL, SDA 接香橙派板載排針.
小知識(shí): 香橙派 zero3 的 micro-HDMI 轉(zhuǎn)接頭不要買這種, 會(huì)和旁邊的插頭擠在一起:
需要配置開(kāi)啟香橙派的 i2c-3 板載接口:
sudo orangepi-config
進(jìn)入文本圖形化配置界面, 菜單選擇 System
-> Hardware
, 把 ph-i2c3
選中 (顯示 [*]
). 保存重啟.
orangepi@orangepizero3 ~> /sbin/i2cdetect -l
i2c-3 i2c mv64xxx_i2c adapter I2C adapter
i2c-4 i2c mv64xxx_i2c adapter I2C adapter
i2c-5 i2c DesignWare HDMI I2C adapter
orangepi@orangepizero3 ~> ddcutil detect
Error opening "/sys/devices/platform/soc/6000000.hdmi/edid", No such file or directory
Display 1
I2C bus: /dev/i2c-3
DRM connector: card0-HDMI-A-1
EDID synopsis:
Mfg id: GVE - UNK
Model:
Product code: 9491 (0x2513)
Serial number:
Binary serial number: 1 (0x00000001)
Manufacture year: 2022, Week: 29
VCP version: 2.2
Invalid display
I2C bus: /dev/i2c-5
DRM connector: card0-HDMI-A-1
EDID synopsis:
Mfg id: GVE - UNK
Model:
Product code: 9491 (0x2513)
Serial number:
Binary serial number: 1 (0x00000001)
Manufacture year: 2022, Week: 29
DDC communication failed
This appears to be a laptop display. Laptop displays do not support DDC/CI.
orangepi@orangepizero3 ~> ddcutil getvcp 10
Error opening "/sys/devices/platform/soc/6000000.hdmi/edid", No such file or directory
VCP code 0x10 (Brightness ): current value = 0, max value = 100
ddcutil
會(huì)顯示兩個(gè)顯示器 (其實(shí)只有一個(gè)), Invalid display
是 HDMI i2c (不能用 DDC/CI), 另一個(gè)好的是旁路接的 i2c-3.
會(huì)報(bào)錯(cuò), 但是不影響正常使用.
5 總結(jié)與展望
經(jīng)過(guò)一番努力, 以不足 5 元的硬件成本, 實(shí)現(xiàn)了在香橙派上使用 DDC/CI 功能.
DesignWare HDMI (dw-hdmi) 不支持 DDC/CI, 這個(gè)必須差評(píng) ! 這個(gè)控制器 (芯片 IP) 在很多處理器里面都用到了, 很明顯, 這些處理器也都不支持 DDC/CI 功能.
但是沒(méi)關(guān)系, 本文的解決方案, 適用于所有這些情況. 應(yīng)該適用于很多國(guó)產(chǎn)的單板機(jī) (SBC). 不支持 DDC/CI, 外接一個(gè)就好了, 成本也很低.
本文中的電路板, 由于引出了 HDMI 所有低速信號(hào), 也可以用于別的 HDMI 功能, 比如 CEC. 很多 PC 的 HDMI 接口并不支持 CEC, 如果想使用也要外接硬件.
這個(gè)電路板也可以用于調(diào)試小米電視:
相關(guān)文章: 《小米電視 root 的準(zhǔn)備工作》
本文使用 CC-BY-SA 4.0 許可發(fā)布.