Работа с GPIO в Linux на примере Banana Pi BPI-M64. Часть 4. Device Tree overlays. Подключение дисплея SPI LCD ILI9341

В этот раз будем подключать TFT-LCD дисплей на популярном контроллере ILI9341 к одноплатному компьютеру Banana Pi BPI-M64. В сети Интернет много материала как подключать различные LCD экраны к Raspberry Pi. Но что если у вас нет Raspberry Pi, а хочется подключить недорогой LCD экран? Есть решение, подключить с помощью дерева устройств (Device Tree overlays) Linux. Будем подключать недорогой цветной TFT-LCD экран диагональю 2.4 дюйма по SPI интерфейсу к Banana Pi BPI-M64 под ОС Armbian.


Многие одноплатные компьютеры снабжены HDMI выходом, но подключение полноценного дисплея с поддержкой HDMI входа достаточно дорогое удовольствие для небольшого проекта. В особенности, если необходимо  реализовать минимальный функционал взаимодействия с пользователем, терминал распечатки документов, вывод текущего статуса работающего приложения. Для подобных задач можно использовать символьные дисплеи LCD Hitachi HD44780  на интерфейсе I2C, они достаточно дешевы и удобны. Но в тоже время сильно ограничены в функциональности, на эти экраны невозможно вывести консоль Linux и нативный UI приложения, вдобавок площадь LCD экрана нельзя использовать как панель ввода информации. Для решения этих задач прекрасно подойдут LCD экраны на SPI интерфейсе. На LCD экран можно выводить консоль Linux и подсистему Xorg. Таким образом, использование SPI LCD является лучшим вариантом по соотношению функциональности к стоимости.

Оглавление

  1. Постановка задачи
  2. Дисплей ILI9341 2.2 inch 2.2″ SPI TFT
  3. Вариант 1. Схема подключения SPI LCD ILI9341 2.4 inch к Banana Pi BPI-M64 (порт GPIO Raspberry Pi 3) с постоянно включенной подсветкой
  4. Вариант 2. Схема подключения SPI LCD ILI9341 2.4 inch к Banana Pi BPI-M64 (порт GPIO Raspberry Pi 3) с включаемой подсветкой контактом GPIO
  5. Вариант 3. Схема подключения SPI LCD ILI9341 2.4 inch к Banana Pi BPI-M64 (порт GPIO Raspberry Pi 3) с драйвером gpio-backlight
  6. Виртуальное устройство для вывода графики Framebuffer
  7. Настройка графической подсистемы Xorg и графической оболочки Xfce
  8. Литература

Постановка задачи

Подключить модуль SPI TFT LCD ILI9341 SKU:MSP2401 диагональю 2.4 дюйма разрешение 240×320 без резистивного слоя, куплен на Aliexpress за 5.39$ + доставка (продавец ZQC Module Store), к Banana Pi BPI-M64 под ОС Armbian. Требуется версия ядра Linux не ниже 5.4.

Дисплей ILI9341 2.2 inch 2.2″ SPI TFT

Контроллер ILI9341 предназначен для управления TFT панелью. Под контроллер ILI9341 поставляются панели диагональю от 2.2 до 3.2 дюймов, разрешение 240×320, к некоторым LCD добавляют резистивный слой.

Рассмотрим характеристики и распиновку SPI LCD ILI9341 2.4 inch

  • 2,4-дюймовый цветной экран, поддержка 65K цветов (16-bit color)
  • разрешение 320X240
  • интерфейс подключения SPI
  • доступен слот для SD-карты
  • питание модуля 3.3V~5V
  • Напряжение управления логикой 3.3V (TTL)

Контакты подключения LCD

Number Pin Label Description
1 VCC 5V/3.3V power input
2 GND Ground
3 CS LCD chip select signal, low level enable
4 RESET LCD reset signal, low level reset
5 DC/RS LCD register / data selection signal,high level: register, low level: data
6 SDI(MOSI) SPI bus write data signal
7 SCK SPI bus clock signal
8 LED Backlight control, high level lighting,if not controlled, connect 3.3V always bright
9 SDO(MISO) SPI bus read data signal, if you do not need to the read function, you can not connect it

