Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

USB: qcserial: Enable Diagnostics Monitor and GPS ports on Gobi 2000

this patch to qcserial.c enables the Diagnostics Monitor
and NMEA GPS ports on Qualcomm Gobi 2000 devices.

A Gobi 2000 device will provide 3 serial ports:
# /dev/ttyUSB0 -> Diagnostics
# /dev/ttyUSB1 -> 3G Modem
# /dev/ttyUSB2 -> NMEA GPS port

* The Diagnostics Monitor uses Qualcomm's DM protocol; I used
libqcdm (ModemManager) to talk to it, found it working, but at
least DM commands 12 and 64 are not implemented on my device
(Gobi 2000 built into Thinkpad x100e).

* Functionality of the 3G Modem port remains unchanged.

* The GPS port and how to enable it has been confirmed now in the
Gobi 3000 source code at:
https://www.codeaurora.org/patches/quic/gobi/
Enable/disable GPS via:
echo "\$GPS_START" > /dev/ttyUSB2
# use GPS
echo "\$GPS_STOP" > /dev/ttyUSB2


Signed-off-by: Matthias G. Eckermann <mge@arcor.de>

authored by

Matthias G. Eckermann and committed by
Greg Kroah-Hartman
1992de83 6195e3c6

+30 -1
+30 -1
drivers/usb/serial/qcserial.c
··· 152 152 case 3: 153 153 case 4: 154 154 /* Composite mode */ 155 - if (ifnum == 2) { 155 + /* ifnum == 0 is a broadband network adapter */ 156 + if (ifnum == 1) { 157 + /* 158 + * Diagnostics Monitor (serial line 9600 8N1) 159 + * Qualcomm DM protocol 160 + * use "libqcdm" (ModemManager) for communication 161 + */ 162 + dbg("Diagnostics Monitor found"); 163 + retval = usb_set_interface(serial->dev, ifnum, 0); 164 + if (retval < 0) { 165 + dev_err(&serial->dev->dev, 166 + "Could not set interface, error %d\n", 167 + retval); 168 + retval = -ENODEV; 169 + } 170 + } else if (ifnum == 2) { 156 171 dbg("Modem port found"); 157 172 retval = usb_set_interface(serial->dev, ifnum, 0); 158 173 if (retval < 0) { ··· 178 163 kfree(data); 179 164 } 180 165 return retval; 166 + } else if (ifnum==3) { 167 + /* 168 + * NMEA (serial line 9600 8N1) 169 + * # echo "\$GPS_START" > /dev/ttyUSBx 170 + * # echo "\$GPS_STOP" > /dev/ttyUSBx 171 + */ 172 + dbg("NMEA GPS interface found"); 173 + retval = usb_set_interface(serial->dev, ifnum, 0); 174 + if (retval < 0) { 175 + dev_err(&serial->dev->dev, 176 + "Could not set interface, error %d\n", 177 + retval); 178 + retval = -ENODEV; 179 + } 181 180 } 182 181 break; 183 182