vmplayer i linux 3.12

Instalacja vmware-player w wersji 6 w systemie z kernelem w wersji 3.11 lub 3.12 powoduje następujący błąd w trakcie kompilacji modułów kernela:

/var/tmp/portage/app-emulation/vmware-modules-279.0/work/vmblock-only/linux/file.c:240:4: error: unknown field ‘readdir’ specified in initializer

Problem ten można rozwiązać patchami które przygotował Eric Litak. Z repozytorium na GitHab’ie należy pobrać patche: 279-vmblock-3.11.patch oraz 279-vmblock-3.11.patch a następnie skopiować je do wcześniej utworzonego katalogu: /etc/portage/patches/app-emulation/vmware-modules-279.0/

Teraz można ponownie uruchomić kompilację vmware-player. W trakcie kompilacji modułów, w konsoli widoczny będzie log:

 * Applying user patches from /etc/portage/patches/app-emulation/vmware-modules-279.0 …
*   279-vmblock-3.11.patch…               [ ok ]
*   279-vmblock-3.12.patch…               [ ok ]
* Done with patching

Podłączenie mikrofonu do LPCXpresso Base Board

Jeżeli zajdzie potrzeba podłączenie do płytki ewaluacyjnej LPCXpresso Base Board mikrofonu, można wykorzystać do tego celu złącze BNC które znajduje się na płytce. Złącze to podłączone jest do przetwornika analogowo cyfrowego mikrokontrolera. W tym miejscu muszę od razu zaznaczyć iż konieczne jest sprawdzenie w schematach posiadanej przez nas płytki, która nóżka kontrolera podłączona jest do tego złącza, a co za tym idzie, który kanał przetwornika analogowo cyfrowego będziemy używać.

Niestety samo podłączenie mikrofonu do przetwornika nie przyniesie pożądanych efektów, konieczne będzie wykonanie przedwzmacniacza przez który podłączony zostanie mikrofon. Podłączając mikrof±on bezpośrednio do płytki przez złącze BNC nie przyniesie porządanego efektu. Dane uzyskane na wyjściu przetwornika będą wahać się ±3 jednostki. Ostateczny wniosek jest taki, iż sam mikrofon do niczego się nie nada, konieczne będzie przygotowanie prostego przedwzmacniacza.

Przygotowanie wzmacniacza

Na wstępnie pragnę zaznaczyć iż materiał w tym nagłówku nie jest autorski. Pochodzi z dokumentu firmy Atmel, która przedstawia sposób podłączenia mikrofonu do jednego ze swoich kontrolerów. Osoby znające język angielski zachęcam do zapoznania się z oryginałem.

Proponowany przedwzmacniacz będzie opierać się na układzie scalonym LM324 w którego obudowie znajdują się cztery wzmacniacze. Lista elementów które należy podłączyć do wzmacniacza jest na prawdę niewielka, schemat ideowy znajduje się poniżej:

Schemat ideowy wzmacniacza

Lista elementów które należy przygotować jest następująca:

  • U1 – LM324
  • R1, R2, R3 – 10kΩ
  • R4, R9 – 1kΩ
  • R5 – 12kΩ
  • C1 – 1μF
  • C6 – 100nF
  • C8 – 4.7nF

Cały układ można zmontować na „pająku” albo wykorzystać płytkę uniwersalną. Z racji tego iż nie miałem ani warukntów ani narzędzi do wykonania własnej płytki, skorzystałem właśnie z płytki uniwersalnej. Cena takiej płytki to około 8 zł za płytkę o wymiarach 8 cm x 14 cm. Poniżej przedstawiam propozycję rozmieszczenia elementów.

Propozycja rozlokowania elementów na płytce

Oczywiście zachęcam do zapoznania się z notą katalogową wzmacniacza lm324n, oraz dokumentu na którym bazuję doc1456.

Część programowa

Złącze BNC podłączone jest do kanału 5 przetwornika analogowo cyfrowego (jeżeli do płytki LPCXpresso Base Board podłączona zostałą płytka LPC 1768). Jeżeli do płytki bazowej podłączona jest inna płytka z innym kontrolerem, należy zapoznać się ze schematami dostarczonymi przez firmę Embedded Artist.

Przedstawiając stronę programową obsługi mikrofonu, należy rozpocząć od funkcji inicjalizującej przetwornik analogowo cyfrowy:

static void adc_init(uint32_t convert_frequency)
{
	uint32_t temp, tmp = 0;
 
	LPC_SC->PCONP |= (1 << 12); 
	LPC_ADC->ADCR = 0;
 
	LPC_PINCON->PINSEL3 = (3 << 30);
 
	//tmp = (1 << 21);
	//temp = SystemCoreClock / 4;
	//temp = (temp / convert_frequency) - 1;
	//tmp |= (temp << 8); 	LPC_ADC->ADCR = tmp;
	LPC_ADC->ADCR = 0x201800;
 
	// config
	//LPC_ADC->ADINTEN &= ~(1 << 0);		// number of channel to enable 	//LPC_ADC->ADCR |= (1 << 0); 	LPC_ADC->ADINTEN = 0x100;
 
	LPC_ADC->ADCR |= (1 << 5);
}

W tym miejscu konieczne wydaje się przytoczenie kilku wyjaśnień, co dzieje się w funkcji inicjalizującej przetwornik. Otóż linijka 5 włącza zasilanie modułu przetwornika AC. Linijka 8 to wybór, iż pin x będzie używany jako wejście przetwornika AC. Kolejne linijki (oraz linijka 6) są ściśle związane z konfiguracją przetwornika, zachęcam więc do zapoznania się z rozdziałem 29 (LPC17xx Analog-To-Device Converter (ADC)) dokumentacji mikrokontrolera.

// wait until conversion will be done
do {
	adc_done = LPC_ADC->ADDR5;
} while(!(adc_done & (1 << 31))); // Read value of conversion 
trim = ((LPC_ADC->ADDR5 >> 4) & 0xff);	// value from 0 register

W powyższym kodzie, w pętli do … while kopiowana jest zawartość rejestru wynikowego (rejestr w którym znajduje się wynik przetwarzania) do zmiennej, a następnie sprawdany jest status przetwarzania. Jeżeli przetwarzanie zostało zakończone, najstarszy bit w tym rejestrze będzie miał wartość 1. Należy również dodać, iż odczytanie zawartości tego rejestru, powoduje zresetowanie najstarszego bitu. Ostatnia linijka powoduje zapisanie przetworzonej wartości do zmiennej trim uint32_t).

Uwagi

Niestety płytka bazowa LPCXpresso Base Board nie została wyposażona w złącze jack służące do podłączenia mikrofonu, jednak zupełnie niewielkim kosztem można wykonać własną przystawkę do płytki. Wszystkie niezbędne elementy konieczne do wykonania przystawki zostały zaprezentowane w niniejszym wpisie. Do przygotowania przystawki wystarczy elementarna znajomość elektroniki oraz umiejętnośc posługiwania się lutownicą.

Opracowując rozmieszczenie elementów na płytce, korzystałem z darmowej aplikacji KiCAD. Aby przyspieszyć proces wykonania przystawki, dołączam również wykanany przeze mnie projekt w tejże aplikacji, zachęcam do pobrania wzmacniacz2.tar

Źródła

LPCXpresso wgrywanie programu do pamięci procesora

Nim przedstawię sposób wgrywania samego programu do pamięci procesora (który w zasadzie jest trywialny), wyjaśnię najpierw jak przygotować nie tyle środowisko co samą płykę, aby możliwe było przesłanie do niej danych. Lecz na samym początku, wyjaśnię skąd pobrać przykładowe programy i jak zaimportować je do środowiska.

Pobranie przykładowych programów

W sieci dostępne są dwa oficjalne zestawy przykładowych projektów. Jeden z nich przygotowany został przez firmę Embedded Artists i w pełni obrazuje wykorzystanie urządzeń dostępnych na płytce bazowej LPCXpresso Base Board. Drugi zestaw został przygotowany przez firmę code_red, nie jest w pełni kompatybilny z płytkami ewaluacyjnymi firmy Embedded Artists, lecz znajdują się w nim cenne przykłady obrazujące korzystanie z USB.

[Liniki wkrótece]

Import projektów do środowiska LPCXpresso

Import przykładowych projektów do środowiska, jest bardzo łatwy. Po uruchomieniu środowiska, należy z obiektu Quickstart Panel wybrać opcję Import project(s).

W nowym oknie należy kliknąć w przycisk Browse i zlokalizować archiwum z projektami które wcześniej pobraliśmy z sieci, a następnie kliknąć w przycisk Next.

W kolejnym oknie wyświetlona zostanie lista wszystkich dostepnych projektów w pliku archiwum. Istnieje w tym miejscu możliwość zrezygnowania z importu któregoś z nich przez odznaczenie ich na liście. Ostatnim krokiem jest kliknięcie w przycisk Finish.

Gotowe. W środowisku LPCXpresso widoczne będą wszystkie zaimportowane projekty.

Instalacj dfu-util

dfu-util jest programem implementującym po stronie hosta USB protokół DFU (Device Firmware Upgrade). Pozwala na pobieranie bądź wysyłanie firmware do urządzeń przez USB. Z racji tego, iż do prawodłowego działania debugera umieszczonego na płytce LPC1768 konieczne jest wgranie firmware przed rozpoczęciem pracy, konieczne jest również zainstalowanie tego narzędzia w naszym systemie. Program dfu-util niestety nie znalazł się w oficjalnym repozytorium Arch’a, jest jednak dostępny w AUR.

