Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 05 May 2009 17:23:11 -0400
From:      Mike Tancsa <mike@sentex.net>
To:        freebsd-usb@freebsd.org
Subject:   Re: ZTE MF636 USB u3g modem
Message-ID:  <200905052121.n45LLvvU076825@lava.sentex.ca>
In-Reply-To: <200905051740.n45HeJAG075718@lava.sentex.ca>
References:  <200905051740.n45HeJAG075718@lava.sentex.ca>

next in thread | previous in thread | raw e-mail | index | archive | help
At 01:41 PM 5/5/2009, Mike Tancsa wrote:
>Has anyone had any luck getting this modem to work under FreeBSD ? I 
>have been trying to modify the driver to get it to recognize and 
>send the unit into modem mode, but no luck. I even tried setting the 
>unit into permanent modem mode first from Windows as referenced in
>http://www.matt-barrett.com/?p=5
>but no luck yet
>
>usbdevs shows it as
>port 2 addr 2: high speed, power 500 mA, config 1, ZTE CDMA 
>Technologies MSM(0x2000), ZTE, Incorporated(0x19d2), rev 0.00
>
>
>u3g0: sending CD eject command to change to modem mode
>u3g0: sent command to change to modem mode
>u3g0: read back CSW


OK, some progress! It now comes up as

u3g0: <ZTE, Incorporated ZTE CDMA Technologies MSM, class 0/0, rev 
2.00/0.00, addr 2> on uhub1
u3g0: changing CMOTECH modem to modem mode
u3g0: sent command to change to modem mode
u3g0: failed to read back CSW: 13
u3g0: at uhub1 port 2 (addr 2) disconnected
u3g0: detached
ucom0: <ZTE, Incorporated ZTE CDMA Technologies MSM, class 0/0, rev 
2.00/0.00, addr 2> on uhub1
ucom0: port=0 iface=3 in=0x85 out=0x4
ucom0: configured 1 serial ports (U0.%d)
ucom1: <ZTE, Incorporated ZTE CDMA Technologies MSM, class 0/0, rev 
2.00/0.00, addr 2> on uhub1
ucom1: configured 0 serial ports (U1.%d)
ucom2: <ZTE, Incorporated ZTE CDMA Technologies MSM, class 0/0, rev 
2.00/0.00, addr 2> on uhub1
ucom2: configured 0 serial ports (U2.%d)


Looking through the modemswitch code, I grabbed out the string that 
it sends the modem.  Googling around, I found 2 different versions. 
Both seem to work, however, the secondary ports do not with either 
string. Not sure what it exactly does however.

--- /home/mdtancsa/u3g.c        2009-05-05 16:48:46.000000000 -0400
+++ u3g.c       2009-05-05 17:12:29.000000000 -0400
@@ -126,6 +126,8 @@
  #define U3GFL_STUB_WAIT                0x80            // Device 
reappears after a short delay
  };

