通过 HDMI 接口控制 OLED 显示屏

💡 原文中文,约7400字,阅读约需18分钟。
📝

内容提要

本文介绍了作者如何将SSD1306 OLED显示器连接到笔记本电脑的HDMI端口,通过焊接连接器和使用Python脚本实现。作者尝试了使用xrandr创建虚拟显示器,但遇到问题。最终,作者成功将帧缓冲转储到OLED屏幕上,并展示了演示视频。

🔎

延伸解读

HDMI 中的隐藏 i2c 总线

HDMI 接口不仅传输视频信号,还包含一条用于 DDC 通信的 i2c 总线。作者利用这一点,将 SSD1306 OLED 直接连接到 HDMI 的 SCL、SDA、5V 和地线引脚。热插拔检测引脚需要上拉电阻,使电脑识别到显示器连接。这展示了 HDMI 接口的复用能力,但操作需谨慎,错误连接可能损坏硬件。

Linux 下的 i2c 设备访问与风险

在 Linux 中,通过加载 i2c-dev 模块可以访问 i2c 设备,但设备命名可能变化,如从 /dev/i2c-3 变为 /dev/i2c-4。使用 i2cdetect 和 ddcutil 可帮助识别总线。作者强调,错误操作 i2c 设备可能损坏笔记本电脑硬件,因此需确认总线编号并谨慎写入。

帧缓冲转储与虚拟显示器创建

作者通过 xrandr 扩展帧缓冲区并定义虚拟显示器,将帧缓冲内容转储到 OLED。关键步骤包括设置 --fb 和 --panning 参数,以及使用 --setmonitor 创建虚拟显示器。这种方法避免了直接修改视频驱动,但存在鼠标跟踪区域不规则的局限,可能影响操作体验。

性能限制与优化方向

由于 i2c 总线速度限制,直接通过 SMBus 传输帧率仅约 2FPS,而绕过 SMBus 限制后可达 5-10FPS。作者指出,通过只发送变化区域而非全帧重绘,可进一步提升帧率。但考虑到屏幕尺寸小且无实际用途,作者未实施优化。这反映了 i2c 在高速数据传输中的瓶颈。

❓

Q&A

如何将SSD1306 OLED显示器连接到笔记本电脑的HDMI端口?

通过焊接连接器,将SSD1306 OLED显示器的引脚连接到HDMI电缆的相应引脚上,并使用Python脚本进行通信。

在Linux系统中如何访问i2c设备?

通过加载i2c-dev模块,并使用i2cdetect工具扫描i2c总线上的设备。

使用xrandr创建虚拟显示器时遇到了什么问题?

作者在尝试创建虚拟显示器时遇到了一些困难,最终未能成功将其与HDMI输出关联。

如何通过Python脚本与SSD1306显示器进行通信?

使用smbus库,通过I2C地址发送初始化命令和数据来控制显示器。

HDMI电缆中隐藏的i2c总线有什么作用?

i2c总线用于与显示器进行通信,读取显示器信息和控制参数。

作者对这个实验的最终看法是什么?

作者认为这个小屏幕没有实际用途,但对实验过程感到满意。

🏷️

标签

➡️

继续阅读