usb_modeswitch & usb modem
/etc/usb_modeswitch.conf — общий (глобальный) конфигурационный файл для включения функции ведения логов при диагностике, для запрета переключения режимов и др.
Например, установим запрет переключения режимов и включим логирование, т.е. установим значения DisableSwitching=1, DisableSwitching=1
Втыкаем модем, запускаем команду ls /dev/ttyUSB* и . пусто, а также видим, что появился лог
/var/log/usb_modeswitch_4-1.1 — в последней строке которого написано — Switching globally disabled, что мы и осуществили.
Заодно посмотрим наш модем, как он обзывается по дефолту, без переключения режима
lsusb
Bus 004 Device 046: ID 12d1:15ca Huawei Technologies Co., Ltd. E3131 3G/UMTS/HSPA+ Modem (Mass Storage Mode)
Возвращаем дефолтные значения в DisableSwitching=0, DisableSwitching=0 , перетыкаем модем и смотрим как сработало переключение
ls /dev/ttyUSB*
/dev/ttyUSB0 /dev/ttyUSB1 /dev/ttyUSB2
Bus 004 Device 053: ID 12d1:1506 Huawei Technologies Co., Ltd. Modem/Networkcard
И видим, что устройство переключилось в другой режим
было 12d1:15ca (Mass Storage Mode) — стало 12d1:1506 (Modem/Networkcard)
UPD — после изменения параметров и перетыкания модема необходима пауза 10-15с
/etc/usb_modeswitch.d/ — директория для своих файлов конфигурации. Здесь можно добавить новые или измененные файлы конфигурации, которые будут иметь приоритет над набором конфигураций в /usr/share/usb_modeswitch. Сам этого никогда не делал, не представился случай.
/etc/usb_modeswitch.setup — список конфигураций для переключения режимов USB-устройств.
Файл очень содержательный и эта информация очень полезна для использования ручного переключения режимов. Например, посмотрим модем Huawei E1550
cat /etc/usb_modeswitch.setup | grep -C 11 E1550
# Huawei E1550 # Huawei E1750 # # Contributor: Anders Blomdell, Ahmed Soliman DefaultVendor= 0x12d1 DefaultProduct= 0x1446 TargetVendor= 0x12d1 TargetProduct= 0x1001 MessageContent="55534243123456780000000000000011060000000000000000000000000000"
Вообщем то все понятно, кроме одного параметра — MessageContent
Default_VID&PID — это VID&PID до переключения устройства
Target_VID&PID — это VID&PID после переключения устройства
MessageContent — это последовательность из 31 байта, на вид не понятное и страшное, но на самом деле эту последовательность можно легко получить (используя сниффер), если прослушать команду хоста устройству в момент переключения, например, я получил для своего устройства E3131 следующее значение (кстати, в этом файле нет информации как для модема E3131, так и для E3531)
55534243123456780000000000000011062000000101000100000000000000
Но будет еще понятнее, если учесть, что согласно спецификации
— смещение 0 — 3 (1-ые 4 байта, 55534243) это сигнатура и она постоянна для наших модемов
— смещение 15 — 30 это SBW (Command Block Wrapper), но нужны только 1-ые 4 байта (в нашем примере это 11062000). НО, в принципе, достаточно в большинстве случаев только знания 1-го байта (код самой команды SCSI), т.е. в нашем случае это будет 11. И в итоге для моего устройства в полне подходит последовательность (проверено, работает)
55534243000000000000000000000011000000000000000000000000000000
В любом случае, если не известен этот код, всегда можно посмотреть эту последовательность для похожего (близкого) модема в файле /etc/usb_modeswitch.setup, а потом уточнить методом проб и ошибок или, для тех кто знаком, применить сниффер.
Сразу же привожу полный формат команды для ручного переключения режимов (практически срабатывает всегда)
sudo usb_modeswitch -v D_VID -p D_PID -V T_VID -P T_PID -M MC
где
D_VID, D_PID — Default VID&PID (берем из lsusb)
T_VID, T_PID — Target VID&PID (берем из /usr/share/usb_modeswitch/D_VID:D_PID
MC — MessageContent, последовательность из 31 байта — код для переключения (берем из /etc/usb_modeswitch.setup), если нет информации, действуем, как описал выше.
UPD — а вообще советую, как только приобрели модем и он нормально переключается, записать значения Default ID, Target ID, MessageContent из указанных файлов, потом может пригодится в случае проблем с usb_modeswitch. Если информации о значении MessageContent нет, установить ее.
Пример моего устройства, E3131 (а вот AT команда показывает E3531) и, как уже подметил, его нет в файле /etc/usb_modeswitch.setup
cat /etc/usb_modeswitch.setup | egrep ‘E3131|E1550|0x15ca’
. пусто .
но usb_modeswitch переключает и без этого. Но я всеравно нашел для него значение MessageContent (применил сниффер) и если usb_modeswitch по какой то причине глюкнул и не переключает автоматически, я могу выполнить переключение в ручном режиме
sudo usb_modeswitch -v 12d1 -p 15ca -V 12d1 -P 1506 -M 55534243000000000000000000000011000000000000000000000000000000
Кроме того я использую ручное переключение в случае, если автоматичски переключение не работает, а мне нужно пообщаться с модемом, используя AT-команды в Linux, чтобы не запускать для этого винду.
/usr/share/usb_modeswitch/VID:PID — директория, содержащая индивидуальные файлы для каждого устройства в соответствии с их ID. И, как пишут, если имеется файл с даным ID устройства, то имеются все шансы что устройство с данным ID поддерживается, даже если его модель и не совпадает.
Пример для моего устройства (которое, кстати, отсутствует в файле /etc/usb_modeswitch.setup)
cat /usr/share/usb_modeswitch/12d1:15ca
# Huawei E3131 TargetVendor=0x12d1 TargetProduct=0x1506 HuaweiNewMode=1
Если ручное переключение работает и есть желание чтобы это работало автоматически, необходимо создать правило UDEV (как его создавать, не описываю, это уже другая история). Кроме того не описываю и создание своего конфигурационного файла.
И лично мое мнение — я не заморачиваюсь с usb_modeswitch, а с помощью AT команд сразу же перевожу устройство в нужный мне режим, в котором serial port создаются автоматически при наличии нужного модуля (драйвера).
Разумеется все проблемы и нюансы не опишешь, но желательно, в случае проблем с переключением, всегда смотреть появление новых файл-устройств в директории /dev.
Количественное изменение я обычно смотрю командой ls /dev | wc -l
Конкретное появление новых файлов проще узнать так — создаю 2 файла
ls /dev > ~/dev_1 и ls /dev > ~/dev_2 (до и после подключения устройства)
Создаю 2 вертикальных терминала (у меня tilix) и запускаю в каждом из них команду
sed ‘=’ ~/dev_1 | sed ‘N;s/\n/\t/’ , sed ‘=’ ~/dev_2 | sed ‘N;s/\n/\t/’
Сдвигаю их как можно ближе, чтобы легче видеть изменения (ориентируюсь по номерам — после каждого нового появления файла нумерация сдвигается).
Ну вот и все, надеюсь, пригодится.
Gobi Broadband Modems
Qualcomm Gobi is a family of embedded mobile broadband modem products by Qualcomm.
Device identification
Install usbutils and then examine the output of
which will show the vendor and product IDs of the device.
For example, on a HP un2430 modem:
Bus 001 Device 005: ID 03f0:371d Hewlett-Packard
The device is detected by the qcserial module, if not, you are going to have to recompile the qcserial module with your added product and vendor id.
Alternatively you can add the Product and Vendor ID by writing them into the new_id file (best both at the same time because most Gobi modules switch the Product ID when the Firmware is loaded). For example on a Gobi2K with the Vendor ID 04da and the Product IDs 250e (waiting for Firmware) and 250f (firmware loaded)
# echo "04da 250e" > /sys/bus/usb-serial/drivers/qcserial/new_id # echo "04da 250f" > /sys/bus/usb-serial/drivers/qcserial/new_id
note that this has to be repeated when you reload the qcserial module or reboot/shutdown.
gobi_loader
gobi_loader is a firmware loader for Qualcomm Gobi USB chipsets. These devices appear in an uninitialized state when power is applied and require firmware to be loaded before they can be used as modems. gobi_loader adds a udev rule that will trigger loading of the firmware and make the modem usable.
After installation, you should enter your product and vendor id in the /lib/udev/rules.d/60-gobi.rules
Then a simple reload of the qcserial module:
# rmmod qcserial # modprobe qcserial
Manage Connection in Network Manager
ModemManager is required for network manager to detect any mobile broadband devices.
This needs to be started/enabled. As soon as they are started the Mobile Broadband option will be available from the Network Manager Applet.
To use this quite old modem, you need to blacklist qmi_wwan and cdc_wdm modules from loading into [modern] Linux kernel. Else, if these modules are loaded, ModemManager recognizes this modem as something new with QMI interface, and then complains about too small versions of some QMI services. Source
Connection
wvdial
The general procedure is to switch the device into modem mode, make sure the ttyUSB device(s) are recognized by the qcserial kernel module, and then to run wvdial to dial, connect and start pppd.
Install wvdial . The configuration file /etc/wvdial.conf will in general depend on which device you have and which mobile network you are connecting to. A single wvdial.conf can be defined with named sections to be usable with several USB modems and networks, should you need them.
which will attempt to write /etc/wvdial.conf correctly. You will need to add the user, password and Access Point Name (APN). You can obtain these from your network provider, from other users via published wvdial.confs , or by logging the USB tty traffic under another operating system (e.g. Sysinternals’ Portmon).
An example of /etc/wvdial.conf looks like this:
[Dialer status] Init1 = AT+CPIN? Init2 = ATI Modem = /dev/ttyUSB1 [Dialer pin] Modem = /dev/ttyUSB1 Init1 = AT+CPIN=1234 [Dialer wwan] Init1 = ATZ Init2 = AT+CGDCONT=1,"IP","data.apn.com" Stupid Mode = yes Phone = *99***1# New PPPD = yes Modem = /dev/ttyUSB1 Username = XXXXXX Dial Command = ATDT Password = XXXXXX Baud = 460800
To simplify the procedure, one can take the SIM card out and disable the PIN so wvdial pin is not needed before connecting to the internet.
Often there will be several devices (at /dev/ttyUSB0 , /dev/ttyUSB1 , /dev/ttyUSB2 for example). If in doubt about which to use, try each of them in turn. Once the configuration files are prepared, the internet connection is established by running
The final wvdial command should start pppd and the obtained IP address should be visible in the terminal output. At that point the internet connection should be live, which can be easily checked with a web browser or by pinging an external IP address.