4、I2C/SPI总线配置:DDC/EDID读取所需的I2C总线设备树配置、触摸屏SPI配置示例

在DRM/KMS显示链路中,显示控制器与显示器之间的信息交换依赖于两条关键总线:I2C 用于读取显示器的EDID(扩展显示标识数据),SPI 则常用于连接触摸屏控制器。本章将深入讲解这两类总线的设备树配置方法,确保显示链路能够正确识别显示器参数,并实现触摸交互功能。

4.1 DDC/EDID读取与I2C总线配置

DDC(显示数据通道)是显示器与显卡之间通过I2C协议交换EDID数据的标准接口。EDID中包含了显示器的分辨率、刷新率、物理尺寸、色彩特性等关键参数。DRM/KMS驱动在初始化时,必须通过I2C总线读取EDID,才能正确配置显示模式。

4.1.1 I2C控制器设备树节点结构

在设备树中,I2C控制器通常作为SoC内部的一个外设节点出现,其子节点则代表挂载在该总线上的设备(如HDMI/DVI接口的DDC通道)。以下是一个典型的I2C控制器节点配置:

/* SoC内部I2C控制器节点 */
i2c@ff160000 {
    compatible = "snps,designware-i2c";
    reg = <0xff160000 0x1000>;
    interrupts = <GIC_SPI 64 IRQ_TYPE_LEVEL_HIGH>;
    clocks = <&i2c_clk>;
    clock-frequency = <100000>;  /* 100kHz标准模式 */
    #address-cells = <1>;
    #size-cells = <0>;
    status = "okay";

    /* DDC通道:HDMI接口的EDID读取 */
    ddc@50 {
        compatible = "hdmi-ddc";
        reg = <0x50>;           /* EDID的I2C地址固定为0x50 */
        ddc-i2c-bus = <&i2c0>; /* 引用外部I2C总线(可选) */
    };
};
关键点:EDID的I2C地址固定为0x50(7位地址),这是VESA标准规定的。设备树中reg属性必须与此一致,否则驱动无法读取显示器数据。

4.1.2 DDC通道与显示控制器的绑定

显示控制器节点需要通过ddc-i2c-bus属性引用I2C控制器,告知驱动使用哪条总线读取EDID。以下是一个HDMI显示控制器的设备树配置示例:

/* HDMI显示控制器节点 */
hdmi@ff980000 {
    compatible = "rockchip,rk3399-hdmi";
    reg = <0xff980000 0x20000>;
    interrupts = <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>;
    clocks = <&hdmi_clk>, <&hdmi_hclk>;
    clock-names = "iahb", "isfr";
    ddc-i2c-bus = <&i2c5>;   /* 引用I2C5控制器 */
    phys = <&hdmi_phy>;
    phy-names = "hdmi_phy";
    status = "okay";
};
常见错误:如果ddc-i2c-bus引用的I2C控制器在设备树中状态为disabled,或者时钟频率配置错误(如超过400kHz),EDID读取将失败,导致显示黑屏或分辨率异常。

4.1.3 I2C总线参数对比表

参数 标准模式 快速模式 高速模式
时钟频率 100 kHz 400 kHz 3.4 MHz
最大总线电容 400 pF 400 pF 100 pF
EDID读取兼容性 完全兼容 兼容(需显示器支持) 不推荐(部分显示器不稳定)
设备树属性 clock-frequency = <100000> clock-frequency = <400000> clock-frequency = <3400000>

4.1.4 EDID读取流程SVG图

EDID读取流程:I2C总线交互 显示控制器 DRM/KMS驱动 I2C控制器 clock-frequency=100kHz DDC通道 地址0x50 ddc-i2c-bus I2C传输 EDID数据 128字节块 分辨率/刷新率/色彩 读取请求 EDID数据返回显示控制器 说明:EDID读取是显示链路初始化的第一步,失败将导致无法输出正确分辨率。 I2C总线时钟频率建议使用100kHz以保证兼容性。

4.2 触摸屏SPI配置示例

在嵌入式显示系统中,触摸屏通常通过SPI总线与主控通信。SPI具有全双工、高速率的特点,适合传输触摸坐标数据。设备树中需要正确配置SPI控制器、触摸芯片的片选、中断以及最大传输速率。

4.2.1 SPI控制器设备树节点

SPI控制器节点定义总线的时钟、片选极性、数据位宽等参数。以下是一个典型的SPI控制器配置:

