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

IvanS

New member
16.02.2026
13
1
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 от камня скальпелем вверх от платы и кинуть проводок верхним монтажом.
 
Можно прозвонить от выхода IRQ на плате дисплея до ноги на самом камне ads7846 и если окажется что прогорела дорожка, отогнуть 11 pin от камня скальпелем вверх от платы и кинуть проводок верхним монтажом.
Оказывается всё целое, просто MOSI и MISO местами перепутал. Сейчас проверил на OrangePi оба экрана (старый и новый купленный) работают прекрасно включая тач. Однако на Репке оказалось не все так хорошо - тач так и не работает (на любом экране), что я только не делал, MOSI и MISO по разному менял и пр. При этом dmesg | grep spi не показывает ошибок:

[ 3.351982] ads7846@0 enforce active low on GPIO handle
[ 16.744114] ads7846 spi0.0: supply vcc not found, using dummy regulator
[ 16.744612] ads7846 spi0.0: touchscreen, irq 218

Где-то попадалась в интернете инфа, что нужно отключить MISO от экрана, но это также не помогает. Один экран у меня с запаенной перемычкой J1, второй без запаенной перемычки - она также никак не влияет. Пин который указывается в Device Tree для interrupt-parent пробовал выбирал разные также никакого влияния.

Также мной был куплен ещё экран HDMI 4", где тач настраивается через пины и через Device Tree соответственно и тач также не работает.

При этом во всех случаях cat /proc/bus/input/devices показывает такую информацию:

I: Bus=001c Vendor=0000 Product=1ea6 Version=0000
N: Name="ADS7846 Touchscreen"
P: Phys=spi0.0/input0
S: Sysfs=/devices/platform/soc/5011000.spi/spi_master/spi0/spi0.0/input/input5
U: Uniq=
H: Handlers=mouse1 event5
B: PROP=0
B: EV=b
B: KEY=400 0 0 0 0 0
B: ABS=1000003

Однако ни в event5, ни в mouse1 ничего не появляется - полное молчание. Что еще можно сделать чтобы запустить тач?
 
Приведите, пожалуйста, оверлей, который работал с orangepi.
Кстати, а каким одноплатником из линейки orangepi вы пользовались?

И второй вопрос, а сейчас orangepi нормально работает с тачем? (Ранее у вас был выставлен function = "gpio_out" вместо "irq", в теории КЗ могло сжечь выход прерывания в дисплее)
Привожу раскомпилированный оверлей с OrangePi, с него брал пример и для Репки, но тач на Репке так и не работает. Пробовал менять разные параметры в оверлее - не помогает. Подозреваю, что дело не в оверлее совсем раз уж dmesg не выдает никаких ошибок.

/dts-v1/;

/ {

fragment@0 {
target-path = "/aliases";

__overlay__ {
spi1 = "/soc/spi@5011000";
};
};

fragment@1 {
target = <0xffffffff>;
target-path = "/soc/spi@5011000";

__overlay__ {
status = "okay";
#address-cells = <0x01>;
#size-cells = <0x00>;
pinctrl-names = "default";
pinctrl-0 = <0xffffffff 0xffffffff 0xffffffff>;
num-cs = <0x02>;

st7796s@0 {
compatible = "sitronix,st7796s";
reg = <0x00>;
spi-max-frequency = <0x4c4b400>;
fps = <0x1e>;
buswidth = <0x08>;
reset-gpios = <0xffffffff 0x08 0x00 0x01>;
dc-gpios = <0xffffffff 0x07 0x04 0x00>;
rotate = <0xb4>;
debug = <0x01>;
phandle = <0x01>;
};

ads7846@0 {
compatible = "ti,ads7846";
reg = <0x01>;
status = "okay";
spi-max-frequency = <0x2625a0>;
interrupts = <0x08 0x0f 0x02>;
interrupt-parent = <0xffffffff>;
pendown-gpio = <0xffffffff 0x08 0x0f 0x00>;
ti,keep-vref-on = <0x01>;
ti,x-min = [00 00];
ti,x-max = [0f ff];
ti,y-min = [00 00];
ti,y-max = [0f ff];
ti,x-plate-ohms = [00 3c];
ti,pressure-max = [00 ff];
ti,swap-xy = <0x00>;
};
};
};

__fixups__ {
spi1 = "/fragment@1:target:0";
spi1_pins = "/fragment@1/__overlay__:pinctrl-0:0";
spi1_cs0_pin = "/fragment@1/__overlay__:pinctrl-0:4";
spi1_cs1_pin = "/fragment@1/__overlay__:pinctrl-0:8";
pio = "/fragment@1/__overlay__/st7796s@0:reset-gpios:0\0/fragment@1/__overlay__/st7796s@0:dc-gpios:0\0/fragment@1/__overlay__/ads7846@0:interrupt-parent:0\0/fragment@1/__overlay__/ads7846@0:pendown-gpio:0";
};

__symbols__ {
st7796 = "/fragment@1/__overlay__/st7796s@0";
};
};
 
