Orange pi PC, AllWinner H3 SoC

ARMBIAN 5.23—-> 5.96 Debian jessie, stretch, Ubuntu xenial, bionic
платформа : «Orangepi PC» Linux 3.4.113-sun8i  —> 5.3.y
Тестировал на дату публикации

Headers в сборке Buster minimal от armbian

При компиляции драйверов на целевой платформе OrangePIPC, возникли проблемы с headers на Buster minimal от armbian.

Покажу как обойти эти проблемы на ядрах 5.3.x , например на этом имидже: Armbian_5.96.190911_Orangepipc_Debian_buster_dev_5.3.0-rc8_minimal.img

uname -a


Linux orangepipc 5.3.0-rc8-sunxi #5.96.190911 SMP Wed Sep 11 02:03:29 CEST 2019 armv7l GNU/Linux

ставим headers и пакеты которые понадобятся:

apt install linux-headers-dev-sunxi build-essential flex bison -y

обновим пакеты:

apt update &&  apt list --upgradable && apt upgrade -y

проверка:

cd /usr/src/linux-headers-5.3.0-rc8-sunxi
make headers_check

Ошибка:

root@orangepipc:/usr/src/linux-headers-5.3.0-rc8-sunxi# make headers_check
HOSTCC scripts/unifdef
make[1]: *** No rule to make target ’arch/arm/tools/syscall.tbl’, needed by ’arch/arm/include/generated/uapi/asm/unistd-common.h’. Stop.
make: *** [arch/arm/Makefile:321: archheaders] Error 2
root@orangepipc:/usr/src/linux-headers-5.3.0-rc8-sunxi#

для исправления комментируем строки в файле /usr/src/linux-headers-5.3.0-rc8-sunxi/arch/arm/Makefile:

#archheaders:
#       $(Q)$(MAKE) $(build)=arch/arm/tools uapi

#archprepare:
#       $(Q)$(MAKE) $(build)=arch/arm/tools kapi

после команды:

make modules_prepare

Ошибка:

scripts/extract-cert.c:21:10: fatal error: openssl/bio.h: No such file or directory

для исправления ставим пакет libssl-dev

apt install libssl-dev

Драйвер mali r9p0 AllWinner H3 на linux-4.20.7-sunxi

Графическое ядро Mali было разработано норвежским подразделением компании ARM — ARM Norway (бывшая Falanx).

Here is the driver needed in order to support ARM’s Mali GPU found on the Allwinner SoC, using a mainline (ie. Torvalds’)

Тестировал на Armbian Bionic Orangepipc от armbian,
ставим Armbian.
обновим нашу систему и ставим headers

wget https://apt.armbian.com/pool/main/l/linux-4.20.7-sunxi/linux-dtb-dev-sunxi_5.75_armhf.deb

wget https://apt.armbian.com/pool/main/l/linux-4.20.7-sunxi/linux-headers-dev-sunxi_5.75_armhf.deb

wget https://apt.armbian.com/pool/main/l/linux-4.20.7-sunxi/linux-image-dev-sunxi_5.75_armhf.deb

dpkg -i *.deb
reboot

отключим драйвер lima
надо прописать в файл /etc/modprobe.d/blacklist.conf

blacklist lima
blacklist gpu_sched
blacklist ttm

выполнить update-initramfs -u и сделать reboot

update-initramfs -u
reboot
apt update &&  apt list --upgradable && apt upgrade -y
uname -a


Linux orangepipc 4.20.7-sunxi #5.75 SMP Fri Feb 8 09:02:10 CET 2019 armv7l armv7l armv7l GNU/Linux

в linux-headers-4.20.7-sunxi есть ошибка, для исправления надо создать пустой файл
source «net/wireguard/Kconfig» и запустить make scripts в папке /usr/src/linux-headers-4.20.7-sunxi

mkdir -p  /usr/src/linux-headers-4.20.7-sunxi/net/wireguard
touch /usr/src/linux-headers-4.20.7-sunxi/net/wireguard/Kconfig
cd /usr/src/linux-headers-4.20.7-sunxi
make scripts
cd

собираем модуль mali.ko (просто скопируйте код, и вставьте в терминал )
исходники пропатчены https://github.com/jernejsk/LibreELEC.tv/tree/hw_dec_ffmpeg/packages/linux-drivers/gpu-sunxi/patches

git clone https://github.com/ua3nbw-cf/kodi-build.git
cd kodi-build/DX910-SW-99002-r9p0-01rel0/driver/src/devicedrv/mali
export CROSS_COMPILE=arm-linux-gnueabihf-
export KDIR=/lib/modules/$(uname -r)/build

make MALI_PLATFORM_FILES=platform/sunxi/sunxi.c \
    EXTRA_CFLAGS="-DCONFIG_MALI_DVFS \
    -DMALI_FAKE_PLATFORM_DEVICE=1 \
    -DCONFIG_MALI_DMA_BUF_MAP_ON_ATTACH" \
    CONFIG_MALI400=m USING_DVFS=1 

