LINUX.ORG.RU

Repka Pi 4 sc16is752 device tree overlay

 , , ,


0

1

Нужно подключить rs232-rs485 hat к Repka Pi 4 (Repka OS, Optimal ver. 2.2).

https://www.chipdip.ru/product/rs485-rs232-hat-plata-rasshireniya-dlya-raspberry-waveshare-9001319683

https://www.waveshare.com/wiki/RS485_RS232_HAT?srsltid=AfmBOooGCPgStrUvVgwbIssFFfpxeC-5BynWl3avsl51uxLSw_iOeuIw

Прежде всего, нужно добавить поддержку sc16is752 (SPI -> 2 UART). На Raspberry Pi 4 получилось завести эту микросхему через SPI1 путем добавления в /boot/firmware/config.txt:

dtoverlay=spi1-1cs,cs0_spidev=off
dtoverlay=sc16is75x-spi,sc16is752,spi1-0,int_pin=24

После этого появлялись порты /dev/ttySC0 и /dev/ttySC1.

Для Repka Pi 4 пытался различные device tree конфигурацию, и ничего не работает.

Например, одна из последних:

/dts-v1/;
/plugin/;

/ {
    compatible = "allwinner,sun50i-h6";
    fragment@0 {
        target = <&spi0>;
        __overlay__ {
            status = "okay";
        };
    };

   fragment@1 {
      target = <&spi0>;
      __overlay__ {
         #address-cells = <1>;
         #size-cells = <0>;
         status = "okay";

         sc16is752: sc16is752@0 {
            compatible = "nxp,sc16is752";
            reg = <0>; /* CE0 */
            spi-max-frequency = <4000000>;
            interrupt-parent = <&gpio>;
	    interrupts = <357 2>; /* IRQ_TYPE_EDGE_FALLING */
            clocks = <&klok>;

            klok: klok {
               compatible = "fixed-clock";
               #clock-cells = <0>;
               clock-frequency = <14745600>;
            };
         };
      };
   };
};

Менял spi0, spi1, interrupts. Пробовал различные варианты, что смог найти на github, но ничего не работает. Пытался также декомпилировать overlay из Raspberry Pi, но даже с минимальными правками не работает. Впервые пишу device tree overlay. Не могу понять что делаю не так.

Подключил плату к Репке не через 40-пиновый разъем, а через провода к боковым выводам. Подключение Шилд - Repka (вариант подключения 2), номер 40-пинового вывода:

VCC - +5 GND - GND SCLK - 23 (SPI0-CLK) MOSI - 19 (SPI0-MOSI) MISO - 21 (SPI0-MISO) CS - 24 (SPI0-CS0) IRQ - 31 (GPIO) EN - 32 (GPIO)

Шаги по применению overlay:

  1. Сохранение/редактирование dts файла в /root/ :
vi sc16is752-n.dts
  1. Компиляция файла:
dtc -@ -I dts -O dtb -o sc16is752.dtbo sc16is752-n.dts
  1. Копирование dtbo файла в /boot/overlays/
cp sc16is752.dtbo /boot/overlays/
  1. Добавление строки sc16is752 в /boot/repkaEnv.txt в строку overlays. Получаем overlays=i2c1 spi0 sc16is752

После перезагрузки ядро не стартует на device tree overlay. Просто зависает.

## Executing script at 4fc00000
Repka U-Boot started
53 bytes read in 3 ms (16.6 KiB/s)
repkaEnv.txt loaded successfully
41705 bytes read in 7 ms (5.7 MiB/s)
repka-pi.dtb loaded successfully
overlays: i2c1 spi0 sc16is752
223 bytes read in 3 ms (72.3 KiB/s)
i2c1.dtbo loaded successfully
1097 bytes read in 4 ms (267.6 KiB/s)
spi0.dtbo loaded successfully
1036 bytes read in 4 ms (252.9 KiB/s)
sc16is752.dtbo loaded successfully
failed on fdt_overlay_apply(): FDT_ERR_NOTFOUND
26058760 bytes read in 2610 ms (9.5 MiB/s)
ERROR: Did not find a cmdline Flattened Device Tree

Starting kernel ...

Если я правильно понимаю, то

root@Repka-Pi:/boot# cat /boot/config-6.12.9.4-repka-pi4 | grep "CONFIG_SERIAL_SC16IS7XX"
CONFIG_SERIAL_SC16IS7XX=m
CONFIG_SERIAL_SC16IS7XX_I2C=m
CONFIG_SERIAL_SC16IS7XX_SPI=m

Показывает, что драйвер в ядре есть, нужно только добавить device tree overlay.

