香橙派 HDMI 显示器 DDC/CI 踩坑记录

文章讲述了作者在香橙派zero3上实现DDC/CI功能遇到的问题,发现H618处理器的DesignWareHDMI控制器不支持此功能。通过旁路HDMI的i2c总线并连接板载接口,以低成本实现DDC/CI,揭示了硬件限制与解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

书接上文, 自从知道了 DDC/CI 这个大部分显示器都支持的好用功能之后, 就愉快的跑去香橙派上使用了. 结果, 不支持 ? 这是什么情况 ?? 树莓派都支持, 香橙派居然不支持 ?

一通研究之后发现, 还真的是硬件不支持 ! 这怎么行 ? 俗话说的好, 有条件要上, 没有条件创造条件也要上 !

最终, 在坚持不懈的努力之下, 以不足 5 元 (3.4 元) 的硬件成本, 在香橙派上成功实现了 DDC/CI 功能.


相关文章:

目录

  • 1 香橙派 zero3 不支持 DDC/CI
  • 2 H618 处理器的 DesignWare HDMI 控制器不支持 DDC/CI
    • 2.1 香橙派 HDMI i2c 总线没有从机地址 37
    • 2.2 查找相关的 Linux 内核驱动代码
    • 2.3 DesignWare HDMI 硬件不支持
  • 3 旁路引出 HDMI 的 i2c
  • 4 测试成功
  • 5 总结与展望

1 香橙派 zero3 不支持 DDC/CI

测试设备: 香橙派 Orange pi Zero3 (内存 1GB, 处理器 全志 H618)

操作系统: Debian 12 (官方镜像, Linux 6.1)

话不多说, 直接使用 ddcutil 进行测试:

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.

嗯 ? 什么情况 ??

同一个显示器, 使用 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

系统版本信息:

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 总线没有从机地址 37

我们知道, DDC/CI 功能是通过 i2c 总线实现的, 那看看 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, 这个应该就是 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) 连接同一个显示器的情况:

> 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 从机的地址, 其中 50 用于 EDID (获取显示器信息), 37 用于 DDC/CI.

香橙派 HDMI i2c 有 50 地址, 所以 EDID 功能正常. 然而, 别的从机地址都有, 就是没有该死的 37 地址 !

这种情况好奇怪啊, 你说 i2c 不正常吧, 它有 50 地址, EDID 正常, 别的从机地址也都有. 你说 i2c 正常吧, 它就是没有从机地址 37. 你说气人不气人 !

2.2 查找相关的 Linux 内核驱动代码

我们去 Linux 代码中找找, 搜索关键词 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;

同一个文件第 42 行:

#define DDC_CI_ADDR		0x37

嗯, 破案了, 原来 Linux 内核驱动代码中, 故意屏蔽了从机地址 37 ! 所以才会别的从机地址都有, 就是 37 没有.

但是, 为啥呢 ?

2.3 DesignWare HDMI 硬件不支持

使用 git blame 查找这段代码对应的提交, 找到了 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

这是一个 5 年前 (2019 年) 的内核提交. 大致意思是说, H618 芯片使用的 DesignWare HDMI 接口 IP 内置的 i2c 功能并不是通用的 i2c 硬件, 只支持读写单个字节, 或读取不超过 8 个的连续字节. 所以在硬件级别就不支持 DDC/CI 功能 (需要连续读写多个字节). 内核中的驱动只是在模拟一个 i2c 硬件, 但是无法使用 i2c 的全部功能.

好了, 这下实锤是硬件不支持了.

相关链接:

3 旁路引出 HDMI 的 i2c

i2c 总线支持多主机多从机, 也就是多个设备可以同时连接在一条总线上, 其中任意设备都可以在任意时间充当主机, 发起数据传输. i2c 总线有仲裁功能, 即使两个主机同时发起通信, 数据也不会丢失, 总线仍然可以正常工作.

虽然香橙派的 HDMI i2c 不支持 DDC/CI, 但是香橙派还有别的板载 i2c 接口, 如图:

在这里插入图片描述

(来源: http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-Zero-3.html)

那么, 如果把 HDMI 中的 i2c 旁路引出, 连接到板载的 i2c 接口, 是不是就能使用 DDC/CI 呢 ?

为了实现这个目标, 一种简单粗暴的方法是, 直接剥开 HDMI 线缆, 找到 i2c 的 SCL, SDA 这两条信号线, 接线 !

但是, 想做的更优雅一些: KiCad, 启动 !

在这里插入图片描述

这是原理图, 很简单: 两个 HDMI 接头, 20 根线直接对应连接 (直通), 另有一个排针, 旁路引出 13 ~ 19 号所有的低速信号线. (1 ~ 12 是 HDMI 的 4 组 TMDS 高速差分信号线)

在这里插入图片描述

电路板布线如图.

在这里插入图片描述

嘉立创 PCB 打样.

在这里插入图片描述

焊接之后. 这块 PCB 成本 2.5 元, 元件成本总计 0.88 元, 所以 PCBA 成本 3.4 元 (每片).

4 测试成功

如图所示接线:

在这里插入图片描述

从香橙派出来 micro-HDMI 转 HDMI 短线, 进旁路电路板, 另一头 HDMI 线缆再接显示器. i2c 两根线 SCL, SDA 接香橙派板载排针.


小知识: 香橙派 zero3 的 micro-HDMI 转接头不要买这种, 会和旁边的插头挤在一起:

在这里插入图片描述


