wersja mobilna | kontakt z nami

Jak zastąpić wyświetlacz LCD monitorem HDMI w systemie embedded i.MX6ULL z Linkusem

Numer: Czerwiec/2018

Współcześni klienci przyzwyczajeni do kolorowych interfejsów smartfonów coraz częściej domagają się od producentów systemów embedded, aby nawet najprostsze urządzenia były wyposażone w kolorowy interfejs graficzny. Tego typu rozwiązania najwygodniej jest realizować jest z wykorzystaniem tanich komputerów SOM z procesorami aplikacyjnymi działającymi pod kontrolą systemu Linux. W przypadku niewielkich wolumenów okazuje się, że ceny paneli LCD sprzedawanych jako oddzielne komponenty są znacznie wyższe niż fabryczny monitor z interfejsem HDMI. Istnieją układy SOC, które mają zintegrowany interfejs HDMI, ale są to najczęściej bardzo rozbudowane układy wielordzeniowe, dosyć drogie.

Pobierz PDFMateriały dodatkowe

Najbardziej popularnym interfejsem graficznym w systemach embedded jest równoległy interfejs RGB, do którego możemy dołączać bezpośrednio popularne panele TFT-LCD. Dysponując nawet najprostszym SOC-em istnieje możliwość konwersji sygnału RGB na sygnał HDMI za pomocą specjalnych układów ? nadajników HDMI. W niniejszym artykule na przykładzie komputera VisionSOM (procesor NXP i.MX6ULL) polskiej firmy SoMLabs, pokażemy, w jaki sposób dołączyć monitor HDMI do interfejsu równoległego RGB-LCD.

rys1Interfejs RGB, jest nieskomplikowanym interfejsem cyfrowym służącym do przesyłania obrazu pomiędzy układem graficznym, a wyświetlaczem, który składa się z równoległych linii R, G oraz B (najczęściej 8-bitowych) przesyłających informację o kolorach używając linii CLK, DE oraz sygnałów synchronizacji poziomej HSYNC i pionowej VSYNC (rysunek 1). Typowy sposób dołączenia wyświetlacza LCD-TFT firmy Powertip (SL-TFT7-TP-800-480) do systemu embedded za pomocą interfejsu równoległego pokazano na fotografii 2.

Informację o intensywności świecenia poszczególnych pikseli przesyłane są w takt linii CLK na zboczu narastającym oraz opadającym (DDR). Dodatkowo linie HSYNC oraz VSYNC informują o początku nowej linii oraz początku nowej ramki obrazu. Konwersję sygnału RGB na sygnał HDMI umożliwiają wyspecjalizowane nadajniki HDMI, których bardzo popularnym przedstawicielem jest układ ADV7513 produkowany przez Analog Devices (rysunek 3).

Układ ten umożliwia nadawanie sygnału HDMI o maksymalnej rozdzielczości 1920x1080@60Hz (Full HD), oraz zapewnia wsparcie dla przesyłania dźwięku do monitora z częstotliwością próbkowania do 192kHz. Sygnał video dostarczany jest za pomocą wspomnianego wcześniej interfejsu RGB, natomiast sygnał audio dostarczany jest za pomocą I2S lub SPDIF. Oprócz sygnałów A/V, układ posiada magistralę I2C służącą do konfiguracji parametrów układu, oraz sygnał INT umożliwiający zgłoszenie przerwania np. po włożeniu wtyczki HDMI. Po stronie wyjściowej oprócz różnicowego interfejsu HDMI do dyspozycji mamy kontroler CEC oraz kontroler magistrali I2C umożliwiający odczytanie parametrów EDID monitora. Sposób dołączenia układu ADV7513 do modułu VisionSOM przedstawiono na rysunku 4 (rozwiązanie zastosowane na płytce bazowej VisionCB-IND-HDMI – fotografia 5). Linie RGB, HSYNC, VSYNC, CLK interfejsu równoległego są dołączone bezpośrednio linii IO interfejsu kontrolera LCDIF, linia SPDIF dołączona jest do kontrolera SPDIF, linia INT dołączona jest do dowolnej linii GPIO w tym przypadku UART1-CTS (GPIO1.18) , natomiast linie sterujące I2C dołączono do kontrolera #I2C2.

