Programming, robotics, traveling

24 Jan 2022

Опеределение способов подключения Huawei E352 к Linux

Ранее я писал статью про восстановление модема Huawei E352. В этой я постараюсь разобраться как он отображается в системе и как им можно управлять.

Рассмотрим ещё раз вывод устройств в папке /dev:

> ls -l /dev/
...
drwxr-xr-x 2 root root          80 Jan 22 08:40 bsg
...
crw------- 1 root root    180, 176 Jan 22 08:40 cdc-wdm0
lrwxrwxrwx 1 root root           3 Jan 22 08:40 cdrom -> sr0
...
brw-rw---- 1 root disk      8,   0 Jan 22 08:40 sda
drwxr-xr-x 4 root root          80 Jan 22 08:40 serial
...
crw-rw---- 1 root disk     21,   0 Jan 22 08:40 sg0
crw-rw---- 1 root cdrom    21,   1 Jan 22 08:40 sg1
...
brw-rw---- 1 root cdrom    11,   0 Jan 22 08:40 sr0
...
crw-rw---- 1 root dialout 188,   0 Jan 22 08:40 ttyUSB0
crw-rw---- 1 root dialout 188,   1 Jan 22 08:40 ttyUSB1
crw-rw---- 1 root dialout 188,   2 Jan 22 08:40 ttyUSB2
...

Первое это – bsg или Block SCSI Generic, это директория в которой находятся файлы 0:0:0:0 и 1:0:0:0. Для того, чтобы разобраться больше сделаем вывод dmesg:

usb 1-1.1.3: new high-speed USB device number 39 using dwc_otg
usb 1-1.1.3: New USB device found, idVendor=12d1, idProduct=1506, bcdDevice= 1.02
usb 1-1.1.3: New USB device strings: Mfr=3, Product=2, SerialNumber=0
usb 1-1.1.3: Product: HUAWEI Mobile
usb 1-1.1.3: Manufacturer: HUAWEI

option 1-1.1.3:1.0: GSM modem (1-port) converter detected
usb 1-1.1.3: GSM modem (1-port) converter now attached to ttyUSB0

huawei_cdc_ncm 1-1.1.3:1.1: MAC-Address: 58:2c:80:13:92:63
huawei_cdc_ncm 1-1.1.3:1.1: setting rx_max = 16384
huawei_cdc_ncm 1-1.1.3:1.1: setting tx_max = 16384
huawei_cdc_ncm 1-1.1.3:1.1: NDP will be placed at end of frame for this device.
huawei_cdc_ncm 1-1.1.3:1.1: cdc-wdm0: USB WDM device
huawei_cdc_ncm 1-1.1.3:1.1 wwan0: register 'huawei_cdc_ncm' at usb-3f980000.usb-1.1.3, Huawei CDC NCM device, 58:2c:80:13:92:63

option 1-1.1.3:1.2: GSM modem (1-port) converter detected
usb 1-1.1.3: GSM modem (1-port) converter now attached to ttyUSB1
option 1-1.1.3:1.3: GSM modem (1-port) converter detected
usb 1-1.1.3: GSM modem (1-port) converter now attached to ttyUSB2

usb-storage 1-1.1.3:1.4: USB Mass Storage device detected
scsi host0: usb-storage 1-1.1.3:1.4
usb-storage 1-1.1.3:1.5: USB Mass Storage device detected
scsi host1: usb-storage 1-1.1.3:1.5
scsi 0:0:0:0: CD-ROM            HUAWEI   Mass Storage     2.31 PQ: 0 ANSI: 2
scsi 1:0:0:0: Direct-Access     HUAWEI   SD Storage       2.31 PQ: 0 ANSI: 2
sd 1:0:0:0: Attached scsi generic sg0 type 0
sr 0:0:0:0: [sr0] scsi-1 drive
sr 0:0:0:0: Attached scsi CD-ROM sr0
sr 0:0:0:0: Attached scsi generic sg1 type 5
sd 1:0:0:0: [sda] Attached SCSI removable disk

Раз уж начали с /dev/bsg, сначала закончим с ним. Как видно из вывода:

  • файл /dev/bsg/0:0:0:0 (/dev/sg1) – CD-ROM (Mass Storage), смонтировано в блочное устройство: sr0 (cdrom)
  • файл /dev/bsg/1:0:0:0 (/dev/sg0) – Direct-Access (SD Storage), смонтировано в блочное устройство: sda

Тоже самое можно получить через lsscsi:

