USB-WiFi modul
USB-WiFi modul je druhým USB zařízením, které si k modulu připojíme přes rozhraní USB host. Modulu SAM9260 tak rázem přibude WiFi rozhraní, takže nebude problém se s ním připojit připojit do počítačové sítě bezdrátově. A to všechno z příkazové řádky bez pomoci nějaké okenní aplikace!
S WiFi to bývalo v Linuxu někdy složité. Naštěstí dnes je už množina WiFi zařízení, které v Linuxu pracují spolehlivě, dostatečně široká. My jsme si jako USB-WiFi zařízení vybrali model TL-WN721N (obrázek 1.3) od firmy TP-LINK. Nabízí dobrou podporu na straně Linuxu, funguje stabilně a stojí jen pár stokorun. V následujících odstavcích si ukážeme, jak USB-WiFi modul rozběhat na modulu SAM9260 pod Linuxem, jak si zkompilovat nástroje pro konfiguraci WiFi připojení z příkazové řádky a jak se připojit k určenému access pointu.
Než začneme
K tomu, abychom úspěšně zprovoznili USB-WiFi modul, bude potřeba do kořenového souborového systému přidat celou řadu souborů. Proto je nutné, abyste si do svého počítače s Linuxem stáhli archivhttp://www.ucsimply.cz/products/modsam9260/ s výchozím obsahem kořenového souborového systému (dále také jako rootfs) a rozbalili jejArchiv s obsahem rootfs rozbalíme příkazem tar xjf nazev_archivu_rootfs. Až do kořenového souborového systému přidáme všechny potřebné soubory, tak jej překonvertujeme do podoby binárního souboru, který pak nahrajeme do paměti NandFlash.
Ovladač, firmware a wireless-tools
K tomu, aby USB-WiFi modul mohl fungovat, potřebujeme dvě věci: za a) ovladač zakompilovaný v jádře (méně běžné) nebo ovladač v podobě modulu jádra, který není součástí monolitu jádra, a který se zavede, až když je potřeba, a za b) firmware, který ovladač nahraje do samotného USB-WiFi modulu. Ovladač zajišťuje, že se modul tváří jako WiFi síťová karta a firmware pak samotnou WiFi funkcionalitu (řízení rádiové části USB-WiFi modulu).
Ovladač
Ve výchozí konfiguraci jádra pro modul SAM9260 je zahrnuta podpora pro většinu dostupných USB-WiFi modulů v podobě modulů jádra. Tyto moduly jádra se kompilují samostatně po kompilaci jádra. Kompilací určitého modulu jádra získáme ovladač pro konkrétní USB-WiFi modul.
Zkompilované moduly jádra (ovladače) jsou už součástí archivu s obsahem kořenového souborového systému, který jsme si stáhli v předešlém kroku. Ovladač pro USB-WiFi modul TL-WN721N je také součástí zmíněného archivu, takže kompilaci příslušného modulu jádra řešit nemusíme.
Firmware
Soubor ar9271.fw s firmware pro modul TL-WN721N je ke stažení zdehttp://git.kernel.org/?p=linux/kernel/git/firmware/linux-firmware.git;a=tree;h=4c79292308ead42fc786c8e189921196ccc298ff;hb=4c79292308ead42fc786c8e189921196ccc298ff. Stáhneme jej a uložíme do adresáře /lib/firmware v kořenovém souborovém systému, který chystáme kvůli USB-WiFi modulu.
Wireless-tools
Wireless-tools je sada nástrojů pro příkazovou řádku, které potřebujeme pro konfiguraci WiFi části USB-WiFi modulu. Dále slouží pro zjištění seznamu dostupných sítí atd. Wireless-tools jsou již postupně nahrazovány balíčkem compact-wirelesshttp://linuxwireless.org/en/users/Download#Compat-wireless_release_types, nicméně stále koexistují spolu a pro naše pokusy budou bohatě dostačovat.
Wireless-tools se musí kompilovat a pak nainstalovat do rootfs. Zdrojové kódy wireless-tools stáhneme odsudhttp://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/wireless_tools.29.tar.gz a to v minimálně ve verzi 27. Níže uvedený návod byl otestován s verzí 29. Wireless-tools budeme kompilovat kompilátorem GNU/Linuxhttp://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/platforms/arm-gnulinux z balíku Sourcery CodeBench Lite Edition. My jsme použili starou verzi, konkrétně 2010.09-50 (ke stažení zdehttp://www.ucsimply.cz/products/modsam9260/).
Postup:
- Rozbalíme stažený archiv se zdrojovými kódy wireless-tools. Vznikne adresář wireless_tools.29:
$ tar xf wireless_tools.29.tar.gz
- Zkompilujeme a nainstalujeme wireless-tools pro modul SAM9260:
- Vstoupíme do adresáře wireless_tools.29:
$ cd wireless_tools.29
- Provedeme nastavení křížového kompilátoru a kompilaci v jednom kroku:
$ make CC=’arm-none-linux-gnueabi-gcc -march=armv5te -mtune=arm926ej-s -mabi=aapcs-linux’ BUILD_STRPPING=’y’ LDFLAGS=’-Wl,-rpath=/usr/lib’
Poznámka: Nastavili jsme, že kompilaci bude provádět křížový kompilátor arm-none-linux-gnueabi-gcc, dále jsme upřesnili cílovou instrukční sadu (armv5te), cílový procesor (arm926ej-s) a typ ABI rozhraní (aapcs-linux). Povolili jsme ořezání spustitelných souborů a nastavili cestu k dynamickým knihovnám pro příkazy z balíku wireless-tool. - Nainstalujeme výsledek kompilace do adresáře /usr/local v rootfs pro modul SAM9260. Cestu k adresáři /usr v našem rootfs nastavíme do proměnné PREFIX. Provést to musíme jako superuživatel root nebo přes příkaz sudo.
# make PREFIX=’/home/emlin/workspace-sam9260/projects/ucsimply/dist/rootfs/usr/’ install
- Protože wireless-tools obsahují dynamické knihovny, musíme aktualizovat cache zavaděče dynamických knihoven. Opět to provedeme jako root:
# ldconfig -v -r /home/emlin/workspace-sam9260/projects/ucsimply/dist/rootfs
- Vstoupíme do adresáře wireless_tools.29:
- Vytvoříme si nový obraz rootfs - viz návod v kapitole http://www.ucsimply.cz/elnx/sam9260-linux-manual/vlastni-firmware/korenovy-souborovy-system/.
- Nový obraz rootfs, kde je přidána podpora USB-WiFi, nahrajeme do modulu SAM9260 do paměti NandFlash pomocí programu SAM-BA.
- Rebootujeme modul a přihlásíme se do Linuxu. Tím jsme připraveni na další část.
WiFi pod Linuxem
Nyní, když máme v kořenovém souborovém systému ovladač, firmware a nástroje wireless-tools, si můžeme ukázat, jak zprovoznit USB-WiFi modul, konkrétně modul TL-WN721N, v prostředí Linuxu. Dost zbytečných řečí. Jdeme na to!
Postup:
- Připojíme modul TL-WN721N do rozhraní USB host (např. prostřednictvím konektoru J17 na základní desce). Systém by měl zareagovat hlášením (adresa se může lišit):
usb 1-1: new full speed USB device using at91_ohci and address 3
- Že je modul TL-WN721N připojený, ověříme ještě výpisem připojených USB zařízení:
# lsusb
Výstup příkazu:Bus 001 Device 001: ID 1d6b:0001 Bus 001 Device 003: ID 0cf3:9271
kde zařízení s ID 0cf3:9271 je náš USB-WiFi modul. - Ručně zavedeme do jádra potřebný ovladač pro modul TL-WN721N:
# modprobe ath9k_htc
Reakce systému na konzoli:usb 1-1: ath9k_htc: Transferred FW: ar9271.fw, size: 51312 usb 1-1: ath9k_htc: HTC initialized with 33 credits usb 1-1: ath9k_htc: USB layer initialized usbcore: registered new interface driver ath9k_hif_usb
V logu jádra bychom měli vidět podobné hlášení, byť trochu obsáhlejší:# dmesg | grep ath
Výstup příkazu:usb 1-1: ath9k_htc: Transferred FW: ar9271.fw, size: 51312 usb 1-1: ath9k_htc: HTC initialized with 33 credits ath: EEPROM regdomain: 0x809c ath: EEPROM indicates we should expect a country code ath: doing EEPROM country->regdmn map search ath: country maps to regdmn code: 0x52 ath: Country alpha2 being used: CN ath: Regpair used: 0x52 Registered led device: ath9k-phy1::radio Registered led device: ath9k-phy1::assoc Registered led device: ath9k-phy1::tx Registered led device: ath9k-phy1::rx usb 1-1: ath9k_htc: USB layer initialized usbcore: registered new interface driver ath9k_hif_usb
- Ověříme, že je v systému zaregistrováno nové bezdrátové síťové rozhraní wlan0
# ifconfig -a
Výstup příkazu:eth0 Link encap:Ethernet HWaddr 02:40:50:60:70:90 inet addr:192.168.1.12 Bcast:0.0.0.0 Mask:255.255.255.0 UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) Interrupt:21 Base address:0x4000 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) wlan0 Link encap:Ethernet HWaddr F8:D1:11:60:37:07 BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Je to v pořádku, rozhraní wlan0 je registrováno, stále ještě ovšem není aktivní (není ve stavu UP) a nemá přidělenu IP adresu. - Spustíme a nakonfigurujeme libovolný bezdrátový access point (AP). Pro jednoduchost budeme používat WEP šifrování, které je sice dnes už prolomitelné, ale zase nás nenutí instalovat a konfigurovat další nástroje pro rozběhání WPA zabezpečení na straně modulu. WiFi část AP nastavíme takto:
- SSID: ucsimply-net
- Šifrování na WEP, 128bit, klíč: d8e48ab6f352ef02268126bf0c (například)
Poznámka: USB-WiFi modul TL-WN721N akceptuje jako WEP klíč pouze 10-ti nebo 26-ti místné hexadecimální číslo. Bitově je pak délka klíče 40, resp. 104 bitů. Náš access point (AP) ovšem podporuje klíče pouze s 64, resp. 128 bitovou délkou. Experimentálně jsme ověřili, že když je klíč na straně modulu TL-WN721N dlouhý 104 a na straně AP 128 bitů, tak je spojení navázáno spolehlivě a je stabilní.Poznámka: Podporované délky WEP klíčů USB-WiFi modulu zjistíme pomocí příkazu:# iwlist wlan0 list
Výstup příkazu:wlan0 2 key sizes : 40, 104bits 4 keys available : [1]: D8E4-8AB6-F352-EF02-2681-26BF-0C (104 bits) [2]: off [3]: off [4]: off Current Transmit Key: [1]
- Aktivujeme bezdrátové síťové rozhraní wlan0 (i když nemá nastavené žádné parametry), abychom skenováním bezdrátových sití ověřili, že USB-WiFi modul ”vidí” náš AP. Pak zase rozhraní wlan0 deaktivujeme:
# ifconfig wlan0 up # iwlist wlan0 scan # ifconfig wlan0 down
- Příklad výsledku skenování bezdrátových sítí v dosahu (ostatní sítě byly pro stručnost vynechány):
Cell 01 - Address: 00:11:09:0C:00:4D Channel:7 Frequency:2.442 GHz (Channel 7) Quality=66/70 Signal level=-44 dBm Encryption key:on ESSID:"ucsimply-net" Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s 36 Mb/s; 48 Mb/s; 54 Mb/s Mode:Master Extra:tsf=00000001344d0179 Extra: Last beacon: 970ms ago IE: Unknown: 000C756373696D706C792D6E6574 IE: Unknown: 010482848B96 IE: Unknown: 030107 IE: Unknown: 2A0100 IE: Unknown: 32080C1218243048606C
Výborně, je evidentní, že USB-WiFi modul na naše AP ”vidí”. Navázání spojení by tedy mělo být úspěšné.- Nastavíme WiFi parametry USB-WiFi modulu (používat budeme příkaz iwconfig z wireless-tools):
- nastavíme mód na managed = WiFi klient:
# iwconfig wlan0 mode managed
- číslo kanálu nastavíme na auto (ať se modul domluví s AP):
# iwconfig wlan0 channel auto
- max. velikost paketu nastavíme na auto:
# iwconfig wlan0 frag auto
- nastavíme identifikátor sítě, kam se chceme připojit na ucsimply-net:
# iwconfig wlan0 essid ucsimply-net
- nastavíme WEP klíč:
# iwconfig wlan0 key d8e48ab6f352ef02268126bf0c
- ověříme, že nastavení bylo přijato:
# iwconfig wlan0
Výstup příkazu:wlan0 IEEE 802.11bgn ESSID:"ucsimply-net" Mode:Managed Access Point: Not-Associated Tx-Power=0 dBm Retry long limit:7 RTS thr:off Fragment thr:off Encryption key:D8E4-8AB6-F352-EF02-2681-26BF-0C Power Management:off
Poznámka: Podle výpisu Access Point: Not-Associated poznáme, že USB-WiFi modul dosud není připojen (asociován) k žádnému AP.
- nastavíme mód na managed = WiFi klient:
- Připojíme se prostřednictvím USB-WiFi modulu k naše mu AP:
- Pro jistotu deaktivujeme drátové síťové rozhraní eth0, aby nekolidovalo s rozhraním wlan0:
# ifdown eth0
Poznámka: Kolizí myslíme použití stejné IP adresy příp. stejné směrovací pravidlo (viz příkaz route). - nastavíme IP adresu pro USB-WiFi modul (nastavením fungující spolupráce s DHCP serverem se nebudeme zdržovat):
# ifconfig wlan0 add 192.168.1.12
- aktivujeme rozhraní wlan0 - tím USB-WiFi modulu přikážeme, aby se připojit k AP:
# ifconfig wlan0 up
Poznámka: Modul TL-WN721N by měl úspěšné připojení k AP indikovat rozsvícením zelené kontrolky na vrchní bílé straně. Pokud tato kontrolka po chvíli zhasne, znamená to, že autentizace u AP neproběhla dobře. Chyba bývá v hodnotě klíče nebo v jeho délce. - Úspěšnost připojení na AP si ověříme podle výpisů z jádra:
# dmesg | tail
Výstup příkazu:wlan0: authenticate with 00:11:09:0c:00:4d (try 1) wlan0: authenticated wlan0: associate with 00:11:09:0c:00:4d (try 1) wlan0: RX AssocResp from 00:11:09:0c:00:4d (capab=0x431 status=0 aid=1) wlan0: associated
- Úspěšnost spojení si ověříme samozřejmě i pomocí příkazu iwconfig:
# iwconfig wlan0
Výstup příkazu:wlan0 IEEE 802.11bgn ESSID:"ucsimply-net" Mode:Managed Frequency:2.442 GHz Access Point: 00:11:09:0C:00:4D Bit Rate=1 Mb/s Tx-Power=20 dBm Retry long limit:7 RTS thr:off Fragment thr:off Encryption key:D8E4-8AB6-F352-EF02-2681-26BF-0C Power Management:off Link Quality=65/70 Signal level=-45 dBm Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 Tx excessive retries:0 Invalid misc:2 Missed beacon:0
Poznámka: Výpis Access Point: 00:11:09:0C:00:4D indikuje, že jsme úspěšně připojeni k AP s danou MAC adresou.
- Pro jistotu deaktivujeme drátové síťové rozhraní eth0, aby nekolidovalo s rozhraním wlan0:
Automatická připojení k AP
Ruční zavádění ovladače a ruční aktivace bezdrátového síťového rozhraní wlan0 není zrovna pohodlná, zvláště,když bychom chtěli, aby se modul SAM9260 připojil do bezdrátové sítě automaticky po nabootování. Náprava je jednoduchá - upravit konfiguraci síťových rozhraní v souboru /etc/network/interfaces a zajistit automatické zavedení ovladače během bootování Linuxu.
Postup:
- Nejprve si zajistíme, že ovladač bude automaticky zaveden během bootování Linux - to nám zajistí uživatelský inicializační skript /etc/init.d/rcS, který prochází soubor /etc/modules a který se všechny v něm uvedené moduly pokusí zavést. V příkazovém řádku modulu zadáme:
# echo "ath9k_htc" >> /etc/modules
- Pak do souboru /etc/network/interfaces doplníme níže uvedené řádky. Využít můžeme editor vi přímo v modulu SAM9260 nebo můžeme soubor upravit v našem počítači v rootfs pro modul, pak si z něj vytvořit obraz rootfs a nahrát tento obraz do modulu SAM9260.Doplněk do souboru /etc/network/interfaces (IP adresu, bránu atd. si upravte dle potřeby):
# Wireless network interface iface wlan0 inet static address 192.168.1.12 netmask 255.255.255.0 gateway 192.168.1.254 # disable wired interface to not collidate with wlan0 pre-up ifdown eth0 &>/dev/null # wireless settings pre-up iwconfig wlan0 mode managed pre-up iwconfig wlan0 channel auto pre-up iwconfig wlan0 frag auto pre-up iwconfig wlan0 essid ucsimply-net pre-up iwconfig wlan0 key d8e48ab6f352ef02268126bf0c # enable wired interface wireless is disabled afterwards post-down ifup eth0 $>/dev/null
Výše uvedené nastavení nám zajistí, že bude možné bezdrátové rozhraní wlan0 de/aktivovat, tj. připojit/odpojit se pomocí příkazu ifup wlan0, resp. ifdown wlan0. Takže už nebudeme muset zadávat žádnou konfiguraci WiFi části, IP adresy apod. Zároveň bude zajištěno, že se automaticky deaktivuje a zpětně aktivuje drátové rozhraní eth0 (kvůli případné kolizi - stejná IP adresa či stejné směrovací pravidlo). Stále však modul nenabootuje a automaticky neaktivuje rozhraní wlan0, ale dle výchozího nastavení drátové rozhraní eth0.
Náprava je jednoduchá - v souboru /etc/network/interfaces stačí zrušit řádek auto eth0 a před řádek iface wlan0 inet static vložit řádek auto wlan0. To můžeme provést přímo z modulu SAM9260 pomocí editoru vi. Další informace o konfiguraci síťových rozhraních naleznete v češtině zdehttp://www.abclinuxu.cz/clanky/system/debian-etc-network-interfaces-konfigurace-sitovych-rozhrani nebo v angličtině zdehttp://www.debian.org/doc/manuals/debian-reference/ch05.en.html#_the_modern_network_configuration_for_desktop.