Sterownik dla systemu Linux

Pomimo iż układ ADV7513 pełni rolę konwertera, do jego prawidłowej pracy potrzebny jest sterownik pracujący w przestrzeni jądra, którego zadaniem jest:

  • odczytanie za pomocą EDID parametrów konfiguracyjnych monitora,
  • wybór odpowiedniej rozdzielczości obrazu wspieranej przez monitor,
  • wysłanie danych konfiguracyjnych do układu nadajnika.

W jądrze mainline począwszy od wersji 4.10 istnieje gotowy sterownik dla podsystemu KMS dla wybranego układu. Niestety sterowniki graficzne dostarczane przez firmę NXP wraz z jądrem dla układu i.MX6ULL nie wykorzystują podsystemu KMS. W związku z tym konieczne stało się opracowanie odrębnego sterownika współpracującego ze sterownikiem mxsfb. Zaprezentowany w artykule sterownik dla uproszczenia umożliwia wyświetlanie obrazu o stałej rozdzielczości, którą możemy konfigurować za pomocą pliku opisu sprzętu Device Tree.

rys4W opisie drivera HDMI mogą występować odwołania do układu ADV7511 firmy Analog Devices. Użyty w VisionCB-IND-HDMI układ ADV7513 jest jedną z jego zgodnych wersji.

Kod źródłowy sterownika znajduje się w pliku adv7511-fbdev.c, natomiast pliki adv7511.h oraz adv7511_default_regs.h zawierają podstawowe stałe oraz tablice konfiguracyjne rejestrów układu. Diagram sekwencji (rysunek 6) przedstawia sposób interakcji podsystemów jądra Linux ze sterownikiem konwertera.

Sterownik rozpoczyna działanie od wywołania funkcji adv7511_probe, która jest wywołana przez podsystem sterowników jądra w momencie odczytania obecności wpisu odnoszącego się ADV7513 w Device Tree. Diagram aktywności dla wspomnianej funkcji przedstawiono na rysunku 7.

Na początku jest konfigurowany kontroler interfejsu I2C, następnie poprzez odczyt rejestru identyfikacyjnego sprawdzamy, czy do wskazanej magistrali dołączony jest układ konwertera. W przypadku niemożności wykrycia układu zgłaszany jest błąd i sterownik kończy działanie. Jeżeli układ zostanie wykryty poprawnie to odczytywane są wszystkie parametry konfiguracyjne z Device Tree, a następnie do rejestrów układu ADV7513 zapisywane są wartości zgodne z wcześniej odczytanymi parametrami, a następnie uruchamiany jest układ nadajnika HDMI.

Po zakończeniu konfiguracji sprzętu, rejestrowany jest callback w podsystemie FB, którego zadaniem jest reagowanie na zdarzenia pochodzące od tego podsystemu. Od tego momentu konwerter jest gotowy do pracy. Funkcja adv7511_fb_event wywoływana jest w reakcji na zdarzenia od podsystemu FB, i wywoływana jest w momencie wystąpienia następujących zdarzeń:

  • FB_EVENT_FB_REGISTERED: Zdarzenie rejestracji, wywoływana jednorazowo przez podsystem podczas inicjalizacji. Tutaj może być wykonana dodatkowa inicjalizacja związana ze sterownikiem,
  • FB_EVENT_MODE_CHANGE: Zmiana parametrów VIDEO bufora FB,
  • FB_EVENT_BLANK: Żądanie wyświetlenia lub wygaszenia wyświetlania obrazu.

Kod funkcji obsługującej zdarzenia od podsystemu FB przedstawiono na listingu 1. Zdarzenie FB_EVENT_FB_REGISTERED dokonuje jednorazowej inicjalizacji sterownika związanej z FB w naszym przypadku przypisujemy jedynie kontekst sterownika do odpowiedniej struktury oraz wyświetlamy logo.

Zdarzenie FB_EVENT_MODE_CHANGE nie jest przez nasz sterownik obsługiwane, ponieważ w podstawowej zapewniamy jedynie wyświetlanie obrazu o ściśle określonej (za pomocą Device Tree) rozdzielczości.

