模块型号:中兴MC2716
内核版本:linux-2.6.36
加载过程如下:
1、模块ID号添加
进入内核代码“/linux-2.6.36/driver/usb/serial”目录,打开“option.c”文件,查看是否已经定义了此模块产品的设备ID信息,并且这些信息是否已经添加到“ static struct usb_device_id option_ids[]”结构体中。
如果代码中没有模块产品设备ID信息,则在代码中增加模块产品设备ID信息的定义,并添加到“static struct usb_device_id option_ids[]”结构体中。如以下代码红色字体:
Option.c文件
产品设备ID信息的定义:
/* QCMD PRODUCTS */
#define QCMD_VENDOR_ID 0x1c9e
#define QCMD_PRODUCT_U6300V 0x9603
#define QCMD_PRODUCT_U6300 0x9000
/* ZTE PRODUCTS */
#define ZTE_VENDOR_ID 0x19d2
#define ZTE_PRODUCT_MF628 0x0015
#define ZTE_PRODUCT_CDMA_TECH 0xfffe
#define ZTE_PRODUCT_MF210 0x0117 //20110127 add
#define ZTE_PRODUCT_MC2716 0xffed //20110516 add
把产品型号添加到“static struct usb_device_id option_ids[]”结构体中:
static struct usb_device_id option_ids[] = {
.........................................................................................
.........................................................................................
{ USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF628) },
{ USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH) },
{ USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF210) }, //20110127
{ USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MC2716) }, //20110516
{USB_DEVICE(QCMD_VENDOR_ID,QCMD_PRODUCT_U6300V)},//2011021
{ USB_DEVICE(QCMD_VENDOR_ID,QCMD_PRODUCT_U6300)},//20110215
{ } /* Terminating entry */
};
2、添加USB驱动
回到根目录/linux-2.6.36/下,执行“make menuconfig”命令,修改内核编译配置,进入以下配置菜单配置相关选项:
进入菜单 Device Drivers --->
USB support --->
USB Serial Converter support --->
图3.3 USB驱动配置菜单图
选上“USB driver for GSM and CDMA modems”和“USB Generic Serial Driver”两个配置选项。
图3.4 USB驱动选项图
重新编译内核后下载到设备上,进入系统后在/dev目录下会看到生成的/ttyUSB0~/ttyUSB3的4个设备节点。
3、优化模块USB驱动
把中兴提供的zte.ev.c和zte_ev.h拷到内核目录/dirvers/usb/serial下,修改该目录下generi.c文件,在int usb_serial_generic_open函数中添加执行zte_ev_usb_serial_init()函数。在usb_serial_generic_close函数中添加执行zte_ev_usb_serial_exit()函数。修改该目录下的makefile文件,把zte_et.o添加进去编译。
4、应用程序的使用
(1)各USB端口的作用
ttyUSB0用于moderm
ttyUSB1用于发AT指令
ttyUSB2用于VoUSB
ttyUSB3用于Debug
(2)pppd的拨号脚本文件中使用ttyUSB0进行拨号。
5、使用PPPD拨号中遇到的问题
(1)找不到USB接口
现象:拔号时找不到ttyUSB0,设备重启。
解决方法:拔号前运行mdev 命令重新生成设备节点。
实现:在初始化gpio之后添加mdev -s命令。
(2)多次拔号不成功
现象:MC2716模块拔号成功后再次拔号发AT指令时回应的是乱码。
解决方法:每次重新拔号前给模块发ATH指令挂断,然后再开始拔号。因为拔号打开的是/ttyUSB0,发+ATH回不到命令端、指令无效,所以需打开ttyUSB1给模块发ATH指令挂断电话。
实现:在根文件系统/etc/ppp目录下添加挂断电话的脚本配置文件disgprschat。给模块复位时添加断开pppd连接的处理,运行PPPD进程:pppd /dev/ttyUSB1 115200 connect 'chat -f /etc/ppp/gprs-disconnect-chat' user pppuser。
(3)出现找不到设备现象
现象:AT无回应,提示无设备,但/dev目录有下有ttyUSB0,出现这种情况以后,重拔多次都不成功,无法恢复。现象如下图所示:
解决方法:测试过程中发现出现以上问题后,运行mdev -s命令提示以下信息:
在模块复位处理中添加对/sys/class/tty/ttyUSB0/device目录下的文件判断,如果该目录下的文件不存在则对设备发重启命令。 |