Linux下3G模块驱动加载方法

来源:互联网 发布:触摸屏图片展示软件 编辑:程序博客网 时间:2024/05/20 12:48

《ARM Linux开发-warewin 2G/3G无线传输(DTU)和路由器—笔记》

模块型号:中兴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~/ttyUSB34个设备节点。

3、优化模块USB驱动

把中兴提供的zte.ev.czte_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、应用程序的使用

1USB端口的作用

ttyUSB0用于moderm

ttyUSB1用于发AT指令

ttyUSB2用于VoUSB

ttyUSB3用于Debug

2pppd的拨号脚本文件中使用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命令提示以下信息:

 

3.5 设备错误信息图

在模块复位处理中添加对/sys/class/tty/ttyUSB0/device目录下的文件判断,如果该目录下的文件不存在则对设备发重启命令。

 

0 0
原创粉丝点击