Установка модуля дисплея и тачскрина на Orange Pi Zero - inscrut/opizero_dts GitHub Wiki

Подключение

Схема дисплея

Распиновка шлейфа именно как на фото, вид сверху. Нумерация вроде как наоборот, у таких разъемов ключ должен быть слева, а на фото справа, поэтому 1 пин это 10, 2 это 9 и тд. Но в данном случае, смотрим на названия - пины верно расписаны по фото. Либо прозванивайте GND и поймете ориентацию разъема и распиновки.

Распиновка Orange Pi Zero

Уровни на всех выводах 3.3В. На плате установлен понижающий преобразователь, питание 5В.

Кратко

Далее будет копия текста автора, оставляю здесь на всякий случай (если вдруг пропадет информация). Автор описывает установку на Orange Pi 3 LTS с процессором H6. На другие делаете по аналогии. В данном репозитории я скопировал исходники для драйвера, и привел файлы конфигурации для Orange Pi Zero и дисплея от FlyingBear Ghost 6 (MKS TS35), дисплей повернут, его поворот, кстати, также указывается в DTS файле, обратите на это внимание, если вам поворот не нужен - поправьте файлы dts и .conf для тачскрина.

Установка драйвера

В ядре нет подходящего драйвера для контроллера st7796s. Есть пример настройки на raspberry pi с драйвером tinylcd35. Однако в mainline ядре такого драйвера нет, и сам автор говорит, что “This guide have been archived due some kernel changes on raspbian mainline kernel”.

Сам по себе чипсет достаточно типовой, отличается только инициализация экрана. Поэтому можно собрать драйвер в виде внешнего модуля ядра.

Для сборки модуля понадобится пакет build-essential и linux-headers. Для linux-headers нужно определить архитектуру процессора:

root@orangepi3-lts:~# uname -a
Linux orangepi3-lts 5.15.63-sunxi64 #trunk SMP Tue Aug 30 11:31:51 UTC 2022 aarch64 GNU/Linux

Архитектура указана после версии ядра (5.15.63-sunxi64), в данном случае sunxi64.

Если архитектура отличается, список доступных пакетов можно посмотреть командой:

sudo apt-cache search linux-headers-current

Установка необходимых пакетов:

sudo apt update
sudo apt install git build-essential linux-headers-current-sunxi64

Клонирование репозитория с кодом драйвера:

git clone https://github.com/Sergey1560/fb_st7796s.git
cd fb_st7796s/kernel_module/

Git-репозиторий

Сборка драйвера:

make
sudo make install
make clean
sudo depmod -A

При копировании драйвера (команда make install) компилятор сообщит об ошибках “SSL error”. Их можно игнорировать.

Для того, чтобы драйвер загружался при старте системы, его нужно добавить в initramfs. Для этого нужно добавить название драйвера в /etc/initramfs-tools/modules и обновить сжатый образ initramfs:

sudo bash -c 'echo "fb_st7796s" >> /etc/initramfs-tools/modules'
sudo update-initramfs -u

Проверить, что драйвер был добавлен:

sudo lsinitramfs /boot/initrd.img-5.15.48-sunxi64 |grep fb

Для загрузки драйвера нужно указать ядру к каким ногам подключен экран и тач, а так же включить SPI. Делается это через device tree. Для Orange Pi 3 LTS есть готовый файл:

cd ../dts/
sudo armbian-add-overlay sun50i-h6-st7796s.dts

Тут указываете свой DTS если у вас другая железка, например Orange Pi Zero

На этом можно перезагрузить систему и убедиться, что экран работает:

sudo reboot

После перезагрузки должно появиться изображение на экране и отладочные сообщения в выводе ядра. Посмотреть можно так:

dmesg|grep 7796
dmesg|grep 7846

Проверить работает ли touch можно при помощи evtest.

Настройка Xorg и KlipperScreen

