Compile USB Serial Modem Using option.c (Ubuntu on Beagleboard xM)
Despite possibility to use (1)
$ modprobe -v usbserial vendor=0x05c6 product=0x0015
or (2) usb-modeswitch
, (3) Matthias Urlichs initially wrote option.c
driver as a way to insert USB modem as kernel module.
This driver exists because the “normal” serial driver doesn’t work too well
with GSM modems. Issues:
- data loss — one single Receive URB is not nearly enough
- nonstandard flow (Option devices) control
- controlling the baud rate doesn’t make sense
Most modems will be successfully attached with this driver, appearing in one of the typical /dev/ttyUSB0
to /dev/ttyUSB2
. The product ID 0x0015
for GSM modem compiled here is a Qualcomm (vendor ID 0x05c6) OEM modem I received from Embest DevKit8500D order. There are more than one form factor when searching for its images on Google. Closest one we have in Indonesia is ADVAN DT8-HT bundled in Telkomsel Flash.
I’m compiling it for the Beagleboard xM Rev C running Ubuntu Oneiric (installed in this post). A quick look gives:
$ lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. Bus 001 Device 005: ID 05c6:0015 Qualcomm, Inc.
The above 0x0015
product ID doesn’t exist inside option.c
of linux kernel 3.0.0-12 source. Adding this to series of existing Qualcomm modems gives:
635 636 637 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6000)}, /* ZTE AC8700 */ { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0015)}, /* Qualcomm no brand */ |
The include
also needs usb-wwan.h
from that kernel source. Copy them both under /usr/src/linux-headers-3.0.6-x3/drivers/usb/serial/
. For other include
files, install:
and create this link as root
1 2 | $ cd /usr/src/linux-headers-3.0.6-x3/include/ $ ln -s /usr/src/linux-headers-3.0.0-12/arch/arm/mach-versatile/include/mach mach |
After removing the old one (pointed to build -> /build/buildd/linux-3.0
), create a link inside /lib/modules/3.0.6-x3
named build
pointing to:
build -> /usr/src/linux-headers-3.0.6-x3
Modify the original Makefile
to contain only rule for option.o
obj-m += option.o
and then build the driver
$ make -C /lib/modules/3.0.6-x3/build/ M=/usr/src/linux-headers-3.0.6-x3/drivers/usb/serial/ make: Entering directory `/usr/src/linux-headers-3.0.6-x3' LD /usr/src/linux-headers-3.0.6-x3/drivers/usb/serial/built-in.o CC [M] /usr/src/linux-headers-3.0.6-x3/drivers/usb/serial/option.o Building modules, stage 2. MODPOST 1 modules CC /usr/src/linux-headers-3.0.6-x3/drivers/usb/serial/option.mod.o LD [M] /usr/src/linux-headers-3.0.6-x3/drivers/usb/serial/option.ko make: Leaving directory `/usr/src/linux-headers-3.0.6-x3`
Copy the build and deploy
$ cp /usr/src/linux-headers-3.0.6-x3/drivers/usb/serial/option.ko /lib/modules/3.0.6-x3/kernel/drivers/usb/serial/ $ depmod -a
Now syslog
will show the following lines if the modem is inserted:
kernel:[ 4790.229888] usb 1-2.5: GSM modem (1-port) converter now attached to ttyUSB0 kernel:[ 4790.237121] option 1-2.5:1.0: GSM modem (1-port) converter detected kernel:[ 4790.238250] usb 1-2.5: GSM modem (1-port) converter now attached to ttyUSB1 kernel:[ 4790.240142] option 1-2.5:1.1: GSM modem (1-port) converter detected kernel:[ 4790.241210] usb 1-2.5: GSM modem (1-port) converter now attached to ttyUSB2 mtp-probe: checking bus 1, device 9: "/sys/devices/platform/usbhs-omap.0/ehci-omap.0/usb1/1-2/1-2.5" mtp-probe: bus: 1, device: 9 was not an MTP device kernel:[ 4791.227294] scsi 2:0:0:0: Direct-Access Qualcomm MMC Storage 2.31 PQ: 0 ANSI: 2 kernel:[ 4791.232238] sd 2:0:0:0: Attached scsi generic sg0 type 0 kernel:[ 4791.246887] sd 2:0:0:0: [sda] Attached SCSI removable disk
2 thoughts on “Compile USB Serial Modem Using option.c (Ubuntu on Beagleboard xM)”