Настройка SPI экрана для Repka Pi 4

IvanS

New member
16.02.2026
7
0
1
Кто-то может показать рабочий пример настройки SPI-экрана (особенно интересно драйвер ST7796) для Repka Pi 4 (Repka OS)? В блоге находил только примеры настройки экранов через Device Tree для Repka Pi 3, но для Repka Pi 4 по аналогии почему-то не срабатывает.

Если что, вот это у меня на Repka Pi 4 (Repka OS) не работает (в ОС включен вариант 2):

MISO - PH6
SCK - PH4
MOSI - PH5
DC - PL3
RESET - PL4
CS - PH3

/dts-v1/;
/plugin/;

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

fragment@0 {
target = <&pio>;
__overlay__ {
st7796s_pins: st7796s_pins {
pins = "PL4", "PL3"; /* RESET, DC */
function = "gpio_out", "gpio_out";
};
};
};

fragment@1 {
target = <&spi1>;
__overlay__ {
/* CS0 PH3 */
cs-gpios = <&pio 7 3 0>;
status = "okay";
#address-cells = <1>;
#size-cells = <0>;

st7796s: st7796s@0{
compatible = "sitronix,st7796s";
reg = <0>;
pinctrl-names = "default";
pinctrl-0 = <&st7796s_pins>;
spi-max-frequency = <16000000>;
fps = <30>;
buswidth = <8>;
reset-gpios = <&pio 11 4 1>; /* PL4 */
dc-gpios = <&pio 11 3 0>; /* PL3 */
rotate = <270>;
debug = <1>;
};
};
};



};

Компилируется в sun50i-h6-st7796s.dtbo без ошибок. В repkaEnv.txt прописано:
overlays=i2c1 sun50i-h6-st7796s

Модуль fb_st7796s присутствует в списке загруженных (если смотреть командой lsmod).

При этом dmesg после перезагрузки выдает такую информацию:
[ 23.521428] sun50i-h6-pinctrl 300b000.pinctrl: unknown pin PL4
[ 23.527303] sun50i-h6-pinctrl 300b000.pinctrl: unknown pin PL3
[ 23.533168] fb_st7796s spi0.0: there is not valid maps for state default
[ 23.533279] fb_st7796s spi0.0: fbtft_property_value: buswidth = 8
[ 23.533289] fb_st7796s spi0.0: fbtft_property_value: debug = 1
[ 23.533296] fb_st7796s spi0.0: fbtft_property_value: rotate = 270
[ 23.533304] fb_st7796s spi0.0: fbtft_property_value: fps = 30
[ 23.536188] spi spi0.0: deferred probe pending: fb_st7796s: Failed to request reset GPIO


На SPI-экран ничего не выводится, в системе присутствует один fb0 связанный с hdmi-монитором.
 
Последнее редактирование:
300b000.pinctrl: unknown pin PL4
Смею предположить, что драйвер pinctrl имеет какие-то другие названия пинов из банка R_GPIOL (в исходниках ядра есть два файла pinctrl-sun50i-h6.c и pinctrl-sun50i-h6-r.c). Попробуйте перевесить DC и RESET на другие пины, например из банков D или G (скажем на PD16 и PD17).

----
Upd: см. следующий ответ про подсистему R_GPIO у H6. Вероятно из-за её неправильного указания pinctrl не находит нужные пины. Решение из текущего сообщения вероятно тоже может сработать.
 
Последнее редактирование:
  • Like
Реакции: IvanS
Upd нашел обозначение подсистемы R_GPIO в sun50i-h6.dtsi и в pinctrl-sun50i-h6-r.c:

Или в
Код:
fragment@0 {
   target = <&pio>;
   __overlay__ {
       st7796s_pins: st7796s_pins {
           pins = "PL4", "PL3"; /* RESET, DC */
           function = "gpio_out", "gpio_out";
       };
   };
};

Пропишите r_pio вместо pio, например
Код:
fragment@0 {
   target = <&r_pio>;
   __overlay__ {
       st7796s_pins: st7796s_pins {
           pins = "PL4", "PL3"; /* RESET, DC */
           function = "gpio_out", "gpio_out";
       };
   };
};


Также поменяйте две ссылки в fragment@1 на r_pio:
Код:
reset-gpios = <&r_pio 11 4 1>;  /* PL4 */
dc-gpios = <&r_pio 11 3 0>;     /* PL3 */
 
Последнее редактирование:
  • Like
Реакции: IvanS
Кто-то может показать рабочий пример настройки SPI-экрана (особенно интересно драйвер ST7796) для Repka Pi 4 (Repka OS)? В блоге находил только примеры настройки экранов через Device Tree для Repka Pi 3, но для Repka Pi 4 по аналогии почему-то не срабатывает.
Пользуюсь Repka Pi 3 но подразумеваю оверлей для Repka Pi 4 надо писать основываясь на туже логику что и в Pi3



