Переключение режима USB модема из Mаss Storage в GSM modem в Linux
Переключаем USB 3G модем из режима накопителя в режим GSM modem на Raspbery Pi 3 Model B+.
Теория
Обычно USB модемы имеют 2 режима инициализации в OS - Mass Storage (виртуальный накопитель с драйверами) и GSM модем. Нам нужно указать OS правило - при инициализации, переключать USB модем с определенным VendorId:ProductId в режим GSM modem.
Установка usb-modeswitch
Для одних USB модемов достаточно просто установить утилиту usb-modeswitch и usb-modeswitch-data, которая содержит правила и конфиги переключения режимов для большинства USB устройств. Примечательно, что в OS Raspbian Stretch эта утилита уже установлена.
sudo apt install usb-modeswitch usb-modeswitch-data
После установки usb-modeswitch и подключения USB модема, он может определиться правильно - как GSM modem:
dmesg -T | grep ttyUSB
[2018-05-25 02:42:14] usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB0
[2018-05-25 02:42:14] usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB1
[2018-05-25 02:42:14] usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB2
[2018-05-25 02:42:22] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB3
[2018-05-25 02:42:22] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB4
[2018-05-25 02:42:22] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB5
Также будут доступны по 3 интерфейса /dev/ttyUSB* на каждый модем:
ls -la /dev/ttyUSB*
crw-rw---- 1 root dialout 188, 0 май 25 02:45 /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 1 май 25 02:42 /dev/ttyUSB1
crw-rw---- 1 root dialout 188, 2 май 25 14:48 /dev/ttyUSB2
crw-rw---- 1 root dialout 188, 3 май 25 13:56 /dev/ttyUSB3
crw-rw---- 1 root dialout 188, 4 май 25 02:42 /dev/ttyUSB4
crw-rw---- 1 root dialout 188, 5 май 25 14:48 /dev/ttyUSB5
Но, попадаются модемы с номерами vendor ID и product ID, для которых нужно прописывать правила переключения режима из Mass Storage в GSM modem.
dmesg -T | grep -Pi 'huawei|ttyUSB'
[2018-05-25 02:42:23] scsi 1:0:0:0: Direct-Access HUAWEI MMC Storage 2.31 PQ: 0 ANSI: 2
[2018-05-25 02:42:23] scsi 0:0:0:0: CD-ROM HUAWEI Mass Storage 2.31 PQ: 0 ANSI: 2
[2018-05-25 13:22:13] scsi 2:0:0:0: Direct-Access HUAWEI TF CARD Storage 2.31 PQ: 0 ANSI: 2
Настройка usb-modeswitch
Внимание!
Если совсем ничего не получается, попробуйте очистить логи, перезагрузить сервер и пролистать все новые логи:
sudo rm /var/log/usb_modeswitch_*
cat /var/log/usb_modeswitch_*
Параметры запуска usb-modeswitch
Переключение режима работы модема можно запускать вручную.
Примеры запуска утилиты для ручного переключения режима USB девайса:
sudo usb_modeswitch -v 12d1 -p 1003 -V 12d1 -P 1003 -H
sudo usb_modeswitch -v 12d1 -p 1003 -V 12d1 -P 1003 -d
sudo usb_modeswitch -v 12d1 -p 1003 -V 12d1 -P 1001 -HR -M "55534243123456780000000000000011062000000100000000000000000000"
sudo usb_modeswitch -v 0x12d1 -p 0x1003 -V 0x12d1 -P 0x1001 -J
sudo usb_modeswitch -v 12d1 -p 1003 -V 12d1 -P 1001 -M 55534243123456780000000000000011060000000000000000000000000000
#: Error: can't use storage command in MessageContent with interface 0; interface class is 255, expected 8. Abort
sudo usb_modeswitch -v 0x12d1 -p 0x1003 -V 0x12d1 -P 0x1003 --target-class 0xff -c ./setup/vendors/configs/12d1\:1003
sudo usb_modeswitch -v 12d1 -p 1003 -V 12d1 -P 1003 --target-class 0xff -J
#: No devices in default mode found. Nothing to do.
sudo usb_modeswitch -v 12d1 -p 1003 -H
#: Send old Huawei control message ...
Опции запуска:
-v ID Искать девайс с указанным VendorId
-p ID Искать девайс с указанным ProductId
-V ID Переключить девайс в заданный VendorId
-P ID Переключить девайс в заданный ProductId
-c FILE Указать файл конфигурации с настройками переключения девайса и режима
--target-class 0xff ??
-M Передача какой-то управляющей команды, значение - константа (не разобрался с этим)
-H Режим Huawei
-J Режим Huawei new
-R Перезагрузить USB устройство
-d Отключить накопитель (Mass Storage)
Файлы конфигурации usb-modeswitch
Основной файл конфигурации (активация утилиты, логирование):
sudo leafpad /etc/usb_modeswitch.conf
Примечание
Каталог /etc/usb_modeswitch.d теперь используется для дополнительных файлов конфигурации.
Примеры конфигурации: http://www.draisberghof.de/usb_modeswitch/device_reference.txt
Архив /usr/share/usb_modeswitch/configPack.tar.gz не распакован! Так должно быть?
cp /usr/share/usb_modeswitch/configPack.tar.gz /home/pi/robot/setup/modems-mode-configs
cd /home/pi/robot/setup/modems-mode-configs && sudo tar -xzf configPack.tar.gz
Правила переключения из пакета usb-modeswitch-data
Каталог c правилами подключения девайсов (файлы .rules), с помощью которых можно переключить режим USB устройства при его инициализации:
/lib/udev/rules.d/ # системные правила
/etc/udev/rules.d/ # пользовательские правила
Дефолтные правила переключения режима USB модемов находятся здесь:
cat /lib/udev/rules.d/40-usb_modeswitch.rules
Добавить собственное правило для переключения режима USB модема:
sudo leafpad /etc/udev/rules.d/40-huawei.rules
Правила переключения:
ATTR{idVendor}=="12d1", ATTR{idProduct}=="1003", RUN+="usb_modeswitch '/%k'"
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1003", RUN+="/usr/sbin/usb_modeswitch -v 12d1 -p 1003 -J"
Драйвер
Загрузить другой драйвер и отключить накопитель (как с этим работать?):
# Загрузить драйвер модема и detach накопитель
sudo modprobe usbserial vendor=0x12d1 product=0x1003
sudo usb_modeswitch -v 0x12d1 -p 0x1003 -d
#: OK, driver detached