Переключение режима 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:
[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* на каждый модем:
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=="12d1", ATTR=="1003", RUN+="usb_modeswitch '/%k'" ACTION=="add", SUBSYSTEM=="usb", ATTRS=="12d1", ATTRS=="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