Rozšíření komunitní dokumentace o sekci LTE USB modemy

Myslím, že ten Huawei E3372h-153 podporuje NCM, ne QMI (to je proprietární protokol Qualcommu, i když nějaké Huaweie to asi taky podporují, tahle E3372 má nějaký HiSilicon Balong).

Každopádně já jsem to přes to NCM zatím nerozchodil. PPP funguje na první dobrou.
NCM jsem zkoušel podle tohoto návodu (na čistém LEDE 17.01.04 na Netgear WNDR3700v4, na Turris Omnia mě to teprve čeká):
https://wiki.openwrt.org/doc/recipes/ethernetoverusb_ncm

  1. Zařízení /dev/cdc-wdm0 se korektně objeví.
  2. V repository LEDE není balík luci-proto-ncm, /etc/config/network jsem tudíž nastavil ručně podle jejich wiki.
  3. Ačkoli konfiguraci mám podle wiki, jen jsem samozřejmě změnil APN a PIN, tak jsem z logu vyčetl, že to má problém s PINem (který je určitě správně, ve Windows i v PPP režimu funguje).

U těch Huaweiů se ještě sluší asi zmínit pár věcí, které jsou důležité, pokud byste potřebovali flashovat firmware:

  1. E3372h není to samé jako (starší?) E3372s (a zřejmě to příliš nesouvisí s HiLink vs. Stick režimem, jak by se mohlo na první pohled zdát – obě varianty HW mohou fungovat v obou režimech podle firmware, přičemž každá verze HW má svoji větev firmware, který není navzájem zaměnitelný.
  2. Záleží také na čísle za tím modelem, u nás se prodává E3372h-153, různě na internetech se objevuje třeba varianta E3372h-607 (asi nějaká indická varianta?). Opět pozor.
  3. Existují dvě varianty firmware - tzv. „HiLink“ (kdy zařízení samo routuje/NATuje, stará se o to bezdrátové připojení atd., myslím, že to používá protokol RNDIS) začíná 22.x.y.z; tzv. „Stick“ (kdy to podporuje PPP nebo NCM) začíná 21.x.y.z.

Mezi tou HiLink a Stick variantou firmware (22 × 21) by mělo být možné celkem bez problémů flashovat, ale internety jsou plné návodů, které k tomu používají velmi pochybný Windows-only software (některý dokonce dost agresivně kontroluje, zda nemáte nainstalované něco jako usbpcap pro zachytávání komunikace, asi abyste neodhalili jejich supertajné AT příkazy) a různé online kalkulačky pro odemknutí update podle IMEI atd. Jako např. http://blog.asiantuntijakaveri.fi/2015/07/convert-huawei-e3372h-153-from.html

Mně se nakonec na flashnutí donglu (i bricknutého, který nešel flashnout jedním z těch stovek návodů pro Windows) osvědčilo tohle:
http://www.0xf8.org/2017/01/flashing-a-huawei-e3372h-4g-lte-stick-from-hilink-to-stick-mode/
Konkrétně tam odkazované nástroje



Jelikož se to flashuje v nějakém low-level vývojářském režimu, není potřeba žádný klíč počítaný z IMEI atd.

Oproti návodu jen dvě drobnosti

  1. Umí to pracovat i s firmware zabaleným v .exe instalátoru/nástroji od Huawei, takže se nemusíte marně pídit po .bin.
  2. Nakonec mi fungoval balongflash na /dev/ttyUSB2, nikoli /dev/ttyUSB0. V tom mě nakopnul tento návod, taky myslím užitečný: http://markus.relix.de/index.php/Set_Huawei_E3372h_from_hilink_to_stick_mode

Možná by bylo fajn tyhle CLI nástroje mírně zauditovat (a zlokalizovat z ruštiny do angličtiny/češtiny :smiley: ) a zkompilovat pro Turrise (a dát do repository)? Zkompiloval jsem to jinak bez větších potíží na Fedoře na Raspberry Pi 2. :slight_smile:
Má tam k těm huhlavejům/Balongům i nějaké další nástroje, grafické, psané v Qt (např. tu počítačku klíčů z IMEI).

Jenom jeden drobnej warning:

~/h/balongflash> make all
gcc -O2 -Wunused -Wno-unused-result -D BUILDNO=279  -D_7ZIP_ST -lz    -c -o balong_flash.o balong_flash.c
gcc -O2 -Wunused -Wno-unused-result -D BUILDNO=279  -D_7ZIP_ST -lz    -c -o hdlcio_linux.o hdlcio_linux.c
gcc -O2 -Wunused -Wno-unused-result -D BUILDNO=279  -D_7ZIP_ST -lz    -c -o ptable.o ptable.c
gcc -O2 -Wunused -Wno-unused-result -D BUILDNO=279  -D_7ZIP_ST -lz    -c -o flasher.o flasher.c
gcc -O2 -Wunused -Wno-unused-result -D BUILDNO=279  -D_7ZIP_ST -lz    -c -o util.o util.c
gcc -O2 -Wunused -Wno-unused-result -D BUILDNO=279  -D_7ZIP_ST -lz    -c -o signver.o signver.c
gcc -O2 -Wunused -Wno-unused-result -D BUILDNO=279  -D_7ZIP_ST -lz    -c -o lzma/Alloc.o lzma/Alloc.c
gcc -O2 -Wunused -Wno-unused-result -D BUILDNO=279  -D_7ZIP_ST -lz    -c -o lzma/LzmaDec.o lzma/LzmaDec.c
lzma/LzmaDec.c: In function ‘lzma_decode’:
lzma/LzmaDec.c:1113:3: warning: ‘memcpy’ writing 8 bytes into a region of size 4 overflows the destination [-Wstringop-overflow=]
   memcpy(&outsize,inbuf+5,  8);
   ^~~~~~~~~~~~~~~~~~~~~~~~~~
Current buid: 279

Až se k tomu Huawei zase dostanu (teď jsem to na pár týdnů půjčil), tak zkusím i nějaké informace odsud
http://nebezpecnyvynalezce.blogspot.cz/2016/09/openwrtlede-huawei-e3372.html?showComment=1513792872864#c8851284484535205652 (možná byla chyba v tom network configu používat device /dev/cdc-wdm0, měl jsem zkusit /dev/ttyUSB0)
https://lists.openwrt.org/pipermail/openwrt-devel/2016-March/040488.html
https://gist.github.com/artizirk/20acc2ab07fe6cad9fcc
https://forum.openwrt.org/viewtopic.php?pid=218745#p218745

Ten luci-proto-ncm je v openwrt masteru, tak snad to časem probublá i do TurrisOS…?

1 Like

No, tak jsem se konečně dostal k tomu Huawei E3372h-153 na Turris Omnia a rozběhal jsem to přes to NCM (zařízení /dev/cdc-wdm0).

Nutno podotknout, že rychlost komunikace je stejně někde okolo 20/20 Mbps, občas mírně přes (tj. skoro stejně jako přes to PPP), ačkoli operátor tvrdí, že SIM má povolené “až 300 Mbps” a dongle by měl zvládat 150 Mbps. (Praha 7, router s modemem jsou hozený v rohu místnosti, takže to není zrovna ideál.)

Překvapivě mi to nešlo rozchodit přes PPP (proto '3g') tak hladce (vlastně vůbec) jako na tom Netgearu s čistým aktuálním LEDE 17.01.04. Možná je to starší verzí nějakého software v TurrisOS? Přitom 3G dongle Huawei E1750 jsem na TO rozchodil hned.

Ještě jednou podotýkám, že mám ten dongle flashnutý tzv. “stick” (tj. ne HiLink) firmwarem.

Jak jsem v zoufalosti zkoušel všechno možné, tak není vyloučeno, že v následujícím výčtu něco vynechám, nebo naopak jsem si do systému zbytečně nainstalovat nějaké nepotřebné balíky.

Vycházel jsem tedy hlavně z OpenWrt Project: Use NCM USB Dongle for WAN connection
Hlavně pro seznam balíčků pro instalaci

opkg install comgt-ncm kmod-usb-net-huawei-cdc-ncm usb-modeswitch kmod-usb-serial kmod-usb-serial-option kmod-usb-serial-wwan

Taky jsem pročítal třeba tuto diskusi Huawei E3372 with NCM - Installing and Using LEDE - LEDE Project Forum, která mě trochu nakopla v řešení trablů, které na mě čekaly.

Nenašel jsem dokumentaci AT rozhraní přesně pro tento model a doteď mi některé chování přijde dost jako magie.
Alespoň nějakou představu jsem si udělal a komentáře k některým příkazům, jsem vykoukal u jiného modelu a tady v něčích poznámkách.

Problém s PINem jsem asi vyřešil tím, že jsem pomocí AT příkazů (můžete si doinstalovat minicom, jen poradím: Ctrl+A a E zapne local echo a Ctrl+A a Q ukončí program) nastavil porty (a tím FF vypnul i CD/SD storage) na tom zařízení (Možná na TO nefunguje správně usb-modeswitch? Přeci jen, balíček se tváří, že je z r. 2014):

AT^SETPORT="FF;12,10,16"

Což ostatně doporučují i tak různě na internetech.

Ta 16 na konci by měla být právě to NCM rozhraní (i když někde píšou NDIS), 10 pak PPP. FF vypíná CD/SD.
Takže ten usb-modeswitch je nakonec asi na nic a první překážka překonaná.

Po reinicializaci by měl modem odpovídat takhle:

AT^GETPORTMODE
^GETPORTMODE: TYPE: WCDMA: ,,pcui:0,modem:1,ncm:2

OK
root@turris:~# lsusb
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 12d1:1506 Huawei Technologies Co., Ltd. E398 LTE/UMTS/GSM Modem/Networkcard
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
root@turris:~# lsusb -tv
/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 5000M
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 480M
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 5000M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 480M
    |__ Port 1: Dev 3, If 0, Class=Vendor Specific Class, Driver=option, 480M
    |__ Port 1: Dev 3, If 1, Class=Vendor Specific Class, Driver=option, 480M
    |__ Port 1: Dev 3, If 2, Class=Vendor Specific Class, Driver=huawei_cdc_ncm, 480M
[   23.266172] usbcore: registered new interface driver usbserial
[   23.272067] usbcore: registered new interface driver usbserial_generic
[   23.278635] usbserial: USB Serial support registered for generic
[   23.334630] usbcore: registered new interface driver cdc_ether
[   23.341817] usbcore: registered new interface driver cdc_ncm
[   23.465126] huawei_cdc_ncm 1-1:1.0: MAC-Address: 00:1e:10:1f:00:00
[   23.471331] huawei_cdc_ncm 1-1:1.0: setting rx_max = 16384
[   23.483922] huawei_cdc_ncm 1-1:1.0: NDP will be placed at end of frame for this device.
[   23.492016] huawei_cdc_ncm 1-1:1.0: cdc-wdm0: USB WDM device
[   23.498100] huawei_cdc_ncm 1-1:1.0 wwan0: register 'huawei_cdc_ncm' at usb-f10f0000.usb3-1, Huawei CDC NCM device, 00:1e:10:1f:00:00
[   23.510158] usbcore: registered new interface driver huawei_cdc_ncm
[   23.522488] ctnetlink v0.93: registering with nfnetlink.
[   23.532503] usbcore: registered new interface driver qmi_wwan
[   23.539191] usbcore: registered new interface driver rndis_host
[   23.549290] usbcore: registered new interface driver uvcvideo
[   23.555068] USB Video Class driver (1.1.1)
[   23.679915] usbcore: registered new interface driver option
[   23.685568] usbserial: USB Serial support registered for GSM modem (1-port)
[   23.692734] option 1-1:1.1: GSM modem (1-port) converter detected
[   23.698942] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB0
[   23.705826] option 1-1:1.2: GSM modem (1-port) converter detected
[   23.712070] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB1
[   23.719628] usbcore: registered new interface driver qcserial
[   23.725483] usbserial: USB Serial support registered for Qualcomm USB modem

(Ty odkazy na Qualcomm/qmi jsou mi záhadou, ale asi že jsem v zápalu boje instaloval balíčky i pro tohle, tak se to snaží chytit? Co jsem tak pochopil, výrobci rádi používají stejný VID/PID i pro zařízení s úplně jinými chipsety, takže pak přicházejí na řadu méně elegantní způsoby detekce.)

Druhá překážka? Můj firmware z pochybných zdrojů je nějaký divný a v odpovědi na příkaz ATI je řádek Manufacturer prázdný, takže nástroj/skript comgt-ncm (resp. /lib/netifd/proto/ncm.sh) tady selže.
Obešel jsem to zatím špinavým zásahem do toho skriptu, kde jsem prostě natvrdo nastavil proměnnou manufacturer na huawei (řádek 68).

ATI
Manufacturer:
Model: E3372
Revision: 21.315.01.00.143
IMEI: (smazáno)
+GCAP: +CGSM,+DS,+ES

OK

Ten firmware na mém donglu bude vůbec nějaký podezřelý. Na AT^SETPORT=? (a pár podobně nevinných příkazů) třeba odpoví ERRORem.

Aby těch překážek nebylo málo, pokud jste do příslušné sekce v /etc/config/network zapomněli dát prodlevu (delay), tak tam ty skripty začnou sypat inicializační AT příkazy příliš brzy a akorát to vyprší při čekání na odpověď.
Takže nezapomeňte na delay '5' nebo raději delay '10' (výchozí hodnota u této volby je totiž 0).

Pak je ještě nějaký zmatek ohledně volby mode v tom network configu (některé části celého toho domečku z karet/skriptů snad chtějí volbu modes).
Ale hlavně - jakmile tam ta volba je a probublá těmi skripty a něco se zvolí, třeba podle preferlte nebo lte, tak to zase z nějakého důvodu selže:

notice netifd[]: Interface 'wwan' is setting up now
notice netifd[]: wwan (4342): sending -> AT
notice netifd[]: wwan (4342): sending -> ATZ
notice netifd[]: wwan (4342): sending -> ATQ0
notice netifd[]: wwan (4342): sending -> ATV1
notice netifd[]: wwan (4342): sending -> ATE1
notice netifd[]: wwan (4342): sending -> ATS0=0
notice netifd[]: wwan (4342): SIM ready
notice netifd[]: wwan (4342): PIN set successfully
notice netifd[]: wwan (4342): sending -> AT^SYSCFGEX=\"030201\",3fffffff,2,4,7fffffffffffffff,,
notice netifd[]: wwan (4342): Error running AT-command
notice netifd[]: wwan (4342): Failed to set operating mode
notice netifd[]: wwan (4622): Stopping network
notice netifd[]: wwan (4622): sending ->
notice netifd[]: Interface 'wwan' is now down

Přitom když ten samý AT příkaz (odpovídající preferlte) pustím ručně, tak není problém:

AT^SYSCFGEX="030201",3fffffff,2,4,7fffffffffffffff,,


OK
^XLEMA:1,2,112,0,1,fff

^XLEMA:2,2,911,0,1,fff
^SRVST: 2
^NWTIME:18/03/11,18:13:28+04,00

^EONS:0

^RSSI:25

Naštěstí vynechání volby mode z configu způsobí, že se to skripty nebudou pokoušet nastavovat a dongle si moje manuální nastavení bude pamatovat.

Tady bude potřeba ještě asi prozkoumat obsah /etc/gcom/ (v ncm.json jsou definované ty AT příkazy) a ten skript /lib/netifd/proto/ncm.sh
Možná je to to escapování uvozovek?

Každopádně můj výsledný config:

config interface 'wwan'
        option proto 'ncm'
        option ifname 'wwan0'
        option device '/dev/cdc-wdm0'
        option apn 'internet'
        option pincode '1234'
        option delay '10'

(Tady má config podobný jako já, ale používá /dev/ttyUSB0.)

Pak si říkám, že by ty network scripty okolo toho mohly reagovat na hotplug events, protože když ten modem vytáhnu a zase zastrčím, případně ho restartuju pomocí AT^RESET, tak pak musím to síťové rozhraní ručně shodit a zase nahodit.

Kdyby se někomu chtělo zkusit mou anabázi zopakovat a potvrdit, že to funguje (dost možná budete mít i větší štěstí na firmware, který bude správně hlásit výrobce, tudíž nebudete muset upravovat ncm.sh), můžeme to učesat do nějakého přehlednějšího návodu. :slight_smile:

Ještě si tady odložím: Tohle vypadá na svatý grál informací o Huawei donglech s chipsetem od HiSilicon (sice tam rozebírají jiné modely, ale vypadá to skoro stejně)
https://osmocom.org/projects/huawei-modems/wiki/

A post was split to a new topic: LTE modem e3372h a nutno jej pomocí aplikace ISP vypnout/zapnout