+#define U3GINIT_NONE            0
+#define U3GINIT_EJECT           2
  // Note: The entries marked with XXX should be checked for the correct speed
  // indication to set the buffer sizes.
  static const struct u3g_dev_type_s u3g_devs[] = {
@@ -137,8 +139,10 @@
         {{ USB_VENDOR_OPTION, USB_PRODUCT_OPTION_GTMAXHSUPA 
},          U3GSP_HSDPA,    U3GFL_NONE },
         {{ USB_VENDOR_OPTION, USB_PRODUCT_OPTION_VODAFONEMC3G 
},        U3GSP_UMTS,     U3GFL_NONE },
         /* OEM: Qualcomm, Inc. */
-       {{ USB_VENDOR_QUALCOMMINC, USB_PRODUCT_QUALCOMMINC_ZTE_STOR 
},  U3GSP_CDMA,     U3GFL_SCSI_EJECT },
-       {{ USB_VENDOR_QUALCOMMINC, USB_PRODUCT_QUALCOMMINC_CDMA_MSM 
},  U3GSP_CDMA,     U3GFL_SCSI_EJECT },
+        /* OEM: Qualcomm, Inc. */
+        {{ USB_VENDOR_QUALCOMMINC, USB_PRODUCT_QUALCOMMINC_ZTE_STOR 
},  U3GSP_CDMA,     0x08},
+        {{ USB_VENDOR_QUALCOMMINC, USB_PRODUCT_QUALCOMMINC_CDMA_MSM 
},  U3GSP_CDMA,     U3GINIT_EJECT },
+        {{ USB_VENDOR_QUALCOMMINC, USB_PRODUCT_QUALCOMMINC_ZTE_MSM 
},   U3GSP_CDMA,     2 },         // after switch
         /* OEM: Huawei */
         {{ USB_VENDOR_HUAWEI, USB_PRODUCT_HUAWEI_MOBILE 
},              U3GSP_HSDPA,    U3GFL_HUAWEI_INIT },
         {{ USB_VENDOR_HUAWEI, USB_PRODUCT_HUAWEI_E220 
},                U3GSP_HSPA,     U3GFL_HUAWEI_INIT },
@@ -262,6 +266,7 @@
                 if (uaa->ifaces[i] == NULL)
                         continue;

+               DPRINTF("MDTATTACH i = %d\n",i);
                 id = usbd_get_interface_descriptor(uaa->ifaces[i]);
                 if (id && id->bInterfaceClass == UICLASS_MASS) {
                         /* We attach to the interface instead of the device as
@@ -289,6 +294,7 @@
                                  && 
UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK)
                                 bulkout_no = ed->bEndpointAddress;

+                       DPRINTF("MDTATTACH bulkout and in = %d 
%d\n",bulkout_no, bulkin_no);
                         /* If we have found a pair of bulk-in/-out endpoints
                          * create a serial port for it. Note: We assume that
                          * the bulk-in and bulk-out endpoints appear in pairs.
@@ -474,26 +480,53 @@

  /* See definition of umass_bbb_cbw_t in sys/dev/usb/umass.c
   * in sys/cam/scsi/scsi_all.h .
- */
-static unsigned char cmotech_cmd[31] = {
+ 
*  55534243123456782400000080000c8500000024000000000000000000000000 
- from u3g modem switch
+ *  55534243123456782000000080000c85010101180101010101000000000000 - from url
+ *  555342431234567820 00 00 00 80 00 0c 85 01 01 01 18 01 01 01 01 
01 00 0000000000 - from url
+ *  555342431234567824 00 00 00 80 00 0c 85 00 00 00 24 
000000000000000000000000
+*/
+#if 0
+static unsigned char cmotech_cmd[32] = {
      0x55, 0x53, 0x42, 0x43,    /* 0..3: Command Block Wrapper (CBW) 
signature */
-    0x01, 0x00, 0x00, 0x00,    /* 4..7: CBW Tag, unique 32-bit number */
-    0x00, 0x00, 0x00, 0x00,    /* 8..11: CBW Transfer Length, no data here */
+    0x12, 0x34, 0x56, 0x78,    /* 4..7: CBW Tag, unique 32-bit number */
+    0x20, 0x00, 0x00, 0x00,    /* 8..11: CBW Transfer Length, no data here */
      0x80,                      /* 12: CBW Flag: output, so 0 */
      0x00,                      /* 13: CBW Lun */
-    0x08,                      /* 14: CBW Length */
+    0x0c,                      /* 14: CBW Length */

-    0xff,                      /* 15+0 */
-    0x52,                      /* 15+1 */
-    0x44,                      /* 15+2 */
-    0x45,                      /* 15+2 */
-    0x56,                      /* 15+4 */
-    0x43,                      /* 15+5 */
-    0x48,                      /* 15+5 */
-    0x47,                      /* 15+5 */
+    0x85,                      /* 15+0 */
+    0x00,                      /* 15+1 */
+    0x00,                      /* 15+2 */
+    0x00,                      /* 15+2 */
+    0x24,                      /* 15+4 */
+    0x00,                      /* 15+5 */
+    0x00,                      /* 15+5 */
+    0x00,                      /* 15+5 */
      0x00, 0x00, 0x00, 0x00,    /* 15+8..15: unused */
-    0x00, 0x00, 0x00, 0x00
+    0x00, 0x00, 0x00, 0x00, 0x00
  };
+#endif
+
+static unsigned char cmotech_cmd[31] = {
+    0x55, 0x53, 0x42, 0x43,     /* 0..3: Command Block Wrapper (CBW) 
signature */
+    0x12, 0x34, 0x56, 0x78,     /* 4..7: CBW Tag, unique 32-bit number */
+    0x20, 0x00, 0x00, 0x00,     /* 8..11: CBW Transfer Length, no data here */
+    0x80,                       /* 12: CBW Flag: output, so 0 */
+    0x00,                       /* 13: CBW Lun */
+    0x0c,                       /* 14: CBW Length */
+
+    0x85,                       /* 15+0 */
+    0x01,                       /* 15+1 */
+    0x01,                       /* 15+2 */
+    0x01,                       /* 15+2 */
+    0x18,                       /* 15+4 */
+    0x01,                       /* 15+5 */
+    0x01,                       /* 15+5 */
+    0x01,                       /* 15+5 */
+    0x01, 0x01, 0x00, 0x00,     /* 15+8..15: unused */
+    0x00, 0x00, 0x00, 0x00
+};
+




 From bootup, I see in dmesg

ucom0: <ZTE, Incorporated ZTE CDMA Technologies MSM, class 0/0, rev 
2.00/0.00, addr 2> on uhub1
ucom0: MDTATTACH i = 0
ucom0: MDTATTACH i = 1
ucom0: MDTATTACH i = 2
ucom0: MDTATTACH i = 3
ucom0: MDTATTACH bulkout and in = -1 -1
ucom0: MDTATTACH bulkout and in = -1 133
ucom0: MDTATTACH bulkout and in = 4 133
ucom0: port=0 iface=3 in=0x85 out=0x4
ucom0: configured 1 serial ports (U0.%d)
ucom1: <ZTE, Incorporated ZTE CDMA Technologies MSM, class 0/0, rev 
2.00/0.00, addr 2> on uhub1
ucom1: MDTATTACH i = 1
ucom1: MDTATTACH i = 2
ucom1: configured 0 serial ports (U1.%d)
ucom2: <ZTE, Incorporated ZTE CDMA Technologies MSM, class 0/0, rev 
2.00/0.00, addr 2> on uhub1
ucom2: MDTATTACH i = 2
ucom2: configured 0 serial ports (U2.%d)



# ls -l /dev/cuaU*
crw-rw----  1 uucp  dialer  -   0,  79 May  5 17:20 /dev/cuaU0.0
crw-rw----  1 uucp  dialer  -   0,  80 May  5 17:14 /dev/cuaU0.0.init
crw-rw----  1 uucp  dialer  -   0,  81 May  5 17:14 /dev/cuaU0.0.lock



I am able to fireup ppp and surf / download from there.   Anyone have 
any thoughts on how to better configure this unit ?

         ---Mike 




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200905052121.n45LLvvU076825>