Предполагается, что KlipperScreen установлен через kiauh. После установки нужно заменить используемый Xorg драйвер и поправить конфигурацию.

В /etc/X11/Xwrapper.config нужно добавить:

allowed_users=anybody
needs_root_rights=yes

Замена драйвера:

sudo systemctl stop KlipperScreen.service
sudo mv /etc/X11/xorg.conf.d/50-fbturbo.conf /etc/X11/xorg.conf.d/50-fbdev.conf
sudo apt-get remove xserver-xorg-video-fbturbo
sudo apt-get install xserver-xorg-video-fbdev

В файле /etc/X11/xorg.conf.d/50-fbdev.conf изменить Driver на fbdev:

nano /etc/X11/xorg.conf.d/01-armbian-defaults.conf

Section "Device"
        Identifier      "Allwinner FBDEV"
        Driver          "fbdev"
        Option          "fbdev" "/dev/fb0"

        Option          "SwapbuffersWait" "true"
EndSection

Для работы с тачем нужно добавить конфигурацию в файл /etc/X11/xorg.conf.d/51-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

И установить пакет xserver-xorg-input-libinput:

sudo apt install xserver-xorg-input-libinput

Ориентация тач панели задается параметром TransformationMatrix. Настройки выше сделаны для экрана расположенного вертикально, как на Flying Bear 6.

Для проверки работы KlipperScreen можно запустить его вручную, с выводом сообщений в терминал:

xinit /home/sergey/.KlipperScreen-env/bin/python /home/sergey/KlipperScreen/screen.py

Если все запускается и работает, можно прервать процесс сочетание кнопок ctrl+c и запустить его как сервис:

sudo systemctl start KlipperScreen.service 

Если нужно настроить поворот тач панели это можно сделать не перезапуская KlipperScreen. Посмотреть текущую матрицу:

DISPLAY=:0.0 xinput list-props 'ADS7846 Touchscreen' | grep "Coordinate Transformation Matrix"

Применить новую:

DISPLAY=:0.0 xinput --set-prop 'ADS7846 Touchscreen' 'Coordinate Transformation Matrix' 0 -1 1 1 0 0 0 0 1

Описание Coordinate Transformation Matrix. Стандартные матрицы для поворота указаны так же в wiki KlipperScreen. Если нужно инвертировать одну ось, можно воспользоваться online калькулятором матрицПример расчета.

Если нужна калибровка экрана, нужно установить пакет xinput-calibrator. Получение номера устройства для калбировки:

sergey@orangepi3-lts:~$ DISPLAY=:0 xinput_calibrator --list
Device "ADS7846 Touchscreen" id=6

Запуск калибровки:

sergey@orangepi3-lts:~$ DISPLAY=:0 xinput_calibrator -v --device 6

На перекрестия лучше нажимать чем-то более тонким чем палец, например стилусом. В результате в терминале будет выведен результат ввиде пример конфигурации. Можно просто добавить параметры MinX, MaxX, MinY, MinY в /etc/X11/xorg.conf.d/51-touch.conf

Еще одна статья по KlipperScreen

KlipperScreen написан на python и выводит изображение на экран через X-сервер. Для установки KlipperScreen нужно установить дополнительные пакеты:

sudo apt install xorg xinit xserver-xorg-legacy libjpeg-dev zlib1g-dev python3-pip python3-dev libatlas-base-dev python3-gi-cairo python3-virtualenv gir1.2-gtk-3.0 virtualenv matchbox-keyboard wireless-tools xdotool xinput x11-xserver-utils libopenjp2-7 python3-distutils python3-gi python3-setuptools python3-wheel

При установке python-библиотек, некоторые из них компилируются. Для сборки используется папка /tmp. По-умолчанию для /tmp используется tmpfs и монтируется папка в RAM. Для компиляции некоторых библиотек места в этом разделе не хватит. На моей плате 512мб памяти, этого так же не хватит для сборки, поэтому будет использоваться swap. По умолчанию swap раздел так же сделан не большим. Для успешной сборки нужно увеличить swap:

