移远EC20 4G模块Linux驱动移植和测试

EC20 Linux驱动移植:

1.增加PID&VID(根据usb驱动,usb设备有VID(vendor ID,供应商识别码)和PID(Product ID,产品识别码),是用来识别USB设备的)。

目录位置:[KERNEL]/drivers/usb/serial/option.c

static const struct usb_device_id option_ids[] = {
 #if 1 //Added by Sky 
 { USB_DEVICE(0x05C6, 0x9090) }, /* Quectel UC15 */ 
{ USB_DEVICE(0x05C6, 0x9003) }, /* Quectel UC20 */
 { USB_DEVICE(0x05C6, 0x9215) }, /* Quectel EC20 */ 
{ USB_DEVICE(0x2C7C, 0x0125) }, /* Quectel EC25/EC20 R2.0 */ 
{ USB_DEVICE(0x2C7C, 0x0121) }, /* Quectel EC21 */ 
#endif 

2 注释掉冲突的vid以及pid设备,视具体源码而定,一般在以下两个目录。

[KERNEL]/drivers/usb/serial/qcserial.c

[KERNEL]/drivers/net/usb/qmi_wwan.c

3 添加零包处理(这个和usb 协议中的批量传输有关)

For Linux Kernel Version newer than 2.6.34:

File: [KERNEL]/drivers/usb/serial/usb_wwan.c

usb_fill_bulk_urb(urb, serial->dev, usb_sndbulkpipe(serial->dev, endpoint) | dir, buf, len, callback, ctx);
 #if 1 //Added by Sky for Zero Packet 
if (dir == USB_DIR_OUT)
 { 
struct usb_device_descriptor *desc = &serial->dev->descriptor;
 if (desc->idVendor == cpu_to_le16(0x05C6) && desc->idProduct == cpu_to_le16(0x9090)) urb->transfer_flags |= URB_ZERO_PACKET;
 if (desc->idVendor == cpu_to_le16(0x05C6) && desc->idProduct == cpu_to_le16(0x9003)) urb->transfer_flags |= URB_ZERO_PACKET; 
if (desc->idVendor == cpu_to_le16(0x05C6) && desc->idProduct == cpu_to_le16(0x9215)) urb->transfer_flags |= URB_ZERO_PACKET;
 if (desc->idVendor == cpu_to_le16(0x2C7C)) urb->transfer_flags |= URB_ZERO_PACKET; 
} 
#endif 

4 增加休眠后唤醒接口

For Linux Kernel Version newer than 3.4:

File: [KERNEL]/drivers/usb/serial/option.c

static struct usb_serial_driver option_1port_device = {
 .driver = { 
.owner = THIS_MODULE, 
.name = "option1", }, 
.description = "GSM modem (1-port)", 
.id_table = option_ids, 
.num_ports = 1, 
.probe = option_probe, 
.open = usb_wwan_open,
 .close = usb_wwan_close, 
.dtr_rts = usb_wwan_dtr_rts,
.write = usb_wwan_write,
 .write_room = usb_wwan_write_room,
 .chars_in_buffer = usb_wwan_chars_in_buffer,
 .set_termios = usb_wwan_set_termios, 
.tiocmget = usb_wwan_tiocmget,
 .tiocmset = usb_wwan_tiocmset,
 .ioctl = usb_wwan_ioctl,
 .attach = option_attach,
 .release = option_release, 
.port_probe = usb_wwan_port_probe,
 .port_remove = usb_wwan_port_remove, 
.read_int_callback = option_instat_callback,
 #ifdef CONFIG_PM 
.suspend = usb_wwan_suspend, 
.resume = usb_wwan_resume,
#if 1  //Added by Sky  
.reset_resume = usb_wwan_resume, 
#endif 
#endif
 };

5 如果要使用 GobiNet or QMI WWAN,需要阻止第四个接口注册为串口。

For Linux Kernel Version newer than 2.6.30:

File: [KERNEL]/drivers/usb/serial/option.c

static int option_probe(struct usb_serial *serial, 
const struct usb_device_id *id)
 {
 struct usb_interface_descriptor *iface_desc =                                 &serial->interface->cur_altsetting->desc; 
struct usb_device_descriptor *dev_desc = &serial->dev->descriptor; 

/* Never bind to the CD-Rom emulation interface */ 
if (iface_desc->bInterfaceClass == 0x08) return -ENODEV; 

    /*
     * Don't bind reserved interfaces (like network ones) which often have
     * the same class/subclass/protocol as the serial interfaces.  Look at
     * the Windows driver .INF files for reserved interface numbers.
     */ 

if (is_blacklisted(
 iface_desc->bInterfaceNumber, OPTION_BLACKLIST_RESERVED_IF,
 (const struct option_blacklist_info *) id->driver_info)) 
return -ENODEV; 
/*
     * Don't bind network interface on Samsung GT-B3730, it is handled by
     * a separate module.
  */ 
if (dev_desc->idVendor == cpu_to_le16(SAMSUNG_VENDOR_ID) && 
dev_desc->idProduct == cpu_to_le16(SAMSUNG_PRODUCT_GT_B3730) && iface_desc->bInterfaceClass != USB_CLASS_CDC_DATA) 
return -ENODEV; 

#if 1  //Added by Sky
 //Quectel UC20's interface 4 can be used as USB Network device 
 if (serial->dev->descriptor.idVendor == cpu_to_le16(0x05C6) && serial->dev->descriptor.idProduct == cpu_to_le16(0x9003)  && serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4) 
return -ENODEV;
 //Quectel EC20's interface 4 can be used as USB Network device
 if (serial->dev->descriptor.idVendor == cpu_to_le16(0x05C6) && serial->dev->descriptor.idProduct == cpu_to_le16(0x9215)  && serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4) 
return -ENODEV; 
//Quectel EC21&EC25&EC20 R2.0's interface 4 can be used as USB Network device 
 if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2C7C) && serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4) 
return -ENODEV; 
#endif

 /* Store device id so we can use it during attach. */ 
usb_set_serial_data(serial, (void *)id); 
return 0;

6 修改内核配置,并编译内核,刷入新内核

     添加USB 串口 GSM 和 CDMA 驱动选项

启用USB网络支持

添加驱动代码:

//Step 5: Please add the following statements to file "[KERNEL]/drivers/net/usb/Makefile" ([KERNEL]/drivers/usb/net/Makefile if the kernel version is older than 2.6.22).

obj-y += GobiNet.o

GobiNet-objs := GobiUSBNet.o QMIDevice.o QMI.o
 

  • 0
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值