Конструкция выходного дня. Часть 4 - WiFi и 3G модем

WiFi

Настройка USB WIFI донгла на  базе чипов Realtek RTL8188/RTL8192.

Бродя по конфигу ядра 3.9.11 заметил, что добавлена возможность сборки драйверов USB WiFi  донглов на базе чипов Realtek, Railnk, Atheros и др. Собранное ядро увидело донгл на RTL8192, но со временем начало выдавать ошибку о невозможности загрузить firmware. Пришлось собирать драйвер отдельно. Итак, скачиваем с сайта Realtek архив с исходниками драйверов под нужный чип.  В данном случае версию 4.0.2_9000 для RTL8192CU.

Распаковываем архив и правим Makefile. В нем необходимо указать следующие параметры:

 

  • Путь к компилятору (обязательно к тому же, которым собирается ядро!)
  • Путь к исходникам собираемого ядра
  • Версию ядра

CROSS_COMPILE = /home/evodbg/compiler/gcc-linaro-arm-linux-gnueabi-2012.04-20120426_linux/bin/arm-linux-gnueabi-
KVER = 3.9.11
KSRC = /home/evodbg/Projects/EV-iMX287/linux-3.9.11

Кроме того, необходимо закомментировать следующие строки в файле include/autoconf.h

/*
 * Debug  Related Config
 */
//#define CONFIG_DEBUG_RTL871X
 
#define DBG     0
// #define CONFIG_DEBUG_RTL819X
 
// #define CONFIG_PROC_DEBUG    1
 
//#define DBG_IO
//#define DBG_DELAY_OS
//#define DBG_MEM_ALLOC
//#define DBG_IOCTL
 
//#define DBG_TX
//#define DBG_XMIT_BUF
//#define DBG_TX_DROP_FRAME
 
//#define DBG_RX_DROP_FRAME
//#define DBG_RX_SEQ
//#define DBG_RX_SIGNAL_DISPLAY_PROCESSING
//#define DBG_RX_SIGNAL_DISPLAY_SSID_MONITORED "jeff-ap"
 
//#define DBG_EXPIRATION_CHK
 
//#define DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE
//#define DBG_ROAMING_TEST
 
//#define DBG_HAL_INIT_PROFILING
// #define DBG_MEMORY_LEAK      1
 
// #define DBG_CONFIG_ERROR_DETECT
//#define DBG_CONFIG_ERROR_RESET

Перед тем как собирать драйвер, запустите menuconfig ядра и убедитесь, что следующие опции включены:

Device Drivers --->
[*] Network device support
--- Wireless LAN
< >   USB ZD1201 based Wireless device support
<*>   IEEE 802.11 for Host AP (Prism2/2.5/3 and WEP/TKIP/CCMP)
[*]     Support downloading firmware images with Host AP driver
[*]       Support for non-volatile firmware download
[ ]   TI Wireless LAN support  --->

Если они были отключены, включите их и пересоберите ядро. Теперь соберите driver WiFi командой make. В результате, в папке появится файл 8192cu.ko. Данный файл необходимо скопировать в файловую систему на плату. Загружается он командой:

insmod 8192cu.ko

В файловой системе должны быть собраны wireless-tools и если планируется подключаться к сети с шифрованием wpa_supplicant. Первым делом получим psk для беспроводной сети:

wpa_passphrase Имя_Сети Пароль_сети
network={
        ssid="Имя сети"
        #psk="Пароль сети"
        psk=5579c6f72de6f8eb9ffdf02c5ecf563765423bf1e39dd50f11d0220a6fc534ae
}

Создадим файл /etc/wpa_supplicant.conf

vi /etc/wpa_supplicant.conf
network={
 ssid="Имя сети"
 key_mgmt=WPA-PSK
 group=TKIP CCMP
 pairwise=TKIP CCMP
 proto=WPA WPA2
 psk=5579c6f72de6f8eb9ffdf02c5ecf563765423bf1e39dd50f11d0220a6fc534ae
 }