需要配置开启香橙派的 i2c-3 板载接口:

sudo orangepi-config

进入文本图形化配置界面, 菜单选择 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 会显示两个显示器 (其实只有一个), Invalid display 是 HDMI i2c (不能用 DDC/CI), 另一个好的是旁路接的 i2c-3.

会报错, 但是不影响正常使用.

5 总结与展望

经过一番努力, 以不足 5 元的硬件成本, 实现了在香橙派上使用 DDC/CI 功能.

DesignWare HDMI (dw-hdmi) 不支持 DDC/CI, 这个必须差评 ! 这个控制器 (芯片 IP) 在很多处理器里面都用到了, 很明显, 这些处理器也都不支持 DDC/CI 功能.

但是没关系, 本文的解决方案, 适用于所有这些情况. 应该适用于很多国产的单板机 (SBC). 不支持 DDC/CI, 外接一个就好了, 成本也很低.

本文中的电路板, 由于引出了 HDMI 所有低速信号, 也可以用于别的 HDMI 功能, 比如 CEC. 很多 PC 的 HDMI 接口并不支持 CEC, 如果想使用也要外接硬件.

这个电路板也可以用于调试小米电视:

在这里插入图片描述

相关文章: 《小米电视 root 的准备工作》

https://blog.csdn.net/secext2022/article/details/135762058


本文使用 CC-BY-SA 4.0 许可发布.

<think>好的,我现在要帮用户解决在香橙上配置和使用HDMI摄像头的问题。首先,我需要先了解用户的具体需求。用户提到的是HDMI摄像头,但根据提供的引用内容,香橙现有的教程和引用信息主要涉及USB摄像头,比如引用[2]中提到的使用v4l2-ctl命令检测USB摄像头。这可能意味着用户可能混淆了HDMI摄像头和HDMI显示器的连接方式。 接下来,我需要确认香橙是否支持直接连接HDMI摄像头。通常来说,HDMI接口多用于视频输出,而非输入,所以HDMI摄像头可能需要特定的硬件支持或驱动程序。查阅已有的引用,发现引用[1]提到香橙HDMI0接口用于显示Linux桌面,而HDMI1目前不支持。这说明HDMI接口主要用于输出,可能不支持直接接入摄像头作为输入设备。 因此,用户可能需要使用USB摄像头而非HDMI接口的摄像头。引用[2]详细说明了如何安装USB摄像头,包括使用v4l-utils工具检测设备节点。这时候,我应该建议用户检查他们的摄像头类型,如果是USB的,按照引用[2]的步骤操作。 但如果用户确实有HDMI摄像头,可能需要额外的硬件转换器,比如HDMI到CSI的适配器,或者使用视频采集卡将HDMI信号转换为USB。这种情况下,可能需要配置相关的视频采集设备驱动,但这超出了现有引用提供的信息范围。 另外,引用[3]提到了安装驱动和修复磁盘的问题,可能在配置过程中遇到驱动兼容性问题时需要用到fsck命令修复,这也需要提醒用户注意。 总结下来,用户的问题可能源于对摄像头接口类型的误解,需要引导他们正确使用USB摄像头,或者寻找将HDMI摄像头转换为香橙支持的接口的方法。同时,提供已有的USB摄像头配置教程,并建议替代方案。</think>### 如何在香橙上配置和使用摄像头 根据你的需求,香橙连接摄像头主要通过USB接口实现,而HDMI接口目前主要用于显示输出(如引用[1]所述,HDMI0支持系统桌面显示)。以下是两种摄像头接入方案的详细说明: --- #### **方案一:使用USB摄像头(推荐)** 1. **硬件连接** 将USB摄像头插入香橙的USB接口,系统会自动识别设备。 *注:若使用高功耗摄像头,建议外接供电。* 2. **安装工具包** ```bash sudo apt update sudo apt install -y v4l-utils # 包含摄像头调试工具 ``` 3. **检测设备** 执行命令查看摄像头节点信息: ```bash v4l2-ctl --list-devices ``` 输出示例(如引用[2]所示): ``` USB 2.0 Camera (usb-sunxi-ehci-1): /dev/video0 ``` 4. **测试摄像头** 使用以下工具实时预览: ```bash sudo apt install -y ffmpeg ffplay -f v4l2 -i /dev/video0 # 按q键退出 ``` --- #### **方案二:HDMI摄像头转接方案** 若需使用HDMI接口的摄像头(如工业相机),需通过以下步骤实现: 1. **硬件要求** - HDMI转CSI适配器(如Raspberry Pi官方CSI转接板) - 摄像头需支持MIPI CSI协议 2. **连接方式** 将HDMI摄像头信号通过适配器接入香橙的CSI接口(需确认硬件兼容性)。 3. **驱动配置** 目前香橙官方未提供HDMI摄像头直接支持,需自行编译内核驱动或使用第三方方案。 *注:此过程可能涉及复杂调试(如引用[3]提到的驱动兼容性问题)。* --- #### **常见问题解决** 1. **摄像头未识别** - 检查USB接口供电 - 执行 `dmesg | grep usb` 查看内核日志 2. **图像显示异常** 尝试调整分辨率: ```bash v4l2-ctl --set-fmt-video=width=640,height=480,pixelformat=YUYV ``` 3. **系统卡顿或崩溃** 若安装过程中出现数据损坏(如引用[3]所述),可尝试: ```bash fsck -y /dev/sdax # sdax为损坏的磁盘分区 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值