Установка HUAWEI EM770W в Linux (Slackware)

Речь пойдёт о стационарном промышленном модеме IRZ ES90PU, в котором основу составляет GSM-модуль HUAWEI MOBILE WCDMA EM770W – так он и определяется в системе. Остальное, по-просту говоря, – радиостанция. Мощность передатчика -250 мВт. Это солидно. Любой “свисток” “отдыхает”.Подробную информацию о модемах этого ряда и других можно найти на сайте radiofid.ru, а также программное обеспечение для установки их в Windows. Там же, в FAQ, есть статья под названием “Установка USB модемов в Linux”.

В этой статье описывается редактирование драйвера cp2101 для другого подобного модема, но это неважно – принцип один. Поскольку изменения касаются ядра системы, то не имеет большого значения, какой дистрибутив, различие только в деталях. Ядро системы не должно быть старее версии 2.6.18 – это важно.

Для чего нужно редактировать драйвер cp2101? Дело в том, что у стационарных промышленных модемов два интерфейса: RS232 и USB, и есть необходимость конвертировать порты USB и COM. Для “свистков” это неактуально. Очень полезная статья “Как “приручить” МТС-модем Huawei E1550” (“свисток”) расположена здесь. Но модем IRZ ES90PU “свободный”, не залочен ни на какого провайдера, виртуальных дисков, которые как бельмо в глазу у линуксоидов, в нём тоже нет. Красота! Сколько проблем отпадает! Но есть одна закавыка…

Ввожу команду:

root@localhost:~# lsmod | grep usb | sort
bfusb 13184 0
bluetooth 58212 7 bnep,rfcomm,l2cap,bfusb,btusb
btusb 15384 0
usbserial 33640 2 cp2101
root@localhost:~#

В последней строчке нет драйвера option! А без него модем HUAWEI работать не будет.

Попытка запустить его с помощью wvdial дала вот что:

root@localhost:~# wvdial
—> WvDial: Internet dialer version 1.60
—> Cannot open /dev/ttyUSB0: No such file or directory
—> Cannot open /dev/ttyUSB0: No such file or directory
—> Cannot open /dev/ttyUSB0: No such file or directory
root@localhost:~#

Команда dmesg тоже не показывала ничего утешительного: все /dev/ttyUSB … disconnected.

Не сразу, а после некоторого периода “битья головой об стену”, я полез в ядро. Опять же, не сразу, а в несколько этапов, с проверками и перезагрузками отредактировал драйверы option и option.mod. Драйверы cp2101 и cp2101.mod я отредактировал ранее. Далее опишу весь процесс.

У меня на ноутбуке Slackware-12.2, версия ядра 2.6.27.7. Файлы, которые я редактировал, находятся по адресу

/lib/modules/2.6.27.7-smp/build/drivers/usb/serial

Есть и другие варианты, но я использовал этот.

Файл cp2101.c

Строка, которую я вставил, отмечена звёздочкой

static struct usb_device_id id_table [] = { { USB_DEVICE(0×0489, 0xE000) }, /* Pirelli Broadband S.p.A, DP-L10 SIP/GSM Mobile */ { USB_DEVICE(0×08e6, 0×5501) }, /* Gemalto Prox-PU/CU contactless smartcard reader */
………………………………………………………………………. { USB_DEVICE(0×10C4, 0xF004) }, /* Elan Digital Systems USBcount50 */ { USB_DEVICE(0×10C5, 0xEA61) }, /* Silicon Labs MobiData GPRS USB Modem */ , / HUAWEI MOBILE WCDMA EM770W */ { USB_DEVICE(0×13AD, 0×9999) }, /* Baltech card reader */ { USB_DEVICE(0×166A, 0×0303) }, /* Clipsal 5500PCU C-Bus USB interface */ { USB_DEVICE(0×16D6, 0×0001) }, /* Jablotron serial interface */ { USB_DEVICE(0×18EF, 0xE00F) }, /* ELV USB-I2C-Interface */ { } /* Terminating Entry */

Файл cp2101.mod.c

Строка, которую я вставил, отмечена звёздочкой.

static const char __module_depends[]
__used
__attribute__((section(”.modinfo”))) =
“depends=usbserial”;
MODULE_ALIAS(“usb:v0489pE000d*dc*dsc*dp*ic*isc*ip*”);
MODULE_ALIAS(“usb:v08E6p5501d*dc*dsc*dp*ic*isc*ip*”);
……………………………………………………………;
MODULE_ALIAS(“usb:v10C4pF004d*dc*dsc*dp*ic*isc*ip*”);
MODULE_ALIAS(“usb:v10C5pEA61d*dc*dsc*dp*ic*isc*ip*”);
MODULE_ALIAS(“usb:v12D1p1404d*dc*dsc*dp*ic*isc*ip”);
MODULE_ALIAS(“usb:v13ADp9999d*dc*dsc*dp*ic*isc*ip*”);
MODULE_ALIAS(“usb:v166Ap0303d*dc*dsc*dp*ic*isc*ip*”);
MODULE_ALIAS(“usb:v16D6p0001d*dc*dsc*dp*ic*isc*ip*”);
MODULE_ALIAS(“usb:v18EFpE00Fd*dc*dsc*dp*ic*isc*ip*”);
MODULE_INFO(srcversion, “37BF8FE6648D5E40DA38016”);

Файл option.c

В этом файле надо вставить две строки. Отмечены звёздочками.

/* Vendor and product IDs */
#define OPTION_VENDOR_ID 0×0AF0
#define OPTION_PRODUCT_COLT 0×5000
#define OPTION_PRODUCT_RICOLA 0×6000
…………………………………………………………….
#define HUAWEI_VENDOR_ID 0×12D1
#define HUAWEI_PRODUCT_E600 0×1001
#define HUAWEI_PRODUCT_E220 0×1003
#define HUAWEI_PRODUCT_E220BIS 0×1004
#define HUAWEI_PRODUCT_E1401 0×1401
#define HUAWEI_PRODUCT_E1403 0×1403
#define HUAWEI_PRODUCT_EM770W 0×1404
#define HUAWEI_PRODUCT_E1405 0×1405
………………………………………………..
#define HUAWEI_PRODUCT_E1418 0×1418
#define HUAWEI_PRODUCT_E1419 0×1419
………………………………………………
#define ZTE_PRODUCT_MF628 0×0015
#define ZTE_PRODUCT_CDMA_TECH 0xfffe
static struct usb_device_id option_ids[] = { { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) }, { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) },
………………………………………………. { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_KOI_NETWORK) }, { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220BIS, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1401, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1403, 0xff, 0xff, 0xff) }, *{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_EM770W, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1405, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1406, 0xff, 0xff, 0xff) },
………………………………………………………… { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1418, 0xff, 0xff, 0xff) },
……………………………………………………………… { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V720) }, /* Novatel Merlin V720/S720/PC720 */ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_U730) }, /* Novatel U730/U740 (VF version) */
………………………………………………………… { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H02) },
……………………………………………………………………………….. { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH) }, { } /* Terminating entry */

Файл option.mod.c
MODULE_ALIAS(“usb:v0AF0p5000d*dc*dsc*dp*ic*isc*ip*”);
MODULE_ALIAS(“usb:v0AF0p6000d*dc*dsc*dp*ic*isc*ip*”);
…………………………………………………….
MODULE_ALIAS(“usb:v0AF0p7100d*dc*dsc*dp*ic*isc*ip*”);
MODULE_ALIAS(“usb:v0AF0p7111d*dc*dsc*dp*ic*isc*ip*”);
MODULE_ALIAS(“usb:v12D1p1001d*dc*dsc*dp*icFFiscFFipFF*”);
MODULE_ALIAS(“usb:v12D1p1003d*dc*dsc*dp*icFFiscFFipFF*”);
MODULE_ALIAS(“usb:v12D1p1004d*dc*dsc*dp*icFFiscFFipFF*”);
MODULE_ALIAS(“usb:v12D1p1401d*dc*dsc*dp*icFFiscFFipFF*”);
MODULE_ALIAS(“usb:v12D1p1403d*dc*dsc*dp*icFFiscFFipFF*”);
MODULE_ALIAS(“usb:v12D1p1404d*dc*dsc*dp*icFFiscFFipFF”);
MODULE_ALIAS(“usb:v12D1p1405d*dc*dsc*dp*icFFiscFFipFF*”);
MODULE_ALIAS(“usb:v12D1p1406d*dc*dsc*dp*icFFiscFFipFF*”);
………………………………………………………..
MODULE_ALIAS(“usb:v12D1p1418d*dc*dsc*dp*icFFiscFFipFF*”);
MODULE_ALIAS(“usb:v12D1p1419d*dc*dsc*dp*icFFiscFFipFF*”);
MODULE_ALIAS(“usb:v1614p0800d*dc*dsc*dp*ic*isc*ip*”);
……………………………………………………..
MODULE_ALIAS(“usb:v19D2p0015d*dc*dsc*dp*ic*isc*ip*”);
MODULE_ALIAS(“usb:v19D2pFFFEd*dc*dsc*dp*ic*isc*ip*”);
MODULE_INFO(srcversion, “9EEB82B0CBBAD461669EA59”);

Вот и всё редактирование. Может быть несколько неуклюже изображено, но, надеюсь, наглядно.

Далее переходим в директорию

root@localhost:/lib/modules/2.6.27.7-smp/build#

и перекомпилируем ядро:

# make
# make modules_install

Перезагружаем компьютер, вводим в консоли dmesg и видим следующее:

…………………………………………………………………….

