里先森 发表于 2020-3-1 20:04:44

片上i2c通过PCA954x转换器获取HDMI设备EDID

米联客MZ7035FD的HDMI接口上,其用于与设备通讯获取设备屏幕参数EDID的i2c接口,并非直接从PL的引脚出来布线到HDMI-A接口上,而是经过了一个i2c复用器PCA9548APW
我希望按照这篇文章(ZYNQ7000 #1 - PL端模拟HDMI信号输出环境下的Linux界面显示)一样,使用Digilent提供的相关ip实现hdmi视频信号分辨率自动识别。然而我遇到的问题是,我的板子上在hdmi-a接口与片子引出的i2c接口间加入了一块 PCA9548 i2c多路复用器件,原理图如下:


为此,我需要修改设备树并且在内核编译时加入pca954x的驱动支持。但是由于自身经验不足,不知应当如何修改设备树代码,找到了个接近的代码一葫芦画瓢修改了如下:
这个 PCA9548 是挂载在 pl 引出的 i2c0上,PCA9548 的地址如上面的原理图所示,三个地址位都被拉到了地,因此它在 i2c0 设备上的地址应当是 01110000 = 0x70 (七位数据位)。需要用到的 HDMI 的 i2c 接到了 PCA9548 的第四个分位上


/include/ "system-conf.dtsi"

/ {
};

&i2c0 {
clock-frequency = <100000>;
status = "okay"

i2cmux@70 {
compatible = "nxp,pca9548";
#address-cells = <1>;
#size-cells = <0>;
reg = <0x70>;
status = "okay";
               
i2cH1:i2chdmi@4{
   #address-cells = <1>;
   #size-cells = <0>;
   reg = <4>;

   /* routed to HDMI connector (H1) */
   }
}
};

&amba_pl {
axidma_chrdev: axidma_chrdev@0 {
compatible = "xlnx,axidma-chrdev";
dmas = <&axi_dma_0 0>;
dma-names = "axidma0_channel";
};

hdmi_encoder_0:hdmi_encoder {
compatible = "digilent,drm-encoder";
digilent,edid-i2c = <&i2cH1>;
};

xilinx_drm {
   compatible = "xlnx,drm";
   xlnx,vtc = <&v_tc_0>;
   xlnx,connector-type = "HDMIA";
   xlnx,encoder-slave = <&hdmi_encoder_0>;
   clocks = <&axi_dynclk_0>;
   dglnt,edid-i2c = <&i2cH1>;
   planes {
    xlnx,pixel-format = "rgb888";
    plane0 {
   dmas = <&axi_vdma_0 0>;
   dma-names = "dma";
    };
   };
};
};

按照我的理解,只需要给 xilinx_drm 与 hdmi_encoder 的 edid-i2c 赋予 i2c 节点即可。
请问我这样的设备树文件有问题吗?因为主要相关的是linux设备树问题,所以发在该板块

ぉ沙皮狗的忧伤 发表于 2020-3-3 09:35:33

你这i2c的设备树代码写的,你看我的

ぉ沙皮狗的忧伤 发表于 2020-3-3 09:36:54

你这里pinctrl没写
页: [1]
查看完整版本: 片上i2c通过PCA954x转换器获取HDMI设备EDID