【发布时间】:2018-09-15 14:27:25
【问题描述】:
我有一个通过 microSD 卡运行 Ubuntu 16.04 的 DE1-SoC FPGA。我对设备树有些陌生,但通过使用 dtc 将 .dtb 文件反编译为 .dts 文件,我设法弄清楚了如何启用板上的各种外围设备。我这样做并在 nano 中编辑了 .dts 文件以将 SPI 端口从“禁用”更改为“好的”。然后,我从修改后的 .dts 文件中重新编译了 .dtb 文件(我还删除了 .dts 文件并重新反编译了第二个 .dts 文件以查看更改是否生效,并且确实生效了)。
此时,我重新启动系统,然后转到 cd/dev/,但没有列出 spidev 或 spi* 或 spidev*。当我转到 cd/proc/device-tree 时,我列出了以下内容:
ubuntu@DE1_SoC:/proc/device-tree$ dir
3-3-v-regulator chosen leds name
#address-cells compatible __local_fixups__ #size-cells
aliases cpus memory soc
bridge@0xff200000 intc@fffed000 model __symbols__
当我导航到 /soc/ 文件夹时,我有以下内容,这与我拥有的 .dts 文件一致:
ubuntu@DE1_SoC:/proc/device-tree/soc$ dir
#address-cells gpio@ff70a000 #size-cells
amba i2c@ffc04000 snoop-control-unit@fffec000
base-fpga-region i2c@ffc05000 spi@ff705000
can@ffc00000 i2c@ffc06000 spi@fff00000
can@ffc01000 i2c@ffc07000 spi@fff01000
clkmgr@ffd04000 interrupt-parent sram@ffff0000
compatible l2-cache@fffef000 sysmgr@ffd08000
device_type l2edac@xffd08140 timer0@ffc08000
dwmmc0@ff704000 l3regs@0xff800000 timer1@ffc09000
ethernet@ff700000 name timer2@ffd00000
ethernet@ff702000 nand@ff900000 timer3@ffd01000
fpga2sdram-bridge ocramedac@ffd08144 timer@fffec600
fpga-bridge@ff400000 ranges usb@ffb00000
fpga-bridge@ff500000 rstmgr@ffd05000 usb@ffb40000
fpga-bridge@ff600000 sdramedac usbphy@0
fpga-mgr@ff706000 sdr@ffc25000 watchdog@ffd02000
gpio@ff708000 serial0@ffc02000 watchdog@ffd03000
gpio@ff709000 serial1@ffc03000
所以,我不确定我做错了什么,我的串行外围接口无法正常工作。最终目标:FPGA 上的 SPI 连接到板载 ADC (AD7928),我想使用 C 编写的程序通过 Linux 访问它。i2C 工作正常,但由于某种原因 SPI 没有响应。
我想我可能错过了一步,但在这一点上我有点迷茫,所以任何帮助都会很棒。
编辑:忘记为 SPI 添加 .dts 条目:
spi@fff00000 {
compatible = "snps,dw-apb-ssi";
#address-cells = <0x1>;
#size-cells = <0x0>;
reg = <0xfff00000 0x1000>;
interrupts = <0x0 0x9a 0x4>;
num-cs = <0x4>;
tx-dma-channel = <0x2c 0x10>;
rx-dma-channel = <0x2c 0x11>;
clocks = <0x11>;
status = "okay";
linux,phandle = <0x59>;
phandle = <0x59>;
};
spi@fff01000 {
compatible = "snps,dw-apb-ssi";
#address-cells = <0x1>;
#size-cells = <0x0>;
reg = <0xfff01000 0x1000>;
interrupts = <0x0 0x9b 0x4>;
num-cs = <0x4>;
tx-dma-channel = <0x2c 0x14>;
rx-dma-channel = <0x2c 0x15>;
clocks = <0x11>;
status = "okay";
linux,phandle = <0x5a>;
phandle = <0x5a>;
};
并且地址与SPIM的板子datasheet一致。
通过添加更多编辑 .dts 来获得一点余地:
spi@fff00000 {
compatible = "snps,dw-apb-ssi";
#address-cells = <0x1>;
#size-cells = <0x0>;
reg = <0xfff00000 0x1000>;
interrupts = <0x0 0x9a 0x4>;
num-cs = <0x4>;
tx-dma-channel = <0x2c 0x10>;
rx-dma-channel = <0x2c 0x11>;
clocks = <0x11>;
status = "okay";
linux,phandle = <0x59>;
phandle = <0x59>;
spidev@0 {
compatible = "spidev";
reg = <0x0>;
spi-max-frequency = <0xb71b00>;
enable-dma = <0x0>;
}
现在 spidev32766.0 出现在我的 /dev/ 文件夹中。
【问题讨论】:
-
您需要研究您正在使用的内核版本的 Documentation/spi/spi-summary 文件。 SPI 是总线,而不是“端口”。您所做的 DT 更改仅适用于 SPI 主控制器。这只是 SPI 总线的一端。你没有为另一端做任何事情,即 SPI 从设备。
-
感谢您的回复。我在 .dts 文件中添加了一个条目(参见上面的编辑)并获得了一个新的 blob,然后 spidev32766.0 出现在 /dev/ 中,所以我认为 Linux 正在识别其中一个大师,对吧?
-
SPI 主控制器根本不会在 /dev 目录中有设备节点。有没有注意到/dev目录下有些设备如eth0不在?建议你多学习,例如文档/devicetree/bindings/spi/spi-bus.txt。 SPI 从设备需要为其定义片选(例如 GPIO 引脚)。
-
“我想我明白了……” -- 如果你真的明白了,那么当你使用“SPI”这个词时,你会更有眼光。如果你不知道你指的是主人还是奴隶,那么你会感到困惑。 “它表明这些 SPI 确实出现在 dev 中” -- 仅因为有四 (4) 个 SPI slave 设备实例(使用 kludge 协议驱动程序 spidev) 为该 SPI master 控制器定义。不,FPGA 不会违反 Linux 内核的约定。看来您需要进一步研究Documentation/spi/spi-summary。
标签: linux fpga spi device-tree