Produkty Novinky Články Návody Kontakty

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.
obrázek TL-WN721N
Obrázek 1.3 USB-WiFi modul TL-WN721N

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 archivInformationhttp://www.ucsimply.cz/products/modsam9260/ s výchozím obsahem kořenového souborového systému (dále také jako rootfs) a rozbalili jejInformationArchiv 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í zdeInformationhttp://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-wirelessInformationhttp://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 odsudInformationhttp://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/LinuxInformationhttp://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í zdeInformationhttp://www.ucsimply.cz/products/modsam9260/).
Postup:
  1. Rozbalíme stažený archiv se zdrojovými kódy wireless-tools. Vznikne adresář wireless_tools.29:
    $ tar xf wireless_tools.29.tar.gz
    
  2. Zkompilujeme a nainstalujeme wireless-tools pro modul SAM9260:
    1. Vstoupíme do adresáře wireless_tools.29:
      $ cd wireless_tools.29
      
    2. 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.
    3. 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
      
    4. 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
      
  3. Vytvoříme si nový obraz rootfs - viz návod v kapitole Informationhttp://www.ucsimply.cz/elnx/sam9260-linux-manual/vlastni-firmware/korenovy-souborovy-system/.
  4. Nový obraz rootfs, kde je přidána podpora USB-WiFi, nahrajeme do modulu SAM9260 do paměti NandFlash pomocí programu SAM-BA.
  5. 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:
  1. 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
    
  2. Ž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.
  3. 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
    
  4. 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.
  5. 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]
    
  6. 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
    
  7. Příklad výsledku skenování bezdrátových sítí v dosahu (ostatní sítě byly pro stručnost vynechány):
  8. 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é.
  9. Nastavíme WiFi parametry USB-WiFi modulu (používat budeme příkaz iwconfig z wireless-tools):
    1. nastavíme mód na managed = WiFi klient:
      # iwconfig wlan0 mode managed
      
    2. číslo kanálu nastavíme na auto (ať se modul domluví s AP):
      # iwconfig wlan0 channel auto
      
    3. max. velikost paketu nastavíme na auto:
      # iwconfig wlan0 frag auto
      
    4. nastavíme identifikátor sítě, kam se chceme připojit na ucsimply-net:
      # iwconfig wlan0 essid ucsimply-net
      
    5. nastavíme WEP klíč:
      # iwconfig wlan0 key d8e48ab6f352ef02268126bf0c
      
    6. 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.
  10. Připojíme se prostřednictvím USB-WiFi modulu k naše mu AP:
    1. 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).
    2. 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
      
    3. 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.
    4. Ú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
      
    5. Ú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.

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:
  1. 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
    
  2. 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ě zdeInformationhttp://www.abclinuxu.cz/clanky/system/debian-etc-network-interfaces-konfigurace-sitovych-rozhrani nebo v angličtině zdeInformationhttp://www.debian.org/doc/manuals/debian-reference/ch05.en.html#_the_modern_network_configuration_for_desktop.