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
()
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария