我正在为一些通过 PCIe 卡控制的自定义硬件编写 Linux 设备驱动程序。 PCIe 卡包含一个实现 SPI 和 I2C 总线主控的 FPGA 以及其他定制固件。内核中已经有许多硬件的平台总线设备驱动程序,我想避免重复这项工作。
有没有办法创建设备树来描述硬件 卡?
我的想法是,当卡被发现和探测时,它将映射 BARS、注册设备树并让现有驱动程序拾取映射的地址区域并提供与硬件的接口。
这是 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>;
};
};
};
};
};
这是在内核 v4.19 上运行的,此后可能已被破坏。主要问题是设备树地址的 PCI 转换不太正确,因此必须使用 range 属性来完成,这最终使 DT 片段设备特定。
在探测 USB PCI 设备时,设备树绑定是多余的或者不是必需的。他们发送信息作为探测过程的一部分。
但是,SPI 和 I2C 需要添加到 dts(设备树源)文件中。
提供的信息不足以提供代码重复的答案。
设备树用于定义板卡描述。这避免了内核中的板描述。