首页 > 解决方案 > Creating a Device-Tree for the hardware on a PCI device

问题描述

我正在为一些通过 PCIe 卡控制的自定义硬件编写 Linux 设备驱动程序。PCIe 卡包含实现 SPI 和 I2C 总线主控器的 FPGA 以及其他定制固件。内核中已经有许多硬件的平台总线设备驱动程序,我想避免重复这项工作。

有没有办法创建一个设备树来描述卡上的硬件?

我的想法是,当卡被发现和探测时,它会映射 BARS,注册设备树并让现有的驱动程序获取映射的地址区域并提供与硬件的接口。

标签: linux-device-driverfpgadevice-tree

解决方案


这是 ARM 板的 pci0 上的 PCI 设备 (VID,PID: 1234,5678) 的片段:

&pci0 {
    pci0,0 {
        #address-cells = <3>;
        #size-cells = <2>;
        注册 = <0 0 0 0 0>;
        device_type = "pci";
        范围=<0x82000000 0x0 0x40000000 0x82000000 0x0 0x40000000 0 0x40000000>;

        fpga@0 {
            兼容=“pci1234,5678”;

            注册=<0x0000 0 0 0 0>;
            #address-cells = <1>;
            #size-cells = <1>;
            范围=<0 0x82000000 0x0 0x48000000 0x2000000>;

            i2c@100400 {
                兼容=“snps,designware-i2c”;
                注册=<0x100400 0x100>;
                #address-cells = <1>;
                #size-cells = <0>;
                中断 = <8>;
                i2c-sda-保持时间-ns = <30​​0>;
                时钟频率 = <100000>;
            };

            spi@101000 {
                兼容=“snps,dw-apb-ssi”;
                #address-cells = <1>;
                #size-cells = <0>;
                注册=<0x101000 0x1000>,<0x3c 0x18>;
                中断 = <10>;

                闪@0 {
                    兼容=“mx25l25635e”,“jedec,spi-nor”;
                    spi-max-频率=<20840000>;
                    注册 = <0>;
                };
            };
        };
    };
};

这是在 4.19 内核上运行的,并且可能从那以后就被破坏了。主要问题是设备树地址的 pci 转换不太正确,因此必须使用 range 属性来完成,最终使 DT 片段设备特定。


推荐阅读