У меня есть DE1-SoC FPGA с Ubuntu 16.04 через карту microSD. Я несколько новичок в дереве устройств, но сумел выяснить, как включить различные периферийные устройства на плате, декомпилировав файл .dtb в файл .dts с помощью dtc. Я сделал это и отредактировал файл .dts в nano, чтобы изменить порты SPI с «отключено» на «хорошо». Затем я перекомпилировал файл .dtb из измененного файла .dts (я также стер файл .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
Итак, я не уверен, что я делаю неправильно, что мои последовательные периферийные интерфейсы не работают. Конечная цель: SPI на FPGA подключается к встроенному АЦП (AD7928), к которому я хотел бы получить доступ через Linux с помощью программы, написанной на C. i2C работает нормально, но по какой-то причине SPI не отвечает.
Я думаю, что я мог пропустить шаг, но в этот момент я вроде как потерян, поэтому любая помощь будет великолепной.
РЕДАКТИРОВАТЬ: Забыли добавить запись .dts для SPI:
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.
Сделано немного свободы, добавив редактирование .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 /.