Для управления подсветки используется контакт номер 8 — LED. Максимальное напряжение 3.3V соответствует максимальной яркости от общего питания VCC. Если необходимо задать 50% яркости экрана, то на LED необходимо подать напряжение в 1.65V. Для программного управления яркости подсветки необходимо подключать контакт LED  к аналоговому выходу GPIO на одноплатном компьютере. При наличие только цифровых выходов, доступна лишь возможности включить или полностью выключить подсветку экрана.

Загрузить Datasheet ILI9341 a-Si TFT LCD Single Chip Driver 240RGBx320 Resolution and 262K color Specification Version: V1.11.

Исходя из характеристик LCD экрана предъявляются следующие требования к одноплатному компьютеру:

  • наличие SPI интерфейса
  • напряжение логики на контактах 3.3V (большинство плат)
  • потребуется еще два (RESET, DC/RS) свободных контактов GPIO

Вариант 1. Схема подключения SPI LCD ILI9341 2.4 inch к Banana Pi BPI-M64 (порт GPIO Raspberry Pi 3) с постоянно включенной подсветкой

SPI интерфейс LCD экрана подключаем к SPI1 на Banana Pi BPI-M64. Контакты CS, RESET, DC/RS можно подключать к любым цифровым выводам.

Таблица контактов подключения:

Номер LCD Метка LCD Номер контакта на Banana Pi BPI-M64 (порт GPIO Raspberry Pi 3)
1 VCC 1 или 2 (если необходима максимальная яркость, то контакт №2 на 5V)
2 GND 39, или любой другой Ground
3 CS 24
4 RESET 18
5 DC/RS 22
6 SDI(MOSI) 19
7 SCK 23
8 LED 1 или любой свободный GPIO на 3.3V (через резистор ~ 56 Ом)
9 SDO(MISO) 21

Если контакт LED подключать к цифровому выводу GPIO, то для включения подсветки вручную потребуется подавать логическую «1» — для включения или «0» — для выключения экрана. Подключать контакт LED рекомендуют через резистор номиналом ~ 56 Ом.

Схема подключения контактов:
LCD SPI ILI9341 Banana Pi BPI-M64

SPI интерфейс представлен на 40-контактном разъеме (типа Raspberry Pi 3 GPIO). Для формирования файла DTS необходимо знать название контактов, для этого воспользуемся Wiki-страницей Banana Pi BPI-M64 или Распиновка GPIO для Banana Pi BPI-M64, узнаем название контактов: PD2, PD3, и т.д.

40 PIN GPIO of Banana pi BPI-M64
GPIO Pin Name Default Function Function2:GPIO Function3
CON2-P18 PD4 PD4
CON2-P19 SPI1-MOSI PD2 UART4-TX
CON2-P21 SPI1-MISO PD3 UART4-RX
CON2-P22 PC0 PC0
CON2-P23 SPI1-CLK PD1 UART3-RX
CON2-P24 SPI1-CS PD0 UART3-TX

Файл наложения устройств DTS для SPI LCD ILI9341 2.4 inch

Как формируются файлы наложения устройств (DTS) можно почитать в публикации Работа с GPIO на примере Banana Pi BPI-M64. Часть 2. Device Tree overlays.

В Armbian уже есть драйвер для ILI9341, поэтому все что требуется, это создать файл описания устройства в формате DTS, скомпилировать его в формат DTBO, и перезагрузить одноплатный компьютер.

Драйвера для Linux, в том числе и для ILI9341 располагаются по пути:  /lib/modules/$(uname -r)/kernel/drivers/ . Убедимся в наличие драйвера, командой:

find /lib/modules/$(uname -r)/kernel/drivers/ -iname "*ili9341*"

Результат выполнения:

root@bananapim64:~# find /lib/modules/$(uname -r)/kernel/drivers/ -iname "*ili9341*"
/lib/modules/5.8.6-sunxi64/kernel/drivers/staging/fbtft/fb_ili9341.ko
/lib/modules/5.8.6-sunxi64/kernel/drivers/gpu/drm/tiny/ili9341.ko
root@bananapim64:~#