Помогите, пожалуйста, понять, что делаю не так.


Привет!

  1. Файлы .dts и .dtb для u-boot и для Linux kernel разные.
  2. Если под твоё устройство есть .dts, то уже хорошо, в него можно добавить описание твоего hat.

Только буквально сегодня у меня закончилась разборка с подобным вопросом. Успешно получился один из вариантов решения, рецепт отсюда:

https://stackoverflow.com/questions/78671744/fatal-error-unable-to-parse-input-tree-device-tree

  1. «метод быстро, дёшево, сердито»: делаем не .dtb + .dtbo , а просто исправленный .dtb (сам метод подсказан ИИ).
cd arch/arm64/boot/dts
ln -s ../../../../include/dt-bindings  # если надо

(ядро постоянно в доработке и пути могли поменяться)

Правишь .dts прямо в дереве исходников Linux, и если надо, то и указатели на header-ы, и сами header-ы, чтобы убрать все ошибки команды ниже:

cpp -nostdinc -I dt-bindings -undef -x assembler-with-cpp repka.dts repka.dts.preprocessed

Затем:

dtc -I dts -O dtb -p 0x1000 repka.dts.preprocessed -o ~/repka-changed.dtb

Т.е., если планируется использование hat на постоянной основе, почему бы и не забыть про .dtbo.

anonymous
()

На тематическом форуме Repka дали некоторые советы по изменению overlay.

Ядро стартует. Но под конец драйвер выдаёт ошибку.

Текущий overlay:

/dts-v1/;
/plugin/;

/ {
    compatible = "allwinner,sun50i-h6";
    fragment@0 {
        target = <&spi1>;
        __overlay__ {
            status = "okay";
        };
    };

    fragment@1 {
        target = <&spi1>;
        __overlay__ {
            #address-cells = <1>;
            #size-cells = <0>;
            status = "okay";

            sc16is752: sc16is752@0 {
                compatible = "nxp,sc16is752";
                reg = <0>; /* CE0 */
                spi-max-frequency = <4000000>;
                interrupt-parent = <&r_pio>;
                interrupts = <357 2>; /* IRQ_TYPE_EDGE_FALLING */
                clocks = <&sc16is752_clk>;

                sc16is752_clk: sc16is752_clk {
                    compatible = "fixed-clock";
                    #clock-cells = <0>;
                    clock-frequency = <14745600>;
                };
            };
        };
    };
};

Вывод успешной загрузки overlay:

## Executing script at 4fc00000
Repka U-Boot started
53 bytes read in 2 ms (25.4 KiB/s)
repkaEnv.txt loaded successfully
41705 bytes read in 6 ms (6.6 MiB/s)
repka-pi.dtb loaded successfully
overlays: i2c1 spi0 sc16is752
223 bytes read in 3 ms (72.3 KiB/s)
i2c1.dtbo loaded successfully
1097 bytes read in 3 ms (356.4 KiB/s)
spi0.dtbo loaded successfully
921 bytes read in 3 ms (299.8 KiB/s)
sc16is752.dtbo loaded successfully
26058760 bytes read in 2611 ms (9.5 MiB/s)
## Flattened Device Tree blob at 44000000
   Booting using the fdt blob at 0x44000000
   Loading Device Tree to 0000000049f8d000, end 0000000049ffffff ... OK

Под конец загрузки выдаёт ошибку:

[    8.150693] systemd[1]: Started Journal Service.
[    8.173051] spi0.0: ttySC0 at I/O 0x0 (irq = 0, base_baud = 921600) is a SC16IS752
[    8.181325] serial serial1: tty port ttySC0 registered
[    8.187091] spi0.0: ttySC1 at I/O 0x1 (irq = 0, base_baud = 921600) is a SC16IS752
[    8.195084] serial serial2: tty port ttySC1 registered
[    8.220506] sc16is7xx spi0.0: probe with driver sc16is7xx failed with error -22
[    8.285503] Adding 1048572k swap on /swapfile.  Priority:-2 extents:20 across:15867904k SS
[    8.293014] systemd-journald[138]: Received client request to flush runtime journal.

ttySC* файлы не появились:

root@Repka-Pi:~# ls -l /dev/ttySC*
ls: невозможно получить доступ к '/dev/ttySC*': Нет такого файла или каталога

Модуль ядра драйвера sc16is7xx был ранее включен в загрузку:

root@Repka-Pi:~# lsmod | grep "sc16"
sc16is7xx_spi          12288  0
sc16is7xx              24576  1 sc16is7xx_spi
anme
() автор топика
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария