Skip to content

Using the Zoom 3095 USB Modem on Linux

This short article describes how to get a Zoom 3095 USB Modem working on Linux. This cool little USB telephone modem sells for about US$50 and proclaims proudly on the package that it is compatible with Windows, Macintosh, and Linux. That was clearly the work of the marketing team, as in reality, we Linux users need to do a bit more work to get on line. I bought one of these modems in order to rescue an old Linux box (PIII 555Mhz, 128M RAM) running SuSE Linux 8.2 and was immediately frustrated to learn it was going to take more work than I'd been led to believe.

Do not despair. This guide is going to get you connected.

This short article describes how to get a Zoom 3095 USB Modem working on Linux. This cool little USB telephone modem sells for about US$50 and proclaims proudly on the package that it is compatible with Windows, Macintosh, and Linux. That was clearly the work of the marketing team, as in reality, we Linux users need to do a bit more work to get on line. I bought one of these modems in order to rescue an old Linux box (PIII 555Mhz, 128M RAM) running SuSE Linux 8.2 and was immediately frustrated to learn it was going to take more work than I'd been led to believe.

For starters, the drivers included on the CD only work on distributions that are running a 2.6.19 or newer kernel. That means a distro released after about 2007 (Ubuntu Feisty Fawn or greater, for example) but if you're running that kind of distro, you probably have new enough hardware that you're not bothering with dial up modems at all. Older machines that require dial up modems typically don't have the specs for modern distros, which makes the requirement a bit silly. Secondly, the drivers provided hardly compile at all, and fail giving a cryptic error message that is not at helpful. Going to the Zoom web site doesn't help, as they seem to barely know how the drivers work at all.

Summary:

The target machine, as mentioned, is a PIII running SuSE 8.0. In order to use this modem we need to:

1. Update the kernel by downloading a plain vanilla kernel and compiling it.

2. Download, compile, and install newer drivers from the Linuxant site.

Neither of these is particularly hard, though the process is not going to impress your friends with Linux's user friendliness. Put on your hardcore geek hat and get to work.

1. Build an updated kernel

First, let's provide our system with a kernel new enough to work with the Linuxant driver. Save yourself some trouble and see if by any chance, precompiled kernels are available more easily than what I'm about to describe. If so, lucky you! Otherwise, go to www.kernel.org and download a new kernel.

Copy the kernel zip to /usr/src and unzip it. You'll wind up with a directory called linux-2.6.27.6 (the number will vary based on the version you downloaded of course). Enter that directory and prepare to configure your new kernel and compile it.

Configure and Compile

There are at least three ways to configure a kernel for compiling. The easiest is graphical. From the command line in that directory, type

make xconfig

A graphical interface will appear after a moment, where all the available kernel options are presented in tree format and you can select the options you want.

This is pretty cool, as you can deselect a lot of the stuff that makes a kernel bulky and wind up with a lean, mean kernel that doesn't use a lot of memory. It's also a hassle, because if you accidently deselect something you actually need, your machine will lack that functionality. I erred several times on the lean side, and had to reconfigure and recompile (my first kernel lacked the drivers to run the CD drive, my next one lacked USB, my third one lacked PPP. Obviously, you need all those things). Save your configuration when you're ready, and sit back and compile, as follows:

make bzImage modules modules_install

The compiling process will begin. If all goes well, the process will take an hour or so and finish with a message indicating it concluded with no errors. If you get any sort of errors, you need to dig into the kernel source and fix them (yes, ridiculous: how can you release a kernel that doesn't compile? In my case, the kernel sources had an error in one of the source files. I commented out the offending line, hoping to God that wasn't the code responsible for keeping the nuclear missiles in their silos, and was thrilled that the kernel henceforth compiled successfully).

Install the new kernel

