移远EC20、EC25内核驱动修改。内核版本为3.2.0。

一、设备信息。

Interface Information:

EC20
VID: 0x05c6 PID: 0x9215
USB Serial
ttyUSB0 -> DM
ttyUSB1 -> NMEA
ttyUSB2 -> AT
ttyUSB3 -> Modem
ttyUSB4 -> NDISEC25
VID: 0x2c7c PID: 0x0125

二、修改文件。

1、Add VID and PID。

文件:kernel/drivers/usb/serial/option.c。

static const struct usb_device_id option_ids[] = {
...{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6000)}, /* ZTE AC8700 */{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */
#if 1 //Added by Quectel{ USB_DEVICE(0x05C6, 0x9090) }, /* Quectel UC15 */{ USB_DEVICE(0x05C6, 0x9003) }, /* Quectel UC20 */{ USB_DEVICE(0x2C7C, 0x0125) }, /* Quectel EC25/EC20 R2.0 */{ USB_DEVICE(0x2C7C, 0x0121) }, /* Quectel EC21 */{ USB_DEVICE(0x05C6, 0x9215) }, /* Quectel EC20 */{ USB_DEVICE(0x2C7C, 0x0191) }, /* Quectel EG91 */{ USB_DEVICE(0x2C7C, 0x0195) }, /* Quectel EG95 */{ USB_DEVICE(0x2C7C, 0x0306) }, /* Quectel EG06/EP06/EM06 */{ USB_DEVICE(0x2C7C, 0x0296) }, /* Quectel BG96 */
#endif{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6280) }, /* BP3-USB & BP3-EXT HSDPA */{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6008) },{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) },
...

文件:kernel/drivers/usb/serial/qcserial.c。

static const struct usb_device_id id_table[] = {
...{USB_DEVICE(0x03f0, 0x251d)},    /* HP Gobi 2000 Modem device (VP412) */{USB_DEVICE(0x05c6, 0x9214)},    /* Acer Gobi 2000 QDL device (VP413) */{USB_DEVICE(0x05c6, 0x9215)},    /* Acer Gobi 2000 Modem device (VP413) */{USB_DEVICE(0x05c6, 0x9264)},  /* Asus Gobi 2000 QDL device (VR305) */
...

文件:kernel/drivers/net/usb/qmi_wwan.c。(无此文件)

{QMI_GOBI_DEVICE(0x05c6, 0x9215)}, /* Acer Gobi 2000 Modem device (VP413) */

2、Add the Zero Packet Mechanism。

文件:kernel/drivers/usb/serial/usb_wwan.c。For Linux Kernel Version newer than 2.6.34:

/* Helper functions used by usb_wwan_setup_urbs */
static struct urb *usb_wwan_setup_urb(struct usb_serial *serial, int endpoint,int dir, void *ctx, char *buf, int len,void (*callback) (struct urb *))
{
.../* Fill URB using supplied data. */usb_fill_bulk_urb(urb, serial->dev,usb_sndbulkpipe(serial->dev, endpoint) | dir,buf, len, callback, ctx);#if 1 //Added by Quectel for Zero Packetif (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;}
#endifreturn urb;
}
...

文件:kernel/drivers/usb/serial/option.c。For Linux Kernel Version older than 2.6.35:

/* Helper functions used by option_setup_urbs */
static struct urb *option_setup_urb(struct usb_serial *serial, int endpoint,
int dir, void *ctx, char *buf, int len,void (*callback)(struct urb *))
{
……
usb_fill_bulk_urb(urb, serial->dev,
usb_sndbulkpipe(serial->dev, endpoint) | dir,
buf, len, callback, ctx);
#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
return urb;
}

3、Add Reset Resume。

文件:kernel/drivers/usb/serial/option.c。For Linux Kernel Version newer than 3.4:

static struct usb_serial_driver option_1port_device = {
……
#ifdef CONFIG_PM
.suspend = usb_wwan_suspend,
.resume = usb_wwan_resume,
#if 1 //Added by Quectel
.reset_resume = usb_wwan_resume,
#endif
#endif
};

文件:kernel/drivers/usb/serial/ usb-serial.c。For Linux Kernel Version older than 3.5:

/* Driver structure we register with the USB core */
static struct usb_driver usb_serial_driver = {.name =     "usbserial",.probe = usb_serial_probe,.disconnect = usb_serial_disconnect,.suspend =   usb_serial_suspend,.resume =   usb_serial_resume,
#if 1 //Added by Quectel.reset_resume = usb_serial_resume,
#endif.no_dynamic_id =     1,.supports_autosuspend =  1,
};

4、Enlarge Bulk out URBs。

文件:kernel/drivers/usb/serial/option.c。

原:
/* per port private data */#define N_IN_URB 4
#define N_OUT_URB 4
#define IN_BUFLEN 4096
#define OUT_BUFLEN 4096改:
/* per port private data */#define N_IN_URB 4
#define N_OUT_URB 4 //Quectel 1
#define IN_BUFLEN 4096
#define OUT_BUFLEN 4096 //Quectel 128

5、Use GobiNet or QMI WWAN。(无此文件)

文件:kernel/drivers/usb/serial/option.c。For Linux Kernel Version newer than 2.6.30:

static int option_probe(struct usb_serial *serial,const struct usb_device_id *id)
{
...
#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(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 EC25&EC21&EC20 R2.0&EG91&EG95&EG06&EP06&EM06&BG96'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;
}
...

文件:kernel/drivers/usb/serial/option.c。For Linux Kernel Version older than 2.6.31:

static int option_startup(struct usb_serial *serial)
{
...
dbg("%s", __func__);
#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(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 EC25&EC21&EC20 R2.0&EG91&EG95&EG06&EP06&EM06&BG96'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
...

三、内核配置,Modify Kernel Configuration。

1、Enable CONFIG_USB_SERIAL_OPTION。

[*] Device Drivers-->[*] USB Support-->[*] USB Serial Converter support[*] USB driver for GSM and CDMA modems

Configure USB Serial in Kernel:

2、Enable CONFIG_USB_USBNET。

[*] Device Drivers-->-*- Network device support-->USB Network Adapters<*> Multi-purpose USB Networking Framework

3、WWAN driver。

[*] Device Drivers-->-*- Network device support-->USB Network Adapters<*> USB-to-WWAN Driver for Sierra Wireless modems

4、Configure Kernel to Support PPP。

[*] Device Drivers-->[*] Network device support[*] PPP (point-to-point protocol) support

嵌入式Linux,4G模组驱动,移远EC20、EC25使用随笔-内核kernel相关推荐

  1. 4g模块注册上网 移远_通信模组企业 移远通信amp;广和通

    无线通信模组通常长这个样,它是物联网设备中的关键部件. 1. 通信模组介绍无线模组为物联网开发者提供了便利,使开发者可以专注于特定应用领域业务的开发而不用关注通信协议的技术细节.无线通信模组厂商通常会 ...

  2. 4g模块注册上网 移远_物联网模组龙头移远通信

    本周末我们一起梳理一下最近刷策略报告通信板块见到的两只比较高频的标的移远通信和广和通,今天我们先一起梳理一下移远通信,公司主营业务是从事物联网领域无线通信模组及其解决方案的设计.生产.研发与销售服务, ...

  3. 4G模块使用记录移远EC20、BC20

    目录 0. 概述 硬件连接 -- UART 休眠管脚的使用 硬件连接 -- USB USB线序定义 驱动安装 抓取模组log 模组型号和SIM卡 模组区别 本地卡和漫游卡 SIM卡和APN 1. EC ...

  4. 【NB-ioT模组】移远BC35-G 基于STM32连接电信云(附代码)

    文章目录 一.串口助手单条AT指令测试 二.Stm32使用AT指令控制NB模块 三.联网上传数据到电信云平台 一.串口助手单条AT指令测试 注意发送加回车换行,在程序里加"\r\n" ...

  5. OpenHarmony3.1适配移远EC20模组4G上网功能

    OpenHarmony3.1适配移远EC20模组4G上网功能 一.概述 通过阅读本篇文档,您将学习到如何适配移远EC20模组到OpenHarmony3.1(以下简称OHOS),并添加4G上网功能. 本 ...

  6. 嵌入式Linux,4G模组使用,命令,EC20、EC25...

    嵌入式Linux开发中,移远4G模组通过ppp拨号上网,命令操作过程如下. chat:调制解调器的自动对话脚本,Chat程序定义了一个计算机和调制解调器之间对话交流,其主要目的是用来在本地PPPD和远 ...

  7. 实测|飞凌嵌入式OK3588-C开发板4G模组的使用与测试

    本篇试用报告由发烧友  ouxiaolong提供,感谢ouxiaolong的支持.飞凌嵌入式会持续开展开发板有奖试用活动,更有京东E卡等着你!欢迎大家的持续关注. 飞凌嵌入式OK3588-C开发板是一 ...

  8. 小白求,用RE文件管理器移植移远EC20 4G模块驱动。 有重谢。请加w jiao1998524

    小白求,用RE文件管理器移植移远EC20   4G模块驱动.  有重谢.请加w  jiao1998524

  9. tinkerboard2 Android11系列-4G模组调试

    上一期介绍了一下tinkerboard2 Android11下面增加触摸和旋转的方式(https://blog.csdn.net/chenchen00000000/article/details/12 ...

  10. 移远ec20驱动_移远通信Cat 1产品天团迎来新成员,引爆中速连接市场

    随着2G.3G退网的逐步推进,中低速率应用场景急需合适的网络来保障通信能力.作为LTE网络的"低配版",Cat 1成熟的网络覆盖.良好的速率支撑.丰富的功能支持以及出众的性价比优势 ...

最新文章

  1. 2022-2028年中国安防视频行业市场前景分析预测报告
  2. 带你了解“比特币黄金”和SegWit2x分叉
  3. 单片机中SDZ是什么意思_合泰单片机ADC转换程序
  4. 以前写的canvas 小游戏 贪吃蛇代码
  5. 经典面试题:给两个序列如何构造一棵二叉树
  6. 如何使用Key User Tool扩展SAP S/4HANA Fiori UI
  7. Struts2的配置文件struts.xml详解
  8. 让用户研究插上数据的翅膀
  9. 文件用户Apache shiro学习笔记+ spring整合shiro (一)
  10. 判断客户端是否安装FlashPlayer及版本
  11. github上传代码_如何更新GitHub上的代码?
  12. 3D数学基础 简要归纳
  13. mysql工作时间获取_mysql获取当前时间,及其相关操作
  14. 如何区分2G/3G/4G基站
  15. C语言基础入门48篇_26_身份证号校验程序(以身份证的校验方式是实例加深对数组及函数封装的理解、字符-‘0‘得到字符对应的int类型数字)
  16. 英语四六级及考研语法(学习方法)
  17. Java-Util之ArrayList
  18. 生产者与消费者问题------legend050709
  19. 视频按照bbox切割算法
  20. 实验一段有趣的js代码。

热门文章

  1. 【SSM -MyBatis篇03】MyBatis Generator(MBG)配置属性详解(基于MyBatis3) - 逆向生成 - 配置MBG模板
  2. 通过模板生成Excel表格——XLSTransformer
  3. 电机学直流电机知识点(根据现有题目的总结)
  4. 《UNIX环境高级编程》随书代码的打开方式
  5. javascript 源代码加密保护
  6. Javacv录制视频
  7. ASP.NET实现文件上传和下载
  8. Ubuntu安装gcc-7.3.0
  9. 确定单峰区间Matlab,0618法matlab实验报告.doc
  10. linux 文件读写 加速,MMAP文件加速读写小技俩