usb 1-1: new high speed USB device using ehci_hcd and address 2
usb 1-1: configuration #1 chosen from 1 choice
usb 1-1: New USB device found, idVendor=12d1, idProduct=1404
usb 1-1: New USB device strings: Mfr=3, Product=2, SerialNumber=0
usb 1-1: Product: HUAWEI MOBILE WCDMA EM770W
usb 1-1: Manufacturer: HUAWEI Technology
usbcore: registered new interface driver usbserial
usbserial: USB Serial support registered for generic
usbcore: registered new interface driver usbserial_generic
usbserial: USB Serial Driver core
usbserial: USB Serial support registered for GSM modem (1-port)
option 1-1:1.0: GSM modem (1-port) converter detected
usb 1-1: GSM modem (1-port) converter now attached to ttyUSB0
option 1-1:1.1: GSM modem (1-port) converter detected
usb 1-1: GSM modem (1-port) converter now attached to ttyUSB1
option 1-1:1.2: GSM modem (1-port) converter detected
usb 1-1: GSM modem (1-port) converter now attached to ttyUSB2
option 1-1:1.3: GSM modem (1-port) converter detected
usb 1-1: GSM modem (1-port) converter now attached to ttyUSB3
option 1-1:1.4: GSM modem (1-port) converter detected
usb 1-1: GSM modem (1-port) converter now attached to ttyUSB4
option 1-1:1.5: GSM modem (1-port) converter detected
usb 1-1: GSM modem (1-port) converter now attached to ttyUSB5
usbcore: registered new interface driver option
option: USB Driver for GSM modems: v0.7.2
usbserial: USB Serial support registered for cp2101
usbcore: registered new interface driver cp2101
cp2101: Silicon Labs CP2101/CP2102 RS232 serial adaptor driver v0.07
PPP generic driver version 2.4.2
PPP BSD Compression module registered
PPP Deflate Compression module registered
bash-3.1$

Текст означает, что модем подключён и готов к работе.

Снова вводим команду:

root@localhost:~# lsmod | grep usb | sort
bfusb 13184 0
bluetooth 58212 7 bnep,rfcomm,l2cap,bfusb,btusb
btusb 15384 0
usbserial 33640 2 cp2101,option
root@localhost:~#

Лишний раз убеждаемся, что драйвер option установился.
Подключение к интернету

Для начала отредактировал wvdial.conf с помощью qtwvdial. Там есть функция автоматической конфигурации модема. Затем запустил wvdial из консоли:

root@localhost:~# wvdial
—> WvDial: Internet dialer version 1.60
—> Cannot get information for serial port.
—> Initializing modem.
—> Sending: ATZ
ATZ
OK
—> Sending: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
OK
—> Modem initialized.
—> Sending: ATDT*99#
—> Waiting for carrier.
ATDT*99#
CONNECT
—> Carrier detected. Starting PPP immediately.
—> Starting pppd at Sat Sep 10 21:16:39 2011
—> Pid of pppd: 5777
—> Disconnecting at Sat Sep 10 21:16:40 2011
—> The PPP daemon has died: pppd options error (exit code = 2)
—> man pppd explains pppd error codes in more detail.
—> I guess that’s it for now, exiting
—> The PPP daemon has died. (exit code = 2)
root@localhost:~#

Ошибка. Демон PPP не запустился. Это означает, что надо редактировать опции pppd под нужды wvdial. Я махнул на это дело рукой, добавил соответствующую строку инициализации в pppscript и запустил pppd в консоли:

root@localhost:~# ppp-go
root@localhost:~# Serial connection established.
Using interface ppp0
Connect: ppp0 <—> /dev/ttyUSB0
PAP authentication succeeded
Could not determine remote IP address: defaulting to 10.64.64.64
local IP address 77.216.47.105
remote IP address 10.64.64.64

Подключение состоялось!

Положительный результат

Я живу на “фазенде”, в гористой и лесистой местности, домик стоит в низине, в долине ручья. Из провайдеров – только Tele2. Голосовая связь и интернет у них и в лучших условиях поганенькие, а из-за рельефа в нашем медвежьем углу – совсем плохо. Постоянные обрывы связи. Интернет (bluetooth, Nokia2630): входящий – 5 кБ/сек, исходящий – менее 1,5 кБ/сек. Модем IRZ ES90PU увеличил скорость в 3,5 – 4 раза! Это для меня счастье.
Резюме

Я думаю, этот метод можно использовать и для других модемов, если производитель прописан в драйвере option, а конкретный модем – нет. Хотя… как знать.

Проверка баланса

Эту проблемку мне помог решить script.php, который можно скопировать здесь. Скрипт можно обозвать как угодно и разместить где угодно. Затем ввести в консоли команду “php script.php [номер телефона (на теле2 – *105#)]. Скрипт срабатывает, даже если изначально подключения нет. Большое спасибо автору!

11 сентября 2011 г. Автор: lefro


0 0 голосование
закрыто
спасибо
за ваш голос
Если есть желание что-нибудь написать, ЖМИ: Отзывы