/* SoC内部SPI控制器节点 */
spi@ff1c0000 {
    compatible = "rockchip,rk3399-spi", "rockchip,rk3066-spi";
    reg = <0xff1c0000 0x1000>;
    interrupts = <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>;
    clocks = <&spi_clk>, <&spi_hclk>;
    clock-names = "spiclk", "apb_pclk";
    #address-cells = <1>;
    #size-cells = <0>;
    status = "okay";

    /* 触摸屏控制器子节点 */
    touch@0 {
        compatible = "goodix,gt911";
        reg = <0>;              /* 片选0 */
        spi-max-frequency = <10000000>; /* 10MHz */
        interrupt-parent = <&gpio3>;
        interrupts = <RK_PB5 IRQ_TYPE_EDGE_FALLING>;
        reset-gpios = <&gpio3 RK_PB6 GPIO_ACTIVE_LOW>;
        touchscreen-size-x = <1024>;
        touchscreen-size-y = <600>;
    };
};
配置要点:
  • reg = <0> 表示使用SPI控制器的第0个片选信号(CS0)。
  • spi-max-frequency 设置SPI时钟频率,触摸屏通常支持1MHz~10MHz。
  • interrupts 定义触摸中断引脚,用于通知主控有触摸事件。
  • reset-gpios 定义复位引脚,用于初始化触摸芯片。

4.2.2 SPI时序参数配置

SPI通信有四种模式(CPOL和CPHA的组合),触摸屏芯片通常使用模式0(CPOL=0, CPHA=0)或模式3(CPOL=1, CPHA=1)。设备树中可以通过spi-cpha和spi-cpol属性指定:

touch@0 {
    compatible = "ilitek,ili2511";
    reg = <0>;
    spi-max-frequency = <5000000>;
    spi-cpha;           /* CPHA = 1 */
    spi-cpol;           /* CPOL = 1,即模式3 */
    interrupt-parent = <&gpio1>;
    interrupts = <RK_PA2 IRQ_TYPE_EDGE_RISING>;
    reset-gpios = <&gpio1 RK_PA3 GPIO_ACTIVE_LOW>;
};

4.2.3 触摸屏SPI配置参数对比

参数 Goodix GT911 Ilitek ILI2511 FocalTech FT5x06
SPI模式 模式0 (CPOL=0, CPHA=0) 模式3 (CPOL=1, CPHA=1) 模式0 (CPOL=0, CPHA=0)
最大频率 10 MHz 5 MHz 2 MHz
中断触发 下降沿 上升沿 下降沿
复位电平 低电平有效 低电平有效 低电平有效
设备树compatible goodix,gt911 ilitek,ili2511 focaltech,ft5x06

4.2.4 SPI触摸屏数据流SVG图

SPI触摸屏数据流与中断处理 触摸屏芯片 GT911 / ILI2511 SPI控制器 10MHz / 模式0 中断控制器 GPIO中断 SPI数据(坐标) 中断信号(下降沿) 触发读取 触摸坐标数据 x, y, 压力值 输入子系统 上报触摸事件 说明:SPI触摸屏通过中断通知主控读取坐标数据,驱动将数据上报到输入子系统。

4.3 总线配置常见问题与调试方法

4.3.1 I2C/SPI调试步骤

  1. 检查设备树状态:确认I2C/SPI控制器节点status = "okay",且时钟、中断、引脚复用配置正确。
  2. 验证总线通信:使用i2cdetect或spidev_test工具测试总线是否正常工作。
  3. 检查EDID读取:通过cat /sys/class/drm/card0-HDMI-A-1/edid | hexdump查看EDID数据是否完整。
  4. 触摸屏中断测试:使用evtest工具监听触摸事件,确认中断触发正常。
  5. 内核日志分析:使用dmesg | grep -i i2c或dmesg | grep -i spi查看驱动加载信息。
调试陷阱:部分SoC的I2C/SPI引脚与GPIO复用,需要在设备树中正确配置pinctrl属性。例如,RK3399的I2C5引脚需要设置为i2c5-xfer功能,否则总线无法通信。

4.3.2 设备树配置检查清单

检查项 I2C (DDC/EDID) SPI (触摸屏)
控制器状态 status = "okay" status = "okay"
时钟频率 100kHz ~ 400kHz 1MHz ~ 10MHz
设备地址/片选 reg = <0x50> reg = <0> (CS0)
中断配置 通常不需要 必须配置interrupts
引脚复用 pinctrl-0 = <&i2c_xfer> pinctrl-0 = <&spi_xfer>
兼容性字符串 hdmi-ddc 或自定义 芯片厂商字符串

通过以上配置和调试方法,可以确保I2C/SPI总线在显示链路中稳定工作,为EDID读取和触摸交互提供可靠的硬件通信基础。