mkdir -p /lib/modules/$(uname -r)/extra
cp -PR mali.ko /lib/modules/$(uname -r)/extra/mali.ko

depmod
modprobe mali
sleep 5
chmod 666 /dev/mali
sleep 5
chgrp video /dev/mali

вывод команды ls -l /dev/mali

crw-rw-rw- 1 root video 10, 57 Apr 6 04:49 /dev/mali

вывод команды lsmod | grep mali

mali 479232 0

Создаем правила для устройств

cat > /etc/udev/rules.d/50-mali.rules << _EOF_
KERNEL=="mali", MODE="0666", GROUP="video"
_EOF_
 12 комментариев    514   1 мес   Mainline   Mali

Сборка ядра Linux на целевой платформе ARM

Ядро Linux — ядро операционной системы, соответствующее стандартам POSIX, составляющее основу операционных систем семейства Linux. Разработка кода ядра была начата финским студентом Линусом Торвальдсом в 1991 году, на его имя зарегистрирована Торговая марка «Linux».
7 января 2019: первый релиз-кандидат Linux 5.0 (Более 26 млн строк кода).

Для примера соберём ядро с поддержкой Cedrus на целевой платформе.
Sunxi-Cedrus.

Покажу, как собрать на базе ядра (4.19.20-sunxi) от armbian.

uname -a


root@orangepipc:~# uname -a
Linux orangepipc 4.19.20-sunxi #5.75 SMP Sat Feb 9 19:02:47 CET 2019 armv7l armv7l armv7l GNU/Linux

Ставим инструментарий:

apt-get install kernel-package libncurses5-dev fakeroot quilt

Получение исходного кода ядра

cd /usr/src
wget https://github.com/bootlin/linux-cedrus/archive/release-2019.03.tar.gz
tar -xvzf release-2019.03.tar.gz
cd linux-cedrus-release-2019.03
make -j4 sunxi_defconfig
make -j4 menuconfig

Необходимо выбрать следующие параметры конфигурации ядра:
CONFIG_MEDIA_SUPPORT
CONFIG_MEDIA_CONTROLLER_REQUEST_API
CONFIG_MEDIA_CONTROLLER
CONFIG_V4L_MEM2MEM_DRIVERS
CONFIG_VIDEO_SUNXI_CEDRUS

Device Drivers  ---> Generic Driver Options  ---> 
        (256) Size in Mega Bytes 
Device Drivers  ---> Multimedia support 
        [*]   Cameras/video grabbers support 
        [*]   Media Controller API
        [*]     Enable Media controller Request API (EXPERIMENTAL)
        [*]   V4L2 sub-device userspace API
        [*]   Enable advanced debug functionality on V4L2 drivers
        [*]   V4L platform devices  --->
                <M>   Allwinner V3s Camera Sensor Interface driver  
        [*]   Memory-to-memory multimedia devices  ---> 
                <M>   Deinterlace support 
                <M>   SuperH VEU mem2mem video processing driver 
         [*]   Media test drivers  --->  
                <M>   Virtual Media Controller Driver (VIMC) 
                <M>   Virtual Video Test Driver    
                 [ ]     Enable CEC emulation support (NEW)    
                (64)    Maximum number of devices (NEW)  
                <M>   Virtual Memory-to-Memory Driver    
                <M>   Virtual Codec Driver
Device Drivers  ---> Staging drivers   ---> Media staging drivers  --->   
        [*]   Allwinner sunXi family Video Devices
        <M>     Allwinner Cedrus VPU driver

пакеты headers и image(ядро) собираю так:

fakeroot make-kpkg -j 4 --initrd --append-to-version=-bootlin kernel_image kernel_headers

На плате Orangepi-PC пакеты собираются примерно за час.
в папке /usr/src найдём два пакета linux-headers-5.0.0-bootlin_5.0.0-bootlin-10.00.Custom_armhf.deb и linux-image-5.0.0-bootlin_5.0.0-bootlin-10.00.Custom_armhf.deb
установим эти пакеты:

cd /usr/src
dpkg -i *.deb

в папке /usr/src/linux-cedrus-release-2019.03/arch/arm/boot/dts найдём файл дерева устройств, в моём случае это файл sun8i-h3-orangepi-pc.dtb (для своей платы ищите соответствующий вашей плате .dtb)
копируем его в нашу систему:

cp -rp /usr/src/linux-cedrus-release-2019.03/arch/arm/boot/dts/sun8i-h3-orangepi-pc.dtb  /boot/dtb

и делаем новую символьную ссылку на новое ядро:

rm /boot/zImage
ln -s /boot/vmlinuz-5.0.0-bootlin  /boot/zImage 
reboot

проверим:

uname -a


root@orangepipc:~# uname -a
Linux orangepipc 5.0.0-bootlin #1 SMP Sun Mar 17 07:44:45 UTC 2019 armv7l armv7l armv7l GNU/Linux

lsmod