Zdarzenie FB_EVENT_BLANK, obsługiwane jest poprzez włączanie lub wyłączenie wysyłania sygnału HDMI przez układ konwertera.

rys5Kompilacja jądra oraz przygotowanie Device Tree

Przygotowanie toolchaina dla komputera VisionSOM zostało szczegółowo opisane w EP 3/2018, w artykule „Emulator konsoli NES w systemie Linux na komputerze VisionSOM”. Na tej podstawie zakładamy, że użytkownik ma już w pełni działające środowisko. Jeśli dopiero zaczynamy przygodę z VisionSOM należy zapoznać się z wcześniej wspomnianą publikacją.

Po pobraniu pliku archiwum adv7511-fbdev-1.0.tgz należy go rozpakować w katalogu home/developer, a następnie uruchomić środowisko:

sudo ./somlabs-debian/chtoolchain
su - developer
cd source

Następnie należy rozpakować archiwum, oraz skopiować konfigurację jądra z włączonym wsparciem dla sterownika obrazu:

tar xf adv7511-fbdev-1.0.tar.gz
cp adv7511-fbdev-1.0/config_video_hdmi_out kernel/linux rel_imx_4.1.15_2.1.0_ga/.config

W kolejnym kroku należy zaaplikować łatkę na Device Tree włączającą interfejs video oraz dodatkową łatkę zawierającą opis konfiguracji układu ADV7513:

patch -d somlabs-dts-1.0 < adv7511-video/somlabs-visionsom-6ull-fix-dts.patch
patch -d somlabs-dts-1.0 < adv7511-video/somlabs-visionsom-6ull-video.patch

rys6Po zaaplikowaniu łatek dla Device Tree możemy przystąpić do kompilacji nowej wersji jądra. W tym celu przechodzimy do katalogu kernel oraz wydajemy polecenie, którego zadaniem jest skompilowanie jądra:

cd kernel
make deb-pkg -j8 CFLAGS=-fno-pic

Następnym krokiem jest powrót do katalogu ze źródłami oraz skompilowanie pliku opisu sprzętu Device Tree, co realizujemy w następujący sposób:

cd ~/source/somlabs-dts-1.0/
make

Po skompilowaniu Device Tree oraz jądra pozostało nam skompilowanie sterownika obsługującego układ ADV7513:

cd ~/source/adv7511-video
make -j8 CFLAGS=-fno-pic

Mamy w zasadzie wszystko, co jest niezbędne do pracy, musimy jeszcze przygotowane przez nas pliki, wgrać na kartę SD. Przed tą czynnością należy opuścić środowisko chroot, za pomocą polecenia exit, przejść do katalog home/developer, a następnie skopiować nowe jądro, sterownik dla konwertera, oraz plik opisu sprzętu Device Tree na kartę:

cp ~/source/somlabs-dts-1.0/somlabs-visionsom-6ull.dtb <sdcard_path>/boot
mkdir -p <sdcard_path>/lib/modules/4.1.15/kernel/drivers/misc/
cp ~/source/ adv7511-fbdev-1.0/adv7511-fbdev.ko /<sdcard_path>/lib/modules/4.1.15/kernel/drivers/misc/
echo adv7511_fbdev >> <sdcard_path>/etc/modules-load.d/modules.conf
cp source/kernel/linux-image-4.1.15_4.1.15-*_armhf.deb <sdcard_path>/home/developer

rys7Po zainstalowaniu wszystkich potrzebnych plików należy dokonać ostatnich czynności instalacyjno-konfiguracyjnych bezpośrednio na konsoli VisionCB-IND-HDMI. W tym celu płytkę należy podłączyć do sieci za pomocą gniazdka RJ-45, włączyć zasilanie oraz za pomocą konsoli szeregowej RS232 (vCOM) zalogować się do shella. Po zalogowaniu należy zainstalować nową paczkę deb zawierającą jądro:

dpkg -i ~/home/developer/inux-image-4.1.15_4.1.15-*_armhf.deb
depmod -a

Następnie instalujemy wybrane środowisko graficzne. Autor poleca lekkie i konfigurowalne środowisko XFCE:

apt update
apt install xfce4-desktop

