TI USB 3410/5052 Linux Driver Package with Support for MultiTech Modems 10/10/05 CONTENTS 1. Introduction 2. Installation 3. Enhancements and Bug Fixes 4. Known Limitations 5. Vendor and Product Ids 1. INTRODUCTION This tgz package contains a patch for the Linux kernel version 2.6.11 and later to add support for MultiTech modems. It also contains hotplug scripts and firmware images. The TI USB 3410/5052 driver should be included in the official Linux kernel in version 2.6.11 or later. The official Linux kernel does not yet have support for the Multitech modems, however; to add that support you need this package. If you are running a 2.6 kernel earlier than 2.6.11, then you should get the standalone TI USB driver packages, version 1.1 or later: ti_usb_2.6-1.1-1.src.rpm or or ti_usb_2.6-1.1.tgz. If you are running a 2.4 kernel, then you should get the standalone TI USB driver packages, version 1.1 or later: ti_usb-1.1-1.src.rpm or ti_usb-1.1.tgz. This packages have been tested on these Linux distributions: - Fedora Core 2 Most likely this package will work on many other Linux distributions based on the 2.6 kernels, but this has not yet been tested. Note that different distributions can make custom changes to the Linux kernel, and there is a small chance that these changes might be incompatible with this package. These packages are available from http://www.brimson.com/downloads If you have questions or problems with this package please contact TI technical support, Al Borchers, alborchers@steinerpoint.com, or Peter Berger, pberger@brimson.com. 2. INSTALLATION Patching and Rebuilding the Kernel Apply the patch ti_usb_multitech_2.6.13.3.patch. This patch should apply to 2.6.11 and later kernels. Then rebuild and reinstall your kernel and/or kernel modules. Be sure the TI USB driver is configured on. Detailed instructions on patching and building a kernel can be found elsewhere. Installing the Hotplug Scripts The ti_usb_3410_5052 driver needs a hotplug script to work correctly. This hotplug script is used to change the device configuration. Copy ti_usb_3410_5052 to /etc/hotplug/usb/ti_usb_3410_5052. Be sure the script is owned by root:root and has permissions r-xr-xr-x. If the device configuration is not being set properly, you might need a slightly different hotplug script, depending on your Linux distribution. If this does not work, remove /etc/hotplug/usb/ti_usb_3410_5052 and instead copy /etc/ti_usb/ti_usb_3410_5052.hotplug into /etc/hotplug.d/usb. Installing the Firmware Images Copy ti_mts_fw_cdma, ti_mts_fw_edge, and ti_mts_fw_gsm to /usr/lib/hotplug/firmware/. Be sure the files are owned by root:root and have permissions r--r--r--. Load the TI USB 3410/5052 Driver The ti_usb_3410_5052 driver should be automatically loaded when you plug in the TI USB 3410/5052 devices, provided your device uses the default vendor and product ids. If it does not, see the section below titled "VENDOR and PRODUCT IDS". The first TI USB 3410/5052 device plugged in will appear as /dev/ttyUSB0, then next as /dev/ttyUSB1, and so on. These device names are shared with other USB serial devices. If TI USB devices had been in use before installing the new TI USB driver, old versions of the drivers will still be loaded. These old versions must be unloaded before the newly installed driver will be used. The simplest way to unload the old drivers and load the new is to reboot. Alternatively, you can close all open TI USB serial ports, disconnect the TI USB serial devices, and then unload the old TI USB serial driver with the command rmmod ti_usb_3410_5052 Then reconnect the TI USB serial devices and the new driver will be loaded. 3. ENHANCEMENTS and BUG FIXES Version 1.1 - Added support for Multitech GSM. CDMA, and EDGE modems. Thanks to Dale Martenson of Multitech. 4. KNOWN LIMITATIONS - A 3410 without firmware in EEPROM will only work correctly in Linux kernels 2.6.8 and later. Earlier kernels are unable to reset the 3410 after downloading firmware. - In kernels before 2.6.6, vendor and product ids given as module parameters are limited to values between 0x0000 and 0x7FFF. This is a problem in the Linux module parameter feature. - EEPROMS with firmware already programmed will only work with Linux if the firmware is from 9/8/04 or later for the 3410 and from 9/18/04 or later for the 5052. - If the port is software flow controlled when it is closed, it will remain flow controlled when it is re-opened. The port must be re-opened, re-configured for software flow control, and a control-Q must be sent to the port to restart output. This is a firmware problem. - The TI USB devices always drop DTR on close. This behavior cannot be changed by turning off hang-up on close (HUPCL); HUPCL is always in effect and cannot be turned off. 5. VENDOR and PRODUCT IDS The ti_usb_3410_5052 driver is built to use the default vendor id 0x0451 and product ids 0x3410, 0x5052, 0x5152, 0x505A, and 0x505F for TI devices and vendor id 0x06E0 and product ids 0xF108, 0xF109, 0xF110, 0xF111, and 0xF112 for MultiTech devices. If your device uses different product ids you must either specify the vendor and product ids when you load the ti_usb_3410_5052 module or compile the vendor and product ids into the module. The second solution is a bit more work, but allows the ti_usb_3410_5052 driver to be loaded automatically when you plug in your device. Suppose you have a 3410 based device with vendor id 0x1234 and with a product id before firmware download of 0x1111 and after firmware download of 0x2222. Specifying the Vendor and Product Ids When Loading ti_usb_3410_5052 You would load the ti_usb_3410_5052 module with this command, either entered by hand or in a startup script, modprobe ti_usb_3410_5052 vendor_3410=0x1234,0x1234 product_3410=0x1111,0x2222 Note that you must have the same number of vendor and product ids. Even if the vendor id is the same, you must list it once for each product id. Alternatively, you could add this line to /etc/modules.conf add options ti_usb_3410_5052 vendor_3410=0x1234,0x1234 product_3410=0x1111,0x2222 But you would still need to load the ti_usb_3410_5052 module by hand or in a startup script with the command modprobe ti_usb_3410_5052 Specifying the vendor and product ids when loading the module requires that you explicitly load the module by hand or in a startup script. The module cannot be loaded automatically by Linux when you plug in the device, because Linux does not know what vendor and product ids are used by the device. If you have a 5052 based device, then the module parameters are "vendor_5052" and "product_5052". Compiling the Vendor and Product Ids into ti_usb_3410_5052 In the Linux source directory drivers/usb/serial, edit the file ti_usb_3410_5052.c. Find these lines near the top of the file static struct usb_device_id ti_id_table_3410[6+TI_EXTRA_VID_PID_COUNT+1] = { { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) }, { USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_GSM_NO_FW_PRODUCT_ID) }, { USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_CDMA_NO_FW_PRODUCT_ID) }, { USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_CDMA_PRODUCT_ID) }, { USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_GSM_PRODUCT_ID) }, { USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_EDGE_PRODUCT_ID) }, }; ... static __devinitdata struct usb_device_id ti_id_table_combined[] = { { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) }, { USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_GSM_NO_FW_PRODUCT_ID) }, { USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_CDMA_NO_FW_PRODUCT_ID) }, { USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_CDMA_PRODUCT_ID) }, { USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_GSM_PRODUCT_ID) }, { USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_EDGE_PRODUCT_ID) }, { USB_DEVICE(TI_VENDOR_ID, TI_5052_BOOT_PRODUCT_ID) }, { USB_DEVICE(TI_VENDOR_ID, TI_5152_BOOT_PRODUCT_ID) }, { USB_DEVICE(TI_VENDOR_ID, TI_5052_EEPROM_PRODUCT_ID) }, { USB_DEVICE(TI_VENDOR_ID, TI_5052_FIRMWARE_PRODUCT_ID) }, { } }; and change them to be static struct usb_device_id ti_id_table_3410[8+TI_EXTRA_VID_PID_COUNT+1] = { { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) }, { USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_GSM_NO_FW_PRODUCT_ID) }, { USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_CDMA_NO_FW_PRODUCT_ID) }, { USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_CDMA_PRODUCT_ID) }, { USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_GSM_PRODUCT_ID) }, { USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_EDGE_PRODUCT_ID) }, { USB_DEVICE(0x1234, 0x1111) }, { USB_DEVICE(0x1234, 0x2222) }, }; ... static __devinitdata struct usb_device_id ti_id_table_combined[] = { { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) }, { USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_GSM_NO_FW_PRODUCT_ID) }, { USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_CDMA_NO_FW_PRODUCT_ID) }, { USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_CDMA_PRODUCT_ID) }, { USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_GSM_PRODUCT_ID) }, { USB_DEVICE(TI_MTS_VENDOR_ID, TI_MTS_EDGE_PRODUCT_ID) }, { USB_DEVICE(TI_VENDOR_ID, TI_5052_BOOT_PRODUCT_ID) }, { USB_DEVICE(TI_VENDOR_ID, TI_5152_BOOT_PRODUCT_ID) }, { USB_DEVICE(TI_VENDOR_ID, TI_5052_EEPROM_PRODUCT_ID) }, { USB_DEVICE(TI_VENDOR_ID, TI_5052_FIRMWARE_PRODUCT_ID) }, { USB_DEVICE(0x1234, 0x1111) }, { USB_DEVICE(0x1234, 0x2222) }, { } }; Notice that the array dimension on the ti_id_table_3410 array has been changed from "6+TI_EXTRA_VID_PID_COUNT+1" to "8+TI_EXTRA_VID_PID_COUNT+1" to make room for the two new vendor/product ids. Rebuild your kernel and/or modules. Once your vendor and product ids are compiled in, Linux will automatically load the ti_usb_3410_5052 driver when your device is connected. If you have a 5052 based device, then edit the ti_id_table_5052 instead of the ti_id_table_3410. Otherwise, the changes are similar.