sunxi_cedrus 32768 0
v4l2_mem2mem 20480 1 sunxi_cedrus
videobuf2_dma_contig 20480 1 sunxi_cedrus
videobuf2_memops 16384 1 videobuf2_dma_contig
videobuf2_v4l2 20480 2 sunxi_cedrus,v4l2_mem2mem
videobuf2_common 45056 3 sunxi_cedrus,v4l2_mem2mem,videobuf2_v4l2

root@orangepipc:~# dmesg | grep cedrus
[    4.209507] sunxi_cedrus: module is from the staging directory, the quality is unknown, you have been warned.
[    4.216242] cedrus 1c0e000.video-codec: Device registered as /dev/video0
root@orangepipc:~# ls -l /dev/ | grep video
crw-rw---- 1 root video    29,   0 Mar 18 15:46 fb0
crw-rw---- 1 root video   252,   0 Mar 18 15:46 media0
crw-rw---- 1 root video    81,   0 Mar 18 15:46 video0
 9 комментариев    396   1 мес   Linux

Alpine Linux на AllWinner H3 SoC

Alpine Linux — некоммерческий Linux дистрибутив общего назначения, предназначенный для использования опытными пользователями, ценящими безопасность, простоту и эффективность. Девиз проекта — «Small. Simple» Secure.» Основан на musl и BusyBox.

Маленький размер дистрибутива и скромные требования к железу. Alpine Linux ориентирован на использование во встраиваемых или серверных системах, поэтому включает в себя только самые необходимые компоненты.

По умолчанию, Alpine Linux во время запуска полностью [загружается в оперативную память].В качестве системы инициализации Alpine Linux использует OpenRC

Если проект не очень большой, то его можно собирать и отлаживать прямо на целевой платформе.
Покажу, как собрать на базе ядра (4.19.20-sunxi) от armbian.

uname -a


root@orangepipc:~# uname -a
Linux orangepipc 4.19.20-sunxi #5.75 SMP Sat Feb 9 19:02:47 CET 2019 armv7l armv7l armv7l GNU/Linux

Ставим пакет squashfs-tools.

apt install squashfs-tools

Скачаем и распакуем v3.9 Alpine uboot архив:

wget http://dl-2.alpinelinux.org/alpine/latest-stable/releases/armhf/alpine-uboot-3.9.2-armhf.tar.gz
mkdir alpineuboot
tar -xvzf alpine-uboot-3.9.2-armhf.tar.gz -C alpineuboot

распакуем initramfs-vanilla

mkdir initramfs-temp
cd initramfs-temp
gunzip -c /root/alpineuboot/boot/initramfs-vanilla | cpio -i


root@orangepipc:~/initramfs-temp# gunzip -c /root/alpineuboot/boot/initramfs-vanilla | cpio -i
33314 blocks

подменяем папку modules и пакуем:

rm -rf lib/modules/*
cp -rp /lib/modules/ lib/
mkdir -p /root/source/boot/dtbs
find . | cpio -H newc -o | gzip -9 > /root/source/boot/initramfs-sunxi-new
cd /root/source/boot/
mkimage -n initramfs-sunxi-new -A arm -O linux -T ramdisk -C none -d initramfs-sunxi-new initramfs-sunxi


Image Name: initramfs-sunxi-new
Created: Tue Mar 5 10:08:21 2019
Image Type: ARM Linux RAMDisk Image (uncompressed)
Data Size: 20644534 Bytes = 20160.68 KiB = 19.69 MiB
Load Address: 00000000
Entry Point: 00000000

rm initramfs-sunxi-new

собираем и пакуем modloop-sunxi

cd
mkdir -p  squashfs-temp/modules/
cp -rp /lib/modules/ squashfs-temp/
cp -rp /lib/firmware squashfs-temp/modules/
mksquashfs squashfs-temp/ /root/source/boot/modloop-sunxi -b 1048576

копируем в папку source пакеты alpine, дерево устройств, ядро:

mkdir -p /root/source/apks/armhf 
cp -rp /root/alpineuboot/apks/ /root/source/
cp -rp /boot/dtb/sun8i-h3-orangepi-pc.dtb /root/source/boot/dtbs/sun8i-h3-orangepi-pc.dtb
cp -rp /boot/vmlinuz-4.19.20-sunxi  /root/source/boot/vmlinuz-4.19.20-sunxi

создаём файл extlinux.conf

mkdir -p /root/source/boot/extlinux/
nano /root/source/boot/extlinux/extlinux.conf

вставляем:

TIMEOUT 20
PROMPT 1
DEFAULT Alpine Linux

LABEL Alpine Linux
MENU LABEL Alpine Linux
KERNEL /boot/vmlinuz-4.19.20-sunxi
INITRD /boot/initramfs-sunxi
DEVICETREEDIR /boot/dtbs
APPEND bootargs earlyprintk /boot/vmlinuz-4.19.20-sunxi modules=loop,squashfs,sd-mod,usb-storage modloop=/boot/modloop-sunxi console=${console}

Осталось скопировать папку source на флеш карту. Для этого карту надо подготовить, разметить, отфарматировать, записать u-boot например:
Сборка загрузчика UBOOT

Можно поступить проще. Вставляем карту с образом armbian для вашей платы в  USB-Reader на OrangePI,
карта определилась как /dev/sda
форматируем, монтируем карту и копируем папку source

mkfs.ext4 /dev/sda1
mount /dev/sda1 /mnt/
cp -R /root/source/* /mnt
umount -l /mnt
sync

всё, можно загрузится с этой карты
login: root

Welcome to Alpine Linux 3.9
Kernel 4.19.20-sunxi on an armv7l (/dev/ttyS0)

localhost login:


localhost:~# cat /etc/issue
Welcome to Alpine Linux 3.9
Kernel \r on an \m (\l)

localhost:~# df -h
Filesystem                Size      Used Available Use% Mounted on
devtmpfs                 10.0M         0     10.0M   0% /dev
shm                     500.3M         0    500.3M   0% /dev/shm
/dev/mmcblk0p1          862.0M     65.6M    735.7M   8% /media/mmcblk0p1
tmpfs                   500.3M      7.3M    493.0M   1% /
tmpfs                   100.1M     48.0K    100.0M   0% /run
/dev/loop0               28.0M     28.0M         0 100% /.modloop

настройка системы команда:

setup-alpine
lbu commit -d

Devuan 2.0 «ASCII» на Orange Pi PC

Devuan — форк дистрибутива Debian, появившийся в 2014 году. Его первая цель заключалась в предоставлении дистрибутива без демона systemd init по умолчанию.

У Devuan есть свой собственный репозиторий пакетов, который отражает развитие Debian вверх по течению с локальными изменениями, сделанными только тогда, когда это необходимо для других систем инициализации, а не systemd.

Ставил на MicroSDCard в  USB-Reader на целевой платформе,
карта определилась как /dev/sda
удалим все разделы карты с помощью fdisk:

fdisk /dev/sda
d - for deleting a partition
Selected partition 1
Partition 1 has been deleted.
w - for write & exit
curl -O https://files.devuan.org/devuan_ascii/embedded/devuan_ascii_2.0.0_armhf_sunxi.img.xz

xzcat devuan_ascii_2.0.0_armhf_sunxi.img.xz | sudo dd of=/dev/sda bs=2M
curl -O https://files.devuan.org/devuan_ascii/embedded/u-boot/orangepi_2_defconfig.bin
dd if=orangepi_2_defconfig.bin of=/dev/sda bs=1024 seek=8 && sync

Всё. Загружаемся с этой картой:
login:root
pass:toor

root@devuan:~# uname -a
Linux devuan 4.17.0 #1 SMP Tue Jun 5 16:49:29 CEST 2018 armv7l GNU/Linux


root@devuan:~df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 1.7G 517M 1.1G 33% /
devtmpfs 356M 0 356M 0% /dev
tmpfs 97M 120K 97M 1% /run
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 194M 0 194M 0% /run/shm
/dev/mmcblk0p1 120M 7.3M 104M 7% /boot


root@devuan:~# lsmod
Module Size Used by
sha256_generic 20480 0
sha256_arm 24576 4
hmac 16384 8
ipv6 393216 24
root@devuan:~#

Созданная в 1983 г. sysvinit не умела решать ряд важных задач, таких как:

•параллельный запуск процессов;
•обнаружение съемных носителей;
•активизация сервисов на основе сокетов;
•надежно контролировать зависимости между различными процессами и службами;
•раннее логирование событий через /dev/log.

Все эти и многие другие неудобства были наконец-то решены в systemd.
В последнее время наметились подвижки между группами разработчиков СИ Debian и Devuan. Решено объединить усилия по нескольким направлениям.

Сборка загрузчика UBOOT

u-boot. запросто и быстро компилируется на OPi
тестировал на Armbian_5.75_Orangepipc_Ubuntu_bionic_next_4.19.20

uname -a


Linux orangepipc 4.19.20-sunxi #5.75 SMP Sat Feb 9 19:02:47 CET 2019 armv7l armv7l armv7l GNU/Linux

надо например мне включить в u-boot CONFIG_OLD_SUNXI_KERNEL_COMPAT=y

apt install libncurses-dev python-dev swig
git clone git://git.denx.de/u-boot-sunxi.git
cd u-boot-sunxi

For all supported boards there are ready-to-use default
configurations available; just type make board_name_defconfig

make orangepi_pc_defconfig
make menuconfig
make -j4
dd if=/dev/zero of=/dev/mmcblk0 bs=1024 seek=544 count=128
dd if=u-boot-sunxi-with-spl.bin of=/dev/mmcblk0 bs=1024 seek=8
reboot

Здесь, первая команда dd предназначена для очистки переменных окружения U-Boot, а вторая, — для записи начального SPL загрузчика и, непосредственно, U-Boot.
подробнее тут.

Вывод U-Boot информации serial console на плате Orange Pi PC

U-Boot SPL 2019.04-rc1-00629-gd065a6c00a (Feb 19 2019 - 07:15:33 +0000)
DRAM: 1024 MiB
Trying to boot from MMC1


U-Boot 2019.04-rc1-00629-gd065a6c00a (Feb 19 2019 - 07:15:33 +0000) Allwinner Technology

CPU:   Allwinner H3 (SUN8I 1680)
Model: Xunlong Orange Pi PC
DRAM:  1 GiB
MMC:   mmc@1c0f000: 0
Loading Environment from FAT... Unable to use mmc 0:1... In:    serial
Out:   vidconsole
Err:   vidconsole
Net:   phy interface0
eth0: ethernet@1c30000
starting USB...
USB0:   USB EHCI 1.00
USB1:   USB OHCI 1.0
USB2:   USB EHCI 1.00
USB3:   USB OHCI 1.0
USB4:   USB EHCI 1.00
USB5:   USB OHCI 1.0
USB6:   USB EHCI 1.00
USB7:   USB OHCI 1.0
scanning bus 0 for devices... 1 USB Device(s) found
scanning bus 1 for devices... 1 USB Device(s) found
scanning bus 2 for devices... 1 USB Device(s) found
scanning bus 3 for devices... 1 USB Device(s) found
scanning bus 4 for devices... 1 USB Device(s) found
scanning bus 5 for devices... 1 USB Device(s) found
scanning bus 6 for devices... 1 USB Device(s) found
scanning bus 7 for devices... 2 USB Device(s) found
       scanning usb for storage devices... 0 Storage Device(s) found
Hit any key to stop autoboot:  0
switch to partitions #0, OK
mmc0 is current device
Scanning mmc 0:1...
Found U-Boot script /boot/boot.scr
3798 bytes read in 2 ms (1.8 MiB/s)
## Executing script at 43100000
U-boot loaded from SD
Boot script loaded from mmc
201 bytes read in 1 ms (196.3 KiB/s)
8129656 bytes read in 368 ms (21.1 MiB/s)
7323200 bytes read in 332 ms (21 MiB/s)
Found mainline kernel configuration
29109 bytes read in 10 ms (2.8 MiB/s)
4155 bytes read in 6 ms (675.8 KiB/s)
Applying kernel provided DT fixup script (sun8i-h3-fixup.scr)
## Executing script at 44000000
## Loading init Ramdisk from Legacy Image at 43300000 ...
   Image Name:   uInitrd
   Image Type:   ARM Linux RAMDisk Image (gzip compressed)
   Data Size:    8129592 Bytes = 7.8 MiB
   Load Address: 00000000
   Entry Point:  00000000
   Verifying Checksum ... OK
## Flattened Device Tree blob at 43000000
   Booting using the fdt blob at 0x43000000
EHCI failed to shut down host controller.
   Loading Ramdisk to 4983f000, end 49fffc38 ... OK
   Loading Device Tree to 497cf000, end 4983efff ... OK

Starting kernel ...

Uncompressing Linux... done, booting the kernel.

Ubuntu 18.04.1 LTS orangepipc ttyS0

orangepipc login:
 Нет комментариев    200   6 мес   armbian   UBOOT

LIRC (ir-keytable + lircd) на armbian

LIRC стабильная и проверенная библиотека с открытым кодом, которая позволяет отправлять и получать команды по инфракрасному порту, (англ. Linux Infrared Remote Control, «управление Linux при помощи инфракрасного пульта дистанционного управления»)

При использовании irrecord он будет просить вас несколько раз нажимать кнопки различным образом, использование ir-keytable лишает этой радости, но всё равно надо привязать названия к кнопкам. Не обязательно ко всем, можно только к тем, которые планируете использовать.

тестировал на Armbian_5.75_Orangepipc_Ubuntu_bionic_next_4.19.20

uname -a


Linux orangepipc 4.19.20-sunxi #5.75 SMP Sat Feb 9 19:02:47 CET 2019 armv7l armv7l armv7l GNU/Linux

ставим ir-keytable

apt install ir-keytable -y

(просто скопируйте код, и вставьте в терминал )

mkdir -p  /etc/rc_keymaps
touch /etc/rc_keymaps/my_keymaps

ir-keytable -c -p other,lirc,rc-5,rc-5-sz,jvc,sony,nec,sanyo,mce_kbd,rc-6,sharp,xmp -w /etc/rc_keymaps/my_keymaps

ir-keytable -t

нажимаем на кнопки пульта, пример выдачи моего пульта
при нажатии кнопки «1» , «2», «-VOL», «+VOL» и т. д.

root@orangepipc:~# ir-keytable -t
Testing events. Please, press CTRL-C to abort.
1300.707932: lirc protocol(nec): scancode = 0xc
1300.758474: lirc protocol(nec): scancode = 0xc repeat
1305.305770: lirc protocol(nec): scancode = 0x18
1308.840815: lirc protocol(nec): scancode = 0x18 repeat
1810.025185: lirc protocol(nec): scancode = 0x15
1810.075733: lirc protocol(nec): scancode = 0x15 repeat
1811.312910: lirc protocol(nec): scancode = 0x9
1811.363469: lirc protocol(nec): scancode = 0x9 repeat

scancode прописываем в файл: /etc/rc_keymaps/my_keymaps

0x0c KEY_1
0x18 KEY_2
0x15 KEY_VOLUMEDOWN
0x09 KEY_VOLUMEUP

для автозапуска ir-keytable в  файл /etc/rc.local прописываем строку:

ir-keytable -c -p other,lirc,rc-5,rc-5-sz,jvc,sony,nec,sanyo,mce_kbd,rc-6,sharp,xmp -w /etc/rc_keymaps/my_keymaps

вывод команды: lsmod | grep ir_

root@orangepipc:~# lsmod | grep ir_
ir_xmp_decoder 16384 0
ir_mce_kbd_decoder 16384 0
ir_sharp_decoder 16384 0
ir_sanyo_decoder 16384 0
ir_sony_decoder 16384 0
ir_jvc_decoder 16384 0
ir_rc6_decoder 16384 0
ir_nec_decoder 16384 0
ir_rc5_decoder 16384 0

после настройки, лишние модули при запуске ir-keytable в опции -p можно не указывать.

Ставим lirc

apt install lirc -y

запуск irw

irw

при нажатии на кнопки пульта «1» , «2», «-VOL», «+VOL» и т. д. если scancode прописали в файл: /etc/rc_keymaps/my_keymaps наблюдаем выдачу irw.
пример выдачи моего пульта:

root@orangepipc:~# irw
0000000080010002 00 KEY_1 devinput-32
0000000080010003 00 KEY_2 devinput-32
0000000080010072 00 KEY_VOLUMEDOWN devinput-32
0000000080010073 00 KEY_VOLUMEUP devinput-32

Далее требуется настроить команды, которые будут получать приложения, использующие управление при помощи ПДУ, при нажатии кнопок пульта. Они указываются в файле: /etc/lirc/irexec.lircrc в котором описывается как и какому приложению реагировать на нажатие клавиши на пульте. Для примера как всегда поморгаем светодиодами на плате OrangePI PC и поуправляем громкостью с помощью amixer, запустив alsamixer наблюдаем визуально столбик «Line Out» при регулировке громкостью с помощью пульта.

begin
   remote = devinput-32	
   button = KEY_1
   repeat = 0
   delay = 0
   prog = irexec
   config = echo heartbeat | sudo tee "/sys/class/leds/orangepi:red:status/trigger"
   config = echo none | sudo tee "/sys/class/leds/orangepi:red:status/trigger"
end
begin
   remote = devinput-32	
   button = KEY_2
   repeat = 0
   delay	= 0
   prog = irexec
   config = echo heartbeat | sudo tee "/sys/class/leds/orangepi:green:pwr/trigger"
   config = echo none | sudo tee "/sys/class/leds/orangepi:green:pwr/trigger"
end
begin
   remote = devinput-32
   prog   = irexec
   button = KEY_VOLUMEDOWN
   config = amixer set "Line Out" 3%- &> /dev/null
   repeat = 10
   delay  = 10
end
 begin
   remote = devinput-32
   prog   = irexec
   button = KEY_VOLUMEUP
   config = amixer set "Line Out" 3%+ &> /dev/null
   repeat = 10
   delay  = 10
end
 159   6 мес   armbian   IR/InfraRed

Модуль gpio-rotary encoder на armbian

Энкодер или датчик угла поворота — это электромеханическое устройство, предназначенное для преобразования углового положения вала или оси в электрические сигналы.

тестировал на Armbian_5.75_Orangepipc_Ubuntu_bionic_next_4.19.20

uname -a


Linux orangepipc 4.19.20-sunxi #5.75 SMP Sat Feb 9 19:02:47 CET 2019 armv7l armv7l armv7l GNU/Linux

обновим нашу систему и ставим headers

wget https://apt.armbian.com/pool/main/l/linux-4.20.7-sunxi/linux-dtb-dev-sunxi_5.75_armhf.deb

wget https://apt.armbian.com/pool/main/l/linux-4.20.7-sunxi/linux-headers-dev-sunxi_5.75_armhf.deb

wget https://apt.armbian.com/pool/main/l/linux-4.20.7-sunxi/linux-image-dev-sunxi_5.75_armhf.deb

dpkg -i *.deb
reboot
apt update &&  apt list --upgradable && apt upgrade -y
uname -a


Linux orangepipc 4.20.7-sunxi #5.75 SMP Fri Feb 8 09:02:10 CET 2019 armv7l armv7l armv7l GNU/Linux

в linux-headers-4.20.7-sunxi есть ошибка, для исправления надо создать пустой файл
source «net/wireguard/Kconfig» и запустить make scripts в папке /usr/src/linux-headers-4.20.7-sunxi

mkdir -p  /usr/src/linux-headers-4.20.7-sunxi/net/wireguard
touch /usr/src/linux-headers-4.20.7-sunxi/net/wireguard/Kconfig
cd /usr/src/linux-headers-4.20.7-sunxi
make scripts
cd

Использовал драйвер ядра gpio-keys (для кнопки энкодера) и драйвер ядра rotary-encoder,
по умолчанию в armbian, модуль rotary-encoder не установлен.
компилируем и ставим модуль rotary-encoder :

git clone https://github.com/ua3nbw-cf/rotary_encoder.git
cd rotary_encoder
make all install

компилируем и ставим оверлей gpio-rotary.dts:

armbian-add-overlay gpio-rotary.dts
reboot

в файле /boot/armbianEnv.txt появится строка: user_overlays=gpio-rotary
в папке /boot/overlay-user появится файл: gpio-rotary.dtbo
в файле /etc/udev/rules.d/90-devinput-rotary.rules строки:

SUBSYSTEM=="input", MODE="666"
SUBSYSTEMS=="input", ATTRS{name}=="rotary_axis", SYMLINK+="input/rotary_axis"
SUBSYSTEMS=="input", ATTRS{name}=="rotary_button", SYMLINK+="input/rotary_button"

проверка:

dmesg | grep rotary


root@orangepipc:~# dmesg | grep rotary
[ 9.346633] input: rotary_button as /devices/platform/rotary_button/input/input0
[ 9.356333] rotary_encoder: loading out-of-tree module taints kernel.
[ 9.357242] rotary-encoder rotary_axis: gray
[ 9.377227] input: rotary_axis as /devices/platform/rotary_axis/input/input2

cat /sys/kernel/debug/gpio | grep rotary


root@orangepipc:~# cat /sys/kernel/debug/gpio | grep rotary
gpio-200 ( |rotary_axis ) in  hi IRQ ACTIVE LOW
gpio-201 ( |rotary_axis ) in  hi IRQ ACTIVE LOW

ls -la /dev/input | grep rotary


root@orangepipc:~# ls -la /dev/input | grep rotary
lrwxrwxrwx 1 root root 6 Feb 17 15:58 rotary_axis -> event2
lrwxrwxrwx 1 root root 6 Feb 17 15:58 rotary_button -> event0

Тестируем.
энкодер подключаем к контактам 32 («PG8») и 36 («PG9») гребенки, общий вывод к 34 контакту.

evtest  /dev/input/rotary_axis

вращение енкодера по часовой стрелке и против часовой:
вывод команды evtest /dev/input/rotary_axis:

root@orangepipc:~# evtest  /dev/input/rotary_axis
Input driver version is 1.0.1
Input device ID: bus 0x19 vendor 0x0 product 0x0 version 0x0
Input device name: "rotary_axis"
Supported events:
  Event type 0 (EV_SYN)
  Event type 2 (EV_REL)
    Event code 1 (REL_Y)
Properties:
Testing ... (interrupt to exit)
Event: time 1550422364.373974, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1550422364.373974, -------------- SYN_REPORT ------------
Event: time 1550422364.488588, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1550422364.488588, -------------- SYN_REPORT ------------
Event: time 1550422364.651093, type 2 (EV_REL), code 1 (REL_Y), value -1
Event: time 1550422364.651093, -------------- SYN_REPORT ------------
Event: time 1550422365.439925, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1550422365.439925, -------------- SYN_REPORT ------------
Event: time 1550422365.656337, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1550422365.656337, -------------- SYN_REPORT ------------
Event: time 1550422365.727505, type 2 (EV_REL), code 1 (REL_Y), value 1
Event: time 1550422365.727505, -------------- SYN_REPORT ------------

кнопку энкодера подключаем к контактам 7 («PA6») гребенки, и к  9 контакту гребенки.

evtest  /dev/input/rotary_button

вывод команды при нажатии кнопки энкодера:

root@orangepipc:~# evtest  /dev/input/rotary_button
Input driver version is 1.0.1
Input device ID: bus 0x19 vendor 0x1 product 0x1 version 0x100
Input device name: "rotary_button"
Supported events:
  Event type 0 (EV_SYN)
  Event type 1 (EV_KEY)
    Event code 99 (KEY_SYSRQ)
Properties:
Testing ... (interrupt to exit)
Event: time 1550424346.724098, type 1 (EV_KEY), code 99 (KEY_SYSRQ), value 1
Event: time 1550424346.724098, -------------- SYN_REPORT ------------
Event: time 1550424346.912050, type 1 (EV_KEY), code 99 (KEY_SYSRQ), value 0
Event: time 1550424346.912050, -------------- SYN_REPORT ------------

Видим, что все события энкодера генерирует ядро.

 151   7 мес   armbian   GPIO   rotary encoder

Сборка Mesa 3D на Orangepi

mesa — свободная реализация графических API OpenGL и Vulkan с открытым исходным кодом, и других спецификаций, а также набор видеодрайверов пространства пользователя для GPU.

OpenGL driver for ARM Mali400/450
Linux-Lima — ориентирован на поддержку ARM Mali серии 400/500, одной из нескольких попыток реверс-инжиниринга с открытым исходным кодом, которые сейчас применяются к различным поколениям аппаратного обеспечения Mali.
Включен по умолчанию на сборках armbian Next LTS kernel 4.19.y Allwinner A10, A20, A64, H2+, H3, H5, H6 тема на форуме armbian.

lsmod | grep "lima"


lima 40960 0
gpu_sched 20480 1 lima
ttm 57344 1 lima

Mesa, над которым работает Qiang Yu для обеспечения поддержки OpenGL для Mali 400/500 и являющийся реализацией на основе Gallium3D.

Установим зависимости, несколько пакетов можно не устанавливать, но для тестового запуска пусть будут.

apt update
apt list --upgradable
apt install -y pkg-config libwayland-dev wayland-protocols libdrm-dev libgbm-dev libinput-dev libxkbcommon-dev libpixman-1-dev libx11-dev libegl1-mesa-dev gettext libtool libsystemd-dev libcap-dev libxcb-xkb-dev libxcb-composite0-dev  libavutil-dev libghc-xcb-types-dev libpng-dev libavutil-dev  libavcodec-dev libavformat-dev  libvdpau-dev libxvmc-dev  libomxil-bellagio-dev gperf libpcre2-dev libaudit-dev libselinux1-dev libpolkit-gobject-1-dev kexec-tools valgrind docbook-xsl docbook-xml libunwind-dev ninja-build libcairo2-dev libpam0g-dev libpango1.0-dev libgdk-pixbuf2.0-dev xutils-dev python3-mako libva-dev meson llvm-dev libsensors4-dev libpciaccess-dev libxrandr-dev  llvm mesa-utils-extra mesa-utils glmark2 glmark2-drm glmark2-es2 glmark2-es2-drm

git clone https://gitlab.freedesktop.org/lima/mesa
cd mesa
meson build   --prefix=/usr -Dvulkan-drivers=[] -Dplatforms=drm,x11 -Ddri-drivers=[] \
  -Dgallium-drivers=lima,exynos,sun4i,meson,rockchip

ninja -C build install
reboot
DISPLAY=:0 glxinfo | grep OpenGL


OpenGL vendor string: lima
OpenGL renderer string: Mali400
OpenGL version string: 2.1 Mesa 18.3.0 (git-0a153b2aae)
OpenGL shading language version string: 1.20
OpenGL extensions:
OpenGL ES profile version string: OpenGL ES 2.0 Mesa 18.3.0 (git-0a153b2aae)
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 1.0.16
OpenGL ES profile extensions:

 130   8 мес   armbian   mesa   OrangePI PC

Сборка OpenCV 4 на Orangepi

OpenCV — библиотека алгоритмов компьютерного зрения, обработки изображений и численных алгоритмов общего назначения с открытым кодом. Реализована на C/C++

тестировал на Armbian_5.69_Orangepipc_Ubuntu_bionic_next_4.19.13
обновим нашу систему

apt update && apt upgrade

установим зависимости и инструменты разработчика, включая CMake

apt-get install cmake pkg-config libjpeg-dev libpng-dev libtiff-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libgtk-3-dev libcanberra-gtk* libatlas-base-dev gfortran python-pip python3-dev

Ставим виртуальную среду Python 3 для OpenCV 4

wget https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py
pip install virtualenv virtualenvwrapper
rm -rf ~/get-pip.py ~/.cache/pip

в файл ~ / .profile , добавить строки:

# virtualenv and virtualenvwrapper
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source /usr/local/bin/virtualenvwrapper.sh

перезагружаем ~ / .profile

source ~/.profile

Создаём виртуальную среду для  OpenCV 4 и дополнительных пакетов

mkvirtualenv cv -p python3

проверяем , что мы находимся в  среде cv , используя команду workon :

workon cv

ставим NumPy

pip install numpy

1G памяти, маловато для сборки.
увеличим swapfile:

fallocate -l 1G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

загружаем opencv,opencv_contrib и компилируем OpenCV 4

wget -O opencv.tar.gz https://github.com/opencv/opencv/archive/4.0.0.tar.gz
tar -xvzf opencv.tar.gz
mv opencv-4.0.0 opencv

wget -O opencv_contrib.tar.gz https://github.com/opencv/opencv_contrib/archive/4.0.0.tar.gz
tar -xvzf opencv_contrib.tar.gz
mv opencv_contrib-4.0.0 opencv_contrib

cd ~/opencv
mkdir build
cd build

cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
    -D ENABLE_NEON=ON \
    -D ENABLE_VFPV3=ON \
    -D BUILD_TESTS=OFF \
    -D OPENCV_ENABLE_NONFREE=ON \
    -D INSTALL_PYTHON_EXAMPLES=OFF \
    -D BUILD_EXAMPLES=OFF ..

make -j4

make install
ldconfig

обязательна символьная ссылка для виртуальной среды OpenCV 4

cd ~/.virtualenvs/cv/lib/python3.6/site-packages/
ln -s /usr/local/python/cv2/python-3.6/cv2.cpython-36m-arm-linux-gnueabihf.so cv2.so
cd ~

быстрый тест:

workon cv
python
>>> import cv2
>>> cv2.__version__

выведет

’4.0.0’

>>> exit()

Первая команда активирует нашу виртуальную среду. Затем мы запускаем интерпретатор Python, связанный со средой.
Использованы материалы сайта:
pyimagesearch.com.

 141   8 мес   armbian   OpenCV   OrangePI PC
Ранее Ctrl + ↓