Skip to content

Latest commit

 

History

History
218 lines (165 loc) · 10.7 KB

orange_pi_zero.md

File metadata and controls

218 lines (165 loc) · 10.7 KB

Установка KlipperScreen на Orange Pi Zero с экраном 3.5"

Используемое железо

Для установки Klipper использовалась плата Orange Pi Zero (http://www.orangepi.org/orangepizero/) на процессоре H2+ с 512мб памяти. Операционная система - Armbian Buster с актуальным ядром 5.10.

В качестве экрана использован 3.5" экран для Raspberry Pi, подключаемый по SPI.

Подключение экрана

У платы Orange Pi Zero 40-ка пиновая колодка совпадает с Raspberry Pi, поэтому экран можно подключить прямо к плате. Важно только правильно ориентировать экран.

Orange Pi Zero pinout

TFT pinout

Сам экран выполнен на основе микросхемы ILI9486. Эта микросхема умеет работать как по параллельному интерфейсу, так и по последовательному. По какой-то причине разработчики включили параллельный интерфейс, а затем при помощи сдвиговых регистров превратили его в последовательный:

TFT schematic

Из распиновки Orange Pi Zero видно, что экран подключается к SPI1. CS сигнал экрана будет подключен на PA13, а CS сигнал для touch-панели будет подключен на PA10. Сигнал IRQ от touch панели подключен к PA1. Сам touch выполнен на микросхеме TP2046 (аналог ADS7846).

В ядре linux уже есть драйвера и для ILI9486 и для ADS7846. Для включения устройств достаточно указать ядру что куда подключено, при помощи device tree.

/dts-v1/;
/plugin/;

/ {
    compatible = "allwinner,sun8i-h3";

	fragment@0 {
		target = <&spi1>;
		__overlay__ {
			num-cs = <2>;
			cs-gpios = <&pio 0 10 0>,
					   <&pio 0 13 0>;
			status = "okay";
			#address-cells = <1>;
			#size-cells = <0>;

			ili9486: ili9486@0{
				compatible = "ilitek,ili9486";
				reg = <1>;
				spi-max-frequency = <16000000>;
				txbuflen = <32768>;
				rotate = <90>;
				bgr = <0>;
				fps = <30>;
				buswidth = <8>;
				regwidth = <16>;
				reset-gpios = <&pio 0 2 0>;
				dc-gpios = <&pio 0 18 0>;
				debug = <1>;
				init = <0x10000f1 0x36 0x04 0x00 0x3c 0x0f 0x8f 0x10000f2 0x18 0xa3 0x12 0x02 0xb2 0x12 0xff 0x10 0x00 0x10000f8 0x21 0x04 0x10000f9 0x00 0x08 0x1000036 0x08 0x10000b4 0x00 0x10000c1 0x41 0x10000c5 0x00 0x91 0x80 0x00 0x10000e0 0x0f 0x1f 0x1c 0x0c 0x0f 0x08 0x48 0x98 0x37 0x0a 0x13 0x04 0x11 0x0d 0x00 0x10000e1 0x0f 0x32 0x2e 0x0b 0x0d 0x05 0x47 0x75 0x37 0x06 0x10 0x03 0x24 0x20 0x00 0x100003a 0x55 0x1000011 0x1000036 0x28 0x20000ff 0x1000029>;
			};
		};
	};

	fragment@1 {
	target = <&spi1>;
	__overlay__ {
		#address-cells = <1>;
		#size-cells = <0>;
		status = "okay";
		ads7846@0 {
			compatible = "ti,ads7846";
			reg = <0>; 
			status = "okay";
			spi-max-frequency = <1600000>;
			interrupt-parent = <&pio>;
			interrupts = <0 1 2>; /* PA1 IRQ_TYPE_EDGE_FALLING */
			pendown-gpio = <&pio 0 1 0>; /* PA1 */

			/* driver defaults, optional */
			ti,x-min = /bits/ 16 <0>;
			ti,y-min = /bits/ 16 <0>;
			ti,x-max = /bits/ 16 <0x0FFF>;
			ti,y-max = /bits/ 16 <0x0FFF>;
			ti,pressure-min = /bits/ 16 <0>;
			ti,pressure-max = /bits/ 16 <0xFFFF>;
			ti,x-plate-ohms = /bits/ 16 <400>;
		};
	};
	};


};

Готовый файл

В overlay для SPI1 указаны два cs-gpios, для двух устройств на шине SPI. Выбор конкретного CS - в overlay устройства в параметре reg

Установка dts

Компиляция и установка overlay в armbian автоматизированы:

sudo armbian-add-overlay sun8i-h3-ili9486.dts

Overlay будет установлен в папке пользовательских overlay-ев. Для применения достаточно перезагрузить систему. В выводе dmesg должны появиться два устройства на SPI шине и изображение на экране:

sergey@orangepizero:~$ dmesg|grep spi
[   10.377212] ads7846 spi1.0: supply vcc not found, using dummy regulator
[   10.382330] ads7846 spi1.0: touchscreen, irq 70
[   10.385112] input: ADS7846 Touchscreen as /devices/platform/soc/1c69000.spi/spi_master/spi1/spi1.0/input/input0
[   10.427147] [drm] Initialized ili9486 1.0.0 20200118 for spi1.1 on minor 0
[   12.365795] ili9486 spi1.1: [drm] fb0: ili9486drmfb frame buffer device

Установка 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 установить Klipper, Moonraker, Fluidd, KlipperScreen. Поскольку раздел /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 "TransformationMatrix" "0 1 0 -1 0 1 0 0 1"
	Option    "SwapXY"    "1"
	Option	"InvertX"     "1"
EndSection