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

Wiadomo już zatem, że linie interfejsu DPI kolidują z wyprowadzeniami sprzętowego kontrolera magistrali I2C. Aby jednak zachować możliwość konfiguracji projektora, na niewykorzystanych dotychczas wyprowadzeniach GPIO23 oraz GPIO24 włączymy programowy kontroler interfejsu I2C. Do tego celu wykorzystamy warstwę i2c-gpio, która konfiguruje wskazane wyprowadzenia do pracy w trybie linii SDA oraz SCL, obsługiwanych w sposób czysto programowy. Opcje konfiguracji warstwy i2c-gpio przedstawiono w tabeli 4.

Format zapisu: dtoverlay=i2c-gpio,<parametr>=<wartość>

Parametr

Opis

i2c_gpio_sda Numer wyprowadzenia GPIO dla lini SDA (domyślnie “23”)
i2c_gpio_scl Numer wyprowadzenia GPIO dla lini SCL (domyślnie “24”)
i2c_gpio_delay_us Opóźnienie zegara wyrażone w mikrosekundach (domyślnie “2” =~100kHz)

Tab. 4. Parametry konfiguracji warstwy i2c-gpio

Zgodnie z informacjami przedstawionymi w tabeli 4, do pliku /boot/config.txt dopisujemy zatem kolejną linię konfiguracji:

Zanim przystąpimy do wykonania połączeń sprzętowych, niezbędnym etapem jest konfiguracja parametrów pracy kontrolera DPI. Korzystając z dokumentacji interfejsu DPI, udostępnionej pod adresem:

umożliwiające dołączenie zewnętrznego wyświetlacza do kontrolera DPI, oraz wskazujące, że wyświetlacz ten jest domyślny dla systemu (w przeciwnym razie rolę tę pełni ekran podłączony do interfejsu HDMI). Następnie, do parametrów dpi_group oraz dpi_mode przypisujemy odpowiednio wartości 2 i 87, co pozwoli nam na samodzielną konfigurację parametrów pracy wyświetlacza poprzez pole hdmi_timings (w innych przypadkach, pola dpi_group oraz dpi_mode umożliwiają wybór predefiniowanych konfiguracji):

Przedostatnim krokiem w edycji pliku /boot/config.txt, jest określenie parametrów pracy wyświetlacza/projektora poprzez umieszczenie wpisu hdmi_timings, którego pełny format został przedstawiony w tabeli 5.

hdmi_timings=<parametr1> <parametr2>

<h_active_pixels> Szerokość ekranu wyrażona w pikselach
<h_sync_polarity> Polaryzacja sygnału synchronizacji pionowej
<h_front_porch> Opóźnienie sygnału HSYNC (przed sygnałem DE)
<h_sync_pulse> Szerokość sygnału HSYNC
<h_back_porch> Opóźnienie sygnału HSYNC (po sygnale DE)
<v_active_lines> Wysokość ekranu wyrażona w pikselach
<v_sync_polarity> Polaryzacja sygnału synchronizacji poziomej
<v_front_porch> Opóźnienie sygnału VSYNC (przed sygnałem DE)
<v_sync_pulse> Szerokość sygnału VSYNC
<v_back_porch> Opóźnienie sygnału VSYNC (po sygnale DE)
<v_sync_offset_a> <domyślnie 0>
<v_sync_offset_b> <domyślnie 0>
<pixel_rep> <domyślnie 0>
<frame_rate> Odświeżanie ekranu wyrażone w Hz
<interlaced> <domyślnie 0>
<pixel_freq> Częstotliwość zegara
<aspect_ratio> Proporcje obrazu:

•    HDMI_ASPECT_4_3 = 1

•    HDMI_ASPECT_14_9 = 2

•    HDMI_ASPECT_16_9 = 3

•    HDMI_ASPECT_5_4 = 4

•    HDMI_ASPECT_16_10 = 5

•    HDMI_ASPECT_15_9 = 6

•    HDMI_ASPECT_21_9 = 7

•    HDMI_ASPECT_64_27 = 8

Tab. 5. Parametry konfiguracji wyświetlacza/projektora dla wpisu hdmi_timings

Jednym z najprostszych sposobów ustalenia prawidłowych wartości dla wpisu hdmi_timings – bez potrzeby żmudnego analizowania dokumentacji modułu projektora – jest wykorzystanie gotowego fragmentu opisu Device Tree dla komputera BeagleBone (który w oficjalnych obrazach systemu zawiera wsparcie dla zestawu DLP LightCrafter Display 2000). Fragment opisu Device Tree dotyczący projektora DLP został przedstawiony na listingu 1.

Bazując na danych zawartych na Listingu 1 ,w prosty sposób możemy uzupełnić plik /boot/config.txt o wpis konfigurację hdmi_timings:

Ostatnim krokiem konfiguracji Raspberry Pi jest określenie trybu pracy interfejsu DPI – tryb pracy RGB565/RGB666/RGB888, włączenie/wyłączenie sygnałów polaryzacji pionowej i poziomej, ustalenie polaryzacji sygnałów HSYNC/VSYNC, itd. Konfiguracja ta jest realizowana poprzez zapis do parametru dpi_output_format wartości liczbowej, wyliczonej na podstawie konfiguracji poszczególnych pól bitowych, jak przedstawiono to w tabeli 6.

