Подключение дисплея SPI LCD ILI9341 к Repka Pi 3. Протокол GPIO SPI0 . Наложения дерева устройств. #
Из серии: "Мал, да удал".
Connecting SPI LCD ILI9341 Display to Repka Pi 3. GPIO SPI0 Protocol. Device Tree overlays.
From the series: "Small but mighty".
Хотелось бы выразить благодарность DySprozin aka xjmjk с его статьёй "Подключение дисплея ili9341 к Repka Pi" посредством патча (patch) и сборки нового дерева устройств.
Но как часто бывает когда появилось желание повторить ситуация поменялась и как оказалось в лучшую сторону. В Repka Pi появилась поддержка оверлеев наложения на дерева устройств.
Поиск источника вылился в ещё одну благодарность Anton c его статьёй - которая здесь: "кладезь команд и разъяснений"
А далее адаптация оверлеев под Repka Pi 3 с учётом всяких мелочей (таких как конкретизация в данном случае именно SPI0). С учётом правильно выбранного CS. Выбора оптимальных контактов GPIO, так как есть данные дисплеи и c Тачскрином - отдельным оверлеем в проекте. А также применение двух и более как однотипных так разнотипных oled и tft дисплеев. А именно: ST7789, ST7735, SSD1306. Так же на данном дисплее ili9341 есть в наличие слот для SD CARD (если кто-то будет использовать быть тому место). Ориентировка на GPIO Repka Pi 3.
С учётом этих факторов и были выбраны те контакты (pins), что на макетках и схемах ниже. После выбранного варианта оверлея копировать в блокнот, сохранить с названием предложенным вариантом над кодом с расширением dts
Далее его конвертировать в dtbo
dtc -I dts -O dtb путь/наозвание_файла.dts -o путь/наозвание_файла.dtbo
Размещаем в директорию с оверлеями /boot/overlays/ и прописываем в /boot/repkaEnv.txt Смотреть в разделе ресурса Repka Pi - Документация - Кофигурация устройств
Для удобного тестирования графики и прочего локально при подключённом HDMI дисплее (fb0), а ili9341 дисплей определяется (если всё установлено и соединено правильно) как fb1 и обращаться к нему следует из любых 6 (шести - от: Ctrl + Alt + F1 до Ctrl + Alt + F6) tty-сессий терминала. Вернутся в графический Ctrl + Alt + F7.
Установки зависимостей. Примеры команд запуска графических файлов, mpg (mp4 так-же запустился) а как и startx можно посмотреть в статьях указанных выше.
И собственно адаптированные наложения (overlays). Возможно будут совершенствоваться.
1 Режим постоянного включения дисплея. (SPI0) #
Код наложения: spi0-ili9341-led-always-on.dts
/*
*
* Устройство: 2,8-дюймовый SPI-модуль ILI9341 / repka pi 3
* Device: 2.8 inch SPI Module ILI9341 / repka pi 3
*
* Передача данных по шине SPI0 - LCD экран в режиме постоянной включённой подсветки.
* Data transfer via SPI0 - LCD screen in constant backlight mode.
*
* Модуль Соединитель Контакт Repka Pi3 Код pio Дополнительная информация
* Module Connector Pin Pio code Additional information
*
* VCC <- 3.3V 17 3.3V или 1 цифровой вывод питание 3,3V
* or 1 any digital pin or 3.3V power
* GND = GND 25 GND или любой другой Ground 6, 9, 14, 20, 30, 34, 39
* or any other Ground 6, 9, 14, 20, 30, 34, 39
* CS <- PС3 24 SPI0-CS0 (2 3 0)
* RESET <- PA9 13 LSD_RESET (0 9 1)
* DC/RS <- PA10 15 LSD_DC/RS (0 10 0)
* SDI(MOSI) <- PC0 19 SPI0-MOSI
* SCK <- PC2 23 SPI0-CLK
*
* LED <-resistor-> 3.3V 1 VCC или 17 возможны также 2 или 4 (если необходима максимальная яркость, то контакт №2 или №4 на 5V)
* = 56 Ohms or 17, 2 or 4 are also possible (if maximum brightness is required, then contact №2 or №4 is 5V)
*
* SDO(MISO) -> PC1 21 SPI0-MISO
*
*/
/dts-v1/;
/plugin/;
/ {
compatible = "allwinner,sun50i-h5";
fragment@0 {
target = <&pio>;
__overlay__ {
ili9341_pins: ili9341_pins {
pins = "PA9", "PA10"; /*RESET, DC_RS*/
function = "gpio_out", "gpio_out" ;
};
};
};
fragment@1 {
target = <&spi0>;
__overlay__ {
status = "okay";
cs-gpios = <&pio 2 3 0>; /* PС3 */
ili9341: ili9341@0 {
compatible = "ilitek,ili9341";
reg = <0>;
pinctrl-names = "default";
pinctrl-0 = <&ili9341_pins>;
spi-max-frequency = <16000000>;
rotate = <90>;
bgr;
fps = <25>;
buswidth = <8>;
reset-gpios = <&pio 0 9 1>; /*RESET=PA9*/
dc-gpios = <&pio 0 10 0>; /*DC_RS=PA10*/
/*led-gpios = <&pio 0 19 0>; LED=PA19*/ /*PA19-27 В данном оверлее не применяется так как LED <-resistor-> 3.3V // This overlay does not apply because LED <-resistor-> 3.3V */
debug = <0>;
};
};
};
};
2 Режим задействования подсветки только во время работы самого дисплея. (SPI0) #
В данной схеме задействован отдельный контакт GPIO для подсветки LED
Параметры rotate = <90> можно и менять если собираетесь использовать дисплей вертикально. Что можно увидеть на следующей макетке.
Код наложения: spi0-ili9341-led-always-main.dts
/*
*
* Устройство: 2,8-дюймовый SPI-модуль ILI9341 / repka pi 3
* Device: 2.8 inch SPI Module ILI9341 / repka pi 3
*
* Передача данных по шине SPI0 - Подсветка LCD экрана включится только во время инициализации и выключится вместе с устройством. Подсветка только во время работы самого дисплея.
* Data transfer via SPI0 - The LCD backlight will only turn on during initialization and will turn off when the device turns off. Backlight only when the display itself is on.
*
* Модуль Соединитель Контакт Repka Pi3 Код pio Дополнительная информация
* Module Connector Pin Pio code Additional information
*
* VCC <- 3.3V 17 3.3V или 1 цифровой вывод питание 3,3V
* or 1 any digital pin or 3.3V power
* GND = GND 25 GND или любой другой Ground 6, 9, 14, 20, 30, 34, 39
* or any other Ground 6, 9, 14, 20, 30, 34, 39
* CS <- PС3 24 SPI0-CS0 (2 3 0)
* RESET <- PA9 13 LSD_RESET (0 9 1)
* DC/RS <- PA10 15 LSD_DC/RS (0 10 0)
* SDI(MOSI) <- PC0 19 SPI0-MOSI
* SCK <- PC2 23 SPI0-CLK
*
* LED <-resistor-><-PA19 27 (0 19 0)
* = 56 Ohms
*
* SDO(MISO) -> PC1 21 SPI0-MISO
*
*/
/dts-v1/;
/plugin/;
/ {
compatible = "allwinner,sun50i-h5";
fragment@0 {
target = <&pio>;
__overlay__ {
ili9341_pins: ili9341_pins {
pins = "PA9", "PA10"; /*RESET, DC_RS*/
function = "gpio_out", "gpio_out" ;
};
};
};
fragment@1 {
target = <&spi1>;
__overlay__ {
status = "okay";
cs-gpios = <&pio 2 3 0>; /* PС3 */
ili9341: ili9341@0 {
compatible = "ilitek,ili9341";
reg = <0>;
pinctrl-names = "default";
pinctrl-0 = <&ili9341_pins>;
spi-max-frequency = <16000000>;
rotate = <90>;
bgr;
fps = <25>;
buswidth = <8>;
reset-gpios = <&pio 0 9 1>; /*RESET=PA9*/
dc-gpios = <&pio 0 8 0>; /*DC_RS=PA10*/
led-gpios = <&pio 0 19 0>; /*LED=PA19*/
debug = <0>;
};
};
};
};
Реализована подсветка экрана при выводе на него изображения.
3 Режим возможности управления подсветкой выключать/включать подсветку во время работы. (SPI0) #
Схема такая же как и во втором варианте. Рекомендуется во всех вариантах схем применять резистор на 56 Ohms. В макетках сидят отлично. :)
Код наложения: spi0-ili9341-backlight-on-off.dts
/*
*
* Устройство: 2,8-дюймовый SPI-модуль ILI9341 / repka pi 3
* Device: 2.8 inch SPI Module ILI9341 / repka pi 3
*
* Передача данных по шине SPI0 - Подсветка LCD экрана режим: выключать/включать подсветку во время работы дисплея.
* Data transfer via SPI0 - LCD screen backlight mode: turn the backlight on/off while the display is on.
*
* Модуль Соединитель Контакт Repka Pi3 Код pio Дополнительная информация
* Module Connector Pin Pio code Additional information
*
* VCC <- 3.3V 17 3.3V или 1 цифровой вывод питание 3,3V
* or 1 any digital pin or 3.3V power
* GND = GND 25 GND или любой другой Ground 6, 9, 14, 20, 30, 34, 39
* or any other Ground 6, 9, 14, 20, 30, 34, 39
* CS <- PС3 24 SPI0-CS0 (2 3 0)
* RESET <- PA9 13 LSD_RESET (0 9 1)
* DC/RS <- PA10 15 LSD_DC/RS (0 10 0)
* SDI(MOSI) <- PC0 19 SPI0-MOSI
* SCK <- PC2 23 SPI0-CLK
*
* LED <-resistor-><-PA19 27 (0 19 0)
* = 56 Ohms
*
* SDO(MISO) -> PC1 21 SPI0-MISO
*
*/
/dts-v1/;
/plugin/;
/ {
compatible = "allwinner,sun50i-h5";
fragment@0 {
target = <&pio>;
__overlay__ {
backlight_pin: backlight_pin {
pins = "PA19";
function = "gpio_out";
};
};
};
fragment@1 {
target-path = "/";
__overlay__ {
backlightlcdtft: backlightlcdtft {
compatible = "gpio-backlight";
pinctrl-names = "default";
pinctrl-0 = <&backlight_pin>;
gpios = <&pio 0 19 0>; /*PA19-27*/
default-on;
};
};
};
fragment@2 {
target = <&pio>;
__overlay__ {
ili9341_pins: ili9341_pins {
pins = "PA9", "PA10"; /*RESET, DC_RS*/
function = "gpio_out", "gpio_out" ;
};
};
};
fragment@3 {
target = <&spi1>;
__overlay__ {
status = "okay";
cs-gpios = <&pio 2 3 0>; /* PС3 */
ili9341: ili9341@0 {
compatible = "ilitek,ili9341";
reg = <0>;
pinctrl-names = "default";
pinctrl-0 = <&ili9341_pins>;
spi-max-frequency = <16000000>;
rotate = <90>;
bgr;
fps = <25>;
buswidth = <8>;
reset-gpios = <&pio 0 9 1>; /*RESET=PA9*/
dc-gpios = <&pio 0 10 0>; /*DC_RS=PA10*/
backlight = <&backlightlcdtft>;
/*led-gpios = <&pio 0 19 0>; LED=PA19*/ /*PA19-27 В данном наложении контакт реализован в рамках gpio-backlight выше. // In this overlay the pin is implemented within the gpio-backlight framework above. */
debug = <0>;
};
};
};
};
/* echo "1" > /sys/class/backlight/backlightlcdtft/brightness */
/* echo "0" > /sys/class/backlight/backlightlcdtft/brightness */
Включить подсветку:
echo "1" > /sys/class/backlight/backlightlcdtft/brightness
Выключить подсветку:
echo "0" > /sys/class/backlight/backlightlcdtft/brightness
Внутри тела наложения оставлены комментарии и маленькие пояснения.
Это наше первое познание в дереве устройств и является сухим дополнением в виде наложений для Repka Pi, к разным материалам созвучных данной теме и более широко раскрытыми диапазонами.
GSG (с)2025 (☼)7533
Очень полезная статья, Спасибо большое!