linux-device-driver - Creating a Device-Tree for the hardware on a PCI device
问题描述
我正在为一些通过 PCIe 卡控制的自定义硬件编写 Linux 设备驱动程序。PCIe 卡包含实现 SPI 和 I2C 总线主控器的 FPGA 以及其他定制固件。内核中已经有许多硬件的平台总线设备驱动程序,我想避免重复这项工作。
有没有办法创建一个设备树来描述卡上的硬件?
我的想法是,当卡被发现和探测时,它会映射 BARS,注册设备树并让现有的驱动程序获取映射的地址区域并提供与硬件的接口。
解决方案
这是 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 = <300>; 时钟频率 = <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 片段设备特定。
推荐阅读
- python - 我想从 csv 文件中水平移动正弦波
- postgresql - 计算 Postgres 11 中值的百分位数、频率和百分位数频率
- c# - 如何在另一个打开的表单中将字符串添加到列表框?
- r - 使用 mutate_if (R dplyr package) 或其他函数?
- php - 生成简码并在管理区域显示
- javascript - 模态关闭后无法在页面上滚动
- gdb - “write () ../sysdeps/unix/syscall-template.S:84”处的段错误
- c# - 区域共享布局_ViewStart.cthml
- game-loop - 老虎机卷轴停止在正确位置时出现问题
- objective-c - 未找到 MDCBottomDrawerViewController 符号