Instalacja środowiska graficznego w zależności od szybkości Internetu oraz klasy karty SD może zająć stosunkowo długi czas.

Kolejnym krokiem jest dodanie standardowego użytkownika (nie roota), za pomocą polecenia adduser.

Po wykonaniu powyższych czynności system jest w zasadzie gotowy pracy. Pozostało jedynie dołączenie do złącz USB-A myszki oraz klawiatury, a następnie ponowne uruchomienie systemu (polecenie reboot). Gdy system uruchomi się ponownie na monitorze powinien ukazać się graficzny ekran logowania (fotografia 8). Korzystając z wcześniej utworzonego konta użytkownika możemy zalogować się do pulpitu XFCE.

rys8Lucjan Bryndza, EP
emsyslabs.com
support@emsyslabs.com

Pozostałe artykuły

Budowa projektora DLP z użyciem Raspberry Pi 3 oraz modułu TI LightCrafter Display 2000

Numer: Wrzesień/2018

Już od dobrych kilkunastu lat na rynku komponentów elektronicznych mamy do czynienia z rewolucją w obszarze układów mikroelektromechanicznych (MEMS). Układy te, jeszcze kilka lat temu znane wyłącznie z zastosowań w mikrofonach i czujnikach ciśnienia, dziś są niemal nieodłącznym elementem większości urządzeń mobilnych. Badania prowadzone nad układami MEMS (pod kątem ich miniaturyzacji, nowych obszarów zastosowań i obniżenia kosztów ...

Arduino z RFID

Numer: Wrzesień/2018

Znaczniki RFID to bardzo wygodna technologia do zbliżeniowego sterowania urządzeniami elektronicznymi. Świetnie sprawdzają się w systemach kontroli dostępu, ale mogą mieć i inne zastosowania. Korzystając z gotowych modułów, można ją z łatwością zaimplementować przy użyciu Arduino. W artykule opisano łatwy do wykonanie projekt, który demonstruje, jak połączyć ze sobą Arduino, moduł RFID i miniaturowy wyświetlacz OLED.

Wskaźnik zanieczyszczenia powietrza

Numer: Sierpień/2018

W ostatnim czasie tematyka czystości powietrza nabrała dużego znaczenia. Przyczyną tego był smog, którego doświadczyli mieszkańcy wielu miast. Jednak zanieczyszczenie powietrza to nie tylko smog. Branża elektroniczna wymaga pod tym względem szczególnej uwagi. Hale produkcyjne, stanowiska montażowe, stosowane tam narzędzia oraz chemia powodują powstawanie dymu, oparów i pyłu, które mogą być szkodliwe dla zdrowia. Prezentowane urządzenie ...

Serwer WWW z elementami grafiki 3D (2)

Numer: Sierpień/2018

W drugiej części artykułu kontynuujemy tematykę praktycznego użycia pakietów Node.js oraz Three.js w urządzeniach wbudowanych pracujących pod kontrolą system operacyjnego Linux. Dotychczas zostały omówione zagadnienia instalacji frameworku Node.js, przygotowania prostego serwera WWW z podziałem na funkcje front-end/back-end, komunikacji z wykorzystaniem socket.io, a także tworzenia i odczytu danych z procesów potomnych. W artykule, na ...

Serwer WWW z elementami grafiki 3D (1). Praktyczne wykorzystanie pakietów Node.js oraz Three.js w systemach wbudowanych

Numer: Lipiec/2018

Jedną z niewątpliwych zalet wykorzystania systemu operacyjnego Linux w procesie projektowania urządzeń wbudowanych jest szybki i łatwy dostęp do otwartych, darmowych i wolnych (w sensie wolności) repozytoriów oprogramowania implementujących m.in. rozbudowane stosy graficzne, protokoły sieciowe czy złożone algorytmy obliczeń. Fakt ten odgrywa szczególnie ważną rolę, kiedy zadanie stawiane przed naszym urządzeniem może zostać chociaż ...

Mobilna
Elektronika
Praktyczna

Elektronika Praktyczna

Luty 2019

PrenumerataePrenumerataKup w kiosku wysyłkowym

Elektronika Praktyczna Plus

lipiec - grudzień 2012

Kup w kiosku wysyłkowym