This page in English.
W wersji angielskiej, umieściłem bardzuiej aktualny opis instalacji jądra 3.0.8.
Z jednej strony jest to dość solidnie wykonane urządzenie, małe, lekkie z 10” ekranem i bardzo dobrym czasem pracy na baterii. Może być traktowane zarówno, jako płyta deweloperska, jak i urządzenie do pracy. Z drugiej strony zainstalowany system Android kompletnie nie sprawdza się w urządzeniu, które bardziej przypomina laptopa niż telefon.
Rozwiązaniem pozwalającym pozbyć się ograniczeń Androida i umożliwiającym pełne skorzystanie z funkcji tego netbooka, jest instalacja klasycznej, opensource-owej dystrybucji Linuksa.
Niestety oficjalne wsparcie firmy NVIDIA dla systemu Linux na zestawach deweloperskich, które są bazą netbooka, zostało zawieszone (i nie wiadomo czy i kiedy będzie kontynuowane). Dostępne są tylko źródła jądra oraz narzędzia deweloperskie dla Android-a. Na szczęście można je z powodzeniem wykorzystać do zainstalowania własnej lub gotowej dystrybucji Linuksa.
W serwisie firmy NVIDIA umieszczone są materiały dotyczące zestawu uruchomieniowego Tegra Ventana. Jest on zbliżony
parametrami do omawianego urządzenia. Wykorzystamy go do pozyskania programu nvflash
.
http://developer.nvidia.com/node/19101
Pobieramy wersję dla Linuxa.
http://developer.download.nvidia.com/tegra/files/os/tegra_ventana_gb_20110222.run.gz
Rozpakowuje i instaluję (trzeba zaakceptować licencję):
$ gunzip tegra_froyo_20110207.run.gz $ sh tegra_froyo_20110207.run.gz ... By answering 'yes' to the next question you confirm you have read, understood and accept all the terms of this license. Do you accept the terms of this license? yes/no? yes Creating directory tegra_ventana_gb_20110222 Verifying archive integrity... All good. Uncompressing NVIDIA Tegra 250 Android Installer............ $ cd tegra_ventana_gb_20110222/
Numer | Nazwa | Rozmiar | Przeznaczenie |
---|---|---|---|
2 | BCT | 3 145 728 (3 MB) | boot config table |
3 | PT | 524 288 (512 kB) | partition table |
4 | EBT | 2 097 152 (2 MB) | bootloader |
5 | SOS | 5 242 880 (5 MB) | recovery partition |
6 | LNX | 8 388 608 (8 MB) | linux kernel and inird |
7 | MBR | 1 048 576 (1 MB) | master boot record |
8 | APP | 314 572 800 (300 MB) | applications (/system) |
9 | CAC | 419 430 400 (400 MB) | cache (/cache) |
19 | MSC | 2 097 152 (2 MB) | misc (/misc) |
11 | EM1 | 524 288 (512 kB) | |
12 | UBA | 1 294 991 360 (1235 MB) | user data (/data) |
13 | EM2 | 524 288 (512 kB) | |
14 | UDB | 5 950 144 512 (5674.5 MB) (reszta) | user data (/storage) |
Numer | Nazwa | Rozmiar | Przeznaczenie |
---|---|---|---|
2 | BCT | 3 145 728 (3 MB) | boot config table - zależy od systemu, który zamierzamy wgrać |
3 | PT | 524 288 (512 kB) | tablica partycji (dla nvflash) |
4 | EBT | 2 097 152 (2 MB) | bootloader |
5 | SOS | 5 242 880 (5 MB) | nieużywana, można umieścić na niej zapasowy system (do testów lub aktualizacji), bootloader umożliwi jego uruchomienie po włączeniu urządzenia z wciśniętym przyciskiem Home |
6 | LNX | 8 388 608 (8 MB) | jądro systemu; partycja musi znajdować się pod właściwym (zakodowanym w bootloaderze) offsetem |
5 | MBR | 5 242 880 (5 MB) | master boot record - tablica partycji dla Linuksa |
7 | APP | reszta | główny system plików (Debian) |
Podział na partycję (i nagranie ich zawartości w plików źródłowych) uzyskamy przy pomocy następującego pliku konfiguracyjnego:
[device] type=hsmmc instance=3 [partition] name=BCT id=2 type=boot_config_table allocation_policy=sequential filesystem_type=basic size=3145728 file_system_attribute=0 partition_attribute=0 allocation_attribute=8 percent_reserved=0 [partition] name=PT id=3 type=partition_table allocation_policy=sequential filesystem_type=basic size=4096 file_system_attribute=0 partition_attribute=0 allocation_attribute=8 percent_reserved=0 [partition] name=EBT id=4 type=data allocation_policy=sequential filesystem_type=basic size=2097152 file_system_attribute=0 partition_attribute=0 allocation_attribute=8 percent_reserved=0 filename=ac100-bootloader.bin [partition] name=SOS id=5 type=data allocation_policy=sequential filesystem_type=basic size=5242880 file_system_attribute=0 partition_attribute=0 allocation_attribute=8 percent_reserved=0 [partition] name=LNX id=6 type=data allocation_policy=sequential filesystem_type=basic size=8388608 file_system_attribute=0 partition_attribute=0 allocation_attribute=8 percent_reserved=0 filename=linux.img [partition] name=MBR id=7 type=data allocation_policy=sequential filesystem_type=basic size=1048576 file_system_attribute=0 partition_attribute=0 allocation_attribute=8 percent_reserved=0 [partition] name=APP id=8 type=data allocation_policy=sequential filesystem_type=basic size=0xFFFFFFFFFFFFFFFF file_system_attribute=0 partition_attribute=0 allocation_attribute=8 percent_reserved=0 filename=rootfs.img
Powyższy plik uzyskałem modyfikując dołączony do OS Pack-a plik flash.cfg
. Oprócz zmian układu partycji należy zwrócić uwagę na zmianę w partycji numer 4 - z type=bootloader
na type=data
. Zmiana jest konieczna do prawidłowego zaprogramowania urządzenia.
Do zainstalowania systemu konieczne będzie przygotowanie odpowiednich plików z danymi: bootloadera, jądra z ewentualnym ramdyskiem, głównego systemu plików.
Plik EBT niezbędny do uruchomienia urządzenia. Bez niego nie da się zaprogramować urządzenia. Plik skopiowany z mojego egzemplarza AC100: ac100.bct
Jako Bootloadera można użyć:
Można uruchomić jądro w wersji 2.6.32 (to samo, co w dostarczanym systemie Android). Do prawidłowego działania wymaga ono programu nvrm_daemon
. Jest on (a w zasadzie był) dostarczany przez firmę NVIDIA w pakiecie linux4tegra. Nie jest udostępniany kod źródłowy programu ani używanych przez niego bibliotek.
Druga możliwość to uruchomienie nowszego jądra w wersji 2.6.37 lub 2.6.38 (osobiście używam tego drugiego). Nie wymagają one dodatkowych programów. Prace nad tymi wersjami są prowadzone w ramach projektu ChromeOS
.
Do kompilacji jądra konieczny będzie toolchain. Ponieważ jądro nie korzysta z biblioteki standardowej oraz jego system budowania sam określa wariant ABI i typ procesora, można skorzystać z dowolnego toolchaina. Ja używam arm-cortex_a9-linux-gnueabi
opisanego tu.
$ export PATH=/home/marcin/x-tools/arm-cortex_a9-linux-gnueabi/bin:$PATH
Skompilowane jądro, wraz z jego parametrami (oraz opcjonalnie dołączonym ramdyskiem) należy jeszcze opakować w plik rozumiany przez bootloader. Służy do tego narzędzie 'mkbootimg'.
Polecam wykorzystanie tej wersji. Jest ona aktywnie rozwijana.
Repozytorium z tymi wersjami znajduje się pod adresem: http://gitorious.org/~marvin24/ac100/marvin24s-kernel.
Kilka wersji jądra, dostępnych jest jako gałęzie tego repozytorium, aby je pobrać, należy przy wywoływaniu polecenia git
dodać odpowiedni parametr określający gałąź, na przykład: -b chromeos-ac100-2.6.38-exp
.
Użyta niżej konfiguracja jądra jest dobrana dość subiektywnie (minimalistycznie) na podstawie eksperymentalnego jądra używanego w dystrybucji Ubuntu.
$ git clone git://gitorious.org/~marvin24/ac100/marvin24s-kernel.git $ cd marvin24s-kernel $ wget -c http://bis.org.pl/static/ac100/ac100-2.6.38.config $ cp ac100-2.6.38.config .config $ make ARCH=arm CROSS_COMPILE=arm-cortex_a9-linux-gnueabi- oldconfig $ make ARCH=arm CROSS_COMPILE=arm-cortex_a9-linux-gnueabi-
Ta wersja, z kolei, mimo, że starsza - działa stabilnie i bez problemów (błędów, zawieszeń).
Zmodyfikowana wersja jądra wydana pierwotnie przez firmę Toshiba (dla wypełnienia licencji GPL) znajduje się w serwisie: http://gitorious.org/ac100.
Plik konfiguracyjny jądra: ac100-2.6.32.config.
$ git clone git://gitorious.org/ac100/kernel.git $ cd kernel $ wget -c http://bis.org.pl/static/ac100/ac100-2.6.32.config $ cp ac100-2.6.32.config .config $ make ARCH=arm CROSS_COMPILE=arm-cortex_a9-linux-gnueabi- oldconfig $ make ARCH=arm CROSS_COMPILE=arm-cortex_a9-linux-gnueabi-
Jest to jeden z programów wchodzących w skład SDK systemu Android. Ponieważ używa specyficznego systemu budowania, skompilujemy tylko to narzędzie (wraz z jego zależnościami):
$ git clone git://android.git.kernel.org/platform/system/core.git #Alternatywnie wersja eksperymentalna: # $ mkdir mkbootimg-build $ cd mkbootimg-build $ cp -v ../core/mkbootimg/bootimg.h ./ $ cp -v ../core/mkbootimg/mkbootimg.c ./ $ cp -v ../core/libmincrypt/sha.c ./ $ mkdir -v mincrypt $ cp -v ../core/include/mincrypt/sha.h ./mincrypt/ $ gcc -I. -c sha.c $ gcc -I. -c mkbootimg.c $ gcc -s -o mkbootimg mkbootimg.o sha.o $ cp mkbootimg ../
Skompilowane jądro w wybranej wersji, bez ramdysku oraz parametry uruchomienia, umieścimy w pliku linux.img
.
Oryginalne parametry jądra Androida to:
mem=448M@0M nvmem=64M@448M vmalloc=320M video=tegrafb console=tty1 usbcore.old_scheme_first=1 tegrapart=recovery:300:a00:800,boot:d00:1000:800,mbr:1d00:200:800 root=/dev/mmcblk3p1 rootwait
Parametr tegrapart
składa się z listy oddzielonych przecinkami partycji:
<nazwa>:<offset w blokach>:<długość w blokach>:<rozmiar bloku>
Teoretycznie pozawala na określenie, które partycje i w jakiej kolejności mają być widoczne w Linuksie, w praktyce jest różnie interpretowany w zależności od wersji jądra.
W przypadku jądra 2.6.37 linia poleceń jest inna, potrzebny jest „magiczny parametr” lp0_vec
:
./mkbootimg \ --kernel marvin24s-kernel/arch/arm/boot/zImage \ --ramdisk /dev/null \ --cmdline \ 'mem=448M@0M lp0_vec=0x2000@0x1c29e000 tegrapart=recovery:300:a00:800,boot:d00:1000:800,mbr:1d00:200:800 root=/dev/mmcblk0p3 console=tty1 rootwait' \ -o linux.img
Wewnętrzna pamięć eMMC jest wykrywana jako mmcblk0
, partycje zostaną prawidłowo zorganizowane na podstawie parametru tegrapart=
. Sterownik będzie umożliwiał dostęp do partycji zawierającej jądro - główne (mmcblk0p2
) oraz zapasowe (mmcblk0p1
) a także system plików (mmcblk0p3
).
W 2.6.32 inna jest kolejność wykrywania urządzeń MMC, wewnętrzna pamięć będzie dostępna jako mmcblk0
,
./mkbootimg \ --kernel kernel/arch/arm/boot/zImage \ --ramdisk /dev/null \ --cmdline \ 'mem=448M@0M nvmem=64M@448M vmalloc=320M video=tegrafb console=tty1 tegrapart=recovery:300:a00:800,boot:d00:1000:800,mbr:1d00:200:800 root=/dev/mmcblk3p1 rootwait' \ -o linux.img
Parametr tegrapart=
zdaje się być ignorowany, główny system plików jest dostępny jako jedyna partycja mmcblk0p1
.
Do przygotowania niewielkiego, zoptymalizowanego głównego systemu plików, można skorzystać z zestawu narzędzi Buildroot
.
Alternatywą (ze względu na możliwości urządzenia dość dobrą) jest zainstalowanie dystrybucji (Debian lub Ubuntu). Nie są one zoptymalizowane do wykorzystania wszystkich możliwości procesora i wersji architektury, ale za to zapewniają dużo pre-kompilowanych pakietów, gotowych do zainstalowania. Zajmiemy się instalacją systemu Debian 6.0. Wprawdzie programy są skompilowane w trybie zgodności z armv4
, ale różnice wydajności będą niezauważalne.
http://buildroot.uclibc.org/ Korzystam z wersji 2011.05.
Konfiguracja jest dość standardowa. Wybieramy odpowiedni toolchain (ścieżkę i prefix) oraz kilka programów według uznania.
Target Architecture (arm) ---> Target Architecture Variant (cortex-A9) ---> Toolchain ---> Toolchain type (External toolchain) ---> Toolchain (Custom toolchain) ---> (/home/marcin/x-tools/arm-cortex_a9-linux-gnueabi) Toolchain path (arm-cortex_a9-linux-gnueabi) Toolchain prefix External toolchain C library (glibc) ---> [*] Toolchain has C++ support? [ ] Use software floating point by default System configuration ---> (ac100) System hostname (Welcome to AC100) System banner (tty1) Port to run a getty (login prompt) on Filesystem images ---> [*] ext2 root filesystem
Kompletny, gotowy do użycia plik konfiguracyjny Buildroota umieściłem tu: buildroot.config|.
Po zbudowaniu narzędzi generowany jest plik output/images/rootfs.ext2
z obrazem systemu plików. Należy pod nazwą rootfs.img
umieścić go w katalogu, z którego zostanie odczytany przez nvflash
.
Można także później nagrać plik z obrazem w odpowiedniej partycji urządzenia (8).
Jest to rozwiązanie szybkie, ale niestety mało elastyczne. Wygenerowany obraz to system plików ext2
, podczas gdy na przykład ext4
ma znacznie krótszy czas montowania oraz lepiej sobie radzi z wyłączeniami na skutek awarii zasilania. W dodatku zbudowane narzędzia nie dostarczają polecenia resize2fs
, które umożliwiłoby zwiększenie rozmiaru systemu plików do całej dostępnej partycji.
Ponadto w przygotowanym w powyższy sposób systemie plików nie zainstalowaliśmy modułów (można to zrobić w sposób analogiczny, jak w Debianie).
Do przygotowania obrazu systemu Debian przeznaczonego do wgrania na urządzenie wykorzystamy narzędzie debootstrap
.
W podobny sposób można zainstalować także inne dystrybucje: przy pomocy tego samego narzędzia - Ubuntu, przy pomocy analogicznych (na przykład febootstrap
- Fedorę).
Poniższe polecenie wykona pierwszy etap instalacji w katalogu debian-ac100. Do bazowego systemu zostaną dołączone pakiety konieczne do skonfigurowania wbudowanej karty bezprzewodowej. Firmware znajduje się w sekcji non-free, więc jej użycie trzeba wymusić.
sudo debootstrap --arch=armel --foreign \ --include=wireless-tools,wpasupplicant,firmware-ralink \ --components=main,contrib,non-free \ stable debian-ac100 http://ftp.pl.debian.org/debian
Pliki zajmą około 146MB. Dodatkowe pakiety zostały pobrane, ale będą rozpakowane dopiero w trakcie etapu IV.
W katalogu, w którym budowane było jądro, należy wykonać:
make INSTALL_MOD_PATH=<ścieżka do katalogu z systemem> modules_install
Na przykład:
make INSTALL_MOD_PATH=../debian-ac100 modules_install
Moduły dla jądra 2.6.37 mają rozmiar 14MB.
System zainstalowany w katalogu debian-arm
powinien zostać jako obraz wybranego systemu plików (ext4
) umieszczony w urządzeniu (partycja 8).
Aby skrócić czas nagrywania obrazu na urządzenie, na początek tworzę plik o rozmiarze 512MB. Po uruchomieniu i skonfigurowaniu systemu będzie można go zwiększyć do rozmiaru pełnej partycji przy pomocy narzędzia resize2fs
. Tworzymy rzadki plik, który będzie obrazem, następnie system plików na nim. Montujemy obraz w katalogu roboczym i kopiujemy do niego pliki.
dd if=/dev/zero of=rootfs.img bs=1M count=1 seek=511 sudo mkfs.ext4 -m0 rootfs.img sudo tune2fs -c0 -i0 rootfs.img sudo mount -o loop rootfs.img /mnt sudo cp -a debian-ac100/* /mnt sudo umount /mnt
Przygotowany w ten sposób plik rootfs.img
należy wgrać do partycji 8 urządzenia. Zostało to opisane poniżej (UWAGA! Przed nagrywaniem czegokolwiek warto wykonać kopię zapasową).
Podczas pierwszego uruchomienia konieczne jest dodanie do parametrów jądra:
rw init=/bin/sh
Należy w tym celu wygenerować odpowiedni obraz do wczytania przez bootloader, a następnie umieścić go w partycji 6.
Po uruchomieniu urządzenia, od razu uzyskujemy dostęp do powłoki administratora. Należy dokończyć instalację:
/debootstrap/debootstrap --second-stage
Aby później możliwe było logowanie, należy ustawić hasło administratora:
passwd root
Do instalacji oprogramowania, konieczne jest skonfigurowanie repozytoriów w pliku /etc/apt/sources.list
:
deb http://ftp.pl.debian.org/debian stable main contrib non-free deb http://security.debian.org/ stable/updates main contrib non-free
Aby wykorzystać cały dostępny obszar partycji na dane, należy zwiększyć system plików tak, aby jego struktury wypełniały całą dostępną przestrzeń. Służy do tego polecenie resize2fs
z pakietu e2fsprogs
. Pozwala ono zwiększać rozmiar zamontowanego systemy plików, o ile jest on spójny (był prawidłowo odmontowany).
resize2fs /dev/mmcblk0p3
Tak spreparowany system można uruchomić normalnie (bez parametru init=
). Zostanie uruchomiony program init
, który wystartuje wszystkie zainstalowane usługi i umożliwi zalogowanie się (standardowo, na konsoli tty1
). Po skonfigurowaniu sieci, można przystąpić do instalacji kolejnych pakietów.
„Zbrikowaie”, czyli zmiana w bardzo drogi przycisk do papieru urządzenia zbudowanego w oparciu o współczesny procesor jest dość trudne. A na pewno nie da się tego zrobić kasując zawartość pamięci wewnętrznej.
W przypadku nieznalezienia nadającego się do uruchomienia programu, procesor przechodzi w tryb bootstrap i można go programować przez port USB. Można również ominąć standardową sekwencję bootowania i przejść od razu do trybu programowania, wciskając podczas uruchamiania urządzenia przyciski Ctrl
i Esc
.
W przypadku urządzenia AC100 łatwo jednak wejść w „ślepą uliczkę” jeżeli nie mamy odpowiednich plików: BCT i bootloadera. Można je pobrać z tej strony lub samemu skopiować z urządzenia. Pliki oraz tablicę partycji uzyskamy po wydaniu następujących poleceń.
nvflash --bl bootloader.bin --go nvflash --resume --getpartitiontable partitiontable.txt for i in 2 3 4 5 6 7 8 9 10 11 12 13; do sudo nvflash --resume --read $i part-$i.img done
W przypadku niektórych wersji programu nvflash
, odczyt czasem zawiesza się. Należy wtedy zrestartować urządzenie, jeszcze raz załadować bootloader (pierwsze polecenie), a następnie kontynuować od nieudanej operacji.
Po wykonaniu kopii zapasowej, można bezstresowo przystąpić do programowania urządzenia.
$ sudo ./nvflash --bct ac100.bct --setbct --configfile linux.cfg --create --bl bootloader.bin --go Nvflash started rcm version 0X20001 System Information: chip name: t20 chip id: 0x20 major: 1 minor: 2 chip sku: 0x8 chip uid: 0x161c11034260e057 macrovision: disabled hdcp: enabled sbk burned: false dk burned: false boot device: emmc operating mode: 3 device config strap: 1 device config fuse: 0 sdram config strap: 1 sending file: ac100.bct - 4080/4080 bytes sent ac100.bct sent successfully downloading bootloader -- load address: 0x108000 entry point: 0x108000 sending file: bootloader.bin / 779268/779268 bytes sent bootloader.bin sent successfully waiting for bootloader to initialize bootloader downloaded successfully setting device: 2 3 creating partition: BCT creating partition: PT creating partition: EBT creating partition: MBR creating partition: LNX creating partition: APP Formatting partition 2 BCT please wait.. done! Formatting partition 3 PT please wait.. done! Formatting partition 4 EBT please wait.. done! Formatting partition 5 MBR please wait.. done! Formatting partition 6 LNX please wait.. done! Formatting partition 7 APP please wait.. done! done! sending file: ac100-bootloader.bin - 1091584/1091584 bytes sent ac100-bootloader.bin sent successfully sending file: linux.img \ 2967552/2967552 bytes sent linux.img sent successfully
Kompletne inicjowanie urządzenia, wgrywanie nowej tablicy partycji i bootloadera, konieczne jest tylko za pierwszym razem. Później do nagrywania nowych wersji jądra i obrazów głównego systemu plików, wystarczy załadować bootloader a następnie nagrać pliki w odpowiednich miejscach:
Bootloader (który uruchamia się w RAM-ie i przyjmuje polecenia):
$ sudo ./nvflash --bl bootloader.bin --go Nvflash started rcm version 0X20001 System Information: chip name: t20 chip id: 0x20 major: 1 minor: 2 chip sku: 0x8 chip uid: 0x161c11034260e057 macrovision: disabled hdcp: enabled sbk burned: false dk burned: false boot device: emmc operating mode: 3 device config strap: 1 device config fuse: 0 sdram config strap: 1 downloading bootloader -- load address: 0x108000 entry point: 0x108000 sending file: bootloader.bin / 779268/779268 bytes sent bootloader.bin sent successfully waiting for bootloader to initialize bootloader downloaded successfully
Jądro:
$ sudo ./nvflash --resume --download 6 linux.img Nvflash started [resume mode] sending file: linux.img \ 2967552/2967552 bytes sent /home/atmel/linux.img sent successfully
I odpowiednio obraz głównego systemu plików:
$ sudo ./nvflash --resume --download 8 rootfs.img
Jądro 2.6.38 skonfigurowane w opisany powyżej sposób, daje dostęp do obu partycji wczytywanych przy starcie przez bootloader: jadra głównego i zapasowego. Można więc nagrywać nowe wersje obrazów do uruchomienia, przy pomocy narzędzia dd
.
Opis tego, jak zainstalować system Debian GNU/Linux na urządzeniu. Procedura dla ludzi, którzy lubią eksperymentować i chcą się czegoś nauczyć. Istnieją prostsze metody zainstalowania systemu (na przykład w Internecie można znaleźć obrazy dystrybucji Ubuntu, gotowe do wgrania do odpowiednich partycji urządzenia).
./mkbootimg --kernel marvin24s-kernel/arch/arm/boot/zImage --ramdisk /dev/null --cmdline 'mem=448M@0M lp0_vec=0x2000@0x1c29e000 tegrapart=recovery:300:a00:800,boot:d00:1000:800,mbr:1d00:200:800 root=/dev/mmcblk0p3 console=tty1 rootwait rw init=/bin/sh' -o linux.img
sudo ./nvflash --bl bootloader.bin --go sudo ./nvflash --resume --download 6 linux.img
III)
sudo ./nvflash --bl bootloader.bin --go sudo ./nvflash --resume --download 8 rootfs.img
init=…
)./debootstrap/debootstrap --second-stage
passwd root
init=…
)../mkbootimg --kernel marvin24s-kernel/arch/arm/boot/zImage --ramdisk /dev/null --cmdline 'mem=448M@0M lp0_vec=0x2000@0x1c29e000 tegrapart=recovery:300:a00:800,boot:d00:1000:800,mbr:1d00:200:800 root=/dev/mmcblk0p3 console=tty1 rootwait' -o linux.img
sudo ./nvflash --bl bootloader.bin --go sudo ./nvflash --resume --download 6 linux.img
root
i korzystaj z Debiana!