片上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设备树问题,所以发在该板块
你这i2c的设备树代码写的,你看我的
你这里pinctrl没写
页:
[1]