Из результата видно наличие драйверов fb_ili9341.ko и ili9341.ko, можно продолжать настройку.

Создадим файл DTS с названием: sun50i-a64-spi-ili9341-led-always-on.dts (в основе dts файл для платы Orange Pi PC):

/dts-v1/;
/plugin/;

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

  fragment@0 {
    target = <&pio>;
    __overlay__ {
      ili9341_pins: ili9341_pins {
        pins = "PD4", "PC0"; /*RESET, DC_RS*/
        function = "gpio_out", "gpio_out" ;
      };
    };
  };
  
  fragment@1 {
    target = <&spi1>;
    __overlay__ {
      status = "okay";      
      cs-gpios = <&pio 3 0 0>; /* PD0 */

      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 3 4 1>; /*RESET=PD4*/
        dc-gpios = <&pio 2 0 0>; /*DC_RS=PC0*/
        /*led-gpios = <&pio 2 4 0>; LED=PC4*/
        debug = <0>;
      };
    };
  };
};

Рассмотрим параметры (описание параметров Device Tree — GitHub Wiki notro/fbtft):

  • fragment@0 — является наложением на блок узла /soc/pinctrl@1c20800, ссылка этого узла &pio. Описывает название задействованных контактов GPIO «PD4», «PC0» и определяет функцию gpio_out для контактов.
  • &pio — это ссылка в дереве устройств для контактов GPIO на узел /soc/pinctrl@1c20800, название определяли выше. Ссылка берется из файла в Armbian по пути:  /boot/dtb-5.8.6-sunxi64/allwinner/sun50i-a64-bananapi-m64.dtb . Для компиляции в формат DTS, выполнить команду:  dtc -I dtb -O dts sun50i-a64-bananapi-m64.dtb -o sun50i-a64-bananapi-m64.dts 
  • fragment@1 — является наложением на блок узла /soc/spi@1c69000, ссылка этого узла &spi1.
  • status = «okay» — задействует  SPI1 интерфейс на плате для подключения устройств
  • cs-gpios = <&pio 3 0 0>; /* PD0 */ — номер контакта для CS интерфейса SPI1.
  • <&pio 3 0 0>  — параметры пина, где &pio ссылка на gpioiochip1 в основном дереве устройств, буква P не учитывается, означает PORT, буква D — кодируется в цифру 3 (формула: порядковый номер буквы в алфавите — 1), 0 после цифры 3 это позиция вывода, 0 из PD0, и последний 0 — означает полярность, по умолчанию всегда 0 (полярность  0 — на логический ноль, выдается напряжение 0; полярность 1 — на логический ноль, выдается напряжение 1).
  • compatible = «ilitek,ili9341» — идентификатор драйвера для данного устройства
  • pinctrl-0 = <&ili9341_pins> — ссылка на используемые контакты из fragment@0
  • spi-max-frequency = <16000000> — частота работы SPI интерфейса
  • rotate = <90> — ориентация изображения, поворот на 90 градусов, в зависимости как необходимо расположить дисплей. Возможные значения: 0, 90, 180, 270.
  • bgr — устанавливает бит BGR (поддерживается некоторыми драйверами). Используется для необходимости смены местами красного и синего цвета.
  • fps = <25> — кадров в секунду (значение по умолчанию — 20)
  • reset-gpios = <&pio 3 4 1> — контакт сброса устройства, RESET=PD4
  • dc-gpios = <&pio 2 0 0> — контакт для передачи данных/команд, DC_RS=PC0
  • debug = <0> — Включает/выключает отладку, «0» — отладка выключена, «1»-отладка включена. Сообщения можно посмотреть командой:  dmesg . Установить уровень журналирования, команда: echo «5» > /sys/class/graphics/fb1/debug . Более подробно почитать в Wiki-notro/fbtft Debug.

Разместим файл по пути  /boot/dtb/allwinner/overlay . Затем компилируем файл .dts в .dtbo:

$ dtc -O dtb -o sun50i-a64-spi-ili9341-led-always-on.dtbo sun50i-a64-spi-ili9341-led-always-on.dts