Подключаемся к сети:

insmod /home/8192.cu.ko
ifconfig wlan0 up
iwconfig wlan0 essid Имя_сети
wpa_supplicant -B -Dwext -i wlan0 -c /etc/wpa_supplicant.conf
iwconfig wlan0
ifconfig wlan0 192.168.0.188 up

3G modem Тестировалось с модемом Huawei E1550, оператор Укртелеком (Utel) В ядре должно быть включено:

Device Drivers  --->
  [*] USB support  --->
    <*>   USB Modem (CDC ACM) support
    <*>   USB Serial Converter support  --->
      [*]   USB Generic Serial Driver
      <*>   USB driver for GSM and CDMA modems
  [*] Network device support  --->
    <*>   PPP (point-to-point protocol) support
    <*>     PPP support for async serial ports

Подключаем USB модем.

[    8.310164] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB0
[    8.337921] option 1-1:1.1: GSM modem (1-port) converter detected
[    8.356780] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB1
[    8.377814] option 1-1:1.2: GSM modem (1-port) converter detected
[    8.396730] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB2

Запускаем wvdialconf

# wvdialconf
Editing `/etc/wvdial.conf'.

Scanning your serial ports for a modem.

ttyUSB0<*1>: ATQ0 V1 E1 -- OK
ttyUSB0<*1>: ATQ0 V1 E1 Z -- OK
ttyUSB0<*1>: ATQ0 V1 E1 S0=0 -- OK
ttyUSB0<*1>: ATQ0 V1 E1 S0=0 &C1 -- OK
ttyUSB0<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 -- OK
ttyUSB0<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 -- OK
ttyUSB0<*1>: Modem Identifier: ATI -- Manufacturer: huawei
ttyUSB0<*1>: Speed 9600: AT -- OK
ttyUSB0<*1>: Max speed is 9600; that should be safe.
ttyUSB0<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 -- OK
ttyUSB1<*1>: ATQ0 V1 E1 -- failed with 2400 baud, next try: 9600 baud
ttyUSB1<*1>: ATQ0 V1 E1 -- failed with 9600 baud, next try: 9600 baud
ttyUSB1<*1>: ATQ0 V1 E1 -- and failed too at 115200, giving up.
ttyUSB2<*1>: ATQ0 V1 E1 -- OK
ttyUSB2<*1>: ATQ0 V1 E1 Z -- OK
ttyUSB2<*1>: ATQ0 V1 E1 S0=0 -- OK
ttyUSB2<*1>: ATQ0 V1 E1 S0=0 &C1 -- OK
ttyUSB2<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 -- OK
ttyUSB2<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 -- OK
ttyUSB2<*1>: Modem Identifier: ATI -- Manufacturer: huawei
ttyUSB2<*1>: Speed 9600: AT -- OK
ttyUSB2<*1>: Max speed is 9600; that should be safe.
ttyUSB2<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 -- OK

Found a modem on /dev/ttyUSB0.
Modem configuration written to /etc/wvdial.conf.
ttyUSB0: Speed 9600; init "ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0"
ttyUSB2: Speed 9600; init "ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0"
#

Как видно из лога, модем определился на /dev/ttyUSB0. Утилита создала файл конфигурации /etc/wvdial.conf. Запускаем wvdial чтобы установить соединение:

# wvdial
--> WvDial: Internet dialer version 1.61
--> Warning: section [Dialer Defaults] does not exist in wvdial.conf.
--> Cannot open /dev/modem: No such file or directory
--> Cannot open /dev/modem: No such file or directory
--> Cannot open /dev/modem: No such file or directory
#

К сожалению, дальше этого продвинуться не удалось. На Debian утилита wvdial прекрасно работала, но собранная в Buildroot работать отказывается.Поиск по форумам показал аналогичные проблемы у других. Разбираться особо не было времени, поэтому настроим модем с помощью pppd из того же Buildroot. Создаем файл /etc/ppp/options-mobile

Со следующим содержимым:

vi /etc/ppp/options-mobile
/dev/ttyUSB0
921600
defaultroute
usepeerdns
crtscts
lock
noauth
local
persist
modem
nopcomp
novjccomp
nobsdcomp
nodeflate
noaccomp
ipcp-accept-local
ipcp-accept-remote
noipdefault

 

Создаем сценарий диалога utel.chat

vi /etc/ppp/utel.chat
ABORT 'BUSY'
ABORT 'NO CARRIER'
ABORT 'VOICE'
ABORT 'NO DIALTONE'
ABORT 'NO DIAL TONE'
ABORT 'NO ANSWER'
ABORT 'DELAYED'
REPORT CONNECT
TIMEOUT 6
'' 'ATQ0'
'OK-AT-OK' 'ATZ'
TIMEOUT 3
'OK-AT-OK' 'ATI'
'OK' 'ATZ'
'OK' 'ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0'
'OK' 'AT\^SYSCFG=2,2,3fffffff,0,1'
'OK-AT-OK' 'AT+CGDCONT=1,"IP","3g.utel.ua"'
'OK' 'ATDT*99***1#'
TIMEOUT 30
CONNECT

Запускаем демона протокола ppp:

pppd /dev/ttyUSB0 460800 modem connect "/usr/sbin/chat -v -f /etc/ppp/utel.chat" defaultroute nodetach ipcp-accept-remote novj mru 1500 mtu 1500 noipdefault usepeerdns user "" password "" &

Смотрим результат:

# pppd /dev/ttyUSB0 460800 modem connect "/usr/sbin/chat -v -f /etc/ppp/utel.cha
t" defaultroute nodetach ipcp-accept-remote novj mru 1500 mtu 1500 noipdefault u
sepeerdns user "" password "" &
# chat:  Jan 01 01:11:54 CONNECT
Serial connection established.
Using interface ppp0
Connect: ppp0 <--> /dev/ttyUSB0
Could not determine remote IP address: defaulting to 10.64.64.64
not replacing existing default route via 192.168.0.1
local  IP address 46.203.26.33
remote IP address 10.64.64.64
primary   DNS address 213.179.249.151
secondary DNS address 213.179.249.152
#

Запускаем ifconfig чтобы посмотреть текущие активные интерфейсы:

# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:04:00:00:00:00
          inet addr:192.168.0.102  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:54 errors:0 dropped:0 overruns:0 frame:0
          TX packets:26 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:7911 (7.7 KiB)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  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)

ppp0      Link encap:Point-to-Point Protocol
          inet addr:46.203.26.33  P-t-P:10.64.64.64  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:9 errors:0 dropped:0 overruns:0 frame:0
          TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:192 (192.0 B)  TX bytes:183 (183.0 B)

#

Примечание: при использовании модема SIM5320 заменяем ttyUSB0 на ttyUSB2.

Отключаем интерфейс eth0 (Ethernet)

ifconfig eth0 down

Пробуем пинговать ukr.net:

# ping ukr.net
ping: bad address 'ukr.net'

Прописываем DNS и gateway:

# echo "nameserver 213.179.249.151" > /etc/resolv.conf
# route add default gw 10.64.64.64
# ping ukr.net
PING ukr.net (212.42.76.252): 56 data bytes
64 bytes from 212.42.76.252: seq=0 ttl=57 time=1415.330 ms
64 bytes from 212.42.76.252: seq=1 ttl=57 time=1023.645 ms
64 bytes from 212.42.76.252: seq=2 ttl=57 time=792.919 ms
# ping google.com
PING google.com (173.194.35.104): 56 data bytes
64 bytes from 173.194.35.104: seq=0 ttl=53 time=1113.641 ms
64 bytes from 173.194.35.104: seq=1 ttl=53 time=250.997 ms

Интернет через 3G модем настроен. Если зайти по адресу 46.203.26.33 можно увидеть нашу web страницу с графиками, описанную в предыдущей части статьи.