Aplikacje Systemów Wbudowanych Laboratorium Freescale i.mx LiteKit (MC9328MXL) Politechnika Gdańska Wydział Elektroniki, Telekomunikacji i Informatyki Katedra Systemów Geoinformatycznych Gdańsk 2013
Ćwiczenie 1: Środowisko MicroMonitor oraz serwer WWW w systemie Linux dla układów i.mx z procesorem ARM Cel ćwiczenia Celem ćwiczenia jest zapoznanie się z dedykowanym środowiskiem MicroMonitor oraz serwerem WWW w systemie Linux dla układów i.mx z procesorem ARM. Uwaga Przed przystąpieniem do realizacji zadań naleŝy skopiować katalog home (d:\cygwin\) do katalogu roboczego (d:\lab). JeŜeli taki katalog juŝ istnieje (d:\lab\home), naleŝy go skasować. Karty sieciowe komputerów stacjonarnych mają ustawione adresy IP na 192.168.10.10(1-9) w zaleŝności od numeru stanowiska, natomiast maska na 255.255.255.0. Zadania do wykonania Zadanie 1: Zestawienie połączenia pomiędzy układem i.mx, a komputerem stacjonarnym za pomocą interfejsu RS-232. Połączyć układ i.mx z komputerem stacjonarnym za pomocą kabla szeregowego RS-232 Uruchomić Hyper Terminal (menu Start > Wszystkie programy > Akcesoria > Komunikacja > Hyper Terminal). Wprowadzić dowolną nazwę połączenia, uŝywając portu COM4. W ustawieniach portu wprowadzić następujące parametry: o Prędkość transmisji 38400 bps, o Liczba bitów danych: 8, o Parzystość: brak, o Liczba bitów stopu: 1, o Sterowanie przepływem: brak. Prawidłowo zestawione połączenia pomiędzy układem i.mx, a komputerem stacjonarnym zostało przedstawione na rysunku poniŝej.
Po włączeniu zasilania w układzie i.mx zostanie uruchomiony MicroMonitor. Zadanie 2: Konfiguracja karty sieciowej układu i.mx. Zestawić połączenie pomiędzy układem i.mx, a komputerem stacjonarnym za pomocą interfejsu RS-232. Zresetować układ i.mx. Wprowadzić następujący ciąg poleceń w MicroMonitorze (zostaną ustawione: adres IP oraz maska w zaleŝności od numeru stanowiska, adres bramy sieciowej): umon> set c umon> set IPADD 192.168.10.20(1-9) umon> set NETMASK 255.255.255.0 umon> set GIPADD 192.168.10.10(1-9 umon> set -f monrc umon> reset Sprawdzenie ustawień wykonuje się za pomocą komendy set. Zadanie 3: Uruchomienie przykładowego programu na układzie i.mx Uruchomić konsolę Cygwin (pulpit > i.mx GNU X-Tools Shell). Zmodyfikować linię numer 8 pliku Makefile (d:/lab/home/uwindows/src/demos/ elsdemo) wpisując TARGET_IP = 192.168.10.20(1-9). W konsoli Cygwin przejść do lokalizacji d:/lab/home/uwindows/src/demos/ elsdemo. Odłączyć kabel szeregowy RS-232 od układu i podłączyć kabel Ethernetowy. Skompilować przykładowy program i przenieść plik na układ i.mx za pomocą polecenia make mine. Odłączyć kabel Ethernetowy, podłączyć przewód szeregowy RS-232. Zestawić połączenie pomiędzy układem i.mx, a komputerem stacjonarnym za pomocą interfejsu RS-232. Zzresetować układ i.mx. W MicroMonitorze wpisać komendę mine w celu uruchomienia przykładowej aplikacji. Zadanie 4: Polecenia MicroMonitora na przykładzie testów wyświetlacza LCD Zestawić połączenie pomiędzy układem i.mx, a komputerem stacjonarnym za pomocą interfejsu RS-232. Zresetować układ i.mx. Wpisanie polecenia help <nazwa polecenia> uruchomi pomoc do polecenia.
Polecenie tfs ls i tfs vv ls wyświetli wszystkie programy znajdujące się w pamięci układu. Przykłady poleceń testujących wyświetlacz LCD: lcd_tst d4 lcd_tst n Zadanie 5: System Linux dla układu i.mx W pliku Makefile (d:/lab/home/gxlinux/) zmodyfikować linię 44 wpisując TGTIP = 192.168.10.20(1-9). W konsoli Cygwin zbudować przykładowe programy oraz obraz linuxa za pomocą komend: cd d:/lab/home/gxlinux make all Podłączyć kabel Ethernetowy do układu i.mx. Załadować obraz GX-linuxa do układu i.mx za pomocą polecenia make load (kabel RS-232 musi być odłączony). Cała operacja moŝe to potrwać kilka minut. Dzięki temu poleceniu załadują się do układu i.mx następujące obrazy: o zimage (kernel), o romfs.img (główny system plików), o startlinux (skrypt uruchamiający linuxa) Podłączyć przewód RS-232 do układu i.mx i zresetować go. W Hyper Terminalu wpisać polecenie startlinux w celu wywołania jądra linuxa i systemu plików do wykonania. Po załadowaniu linuxa przejść do katalogu /usr/bin (Hyper Terminal). W tym katalogu znajdują się skompilowane przykłady, które naleŝy uruchomić (pliki z rozszerzeniem *.x). Stworzyć własną aplikację w języku C (wg zaleceń prowadzącego) w katalogu d:\lab\home\gxlinux\examples. Skompilować napisany program poleceniem (konsola Cygwin): arm-linux-gcc nazwa_pliku.c o nazwa_pliku_wyjsciowego.x Aby załadować linuxa z nowym programem naleŝy uŝyć następujących poleceń (linux w układzie musi być wyłączony, a kabel RS-232 odłączony): cd.. make install-apps romfs make load Po uruchomieniu linuxa poleceniem startlinux (Hyper Terminal) plik wyjściowy będzie znajdował się w podkatalogu /usr/bin/ Zadanie 6: Uruchomienie serwera WWW na układzie i.mx
Uruchomić konsolę Cygwin, następnie przejść do lokalizacji d:/lab/home/gxlinux/boa/src Wpisać w konsoli Cygwin polecenie./configure --target=arm-linux --build=arm-linux w celu wygenerowanie pliku Makefile. W pliku Makefile zmodyfikować linię 31 wpisując CC= arm-linux-gcc zamiast CC= gcc. Następnie wpisać polecenie make. Powstaną dwa pliki wykonywalne boa i boa_indexer. NaleŜy skopiować je do katalogu d:\lab\gxlinux\rootfs\usr\bin. W konsoli Cygwin w katalogu d:\lab\home\gxlinux\rootfs naleŝy dodać prawo do odczytu i wykonywania katalogowi var/www za pomocą polecenia chmod R +rx var/www. Aby załadować linuxa z serwerem WWW naleŝy uŝyć następujących poleceń: cd.. make romfs make load Po uruchomieniu linuxa poleceniem startlinux (Hyper Terminal) wystarczy wpisać polecenie boa. Serwer WWW będzie od tego momentu pracować w tle. W przeglądarce WWW komputera stacjonarnego wyświetlić stronę internetową udostępnioną przez serwer WWW urządzenia i.mx.
Ćwiczenie 2: Obsługa wyświetlacza LCD oraz panelu dotykowego Cel ćwiczenia Ćwiczenie ma na celu zapoznanie się z obsługą wyświetlacza LCD oraz panelu dotykowego układu i.mx z procesorem ARM. Zadania do wykonania Zadanie 1: Zapoznać się z dostarczonymi przez producenta bibliotekami obsługującymi wyświetlacz LCD Zadanie 2: Napisać program rysujący dowolną figurę na ekranie wyświetlacza LCD (np. kółko). Zadanie 3: Napisać program umoŝliwiający przesuwanie po całym ekranie narysowanej figury z wykorzystaniem panelu dotykowego Informacje potrzebne do realizacji zadania 1. W katalog roboczym w lokalizacji d:/lab/home/umon/umon_apps/lab zmodyfikować plik Makefile podmieniając TGTIP =. na TGTIP = 192.168.10.20(1-9) oraz utworzyć plik lab.c. 2. PoniŜej przedstawiono szablon programu #include "monlib.h" #include "cpu_gpio.h" #include "lcd.h" #include "fb_draw.h" int main() monconnect((int(*)())(*(unsigned long *) MONCOMPTR), (void *) 0, (void *) 0); return 0; 3. Przed narysowaniem figury na wyświetlaczu LCD naleŝy go zainicjalizować. SłuŜy do tego funkcja lcd_init(). Następnie naleŝy włączyć wyświetlacz za pomocą funkcji lcd_on(). Po tych czynnościach moŝna narysować dowolną figurę wykorzystując funkcje z pliku nagłówkowego fb_draw.h. Przykładowo, funkcja z podanymi parametrami fb_draw_circle2(100,100,20,white) wyświetla kółko na pozycji o współrzędnych x=100px, y=100px oraz promieniu 20px i kolorze białym. 4. Aby wykorzystać moŝliwości ekranu dotykowego naleŝy najpierw załączyć plik nagłówkowy ads7846.h. W pliku Makefile w regule lab naleŝy załączyć w regułach kompilacji bibliotekę lads. Po dopisaniu kod reguły lab powinien wyglądać następująco:
5. NaleŜy zainicjalizować panel dotykowy układu za pomocą funkcji ads_init(). Dotknięcie wyświetlacza jest sygnalizowane stanem niskim na linii PIRQ (Port B18). Odczyt odbywa się za pomocą funkcji ads_rd(), która pobiera flagi kontrolne panelu dotykowego. Przykładowe flagi to: ADS7846E_S bit startu, wymagany przy odczycie, ADS7846E_PD_LPWR tryb niskiego poboru mocy, ADS7846E_ADD_DFR_X mierzy pozycję X w trybie róŝnicowym ADS7846E_ADD_DFR_Y mierzy pozycję Y w trybie róŝnicowym 6. PoniŜej przedstawiono przykład kodu realizującego funkcjonalność ekranu dotykowego #include "monlib.h" #include "cpu_gpio.h" #include "lcd.h" #include "fb_draw.h" #include "ads7846.h" #include "vga_lookup.h" #include "cpuio.h" #define PEN_MOVE_FILTER 15 int main() //łączy aplikację z MicroMonitorem, ustawia dowiązania by moŝna było korzystać //z funkcji MicroMonitora monconnect((int(*)())(*(unsigned long *) MONCOMPTR), (void *) 0, (void *) 0); GPIO_init(); //ustawia linię PA3 w tryb wejściowy GPIO_in(3); //inicjalizuje wyświetlacz lcd_init(); //włącza wyświetlacz lcd_on(); //inicjalizuje sterownik panelu dotykowego ads_init(); int x, y; int sum_x, sum_y, i, average_x, average_y, last_x, last_y; //jeŝeli na linii PA3 pojawi się stan niski, to pętla zostanie przerwana //i program się zakończy while (GPIO_tst(3)) if (mon_gotachar()) char c = mon_getchar(); if (c == 'i') //czyszczenie ekranu w przypadku naciśnięcia przycisku i lcd_init(); lcd_on(); //w przypadku naciśnięcia ekranu dotykowego na linii PIRQ wystąpi stan niski if (GPIO_tst(PIRQ) == 0) last_x = last_y = 0; while (GPIO_tst(PIRQ) == 0) sum_x = sum_y = 0; //w celu osiągnięcia większej dokładności pobieramy //czterokrotnie pozycje przyciśnięcia for (i = 0; i < 4; i++)
sum_x += ads_rd(ads7846e_s ADS7846E_PD_LPWR ADS7846E_ADD_DFR_X); sum_y += ads_rd(ads7846e_s ADS7846E_PD_LPWR ADS7846E_ADD_DFR_Y); //wyliczamy średnią z czterech pomiarów average_x = sum_x / 4; average_y = sum_y / 4; //odfiltrowywanie szumów if ((average_x < (last_x + PEN_MOVE_FILTER)) && (average_x > (last_x - PEN_MOVE_FILTER)) && (average_y < (last_y + PEN_MOVE_FILTER)) && (average_y > (last_y - PEN_MOVE_FILTER))) //skalowanie współrzędnych (dla sterownika ekran ma //rozdzielczość 120x120) x = average_x * 2; y = PIXELS_PER_COL - (average_y * 8 / 3.0); return 0; //rysowanie okrąg w punkcie o współrzędnych (x, y), //promieniu 20 i kolorze zielonym fb_draw_circle2(x, y, 20, GREEN); last_x = average_x; last_y = average_y; 7. Skompilować program i przenieść plik na układ i.mx za pomocą polecenia make lab. 8. Podstawowe informacje o ekranie dotykowym. Do obsługi ekranu dotykowego wykorzystuje się bibliotekę ads7846.h. Do uruchomienia wyświetlacza LCD słuŝą funkcje: o void lcd_init(void) - inicjowanie parametrów konfiguracyjnych, o void lcd_on(void) - włączenie wyświetlacza, o void lcd_off(void) - wyłączenie wyświetlacza. Do obsługi wyświetlacza stosuje się bibliotekę fb_draw.h. Są w niej zdefiniowane następujące funkcje: o extern void fb_draw_line2(int x0, int y0, int x1, int y1, uchar color) rysuje linię pomiędzy punktami o współrzędnych (x0, y0) i (x1, y1) w kolorze zdefiniowanym w zmiennej color o extern void fb_draw_circle2(ulong x, ulong y, ulong radius, uchar color) rysuje okrąg, którego środek ma współrzędne (x, y), promień jest równy radius i o kolorze zdefiniowanym przez zmienną color o extern void fb_fill_circle(ulong x, ulong y, ulong radius, uchar color) wypełnia okrąg, którego środek ma współrzędne (x, y), promień jest równy radius w kolorze zdefiniowanym przez zmienną color o extern void fb_print_char(uchar cchar, ulong x, ulong y, uchar color) wyświetla znak graficzny cchar w miejscu o współrzędnych (x, y) i kolorze color
o extern void fb_print_string(uchar *pcbuffer, ulong x, ulong y, uchar color) wyświetla znaki graficzne pcbuffer w miejscu o współrzędnych (x, y) i kolorze color. Parametr x przyjmuje wartości z zakresu od 0 do 240. Parametr y przyjmuje wartości z zakresu od 0 do 320.Parametr color przyjmuje wartości z zakresu od 0 do 15.