Запустим утилиту конфигурирования платы:  armbian-config . Перейдем по меню: System > Hardware, и включим слой (overlay): spi-ili9341-led-always-on. После перезагрузки платы, консоль Linux будет на SPI LCD экране:

LCD SPI ILI9341 Banana Pi BPI-M64

Midnight Commander и Htop на SPI LCD
Midnight Commander
LCD SPI ILI9341 Banana Pi BPI-M64

Htop
LCD SPI ILI9341 Banana Pi BPI-M64

После перезапуска можно проверить устройство вывода графики, командой  dmesg | grep graphics :

В консоли должна быть следующая информация:

root@bananapim64:~# dmesg | grep graphics
[    6.367060] graphics fb0: fb_ili9341 frame buffer, 320x240, 150 KiB video memory, 16 KiB buffer memory, fps=25, spi0.0 at 16 MHz
root@bananapim64:~#

Решение проблем

1. Если изображение не появилось на LCD, выполните команду для проверки:  dmesg | grep -E ‘ili9341’ .

В консоли должна быть следующая информация:

root@bananapim64:~# dmesg | grep -E 'ili9341'
[    5.733989] fb_ili9341: module is from the staging directory, the quality is unknown, you have been warned.
[    5.734718] fb_ili9341 spi0.0: fbtft_property_value: buswidth = 8
[    5.734731] fb_ili9341 spi0.0: fbtft_property_value: debug = 0
[    5.734737] fb_ili9341 spi0.0: fbtft_property_value: rotate = 90
[    5.734744] fb_ili9341 spi0.0: fbtft_property_value: fps = 25
[    6.119287] graphics fb0: fb_ili9341 frame buffer, 320x240, 150 KiB video memory, 16 KiB buffer memory, fps=25, spi0.0 at 16 MHz

2. В файле DTS (sun50i-a64-spi-ili9341-led-always-on.dts) включить отладку, строку «debug = <0>;» заменить на «debug = <1>;». После перезапуска платы, для просмотра сообщений выполнить команду:  dmesg .

Вариант 2. Схема подключения SPI LCD ILI9341 2.4 inch к Banana Pi BPI-M64 (порт GPIO Raspberry Pi 3) с включаемой подсветкой контактом GPIO

В схеме Вариант 1 управление подсветкой было напрямую подключено к линии питания 3.3V, в результате подсветка всегда работала в независимости от вывода изображения на экран. Для программного управления подсветки необходимо контакт номер 8 — LED на LCD экране подключить к цифровому выходу GPIO на Banana Pi BPI-M64. В данном случае, контакт LED на LCD подключаем к 27-pin (PC4) на 40-контактном разъеме (Raspberry Pi 3).

Таблица контактов подключения (дополнительно к Варианту 1):

Номер LCD Метка LCD Номер контакта на Banana Pi BPI-M64 (порт GPIO Raspberry Pi 3)
8 LED 27 (через резистор ~ 56 Ом)

Подключать контакт LED рекомендуют через резистор номиналом ~ 56 Ом.

Схема подключения контактов:
LCD SPI ILI9341 Banana Pi BPI-M64

SPI интерфейс представлен на 40-контактном разъеме (типа Raspberry Pi 3 GPIO). Для формирования файла DTS необходимо знать название контактов, для этого воспользуемся Wiki-страницей Banana Pi BPI-M64 или Распиновка GPIO для Banana Pi BPI-M64, узнаем название контактов, дополним таблицу 27-pin контактом:

40 PIN GPIO of Banana pi BPI-M64
GPIO Pin Name Default Function Function2:GPIO Function3
CON2-P18 PD4 PD4
CON2-P19 SPI1-MOSI PD2 UART4-TX
CON2-P21 SPI1-MISO PD3 UART4-RX
CON2-P22 PC0 PC0
CON2-P23 SPI1-CLK PD1 UART3-RX
CON2-P24 SPI1-CS PD0 UART3-TX
CON2-P27 PC4 PC4

Файл наложения устройств DTS для SPI LCD ILI9341 2.4 inch

Отличие от Варианта 1 будет заключаться в раскомментирование строки: led-gpios = <&pio 2 4 0>; /*LED=PC4*/

