香橙派 HDMI 顯示器 DDC/CI 踩坑記錄

書(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)文章:

目錄

  • 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 硬件不支持
  • 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)鏈接:

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 接口, 如圖:


Orange pi Zero3 板載排針接口

(來(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)線)


電路板布線如圖

PCB 打樣

嘉立創(chuàng) PCB 打樣.


PCBA 焊接后

焊接之后. 這塊 PCB 成本 2.5 元, 元件成本總計(jì) 0.88 元, 所以 PCBA 成本 3.4 元 (每片).

4 測(cè)試成功

如圖所示接線:


測(cè)試接線

從香橙派出來(lái) micro-HDMI 轉(zhuǎn) HDMI 短線, 進(jìn)旁路電路板, 另一頭 HDMI 線纜再接顯示器. i2c 兩根線 SCL, SDA 接香橙派板載排針.


小知識(shí): 香橙派 zero3 的 micro-HDMI 轉(zhuǎn)接頭不要買這種, 會(huì)和旁邊的插頭擠在一起:


轉(zhuǎn)接頭擁擠

需要配置開(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)試小米電視:


調(diào)試接線

相關(guān)文章: 《小米電視 root 的準(zhǔn)備工作》


本文使用 CC-BY-SA 4.0 許可發(fā)布.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末屑宠,一起剝皮案震驚了整個(gè)濱河市侵状,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拓瞪,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件絮供,死亡現(xiàn)場(chǎng)離奇詭異硫戈,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)罚随,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門玉工,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人淘菩,你說(shuō)我怎么就攤上這事遵班。” “怎么了瞄勾?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵费奸,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我进陡,道長(zhǎng)愿阐,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任趾疚,我火速辦了婚禮缨历,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘糙麦。我一直安慰自己辛孵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布赡磅。 她就那樣靜靜地躺著魄缚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪焚廊。 梳的紋絲不亂的頭發(fā)上冶匹,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音咆瘟,去河邊找鬼嚼隘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛袒餐,可吹牛的內(nèi)容都是我干的飞蛹。 我是一名探鬼主播谤狡,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼卧檐!你這毒婦竟也來(lái)了墓懂?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤泄隔,失蹤者是張志新(化名)和其女友劉穎拒贱,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體佛嬉,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逻澳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了暖呕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斜做。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖湾揽,靈堂內(nèi)的尸體忽然破棺而出瓤逼,到底是詐尸還是另有隱情,我是刑警寧澤库物,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布霸旗,位于F島的核電站,受9級(jí)特大地震影響戚揭,放射性物質(zhì)發(fā)生泄漏诱告。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一民晒、第九天 我趴在偏房一處隱蔽的房頂上張望精居。 院中可真熱鬧,春花似錦潜必、人聲如沸靴姿。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)佛吓。三九已至,卻和暖如春垂攘,著一層夾襖步出監(jiān)牢的瞬間维雇,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工搜贤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钝凶。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓仪芒,卻偏偏與公主長(zhǎng)得像唁影,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子掂名,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容