суббота, 16 августа 2014 г.

Настройка модема LTE Huawei E3272 под Linux из коробки

картинка стырена с сайта mts.ru
Речь пойдёт о настройке модема Huawei E3272, известного также под брендами наших мобильных провайдеров:
  • Мегафон М100-4
  • МТС 824F (такая маркировка под крышкой моего)
  • ну и прочее, не суть
Став счастливым обладателем сего модема, перегрузившись из винды в генту, вдруг вспомнил, что не всё так просто с этими модемами.
Вспомнились мучения прошлых лет с написанием скриптов, типа:
#!/bin/sh
#
# This is part 2 of the ppp-on script. It will perform the connection
# protocol for the desired connection.
# Modify: Derek116@huawei.com
#
MYHWPATH=/usr/local/hw_pppd

"$MYHWPATH"/sbin/chat -v \
TIMEOUT 25 \
ABORT '\nBUSY\r' \
ABORT '\nNO ANSWER\r' \
ABORT '\nNO CARRIER\r' \
ABORT '\nRINGING\r\n\r\nRINGING\r' \
ABORT '\nUsername/Password Incorrect\r' \
SAY "Beginning...\n" \
'' AT \
'' ATH0 \
SAY "Dialing up...$TELEPHONE\n" \
OK ATDT$TELEPHONE \
CONNECT \c \
SAY "Logging...\n"
и запуском модема через pon, сопровождавшееся навешиванием ярлыков "для удобства".

В сети есть куча мануалов, как это делать.
"И чем только я его не пробовала" (С):
  • http://habrahabr.ru/post/233007/
  • http://4pda.ru/forum/index.php?showtopic=508842&st=3440
  • остальные ссылки остались в гугле ))
Там используется и usb_modeswitch (переключение в режим модема) и выключение портов некоторых интерфейсов для "корректного" распознавания через AT^SETPORT= в винде через putty (!). К слову, сказать, это я тоже перепробовал. В сети также полно мануалов на эту тему. Говорят, кому-то даже помогло, в том числе, с другими моделями. Но всё это меркнет перед всем тем, что я сейчас расскажу! ;)

Конечно, всё это настравивается через wvdial, или, тот же менеджер NetworkManager (KDE4), но мы не ищем легких путей. К тому же, мне хотелось, чтобы всё работало, как говориться "из коробки" (out-of-the-box), то есть "вставил-нажал-заработало" и еще чего то там показывает:


Оказалось всё намного проще. На разборки ушел день.

Сразу оговорюсь, что Connect Manager работает на Java, поэтому если у вас нет java-vm, стоит позаботится об установке JRE или чего там у вас, у меня icedtea (opensource java-vm).


Поехали! (С)

Вставив модем в USB-порт, увидел:
$ lsusb
Bus 003 Device 014: ID 12d1:1506 Huawei Technologies Co., Ltd. Modem/Networkcard

Модем определился ядром (у меня 3.15.6-gentoo x86_64), однако:
$ usb-devices
I:  If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=02 Prot=62 Driver=(none)
I:  If#= 1 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=02 Prot=61 Driver=(none)
I:  If#= 2 Alt= 0 #EPs= 1 Cls=ff(vend.) Sub=02 Prot=76 Driver=(none)
I:  If#= 3 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
I:  If#= 4 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
Тащим бубен, будут танцы, господа! ;)

Также в X-ах (KDE4) автоматом завелся CDROM-интерфейс с софтом для модема. Очень кстати, потому что он то нам и нужен. Смонтировался из KDE4 вот сюда:
$ mount
/dev/sr1 on /run/media/valek/Connect Manager type iso9660
Смотрим, что там мама завернула на обед в каталоге Connect Manager:


-r-------- 1 valek valek 150608 Jun 23  2013 AutoRun.exe
-r-------- 1 valek valek     45 Sep 15  2012 AUTORUN.INF
-r-------- 1 valek valek     94 Jul  6  2013 autorun.sh
dr-x------ 2 valek valek   4096 Oct 23  2013 Connect Manager
-r-x--x--x 1 valek valek   4747 Jul  6  2013 install_linux
dr-x------ 2 valek valek   4096 Oct 23  2013 Linux
-rw------- 1 root  root   15944 Aug 16 21:14 nohup.out
-r-------- 1 valek valek    338 Jul  6  2013 Readme before installation
-r-------- 1 valek valek    650 Jul  6  2013 Set Whitelist For Connect Manager
-r-------- 1 valek valek 169534 Sep 15  2012 Startup.ico
-r-------- 1 valek valek   2187 Oct 18  2013 SysConfig.dat