Congrats - you've got a new kernel ready to go. Now you just have to install it. The compiled kernel is called bzImage and you'll find it in the "boot" subdirectory of your corresponding processor architecture, so navigate to /usr/src/linux-2.6.27/arch/x86/boot for example to look for it. You need to copy this file to the /boot/ directory of your system, and to keep it separate from your other (factory-supplied, working) kernel, you should rename it.

cp /usr/src/linux-2.6.27/arch/x86/boot/bzImage /boot/vmlinuz-2.6.27.6

You'll probably notice your other kernel is there and is called vmlinuz-2.4.20 or something. You aren't done yet. I don't understand what these next two files do, but I do know my system didn't work right until I completed two more steps:

Create a new initrd and System.map

An initrd is an initial ramdisk image, necessary for systems that need to load modules before they can mount the root device. My system needed one, and perhaps many systems do. The program to build one of these ramdevices is mkinitrd.

mkinitrd -k vmlinuz-2.6.27.6 -i initrd-2.6.27.6

Change the -k vmlinuz-2.6.27.6 flag to whatever kernel you need an initrd for. This program seems to be smart enough to put the new initrd file in the /boot directory all by itself.

Just in case, I also copied the new System.map to the /boot directory, so

cp /usr/src/linux-2.6.27.6/System.map /boot.

Allow Grub to boot the new kernel

Simply add your new kernel to the grub boot menu, so you can boot up your Linux box using the new kernel, but leave your old kernel in place so in case your new kernel has a problem you can resort to the old one to rescue yourself. Edit /boot/grub/menu.lst and add the new kernel, hopefully simply by copying the section for your old kernel. It should look something like this:

title linux
    kernel (hd0,0)/boot/vmlinuz.shipped root=/dev/hda1 vga=0x317  
		splash=silent showopts
    initrd (hd0,0)/boot/initrd

title linux 2.6 (default)
    kernel (hd0,0)/boot/vmlinuz-2.6.27.6 root=/dev/hda1 vga=0x317  
		splash=silent showopts
    initrd (hd0,0)/boot/initrd-2.6.27.6

Note I simply copied the configuration for the original kernel but modified it so that the kernel and initrd parameters pointed to the new files.

2. Install the Linuxant driver

Now that you've got a kernel that's modern enough to handle the Zoom modem's driver, install the driver. At this point I happily unpacked the driver supplied with the modem: the disk conveniently had RPMs, DEBs, and a TGZ file. But the driver would not work: after installing the RPM a script tries to compile the driver (module) and fails. The error message was useless, and it was clear you need to be a real kernel hacker to understand what was wrong.

So skip that step, and get your driver from the source instead, www.linuxant.com. What you are looking for is the DGCModem driver on their download page. It's a tiny little thing - under 100KB. These are the same folks whose "driverloader" product gets a lot of peoples' wireless cards working as well.

This part is straight forward. The only trick is that you need to be running on your new kernel, so before installing the RPM, reboot your machine and select your 2.6 kernel. Then install the RPM. The installation script should compile the driver. You are now ready to go!

I rebooted at this point, and watching the boot up messages scroll by, I was pleased to see "DGC Modem .....done" scroll by. So the driver was loaded. At this point, you are good to go. The modem has been configured to correspond to /dev/ttyACM0 and a symlink has been generated at /dev/modem to point to it. So configure your internet connection any way you are accustomed to: in the case of SuSE 8.0, fire up YaST2 and configure a dial up connection using /dev/modem. You are on line.


Notes:

1. The Linuxant driver only works on 32 bit systems. When I failed initially to get the driver working on my SuSE box I experimented on a newer 64 bit machine but struck out immediately: 32 bits only.

2. I found extremely helpful during this project a book called Linux Desktop Hacks by Nicolas Petreley and Jono Bacon(published by O'Reilly). There are two chapters on compiling kernels. Nevertheless I had to do some Googling to figure out the initrd stuff.

Trackbacks

No Trackbacks

Comments

Display comments as Linear | Threaded

No comments

The author does not allow comments to this entry