Пробовал менять разные параметры в оверлее - не помогает

У меня появилась ещё пара предположений-вопросов:
  1. Подключили ли вы пины CS к экранчику? Если да, то проверьте не пересекаются ли они с распиновкой, выбранной в repka-config. Возможно на них висит ещё какой-то функционал.
  2. Мне кажется я где-то видел, что у Репка 4 выведен на гребёнку только spi0, а в дереве у вас выставлен spi1. Пробовали ли вы менять в вашем дереве на spi0?

Вот в этом фрагменте
C-подобный:
fragment@1 {
   target = <&spi1>;
   __overlay__ {
       ...
target поменфть на
C-подобный:
fragment@1 {
   target = <&spi0>;
   __overlay__ {
       ...
 
У меня появилась ещё пара предположений-вопросов:
  1. Подключили ли вы пины CS к экранчику? Если да, то проверьте не пересекаются ли они с распиновкой, выбранной в repka-config. Возможно на них висит ещё какой-то функционал.
  2. Мне кажется я где-то видел, что у Репка 4 выведен на гребёнку только spi0, а в дереве у вас выставлен spi1. Пробовали ли вы менять в вашем дереве на spi0?

Вот в этом фрагменте
C-подобный:
fragment@1 {
   target = <&spi1>;
   __overlay__ {
       ...
target поменфть на
C-подобный:
fragment@1 {
   target = <&spi0>;
   __overlay__ {
       ...
1. В repka-config мной выбрана распиновка вариант 2 поэтому на рисунке распиновки представленном на главной странице сайта я вижу где что висит.
2. SPI на Репке 4 в единственном экземпляре и почему-то работает только с SPI1, если использовать SPI0 будет ругаться dmesg. Во всяком случае экран при использовании SPI1 показывает хорошо.
 
Кстати, а можете привести весь вывод dmesg с момента запуска?
Прикладываю. Не выдает информацию /dev/input/event5 (номер event на котором висит тач показывается в /proc/bus/input/devices), при этом на orangepi при нажатии на тач в аналогичный файл сыплются данные. Я думал может быть библиотека libinput, которая отвечает за работу файлов event виновата, но попытки переустановки и всяких настроек этой библиотеки, в том числе отката к старой системе edev эффекта не дали. Также вместо РепкаОС попробовал поставить Debian, но эффект тот же - полное молчание тача.
 

Вложения

  • dmesg.txt
    49,4 КБ · Просмотры: 1
Получилось добиться реагирования (движения) указателя на тачскрине, хотя и не все еще работает (об этом ниже). Причина почему не срабатывал тач была в том что в основном Device Tree не был описан второй CS совсем. Новый оверлей выглядит так (закомментирована часть касающаяся st7796s так как сейчас делаю на hdmi-экране):

/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";
};




spi1_cs1: spi1_cs1 {
pins = "PH2";
function = "gpio_out";
output-high;
};


ads7846_pins: ads7846_pins {
pins = "PG13";
function = "irq";
};
};
};

fragment@1 {
target = <&spi1>;
__overlay__ {
//num-cs = <2>;
pinctrl-names = "default", "default";
pinctrl-1 = <&spi1_cs1>;
/* CS0 PH3 CS1 PH2 */
cs-gpios = <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 = <20000000>;
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>;
interrupt-parent = <&pio>; /* PG13 */
interrupts = <6 13 2>; /* high-to-low edge triggered */
pendown-gpio = <&pio 6 10 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>;
wakeup-source;
};

};
};



};

Добавил еще файл /etc/X11/xorg.conf.d/99-touch.conf со следующим содержимым:

Section "InputClass"
Identifier "ADS7846 Touchscreen"
MatchIsTouchscreen "on"
MatchDevicePath "/dev/input/event*"
Driver "libinput"
Option "TransformationMatrix" "0 1 0 1 0 0 0 0 1"
Option "SwapXY" "1"
Option "InvertX" "1"
Option "InvertY" "1"
EndSection

Хотя указатель теперь двигается при использования тача (стилусом или пальцем), но совсем не работают нажатия. Соответственно невозможно выполнить калибровку. Что нужно ещё сделать чтобы работали нажатия на тачскрине?
 
Нажатия сделал, за это отвечает вот этот параметр таким образом в моем случае:
pendown-gpio = <&pio 6 13 1>;
Однако не работают двойные нажатия (double click).
 
  • Like
Реакции: fe-ti
Однако не работают двойные нажатия (double click).
Попробуйте поиграться с временем задержки двойного нажатия в настройках ОС (https://help.ubuntu.com/stable/ubuntu-help/mouse-doubleclick.html.ru). Если не поможет, то придётся дальше ковырять dts, драйвер и его настройки :)

P.S.
Следующее сообщение про драйвер перекатилось на вторую страницу темы.
 
Последнее редактирование: