为PCI设备上的硬件创建设备树

时间:2019-01-25 14:41:44

标签: linux-device-driver fpga device-tree

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

是否有任何方法可以创建设备树来描述硬件 卡?

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

2 个答案:

答案 0 :(得分:0)

设备树绑定对于USB PCI设备来说是多余的,或者在检测时不需要。他们在探测过程中发送信息。

但是,是的,将需要SPI和I2C来添加dts(设备树源)文件。

提供的信息不足以提供重复代码的答案。

设备树用于定义板描述。避免了内核中的电路板描述。

答案 1 :(得分:0)

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

&pci0 {
    pci0,0 {
        #address-cells = <3>;
        #size-cells = <2>;
        reg = <0 0 0 0 0>;
        device_type = "pci";
        ranges = <0x82000000 0x0 0x40000000 0x82000000 0x0 0x40000000 0 0x40000000>;

        fpga@0 {
            compatible = "pci1234,5678";

            reg = <0x0000 0 0 0 0>;
            #address-cells = <1>;
            #size-cells = <1>;
            ranges = <0 0x82000000 0x0 0x48000000 0x2000000>;

            i2c@100400 {
                compatible = "snps,designware-i2c";
                reg = <0x100400 0x100>;
                #address-cells = <1>;
                #size-cells = <0>;
                interrupts = <8>;
                i2c-sda-hold-time-ns = <300>;
                clock-frequency = <100000>;
            };

            spi@101000 {
                compatible = "snps,dw-apb-ssi";
                #address-cells = <1>;
                #size-cells = <0>;
                reg = <0x101000 0x1000>, <0x3c 0x18>;
                interrupts = <10>;

                flash@0 {
                    compatible = "mx25l25635e", "jedec,spi-nor";
                    spi-max-frequency = <20840000>;
                    reg = <0>;
                };
            };
        };
    };
};

这是在4.19内核上进行的,此后可能一直很烂。主要问题是设备树地址的pci转换不太正确,因此必须使用ranges属性来完成,最终使DT代码段设备特定于此。