Hi3516平台4G模块驱动调试,模块选用Quectel EC20 。
1、修改内核源码/drivers/usb/serial/option.c
- option.c中增加如下定义:
#if 1 //Added by Quectel
#define QUECTEL_VENDOR_ID 0x2C7C //移远
#define QUECTEL_PRODUCT_UC15 0x9090 //quectel UC15
#define QUECTEL_PRODUCT_UC20 0x9003 //quectel UC20
#define QUECTEL_PRODUCT_EC20 0x9215 //quectel EC20
#define QUECTEL_PRODUCT_EC25 0x0125 //quectel EC25 / EC20 R2.0
#define QUECTEL_PRODUCT_EC21 0x0121 //quectel EC21
#endif
- 修改static const struct usb_device_id option_ids,增加如下内容:
#if 1 //Added by Quectel
{ USB_DEVICE(QUALCOMM_VENDOR_ID, QUECTEL_PRODUCT_UC15) },
{ USB_DEVICE(QUALCOMM_VENDOR_ID, QUECTEL_PRODUCT_UC20) },
{ USB_DEVICE(QUALCOMM_VENDOR_ID, QUECTEL_PRODUCT_EC20) },
{ USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC25) }, /* Quectel EC25/EC20 R2.0 */
{ USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC21) }, /* Quectel EC21 */
{ USB_DEVICE(QUECTEL_VENDOR_ID, 0x0191) }, /* Quectel EG91 */
{ USB_DEVICE(QUECTEL_VENDOR_ID, 0x0195) }, /* Quectel EG95 */
{ USB_DEVICE(QUECTEL_VENDOR_ID, 0x0306) }, /* Quectel EG06/EP06/EM06 */
{ USB_DEVICE(QUECTEL_VENDOR_ID, 0x0296) }, /* Quectel BG96 */
#endif
- 修改option_probe函数,增加如下内容:
#if 1 //Added by Quectel
//Quectel UC20's interface 4 can be used as USB Network device
if(serial->dev->descriptor.idVendor == cpu_to_le16(QUALCOMM_VENDOR_ID) &&
serial->dev->descriptor.idProduct == cpu_to_le16(QUECTEL_PRODUCT_UC20) &&
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(QUALCOMM_VENDOR_ID) &&
serial->dev->descriptor.idProduct == cpu_to_le16(QUECTEL_PRODUCT_EC20) &&
serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4)
return -ENODEV;
//Quectel EC25&EC21&EC20 R2.0&EG91&EG95&EG06&EP06&EM06&BG96's interface 4 can beused as USB Network device
if(serial->dev->descriptor.idVendor == cpu_to_le16(QUECTEL_VENDOR_ID) &&
serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4)
return -ENODEV;
#endif
如果使用EC20模块,并且内核源码中存在如下的定义,避免与EC20模块冲突需将其删除。
[KERNEL]/drivers/usb/serial/qcserial.c
{USB_DEVICE(0x05c6, 0x9215)}, /* Acer Gobi 2000 Modem device (VP413) */
[KERNEL]/drivers/net/usb/qmi_wwan.c
{QMI_GOBI_DEVICE(0x05c6, 0x9215)}, /* Acer Gobi 2000 Modem device (VP413) */
2、修改/drivers/usb/serial/usb-serial.c
static struct usb_driver usb_serial_driver中增加:
#if 1 //Added by Quectel
.reset_resume = usb_serial_resume,
#endif
3、修改/drivers/usb/serial/usb_wwan.c
usb_wwan_setup_urb中增加:
#if 1 //Added by Quectel 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、添加驱动源文件
将GobiNet中的.c和.h文件放至[KERNEL]/drivers/net/usb中
修改[KERNEL]/drivers/net/usb/makefile,增加如下内容:
obj-y += GobiNet.o
GobiNet-objs := GobiUSBNet.o QMIDevice.o QMI.o
增加驱动编译选项:
[*] Device Drivers →
[*] USB Support →
[*] USB Serial Converter support →
[*] USB driver for GSM and CDMA modems
[*] Device Drivers →
-*- Network device support →
USB Network Adapters →
{*} Multi-purpose USB Networking Framework
5、编译更新内核,插入EC20模块时,出现如下打印
ls /dev/可以看到ttyUSB0、ttyUSB1、ttyUSB2、ttyUSB3,以及qcqmi1
ifconfig –a 可以看到eth1
此时,4G模块驱动已正常加载