Введение
Понадобилось нам тут для одного проекта подключить экран ili9341. Этот графический дисплей широко представлен как на отечественных рынках, так и на том же aliexpress (ожидаемо, по цене вдвое меньше).
Рис. 1. Типичный вид дисплея
В самом запуске дисплея нет ничего сложного: качаем с гита, настраиваем под свои нужды, радуемся. Проблема только в том, что большинство решений написаны под «малинку». Ну или под «апельсин». В крайнем случае — под «банан». Душа же требовала чего-то нового… Чем репка хуже? Ничем не хуже, даже лучше! Наверное :-)
Разумеется, под репку готового решения не существует, продукт молодой, а комьюнити — небольшое. Ну что же, будем действовать по аналогии с тем, что есть. Источники, на которые мы опирались, представлены в конце статьи, а мы начинаем начинать… Впрочем, сначала кратко пробежимся, с чем будем работать:
- Одноплатный компьютер: Repka Pi 3, 1.2 Ghz, 1 Gb ОЗУ, версия платы 1.3
- Операционная система: Repka OS v1.0.12 (21.07.23) — кстати, пока разбирался с дисплеем вышла новая версия, на ней должно быть всё аналогично
- Дисплей: ili9341 (разрешение 240х320, без тачскрина)
1. Начальная проверка и установка зависимостей
Поскольку писать драйвер с нуля желания не было, мы сразу проверили их наличие в системе: есть ли смысл вообще пытаться?
root@Repka-Pi:~# find /lib/modules/$(uname -r)/kernel/drivers/ -iname "*ili9341*"
/lib/modules/5.19.16-sunxi64/kernel/drivers/gpu/drm/panel/panel-ilitek-ili9341.ko
/lib/modules/5.19.16-sunxi64/kernel/drivers/gpu/drm/tiny/ili9341.ko
/lib/modules/5.19.16-sunxi64/kernel/drivers/staging/fbtft/fb_ili9341.ko
Если команда find вывела строки выше, то шансы есть, можно продолжать. Теперь установим зависимости:
root@Repka-Pi:~# apt install -y python3-distutils
root@Repka-Pi:~# apt install -y python3-dev
root@Repka-Pi:~# apt install -y swig
root@Repka-Pi:~# apt install -y device-tree-compiler
root@Repka-Pi:~# apt install -y mplayer
root@Repka-Pi:~# apt install -y fbi
2. Сборка загрузчика
Далее скачаем архив с DTS и распакуем исходники загрузчика:
root@Repka-Pi:~# wget --no-check-certificate https://download.robointellect.ru/Uboot-21.07.23.zip
root@Repka-Pi:~# unzip Uboot-21.07.23.zip
root@Repka-Pi:~# cd Uboot/Uboot-repka/
root@Repka-Pi:~/Uboot/Uboot-repka# unzip u-boot-v2022.04.zip
root@Repka-Pi:~/Uboot/Uboot-repka# cd u-boot-v2022.04
Править мы будем исходник второго варианта прошивки на 1 ГГц: ./arch/arm/dts/sun50i-h5-repka-pi3-alt-1ghz.dts.
Создайте в папке /tmp патч-файл, который автоматически применит нужные изменения (так же этот файл лежит в аттаче к статье).
root@Repka-Pi:~/Uboot/Uboot-repka/u-boot-v2022.04# vi /tmp/sun50i-h5-repka-pi3-alt-1ghz.dts_patch.sh
patch --no-backup-if-mismatch -f <<'EOF' ./arch/arm/dts/sun50i-h5-repka-pi3-alt-1ghz.dts
@@ -336,17 +336,22 @@
cs-gpios = <0>, <&pio 0 3 0>; /* PA3 */
status = "okay";
- spidev@0 {
- compatible = "rohm,dh2228fv";
- status = "okay";
- reg = <0>;
- spi-max-frequency = <1000000>;
+ 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=PA8*/
+ debug = <0>;
};
spidev@1 {
- compatible = "rohm,dh2228fv";
- status = "okay";
- reg = <1>;
- spi-max-frequency = <1000000>;
+ status = "disabled";
};
};
@@ -368,6 +373,10 @@
function = "gpio_out";
output-high;
};
+ ili9341_pins: ili9341_pins {
+ pins = "PA9", "PA8"; /*RESET, DC_RS*/
+ function = "gpio_out", "gpio_out" ;
+ };
};
EOF
Применим патч для файла ./arch/arm/dts/sun50i-h5-repka-pi3-alt-1ghz.dts
root@Repka-Pi:~/Uboot/Uboot-repka/u-boot-v2022.04# bash /tmp/sun50i-h5-repka-pi3-alt-1ghz.dts_patch.sh
patching file ./arch/arm/dts/sun50i-h5-repka-pi3-alt-1ghz.dts
Если вывод команды без ошибок, то пробуем сбилдить, но сначала выполним экспорт переменных (для верности экспорт лучше проводить каждый раз перед запуском make):
root@Repka-Pi:~/Uboot/Uboot-repka/u-boot-v2022.04# export ARCH=arm64
root@Repka-Pi:~/Uboot/Uboot-repka/u-boot-v2022.04# export CROSS_COMPILE=aarch64-linux-gnu-
root@Repka-Pi:~/Uboot/Uboot-repka/u-boot-v2022.04# make dtbs
В случае, если билд пройдет без ошибок, появится файл загрузчика ./arch/arm/dts/sun50i-h5-repka-pi3-alt-1ghz.dtb.
Теперь сделаем резервную копию старого загрузчика и скопируем новый загрузчик в папку /boot/
root@Repka-Pi:~/Uboot/Uboot-repka/u-boot-v2022.04# cp /boot/sun50i-h5-repka-pi3.dtb /boot/sun50i-h5-repka-pi3.dtb_bk
root@Repka-Pi:~/Uboot/Uboot-repka/u-boot-v2022.04# cp ./arch/arm/dts/sun50i-h5-repka-pi3-alt-1ghz.dtb /boot/sun50i-h5-repka-pi3.dtb
Создайте папку /dist и скопируйте в нее из аттача пример картинки и видео.
Теперь выключите и обесточьте репку, будем подключать дисплей.
root@Repka-Pi:~/Uboot/Uboot-repka/u-boot-v2022.04# poweroff
3. Подключение дисплея
Схему подключения дисплея представим в виде таблицы и фотографии:
Контакт LCD | Номер контакта на Repka PI | Цвет провода на фотографии |
---|---|---|
SDO (MISO) | 21 | Оранжевый |
LED | 17 или любой свободный GPIO на 3.3V (рекомендуется резистор на 56 Ом) | Желтый |
SCK | 23 | Зеленый |
SDI (MOSI) | 19 | Синий |
DC/RS | 11 | Коричневый |
RESET | 13 | Фиолетовый |
CS | 26 | Белый |
GND | 39 или любой другой GND | Черный |
VCC | 1 или любой свободный GPIO на 3.3V | Красный |
рис. 2. Фото подключения
Обратите внимание, что контакт CS перед включением репки отключен. Так будет сразу видно, заработал ли дисплей. Включаем плату. Если вы всё сделали правильно, то сначала должна загореться белая подсветка, а после загрузки ОС, дисплей изменит цвет и начнет слабо мерцать (см. рис. ниже). Если цвет экрана не изменился, то вы либо забыли отключить контакт CS (отключите и перезагрузитесь), либо где-то ошиблись с проводами — перепроверьте соединения ещё раз. Есть и ещё один момент с CS: он очень не любит длинных проводов. Попробуйте вообще убрать провода с контакта и ребутнуться. Получился мерцающий экран? Всё равно нет? Возможно, у вас такой инит дисплея — попробуйте идти дальше по статье, может оно заработает. Только CS экрана к плате дисплея подключите.
Рис. 3. Фото дисплея до и после инициализации.
Итак, экран загрузился, контакты CS соединены (в дальнейшем нет необходимости их дергать).
Теперь открываем консоль, заходим в папку /dist и пробуем открыть картинку:
root@Repka-Pi:/dist# fbi -noverbose -a -d /dev/fb1 test.jpg
Если вы подключены к репке по SSH, то следует указать консоль:
root@Repka-Pi:/dist# fbi -noverbose -T 1 -a -d /dev/fb1 test.jpg
Рис. 4. Вывод картинки на дисплей
Но картинка неинтересно. Попробуем видео:
mplayer -nolirc -vo fbdev2:/dev/fb1 test.mpg
Тут должна быть в статье видеовставка, но ее не будет :-) Потому что найти качественное видео в формате 320x240 весьма непросто, а при попытке снять то, что получилось, на смартфон, возникают цветовые аберрации, которые добивают остатки качества. Пусть это останется интригой — так сказать, награда за успешно запущенный дисплей, ведь там на видео котики, все любят котиков :-)
От команды Репки мы добавляем ссылку на пост в группе обсуждения Репки с видео работы.
Заключение и благодарности
Вот и закончилось очередное путешествие по не совсем документированным возможностям. Путь был трудным, за советы спасибо каналу Репки в телеге (), в частности, Дмитрию (@screatorpro) за правильное направление, ну и остальным — за моральную поддержку :-) А так же следующим статьям:
- Заметка по настройке сенсорного TFT дисплея в репке ()
- Статья по подключению дисплея LCD ILI9341 к Banana Pi — из этой статьи почерпнул много идей ()
Всем бобра! Статья написана при поддержке сайта 4lab.su, на котором почти ничего нет, потому что автор ленивая ж.. :-)
DySprozin aka xjmjk, 2023 год.
Супер! Спасибо!
Будем повторять!
А можно вернуть ссылки на заметку по настройке сенсорного TFT дисплея в репке и на статью по подключению дисплея LCD ILI9341 к Banana Pi?!