LINUX.ORG.RU

Проблема с настройкой SPI на Orange Pi 4 Rockchip 3399, Armbian Linux

 , ,


1

1

Всем добрый день. Столкнулся с проблемой настройки SPI на Orange Pi 4 под Armbian. Как понял из документации, настройка происходит путем задания overlays в файле /boot/armbianEnv.txt, после чего должен обновиться список девайсов /dev, однако этого не происходит. Сейчас я использую следующие настройки:

verbosity=1

bootlogo=false

overlay_prefix=rockchip

rootdev=UUID=946e374a-7ca8-488d-ad86-ab38ccfc7cc1

rootfstype=ext4

overlays=spi-spidev

param_spidev_spi_bus=0

usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u

Примечательно также, что если добавить в overlays w1-gpio или uart1, новых девайсов также не появится. Еще одна проблема состоит в том, что при использовании param_spidev_spi_bus=0 пропадает соединение Ethernet, а при задании param_spidev_spi_bus=1 плата и вовсе перестает загружаться. Мне кажется это как-то связано с особенностями Rockchip 3399, но я не силен в данной теме.

Пробовал системы Armbian 21.02.1 buster linux 4.4.213 и Armbian 21.02.1 Bionic with Linux 5.10.12, однако результат тот же. К слову Armbian Bionic поддерживает включение SPI из раздела Hardware в armbian-config, но это также не решает проблему.

Прошу знающих людей подсказать решение или дать направление куда копать.

А смысл этого overlays в файле /boot/armbianEnv.txt понятен? Не знаю, что там в Armbian-е наворочено в плане обработки /boot/armbianEnv.txt. Могу лишь предположить, что overlays в файле /boot/armbianEnv.txt как-то управляет подгрузкой оверлеев в fdt, которые конфигурируют коммутацию внутренних устройств. Не факт, что нужные/корректные fdt там имеются. Но это только предположение.

zloy_starper ★★★
()

В связи с тем, что было не очень понятно как работают overlays на Armbian, было предпринято решение отредактировать dtb файл. dtb-файлы располагаются по пути /boot/dtb/rockchip. Там присутствуют следующие файлы:

rk3399-firefly.dtb          rk3399-nanopi4-rev04.dtb  rk3399-nanopi-m4.dtb      rk3399-orangepi.dtb
rk3328-nanopi-r2-rev00.dtb  rk3399-helios64.dtb       rk3399-nanopi4-rev06.dtb  rk3399-nanopi-m4v2.dtb  rk3399-roc-pc.dtb
rk3328-nanopi-r2-rev02.dtb  rk3399-nanopc-t4.dtb      rk3399-nanopi4-rev07.dtb  rk3399-nanopi-neo4.dtb
rk3328-nanopi-r2-rev03.dtb  rk3399-nanopi4-rev00.dtb  rk3399-nanopi4-rev21.dtb  rk3399-orangepi-4.dtb
rk3328-nanopi-r2-rev04.dtb  rk3399-nanopi4-rev01.dtb  rk3399-nanopi4-rev22.dtb

Так как я использую OrangePi 4, я редактировал rk3399-orangepi-4.dtb: включил spi, отключил uart4 , так как там используются одни и те же пины.

Использовал команды:

fdtput /boot/dtb/rockchip/rk3399-orangepi-4.dtb /spi@ff1d0000 status -t s "okay"

fdtput /boot/dtb/rockchip/rk3399-orangepi-4.dtb /serial@ff370000 status -t s "disabled"

