jason geiger: cell phone modem micro-howto

Linux + Motorola 120c + Verizon Mobile Office

Inspired by John Chang's page, How To Use Your Cell Phone as a USB Modem in Mac OS X, I decided to see what it would take to get my cell phone working with Linux.

I have a PowerBook G4 running Debian, a Motorola V. Series 120c and a USB data cable. Getting these to work with Verizon's Mobile Office service was fairly simple. All that is needed is an extra line in the acm module (which supports USB modems) so that the phone is recognized. The class/subclass/protocol specifications for this phone are 2/2/0; a line needs to be added to acm.c to match these values.

Update, 18 Nov 2002
Dan Eble reported that the Motorola 60t uses the same subclass so this fix will work for that phone as well.

Update, 26 Mar 2003
Dennis Tokarski wrote about his success with the 60i:

It turns out the Motorola v60's these days claim USB vendor/product ids of 0x67b/0x2303, as mentioned before. (btw, I was mistaken earlier in calling this phone a v60t, it's really a v60i)

This is actually good. These ids are for Prolific Technology Inc's USB serial adapter which, happily, is supported by Red Hat Linux 7.3 right out of the box. No kernel patches required.

Those who rebuild their own kernel will need to be sure to select the pl2303 usb serial driver module.

One final catch: when using the phone as a modem, the dialer must be told to set the serial port baud rate to 19200.

The only PPC specific step in these insructions is getting the kernel source. I haven't tested it out, but I imagine everything would work on a PC laptop as well with the i386 source.

Here's what's needed:

  1. Get and unpack the benh kernel source:
  2. Configure the kernel (make xconfig or whatever you like). Make sure you enable the usb, usb-ohci and acm modules. Next do a make dep. If you haven't already installed the latest kernel (2.4.19 as of this writing) you might want to upgrade that as well (make vmlinux). Here's my config, if you're interested.
  3. Edit drivers/usb/acm.c to add one line (diff):
    OLD ----------

     * USB driver structure.
    static struct usb_device_id acm_ids[] = {
    	{ }

    NEW ----------

     * USB driver structure.
    static struct usb_device_id acm_ids[] = {
    	{ }

  4. Make the modules (make modules).
  5. rmmod the acm module if it is already loaded (rmmod acm).
  6. Install the modules (make modules_install or you could just cp drivers/usb/acm.o /lib/modules/2.4.19-ben0/kernel/drivers/usb/). You may want to back up your old modules in /lib/modules in case something goes wrong.
  7. Load the updated acm module (modprobe acm). The usbcore and usb-ohci modules should also be loaded.
  8. Connect your phone. In /var/log/messages you should see something like:

    Aug  1 20:38:45 folly kernel: hub.c: USB new device connect on bus1/1, assigned device number 2
    Aug  1 20:38:45 folly kernel: ttyACM0: USB ACM device

  9. Configure pppd to use /dev/ttyACM0 (or whatever your log says). I used pppconfig to create a "verizon" profile. The number to dial is #777, the username is qnc, the password is qnc.
  10. Connect and enjoy. For me this involves typing pon verizon.

That's it. Now wherever you can receive a digital signal on your phone, you can check your email. If you don't mind a bit of a wait: I usually see 11 kb/s and half second latency.

Update: availability of service. When I bought my phone the salesperson said that the mobile office service would be available even outside of Verizon's network. I was skeptical of this then and I am fairly certain now that service is much more limited than that. I'm still not sure of the extent of service (if you know, send me an email) but I do know that a digital signal is not enough and I'm not certain that even being on Verizon's network is enough. I was recently in Seattle and I was surprised to find that I could not connect from my hotel (which was downtown) and I found it ironic that a Verizon store was only five or so blocks away.

Jason Geiger
7 Aug 2002