A postagem contém instruções sobre como conectar um display TFT-LCD no popular controlador ILI9341 a um computador de placa única baseado no sistema operacional Armbian usando sobreposições de Device Tree sem dançar com um pandeiro. Há muito material na Internet sobre como conectar várias telas de LCD ao Raspberry Pi. Mas e se você não tiver um Raspberry Pi e quiser conectar uma tela LCD barata à interface SPI? Tudo que você precisa é uma placa habilitada para Armbian. O catálogo de placas suportadas pelo Armbian OS inclui placas: Asus, Pine64, Hardkernel, Orange Pi, Banana Pi, etc. No momento, o catálogo contém mais de 114 modelos de placas, é anunciado suporte para diversos equipamentos fora da caixa. Disponível para conexão: modems 4G / LTE, USB Wi-Fi, USB Bluetooth, USB Ethernet, scanners sintonizadores DVB, etc. Todas essas placas podem ser facilmente conectadas ao display SPI LCD ILI9341,Eu pergunto como implementar isso em cat.
Muitos computadores de placa única têm uma saída HDMI, mas conectar um monitor completo com entrada HDMI é caro o suficiente para um projeto pequeno. Em particular, se for necessário implementar a funcionalidade mínima de interação com o usuário, um terminal para impressão de documentos, exibindo o estado atual de uma aplicação em execução. Para tais tarefas, você pode usar monitores de caracteres LCD HD44780 na interface I2C, eles são bastante baratos e convenientes. Mas ao mesmo tempo, eles são muito limitados em funcionalidade, é impossível exibir o console do Linux e a IU nativa do aplicativo nessas telas, além disso, a área da tela LCD não pode ser usada como um painel de entrada de informações. Telas de LCD na interface SPI são perfeitas para resolver esses problemas, uma tela de 3,5 polegadas com uma camada resistiva pode ser adquirida por $ 9,57 (incluindo frete).A tela LCD pode exibir o console Linux e o subsistema X11. Assim, o uso do SPI LCD é a melhor opção em termos de funcionalidade para custo.
Exibir ILI9341 2,2 polegadas e 2,2 "SPI TFT
O controlador ILI9341 é projetado para controlar o painel TFT. Para o controlador ILI9341, são fornecidos painéis com uma diagonal de 2,2 a 3,2 polegadas, uma resolução de 240x320 e uma camada resistiva é adicionada a alguns LCDs.
Iremos conectar um módulo SPI LCD ILI9341 de 2,4 polegadas sem uma camada resistiva a um computador de placa única Banana Pi BPI-M64.
Considere as características e pinagem do SPI LCD ILI9341 2,4 polegadas
- Tela colorida de 2,4 polegadas, compatível com 65 mil cores
- Resolução 320X240
- Interface de conexão SPI
- Slot para cartão SD disponível
- fonte de alimentação do módulo 3,3 V ~ 5 V
- Tensão de controle lógico 3,3 V (TTL)
Pinos de conexão LCD
| Número | Rótulo de pin | Descrição |
| 1 | VCC | Entrada de energia 5V / 3,3V |
| 2 | GND | Terra |
| 3 | CS | Sinal de seleção de chip LCD, habilitar nível baixo |
| quatro | REDEFINIR | Sinal de reinicialização do LCD, reinicialização de baixo nível |
| cinco | 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 |
Para controlar a luz de fundo, o número de contato 8 - LED é usado . A tensão máxima de 3,3 V corresponde ao brilho máximo do fornecimento VCC total. Se for necessário ajustar o brilho da tela para 50%, então a tensão de 1,65 V deve ser aplicada ao LED. Para controlar programaticamente o brilho da luz de fundo, o pino do LED deve ser conectado à saída analógica GPIO no computador de placa única. Se apenas saídas digitais estiverem disponíveis, apenas a opção de ligar ou desligar completamente a luz de fundo da tela estará disponível.
Com base nas características da tela LCD, os seguintes requisitos são impostos a um computador de placa única:
- disponibilidade de interface SPI
- tensão lógica nos pinos 3,3 V (maioria das placas)
- você precisará de mais dois (RESET, DC / RS) pinos GPIO livres
Que tipo de besta armiana você é e que tipo de computador de placa única você precisa
A página armbian.com/download contém uma grande variedade de computadores de placa única. Do ponto de vista da facilidade de conexão, é melhor escolher uma placa com um conector GPIO de 40 pinos compatível com Raspberry Pi 3. Por exemplo, se você conectar o SPI LCD ILI9341 2,4 polegadas à placa Banana Pi BPI-M64 e Orange Pi PC, então os números dos pinos GPIO fisicamente conectados serão os mesmos (não deve ser confundido com os nomes dos contatos do processador, eles serão diferentes, necessários posteriormente para a configuração). Se o computador de placa única não for construído no processador Allwinner, você pode precisar alterar mais parâmetros no arquivo: sun50i-a64-spi-ili9341-led-always-on.dts (será mais adiante no texto).
ArmênioÉ a distribuição Linux mais popular para computadores de placa única baseados no processador ARM, a lista de placas suportadas é enorme: Orange Pi, Banana Pi, Odroid, Olimex, Cubieboard, Roseapple Pi, Pine64, NanoPi, etc. A distribuição Armbain é baseada no Debian e Ubuntu.
Após o surgimento do Raspberry Pi para o mundo, os fabricantes chineses decidiram também aderir ao movimento Open Hardware Source, e fizeram várias placas diferentes. Mas o suporte do software era extremamente fraco, o projeto Armbian nasceu para resolver este problema. Neste momento, a Armbian já tem 7 anos, são suportados 114 modelos de placas, foi anunciado o suporte para vários equipamentos fora da caixa. Disponível para conexão: modems 4G / LTE, USB Wi-Fi, USB Bluetooth, USB Ethernet, scanners sintonizadores DVB, etc.
Para executar o Armbian em um computador de placa única, você precisa baixar uma imagem do site e copiá-la para um cartão microSD, de onde será necessário inicializar posteriormente. Se a placa tiver memória eMMC suficiente, por meio do utilitário armbian-config, o sistema operacional pode ser facilmente transferido do cartão microSD para a memória eMMC junto com o bootloader.
Criar um projeto IoT usando o Armbian, em contraste com o Raspberry Pi, permite que você escolha placas que diferem em desempenho e um conjunto de periféricos. Por exemplo, todas as versões do Raspberry Pi têm apenas uma porta Ethernet. Mas se você precisar fazer um roteador com várias portas Ethernet, da lista de placas Armbian suportadas, os modelos são adequados: Helios64, Espressobin, Bananapi R2, etc.
SoC Suportado
- Allwinner A10, A20, A31, H2 +, H3, H5, H6, A64
- Amlogic S805 e S905 (placas Odroid), S802 / S812, S805, S905, S905X e S912 (bifurcação por @ balbes150)
- Actionsemi S500
- Freescale / NXP iMx6
- Marvell Armada A380
- Rockchip RK3288 / RK3328 / RK3399
- Samsung Exynos 5422
Diagrama de fiação SPI LCD ILI9341 2,4 polegadas para Banana Pi BPI-M64 (porta Raspberry Pi 3 GPIO)
A interface SPI da tela LCD é conectada ao SPI1 no Banana Pi BPI-M64. Os contatos CS, RESET, DC / RS podem ser conectados a qualquer pino digital.
Tabela de pinos de conexão:
| Número LCD | Etiqueta LCD | Número do PIN em Banana Pi BPI-M64 (porta Raspberry Pi 3 GPIO) |
| 1 | VCC | 1 ou 2 (se você precisar de brilho máximo, entre em contato com o No. 2 em 5V) |
| 2 | GND | 39, ou qualquer outro terreno |
| 3 | CS | 24 |
| quatro | REDEFINIR | dezoito |
| cinco | DC / RS | 22 |
| 6 | SDI (MOSI) | 19 |
| 7 | SCK | 23 |
| 8 | LIDERADO | 1 ou qualquer GPIO grátis em 3,3 V |
| 9 | SDO (MISO) | 21 |
Se o pino do LED estiver conectado à saída digital GPIO, para ligar manualmente a luz de fundo, você precisará fornecer um "1" lógico - para ligar ou "0" - para desligar a tela.
Diagrama de conexão SPI LCD ILI9341:
Computador de placa única Banana Pi BPI-M64
Banana Pi BPI-M64 é um mini computador de placa única quad-core de 64 bits fornecido como uma solução de código aberto. O núcleo do sistema é um processador Allwinner A64 com 4 núcleos Cortex-A53 com uma frequência de 1,2 GHz. A placa abriga 2 GB DDR3 SDRAM 733 MHz de RAM e 8 GB eMMC.
O mais importante para uma conexão SPI LCD bem-sucedida é saber o nome dos contatos da interface SPI, seu número e nome dependem do modelo do processador. A folha de dados Allwinner A64 é necessária para esta tarefa. A página Wiki Banana Pi BPI-M64 mostra a pinagem do conector GPIO de 40 pinos, a partir do qual aprendemos o nome dos pinos: PD2, PD3, etc.
| 40 PIN GPIO de Banana pi BPI-M64 | |||
| Nome do PIN GPIO | Função Padrão | Função 2: GPIO | Função 3 |
| 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 |
Além do nome do contato, é necessário descobrir o número de série deste contato na perna do processador, é facilmente calculado pela fórmula: (posição da letra no alfabeto - 1) * 32 + posição de saída . Vamos calcular o número da perna para o pino PD2. A primeira letra não é contada porque P - PORTA, posição da letra D no alfabeto = 4, obtemos (4-1) * 32 + 2 = 98. O contato com a etiqueta PD2 corresponde ao pé 98 do processador, então será necessário para configurar a árvore de dispositivos.
Árvore de dispositivos (DT) no Linux
Uma árvore de dispositivos (DT) é uma estrutura de dados do Linux que consiste em nós nomeados e propriedades que descrevem o hardware que não pode ser descoberto por meio de polling do hardware. A árvore deve incluir o nome do processador central, sua configuração de memória e quaisquer periféricos (internos e externos). DT não é usado para descrever software, embora a listagem de módulos de hardware faça com que os módulos de driver sejam carregados.
O coração de qualquer placa de desenvolvimento ou computador de placa única é o SoC. O SoC tem muitos pinos (pernas) para conectar linhas de energia e vários dispositivos.
Os pinos podem ser ligados entre si para formar uma interface como MIPI DSI (MIPI Display Serial Interface). A interface MIPI DSI foi projetada para conectar painéis LCD, ela é usada ativamente em smartphones e tablets. Mas se você não planeja conectar um monitor ao dispositivo via MIPI DSI, essas linhas podem ser usadas para outros fins, alterando o DT. Ao contrário da arquitetura x86, os sistemas baseados em SoC não têm a capacidade de identificar totalmente todos os dispositivos no modo Plug and Play. Portanto, é necessário declarar explicitamente quais pinos são usados para interfaces e quais dispositivos estão conectados a essas interfaces.
Antes do advento da DT, as informações do dispositivo no Linux eram parte integrante do kernel e, no caso de uma alteração na composição dos dispositivos periféricos, era necessário reconstruir a imagem do sistema. Isso era extremamente inconveniente e, portanto, a descrição dos dispositivos periféricos foi movida para os arquivos de configuração que são coletados no nível lógico em uma árvore. Onde branch é um dispositivo com uma indicação do driver necessário para a operação deste dispositivo.
Depois de usar o DT, não houve necessidade de criar uma imagem individual para cada conjunto de dispositivos periféricos. Agora basta criar uma imagem, incluir um conjunto de drivers para vários dispositivos e criar seu próprio DT para cada dispositivo.
Sobreposições de árvore de dispositivo
Sobreposições da árvore de dispositivos - Adicione o princípio de camadas de dispositivos sobrepostas ao DT. Se a configuração descreve a interface UART à qual o Bluetooth foi conectado e você precisa substituir o Bluetooth por um módulo GPS, não será possível excluir as configurações Bluetooth existentes, mas adicionar uma camada adicional para o módulo GPS que substituirá as configurações anteriores.
Os seguintes termos são usados para trabalhar com o DT:
| DT | Árvore de dispositivos |
| DTB (* .dtb) | Arquivo binário da árvore do dispositivo |
| DTBO (* .dtbo) | Binário da árvore de dispositivos para sobreposição |
| DTC | Compilador de árvore de dispositivo |
| DTO | Sobreposições de árvore de dispositivo |
| DTS (* .dts) | Arquivo fonte para a árvore do dispositivo |
| FDT | Árvore de dispositivos achatada, formato binário contido em um arquivo .dtb |
A configuração do hardware é descrita nos arquivos de origem da TD (.dts) e depois são compilados nos binários da TD (.dtb) para uso final no sistema. Você também pode realizar o procedimento inverso para descompilar *. dtb para *. dts, um compilador / descompilador está presente no sistema. A implementação de DTO inclui divisão, construção, particionamento e execução da árvore de dispositivos.
Compartilhamento de DT
DT é dividido em duas partes:
- DT principal (árvore principal do dispositivo) . Fornecido pelo desenvolvedor SoC e é a configuração padrão. Neste caso, Allwinner é fornecido pelo desenvolvedor do processador Allwinner A64.
- Overlay DT (Overlay device tree) . A configuração específica do fabricante da placa inclui os periféricos que estão localizados na placa. A placa Banana Pi BPI-M64 é fornecida pela SinoVoip Co.,
O tópico de sobreposições de árvore de dispositivos no Linux é grande o suficiente para não transformar a postagem em um trabalho de vários volumes de Lenin, você pode ler mais detalhes na publicação Working with GPIO using the example of Banana Pi BPI-M64. Parte 2. Sobreposições da árvore de dispositivos.
Modelagem DTS para SPI LCD ILI9341 2,4 polegadas
O teste foi realizado na imagem Armbian_20.08.2_Bananapim64_bionic_current_5.8.6_minimal.img.xz , com base no Ubuntu 18.04.5 LTS (Bionic Beaver), kernel Linux 5.8.6. uname: Linux bananapim64 5.8.6-sunxi64 # 20.08.2 SMP Sex 4 de setembro 08:52:31 CEST 2020 aarch64 aarch64 aarch64 GNU / Linux.
Armbian já tem um driver para ILI9341, então tudo o que é necessário é criar um arquivo de descrição de dispositivo DTS, compilá-lo para o formato DTBO e reiniciar o SBC. Como diz o ditado Fácil!
Para gerar um arquivo DTS, você precisa descobrir o link para o gpiochip no qual a interface SPI está localizada, para fazer isso, abra o terminal Armbian e execute o comando cat / sys / kernel / debug / gpio:
root@bananapim64:~# cat /sys/kernel/debug/gpio
gpiochip1: GPIOs 0-255, parent: platform/1c20800.pinctrl, 1c20800.pinctrl:
gpio-120 ( |bananapi-m64:red:pwr) out hi
gpio-142 ( |bananapi-m64:green:u) out lo
gpio-143 ( |bananapi-m64:blue:us) out lo
gpio-166 ( |cd ) in lo ACTIVE LOW
gpio-233 ( |usb0_id_det ) in hi IRQ
gpiochip0: GPIOs 352-383, parent: platform/1f02c00.pinctrl, 1f02c00.pinctrl:
gpio-354 ( |reset ) out hi ACTIVE LOW
gpio-356 ( |shutdown ) out hi
gpio-357 ( |host-wakeup ) in lo
gpio-358 ( |device-wakeup ) out hi
gpiochip2: GPIOs 510-511, parent: platform/axp20x-gpio, axp20x-gpio, can sleep:
Este comando listará todos os dispositivos gpiochip disponíveis e os números de pinos afetados no sistema operacional. Na seção anterior, para o pino SPI1-MOSI , o nome do pino PD2, o número da perna do processador foi determinado - 98. Com base no resultado obtido, o número 98 cai no intervalo GPIOs 0-255, que corresponde ao chip gpiochip1: GPIOs 0-255, pai: plataforma / 1c20800. pinctrl, 1c20800.pinctrl . Além disso, para gerar um arquivo DTS, você precisa descobrir o link para 1c20800.pinctrl .
Vamos criar um arquivo DTS com o nome: sun50i-a64-spi-ili9341-led-always-on.dts (com base no arquivo dts para a placa PC Orange Pi):
/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>;
};
};
};
};
Considere o conteúdo:
- 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> - frequência da interface SPI
- rotate = <90> - orientação da imagem, rotação de 90 graus, dependendo de como você deseja posicionar a tela.
- fps = <25> - quadros por segundo
- reset-gpios = <& pio 3 4 1> - RESET pin = PD4
- dc-gpios = <& pio 2 0 0> - DC_RS pin = PC0
Vamos colocar o arquivo no caminho / boot / dtb / allwinner / overlay. Em seguida, compila o arquivo .dts para .dtbo:
$ dtc -O dtb -o sun50i-a64-spi-ili9341-led-always-on.dtbo sun50i-a64-spi-ili9341-led-always-on.dts
Vamos iniciar o utilitário de configuração da placa: $ armbian-config. Acesse o menu: Sistema> Hardware e ative a camada (sobreposição): spi-ili9341-led-always-on . Após reiniciar a placa, o console do Linux estará na tela LCD do SPI:
Nome do contato
Para todos os processadores Allwinner, o formato de gravação do contato corresponde ao formato cs-gpios = <& pio 3 0 0> , para outros processadores, o formato da gravação do contato será diferente.
Solução de problemas
Se a imagem não aparecer no LCD, execute o comando para verificar: $ dmesg | grep -E 'ili9341'.
O console deve conter as seguintes informações:
root@bananapim64:/boot/dtb-5.8.6-sunxi64/allwinner# 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
Configurando SPI LCD para Xfce GUI e subsistema X11
Para a saída do console Linux é suficiente adicionar um arquivo DTS e pronto, mas para a saída gráfica não é suficiente.
1) Instale o XORG e o XFCE:
$ sudo apt-get update $ sudo apt-get install xorg $ sudo apt-get install xfce4
2) Para o processador Allwinner, você deve instalar adicionalmente o driver GPU - fbdev:
$ sudo apt-get install xserver-xorg-video-fbdev
3) Exclua todos os arquivos de configuração no caminho /etc/X11/xorg.conf.d (se não houver arquivos, ótimo)
4) Crie um arquivo de configuração no caminho /usr/share/X11/xorg.conf.d / 99-fbdev. Conf e coloque o seguinte snippet nele:
Section "Device"
Identifier "myfb"
Driver "fbdev"
Option "fbdev" "/dev/fb0"
EndSection
Onde / dev / fb0 é o dispositivo LCD SPI. Se um painel HDMI estiver conectado à placa, pode haver dois dispositivos / dev / fb0 e / dev / fb1.
Iniciamos a interface gráfica com o comando: startx ou startxfe4:
Se você precisar ir diretamente para a interface gráfica, deverá instalar adicionalmente os pacotes:
$ sudo apt-get remove tasksel $ sudo apt-get remove xubuntu-desktop
Para retornar apenas a inicialização do console, você deve desativar a inicialização automática do serviço display-manager.service
$ sudo systemctl disable display-manager.service
Solução de problemas
Se a interface gráfica não iniciar, para resolver os problemas, você precisa olhar o log de eventos do X11 usando o comando:
$ cat /var/log/Xorg.0.log
Resultado
A instalação e configuração do SPI LCD não requer nenhuma compilação de módulos da fonte, o que simplifica muito a instalação. O principal é expor cuidadosamente os contatos e tudo funcionará fora da caixa. Os objetivos definidos foram alcançados com sucesso.
Roteiro
- Conectando um display maior de 3,5 '' no controlador ILI9488.
- Configurando a interface Touch para Xfe.
- Exibindo apenas um aplicativo gráfico no SPI LCD usando subsistema X11 do contêiner Docker (solução para terminais públicos, quiosques, terminais POS).
O arquivo sun50i-a64-spi-ili9341- led-always-on.dts e outros arquivos de sobreposição de madeira estão disponíveis no catálogo GitHub Banana-Pi-BPI-M64 / dt-overlays /