Создадим файл DTS с названием: sun50i-a64-spi-ili9341-main.dts (в основе dts файл для платы Orange Pi PC):

/dts-v1/;
/plugin/;

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

  fragment@0 {
    target = <&pio>;
    __overlay__ {
      ili9341_pins: ili9341_pins {
        pins = "PD4", "PC0"; /*RESET, DC_RS*/
        function = "gpio_out", "gpio_out" ;
      };
    };
  };
  
  fragment@1 {
    target = <&spi1>;
    __overlay__ {
      status = "okay";      
      cs-gpios = <&pio 3 0 0>; /* PD0 */

      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 3 4 1>; /*RESET=PD4*/
        dc-gpios = <&pio 2 0 0>; /*DC_RS=PC0*/
        led-gpios = <&pio 2 4 0>; /*LED=PC4*/
        debug = <0>;
      };
    };
  };
};

Рассмотрим параметры (дополнение к Вариант 1):

  • gpios = <&pio 2 4 0> — контакт для управления подсветкой, LED=PC4

Разместим файл по пути  /boot/dtb/allwinner/overlay . Затем компилируем файл .dts в .dtbo:

$ dtc -O dtb -o sun50i-a64-spi-ili9341-main.dtbo sun50i-a64-spi-ili9341-main.dts

Запустим утилиту конфигурирования платы:  armbian-config . Перейдем по меню: System > Hardware, и включим слой (overlay): spi-ili9341-main. Если до этого выполняли Вариант 1, то предыдущий слой spi-ili9341-led-always-on необходимо выключить. После перезагрузки платы, подсветка LCD экрана включится только во время инициализации и выключится вместе с устройством.

Вариант 3. Схема подключения SPI LCD ILI9341 2.4 inch к Banana Pi BPI-M64 (порт GPIO Raspberry Pi 3) с драйвером gpio-backlight

Реализация схемы Вариант 2 давала возможность задействовать подсветку только во время работы самого дисплея, но невозможно было выключать/включать подсветку во время работы. Для возможности управления подсветкой необходимо в ОС зарегистрировать устройство класса backlight, тогда через стандартные интерфейсы и программы можно управлять подсветкой в интерактивном режиме.

Для реализации подсветки через драйвер  gpio-backlight необходимо LCD дисплей подключить по схеме Вариант 2. Драйвер gpio-backlight будет управлять контактом PC4, тот который был в файле DTS: led-gpios = <&pio 2 4 0>. В данной реализации сможем только включать/выключать подсветку.

Файл наложения устройств DTS для SPI LCD ILI9341 2.4 inch

Создадим файл DTS с названием: sun50i-a64-spi-ili9341-backlight-on-off.dts (в основе dts файл для платы Orange Pi PC):

/dts-v1/;
/plugin/;

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

  fragment@0 {
    target = <&pio>;
    __overlay__ {
      backlight_pin: backlight_pin {
        pins = "PC4"; 
        function = "gpio_out";
      };
    };
  };
  
  fragment@1 {
    target-path = "/";
    __overlay__ {
      backlightlcdtft: backlightlcdtft {
        compatible = "gpio-backlight";
        pinctrl-names = "default";
        pinctrl-0 = <&backlight_pin>;
        gpios = <&pio 2 4 0>; //PIN27 GPIO68 PC4
        default-on;
      };            
    };
  };

  fragment@2 {
    target = <&pio>;
    __overlay__ {
      ili9341_pins: ili9341_pins {
        pins = "PD4", "PC0"; /*RESET, DC_RS*/
        function = "gpio_out", "gpio_out" ;
      };
    };
  };
  
  fragment@3 {
    target = <&spi1>;
    __overlay__ {
      status = "okay";      
      cs-gpios = <&pio 3 0 0>; /* PD0 */

      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 3 4 1>; /*RESET=PD4*/
        dc-gpios = <&pio 2 0 0>; /*DC_RS=PC0*/
        backlight = <&backlightlcdtft>;
        /*led-gpios = <&pio 2 4 0>; LED=PC4*/
        debug = <0>;
      };
    };
  };
};