> sudo lsscsi
[0:0:0:0]    cd/dvd  HUAWEI   Mass Storage     2.31  /dev/sr0 
[1:0:0:0]    disk    HUAWEI   SD Storage       2.31  /dev/sda
> sudo fdisk -l /dev/sr0 
Disk /dev/sr0: 128 MiB, 134217728 bytes, 65536 sectors
Disk model: Mass Storage    
Units: sectors of 1 * 2048 = 2048 bytes
Sector size (logical/physical): 2048 bytes / 2048 bytes
I/O size (minimum/optimal): 2048 bytes / 2048 bytes

> sudo fdisk -l /dev/sda
fdisk: cannot open /dev/sda: No medium found

MicroSD карта памяти не вставлена, поэтому ожидаемо получили No medium found.

Идём дальше, рассмотрим другие USB устройства на этом порту.

> lsusb -t
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=dwc_otg/1p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 1: Dev 3, If 0, Class=Hub, Driver=hub/3p, 480M
            |__ Port 1: Dev 4, If 0, Class=Vendor Specific Class, Driver=lan78xx, 480M
        |__ Port 2: Dev 51, If 3, Class=Vendor Specific Class, Driver=option, 480M
        |__ Port 2: Dev 51, If 1, Class=Vendor Specific Class, Driver=huawei_cdc_ncm, 480M
        |__ Port 2: Dev 51, If 4, Class=Mass Storage, Driver=usb-storage, 480M
        |__ Port 2: Dev 51, If 2, Class=Vendor Specific Class, Driver=option, 480M
        |__ Port 2: Dev 51, If 0, Class=Vendor Specific Class, Driver=option, 480M
        |__ Port 2: Dev 51, If 5, Class=Mass Storage, Driver=usb-storage, 480M

Как видно из вывода dmesg на USB устройстве 1-1.1.3:1.1 драйвером huawei_cdc_ncm (source code) создано два устройства /dev/cdc-wdm0 и сетевой интерфейс wwan0.

> sudo file /dev/cdc-wdm0
/dev/cdc-wdm0: character special (180/176)

> sudo cat /dev/cdc-wdm0
^STIN: 0, 0, 0
^STIN: 99, 0, 0
^SIMST:1,0
^RSSI: 31
^MODE: 5,4
^RSSI: 26
^ERRRPT:3,7
^SIMST:3,0
^SRVST: 1
^ERRRPT:1,2
^SIMST:4,0

/dev/cdc-wdm0 это часть USB WDM device или CDC-WMC Device Management, по идеи это должен быть интерфейс команд и прерыванию QMI протокола, однако при проверки этого интерфейса утилитами qmicli, mmcli оказалось что это не так, либо он уже перехвачен.

Очень советую прочитать материал Qualcomm Gobi devices on Linux.

Как вывод и проделанных тестов и вывода dmesg – это разновидность NCM в протоколе USB. Вообще чтобы лучше понимать по каким протоколам и как может раздаваться интернет, советую изучить, следующие два материала:

  1. Про протоколы взаимодействия с 3G/LTE-модемом
  2. FOSDEM2013 - Mobile broadband modem control protocols

Ну и остались несколько сериал устройсв:

  • /dev/ttyUSB0 – выводит буквально пару значений начинающихся со знака ^, а также отвечает на AT-команды
  • /dev/ttyUSB1 – ничего не выводит и не отвечает
  • /dev/ttyUSB2 – выводит тоже самое что и /dev/cdc-wdm0, а также отвечает на AT-команды

Для того, чтобы разобраться в них я сделал несколько AT комманд, которые показывают в каких режимах работает модем:

AT^SETPORT?
^SETPORT:A1,A2;1,16,3,2,A1,A2

OK

AT^SETPORT=?
^SETPORT:A1: CDROM
^SETPORT:A2: SD
^SETPORT:A: BLUE TOOTH
^SETPORT:B: FINGER PRINT
^SETPORT:D: MMS
^SETPORT:E: PC VOICE
^SETPORT:1: MODEM
^SETPORT:2: PCUI
^SETPORT:3: DIAG
^SETPORT:4: PCSC
^SETPORT:5: GPS
^SETPORT:6: GPS CONTROL
^SETPORT:16: NCM

OK

AT^GETPORTMODE
^GETPORTMODE: TYPE: WCDMA: huawei,MDM:0,NDIS:1,DIAG:2,PCUI:3,CDROM:4,SD:5

OK

Вывод немного странный, однако судя из него у меня на модеме включены MODEM, PCUI, DIAG, NCM. Из которых MODEM, PCUI, DIAG скорее всего и являются tty-устройствами. Собственно, думаю можно попробовать по одному поотключать PCUI, DIAG.

Другие AT команды:

Как вариант подключения к модему по serial-порту, можно использовать pppd и обертку над ним wvdial:

Sources