Początki z Linuxem

W poprzednim artykule opisałem jak skompilować jądro linuxa oraz pokazałem jak skonfigurować kartę SD na dwie partycje. Pierwsza partycja startowa (z plikami MLO, uImagei u-boot.bin)  oraz druga partycja z dystrybucją Linuxa Angstrom sformatowaną jako ext3. Mając już odpalony system operacyjnym na minikomputerze należałoby zapalić kilka diod z poziomu systemu oraz odpalić jakiś program, który wyświetli komunikat na konsole.

Pierwszą rzeczą jaką zademonstruje jest zapalenie i zgaszenie diody za pomocą konsoli. Aby tego dokonać należy wiedzieć, że w Linuxie wszystko jest zapisane w formie plików, a zapalenie lub zgaszenie diody sprowadza się do prostej operacji zapisu i odczytu pliku.  Nasze diody zapisane są w katalogu /sys/class/leds. W tym katalogu mamy wszystkie nóżki mikrokontrolera skonfigurowane jako diody zapisane w oddzielnych katalogach. W naszym przypadku jest to led1, led2, led3 i ledB. W każdym z tych katalogów jest kilka plików odpowiedzialnych za diody, nas interesuje plik brightness. Aby zapalić diodę numer 2 należy w katalogu led2 zapisać do pliku brgihtness 1 i analogicznie, aby zgasić diodę 2 należy wpisać tam 0. Odpowiednią liczbę 0 lub 1 wstawiamy za pomocą komendy:

echo 1 > /sys/class/leds/led2/brightness

Tak jak to zaprezentowałem na obrazku:

W zestawie devkit8000 dioda led1 ma przypisany wyzwalacz trigger jako hearbeat, czyli po prostu miga w rytmie serca. Gdy wykonamy polecenie echo na diodzie numer 2 powinniśmy uzyskać następujący efekt:

W taki sposób udowodniliśmy, że wszystko (nawet dioda) jest zapisana w systemie jako plik. Należy zadać sobie pytanie skąd system operacyjny wie do jakiej nóżki podłączona jest odpowiednia dioda? Aby odpowiedzieć na to pytanie należy wrócić do momentu kompilacji jądra Linuxa, ponieważ to w tym momencie definiowane są wyprowadzenia nóżek począwszy od diod, a skończywszy na portach szeregowych. My przy kompilacji użyliśmy standardowego pliku konfiguracyjnego dla zestawu devkit8000. Cała konfiguracja płytki Devkit800 jest zapisana w pliku z jądrem linuxa o ścieżce linux-2.6.28-omap/arch/arm/mach-omap2/board-omap3devkit8000.c. To w tym pliku zdefiniowane są wszystkie peryferia. Jeśli chcecie zmienić nazwę lub nóżkę mikrokontrolera dla danej diody, należy w tym pliku zmienić następujący fragment:

static struct gpio_led gpio_leds[] = {
 {
 .name            = "led1",
 .default_trigger    = "heartbeat",
 .gpio            = 186,
 .active_low        = true,
 },
 {
 .name            = "led2",
 .default_trigger    = "mmc0",
 .gpio            = 163,
 .active_low        = true,
 },
 {
 .name            = "ledB",
 .default_trigger    = "none",
 .gpio            = 153, 
 .active_low             = true,
 },
 {
 .name            = "led3",
 .default_trigger    = "none",
 .gpio            = 164,    /* gets replaced */
 .active_low             = true,
 },
};

Analogicznie zmienna .name odpowiada za nazwę katalogu w systemie, .default_trigger odpowiada za wyzwalacz, czyli np. "bicie serca" tak jak w przypadku led1, zmienna .gpio mówi nam o tym do której nóżki mikrokontrolera przylutowana jest dioda, a zmienna .active_low mówi nam o sposobie podłączenia diody, a tym samym o sposobie zapalania diody (albo zapalamy 0, albo 1). W taki sposób poznaliśmy podstawy konfiguracji jądra systemu linux.

Więcej tego typu przykładów można znaleźć na końcu manuala dla zestawu Devkit8000:

http://earlthecamel.com/beagleboard/devkit8000/DevKit8000%20user%20manual_en.pdf