Рассмотрим параметры (дополнение к Вариант 1):

  • fragment@0, fragment@1 — реализует устройство gpio-backlight.
  • backlight = <&backlight> — ссылка на устройство управления подсветкой.

Разместим файл по пути  /boot/dtb/allwinner/overlay . Затем компилируем файл .dts в .dtbo:

$ dtc -O dtb -o sun50i-a64-spi-ili9341-backlight-on-off.dtbo sun50i-a64-spi-ili9341-backlight-on-off.dts

Запустим утилиту конфигурирования платы:  armbian-config . Перейдем по меню: System > Hardware, и включим слой (overlay): spi-ili9341-backlight-on-off. Если до этого выполняли Вариант 1 или Вариант 2, то предыдущий слой spi-ili9341-led-always-on или sun50i-a64-spi-ili9341-main.dts необходимо выключить. После перезагрузки в системе появится новое устройство класса backlight. По пути  /sys/class/backlight  будет папка backlightlcdtft.

root@bananapim64:~# cd /sys/class/backlight
root@bananapim64:/sys/class/backlight# ls -l
total 0
lrwxrwxrwx 1 root root 0 Mar 21 14:26 backlightlcdtft -> ../../devices/platform/backlightlcdtft/backlight/backlightlcdtft
root@bananapim64:/sys/class/backlight#

Для включения подсветки, необходимо выполнить команду:

echo "1" > /sys/class/backlight/backlightlcdtft/brightness

Для выключения подсветки, необходимо выполнить команду:

echo "0" > /sys/class/backlight/backlightlcdtft/brightness

Решение проблем

1. Если папка по пути  /sys/class/backlight , пустая то выполните команду для проверки:  dmesg | grep -E ‘backlight’ .

В консоли должна быть следующая информация:

root@bananapim64:~# dmesg | grep -E 'backlight'
[    6.015634] fb_ili9341 spi0.0: fbtft_property_value: backlight = 181
root@bananapim64:~#

Виртуальное устройство для вывода графики Framebuffer

Linux предоставляет концепцию framebuffer, виртуального устройства, с которого можно читать и записывать для отображения графики. Содержимое framebuffer обычно отображается на экране. На Banana Pi BPI-M64 выход HDMI соответствует Framebuffer 0, представленному файлом  /dev/fb0 . Если к плате подключена HDMI панель и дисплей SPI LCD, то будет два устройства  /dev/fb0  и  /dev/fb1 , где  /dev/fb0  — HDMI,  /dev/fb1  — SPI LCD. Записывая в файл  /dev/fb0  графические данные, можно отобразить графику на дисплее.

Для просмотра доступных виртуальных устройств Framebuffer, необходимо выполнить команду:

 $ ls -l /dev/fb*

Результат выполнения:

root@bananapim64:~# ls -l /dev/fb*
crw-rw---- 1 root video 29, 0 Mar 21 14:26 /dev/fb0
root@bananapim64:~#

В системе доступно виртуальное устройство framebuffer,  /dev/fb0  которое является отражением SPI LCD  ILI9341 экрана. Выведем изображение и видео на экран SPI LCD  ILI9341 напрямую через устройство  /dev/fb0 . Дополнительная документация по Framebuffer — Framebuffer use GitHub notro/fbtft.

Загрузить на устройство  /dev/fb0 , изображение:

$ sudo apt-get update
$ sudo apt-get -y install fbi
$ mkdir ~/lcdtest
$ cd lcdtest
$ wget https://raw.githubusercontent.com/devdotnetorg/Site/master/Uploads/minion-banana.jpg
$ sudo fbi -d /dev/fb0 -T 1 -noverbose -a minion-banana.jpg

Загрузить на устройство  /dev/fb0 , видео в формате mpg:

$ sudo apt-get update
$ sudo apt-get install -y mplayer
$ wget https://raw.githubusercontent.com/devdotnetorg/Site/master/Uploads/minions-320x180.mpg
$ mplayer -nolirc -vo fbdev2:/dev/fb0 minions-320x180.mpg

Displaying pictures and videos using Framebuffer in Linux on the SPI LCD ILI9341

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