W zasadzie wraz z instalacją środowiska LPCXpresso, została również zainstalowany dfu-util, jednak jest to wersja 32 bitowa. O ile samą aplikację można teoretycznie uruchomić (gdyż system posiada zestaw bibliotek 32 bitowych), o tyle konieczna jest 32 biblioteka dla korzystania z portów USB, a jej instalacja okazała się dość kłopotliwa. Próbując uruchomić 32 bitowe dfu-util, wyświetlony zostanie następujący komunikat:

./dfu-util: error while loading shared libraries: libusb-0.1.so.4: cannot open shared object file: No such file or directory

W tym przypadku zdecydowanie mniej kłopotliwe jest instalowanie nowej, 64 bitowej wersji tej aplikacji prosto z AUR. (Jeżeli nie wiesz jak korzystać z Arch User Repository – AUR, sprawdź oficjalny poradnik lub jedną z wielu stron dostępnych w sieci).

Uruchamianie…

Przejdźmy teraz do uruchomienia płytki. W pierwszej kolejności przypomnę co trzeba podłączyć do komputera, aby możliwe było rozpoczęcie programowania.

Podłączenie

Płytka bazowa LPCXpresso Base Board posiada wbudowane 2 porty USB. Port 1 używany jest jako główne źródło zasilania, w zasadzie aby zasilać płytkę, można podłączyć dowolny port USB, jednak zalecany jest właśnie port 1. Port 1 służy również jako port UART3. Porty 3/4 używane są jako porty USB do zastosowań użytkownika przy czym port 3 może być używany tylko jako użądzenie (Device), port 4 jako Host. Gniazdo 5 jest oczywiście gniazem eternetu.

Płytka ewaluacyjna z mikrokotrolerem, LPC1768, również posiada port USB (port 2). Port ten słuzy do programowania oraz debugowania procesora.

Aby możliwe było rozpoczęcie pracy z zestawem ewaluacyjnym, powinniśmy podłączyć do komputera port 1 oraz port 2.

Wykrywanie zestawu przez komputer

Po podłączeniu obu portów USB do komputera, polecenie lsusb wyświetli następujące informacje na temat zestawu:

Bus 005 Device 003: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
Bus 002 Device 003: ID 0471:df55 Philips (or NXP) LPCXpresso LPC-Link

Pierwsza linijka dotyczy portu który jest na płytce bazowej, druga dotyczy płytki z mikrokontrolerem. Jeżeli probowalibyśmy teraz wgrać program do pamięci procesora, środowiska LPCXpresso zwróci komunikat iż nie może odnaleźć żadnej płytki.

//obrazek + komunikat bledu

Problem stanowi tutaj brak firmware w module LPC-Link. Niezgodny jest ProductID oraz VendroID (0471:df55).

Wczytywanie firmware do zestawu ewaluacyjnego

Aby załadować firmware do modułu LPC-Link, należy w pierwszej kolejności przejść do katalogu bin w którym zainstalowane zostało środowisko LPCXpresso, a następnie wydanie następujących poleceń:

Wczytanie firmware do modułu LPC-Link, polecenie:

dfu-util -d 0x471:0xdf55 -c 0 -t 2048 -R -D LPCXpressoWIN.enc
[root@astaroth bin]# dfu-util -d 0x471:0xdf55 -c 0 -t 2048 -R -D LPCXpressoWIN.enc
dfu-util 0.6

Copyright 2005-2008 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2012 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY

Filter on vendor = 0x0471 product = 0xdf55
Opening DFU capable USB device... ID 0471:df55
Deducing device DFU version from functional descriptor length
Run-time device DFU version 0100
Claiming USB DFU Runtime Interface...
Determining device status: state = dfuIDLE, status = 0
WARNING: Runtime device already in DFU state ?!?
Found Runtime: [0471:df55] devnum=0, cfg=1, intf=0, alt=0, name="UNDEFINED"
Claiming USB DFU Interface...
Setting Alternate Setting #0 ...
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing
Deducing device DFU version from functional descriptor length
DFU mode device DFU version 0100
No valid DFU suffix signature
Warning: File has no DFU suffix
bytes_per_hash=604
Copying data from PC to DFU device
Starting download: [##################################################] finished!
state(8) = dfuMANIFEST-WAIT-RESET, status(0) = No error condition is present
Done!
can't detach
Resetting USB to switch back to runtime mode
[root@astaroth bin]#

W tym momencie powinien zmienić się identyfikator modułu LPC-Link, należy raz jeszcze wywołać polecenie lsusb:

Bus 005 Device 006: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
Bus 002 Device 013: ID 1fc9:0009 NXP Semiconductors

Tak też się stało, urządzenie zmieniło swój identyfikator z 0471:df55 na 1fc9:9000.

Teraz można sprawdzić czy oprogramowanie środowiska LPCXpresso będzie widzieć emulator naszego układu, w tym celu wydajemy polecenie:

./crt_emu_cm3_nxp -info-emu -wire=winusb
[root@astaroth bin]# ./crt_emu_cm3_nxp -info-emu -wire=winusb
Ni: LPCXpresso Debug Driver v4.0 (Mar 25 2012 14:25:27)
1 Emulators available:
0. LPCLINK_1_1    LPC-Link Driver LINUX32 v1.1 (Code Red - LPCXpresso)

[root@astaroth bin]#

Jak widać, emulator został znaleziony. Możliwe jest jeszcze wyświetlenie informacji o samym układzie, w tym celu należy wywłać polecenie:

./crt_emu_cm3_nxp -info-target -pLPC1768 -wire=winusb -4

(Zrezygnowałem z zamieszczenie wyników polecenie, gdyż są dość długie, log dostępny jest tutaj).

Kompilacja i debugowanie

Środowisko jest już praktycznie gotowe do pracy. System został przygotowany do uruchomienia środowiska, IDE LPCXpresso może połączyć się z modułem LPC-Link, a projekty zostały zaimportowane do środowiska. Pozostaje nam jeszcze tylko sprwadzić czy uda się wgrać przykładowy projekty do pamięci procesora. Sprawdźmy to!

Po pierwsze należy uruchomić środowisko, wydając polecenie

/usr/local/lpcxpresso_4.2.2_238/lpcxpresso/lpcxpresso

(Oczywiście ścieżka może się nieco różnić, w zależności od zaisntalowanej wersji środowiska). Następnie z menu w którym znajduje się lista projektów w obszarze roboczym (workspace) należy kliknąć w projekt demo.

Po wybraniu projektu, w dolnej części panelu w elemencie Quickstart Panel dostępne będą nowe opcje (staną się aktywne). Build kompiluje projekt, Clean czyści projekt, a Debug oczywiście rozpoczyna proces debugowania. Aby wczytać nasz pierwszy projekt do pamięci procesora, należy skorzystać właśnie z tej ostatniej opcji. Kliknięcie w przycisk Debug spowoduje skompilowanie projektu, przesłanie go do pamięci procesora i uruchomienie go. Program zostanie jednak zatrzymany na pierwszej linijce programu.

Aby wznowić działanie programu, należy kliknąć w ikonkę Resume (żółty prostokąt z zielonym trójkątem) lub naciśnięcie przycisku F8 na klawiaturze.

Jeżeli program zostanie poprawnie wznowiony, płytka bazowa powinna „odżyć”.

Uwagi końcowe

Jeżeli uruchomienie aplikacji crt_emu_cm3_nxp nie będzie możliwe z powodów brakującej biblioteki libusb, konieczna jest instalacja biblioteki lib32-libusb której opis zamieściełem również na moim blogu.

Źródła:

 

Instalacja lib32-libusb w systemie Arch

Korzystając z systemów 64 bitowych, zachodzi czasami potrzeba skorzystania z bibliotek 32 bitowych. Potrzeba ta często narzucona jest prze zprogramy które korzystają z tych bibliotek. Wpis ten powstał na potrzeby serii wpisów na temat programowania kontrolerów LPCXpresso, gdzie oficjalne środowisko programistyczne jest dostępne jedynie w wersji 32 bitowej.

Pobieranie

Biblioteka lib32-libusb dostępna jest tylko w AUR, paczka dostępna jest pod adresem: http://aur.archlinux.org/packages.php?ID=56520

Instalacja

UWAGA! zanim rozpoczniesz instalację, zapoznaj się z całym wpisem!

Pierwszym krokiem jest wypakowanie archiwum…

[discovery@astaroth AUR]$ tar zxvf lib32-libusb.tar.gz
lib32-libusb/
lib32-libusb/PKGBUILD
[discovery@astaroth AUR]$ cd lib32-libusb

… i rozpoczęcie tworzenia paczki PkG…

[discovery@astaroth lib32-libusb]$ makepkg
==> Making package: lib32-libusb 1.0.9-1 (Sun Apr 29 14:42:28 CEST 2012)
==> Checking runtime dependencies...
==> Checking buildtime dependencies...
==> Missing Dependencies:
-> gcc-multilib
==> ERROR: Could not resolve all dependencies.
[discovery@astaroth lib32-libusb]$

I jak widać, pojawił się komunikat o brakujących zależnościach, tak więc uruchamiamy raz jeszcze generowanie paczki tym razem z przełącznikiem który doinstaluje brakujące zależności:

[discovery@astaroth lib32-libusb]$ makepkg -s
==> WARNING: Sudo can not be found. Will use su to acquire root privileges.
==> Making package: lib32-libusb 1.0.9-1 (Sun Apr 29 14:45:32 CEST 2012)
==> Checking runtime dependencies...
==> Checking buildtime dependencies...
==> Installing missing dependencies...
Password:
resolving dependencies...
looking for inter-conflicts...
:: gcc-libs-multilib and gcc-libs are in conflict. Remove gcc-libs? [y/N] y
:: binutils-multilib and binutils are in conflict. Remove binutils? [y/N] y
:: gcc-multilib and gcc are in conflict. Remove gcc? [y/N] y

Targets (6): binutils-2.22-6 [removal]  binutils-multilib-2.22-5
gcc-4.7.0-5 [removal]  gcc-libs-4.7.0-5 [removal]
gcc-libs-multilib-4.7.0-5  gcc-multilib-4.7.0-5

Total Download Size:    23.10 MiB
Total Installed Size:   99.72 MiB
Net Upgrade Size:       5.79 MiB

Proceed with installation? [Y/n]
...
...
==> Tidying install...
  -> Purging unwanted files...
  -> Compressing man and info pages...
  -> Stripping unneeded symbols from binaries and libraries...
  -> Removing libtool files...
==> Creating package...
  -> Generating .PKGINFO file...
  -> Compressing package...
==> Leaving fakeroot environment.
==> Finished making: lib32-libusb 1.0.9-1 (Sun Apr 29 14:47:21 CEST 2012)
[discovery@astaroth lib32-libusb]$

Gotowe. Ostatni krok, to instalacja paczki z lib32-libusb do system, w tym celu wydajemy polecenie:

[root@astaroth lib32-libusb]# pacman -U lib32-libusb-1.0.9-1-x86_64.pkg.tar.xz
loading packages...
resolving dependencies...
looking for inter-conflicts...

Targets (1): lib32-libusb-1.0.9-1

Total Installed Size:   0.14 MiB

Proceed with installation? [Y/n]
(1/1) checking package integrity                   [######################] 100%
(1/1) loading package files                        [######################] 100%
(1/1) checking for file conflicts                  [######################] 100%
(1/1) checking available disk space                [######################] 100%
(1/1) installing lib32-libusb                      [######################] 100%
[root@astaroth lib32-libusb]#

Gotowe, biblioteka lib32-libusb jest już w systemie.

Uwagi końcowe

Jak widać, konieczne jest zastąpienie w systemie bibliotek binutils, gcc oraz gcc-libs wersjami *-multilib. Nie ma możliwości pomięcia tego kroku. W zasadzie sam proces instalacji nie powinien przysporzyć większych problemów. Problemy mogą pojawić się dopiero później, gdy zajdzie konieczność aktualizacji systemu. Pacman na siłę chce aktualizować usunięte biblioteki, a zarazem informuje o konflikcie z wersjami multilib.

Linux, ThinkPad i przewijanie TrackPointem

Po instalacji systemu (Arch 64) większość urządzeń działa poprawnie. Do nielicznych wyjątków należy TrackPoint, a konkretniej przewijanie okien. W normalnych warunkach, gdy wszystko jest poprawnie skonfigurowane, track pointa można używać do przewijania zawartości okien trzymająć wcisnięty środkowy przycisk track pointa i poruszając samym track pointem. Jeżeli przewijanie nie działa, konieczna jest poprawka konfiguracji.

Konfiguracja serwera X

Aby wprowadzić poprawki w konfiguracji, należy utworzyć nowy plik 20-thinkpad.conf w katalogu /etc/X11/xorg.conf.d/ Oczywiście plik można utworzyć tylko z prawami roota. Do pliku wystarczy wstawić następujące dane:

Section "InputClass"
	Identifier	"Trackpoint Wheel Emulation"
	MatchProduct	"TPPS/2 IBM TrackPoint|DualPoint Stick|Synaptics Inc. Composite TouchPad / TrackPoint|ThinkPad USB Keyboard with TrackPoint|USB Trackpoint pointing device|Composite TouchPad / TrackPoint"
	MatchDevicePath	"/dev/input/event*"
	Option		"EmulateWheel"		"true"
	Option		"EmulateWheelButton"	"2"
	Option		"Emulate3Buttons"	"false"
	Option		"XAxisMapping"		"6 7"
	Option		"YAxisMapping"		"4 5"
EndSection

Zapisać zmiany i zrestartować X serwer. Wystarczy wylogować się z systemu i zalogować ponownie.
Źródła:

Instalacja IDE LPCXpresso

Niniejszy poradnik dotyczny instalacji środowiska programistycznego LPCXpresso na systemie operacyjnym Linux Arch (x86_64).

Pobieranie IDE LPCXpresso

Środowisko można pobrać ze strony firmy red_code pod adresem http://lpcxpresso.code-red-tech.com/LPCXpresso/ zupełnie za darmo, konieczna jest jednak wcześniejsza rejestracja. Po wejściu na stronę firmy red_code należy w górnej części strony kliknąć link Create Account i wypełnić formularz rejestracyjny. Po wypełnieniu należy kliknąć w przycisk SingUp i poczekać na maila z potwierdzeniem rejestracji. Wraz z mailem dostarczone zostanie hasło do strony pobierania.

Po odebraniu wiadomości, należy raz jeszcze przejść na stronę firmy code_red i tym razem skorzystać z pól logowania umieszczonych również w górnej części strony. Po zalogowaniu dostępne będzie menu z którego należy wybrać pozycję Download. Kolejnym krokiem jest wybór odpowiedniej wersji środowiska. Dostępne są dwie: dla systemy Windows, oraz dla systemu Linux. Oczywiście należy kliknąć w link LPCXpresso for Linux i od razu udać się na sam dół strony. Dostępna będzie lista kilku wersji środowiska. Oczywiście należy wybrać najnowszą, czyli link pod napisem Current release. Plik należy zapisać na dysku i jeśli posiadasz system 32 bitowy, możesz od razu przejść do części Instalacja, jeśli Twój system jest 64 bitowy, koniecznie musisz przygotować swój system do instalacji oprogramowania 32 bitowego.

Przygotowanie systemu

Przed rozpoczęciem instalacji IDE LPCXpresso konieczne jest wstępne przygotowanie systemu. Środowisko dostępne jest tylko dla systemów 32 bitowych, dlatego aby w ogóle możliwe było uruchomienie instalatora, konieczna jest instalacja bibliotek 32 bitowych.

Multilib Project

Pierwszym krokiem jest poinformowanie menadżera pakietów iż chcemy używać 32 bitowych bibliotek w systemie 64 bitowym. Należy edytować plik /etc/packman.conf aby możliwa była instalacja owych bibliotek. W pliku należy dodać (lub odkomentować) następujące linijki:

[multilib]
Include = /etc/pacman.d/mirrorlist

Na koniec konieczna jest aktualizacja bazy pakietów, w tym celu należy wydać polecenie pacman -Sy

[root@astaroth discovery]# pacman -Sy
warning: database file for 'multilib' does not exist
:: Synchronizing package databases...
 testing                   24.0 KiB   128K/s 00:00 [######################] 100%
 core                     102.5 KiB   178K/s 00:01 [######################] 100%
 extra                   1390.0 KiB   417K/s 00:03 [######################] 100%
 community-testing          3.3 KiB  2.30M/s 00:00 [######################] 100%
 community               1647.6 KiB   199K/s 00:08 [######################] 100%
 multilib                1133.0   B  40.0M/s 00:00 [######################] 100%
[root@astaroth discovery]#

Gotowe.

Instalacja brakujących bibliotek

Aby możliwe było uruchamianie aplikacji 32 bitowych konieczna jest instalacja biblioteki lib32-glibc oraz dodatkowo lib32-gtk2 gdyż środowisko IDE LPCXpresso korzysta z biblioteki GTK2. Konieczne jest też zainstalowanie biblioteki lib32-libxtst oraz lib32-ncurses. Aby rozpocząć instalację należy wydać poniższe polecenie i poczekać na zakończenie instalacji.

pacman -S lib32-glibc lib32-gtk2 lib32-libxtst lib32-ncurses

Instalacja IDE LPCXpresso

Gdy system gotowy jest na uruchomienie aplikacji 32 bitowych, można przejść do istalacji IDE. Pierwszym krokiem będzie wypakowanie pobranego środowiska z archiwum tar. Można tego dokonać albo przez graficzny archiwizer (jeżeli takowy zainstalowany jest w systemie) bądź wydająć polecenie w konsoli:

tar zxvf Installer_LPCXpresso_4.2.2_238_Linux-x86.tar_.gz

W bieżącym katalogu powstanie plik Installer_LPCXpresso_4.2.2_238_Linux-x86 który jest plikiem binarnym, instalatorem środowiska. Plik należy uruchomić. Jeżeli uruchamiamy instalator z konta zwykłego użytkownika, instalator poprosi nas o podanie hasła konta root.

[discovery@astaroth LPC]$ ./Installer_LPCXpresso_4.2.2_238_Linux-x86
This program requires administrator privileges.  Please enter your password
[su root]
Password:
[discovery@astaroth LPC]$

Po podaniu hasła rozpoczyna się instalacja. Instalator przypomina swym wyglądem typowe instalatory dostępne w systemach Windows.

Okna instalatora środowiska LPCXpresso

W zasadzie całość sprowadza się do podania ścieżki instalacji środowiska i klikaniu w przycisk Next. Po zakończonej instalacji, środowisko można uruchomić poleceniem (o ile nie została zmieniona domyślna ścieżka instalacji) /usr/local/lpcxpresso_4.2.2_238/lpcxpresso/lpcxpresso

Po wydaniu polecenia, najpierw wyświetli się ekran powitalny środowiska, a następnie środowisko zapyta nas o śnieżkę katalogu w którym przechowywane będą projekty (workspace). W zasadzie można pozostawić domyślną ścieżkę (jak łatwo można zauważyć, środowisko IDE LPCXpresso zostało zbudowane na bazie środowiska Eclipse).

Natychmiast po uruchomieniu środowiska, wyświetlony zostanie komunikat, iż korzystamy z niezarejestrowanej wersji środowiska. Z komunikatu wynika również, iż debugowanie będzie możliwe tylko dla programów do 8 kB.

Środowisko nie zostało zarejestrowane

Rejestracja środowiska

Aby zwiększyć ograniczenia związanego z debugowanie programów (do 128 kB), należy dokonać rejestracji nowo zainstalowanego środowiska. W tym celu należy z menu Help wybrać pozycję Product activation, a następnie Create Serial number and Activate.

Okno aktywacji środowiska

W nowym oknie w polu Serial number znajdzie się wygenerowany przez środowisko numer seryjny, który należy podać na stronie firmy code_red. Klikjąć w przycisk OK automatycznie zostanie załadowana strona przez którą będzie możliwe wygenerowanie kodu aktywacyjnego. W zasadzie numer seryjny powinien być już wpisany w pole Enter serial number here. Jeżli numer seryjny jest wpisany w pole, należy kliknąć w przycisk Send me my activation code.

Kod aktywacyjny na stronie code_red

Kod aktywacyjny zostanie wysłany na podany w trakcie rejestracji konta adres e-mail. Wyświetlony zostanie również komunikat o nastepującej treści:

Your activation code has been sent to the email address for this account (twoj@adres.pl).

Ostatnim krokiem jest wprowadzenie otrzymanego kodu aktywacyjnego do środowiska LPCXpresso. W tym celu należy odebrać pocztę i skopiować otrzymany kod. Kod aktywacyjny będzie widał pod napisem: Your activation code is.

Aby wprowadzić kod aktywacyjny do środowiska, należy z menu Help wybrać ponownie opcję Product activation i tym razem Enter Activation code. W nowym oknie należy wprowadzić otrzymany kod i kliknąć OK.

Wpisywanie kodu aktywacyjnego

Wyświetlone zostanie jeszcze jedno okno, potwierdzające dokonania aktywacji. Gotowe. Środowisko LPCXpresso gotowe jest do pracy!

Źródła:

LPCXpresso – wstęp do programowania kontrolerów LPCXpresso

Z racji tego, iż w ramach pracy magisterskiej muszę wykonać aplikację na mikrokontrolerze LPCXpresso, postanowiłem przygotować serię postów wyjaśniającą w jaki sposób należy rozpocząć przygodę z tymi mikrokontrolerami. Już na samym początku swojej przygody, miałem ogromny problem z wgraniem przykładowego programu do procesora, po wielu godzinach googlowania udało się. Chcę podzielić się tą wiedzą w ramach mojego blogu, zwłaszcza że wiele informacji na temat programowania mikrokontrolerów LPCXpresso (zresztą jak i innych) na systemach Linux dostępnych jest jedynie w języku angielskim. Na pewno nie zaszkodzi jeśli w sieci dostępne będą również informacje na ten temat w języku Polskim.

Informacje wstępne

Jak już wspomniałem, pierwszym ogromnym problemem było same podłączenie się do mikrokontrolera. Mikrokontrolery LPCXpresso posiadają swój własny interfejs zwany LPC-Link do wgrywania / debugowania programu. OpenOCD na nic się tu nie zda. Konieczne jest skorzystanie z środowiska programistycznego przygotowanego przez firmę code_red. Oczywiście środowisko można bezpłatnie pobrać ze strony producenta po uprzedniej rejestracji.

W kolejnych postach wyjaśnię krok po kroku jak należy przeprowadzić instalację (oczywiście w systemie Linux). Jak się okazało, samo zainstalowanie środowiska nie umożliwiło mi podłączenia się do mikrokontrolera. Przed możliwością rozpoczęcia wgrywania / debugowania programu przez interfejs LPC-Link konieczne jest wgranie odpowiedniego firmware’a do płytki z kontrolerem.

Tworząc ten mini poradnik, będę wzorował się na płytce ewaluacyjnej LPC1768 oraz płytce bazowej LPCXpresso Base Board firmy Embedded Artists, gdyż tylko takie urządzenia mam pod ręką.

Źródła:

Sortowanie QList w Qt

Przedstawię w kilku przykładach w jaki sposób można skorzystać z funkcji qSort() dostępnej w bibliotece Qt. Okazuje się iż jej użycie jest bardzo wygodne jednak początkowo może przyspożyć nieco trudności.

Typy podstawowe

Gdy zachodzi potrzeba posortowania listy przechowującej proste typy danych, wystarczy wywołać funkcję qSort() podając jako argumenty iterator na pierwszy element listy oraz iterator wskazujący na ostatni element listy. Jako przykład przyjmijmy następującą listę: QList<int>

QList list;
list << 33 << 12 << 68 << 6 << 12;
qSort(list.begin(), list.end());

Typy złożone

W przypadku gdy wymagane jest posortowanie bardziej złożonych typów przechowywanych w QList konieczne staje się zdefiniowanie własnej funkcji która będzie odpowiedzialna za porównywanie. Jako przykład przyjmijmy następującą listę: QList<QPair<QString, int> > mojaLista;. W takim przypadku konieczne staje się zdefiniowanie w jaki sposób należy porównywać kolejne obiekty z listy.

W tym celu należy zdefiniować funkcję która za parametry przyjmować będzie dwa porównywane obiekty z listy, czyli w naszym przykładzie będzie to referencja na const QPair<QString, int>. Funkcja koniecznie musi zwracać wartość boolowską. Przykład takiej funkcji znajduje się poniżej

bool SortingExample::sortLessThan(const QPair<QString, int> &p1, const QPair<QString, int> &p2)
{
    if(p1.second < p2.second)
        return true;
    else
        return false;
}

W zasadzie na tym kończy się cała trudność. Aby posortować naszą listę wystarczy teraz wywołać funkcje qSort() podająć jeszcze trzeci parametr, czyli nazwę funkcji która realizuje porównywanie obiektów.

qSort(mojaLista.begin(), mojaLista.end(), sortLessThan);

Uwaga!

Funkcja porównująca musi być widoczna przez funkcje qSort() dlatego najlepiej zadeklarować ją jako statyczną. W przeciwnym wypadku kompilator poinformuje nas o braku widoczności funkcji następującym komunikatem błędu:

sortingexample.cpp: In member function ‚void SortingExample::sort()’:

sortingexample.cpp:40:49: error: no matching function for call to ‚qSort(QList<QPair<QString, int> >::iterator, QList<QPair<QString, int> >::iterator, <unresolved overloaded function type>)’

sortingexample.cpp:40:49: note: candidates are:

/usr/include/QtCore/qalgorithms.h:177:13: note: template<class RandomAccessIterator> void qSort(RandomAccessIterator, RandomAccessIterator)

/usr/include/QtCore/qalgorithms.h:184:13: note: void qSort(RandomAccessIterator, RandomAccessIterator, LessThan) [with RandomAccessIterator = QList<QPair<QString, int> >::iterator, LessThan = bool (SortingExample::*)(const QPair<QString, int>&, const QPair<QString, int>&)]

/usr/include/QtCore/qalgorithms.h:184:13: note: no known conversion for argument 3 from ‚<unresolved overloaded function type>’ to ‚bool (SortingExample::*)(const QPair<QString, int>&, const QPair<QString, int>&)’

/usr/include/QtCore/qalgorithms.h:191:13: note: template<class Container> void qSort(Container&)

make: *** [sortingexample.o] Error 1

Źródła:

Uruchamianie demonów w tle w systemie Arch.

Przez kilka ostatnich dni męczyłem się z rozwiązaniem problemu który występował w trakcie uruchamiania systemu. Otóż za każdym razem, gdy kabel sieciowy był odłączony od komputera, proces uruchamiania systemu zatrzymywał się na kilka sekund przy uruchamianiu sieci. Niestety instalacja aplikacji ifplugd nie pomógł (w Gentoo instalacja tej aplikacji rozwiązała problem zwieszania się procesu uruchamiania systemu gdy kabel sieciowy był odłączony).

Rozwiązanie problemu jest bardzo trywialne. Wystarczy zdefiniować w pliku /etc/rc.conf aby demon network uruchamiał się w tle. Aby tego dokonać, należy w sekcji DEAMONS przed nazwą demona dodac znak @. Czyli network należy zamienić na @network.

W moim przypadku, konfiguracja w pliku /etc/rc.conf będzie wyglądać następująco:

DAEMONS=(syslog-ng ifplugd @network crond dbus cpufreq networkmanager gdm hdapsd healthd bluetooth)