1. Всё же первичен сам дисплей, а уже потом рассматриваются какие драйвера он поддерживает.
Для примера есть дисплеи которые работают и на драйверах st7789 и ili9341

Нужна ссылка на Ваш дисплей, а там уже разбираться дальше.

2. Далее смотрим какие драйвера он поддерживает.

3. Проверяем какие из них есть в системе

4. Если нужных драйверов нет устанавливаем.

5 А уже потом собственно разбираемся с нужными pins - особенно cs ( хотелось бы точно знать один дисплей будет висеть на SPI или ещё какое устройство и какое именно SPI : SPI0 или SPI1



Собственно, что за дисплей то?
 
  • Like
Реакции: fe-ti
Также поменяйте две ссылки в fragment@1 на r_pio:
Код:
reset-gpios = <&r_pio 11 4 1>;  /* PL4 */
dc-gpios = <&r_pio 11 3 0>;     /* PL3 */
Этот код компилится нормально, но Репка после не грузится, даже светодиод ACT не моргает.

Скорее всего для пинов PL надо так писать (видел где-то пример):
reset-gpios = <&r_pio 0 4 1>; /* PL4 */
dc-gpios = <&r_pio 0 3 0>;
Потом проверю. Сделал пока на PD16 и PD17, рабочий стол на экране появился.

Теперь проблема с тачскрином - не работает, в dmesg такое сообщение:

[ 3.372474] ads7846@1 enforce active low on GPIO handle
[ 9.074909] ads7846 spi0.1: probe with driver ads7846 failed with error -22

Драйвер ads7846 загружен в системе. Полный код оверлея Device Tree ниже:

T_IRQ - PD22
T_DO - PH6
T_DIN - PH5
T_CS - PH2
T_CLK - PH4

/dts-v1/;
/plugin/;

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

fragment@0 {
target = <&pio>;
__overlay__ {
st7796s_pins: st7796s_pins {
pins = "PD16", "PD17"; /* RESET, DC */
function = "gpio_out", "gpio_out";
};

ads7846_pins: ads7846_pins {
pins = "PD22";
function = "gpio_out";
};
};
};

fragment@1 {
target = <&spi1>;
__overlay__ {
num-cs = <2>;
/* CS0 PH3 CS1 PH2 */
cs-gpios = <&pio 7 3 0>,
<&pio 7 2 0>;
status = "okay";
#address-cells = <1>;
#size-cells = <0>;

st7796s: st7796s@0{
compatible = "sitronix,st7796s";
reg = <0>;
pinctrl-names = "default";
pinctrl-0 = <&st7796s_pins>;
spi-max-frequency = <16000000>;
fps = <30>;
buswidth = <8>;
reset-gpios = <&pio 3 16 1>; /* PD16 */
dc-gpios = <&pio 3 17 0>; /* PD17 */
rotate = <180>;
debug = <1>;
};

ads7846: ads7846@1 {
compatible = "ti,ads7846";
reg = <1>;
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&ads7846_pins>;
spi-max-frequency = <2500000>;
interrupts = <3 22 2>; /* high-to-low edge triggered */
interrupt-parent = <&pio>; /* PD22 */
pendown-gpio = <&pio 3 22 0>;

/* driver defaults, optional */

ti,keep-vref-on = <1>;
ti,x-min = /bits/ 16 <00>;
ti,x-max = /bits/ 16 <0xFFF>;
ti,y-min = /bits/ 16 <00>;
ti,y-max = /bits/ 16 <0xFFF>;
ti,x-plate-ohms = /bits/ 16 <60>;
ti,pressure-max = /bits/ 16 <255>;
ti,swap-xy = <0>; };

};
};

};

Что можно подкрутить?
 
Пользуюсь Repka Pi 3 но подразумеваю оверлей для Repka Pi 4 надо писать основываясь на туже логику что и в Pi3



1. Всё же первичен сам дисплей, а уже потом рассматриваются какие драйвера он поддерживает.
Для примера есть дисплеи которые работают и на драйверах st7789 и ili9341

Нужна ссылка на Ваш дисплей, а там уже разбираться дальше.

2. Далее смотрим какие драйвера он поддерживает.

3. Проверяем какие из них есть в системе

4. Если нужных драйверов нет устанавливаем.