Проверил результат на всякий случай (перевел dtb файл в dts):

 spi@ff1d0000 {
                compatible = "rockchip,rk3399-spi\0rockchip,rk3066-spi";
                reg = < 0x00 0xff1d0000 0x00 0x1000 >;
                clocks = < 0x08 0x48 0x08 0x15c >;
                clock-names = "spiclk\0apb_pclk";
                interrupts = < 0x00 0x35 0x04 0x00 >;
                dmas = < 0x49 0x0c 0x49 0x0d >;
                dma-names = "tx\0rx";
                pinctrl-names = "default\0sleep";
                pinctrl-0 = < 0x4e 0x4f 0x50 0x51 >;
                #address-cells = < 0x01 >;
                #size-cells = < 0x00 >;
                status = "okay";
                pinctrl-1 = < 0x52 >;
                phandle = < 0x100 >;

                spidev@0 {
                        compatible = "rockchip,spidev";
                        reg = < 0x00 >;
                        spi-max-frequency = < 0x989680 >;
                        status = "okay";
                        phandle = < 0x101 >;
                };
        };

Перезагрузился, просмотрел список /dev

aer_inject       i2c-0        loop-control        pts        tty12  tty3   tty47  tty7     vcs4
ashmem           i2c-1        mali0               ram0       tty13  tty30  tty48  tty8     vcs5
autofs           i2c-3        mapper              random     tty14  tty31  tty49  tty9     vcs6
block            i2c-4        mem                 rfkill     tty15  tty32  tty5   ttyFIQ0  vcsa
btrfs-control    i2c-7        memory_bandwidth    rkvdec     tty16  tty33  tty50  ttyS0    vcsa1
bus              iio:device0  mmcblk1             rtc        tty17  tty34  tty51  uhid     vcsa2
char             initctl      mmcblk1boot0        rtc0       tty18  tty35  tty52  uinput   vcsa3
console          input        mmcblk1boot1        shm        tty19  tty36  tty53  urandom  vcsa4
cpu_dma_latency  kmsg         mmcblk1p1           snapshot   tty2   tty37  tty54  usbmon0  vcsa5
cuse             kvm          mmcblk1rpmb         snd        tty20  tty38  tty55  usbmon1  vcsa6
disk             log          mqueue              spidev1.0  tty21  tty39  tty56  usbmon2  vendor_storage
dri              loop0        net                 stderr     tty22  tty4   tty57  usbmon3  vhci
fb0              loop1        network_latency     stdin      tty23  tty40  tty58  usbmon5  vhost-net
fd               loop2        network_throughput  stdout     tty24  tty41  tty59  usbmon6  vpu_service
full             loop3        null                tty        tty25  tty42  tty6   usbmon7  watchdog
fuse             loop4        opteearmtz00        tty0       tty26  tty43  tty60  vcs      zero
hdmi_hdcp1x      loop5        port                tty1       tty27  tty44  tty61  vcs1
hugepages        loop6        ppp                 tty10      tty28  tty45  tty62  vcs2
hwrng            loop7        ptmx                tty11      tty29  tty46  tty63  vcs3

Как видим, появился spidev1.0. Радости не было предела. Осталось проверить работоспособность spi. Для теста я создал файл spidev_test.c и скопипастил туда вот этот скрипт https://raw.githubusercontent.com/raspberrypi/linux/rpi-3.10.y/Documentation/spi/spidev_test.c, предварительно заменив в 32 строке имя девайса static const char *device = "/dev/spidev1.1";

После чего запустил скрипт ./spidev_test, предварительно замкнув MOSI и MISO на плате (19 и 21 пины)

Получил результат:

spi mode: 0
bits per word: 8
max speed: 500000 Hz (500 KHz)

FF FF FF FF FF FF
40 00 00 00 00 95
FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF FF FF FF FF
DE AD BE EF BA AD
F0 0D


Что свидетельствует о том, что spi находится в рабочем состоянии. Если получилось что-то вроде


spi mode: 0
bits per word: 8
max speed: 500000 Hz (500 KHz)

FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF

то либо пины не замкнуты, либо spi не активен.

Надеюсь это решение кому-то еще поможет.

reverse28
() автор топика
7 апреля 2021 г.
Ответ на: комментарий от Assembler

Да, собирал, пытался добиться более высокой скорости загрузки, но что-то пошло не так и она только увеличилась, так что откатился назад.

reverse28
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.