cat /dev/urandom > /dev/fb0

Очистить экран, командой:

cat /dev/zero > /dev/fb0

Как сделать скриншот с устройства Framebuffer

Особенность архитектуры Linux позволяет линейно считывать данные у устройства  /dev/fb0  и сохранять в виде графического файла, в не зависимости от графической оболочки и текущего контекста пользователя. Для создания скриншотов используется программа fbgrab, помимо ее необходимо установить графическую библиотеку  imagemagick  для сжатия картинки в формате PNG. Синтаксис вызова простой:  fbgrab -d /dev/fb0 screenshot.png , где  /dev/fb0  — адрес устройства,  screenshot.png  — название файла.

Установка:

apt-get update
apt-get install -y imagemagick fbgrab

Команда создания скриншота:  fbgrab -d /dev/fb0 screenshot.png 

Результат выполнения команды, скриншот с программой htop:
Framebuffer screenshot

Настройка графической подсистемы Xorg и графической оболочки Xfce

Необходимо установить Xorg и Xfce:

1) Установим Xorg и Xfce:

$ sudo apt-get update
$ sudo apt-get install -y xorg
$ sudo apt-get install -y xfce4

2) Для процессора Allwinner необходимо дополнительно устанавливать GPU драйвер — fbdev:

$ sudo apt-get install -y xserver-xorg-video-fbdev

3) Создать конфигурационный файл по пути  /usr/share/X11/xorg.conf.d/99-fbdev.conf  и разместить в нем следующий фрагмент:

Section "Device"  
  Identifier "myfb"
  Driver "fbdev"
  Option "fbdev" "/dev/fb0"
EndSection

Где /dev/fb0 — устройство SPI LCD.

Если к плате подключена HDMI панель, то будет два устройства  /dev/fb0  и  /dev/fb1 , где  /dev/fb0  — HDMI,  /dev/fb1  — SPI LCD. И строку Option «fbdev» «/dev/fb0» необходимо будет заменить на Option «fbdev» «/dev/fb1».

Запускаем графический интерфейс командой:  startx  или  startxfxe4 :

LCD SPI ILI9341 Banana Pi BPI-M64

Если необходимо при запуске одноплатного компьютера показывать графическое окно для входа логин/пароль, то необходимо дополнительно установить пакеты:

$ sudo apt-get install -y tasksel
$ sudo apt-get install -y xubuntu-desktop

Для возвращения запуска только консоли необходимо отключить автозапуск службы экранного менеджера display-manager.service. :

$ sudo systemctl disable display-manager.service

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

Решение проблем

Если графический интерфейс не запускается то для решение проблем необходимо посмотреть журнал событий Xorg, командой:

$ cat /var/log/Xorg.0.log

Файлы DTS для подключения SPI LCD ILI9341 и другие файлы наложения дерева доступны в каталоге GitHub Banana-Pi-BPI-M64/dt-overlays/

Обновление: 12/04/2021 Добавлен раздел — Как сделать скриншот с устройства Framebuffer и команды заполнения Framebuffer.

Литература

  1. Подключение дисплея по SPI (ili9341) на ядре > 5.4/Orange Pi One и Orange Pi PC/PC Plus — AlexTransit14, Форум PDA
  2. 2.4inch SPI Module ILI9341 SKU:MSP2402 — LCD Wiki
  3. notro/fbtft — GitHub Wiki
  4. SPIdev — SUNXI
  5. Как добавить драйвер устройства SPI, если к устройству уже обращается драйвер «spidev»? — CodeRoad
  6. Инструкция по подключению дисплея на чипе ili9341 320X240 SPI к ORANGE PI ZERO — Comanche_Ak, Форум PDA
  7. Banana Pi BPI-R64 SPI touch panel test with OpenWRT — Forum Banana pi
  8. gpio-backlight bindings — Kernel.org
  9. Generic howto for Allwinner devices — Armbian Documentation
  10. Как в Linux включить автоматических вход в систему — ZaLinux.ru
  11. Writing GUI applications on the Raspberry Pi without a desktop environment — Avik Das [medium.com]

Вам также может понравиться

About the Author: Anton

Programistik