Rocket Stick on Arch Linux
Well, thanks to a kind employer and an ill-timed server crash, I now have a free Rocket Stick. It's an HSDPA USB modem from Rogers, a Canadian cellular carrier. Download speeds "up to" 7.2 Mbps in 3.5G. The downstream degrades steadily as I wander off into 3G and (gasp!) 2G.
Not a bad toy to have in the summer months. Now all I need is a really bright laptop screen and I can sit in parks all day, coding and yelling at hobos.
The device is a ZTE MF636 USB modem. Naturally, it's not supported under Linux. I don't even know if Rogers knows what Linux is. But the Internet came through, as it usually does, and within 45 minutes I had found all my answers on various forums and blogs. So here's a consolidated contribution that should work for most Linux distributions. I've tested this on Arch Linux, but the tools used are generic.
So the catch with this little device is that it has multiple personalities. When you first plug it into a Linux machine, the OS will see it as a generic CD-ROM device (eg, /dev/sr1). This is what the marketing boys call a "Zero CD" application install. The Windows/Mac drivers and software are in a small ROM on the USB device itself, so no extra CD required. If you're on a Windows machine, you simply plug the USB key into the computer and the computer will see it as a CD-ROM and fire up the Autorun executable. Voila.
What happens behind the scenes is this: The software runs off the CD-ROM and installs the drivers. When the installation is complete, the driver issues a command to the device that tells it to switch personalities. Now it's a USB modem, and has a new USB product ID associated with it.
This mode switch is the part that I used Windows for. I know, it sucks, but I had a Windows machine on hand so I took advantage.
1. Disable CD mode on the device.
Using a Windows machine, plug in the USB device and go through the short install wizard. Once done, close the Rogers app that starts up, then head into the Device Manager (Control Panel -> System -> Device Manager). Under the Ports section, find the COM port that's connected to the USB modem (ignore the Diagnostics one). Connect to that COM port through Hyperterminal, found in the Accessories area of the Start Menu. Connection parameters are
Bits per Second: 115200
Data bits: 8
Parity: None
Stop bits: 1
Flow Control: None
Once connected, type the following commands:
AT+ZOPRT=5
AT+ZCDRUN=8
This tells the modem not to use CD mode when it's first plugged into a computer. Now exit Hypterterminal and remove the USB modem. You're done with Windows.
2. Setup udev rules.
Create a file /etc/udev/rules.d/90-zte.conf that contains the following:
ACTION!="add", GOTO="ZTE_End"
SUBSYSTEM=="usb", SYSFS{idProduct}=="0031", SYSFS{idVendor}=="19d2", GOTO="ZTE_Modem"
GOTO="ZTE_End"
LABEL="ZTE_Modem"
RUN+="/sbin/modprobe usbserial vendor=0x19d2 product=0x0031", MODE="660", GROUP="network"
LABEL="ZTE_End"
3. Setup hal rules.
The current version of hal (that I have) doesn't know about the MF636, though it does acknowledge some earlier models. To inform it, create a file /etc/hal/fdi/information/10-modem.fdi with the following:
<?xml version="1.0" encoding="UTF-8"?> <!-- -*- xml -*- -->
<deviceinfo version="0.2">
<device>
<match key="info.category" string="serial">
<!-- ZTE MF636 HSDPA USB dongle -->
<match key="@info.parent:usb.product_id" int="0x0031">
<match key="@info.parent:usb.interface.number" int="3">
<append key="modem.command_sets" type="strlist">GSM-07.07</append>
<append key="modem.command_sets" type="strlist">GSM-07.05</append>
</match>
</match>
</match>
</device>
</deviceinfo>
4. Create a wvdial configuration.
Wvdial is an easy-to-use frontend to PPPd. The configuration is fairly easy to comprehend. This one is probably longer than it needs to be, but I'll include it all. Make sure you replace the /dev/ttyUSB0 line with the node that your USB modem is connected to.
[Dialer Defaults]
Modem = /dev/ttyUSB0
ISDN = off
Modem Type = USB Modem
Baud = 7200000
Init = ATZ
Init2 =
Init3 =
Init4 =
Init5 =
Init6 =
Init7 =
Init8 =
Init9 =
Phone = *99#
Phone1 =
Phone2 =
Phone3 =
Phone4 =
Dial Prefix =
Dial Attempts = 1
Dial Command = ATM1L3DT
Ask Password = off
Password = off
Username = na
Auto Reconnect = off
Abort on Busy = off
Carrier Check = off
Check Def Route = off
Abort on No Dialtone = off
Stupid Mode = on
Idle Seconds = 0
Auto DNS = on
5. Dial up to the interwebs.
Now just run wvdial to connect!
# wvdial -C /etc/wvdial.conf
If you see output reporting your PPP local and endpoint IP addresses, then you've won! Crack a beer and troll some forums.
6. Acknowledge the real heroes.
Thanks to the following webpages that gave me all this information:
- http://www.matt-barrett.com/?p=5
- http://ubuntuforums.org/showthread.php?t=1005910
- http://ubuntuforums.org/showthread.php?t=1065934
Update: Fixed a bug in my udev rules.

June 09, 2009 at 11:24 am -0700
June 09, 2009 at 11:55 am -0700
FYI, to return the device to its initial state, where it starts up in CD-ROM mode, you can issue this command in hyperterminal:
AT+ZCDRUN=9
So if it accepts the first two commands, this one should revert it.
Good luck!
June 09, 2009 at 12:07 pm -0700
July 30, 2009 at 1:50 pm -0700
Thanks.
August 31, 2009 at 4:11 pm -0700
September 15, 2009 at 8:23 am -0700
October 19, 2009 at 6:58 am -0700
When i`m set property gateway.setSmscNumber("+540221155610030"); the error is Gateway modem.com9 does not respond, marking for restart., but when i´m not set property the error is GTW: modem.com9: CMS Error 330: Retrying...
Can you help me please !!!
Thanks.
October 19, 2009 at 7:01 am -0700
July 16, 2010 at 5:59 pm -0700