Wymagania
- wyświetlacz oparty na ILI9341
- obsługa Linux Framebuffer drivers for small TFT LCD display modules
- konfiguracja pliku script.bin tak by zapewnić odpowiednie rutowanie połączeń procesora A20 na złącza CN8 CN9 (lub na DVK 570)
- odrobina wytrwałości
Wyświetlacz
Właściwie dowolny z układem ILI9341 będzie działał. Różnice mogą tyczyć się wielkości oraz jak się okazuje szybkością zegara taktującego.... generalnie każdy działa lepiej lub gorzej . Ja zakupiłem taki moduł: 2.4" 240x320 SPI TFT LCD Serial Port Module+3.3V PBC Adapter SD ILI9341 (7$). Świeci przyzwoicie, posiada touch panel, czytnik kart SD:
Uwaga!
TJCTM24024-SPI może być zasilany napięciem 5V ale nie toleruje napięć wyższych niż 3V3 na liniach sterujących!
Obsługa Linux Framebuffer drivers for small TFT LCD display modules
Na początku przygody z ILI9341 chciałem użyć portu biblioteki napisanej w Pythonie dla Raspbery Pi jednak okazało się, że kompilacja py-spi nie przechodzi od strzała i trzeba poświęcić tematowi więcej czasu... Przypomniałem sobie natomiast, że w features kompilacji Igora Pecovnik-a widziałem obsługę małych wyświetlaczy po SPI z wykorzystaniem frame buffer-a! Tak więc z punktu widzenia naszego CT wystarczy załadować odpowiedni moduł z parametrami (o czym później).
Konfiguracja pliku script.bin
W oryginalnym Armbianie obsługa SPI jest wyłączona (tzn. wyłączone jest mapowanie SPI na piny gniazd CN8 i CN9). Aby móc używać SPI musimy zmienić mapowanie w pliku script.bin, który znajduje się w katalogu /boot. Zanim przystąpimy do edycji musimy zamienic binarny plik script.bin na script.fex:
Code: Select all
root@ctdev:~# cd /boot/
root@ctdev:/boot# ls
boot.axf boot.ini linux magic.bin script.bin uEnv.txt uImage
root@ctdev:/boot
root@ctdev:/boot# bin2fex script.bin > script.fex
fexc-bin: script.bin: version: 0.1.2
fexc-bin: script.bin: size: 46744 (83 sections)
root@ctdev:/boot#
Code: Select all
root@ctdev:/boot# vim script.fex
Wprowadzone przeze mnie zmiany zostały wytłuszczone.[spi2_para]
spi_used = 1
spi_cs_bitmap = 1
spi_cs0 = port:PC19<3><default><default><default>
spi_cs1 = port:PB13<2><default><default><default>
spi_sclk = port:PC20<3><default><default><default>
spi_mosi = port:PC21<3><default><default><default>
spi_miso = port:PC22<3><default><default><default>
Następnie znajdź sekcję [gpio_para] i popraw zgodnie ze swoim upodobaniem, tak by odpowiednie sygnały rutowane były na odpowiednie piny:
Ponownie wytłuściłem zmiany istotne dla naszego wyświetlacza. W moim przypadku posłużyłem się trzema pinami portu PG [0:2] gdyż zostały one w cywilizowany sposób wyprowadzone na płytce DVK570. Ty możesz użyć dowolnych, zakończonych na złączach CN8 i CN9 ale nie jest to konieczne. W zrozumieniu powyższego zapoznaj się z poniższym schematem:[gpio_para]
gpio_used = 1
gpio_num = 10
gpio_pin_1 = port:PH20<1><default><default><1>
gpio_pin_2 = port:PH10<0><default><default><0>
gpio_pin_3 = port:PG00<0><default><default><0>
gpio_pin_4 = port:PG01<0><default><default><0>
gpio_pin_5 = port:PG02<0><default><default><0>
gpio_pin_6 = port:PG03<0><default><default><0>
gpio_pin_7 = port:PG04<0><default><default><0>
gpio_pin_8 = port:PG05<0><default><default><0>
gpio_pin_68 = port:PH18<0><default><default><0>
gpio_pin_69 = port:PH24<0><default><default><0>
Następnie zapisz binarną wersję pliku script.bin:
Code: Select all
root@ctdev:/boot# fex2bin script.fex > script.bin
Podłączamy wyświetlacz
Biorąc pod uwagę nasze modyfikacje w mapie połączeń podłączamy nasz wyświetlacz zgodnie z poniższą tabelą:
Code: Select all
[TJCTM24024-SPI ] | [CUBIEBOARD ]
[PIN NAME ] | [PIN NAME ]
----------------------------------------
[J2-1 VCC ] - [CN8-2 3V3 ]
[J2-2 GND ] - [CN8-14 GND ]
[J2-3 CS ] - [CN8-5 PC19 ]
[J2-4 RESET ] - [CN9-6 PG01 ]
[J2-5 D/C ] - [CN9-3 PG00 ]
[J2-6 SDI(MOSI)] - [CN8-6 PC21 ]
[J2-7 SCK ] - [CN8-7 PC20 ]
[J2-8 LED ] - [CN9-5 PG02 ]
[J2-9 SDO(MISO)] - [CN8-8 PC22 ]
[J2-10 T_CLK ] - NC
[J2-11 T_CS ] - NC
[J2-12 T_DIN ] - NC
[J2-13 T_DO ] - NC
[J2-14 T_IRQ ] - NC
Odpalamy wyświetlacz
Do prawidłowej pracy wyświetlacza potrzebujemy załadować odpowiednie moduły:
Code: Select all
modprobe fbtft dma=1
modprobe fbtft_device custom name=fb_ili9341 buswidth=8 \
gpios=reset:4,led:5,dc:3 busnum=2 rotate=180 bgr=1 \
mode=0 speed=64000000 txbuflen=64 fps=25 debug=1
Polecenie dmesg pokaże nam coś w stylu jak poniżej:
Code: Select all
[ 27.853380] wl_bss_connect_done succeeded with 10:bf:48:d3:e8:30
[ 27.884149] wl_bss_connect_done succeeded with 10:bf:48:d3:e8:30
[ 29.533214] fbtft_device: SPI devices registered:
[ 29.542968] fbtft_device: 'fb' Platform devices registered:
[ 29.564692] fbtft_device: GPIOS used by 'fb_ili9341':
[ 29.568029] fbtft_device: 'reset' = GPIO4
[ 29.573259] fb_ili9341 spi2.0: fbtft_request_gpios: 'reset' = GPIO4
[ 29.584267] fbtft_device: 'led' = GPIO5
[ 29.587310] fbtft_device: 'dc' = GPIO3
[ 29.591068] fbtft_device: SPI devices registered:
[ 29.596936] fbtft_device: fb_ili9341 spi2.0 64000kHz 8 bits mode=0x00
[ 29.606279] fb_ili9341 spi2.0: fbtft_request_gpios: 'led' = GPIO5
[ 29.621447] fb_ili9341 spi2.0: fbtft_request_gpios: 'dc' = GPIO3
[ 30.717620] graphics fb2: fb_ili9341 frame buffer, 240x320, 150 KiB video memory, 0 KiB DMA buffer memory, fps=25, spi2.0 at 64 MHz
Code: Select all
root@ctdev:~# con2fbmap 1 2
Teraz bez problemu możemy się logować i obserwować komunikaty na wyświetlaczu... co dalej? X-sy...