Pierwsza część arykułu dotycząca opisu urządzenia znajduje się w wątku
viewtopic.php?f=39&t=1219Trzecia część artykułu dotycząca instalacji OpenWrt znajduje się w wątku
viewtopic.php?f=39&t=1231Czwarta część artykułu dotycząca instalacji ArchLinuxa znajduje się w wątku
viewtopic.php?f=39&t=1232BootloaderZastosowany bootloader (uboot) jest bardzo elastyczny i posiada wiele ciekawych właściwości, m.in: możliwość wczytania obrazów z podłączonego nośnika USB czy definiowana makr. Ta właściwość wykorzystana została do uruchomienia innego oprogramowania bez potrzebny kasowania oryginalnej zawartości pamięci flash - po prostu wystarczy zdefiniować w bootladerze konieczność wczytania obrazów z zewnętrznego nośnika. Nie ma też konieczności zapisu ustawień bootloadera - można do celów testowych po prostu wczytać i uruchomić inny obraz w pamięci RAM.
Po podłączeniu interfejsu szeregowego podczas uruchamiania należy nacisnąć dowolny klawisz. Pojawi się znak zachęty
__ __ _ _
| \/ | __ _ _ ____ _____| | |
| |\/| |/ _` | '__\ \ / / _ \ | |
| | | | (_| | | \ V / __/ | |
|_| |_|\__,_|_| \_/ \___|_|_|
_ _ ____ _
| | | | | __ ) ___ ___ | |_
| | | |___| _ \ / _ \ / _ \| __|
| |_| |___| |_) | (_) | (_) | |_
\___/ |____/ \___/ \___/ \__|
** MARVELL BOARD: RD-88F6281A LE
U-Boot 1.1.4 (Feb 2 2010 - 10:13:16) Marvell version: 3.4.25
Mapower version: iConnect 2.1 (512MB) (2010/02/02)
U-Boot code: 00600000 -> 0067FFF0 BSS: -> 006CFB00
Soc: 88F6281 A0 (DDR2)
CPU running @ 800Mhz L2 running @ 266Mhz
SysClock = 266Mhz , TClock = 200Mhz
DRAM CAS Latency = 5 tRP = 5 tRAS = 18 tRCD=6
DRAM CS[0] base 0x00000000 size 256MB
DRAM Total size 256MB 16bit width
Addresses 8M - 0M are saved for the U-Boot usage.
Mem malloc Initialization (8M - 7M): Done
NAND:512 MB
Flash: 0 kB
CPU : Marvell Feroceon (Rev 1)
Streaming disabled
Write allocate disabled
Module 0 is RGMII
Module 1 is TDM
USB 0: host mode
PEX 0: PCI Express Root Complex Interface
PEX interface detected Link X1
Net: egiga0 [PRIME], egiga1
Hit any key to stop autoboot: 0
Marvell>>
I od tej pory można już wydawać polecenia do bootloadera. Obrazy do uruchomienia można załadować albo z tftp albo z podłączonego nośnika na USB. W tym drugim przypadku przed wczytaniem obrazów należy uruchomić jeszcze obsługę USB (polecenie usb_start). Warto spojrzeć także na możliwość tworzenia makr, dzięki czemu obsługa może być mniej uciążliwa.
Instalacja debianaMając już wiedzę z zakresu działania bootloadera można pokusić się o zainstalowanie debiana. Możliwość uruchomienia tej dystrybucji na wielu platformach sprzętowych (w chwili obecnej jest możliwość uruchomienia na ponad 20 architekturach - nie mylić z rodzajem procesora, z czego połowa jest oficjalnie wspierana) przynosi wymierne korzyści w postaci stale utrzymywanej dużej liczby pakietów.
Do instalacji nośnika niezbędne jest posiadanie:
- łącza gigabitowego do internetu (np. do routera lub laptopa - z powodu błędu w instalatorze debiana wymagane jest właśnie łącze gigabitowe dla tych architektur)
- nośnik USB - pendrive, dysk zewnętrzny. Zalecany jest jak najszybszy nośnik
- kabel szeregowy RS232C TTL
Instalacja polega na uruchomieniu instalatora debiana, zainstalowaniu go na nośniku i odpowiedniej konfiguracji bootloadera, a dzięki jego właściwością możemy po prostu uruchomić debiana bez potrzeby jakiejkolwiek zmiany w systemie (np. do sprawdzenia systemu), uruchomić z zewnętrznego nośnika lub zainstalować w pamięci flash.
Cześć wspólnaInstalator można uruchomić albo przez sieć albo z podłączonego pendrive; w tym pierwszym przypadku niezbędne będzie uruchomienie jeszcze serwera tftp. W zależności od wybranej metody instalacji należy ściągnąć dwa pliki instalatora:
uInitrd oraz
uImage i umieścić jest w katalogu głównym serwera tftp lub na pendrive. Nośnik musi być z systemem plików FAT lub Ext2. Podczas instalacji pendrive zostanie przeformatowany i na nim będzie zainstalowany debian. Wszystkie ew. pliki które na nim były zostaną skasowane. Podstawowa instalacja debiana zajmuje ok 400MB, choć system można oczywiście bardziej "odchudzić”.
Kabel szeregowy, kabel sieciowy i pendrive podłączamy do IConnect, włączamy zasilanie. Uruchamiamy całość; podczas startu bootloadera należy go przerwać (nacisnąć dowolny przycisk).
Upewniamy się, że mamy ustawione następujące zmienne środowiskowe:
- arcNumber na 1682
- mainlineLinux na yes
Wystarczy po prostu je wprowadzić:
setenv mainlineLinux yes
setenv arcNumber 1682
saveenv
reset
Teraz w zależności od wybranej metody instalacji należy uruchomić następujące polecenia:
- instalator z usb z systemem plików fat
usb start
fatload usb 0:1 0x01100000 /uInitrd
fatload usb 0:1 0x00800000 /uImage
- instalator z usb z systemem plików ext2
usb start
ext2load usb 0:1 0x01100000 /uInitrd
ext2load usb 0:1 0x00800000 /uImage
- instalator z serwera tftp
setenv serverip 192.168.1.2
setenv ipaddr 192.168.1.1
tftpboot 0x01100000 uInitrd
tftpboot 0x00800000 uImage
W tym ostatnim przypadku serwer tftp musi być dostępny pod adresem 192.168.1.2. Wybieramy oczywiście jedną z metod. Następnie:
setenv bootargs console=ttyS0,115200n8 base-installer/initramfs-tools/driver-policy=most
bootm 0x00800000 0x01100000
Po wykonaniu tych poleceń uruchomiony zostanie normalny instalator debiana, dzięki któremu zainstalujemy system na nośniku. Jeżeli ktoś nigdy nie instalował debiana można posłużyć się szeregiem poradników dostępnych na sieci, choć instalacja sprowadza się w sumie do odpowiadania na pytania i wpisaniu wymaganych danych (loginów i haseł).
Kilka uwag co do instalacji:
- przy partycjonowaniu dysku najlepiej wybrać opcję proponowaną przez instalator - przeznaczenie całego dysku na dystrybuuję z domyślnym podziałem na partycję (/boot, system plików oraz swap). Bardziej zaawansowane osoby mogą dokonać podziału według własnego uznania, ale zalecane jest pozostawienie partycji /boot z systemem plików ext2.
- w pewnym momencie instalacji zostanie wyświetlony komunikat o niemożliwości zainstalowania bootloadera. Należy to zignorować i kontynuować następny krok
- instalator zaproponuje domyślnie zestawy pakietów (np. dla web serwera). Należy to całkowicie zignorować i odznaczyć wszystkie opcje, później będzie można zainstalować wymagane pakiety. Takie postępowanie znacznie przyśpieszy instalacje, bo...
- zastosowanie wolnego nośnika powoduje, że instalacja może potrwać nawet dwie godziny
Po zakończeniu pracy instalatora należy odłączyć nośnik i podłączyć go do "normalnego" linuksa lub systemu, który obsługuje system plików ext2/ext3 (taki powstał na nośniku po instalacji). Bez problemu można posłużyć się systemem LiveCD lub maszyną wirtualną. Nośnik należy zamontować w systemie (o ile nie został zamontowane automatycznie), np.
mkdir -p /tmp/boot
mkdir -p /tmp/fs
mount -t ext2 /dev/sdb1 /tmp/boot
mount -t ext3 /dev/sdb2 /tmp/fs
Nazwy urządzeń zależne są od systemu i należy to uwzględnić wydając te polecenia.
Następnie należy pobrać dwa pliki:
-
uImage i umieścić go w katalogu /tmp/boot (czyli partycji bootującej na nośniku)
-
modules.tar.gz, rozpakować i umieścić w /tmp/fs (czyli w systemie plików), dokładnie w takich katalogach jakie zawarte jest w archiwum.
Przygotowane przeze mnie jądro zawiera obsługą wszystkich podstawowych elementów systemu (RTC, USB, Ethernet, LED, gpio, lm63) oraz interfejsu radiowego. Bazuje na kernelu 2.6.39.4.
Tak przygotowany nośnik należy odłączyć od systemu:
umount /dev/sdb1
umount /dev/sdb2
Następnie znów podłączyć do routera i zaczynamy ostatni etap, czyli przygotowanie bootloadera.
Uruchomienie debiana bez modyfikacji w systemieJest to bardzo przydatna opcja żeby sprawdzić czy przygotowany system po prostu działa lub gdy nie chcemy modyfikować oryginalnego systemu. Po ponownym podłączeniu wszystkiego i przerwaniu bootloadera należy wykonać polecenia
usb start; ext2load usb 0:1 0x00800000 /uImage
setenv bootargs 'console=ttyS0,115200 \
mtdparts=orion_nand:0xc0000@0x0(uboot),0x20000@0xa0000(env),0x300000@0x100000(zImage),\
0x300000@0x540000(initrd),0x1f400000@0x980000(boot) \
root=/dev/sda2 rootdelay=10 3'
bootm 0x00800000
(uwaga: druga linia jest całością! znaku \ nie powinno być tylko kontynuacja linii. Podział został wprowadzony ze względu na znaczną szerokość tekstu. Jeżeli ktoś ma problem z interpretacją zapisu to całe polecenie jest dostępne w pliku:
http://ecco.selfip.net/projekty/iconnect/debian/boot_from_usb.txt)
Należy zauważyć, że rootfs spodziewany jest na drugiej partycji.
Po wykonaniu w/w poleceń zostanie wczytane jądro startowe i uruchomiony system. Możemy teraz zaktualizować go i wykonać dalsze czynności konfiguracyjne czy zainstalować dodatkowe pakiety. Przy pierwszym uruchomieniu należy koniecznie wykonać polecenie:
depmod -a
oraz upewnić się, że mamy zainstalowany demon telentu lub ssh (np. pakiet openssh-server czy dropbear).
Ponieważ ani system ani bootloader nie został zmodyfikowany to po ponownym uruchomieniu zostanie wczytany oficjalny system IConnect. Ponowne uruchomienie debiana wymaga w/w poleceń w bootloaderze. Polecam ten sposób w celu pełnej konfiguracji systemu.
Uruchomienie debiana z modyfikacją bootloaderaJeżeli system został sprawdzony można zmodyfikować bootloader tak, aby zawsze po starcie wczytywał system z nośnika. W tym celu po starcie urządzenie i przerwaniu bootloadera wystarczy wydać polecenia:
setenv bootargs 'console=ttyS0,115200 \ mtdparts=orion_nand:0xc0000@0x0(uboot),0x20000@0xa0000(env),0x300000@0x100000(zImage),\
0x300000@0x540000(initrd),0x1f400000@0x980000(boot) \
root=/dev/sda2 rootdelay=10 3'
setenv bootcmd_usb 'usb start; ext2load usb 0:1 0x00800000 /uImage'
setenv bootcmd 'run bootcmd_usb; bootm 0x00800000; reset'
saveenv
reset
a następnie po prostu zrestartować urządzenie. W/w polecenia to po prostu zapisanie odpowiednich zmiennych środowiskowych bootloadera odpowiadających za automatycznie uruchomienie kodu.
Zaletą takiego rozwiązania jest łatwość wykonania backupu (po prostu kopiujemy zawartość nośnika) a także aktualizacji czy np. zmiany kernela. Nie zmieniamy także zawartości pamięci flash, więc w prosty sposób można wrócić do oryginalnego oprogramowania.
Wadą - konieczność obecności nośnika w urządzeniu, (bo z niego uruchamia się system) i tym samym zajęte jest na stałe jedno gniazdo USB. No i oczywiście leży odłogiem 512MB pamięci flash.
Uruchomienie debiana z wewnętrznej pamięci flashJeżeli mamy już sprawdzony i działający system można go przenieść do pamięci flash. Należy pamiętać że mamy tylko ok 500MB pamięci, co po kompresji pozwoli na zmieszczenie ok 700MB danych - i tyle co najwyżej może liczyć system który chcemy umieścić w pamięci flash.
Procedura będzie działała poprawnie, jeżeli kernel który jest używany w debianie posiada wkompilowany na stałe system plików UBIFS. Kernel pobrany z
http://ecco.selfip.net/projekty/iconnect/debian/ jest prawidłowy i zawiera wkompilowany ten system plików.
Przeniesienie do flash polega na zapisaniu jądra (uImage) w określone miejsce, w pozostałej pamięci utworzenie systemu plików UBIFS (choć można by było zrobić np. jffs) a następnie odpowiednie uruchomienie całości przez bootloader.
1. Uruchamiamy debiana wg metody przedstawionej powyżej. wszystko poniżej wykonujemy z poziomu uruchomionego debiana z konta root
2. Upewniamy się że tablica podziału flash jest identyczna jak ta:
# cat /proc/mtd
dev: size erasesize name
mtd0: 000c0000 00020000 "uboot"
mtd1: 00020000 00020000 "env"
mtd2: 00300000 00020000 "zImage"
mtd3: 00300000 00020000 "initrd"
mtd4: 1f400000 00020000 "boot"
Jeżeli nie - należy poprawnie wprowadzić parametry w bootloaderze (parametry mtdparts).
2. Instalujemy pakiet mtd-utils zawierający zestaw narzędzi do pamięci flash
# apt-get update
# apt-get install mtd-utils
3. Zapisujemy kernel w odpowiednim miejscu we flash
# flash_eraseall -j /dev/mtd2
# nandwrite -pm /dev/mtd2 /boot/uImage
Jeżeli pojawią się błędy należy ponowić operację flash_eraseall/nandwrite
4. Tworzymy system plików UBIFS w pamięci nand. UBIFS jest szybszy i bardziej wydajny niż jffs, najczęściej stosuje się go właśnie dla pamięci nand.
# ubiformat /dev/mtd4 -s 512
# ubiattach /dev/ubi_ctrl -m 4
# ubimkvol /dev/ubi0 -N rootfs -m
5. Należy teraz zamontować flash ze świeżo utworzonym systemem plików ubifs i przekopiować istniejącą strukturę plików
# mkdir -p /mnt/mtd
# mount -t ubifs ubi0:rootfs /mnt/mtd
# mkdir /tmp/root
# sync
# mount -o bind / /tmp/root
# cd /tmp/root
# cp -rf ./ /mnt/mtd
# sync
6. Do zmiany jest nowy plik fstab we flash; należy mu wskazać, że główny system plików to właśnie ubifs. Zmieniamy go na następującą postać (do edycji jest plik /mnt/mtd/etc/fstab)
/dev/root / ubifs defaults,noatime,rw 0 0
proc /proc proc defaults 0 0
7. Ostatnie to odmontowanie zasobów i restart
# cd /
# sync
# umount /tmp/root
# shutdown -r now
Należy zauważyć, że w ten sposób nie został zmodyfikowany system Debiana na nośniku, więc za pomocą prostych poleceń w bootloaderze można uruchomić go niezależnie od tego, co jest aktualnie we flash
8. Po ponownym uruchomieniu przerywamy bootloader i wprowadzamy polecenia
setenv bootargs 'console=ttyS0,115200 \ mtdparts=orion_nand:0xc0000@0x0(uboot),0x20000@0xa0000(env),\
0x300000@0x100000(zImage),0x300000@0x540000(initrd),0x1f400000@0x980000(boot) \
ubi.mtd=4 root=ubi0:rootfs rootfstype=ubifs'
nand read.e 0x2000000 0x100000 0x300000
bootm
(uwaga: pierwsze cztery linie są całością, znaku \ ma nie być a zamiast niego ma się zaczynać następna linia. Jeżeli ktoś ma problem z interpretacją zapisu to całe polecenie jest dostępne w pliku:
http://ecco.selfip.net/projekty/iconnect/debian/boot_from_nand.txt).
9. Jeżeli system się uruchomił i działa poprawnie należy go zrestartować, przerwać bootloader i na stałe zapisać w nim odpowiednie polecenia poleceniami:
setenv bootcmd_nand 'nand read.e 0x2000000 0x100000 0x300000'
setenv bootcmd 'run bootcmd_nand; bootm'
setenv bootargs 'console=ttyS0,115200 \ mtdparts=orion_nand:0xc0000@0x0(uboot),0x20000@0xa0000(env),0x300000@0x100000(zImage),\
0x300000@0x540000(initrd),0x1f400000@0x980000(boot) ubi.mtd=4 \
root=ubi0:rootfs rootfstype=ubifs'
saveenv
(uwaga: pierwsze cztery linie są całością, znaku \ ma nie być a zamiast niego ma się zaczynać następna linia).
W ten oto sposób mamy debiana działającego z pamięci flash. Należy pamiętać o jak namniejszym zużyciu pamięci; np. warto /tmp zamontować jako ramfs.
Zalety - wolne porty USB. Wady - ograniczona pojemnóść systemu plików.
Obsługa sprzętu z poziomu debianaLEDObsługa led jest identyczna jak w openwrt i opisana w tym poradniku:
http://eko.one.pl/?p=openwrt-leds (oczywiście z dokładnością co do poleceń uci, których nie ma w debianie, chodzi o obsługę za pomocą /sys).
Dostępne są następujące ledy:
root@iconnect:/sys/class/leds# ls
led_level
power_red_led
power_blue_led
otb_led
usb_1_led
usb_2_led
usb_3_led
usb_4_led
rt2800pci-phy0::assoc
rt2800pci-phy0::radio
rt2800pci-phy0::quality
Czyli np. można wykonać
# echo heartbeat > /sys/class/leds/power_red_led/trigger
Sensor temperaturyDostęp przez magistalę i2c:
root@iconnect:/# cd /sys/bus/i2c/devices/0-004c/
root@iconnect:/sys/bus/i2c/devices/0-004c# ls
alarms power temp1_max temp2_fault temp2_min_alarm
driver pwm1 temp1_max_alarm temp2_input uevent
hwmon pwm1_enable temp2_crit temp2_max
modalias subsystem temp2_crit_alarm temp2_max_alarm
name temp1_input temp2_crit_hyst temp2_min
Odczyt temperatur wykonujemy przez odczyt plików
temp1_input i temp2_input, np.
root@iconnect:~# cat /sys/bus/i2c/devices/0-004c/temp1_input
36000
root@iconnect:~# cat /sys/bus/i2c/devices/0-004c/temp2_input
36000
PrzyciskiDostępne są przez gpio. Przycisk OTB to gpio 35, przycisk reset - 12. Najpierw należy uczynić je widocznym dla systemu, czyli:
echo 35 > /sys/class/gpio/export
Następnie może odczytać stan przycisku poleceniem
cat /sys/class/gpio/gpio35/value
Dostęp do danych w pamięci flashJeżeli debian jest uruchomiony z zewnętrznego nośnika, to można zamontować wewnętrzną pamięć flash. System plików we flash to UBIFS, który wymaga kilku dodatkowych operacji żeby zobaczyć jego zawartość.
1. "łączymy" pamięć flash z system plików
root@iconnect:~# ubiattach /dev/ubi_ctrl -m 4
[ 3511.047558] UBI: attaching mtd4 to ubi0
[ 3511.051427] UBI: physical eraseblock size: 131072 bytes (128 KiB)
[ 3511.057781] UBI: logical eraseblock size: 129024 bytes
[ 3511.063225] UBI: smallest flash I/O unit: 2048
[ 3511.067954] UBI: sub-page size: 512
[ 3511.072608] UBI: VID header offset: 512 (aligned 512)
[ 3511.078471] UBI: data offset: 2048
[ 3511.485428] UBI: max. sequence number: 1088
[ 3511.505927] UBI: attached mtd4 to ubi0
[ 3511.509702] UBI: MTD device name: "boot"
[ 3511.514650] UBI: MTD device size: 500 MiB
[ 3511.519642] UBI: number of good PEBs: 3995
[ 3511.524488] UBI: number of bad PEBs: 5
[ 3511.528955] UBI: number of corrupted PEBs: 0
[ 3511.533433] UBI: max. allowed volumes: 128
[ 3511.538075] UBI: wear-leveling threshold: 4096
[ 3511.542813] UBI: number of internal volumes: 1
[ 3511.547276] UBI: number of user volumes: 1
[ 3511.551739] UBI: available PEBs: 0
[ 3511.556216] UBI: total number of reserved PEBs: 3995
[ 3511.561201] UBI: number of PEBs reserved for bad PEB handling: 39
[ 3511.567335] UBI: max/mean erase counter: 2/1
[ 3511.571621] UBI: image sequence number: 0
[ 3511.576415] UBI: background thread "ubi_bgt0d" started, PID 1295
UBI device number 0, total 3995 LEBs (515450880 bytes, 491.6 MiB), available 0 LEBs (0 bytes), LEB size 129024 bytes (126.0 KiB)
2. dostępna jest jedna partycja o nazwie "boot" w tym urządzeniu, więc teraz można ją zamontować:
root@iconnect:~# mount -t ubifs ubi0:boot /mnt
[ 3547.516898] UBIFS: mounted UBI device 0, volume 0, name "boot"
[ 3547.522811] UBIFS: file system size: 507967488 bytes (496062 KiB, 484 MiB, 3937 LEBs)
[ 3547.530856] UBIFS: journal size: 25417728 bytes (24822 KiB, 24 MiB, 197 LEBs)
[ 3547.538569] UBIFS: media format: w4/r0 (latest is w4/r0)
[ 3547.544441] UBIFS: default compressor: lzo
[ 3547.548556] UBIFS: reserved for root: 4952683 bytes (4836 KiB)
3. w /mnt mamy już jej zawartość. Oryginalne pliki przechowywane są w postaci jednego pliku będącego kontenerem, zawierającego w sobie filesystem (urządzenie blokowe), więc należy je także zamontować:
root@iconnect:~# ls -al /mnt/images/*
-rwxr-xr-x 1 root root 123654144 Oct 24 1938 /mnt/images/apps
-rwxr-xr-x 1 root root 5242880 Oct 24 1938 /mnt/images/config
-rwxr-xr-x 1 root root 1774212 Oct 24 1938 /mnt/images/initrd
-rwxr-xr-x 1 root root 32768 Oct 24 1938 /mnt/images/oem
-rwxr-xr-x 1 root root 1990980 Oct 24 1938 /mnt/images/zImage
root@iconnect:~# mkdir /tmp/etc
root@iconnect:~# mount -o loop /mnt/images/config /tmp/etc/
[ 3602.754618] EXT2-fs (loop0): warning: mounting unchecked fs, running e2fsck is recommended
W tym przypadku plik "config" to zawartość katalogu /etc oryginalnego oprogramowania.
Aktualizacja: dostępna jest także instalacja debiana bez interfejsu szeregowego, wymagany jest tylko pendrive. Opis:
http://www.congenio.de/infos/iconnect.html (w języku niemieckim, użyj Tłumacza Google).