MF626
Материал из Gentoo Linux Wiki
Содержание |
[править] ZTE MF626, он же ONDA MT503HS
Данное руководство составлено по мотивам http://www.gentoo.ru/node/12140. Началось всё после того, как я купил данное устройство в комплекте «Билайн. Интернет дома». В коробке оказался USB модем ZTE MF626. Данный модем поддерживает стандарты HSDPA/HSUPA/UMTS 850/1900/2100 МГц и GSM/GPRS/EDGE 850/900/1800/1900 МГц. Также у данного модема имеется скрытое гнездо для внешней антенны (под наклейкой с информацией), трёхцветный индикатор (красный/синий/зелёный) и слот для microSD карты памяти (до 4Gb). В данном модеме применяется технология ZeroCD, поэтому при подключении данный модем сперва представляется как съёмный диск, на котором находятся драйвера для Windows. Для того, чтобы начать работу непосредственно с модемом, нужно "извлечь диск". Существует другой вариант: можно отключить загрузку ZeroCD с помощью специальной утилиты, работающей под Windows. Итак, приступим.
[править] Теперь модемы MF626 с версией прошивки BD_BLNP673M3V1.0.1B02 прошиваются
Для этого необходимо в разрыв провода +5v usb-кабеля (он обычно красный) припаять кнопку (нам необходимо его размыкать). Затем запустить прошивку, при появлении надписи switching in download mode в окне прошивальщика подождать 1-4 сек, разомкнуть провод на долю секунды и замкнуть обратно, затем подождать 2-5 сек, снова разомкнуть на долю секунды и замкнуть обратно. Модем войдет в режим диагностики и начнётся процесс прошивки. В моём случае пауза между появлением "switching in download mode" и первым размыканием составила 2 сек, между первым и вторым размыканием - 2,5-3 сек. Лучше всего потренироваться входу в режим диагностики перед диспетчером устройств в windows - если весь процесс проделан правильно в портах останется только zte diagnostics interface, при этом светодиод модема не будет гореть. То же возможно произвести быстро вынимая и вставляя модем из usb-порта, однако, это неудобно. Модем стабильно прошился на ноутбуке с внешним питанием, через 3х-метровый usb-кабель. При использовании прошивки от Telestra можно удалить CD_STARTUP_FLAG, устройство сразу определится как модем, и будет работать встроенный кардридер (ядро 2.6.31). После прошивки таким способом модем разлочен, и его возможно прошивать ещё раз без всяких ухищрений обычным методом. Инструкция взята отсюда.
ВНИМАНИЕ! модемы запарываются если неправильно шить: как минимум, если не получается сразу ввести в режим диагностики при switching in download mode, нужно немедленно выдернуть модем из usb порта и начать все заново. При этом для модемов MF100 положительный результат все равно не гарантируется.
[править] Подключение модема
В некоторых версиях ядра Linux драйвер usbstorage игнорирует подключение устройств с ZeroCD. Данная модель модема подпадает под это правило, но без команды на извлечения диска модем не подключится. Для того, чтобы начать, вставьте модем в разъём USB компьютера, который поддерживает стандарт USB 2.0 HighSpeed. Если в системном журнале (/var/log/messages или в выводе команды dmesg) вы увидите что-то похожее на
| Code: dmesg |
usb 1-5: new high speed USB device using ehci_hcd and address 9 usb 1-5: configuration #1 chosen from 1 choice
|
это значит, что вам придётся одним из двух способов переключить устройство в режим модема.
[править] С отключением ZeroCD
Если вы не хотите ждать, пока модем переподключится, и не хотите ковыряться в ядре, можно поковыряться в модеме. ;)
Сперва надо скачать и установить в Windows программу QPST от Qualcomm. Сама Qualcomm не распространяет открыто эту программу, но поискав в интернете её можно найти. Далее следует установить её и запустить входящую в неё EFSExplorer, которая позволяет работать с файловой системой устройства. В трее появится значок, при двойном щелчке на котором появляется окно настроек. Выберите в нём вкладку Ports, выберите добавление нового порта и выберите порт к которому прикрепилось устройство. После этого, закройте окно настроек. Соответствующее устройство появилось в окне выбора EFSExplorer.
В корне файловой системе устройства можно найти файл CD_STARTUP_FLAG размером в один байт. Сохраните этот файл на компьютере, и запишите какие права были у него выставлены. После этого данный файл нужно удалить. В результате устройство будет подключаться сразу в режиме модема.
Подобным образом можно запретить требование запросов каждые 2 минуты (нужно удалить один ещё один файл FLAG_NO_DOWNLOAD после этого модем работает без запросов какая сим карта. Однако при этом скорее всего перестанет работать встроенный microSD картридер.
Примечание : 22 апреля 2009 : Файлы CD_STARTUP_FLAG и FLAG_NO_DOWNLOAD в устройстве теперь называются AUTORUN.FLG и NODOWNLOAD.FLG соответственно
[править] Смена идентификатора устройства в ядре
В некоторых случаях после разблокировки (а точнее удаления файла FLAG_NO_DOWNLOAD) модем странным образом меняет идентификатор продукта. В этом случае ядро не сможет его опознать. В таком случае следует проверить вывод lsusb или cat /proc/bus/usb/devices. Если среди прочих, вы увидите строку
| Code: lsusb |
Bus 002 Device 005: ID 19d2:0016 ONDA Communication S.p.A. |
это значит, что модем сменил идентификатор устройства (ProdID). Ядро ожидает, что в режиме модема устройство будет идентифицироваться как 19d2:0031. Простейший способ это исправить --- заменить соответствующий номер в исходных текстах ядра.
Для ядра старше 2.6.28 следует в файле drivers/usb/serial/option.c сделать следующее исправление:
| Code: drivers/usb/serial/option.c |
/*#define ZTE_PRODUCT_MF626 0x0031*/ #define ZTE_PRODUCT_MF626 0x0016 |
После пересборки ядра (со включённым драйвером option модем должен опознаться верно. Однако, устройством модема в этом случае обычно становится /dev/ttyUSB2.
[править] Без отключения ZeroCD
Если после строки configuration #1 chosen from 1 choice в выводе dmesg вы увидите usb-storage: device ignored, то необходимо закомментировать следующий кусок кода:
| Code: /usr/src/linux/drivers/usb/storage/unusual_devs.h |
/* //это знак начала комментария
UNUSUAL_DEV( 0x19d2, 0x2000, 0x0000, 0x0000,
"Onda ET502HS",
"USB MMC Storage",
US_SC_DEVICE, US_PR_DEVICE, NULL,
US_FL_IGNORE_DEVICE),
*/ //это знак конца комментария
|
после этого собрать ядро и перезагрузиться. В результате вы должны увидеть в dmesg примерно следующее:
| Code: dmesg |
usb 1-7: new high speed USB device using ehci_hcd and address 5 usb 1-7: configuration #1 chosen from 1 choice scsi7 : SCSI emulation for USB Mass Storage devices usb 1-7: New USB device found, idVendor=19d2, idProduct=2000 usb 1-7: New USB device strings: Mfr=2, Product=1, SerialNumber=0 usb 1-7: Product: ZTE CDMA Technologies MSM usb 1-7: Manufacturer: ZTE, Incorporated usb-storage: device found at 5 usb-storage: waiting for device to settle before scanning usb-storage: device scan complete scsi 7:0:0:0: CD-ROM ZTE USB SCSI CD-ROM 2.31 PQ: 0 ANSI: 0 sr1: scsi3-mmc drive: 0x/52x cd/rw xa/form2 cdda tray sr 7:0:0:0: Attached scsi CD-ROM sr1 sr 7:0:0:0: Attached scsi generic sg2 type 5 |
После этого следует установить программу emerge usb_modeswitch и настроить её:
DefaultVendor= 0x19d2 DefaultProduct= 0x2000 TargetVendor= 0x19d2 TargetProduct= 0x0031 DetachStorageOnly=1
а также создать правило udev:
SUBSYSTEMS=="usb", ATTRS{idVendor}=="19d2", ATTRS{idProduct}=="2000", RUN+="/usr/sbin/usb_modeswitch; eject /dev/sr1"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="19d2", ATTRS{idProduct}=="0031", RUN+="/sbin/modprobe usbserial vendor=0x19d2 product=0x031"
Теперь, после команды udevadm control --reload-rules и подключения модема, вы должны увидеть приблизительно следующее:
| Code: dmesg |
usb 1-7: new high speed USB device using ehci_hcd and address 5 usb 1-7: configuration #1 chosen from 1 choice scsi7 : SCSI emulation for USB Mass Storage devices usb 1-7: New USB device found, idVendor=19d2, idProduct=2000 usb 1-7: New USB device strings: Mfr=2, Product=1, SerialNumber=0 usb 1-7: Product: ZTE CDMA Technologies MSM usb 1-7: Manufacturer: ZTE, Incorporated usb-storage: device found at 5 usb-storage: waiting for device to settle before scanning usb-storage: device scan complete scsi 7:0:0:0: CD-ROM ZTE USB SCSI CD-ROM 2.31 PQ: 0 ANSI: 0 sr1: scsi3-mmc drive: 0x/52x cd/rw xa/form2 cdda tray sr 7:0:0:0: Attached scsi CD-ROM sr1 sr 7:0:0:0: Attached scsi generic sg2 type 5 usb 1-7: USB disconnect, address 5 usb 1-7: new high speed USB device using ehci_hcd and address 6 usb 1-7: configuration #1 chosen from 1 choice scsi8 : SCSI emulation for USB Mass Storage devices usb 1-7: New USB device found, idVendor=19d2, idProduct=0031 usb 1-7: New USB device strings: Mfr=2, Product=1, SerialNumber=3 usb 1-7: Product: ZTE CDMA Technologies MSM usb 1-7: Manufacturer: ZTE, Incorporated usb 1-7: SerialNumber: 1234567890ABCDEF usb-storage: device found at 6 usb-storage: waiting for device to settle before scanning usb-storage: device scan complete scsi 8:0:0:0: Direct-Access ZTE MMC Storage 322 PQ: 0 ANSI: 2 sd 8:0:0:0: [sdb] Attached SCSI removable disk sd 8:0:0:0: Attached scsi generic sg2 type 0 |
Это значит, что модем найден, а также найдено устройство чтения microSD карт памяти.
[править] Настройка
Наконец, мы прошли треть пути, о, счастливый обладатель ZTE MF626... Теперь нам предстоит узнать, какие команды и как надо передавать модему, чтобы он правильно работал, как подключиться к интернету, и как узнать баланс.
Если посмотреть внимательно на аппаратный интерфейс данного устройства, то можно увидеть следующее:
| Code: /proc/bus/usb/devices |
T: Bus=01 Lev=01 Prnt=01 Port=06 Cnt=01 Dev#= 4 Spd=480 MxCh= 0 D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1 P: Vendor=19d2 ProdID=0031 Rev= 0.00 S: Manufacturer=ZTE, Incorporated S: Product=ZTE CDMA Technologies MSM S: SerialNumber=1234567890ABCDEF C:* #Ifs= 4 Cfg#= 1 Atr=e0 MxPwr=500mA I:* If#= 0 Alt= 0 #EPs= 0 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none) I: If#= 0 Alt= 1 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none) E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms I: If#= 1 Alt= 0 #EPs= 0 Cls=ff(vend.) Sub=ff Prot=ff Driver=usbfs I:* If#= 1 Alt= 1 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=usbfs E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms I:* If#= 2 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage E: Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms I:* If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=usbserial_generic E: Ad=84(I) Atr=03(Int.) MxPS= 64 Ivl=2ms E: Ad=85(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=04(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms |
Как можно увидеть, каждый интерфейс предназначен для определённой цели. Так, третий интерфейс является стандартным преобразователем USB-Serial, к нему подключён драйвер usbserial, и через этот интерфейс осуществляется основной обмен данными. Второй интерфейс предоставляет доступ к карте microSD, и к данному интерфейсу подключён драйвер usb-storage. Первый интерфейс предназначен для отправки специфических команд, речь о которых пойдёт ниже, к нему через usbfs подключена программа, которая выполняется в пространстве пользователя. Нулевой интерфейс предназначен для настройки устройства, именно через него работает программа qpst.
При подключении данного модема к компьютеру, он автоматически подключается к сети, однако через две минуты модем отключается от сети. С помощью обратного инженерного анализа (просматривая обмен данных между устройством и компьютером) работы программы "Билайн. Интернет Дома" удалось установить, что раз в минуту в модем через первый интерфейс следует отсылать командуAT+ZOPERTE="beeline"\r\n. Все остальные команды, а также последовательсти подключения и выключения соединения в отсутствии документации были получены методом обратной разработки.
[править] Команды модема и как их использовать
Основные AT команды модема можно узнать отсюда. Для того, чтобы гарантированно включить модем, надо послать следующую последовательность команд в первый интерфейс:
| Code: |
AT+ZOPERTE="beeline"\r\n AT+ZOPRT=5\r\n AT+ZOPERTE="beeline"\r\n AT+ZSTART\r\n AT+CPBS="SM"\r\n AT+CPMS="SM","SM",""\r\n |
+ZOPRT=5 включает приёмопередатчик модема. Приёмопередатчик всключается около 5 секунд, ещё около 5-10 происходит поиск сети. +ZSTART -- включает некий таймер. Две последние команды указывают, где хранятся SMS сообщения (без этих команд модем раз в секунду пишет сообщение +ZUSIMR: 2). После этого раз в минуту в модем надо посылать первую команду. Для того, чтобы автоматизировать этот процесс, можно использовать эту утилиту (Программу следует собирать с ключём -lusb, и перед этим следует установить библиотеку libusb), либо же залить другую прошивку, после которой "залочка" пропадает.
Чтобы остановить модем, следует отправить следующие команды:
| Code: |
AT+ZSTOPT\r\n AT+ZOPRT=6\r\n |
Первая команда останавливает загадочный таймер, вторая выключает приёмопередатчик.
Чтобы узнать баланс, следует отправить командуAT+CUSD=1,*102#,15\r\nгде *102# - это та команда, с помощью которой можно узнать баланс, набрав её на обычном сотовом телефоне и нажав кнопку вызова. Номер разный для каждого оператора связи. В ответ модем присылает ответ сети в виде текстовой строки, в которой записаны hex значения(sic!) строки сообщения в кодировке UCS-2BE. Если модем не подключён к интернету, то ответ будет передан через третий интерфейс, если модем подключен к интернету, то через первый. Ниже приведён пример программы на языке Python, которая позволяет узнать баланс; Предполагается, что драйвер option создал устройство /dev/ttyUSB1.
В некоторых случаях, при подключении к /dev/ttyUSB1 и /dev/ttyUSB0 модем просто виснет, даже при отключенном, и не разу не подключенном интернете после его подключения к USB входу. В этих случаях, подключение к /dev/ttyUSB2, как ни странно, решает проблему.
| Code: |
#!/usr/bin/python
#coding: utf8
import time, io, tty
def decodeUcs(s1):
s2 = '"'
for i in xrange(0, len(s1)-1, 2):
s2+='\\x'+s1[i:i+2]
return eval(s2+'"').decode('utf_16_be')
def writeToPort(s1):
f.write('\n'+s1+'\r\n')
f.flush()
time.sleep(0.1)
f = io.open('/dev/ttyUSB1', 'w+b', 0)
tty.setraw(f)
writeToPort('AT+CPBS="SM"')
writeToPort('AT+CPMS="SM","SM",""')
writeToPort('AT+ZSNT=0,0,2')
writeToPort('AT+CUSD=1,*102#,15')
print 'Waiting answer...'
for ln in f:
if ln[:5]=='+CUSD':
print decodeUcs(ln[ln.find('"')+1:ln.rfind('"')])
break
f.close()
|
[править] Изменения для версии "Beeline Интернет Дома" B09.
Изменения для новой версии софта RUBLPCMANAGERV1.0.0B09 и прошивки BD_BLNP673M3V1.0.1B02 соответственно.
В новой версии программы команды чуть другие и простым AT+ZOPERTE="beeline" не обойтись.
| Code: |
OUT: AT+CPBS="SM"\r\n
OUT: AT+CPMS="SM","SM",""\r\n
OUT: AT+ZOPRT=6\r\n
^^^^^ остановка цикла
OUT: AT+ZOPRT=5\r\n
^^^^^ запуск нового цикла
OUT: AT+ZSTART\r\n
^^^^^ судя по всему уже не обязателен
IN: +ZOPERTER: 0,XXXXXXXXXXXXXXXX\r\n
^^^^^ запрос от модема. на этот запрос и нужно отвечать
OUT: AT+ZOPERTE=1,YYYYYYYY\r\n
^^^^^ а это наш ответ
IN: +ZOPERTE: 1,1
^^^^^ а это модем сказал что мы угадали
(или 1,0 если не угадали. в этом случае модем краснеет
и перестает работать до следующего перезапуска цикла)
IN: +ZOPERTER: 1,XXXXXXXXXXXXXXXX\r\n
^^^^^ через ~2-3 минуты модем снова задает вопрос
|
Если правильно и быстро (на это есть около 20 секунд) отвечать на все +ZOPERTER: то модем исправно работает, если не отвечать вообще, то модем работает около 3х минут, задает второй вопрос(первый он задает сразу при запуске цикла), ждет 20 секунд ответа, а потом краснеет, рвет соединение и все. А вот теперь самое главное: алгоритм по которому вычисляется это самое YYYYYYYY. Алгоритм есть. Неделя истязаний дизассемблером нового exe'шника от Beeline принесла свои плоды. Код пока очень сырой, т.к. является прямым преобразованием из ASM в C++ (чуть более 1000 строк) :) так что как доведу до ума, куда-нить выложу. Пока модем пашет уже около часа и все ОК. Если есть пожелания пишите на alex@unnamed.tomsk.ru. Утилита для работы под Linux выложена здесь http://www.altcomtsk.info/index.php?option=com_content&view=article&id=46&Itemid=44.
[править] Настройка демона
Чтобы подключаться к интернету (особенно на ноутбуке), следует использовать такие программы как NetworkManager, или Wicd. Но иногда (особенно если Вы используете модем на домашнем компьютере) лучше использовать специфические для дистрибутива способы настройки сети. В Gentoo следует использовать стандартные возможности openrc.
Сперва создайте символьную ссылку /etc/init.d/net.ppp0 на /etc/init.d/net.lo. После этого нужно настроить сервис:
config_ppp0="ppp"
modules_ppp0="usbserial"
link_ppp0="/dev/ttyUSB2"
username_ppp0='beeline'
password_ppp0='beeline'
pppd_ppp0="usepeerdns defaultroute usehostname modem crtscts"
chat_ppp0="
ABORT BUSY
ABORT ERROR
ABORT 'NO ANSWER'
ABORT 'NO CARRIER'
ABORT 'NO DIALTONE'
ABORT 'Invalid Login'
ABORT 'Login incorrect'
TIMEOUT 5
'' '\\d'
'' '\\d'
'' AT
OK 'ATV1'
OK 'ATE0'
OK 'AT&F&D2&C1S0=0'
OK 'ATS7=60S30=0'
OK 'ATS0=0'
TIMEOUT 10
'' ATZ
OK 'AT+CGDCONT=1,\"IP\",\"home.beeline.ru\"'
TIMEOUT 20
OK 'ATDT*99#'
CONNECT ''
TIMEOUT 5
'~--' ''
"
Чтобы автоматизировать действия по управлению модемом без перепрошивки, можно сделать свой стартовый скрипт.
| Code: /etc/init.d/beeline |
#!/sbin/runscript
start()
{
ebegin "Connecting to Beeline - home Internet"
ebegin "Starting mf626-helper"
start-stop-daemon -b -m -p /var/run/beeline -S /usr/local/bin/mf626-helper
eend $?
sleep 10
ebegin "Starting ppp0"
/etc/init.d/net.ppp0 start
eend $?
ebegin "Starting ntp"
/etc/init.d/ntp-client start
eend $?
eend 0
}
stop()
{
ebegin "Disconnecting from Beeline - home Internet"
ebegin "Stopping ntp"
/etc/init.d/ntp-client stop
eend $?
ebegin "Stoppingg ppp0"
/etc/init.d/net.ppp0 stop
eend $?
ebegin "Stopping mf626-helper"
start-stop-daemon -p /var/run/beeline -K /usr/local/bin/mf626-helper
eend $?
eend 0
}
|
Где mf626-helper программа, ссылка на которую уже была выше [1]. При подключении модема, его нужно инициализировать (послать команды, которые уже были перечислены выше), иначе он может отключиться приблизительно через 6 минут.
[править] Полезные советы
- Если модем отключён от интернета, то команды можно посылать и принимать ответ через /dev/ttyUSB0 например так
| Code: |
# echo -e "AT+CFUN=1\r\n" > /dev/ttyUSB0 # echo -e "AT+ZOPERTE=\"beeline\"\r\n" >/dev/ttyUSB0 # cat /dev/ttyUSB0 |
- Если 3G сеть работает в том месте где Вы находитесь, но модем не подключается к ней (индикатор светится синим цветом, а не зелёным), то можно принудительно заставить модем подключаться к 3G сети, а не к GSM. Для этого отправьте команду
AT+ZSNT=2,0,0\r\n
Чтобы включить автоматический выбор сети с приоритетом 3G отправьте командуAT+ZSNT=0,0,2\r\n
больше команд можно найти по ссылке внизу. - Модем может зависать при использовании некоторых ядер и драйвера usbserial. В исходном обсуждении на gentoo.ru есть некоторые предложения как этого избежать. Также там можно узнать что данное устройство хорошо поддерживается драйвером HSO.
- В случае зависания модема с драйвером usbserial и beeline_script есть альтернативное решение - запускать скрипт, отправляющий команду "AT+ZOPERTE..." с помощью cron. Подробности на форуме: UnBeeline.c, Автоматизания с помощью cron.
- На большинстве модемов наблюдается жесткий перегрев и перезагрузка после удаления флагов.....(M02)
- У некоторых (возможно, всех) модемов имеется конструктивная особенность: из-за непродуманного размещения надписей на одной из плат модема (верхняя, где контакты для симкарты) существует вероятность замыкания между заземляющими экранами нижней платы и одной из дорожек на верхней (надпись выполнена в виде отсутствия защитного лака). Проявляется как неожиданная "смерть" модема, полная невозможность его определения в ОС. Лечится заклеиванием надписи куском скотча.
- Иногда возможна проблема, заключающаяся в том, что файл начинает загружаться (или страница открываться), потом всё останавливаетя. После повторного запроса снова начинается скачивание, потом останавливается. Возможная причина - неверные значения MTU и MRU (maximum transmit unit, maximum receive unit). Это максимальный объём пакета, на который будет делиться трафик. Возможно, в настройках провайдера установлено меньшее значение, чем в системе, тогда пакеты начинаются теряться. Узнать текущую величину MTU и MRU можно с помощью команды ifconfig - для требуемого устройства, применительно к модему это будет ppp0. По умолчанию устанавливается 1500 байт. Как узнать требуемое значение MTU/MRU? Это можно сделать с помощью ping:
| Code: |
ping ru.gentoo-wiki.com -s 1500 |
