Cześć wszystkim!
Prosiłbym bardzo o wsparcie w następującym problemie, który nie daje mi spokoju już od paru dni. Mianowicie - posiadam telefon Sony Xperia E. Potrzebuję zmodyfikować jego sterownik do WiFi (ath6kl), tak aby logował pewne specyficzne dane. Niestety utknąłem na 1 kroku, a mianowicie nie mogę wrzucić skompilowanego modułu tego sterownika na telefon. Wersja jądra w systemie to: 3.4.0-perf, numer kompilacji to 11.3.A.0.47. Ściągnąłem więc sobie udostępnione źródła tej kompilacji stąd: Open source archive for build 11.3.A.0.47 – Developer World . Są tam 2 katalogi: kernel, zawierający źródła jądra i external, zawierający pakiet compat-wireless. Od razu co mnie zaskoczyło to fakt, że wersja jądra to rzeczywiście 3.4.0, ale wersja pakietu compat to 3.3 (jak to możliwe, żeby była niższa niż wersja jądra ?). Skopiowałem z androida plik /proc/config zawierającą domyślną konfigurację dla kompilacji i skompilowałem jądro używając cross-kompilacji na architekturę ARM:
root@michael-F3Sg:/home/michael/Sources/kernel# make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- KLIB=. KLIB_BUIILD=.
Na telefonie w katalogu /system/lib/modules/ath6kl mam 2 moduły:
ath6kl_sdio.ko i cfg80211.ko. Poglądając te binarki (strings xxx.ko) widzę, że zostały skompilowane z pakietu compat-wireless. Pokrywa się to z plikiem Makefile w katalogu external modułu ath6kl - rzeczywiście tworzy on moduł ath6kl_sdio.ko i zależy od modułu cfg80211.ko. Gdy jednak skompiluje ten moduł z katalogu kernela to plik Makefile ath6kl tworzy moduł ath6kl_sdio.ko i dodatkowo ath6kl_core.ko od którego zależy, a dopiero sam core zależy od cfg80211.ko. Są to więc inne zupełnie struktury. Gdy próbuję skompilować obydwa moduły (cfg80211.ko i ath6kl_sdio.ko), tak, żeby zastąpić je po prostu na androidzie w katalogu /system/lib/modules/ath6kl lecą mi co chwila błedy kompilacji wynikające z różniących się plików nagłówkowych. Kompiluję z poziomu pakietu compat-wireless:
root@michael-F3Sg:/home/michael/Sources/external/compat-wireless# make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -C ../../kernel/ M=/home/michael/ources/external/compat-wireless/net/wireless/
oraz
root@michael-F3Sg:/home/michael/Sources/external/compat-wireless# make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -C ../../kernel/ M=/home/michael/ources/external/compat-wireless/drivers/net/wireless/ath/ath6kl
Obydwie ścieżki na końcu poleceń są katalogami modułów (cfg80211 i ath6kl_sdio). Kompilacja bierze pod uwagę pliki z katalogu danego modułu, ale pliki nagłówkowe są brane z katalogu kernela - ponieważ różnią się one wyraźnie od tych samych plików nagłówkowych z katalogu external to co chwila musze poprawiać błędy kompilacji poprzez mergowanie plików nagłówkowych (np. brakujące struktury z pliku cfg80211.h kopiuję do tego samego pliku w kernelu). Jest to oczywiście średnio rozsądne i nawet gdy udało mi się w ten sposób skompilować obydwa moduły to po wrzuceniu ich na telefon WiFi mi nie wstaje, bo lecą błędy typu: unknown symbol bądź disagrees about symbol version itp. itd. Próbowałem kilka razy i ciągle to samo. Pytanie podstawowe to czemu jest taki rozjazd w strukturze plików kernela i compat-wireless udostępnionych przez Sony, przez co kompilacja sie nie udaje, czy jednak coś źle rozumuję? Tak jak napisałem na początku chcę tylko w małym stopniu zmodyfikować jeden z plików sterownika ath6kl, żeby móc logować pewne rzeczy, co w żaden sposób nie zdestabilizuje obsługi wirelessu. Sprawa z pozoru mało skomplikowana okazała się być większą ścianą. Byłbym bardzo wdzięczny za pomoc, bo już kilka dni się z tym męczę, przez co nie mogę zając się główną funkcjonalnością. Z góry dzięki, ponieważ zależy mi na czasie, to mogę zachęcić gratyfikacją finansową 🙂