SPI интерфейс с FPGA под управлением LINUX - PullRequest
0 голосов
/ 15 сентября 2018

У меня есть 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 /.

1 Ответ

0 голосов
/ 07 декабря 2018

spidev32766.0 - это узел устройства, полученный после добавления узла дерева устройств spidev@0 для устройства SPI на первой шине SPI (контроллер) spi@fff00000 с выбором микросхемы 0.

Свойство частоты spi-max-frequency = <0xb71b00> по соглашению должно быть записано в десятичном формате 12000000 вместо шестнадцатеричного, и в новых версиях spidev.c драйвер будет жаловаться на свойство compatible = "spidev", так как это свойство должно описывать реальное HW, а не какое-то ПО абстракция.

Этот номер шины (контроллера) 32766 динамически выделяется ядром и является полностью допустимым. В более старых ядрах, перед файлами дерева устройств, номер шины должен был быть определен в данных платформы файла платы, например: .bus_num = 0,

Как уже говорилось, в файловой системе /dev нет узлов устройств шины SPI (контроллера) spiX, только узлы устройств клиентов (чипов) spidevX.Y.

spidev.c - это особый тип драйвера, который зарегистрирован для универсальных клиентских (чиповых) устройств SPI, и его основной целью является экспорт низкоуровневого API-интерфейса SPI ядра в пользовательское пространство путем создания узлов символьных устройств под интерфейсом /dev.

Но если ваша цель - драйвер SPI для АЦП, возможно, лучше использовать для этого чипа существующий драйвер SPI для Linux, например, например. для AD7791, или написать свой. Linux обеспечивает поддержку устройств Industrial I / O Subsystem (iio), таких как аналого-цифровые преобразователи.

Linux Kernel Configuration
Device Drivers  --->
    ...
    <*>     Industrial I/O support --->
        --- Industrial I/O support
        ...
        Analog to digital converters  ---> 
            ...
            <*>  Analog Devices ADXYZ* ADC driver

В этом случае Linux будет экспортировать функциональность вашего устройства АЦП в пространство пользователя в /sys файловой системе:

/sys/bus/iio/devices/iio:deviceX

с атрибутами устройства, доступными в виде файлов:

-r--r--r--    1 root     root          4096 Jan  1 04:18 name
drwxr-xr-x    2 root     root             0 Jan  1 04:18 power
-rw-r--r--    1 root     root          4096 Jan  1 04:18 sampling_frequency
-r--r--r--    1 root     root          4096 Jan  1 04:18 sampling_frequency_available
...