5 А уже потом собственно разбираемся с нужными pins - особенно cs ( хотелось бы точно знать один дисплей будет висеть на SPI или ещё какое устройство и какое именно SPI : SPI0 или SPI1



Собственно, что за дисплей то?
Дисплей SPI TFT 4" 480x320 Driver: ST7796. Дисплей на SPI один будет висеть, но с тачем. Драйвер тача и дисплея уже установлены в автозагрузке (lsmod показывает). Вывод изображения на экран уже сделал, не работает тач (код оверлея Device Tree выше).
 
Добился некоторого положительного эффекта, теперь dmesg выдает такую инормацию:
[ 3.390323] ads7846@1 enforce active low on GPIO handle
[ 9.024847] ads7846 spi0.1: supply vcc not found, using dummy regulator
[ 9.037430] ads7846 spi0.1: touchscreen, irq 189
[ 9.047847] input: ADS7846 Touchscreen as /devices/platform/soc/5011000.spi/spi_master/spi0/spi0.1/input/input5

Для этого поменял код:

ads7846_pins: ads7846_pins {
pins = "PD22";
function = "gpio_out";
};


на следующий:
ads7846_pins: ads7846_pins {
pins = "PG10";
function = "irq";
};

На PD22 висит PWM0 и похоже мешает.
Соответственно изменилось это место:

interrupt-parent = <&pio>; /* PG10 */
interrupts = <6 10 2>; /* high-to-low edge triggered */
pendown-gpio = <&pio 6 10 0>;

Хотя dmesg теперь не выдает ошибки тач все равно не работает. Замечу, что этот экран с тачем работали хорошо на orangepi.
Где еще надо подкрутить?
 
Замечу, что этот экран с тачем работали хорошо на orangepi
Приведите, пожалуйста, оверлей, который работал с orangepi.
Кстати, а каким одноплатником из линейки orangepi вы пользовались?

И второй вопрос, а сейчас orangepi нормально работает с тачем? (Ранее у вас был выставлен function = "gpio_out" вместо "irq", в теории КЗ могло сжечь выход прерывания в дисплее)
 
Дисплей SPI TFT 4" 480x320 Driver: ST7796. Дисплей на SPI один будет висеть, но с тачем. Драйвер тача и дисплея уже установлены в автозагрузке (lsmod показывает). Вывод изображения на экран уже сделал, не работает тач (код оверлея Device Tree выше).

Вы ещё писали: "Сделал пока на PD16 и PD17, рабочий стол на экране появился." Правильно сделали эти пины для Repki Pi 4 и должны быть, я пытался донести почему в блоге оверлей под Repka Pi 3 но видно у меня не очень получается подача данной информации.

Раскидывал на Repka Pi 4 по SPI0 (как бы эталонный, стартовый вариант основывался на анализе по другим одноплатным решениям (субъективно))




RESETPD1611213
DCPD1711315
3V317
MOSIPH522919
MISOPH623021
CLKPH42282324227PH3CS
GND25
LEDPD2412027


1. И всё же, а можно ссылку на дисплей их с этими параметрами несколько и они немного отличаются, какой именно?
2. Драйвер ST7796s вроде, так?
3. Если есть рабочий код оверлея под orangepi. (надеюсь orange pi 3 - compatible = "allwinner,sun50i-h6) тоже полностью покажите, дабы не рыть лишний раз в сети.
4. А так же скинте если есть возможность само дерево Repka Pi 4 (так как у меня нет Pi 4) глянуть какие ссылки у Вас косячат. Так как тяжело сказать что надо подъкрутить когда дерева основного сам не видишь.

P.S. Тогда оверлей от orange pi (надеюсь orange pi 3) постараюсь подправить в соответствии Repka Pi 4.


Ещё Вы писали
T_IRQ - PD22
T_DO - PH6
T_DIN - PH5
T_CS - PH2
T_CLK - PH4

Гм. Вот так оно будет ловчее :) (не конфликтный и более совместимый)
T_IRQPD1511111
 
Последнее редактирование:
Приведите, пожалуйста, оверлей, который работал с orangepi.
Кстати, а каким одноплатником из линейки orangepi вы пользовались?

И второй вопрос, а сейчас orangepi нормально работает с тачем? (Ранее у вас был выставлен function = "gpio_out" вместо "irq", в теории КЗ могло сжечь выход прерывания в дисплее)
Да, похоже выход irq сгорел на дисплее. На orangepi zero 2w тач тоже перестал работать. Теперь продолжу когда новый экран получу.
 
Да, похоже выход irq сгорел на дисплее. На orangepi zero 2w тач тоже перестал работать. Теперь продолжу когда новый экран получу.
Можно прозвонить от выхода IRQ на плате дисплея до ноги на самом камне ads7846 и если окажется что прогорела дорожка, отогнуть 11 pin от камня скальпелем вверх от платы и кинуть проводок верхним монтажом.