米联客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设备树问题,所以发在该板块
|