Hello, I recently got a Qstarz BT-Q818XT GPS receiver
(http://www.qstarz.com/Products/GPS%20Products/BT-Q818XT-F.htm) which
contains an MTK vII/3329 chipset
(http://www.mediatek.com/en/product/info.php?sn=50).  I got the
following when I plugged it into my laptop which is running
yesterday's snapshot:

umodem0 at uhub1 port 2 configuration 1 interface 1 "MTK GPS Receiver"
rev 2.00/1.00 addr 2
umodem0: no pointer to data interface
ugen0 at uhub1 port 2 configuration 1 "MTK GPS Receiver" rev 2.00/1.00 addr 2

I came up with some patches that make my GPS work and now I get the following:

umodem0 at uhub1 port 2 configuration 1 interface 1 "MTK GPS Receiver"
rev 2.00/1.00 addr 2
umodem0: data interface 0, has no CM over data, has no break
umodem0: status change notification available
ucom0 at umodem0

The first patch adds a new class of USB quirks:

Index: usb_quirks.h
===================================================================
RCS file: /cvs/src/sys/dev/usb/usb_quirks.h,v
retrieving revision 1.16
diff -u -r1.16 usb_quirks.h
--- usb_quirks.h        19 Jul 2010 05:08:37 -0000      1.16
+++ usb_quirks.h        10 Feb 2011 01:37:18 -0000
@@ -49,6 +49,7 @@
 #define UQ_MS_LEADING_BYTE     0x00010000 /* mouse sends unknown leading byte 
*/
 #define UQ_EHCI_NEEDTO_DISOWN  0x00020000 /* must hand device over to USB 1.1
                                                if attached to EHCI */
+#define UQ_NO_CDC_UNION                0x00040000 /* no CDC UNION descriptor */
 };

 extern const struct usbd_quirks usbd_no_quirk;
Index: umodem.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/umodem.c,v
retrieving revision 1.41
diff -u -r1.41 umodem.c
--- umodem.c    25 Jan 2011 20:03:36 -0000      1.41
+++ umodem.c    10 Feb 2011 01:37:18 -0000
@@ -267,10 +267,13 @@
        /* Get the capabilities. */
        umodem_get_caps(uaa, id->bInterfaceNumber, &data_iface_no,
            &sc->sc_cm_cap, &sc->sc_acm_cap);
-       if (data_iface_no == 0) {
-               printf("%s: no pointer to data interface\n",
-                      sc->sc_dev.dv_xname);
-               goto bad;
+
+       if (!(usbd_get_quirks(sc->sc_udev)->uq_flags & UQ_NO_CDC_UNION)) {
+               if (data_iface_no == 0) {
+                       printf("%s: no pointer to data interface\n",
+                              sc->sc_dev.dv_xname);
+                       goto bad;
+               }
        }

        printf("%s: data interface %d, has %sCM over data, has %sbreak\n",


The second patch adds the vendor/device IDs and makes the GPS use the quirk:

Index: usbdevs
===================================================================
RCS file: /cvs/src/sys/dev/usb/usbdevs,v
retrieving revision 1.540
diff -u -r1.540 usbdevs
--- usbdevs     1 Feb 2011 18:23:59 -0000       1.540
+++ usbdevs     10 Feb 2011 01:37:53 -0000
@@ -437,6 +437,7 @@
 vendor HAWKING         0x0e66  Hawking
 vendor FOSSIL          0x0e67  Fossil
 vendor GMATE           0x0e7e  G.Mate
+vendor MTK             0x0e8d  MTK
 vendor OTI             0x0ea0  Ours Technology
 vendor PILOTECH                0x0eaf  Pilotech
 vendor NOVATECH                0x0eb0  Nova Tech
@@ -2565,6 +2566,9 @@

 /* MDS products */
 product MDS ISDBT              0x0001  MDS ISDB-T tuner
+
+/* MTK products */
+product MTK VII3329            0x3329  vII/3329 GPS Receiver

 /* Meinberg Funkuhren products */
 product MEINBERG USB5131       0x0301  USB 5131 DCF77 - Radio Clock
Index: usb_quirks.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/usb_quirks.c,v
retrieving revision 1.63
diff -u -r1.63 usb_quirks.c
--- usb_quirks.c        2 Dec 2010 06:39:09 -0000       1.63
+++ usb_quirks.c        10 Feb 2011 01:37:54 -0000
@@ -133,6 +133,8 @@
  { USB_VENDOR_VELLEMAN, USB_PRODUCT_VELLEMAN_K8055,    ANY,    { UQ_BAD_HID }},
  { USB_VENDOR_DREAMLINK, USB_PRODUCT_DREAMLINK_ULMB1,  ANY,    { UQ_BAD_HID }},

+ { USB_VENDOR_MTK, USB_PRODUCT_MTK_VII3329,    ANY,    { UQ_NO_CDC_UNION }},
+
  { USB_VENDOR_HUAWEI, USB_PRODUCT_HUAWEI_E220, ANY,    { UQ_NO_STRINGS }},
  { USB_VENDOR_SHANTOU, USB_PRODUCT_SHANTOU_DM9601, ANY, { UQ_NO_STRINGS }},
  { USB_VENDOR_RALINK, USB_PRODUCT_RALINK_RT2573, ANY,  { UQ_NO_STRINGS }},


A very similar thing was done in NetBSD last year.  See
http://www.mail-archive.com/source-changes-full@netbsd.org/msg15959.html
and http://www.mail-archive.com/source-changes-full@netbsd.org/msg15960.html

Daniel

Reply via email to