Repka Pi 4 sc16is752 device tree overlay

А ещё лучше подключая распиновку с SPI0 посмотреть в оверлее spi0.dtbo что там прописано какие пины и как?
По декомпилированному оверлею ниже. В исходниках ядра пока не могу найти.

Код:
root@Repka-Pi:~# dtc -I dtb -O dts -o spi0.dts spi0.dtbo
spi0.dts: Warning (reg_format): /fragment@2/__overlay__/spidev@0:reg: property has invalid length (4 bytes) (#address-cells == 2, #size-cells == 1)
spi0.dts: Warning (reg_format): /fragment@2/__overlay__/spidev@1:reg: property has invalid length (4 bytes) (#address-cells == 2, #size-cells == 1)
spi0.dts: Warning (pci_device_reg): Failed prerequisite 'reg_format'
spi0.dts: Warning (pci_device_bus_num): Failed prerequisite 'reg_format'
spi0.dts: Warning (simple_bus_reg): Failed prerequisite 'reg_format'
spi0.dts: Warning (i2c_bus_reg): Failed prerequisite 'reg_format'
spi0.dts: Warning (spi_bus_reg): Failed prerequisite 'reg_format'
spi0.dts: Warning (avoid_default_addr_size): /fragment@2/__overlay__/spidev@0: Relying on default #address-cells value
spi0.dts: Warning (avoid_default_addr_size): /fragment@2/__overlay__/spidev@0: Relying on default #size-cells value
spi0.dts: Warning (avoid_default_addr_size): /fragment@2/__overlay__/spidev@1: Relying on default #address-cells value
spi0.dts: Warning (avoid_default_addr_size): /fragment@2/__overlay__/spidev@1: Relying on default #size-cells value
spi0.dts: Warning (avoid_unnecessary_addr_size): Failed prerequisite 'avoid_default_addr_size'
spi0.dts: Warning (unique_unit_address): Failed prerequisite 'avoid_default_addr_size'
spi0.dts: Warning (gpios_property): /fragment@2/__overlay__:cs-gpios: Could not get phandle node for (cell 2)
root@Repka-Pi:~# cat spi0.dts
/dts-v1/;

/ {

    fragment@0 {
        target = <0xffffffff>;

        __overlay__ {
            status = "disabled";
        };
    };

    fragment@1 {
        target = <0xffffffff>;

        __overlay__ {

            spi1_cs1 {
                pins = "PH2";
                function = "gpio_out";
                output-high;
                phandle = <0x01>;
            };
        };
    };

    fragment@2 {
        target = <0xffffffff>;

        __overlay__ {
            pinctrl-names = "default\0default";
            pinctrl-1 = <0x01>;
            cs-gpios = <0x00 0xffffffff 0x07 0x02 0x00>;
            status = "okay";

            spidev@0 {
                compatible = "rohm,dh2228fv";
                status = "okay";
                reg = <0x00>;
                spi-max-frequency = <0xf4240>;
            };

            spidev@1 {
                compatible = "rohm,dh2228fv";
                status = "okay";
                reg = <0x01>;
                spi-max-frequency = <0xf4240>;
            };
        };
    };

    __symbols__ {
        spi1_cs1 = "/fragment@1/__overlay__/spi1_cs1";
    };

    __fixups__ {
        i2c1 = "/fragment@0:target:0";
        pio = "/fragment@1:target:0\0/fragment@2/__overlay__:cs-gpios:4";
        spi1 = "/fragment@2:target:0";
    };

    __local_fixups__ {

        fragment@2 {

            __overlay__ {
                pinctrl-1 = <0x00>;
            };
        };
    };
};
Update 1. Вроде оно:
 
Последнее редактирование:
По декомпилированному оверлею ниже. В исходниках ядра пока не могу найти.

Код:
root@Repka-Pi:~# dtc -I dtb -O dts -o spi0.dts spi0.dtbo
spi0.dts: Warning (reg_format): /fragment@2/__overlay__/spidev@0:reg: property has invalid length (4 bytes) (#address-cells == 2, #size-cells == 1)
spi0.dts: Warning (reg_format): /fragment@2/__overlay__/spidev@1:reg: property has invalid length (4 bytes) (#address-cells == 2, #size-cells == 1)
spi0.dts: Warning (pci_device_reg): Failed prerequisite 'reg_format'
spi0.dts: Warning (pci_device_bus_num): Failed prerequisite 'reg_format'
spi0.dts: Warning (simple_bus_reg): Failed prerequisite 'reg_format'
spi0.dts: Warning (i2c_bus_reg): Failed prerequisite 'reg_format'
spi0.dts: Warning (spi_bus_reg): Failed prerequisite 'reg_format'
spi0.dts: Warning (avoid_default_addr_size): /fragment@2/__overlay__/spidev@0: Relying on default #address-cells value
spi0.dts: Warning (avoid_default_addr_size): /fragment@2/__overlay__/spidev@0: Relying on default #size-cells value
spi0.dts: Warning (avoid_default_addr_size): /fragment@2/__overlay__/spidev@1: Relying on default #address-cells value
spi0.dts: Warning (avoid_default_addr_size): /fragment@2/__overlay__/spidev@1: Relying on default #size-cells value
spi0.dts: Warning (avoid_unnecessary_addr_size): Failed prerequisite 'avoid_default_addr_size'
spi0.dts: Warning (unique_unit_address): Failed prerequisite 'avoid_default_addr_size'
spi0.dts: Warning (gpios_property): /fragment@2/__overlay__:cs-gpios: Could not get phandle node for (cell 2)
root@Repka-Pi:~# cat spi0.dts
/dts-v1/;

/ {

    fragment@0 {
        target = <0xffffffff>;

        __overlay__ {
            status = "disabled";
        };
    };

    fragment@1 {
        target = <0xffffffff>;

        __overlay__ {

            spi1_cs1 {
                pins = "PH2";
                function = "gpio_out";
                output-high;
                phandle = <0x01>;
            };
        };
    };

    fragment@2 {
        target = <0xffffffff>;

        __overlay__ {
            pinctrl-names = "default\0default";
            pinctrl-1 = <0x01>;
            cs-gpios = <0x00 0xffffffff 0x07 0x02 0x00>;
            status = "okay";

            spidev@0 {
                compatible = "rohm,dh2228fv";
                status = "okay";
                reg = <0x00>;
                spi-max-frequency = <0xf4240>;
            };

            spidev@1 {
                compatible = "rohm,dh2228fv";
                status = "okay";
                reg = <0x01>;
                spi-max-frequency = <0xf4240>;
            };
        };
    };

    __symbols__ {
        spi1_cs1 = "/fragment@1/__overlay__/spi1_cs1";
    };

    __fixups__ {
        i2c1 = "/fragment@0:target:0";
        pio = "/fragment@1:target:0\0/fragment@2/__overlay__:cs-gpios:4";
        spi1 = "/fragment@2:target:0";
    };

    __local_fixups__ {

        fragment@2 {

            __overlay__ {
                pinctrl-1 = <0x00>;
            };
        };
    };
};
Update 1. Вроде оно:
Вот здесь хоть интересней малость, неизвестно с чем связано но видно точно что CS здесь прописан CS1 т.е 226 он же PH2 возможно это не случайно, попробуйте везде в оверлеях поставить значения этого CS вместо того что был раньше (раньше был CS0- 227 - PH3)
 
При приведённом ниже содержимом оверлея у меня работают sclk и cs (см. изображения). Но у меня нет шляпы, поэтому насколько правильно Репка шевелит пинами понять я не могу :)
Но есть смутное подозрение, что MOSI не работает или Репка ожидает активности ведомого устройства.

C-подобный:
/dts-v1/;
/plugin/;

/ {
    compatible = "allwinner,sun50i-h6";

    fragment@0 {
        target = <&pio>;
        __overlay__ {
            sc16is_pins: sc16is-pins {
                pins = "PH2", "PH4", "PH5", "PH6";
                function = "spi1";
            };
        };
    };

    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 = <&pio>;
                interrupts = <7 5 2>;

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

Я компилировал этот оверлей в файл /boot/overlays/sc16is.dtbo, соответствующее содержимое /boot/repkaEnv.txt привожу ниже. Включён только собственный оверлейsc16is.dtbo.
INI:
overlays=sc16is
loglevel=7
console=both

Под рукой была только портативная поделка от фнирси, поэтому качество картинок весьма посредственное.

Сначала cs опускается в 0, активность на sclk намекает на отправку пары пакетов
1783492280228.png

Потом cs периодически опускается, и идут импульсы на sclk (по 8 штук).
1783492354687.png

Но при этом в первых пакетах на MOSI (синий) тишина. Выглядит так будто вывод не включён.
1783493702539.png
 
  • Like
Реакции: An_me
При приведённом ниже содержимом оверлея у меня работают sclk и cs (см. изображения). Но у меня нет шляпы, поэтому насколько правильно Репка шевелит пинами понять я не могу :)
Но есть смутное подозрение, что MOSI не работает или Репка ожидает активности ведомого устройства.

C-подобный:
/dts-v1/;
/plugin/;

/ {
    compatible = "allwinner,sun50i-h6";

    fragment@0 {
        target = <&pio>;
        __overlay__ {
            sc16is_pins: sc16is-pins {
                pins = "PH2", "PH4", "PH5", "PH6";
                function = "spi1";
            };
        };
    };

    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 = <&pio>;
                interrupts = <7 5 2>;

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

Я компилировал этот оверлей в файл /boot/overlays/sc16is.dtbo, соответствующее содержимое /boot/repkaEnv.txt привожу ниже. Включён только собственный оверлейsc16is.dtbo.
INI:
overlays=sc16is
loglevel=7
console=both

Под рукой была только портативная поделка от фнирси, поэтому качество картинок весьма посредственное.

Сначала cs опускается в 0, активность на sclk намекает на отправку пары пакетов
Посмотреть вложение 96

Потом cs периодически опускается, и идут импульсы на sclk (по 8 штук).
Посмотреть вложение 97

Но при этом в первых пакетах на MOSI (синий) тишина. Выглядит так будто вывод не включён.
Посмотреть вложение 99
pins = "PH2", "PH4", "PH5", "PH6";
То есть здесь состояние пинам не задаётся преднамеренно?
function = "spi1";
 
pins = "PH2", "PH4", "PH5", "PH6";
То есть здесь состояние пинам не задаётся преднамеренно?
function = "spi1";
Я не совсем понял вопрос. Если имеется в виду "почему назначение каждого пина не задано его непосредственной функцией, т.е. MOSI, MISO, SCLK и CS", то ответ такой: да, драйвер pinctrl и СнК вроде должны просто переключить эти пины на аппаратный блок SPI в СнК вместо контроллера обычного GPIO. А там пины обычно имеют жёстко определённые функции (поправьте, если я неправильно читал доки)

Но я пока не понимаю, почему на выводе MOSI тишина. И уровень сигнала как бы намекает, что пин отключён. В то же время у @An_me по осциллограммам (на первой странице темы) не работал SCLK
 
При приведённом ниже содержимом оверлея у меня работают sclk и cs (см. изображения). Но у меня нет шляпы, поэтому насколько правильно Репка шевелит пинами понять я не могу :)
Но есть смутное подозрение, что MOSI не работает или Репка ожидает активности ведомого устройства.

C-подобный:
/dts-v1/;
/plugin/;

/ {
    compatible = "allwinner,sun50i-h6";

    fragment@0 {
        target = <&pio>;
        __overlay__ {
            sc16is_pins: sc16is-pins {
                pins = "PH2", "PH4", "PH5", "PH6";
                function = "spi1";
            };
        };
    };

    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 = <&pio>;
                interrupts = <7 5 2>;

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

Я компилировал этот оверлей в файл /boot/overlays/sc16is.dtbo, соответствующее содержимое /boot/repkaEnv.txt привожу ниже. Включён только собственный оверлейsc16is.dtbo.
INI:
overlays=sc16is
loglevel=7
console=both

Под рукой была только портативная поделка от фнирси, поэтому качество картинок весьма посредственное.

Сначала cs опускается в 0, активность на sclk намекает на отправку пары пакетов
Посмотреть вложение 96

Потом cs периодически опускается, и идут импульсы на sclk (по 8 штук).
Посмотреть вложение 97

Но при этом в первых пакетах на MOSI (синий) тишина. Выглядит так будто вывод не включён.
Посмотреть вложение 99
Система стартует без ошибок (0 ошибок в логах). Пробовал как CS0 так и CS1.
июл 10 14:35:26 Repka-Pi kernel: spi0.0: ttySC0 at I/O 0x0 (irq = 216, base_baud = 921600) is a SC16IS752
июл 10 14:35:26 Repka-Pi kernel: serial serial1: tty port ttySC0 registered
июл 10 14:35:26 Repka-Pi kernel: spi0.0: ttySC1 at I/O 0x1 (irq = 216, base_baud = 921600) is a SC16IS752
июл 10 14:35:26 Repka-Pi kernel: serial serial2: tty port ttySC1 registered

ttySC* файлов нет:

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

Примечательно, что пока подкидывал провода (для осциллографа) к самопальному переходнику (Repka4 -> модуль, боковые выводы) , вероятно проскочило напряжение между выводами (через пальцы или провода), и появилось в консоли сообщение (IRQ не подключал пока)
root@Repka-Pi:~# [ 179.896703] sc16is7xx spi0.0: ttySC1: Unexpected interrupt: 2a

Сейчас посмотрю через осциллограф.

Канал - Вывод:
1 - CLK
2 - MOSI
3 - MISO
4 - CS (CS1 на repka 4)
Скрины сняты не во время инициализации, а когда уже всё загрузилось. Т.е. идет тотальный спам CLK без работы MOSI/MISO.
1783684959089.png
1783684937037.png

Почему-то в какой-то момент начал мигать светодиод на модуле (RS485-TX), при том что я не отправляю ничего. К модулю на RS485 ничего не подключено. Сейчас буду повторно перепроверять провода.

Пока не могу сделать еще изображения, т.к. нету флешки рабочей, а писать в bootfs не хочет(. Да и этот осцил не умеет в LAN. Точнее кроме настроек там ничего нету.
В общем CLK работает, а вот на MISO/MOSI совсем 0.

Во время инициализации (до момента, когда начинается спам CLK) идут пара импульсов на MOSI, но CLK в тот момент вяло работает. Скрины тогда сделаю в ПН.

Провода запаяны верно. Еще мультиметром на наличие соплей от пайки пройдусь, но визуально всё ок.
 
Последнее редактирование:
Вот здесь хоть интересней малость, неизвестно с чем связано но видно точно что CS здесь прописан CS1 т.е 226 он же PH2 возможно это не случайно, попробуйте везде в оверлеях поставить значения этого CS вместо того что был раньше (раньше был CS0- 227 - PH3)
В последнем, предложенном вами, варианте поменял. На всех распиновках
failed on fdt_overlay_apply(): FDT_ERR_NOTFOUND
26058760 bytes read in 2611 ms (9.5 MiB/s)
ERROR: Did not find a cmdline Flattened Device Tree

/dts-v1/;
/plugin/;

/ {
compatible = "rbs,repka-pi4", "allwinner,sun50i-h6";

fragment@0 {
target = <&gpio>;
__overlay__ {
spi0_pins: spi0_pins {
rbs,pins = <230 229 21>; /* miso mosi sclk */ /* PH6 PH5 PH4 */
rbs,function = <1 0 0>; /* output input input */ /* - новый вариант прописано без функции, можно протестить по очереди оба */
/* rbs,function = <3>; /* alt4 */ /* - старый вариант возможно и будет работать */
};

spi0_cs_pins: spi0_cs_pins {
rbs,pins = <226>; /* CS0 */ /* PH3 */
rbs,function = <1>; /* output */
};
};
};

fragment@1 {
target = <&spi0>;
frag1: __overlay__ {
#address-cells = <1>;
#size-cells = <0>;
pinctrl-names = "default";
pinctrl-0 = <&spi0_pins &spi0_cs_pins>;
cs-gpios = <&gpio 226 1>; /* CS0 */ /* PH3 */
status = "okay";

sc16is752: sc16is752@0 {
compatible = "nxp,sc16is752";
reg = <0>; /* CE0 */
clocks = <&sc16is752_clk>;
interrupt-parent = <&gpio>;
interrupts = <355 2>; /* IRQ_TYPE_EDGE_FALLING */ /* PL3 */
#gpio-controller;
#gpio-cells = <2>;
spi-max-frequency = <4000000>;

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

fragment@2 {
target = <&aux>;
__overlay__ {
status = "okay";
};
};

__overrides__ {
int_pin = <&sc16is752>,"interrupts:0";
};
};
 
Я не совсем понял вопрос. Если имеется в виду "почему назначение каждого пина не задано его непосредственной функцией, т.е. MOSI, MISO, SCLK и CS", то ответ такой: да, драйвер pinctrl и СнК вроде должны просто переключить эти пины на аппаратный блок SPI в СнК вместо контроллера обычного GPIO. А там пины обычно имеют жёстко определённые функции (поправьте, если я неправильно читал доки)

Но я пока не понимаю, почему на выводе MOSI тишина. И уровень сигнала как бы намекает, что пин отключён. В то же время у @An_me по осциллограммам (на первой странице темы) не работал SCLK
Да сам пытаюсь разобраться в теме "Дерево устройств", а когда нет ни устройства ни шляпы, оно как то не очень. :)
Ключевое значение "вроде должны просто переключить" а как на самом деле переключает? нет? как определить?
 
В последнем, предложенном вами, варианте поменял. На всех распиновках
failed on fdt_overlay_apply(): FDT_ERR_NOTFOUND
26058760 bytes read in 2611 ms (9.5 MiB/s)
ERROR: Did not find a cmdline Flattened Device Tree

/dts-v1/;
/plugin/;

/ {
compatible = "rbs,repka-pi4", "allwinner,sun50i-h6";

fragment@0 {
target = <&gpio>;
__overlay__ {
spi0_pins: spi0_pins {
rbs,pins = <230 229 21>; /* miso mosi sclk */ /* PH6 PH5 PH4 */
rbs,function = <1 0 0>; /* output input input */ /* - новый вариант прописано без функции, можно протестить по очереди оба */
/* rbs,function = <3>; /* alt4 */ /* - старый вариант возможно и будет работать */
};

spi0_cs_pins: spi0_cs_pins {
rbs,pins = <226>; /* CS0 */ /* PH3 */
rbs,function = <1>; /* output */
};
};
};

fragment@1 {
target = <&spi0>;
frag1: __overlay__ {
#address-cells = <1>;
#size-cells = <0>;
pinctrl-names = "default";
pinctrl-0 = <&spi0_pins &spi0_cs_pins>;
cs-gpios = <&gpio 226 1>; /* CS0 */ /* PH3 */
status = "okay";

sc16is752: sc16is752@0 {
compatible = "nxp,sc16is752";
reg = <0>; /* CE0 */
clocks = <&sc16is752_clk>;
interrupt-parent = <&gpio>;
interrupts = <355 2>; /* IRQ_TYPE_EDGE_FALLING */ /* PL3 */
#gpio-controller;
#gpio-cells = <2>;
spi-max-frequency = <4000000>;

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

fragment@2 {
target = <&aux>;
__overlay__ {
status = "okay";
};
};

__overrides__ {
int_pin = <&sc16is752>,"interrupts:0";
};
};
Гм. ещё одна попытка и берём паузу :D

Rep4_752.jpg

Код:
/dts-v1/;
/plugin/;

/ {
    compatible = "rbs,repka-pi4", "allwinner,sun50i-h6";

    /* Отключаем стандартный spidev0.0, чтобы освободить CS0 для драйвера SC16IS752 */
    fragment@0 {
        target = <&spi0>;
        __overlay__ {
            #address-cells = <1>;
            #size-cells = <0>;

            spidev@0 {
                status = "disabled";
            };
        };
    };

    /* Регистрируем SC16IS752 на шине SPI0 с адресом 0 (CS0) */
    fragment@1 {
        target = <&spi0>;
        __overlay__ {
            #address-cells = <1>;
            #size-cells = <0>;
            status = "okay";

            sc16is752: sc16is752@0 {
                compatible = "nxp,sc16is752";
                reg = <0>;
                clocks = <&sc16is752_clk>;
                
                /* Настройка прерывания на PL7 */
                interrupt-parent = <&r_pio>;   /* Контроллер для банка портов L */
                interrupts = <0 7 2>;         /* 0 = Банк L (единственный в r_pio), 7 = индекс пина, 2 = IRQ_TYPE_EDGE_FALLING */
                
                spi-max-frequency = <4000000>; /* Скорость шины SPI (при необходимости можно снизить до 2000000) */
                status = "okay";
            };
        };
    };

    /* Описание внешнего кварца на плате SC16IS752 */
    fragment@2 {
        target-path = "/";
        __overlay__ {
            sc16is752_clk: sc16is752_clk {
                compatible = "fixed-clock";
                #clock-cells = <0>;
                clock-frequency = <14745600>; /* Проверьте маркировку кварца на вашем модуле (14745600 или 32000000) */
            };
        };
    };
};

Обратить внимание здесь INT / IRQ Выход 22 PL7 (Пин прерывания)
по пинам подключения: CS / A0 Вход 24 SPI0_CS0
 
А у малины они появляются в каталоге /dev, как остальные tty?

Ключевое значение "вроде должны просто переключить" а как на самом деле переключает? нет? как определить?
Если вкратце, то у каждого пина стоит мультиплексор, которым управляет регистр (или поле в регистре). Драйвер в него записывает значения, согласно которым выбирается функция пина.

Это с точки зрения железа. Но как именно оно из-под линукса конфигурируется с помощью дерева устройств -- я могу только предполагать.

Даташит на Н6: https://download.repka-pi.ru/repka-pi4/docs/Allwinner_H6_V200_Datasheet_V1.1.pdf
Руководство пользователя (с описанием работы блоков процессора): https://linux-sunxi.org/images/4/46/Allwinner_H6_V200_User_Manual_V1.1.pdf

Для начала возьмём структурную схему порта ввода-вывода (стр. 379 из User_Manual):
1783788089338.png
На ней мы видим (слева-направо, в верхней части):
  1. системную шину, с которой взаимодействуют периферийные устройства
  2. собственно устройства
  3. выходной мультиплексор
  4. какую-то логику управления выводом и блок подтяжек
  5. сам пин (PAD)
Мультиплексор и логика управления позволяют менять функции пина. Управлять этим добром можно через регистры, описание которых можно найти в User Manual. Например для банка PH регистр который управляет мультиплексорами называется "PH Configure Register 0". В нём каждому пину отведено по три бита (+1 незначащий бит чисто для выравнивания), и в зависимости от значения в этом поле пин будет. выполнять одну из 8 возможных функций.

Что касается функций, то в даташите есть таблица со всеми выводами. В ней можно найти наш spi:
1783780323847.png
Тут все возможные функции пинов жёстко закреплены. Если мы хотим иметь на пине PH5 какую-то функциональность spi, то на нём может быть только spi1 MOSI. Аналогично с другими пинами, их соответствие функциям spi зафиксировано аппаратно.

Почему ссылка на spi0 (который, в свою очередб, должен является алиасом к spi1) не работает в оверлее, не очень ясно. Но мне кажется, что софт читающий дерево видит сначала переопределение spi0 как алиас к spi1, а потом удаление узла spi0. И в итоге он удаляет spi0 из дерева и из-за этого в оверлее мы не можем ссылаться на spi0.

когда нет ни устройства ни шляпы, оно как то не очень
О, да :)
 
Не знаю, что я такого особенного сделал, но MOSI стал дёргаться. Объективно изменения были следующими:
  • добавил отключение i2c, как в оверлее spi от команды Репки
  • вернул определение прерывания в правильный (но это не точно) формат для allwinner-а
Неправильный формат подсказал Qwen, он же потом сам же выдал, дескать это неправильно надо делать иначе. Здесь должен был быть анекдот про ИИшное "да, ты прав, давай я всё исправлю" :)
В доках на ядро именно текущий вариант (в оверлее под спойлером).

C-подобный:
/dts-v1/;
/plugin/;

/ {
    compatible = "allwinner,sun50i-h6";

    fragment@0 {
        target = <&i2c1>;
        __overlay__ {
            status = "disabled";
        };
    };

    fragment@1 {
        target = <&pio>;
        __overlay__ {
            sc16is_pins: sc16is-pins {
                pins = "PH2", "PH4", "PH5", "PH6";
                function = "spi1";
            };
        };
    };

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

            //pinctrl-names = "default";
            //pinctrl-0 = <&sc16is_pins>;
            //cs-gpios = <&pio 7 3 1>; // было <0>, <&pio 7 3 0>;


            sc16is752: sc16is752@0 {
                compatible = "nxp,sc16is752";
                reg = <0>; /* CE0 */
                spi-max-frequency = <4000000>;
                interrupt-parent = <&pio>;
                interrupts = <357 2>;
                //#gpio-controller;
               // #gpio-cells = <2>;
                //interrupts = <357 2>; /* IRQ_TYPE_EDGE_FALLING */
                clocks = <&sc16is752_clk>;
                sc16is752_clk: sc16is752_clk {
                    compatible = "fixed-clock";
                    #clock-cells = <0>;
                    clock-frequency = <14745600>;
                };
            };
        };
    };
};

Ch1 (бирюзовый) -- CLK
Ch2 (жёлтый) -- MOSI

1783949748268.png

Upd: Приехала плата (то же самое, но с двумя RS485). И-и-и-и драйвер выдаёт sc16is7xx spi0.0: probe with driver sc16is7xx failed with error -22
 
Последнее редактирование:
Не знаю, что я такого особенного сделал, но MOSI стал дёргаться. Объективно изменения были следующими:
  • добавил отключение i2c, как в оверлее spi от команды Репки
  • вернул определение прерывания в правильный (но это не точно) формат для allwinner-а
Неправильный формат подсказал Qwen, он же потом сам же выдал, дескать это неправильно надо делать иначе. Здесь должен был быть анекдот про ИИшное "да, ты прав, давай я всё исправлю" :)
В доках на ядро именно текущий вариант (в оверлее под спойлером).

C-подобный:
/dts-v1/;
/plugin/;

/ {
    compatible = "allwinner,sun50i-h6";

    fragment@0 {
        target = <&i2c1>;
        __overlay__ {
            status = "disabled";
        };
    };

    fragment@1 {
        target = <&pio>;
        __overlay__ {
            sc16is_pins: sc16is-pins {
                pins = "PH2", "PH4", "PH5", "PH6";
                function = "spi1";
            };
        };
    };

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

            //pinctrl-names = "default";
            //pinctrl-0 = <&sc16is_pins>;
            //cs-gpios = <&pio 7 3 1>; // было <0>, <&pio 7 3 0>;


            sc16is752: sc16is752@0 {
                compatible = "nxp,sc16is752";
                reg = <0>; /* CE0 */
                spi-max-frequency = <4000000>;
                interrupt-parent = <&pio>;
                interrupts = <357 2>;
                //#gpio-controller;
               // #gpio-cells = <2>;
                //interrupts = <357 2>; /* IRQ_TYPE_EDGE_FALLING */
                clocks = <&sc16is752_clk>;
                sc16is752_clk: sc16is752_clk {
                    compatible = "fixed-clock";
                    #clock-cells = <0>;
                    clock-frequency = <14745600>;
                };
            };
        };
    };
};

Ch1 (бирюзовый) -- CLK
Ch2 (жёлтый) -- MOSI

Посмотреть вложение 106

Upd: Приехала плата (то же самое, но с двумя RS485). И-и-и-и драйвер выдаёт sc16is7xx spi0.0: probe with driver sc16is7xx failed with error -22
error -22 означает, что устройство аппаратно или программно отключено в системе