Dies kleine how to soll zeigen wie NMEA-Signale unter openSUSE Leap 15.0 verfügbar gemacht werden, wenn
in einem DELL Notebook der Baureihen Latitude, Inspiron oder Precision eine WWAN-Karte mit der Bezeichnung
5811e verbaut ist. Die Karte wird bei DELL als Qualcomm® Snapdragon X7 LTE-A-Karte aufgeführt.
Der Befehl lsusb fördert so etwas wie:
zutage. Der verbaute Chip ist von Sierra Wireless. Neben einem LTE-A-fähigen Modem verfügt dieser über ein GNSS-Empfänger (global navigation satellite system receiver). Dieser bietet GPS-, GLONASS- und Beidou-Satellitensystemunterstützung. usb-devices zeigt, sofern keine gps-Signale verfügbar sind:
T: Bus=02 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#= 2 Spd=5000 MxCh= 0
D: Ver= 3.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 9 #Cfgs= 1
P: Vendor=413c ProdID=81b6 Rev=00.06
S: Manufacturer=Sierra Wireless, Incorporated
S: Product=DW5811e Snapdragon™ X7 LTE
S: SerialNumber=0815blabla
C: #Ifs= 2 Cfg#= 1 Atr=a0 MxPwr=504mA
I: If#=12 Alt= 0 #EPs= 1 Cls=02(commc) Sub=0e Prot=00 Driver=cdc_mbim
I: If#=13 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=02 Driver=cdc_mbim
Es wird also nur das KernelModul cdc_mbim geladen. (Der cdc_mbim-Treiber unterstützt USB-Geräte nach der "Universal
Serial Bus Communications Class Subclass Specification for Mobile Broadband Interface Model" und ist optimiert für mobile Breitband Geräte (3G/LTE-Geräte)). Es fehlt das Kernel-Modul, das die GNSS-Signale verfügbar macht. Im Falle des hier werkelnden Chips ist dies der qcserial-Treiber.
Es stellt sich die Frage, warum der qcserial-Treiber nicht geladen wird, wenn eine Unterstützung der Hardeware gegeben ist, wie der Blick in die Linux Kernel Driver DataBase zeigt. Das Problem offenbart sich schnell,
wenn überprüft wird, welche USB composition für das Gerät gewählt wurde (oder besser ausgedrückt voreingestellt ist.) (USB compositions legen fest, mit welchen Interfaces ein Gerät auf dem USB-Bus erscheinen soll.)
Glücklicherweise gibt es ein perl-script (Autor: Bjørn Mork), dass die gewünschte Aussage hinsichtlich der USB compositionen liefert.
Ein Aufruf mit perl swi_setusbcomp.pl führt zu Ausgabe von
...
Current USB composition: 9
USB compositions:
0 - HIP DM NMEA AT MDM1 MDM2 MDM3 MS NOT SUPPORTED
1 - HIP DM NMEA AT MDM1 MS NOT SUPPORTED
2 - HIP DM NMEA AT NIC1 MS NOT SUPPORTED
3 - HIP DM NMEA AT MDM1 NIC1 MS NOT SUPPORTED
4 - HIP DM NMEA AT NIC1 NIC2 NIC3 MS NOT SUPPORTED
5 - HIP DM NMEA AT ECM1 MS NOT SUPPORTED
6 - DM NMEA AT QMI SUPPORTED
7 - DM NMEA AT RMNET1 RMNET2 RMNET3 NOT SUPPORTED
8 - DM NMEA AT MBIM SUPPORTED
* 9 - MBIM SUPPORTED
10 - NMEA MBIM NOT SUPPORTED
11 - DM MBIM NOT SUPPORTED
12 - DM NMEA MBIM NOT SUPPORTED
13 - Config1: comp6 Config2: comp8 NOT SUPPORTED
14 - Config1: comp6 Config2: comp9 NOT SUPPORTED
15 - Config1: comp6 Config2: comp10 NOT SUPPORTED
16 - Config1: comp6 Config2: comp11 NOT SUPPORTED
17 - Config1: comp6 Config2: comp12 NOT SUPPORTED
18 - Config1: comp7 Config2: comp8 NOT SUPPORTED
19 - Config1: comp7 Config2: comp9 NOT SUPPORTED
20 - Config1: comp7 Config2: comp10 NOT SUPPORTED
21 - Config1: comp7 Config2: comp11 NOT SUPPORTED
22 - Config1: comp7 Config2: comp12 NOT SUPPORTED
...
Alles anzeigen
Die USB composition Nr. 9 lässt lediglich das MBIM-Interface auf dem USB-Bus erscheinen. Für die gewünschten GNSS-Signale brauchen wir aber das NMEA-Interface (National Marine Electronics Association).
(NMEA 0183 beschreibt einen Kommunikationstandard zwischen GNSS-Empfänger und auswertenden Geräten wie PCs oder anderen Endgeräten. Das NMEA-Interface arbeitet genau nach dieser Vorgabe.) Also wäre USB composition Nr. 8 die, die benötigt wird. Mit perl swi_setusbcomp.pl --usbcomp=8 wird dies erreicht. usb-devices zeigt nach dieser Änderung und Neustart, dass das Kernel-Modul qcserial nun geladen ist.
T: Bus=02 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#= 2 Spd=5000 MxCh= 0
D: Ver= 3.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 9 #Cfgs= 1
P: Vendor=413c ProdID=81b6 Rev=00.06
S: Manufacturer=Sierra Wireless, Incorporated
S: Product=DW5811e Snapdragon™ X7 LTE
S: SerialNumber=0815blabla
C: #Ifs= 5 Cfg#= 1 Atr=a0 MxPwr=504mA
I: If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=qcserial
I: If#=12 Alt= 0 #EPs= 1 Cls=02(commc) Sub=0e Prot=00 Driver=cdc_mbim
I: If#=13 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=02 Driver=cdc_mbim
I: If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=qcserial
I: If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=qcserial
Alles anzeigen
Jetzt muss nur noch dafür Sorge getragen werden, dass die NMEA-Daten auf den USB-Bus gelegt werden.
Die Ausgabe obigen perl-scripts gibt über die Spaltennummer des Interfaces die Nummer des pseudo-UBS-Devices auf den die Daten des Interfaces gelegt werden an. Also werden die NMEA-Daten mit
echo "\$GPS_START" >/dev/ttyUSB1 explizites eingeschaltet. Die NMEA-Daten werden dann auf den USB-Bus gelegt.
Mit cat /dev/ttyUSB1 lassen sich die NMEA-Daten auf stout anschauen. Fertig.
Anm.: Unter Umständen wird die WWAN-Karte nicht korrekt vom System erkannt. Abhilfe schafft in einem solchen Fall eine eigene udev-Regel, die in eine Textdatei, z.B. mit dem Namen 99-dell5811e.rules im
Verzeichnis /etc/udev/rules.d/ abgelegt wird. Die Dateirechte sind 644 (oktal), Eigentümer und Gruppe auf root:root setzen.
# load qcserial module
SUBSYSTEM=="usb", \
ATTR{idVendor}=="413c", ATTR{idProduct}=="81b6", \
RUN+="/sbin/modprobe -b qcserial"
# force Dell WWAN 5811e (Snapdragon™ X7 LTE)to configuration #1
SUBSYSTEM=="usb", \
ATTR{idVendor}=="413c", ATTR{idProduct}=="81b6", \
ATTR{bConfigurationValue}="1"
# add the new id in the qcserial driver
SUBSYSTEM=="drivers", \
ENV{DEVPATH}=="/bus/usb-serial/drivers/qcserial", \
ATTR{new_id}="413c 81b6"
Alles anzeigen