Скопируем это куда-нибудь себе:
$ mkdir /tmp/ConnectManager
$ cp -r * /tmp/ConnectManager

Запускаем:
$ sudo ./install_linux
По умолчанию Connect Manager ставится в каталог /usr/local.

Всё должно пройти гладко, за исключением следующего (врядли пофиксили уже):
Install NDIS driver failed.
The compiling environment is not all ready.
Please check gcc, make and kernel buid(/lib/modules/3.15.6-gentoo/build) to be all installed?
Now please enter any key to finish other installations.
Жмём "any key", установка остального завершается. Для решения проблемы с NDIS драйвером, который нам понадобится идём в каталог
/usr/local/Connect_Manager/driver/ndis_driver/ndis_src/src
Стоит сразу оговорится, что по сути этот драйвер и не нужен, можно взять аналогичный из ядра (huawei_cdc_ncm), но об этом позже. Мы же решили из коробки ;)
Поэтому где-то на 2718-й (поиском найти не сложно) строке файла
hw_cdc_driver.c
есть такой код:
if (!net) {
    dbg ("can't kmalloc dev");
    goto out;
}
Комментируем строку, чтоб код выглядел так:
if (!net) {
    //dbg ("can't kmalloc dev");
    goto out;
}
Примечание: процедура лечения ошибки также гуглится в сети, так что это не новое.

Запускаем установку драйвера:
./usr/local/Connect_Manager/driver/install
Теперь всё должно быть ок (NDIS соберётся без ошибки) и мы должны получить нормальный драйвер:
$ usb-devices
T:  Bus=03 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 18 Spd=480 MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=12d1 ProdID=1506 Rev=01.02
S:  Manufacturer=Technology
S:  Product=Mobile
C:  #Ifs= 5 Cfg#= 1 Atr=80 MxPwr=500mA
I:  If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=02 Prot=62 Driver=(none)
I:  If#= 1 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=02 Prot=61 Driver=(none)
I:  If#= 2 Alt= 1 #EPs= 3 Cls=ff(vend.) Sub=02 Prot=76 Driver=huawei_ether
I:  If#= 3 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
I:  If#= 4 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
Одновременно с этим в системе появляется сетевой интефейс ethX (eth0 или eth1,... в общем следующий незанятый). В системах с systemd (например, у меня в Gentoo) вместо openrc интерфейс принимает вид:
enp0s20u1i2
Но не суть, нам он пока не нужен, главное знать, что интерфейс предоставляет доступ к управлению модемом, однако, драйверочек немного кривоват (или только у меня так), и добится появления /dev/cdc-wdm0 у меня так и не получилось. Через cdc-wdm0 используя, например, minicom, можно вертеть модемом как распутной девкой заблагорассудится. В том числе можно снять пресловутый код блокировки оператора. Но нам это не надо. Завести /dev/cdc-wdm0 можно с использованием драйвера ядра cdc_wdm. О его настройке чуть ниже. Итак, идём далее.

Всё дело в яйцах драйверах ядра!

В ядре выбираем к установке через make menuconfig:
Device Drivers
    USB support
        USB Serial Converter support
            USB driver for GSM and CDMA modems


(ставим как модуль = [M])
В описании модуля сказано, что также выберется CONFIG_USB_SERIAL_WWAN=m

Или же просто пишем в .config:
CONFIG_USB_SERIAL_OPTION=m
CONFIG_USB_SERIAL_WWAN=m
Вместо стандартного "изкоробочного" драйвера порта управления модемом можно установить "ядрёный" HUAWEI_CDC_NCM. Думаю, что это даже будет лучшим выбором в пользу первого. Искать здесь:
   Device Drivers
     Network device support (NETDEVICES [=y])
       USB Network Adapters

в .config:
CONFIG_USB_NET_HUAWEI_CDC_NCM=m
CONFIG_USB_NET_CDCETHER=m
CONFIG_USB_NET_CDC_EEM=m
CONFIG_USB_NET_CDC_NCM=m

USB_WDM=m

Также, в ядре необходимо включить поддержку протокола PPP:
-> Device Drivers
    -> Network device support (NETDEVICES [=y])
ну и всякие ему сопутствующие фичи для порядка:
PPP BSD-Compress compression
PPP Deflate compression
PPP MPPE compression (encryption)
PPP over Ethernet
PPP support for async serial ports
PPP support for sync tty ports
в .config это:
CONFIG_PPP=m
CONFIG_PPP_BSDCOMP=m
CONFIG_PPP_DEFLATE=m
CONFIG_PPP_FILTER=y
CONFIG_PPP_MPPE=m
# CONFIG_PPP_MULTILINK is not set
CONFIG_PPPOE=m
CONFIG_PPP_ASYNC=m
CONFIG_PPP_SYNC_TTY=m
Собираем ядро и модули, кому-то просто модули и перезагружаемся, можно попробовать без перезагрузки, должно заработать:


$ genkernel all
$ sudo reboot

В итоге, при подключении модема:
$ usb-devices
T: Bus=03 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 18 Spd=480 MxCh= 0
D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=12d1 ProdID=1506 Rev=01.02
S: Manufacturer=Technology
S: Product=Mobile
C: #Ifs= 5 Cfg#= 1 Atr=80 MxPwr=500mA
I: If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=02 Prot=62 Driver=option
I: If#= 1 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=02 Prot=61 Driver=option
I: If#= 2 Alt= 1 #EPs= 3 Cls=ff(vend.) Sub=02 Prot=76 Driver=huawei_ether
I: If#= 3 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
I: If#= 4 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
Правда, инициализируется он долго, так же как в Windows по времени.
В устройствах /dev должны появится:


/dev/ttyUSB_utps_modem  
/dev/ttyUSB_utps_pcui
Впрочем, для управления модемом можно было ограничится включением модуля usbserial в ядре и всё тоже бы замечательно работало только через
/dev/ttyUSB0
/dev/ttyUSB1
Но! Мы же не ищем лёгких путей. ;)

Если вдруг в /dev/tty* ничего не появится, можно прописать в /etc/modprobe.d/usbserial.conf такую строку:
options vendor=0x12d1 product=0x1506

Итак, осталось еще рассказать про /dev/cdc-wdm0
   Device Drivers
     Network device support (NETDEVICES [=y])
       USB Network Adapters       Multi-purpose USB Networking Framework (USB_USBNET [=m])
выбираем:
CDC MBIM support
в .config:
CONFIG_USB_NET_CDC_MBIM=m
Вообще говоря, модули я выбирал опытным путём, читая описание к ним, поэтому может быть какой-то момент упустил. ;)

После сборки этого модуля появляется интерфейс /dev/cdc-wdm0. Можно попробовать покрутить настройки через minicom.
А потому немного про AT^SETPORT, раз уж речь о нём ходит гуглами.
Проверка текущих портов:
AT^SETPORT?
Вывод доступных портов:
AT^SETPORT=?
Установка нужных портов:
AT^SETPORT="A1,A2;62,61,76,A1,A2"
Отключить CDROM-порт и флэшку:
AT^SETPORT="A1,A2;62,61,76"
Примечание: иногда почему-то глючит и выдает ERROR, для этого просто повторяем команду. Для принятия настроек просто заново вставляем модем в USB-порт.
Порты 62, 61 - это и есть наши /dev/ttyUSB_utps_modem и
/dev/ttyUSB_utps_pcui, а порт 76 - тот самый, управляющий. Их мы выдели выше:


$ usb-devices
T:  Bus=03 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 18 Spd=480 MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=12d1 ProdID=1506 Rev=01.02
S:  Manufacturer=Technology
S:  Product=Mobile
C:  #Ifs= 5 Cfg#= 1 Atr=80 MxPwr=500mA
I:  If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=02 Prot=62 Driver=option
I:  If#= 1 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=02 Prot=61 Driver=option
I:  If#= 2 Alt= 1 #EPs= 3 Cls=ff(vend.) Sub=02 Prot=76 Driver=huawei_ether
I:  If#= 3 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
I:  If#= 4 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage

Ну вот, пожалуй, и всё! Никаких usb_modeswitch и прочего я не использовал. Никаких скриптов, костылей. Все чаты дозвона модуля уже есть в ПО модема.


Из меню запускаем нашего тушканчика Connect Manager и наслаждаемся картинкой.

Работает:
  • Переключение между режимами сети
  • Настройка языка
  • Отправка и получение SMS
  • Отправка USSD

Не работает (у меня):
  • показ полученного и отправленного трафика (как в Windows)
  • текущая скорость (как в Windows)
Впрочем, оно мне и не надо, я добился своей цели "вставил-нажал-заработало" и вроде как красиво.
Проблемы (опять же, может только у меня):
  • при подключении модема он корректно обнаруживается, запускается Connect Manager автоматически и сам закрывается (даже если он был открыт до подключения модема). В этом случае просто перезапускаем Connect Manager.
  • при подключении к сети, будто бы подвисает интерфейс, то есть замирает на месте "подключение к сети", однако, это похоже баг Java. Этот вопрос относится к тому, что "не работает". При нажатии кнопки "Отмена", происходит корректное отключение от сети.
  • меня одолела лень )) 
Всем удачи! ;)


Комментариев нет:

Отправить комментарий

Постоянные читатели