Projektor DLP z wykorzystaniem Raspberry Pi 3 oraz modułu TI LightCrafter Display 2000
Raspberry Pi – interfejs I2C
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:
dtoverlay=i2c-gpio,i2c_gpio_sda=23,i2c_gpio_scl=24,i2c_gpio_delay_us=2
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:
enable_dpi_lcd=1 display_default_lcd=1
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. Pozwoli nam to 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:
dpi_group=2 dpi_mode=87
Parametryzacja projektora
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 jest wykorzystanie gotowego fragmentu opisu Device Tree dla komputera BeagleBone. 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.
display-timings { native-mode = <&timing0>; timing0: 864x480 { clock-frequency = <26000000>; hactive = <640>; vactive = <480>; hfront-porch = <14>; hback-porch = 12>; hsync-len = <4>; vback-porch = <9>; vfront-porch = <2>; vsync-len = <3>; hsync-active = <0>; vsync-active = <0>; }; };
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:
hdmi_timings=640 0 14 4 12 360 0 2 3 9 0 0 0 60 0 32000000 3
Raspberry Pi – konfiguracja interfejsu DPI
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. 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:
dpi_output_format=458773
Finalna postać pliku /boot/config.txt została przedstawiona na listingu 2.
# uncomment this if your display has a black border of unused pixels visible # and your display can output without overscan disable_overscan=1 # Enable audio (loads snd_bcm2835) dtparam=audio=on # Add support for software i2c on gpio pins dtoverlay=i2c-gpio,i2c_gpio_sda=23,i2c_gpio_scl=24,i2c_gpio_delay_us=2 # DPI Video Setup dtoverlay=dpi18 overscan_left=0 overscan_right=0 overscan_top=0 overscan_bottom=0 framebuffer_width=640 framebuffer_height=360 enable_dpi_lcd=1 display_default_lcd=1 dpi_group=2 dpi_mode=87 dpi_output_format=458773 hdmi_timings=640 0 14 4 12 360 0 2 3 9 0 0 0 60 0 32000000 3
List. 2. Plik /boot/config.txt z konfiguracją dla modułu LightCrafter Display 2000
Połączenia
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. 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:
~# i2cdetect -y 0 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- 1b -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
Wybór źródła sygnału i ustawienie rozdzielczości wejściowej:
i2cset -y 0 0x1b 0x0b 0x00 0x00 0x00 0x00 i i2cset -y 0 0x1b 0x0c 0x00 0x00 0x00 0x07 i
(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