Page 1 of 1

Wyświetlacz TFT 2,4" (TJCTM24024-SPI) na układzie ILI9341 i Cubietruck, cz. 1

Posted: 21 February 2017, 23:12 - Tue
by bbiernat
W internecie można znaleźć wiele artykułów o tym jak podłączyć wyświetlacze oparte na układzie ILI9341 (lub klonach) do Raspberry Pi. Trudno natomiast namierzyć kompletny opis jak zrobić to z wykorzystaniem Cubietruck czy Cubieboard. Dzisiejszy tutorial jest próbą wypełnienia tej luki...
TJCTM24024-SPI
TJCTM24024-SPI
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:
TJTCM24024-SPI-CT.jpg
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# 
Otwórz plik script.fex np w vim:

Code: Select all

root@ctdev:/boot# vim script.fex 
Znajdz sekcję [spi2_para] i popraw zgodnie z poniższym przykładem:

[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>
Wprowadzone przeze mnie zmiany zostały wytłuszczone.

Następnie znajdź sekcję [gpio_para] i popraw zgodnie ze swoim upodobaniem, tak by odpowiednie sygnały rutowane były na odpowiednie piny:
[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>
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:
Mapowanie portów na piny w CT (DVK570)
Mapowanie portów na piny w CT (DVK570)
Następnie zapisz binarną wersję pliku script.bin:

Code: Select all

root@ctdev:/boot# fex2bin script.fex > script.bin
Teraz po reboocie A20 będzie korzystał z nowej mapy połączeń...

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
W moim przypadku sterowanie LED okazało się niewystarczające (jeśli chcesz sterować podświetleniem - należałoby zastosować wtórnik, gdyż poziom sygnału linii PG02 jest bardzo niski) - zrezygnowałem z podłączenia linii J2-8(LED) do CN9-5(PG02) i podpiąłem ją bezpośrednio do 3V3.

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

Po udanych testach proponuję wrzucić powyższe np do pliku /etc/rc.local celem automatycznego ładowania modułu po starcie CT. Ostateczny test pozwoli na "wyplucie" komunikatów konsoli na wyświetlacz:

Code: Select all

root@ctdev:~# con2fbmap 1 2

TJTCM24024-SPI-CT_console.jpg
Teraz bez problemu możemy się logować i obserwować komunikaty na wyświetlaczu... co dalej? X-sy... :-)