Переключение режима USB модема из Mаss Storage в GSM modem в Linux

Категория: Raspberry Pi

Переключаем 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