sergey@orangepizero:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            189M     0  189M   0% /dev
tmpfs            50M  2.3M   47M   5% /run
/dev/mmcblk0p1   14G  1.5G   13G  11% /
tmpfs           246M     0  246M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           246M     0  246M   0% /sys/fs/cgroup
tmpfs           246M  4.0K  246M   1% /tmp
/dev/zram1       49M  1.6M   44M   4% /var/log
tmpfs            50M     0   50M   0% /run/user/1000
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

Раздел /tmp временно можно так же разместить на SD карте. Для этого его можно просто отмонтировать:

sudo umount /tmp

Для успешной установки всех зависимостей KlipperScreen, предварительно нужно установить vext и vext.gi:

pip3 install vext
pip3 install vext.gi

После этого можно при помощи Kiauh установить KlipperMoonrakerFluiddKlipperScreen. Поскольку раздел /tmp временно размещен на SD карте, а при сборке библиотек активно используется запись-чтение, процес сборки и установки библиотек (особенно matplotlib) достаточно длительный.

После завершения установки можно удалить все содержимое /tmp и смонтировать этот каталог обратно в RAM (или просто перезагрузить)

Для работы KlipperScreen нужно сделать autologin в систему. Для этого нужно создать файл /lib/systemd/system/[email protected]/20-autologin.conf

[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin sergey --noclear %I $TERM

В /etc/X11/Xwrapper.config нужно добавить:

allowed_users=anybody
needs_root_rights=yes

После перезагрузки KlipperScreen должен запуститься

Настройка touch

Для корректной работы touch-панели, нужно правильно ее настроить. При подключении по ssh, посмотреть доступные устройства (при запущенном X сервере) можно так:

sergey@orangepizero:~$ DISPLAY=:0.0 xinput list
⎡ Virtual core pointer                    	id=2	[master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer              	id=4	[slave  pointer  (2)]
⎜   ↳ ADS7846 Touchscreen                     	id=6	[slave  pointer  (2)]
⎣ Virtual core keyboard                   	id=3	[master keyboard (2)]
    ↳ Virtual core XTEST keyboard             	id=5	[slave  keyboard (3)]

В моем случае, экран был повернут на 90 градусов. Для поворота координат touch нужно воспользовать Coordinate Transformation Matrix. Стандартные матрицы для поворота указаны так же в wiki KlipperScreen

Посмотреть используемую матрицу:

DISPLAY=:0.0 xinput list-props 'ADS7846 Touchscreen' | grep "Coordinate Transformation Matrix"

Применить новую матрицу:

DISPLAY=:0.0 xinput --set-prop 'ADS7846 Touchscreen' 'Coordinate Transformation Matrix' 0 1 0 -1 0 1 0 0 1

Для того, чтобы сохранить настройки touch-панели нужно создать файл /etc/X11/xorg.conf.d/99-calibration.conf:

Section "InputClass"
        Identifier "ADS7846 Touchscreen"
        MatchIsTouchscreen "on"
        MatchDevicePath "/dev/input/event*"
        Driver "libinput"
        Option  "MinX"  "2850"
        Option  "MaxX"  "61968"
        Option  "MinY"  "3334"
        Option  "MaxY"  "62406"
        Option "TransformationMatrix" "1 0 0 0 1 0 0 0 1"
        Option  "SwapXY"        "1"
        Option  "InvertX"       "1"
        Option  "InvertY"       "1"
EndSection

References

  1. https://sergey1560.github.io/fb4s_howto/mks_ts35/
  2. https://fdmprint.ru/2022/11/19/klipper-debian-klipperscreen-ehkran-stok-fb-ghost6-mks-ts35-r-v2-0/
  3. https://github.com/Sergey1560/fb4s_howto/blob/master/klipper/orange_pi_zero.md