Parametr dpi_output_format

Bity Funkcja Wartość
0:3 Format wyjściowy

(patrz Tabela 3)

1 = DPI_OUTPUT_FORMAT_9BIT_666

2 = DPI_OUTPUT_FORMAT_16BIT_565_CFG1

3 = DPI_OUTPUT_FORMAT_16BIT_565_CFG2

4 = DPI_OUTPUT_FORMAT_16BIT_565_CFG3

5 = DPI_OUTPUT_FORMAT_18BIT_666_CFG1

6 = DPI_OUTPUT_FORMAT_18BIT_666_CFG2

7 = DPI_OUTPUT_FORMAT_24BIT_888

4:7 Kolejność RGB 1 = DPI_RGB_ORDER_RGB

2 = DPI_RGB_ORDER_BGR

3 = DPI_RGB_ORDER_GRB

4 = DPI_RGB_ORDER_BRG

8 Konfiguracja DE 0 = DPI_OUTPUT_ENABLE_MODE_DATA_VALID

1 = DPI_OUTPUT_ENABLE_MODE_COMBINED_SYNCS

9 Polaryzacja zegara 0 = Zmiana sygnałów RGB na zboczu rosnącym

1 = Zmiana sygnałów RGB na zboczu opadającym

10 Wyłączenie HSYNC 0 = Sygnał włączony

1 = Sygnał wyłączony

11 Wyłączenie VSYNC 0 = Sygnał włączony

1 = Sygnał wyłączony

12 Wyłączenie DE 0 = Sygnał włączony

1 = Sygnał wyłączony

13 Polaryzacja HSYNC 0 = domyślna dla trybu HDMI

1 = odwrócona

14 Polaryzacja VSYNC 0 = domyślna dla trybu HDMI

1 = odwrócona

15 Polaryzacja DE 0 = domyślna dla trybu HDMI

1 = odwrócona

16 Zbocze sygnału HSYNC 0 = DPI_PHASE_POSEDGE

1 = DPI_PHASE_NEGEDGE

17 Zbocze sygnału VSYNC 0 = DPI_PHASE_POSEDGE

1 = DPI_PHASE_NEGEDGE

18 Zbocze sygnału DE 0 = DPI_PHASE_POSEDGE

1 = DPI_PHASE_NEGEDGE

Na podstawie tabeli 6 do pliku /boot/config.txt dopisano konfigurację parametru dpi_output_format, przypisując mu wyliczoną wartość 458773:

Finalna postać pliku /boot/config.txt została przedstawiona na listingu 2.

List. 2. Plik /boot/config.txt z konfiguracją dla modułu LightCrafter Display 2000

Po zakończonej konfiguracji programowej, można przystąpić do wykonania połączeń sprzętowych. Na bazie informacji zawartych na rysunku 3 oraz w tabeli 3 (dla trybu pracy RGB666),wykonujemy zestaw połączeń w sposób przedstawiony na rysunku 4.

Rys. 4. Schemat połączeń pomiędzy Raspberry Pi 3 a modułem LightCrafter Display 2000

Po włączeniu zasilania, moduł projektora wyświetli wyłącznie domyślny ekran startowy (obraz ten może zostać nadpisany grafiką zdefiniowaną przez użytkownika). Aby wyświetlić obraz generowany przez komputer Raspberry Pi, należy nawiązać za pomocą magistrali I2C komunikację z układem kontrolera DLPC2601, a następnie do rejestru 0x0B (rejestr Input Source Selection) wpisać wartość 0, która jako źródło sygnału wybiera interfejs równoległy RGB. Dostępność kontrolera DLPC2601 (o adresie sprzętowym 0x1B) na magistrali I2C możemy sprawdzić poprzez wykonanie skanowania za pomocą narzędzia i2cdetect, np:

Wybór źródła sygnału i ustawienie rozdzielczości wejściowej:

(powyższe komendy można umieścić np. w pliku /etc/rc.local, tak aby wybór źródła sygnału odbywał się automatycznie po włączeniu Raspberry Pi)

Kompletny zbiór rejestrów i komend umożliwiających m.in. skalowanie i obracanie obrazu, wybór źródła sygnału, wyświetlanie obrazów testowych, został kompleksowo opisany w dokumencie DLPC2601 and DLPC2607 Software Programmer’s Guide [2].

Przykład działania modułu DLP LightCrafter Display 2000 podłączonego do komputera jednopłytkowego Raspberry Pi został przedstawiony na filmie:

Łukasz Skalski
contact@lukasz-skalski.com

O autorze

Łukasz Skalski

Łukasz Skalski – absolwent Politechniki Gdańskiej, miłośnik FLOSS,
autor książki “Linux. Podstawy i aplikacje dla systemów embedded” oraz szeregu artykułów dotyczących programowania systemów wbudowanych.
Zawodowo związany z firmą Samsung. Wszystkie wolne chwile poświęca projektowaniu i programowaniu urządzeń wyposażonych w mikroprocesory 8-/16- i 32-bitowe. Szczególnym zainteresowaniem obejmuje tematykę systemu Linux w aplikacjach na urządzenia embedded.