Quectel EC200A-CN移植

  • 一:usb转串口
  • 二:usb网卡驱动
  • 三:源码修改
  • 四:测试

一:usb转串口

usb-serial-option,USB转串口驱动,生产/dev/ttyUSB0-2,分别是DM,AT,PPP
需要使能内核选项如下:

CONFIG_USB_SERIAL=y
CONFIG_USB_SERIAL_WWAN=y
CONFIG_USB_SERIAL_OPTION=y


二:usb网卡驱动

USB网卡驱动,模块可通过AT配置成RNDIS或者ecm,默认是ecm。
需要使能内核选项

USB_USBNET=y
USB_NET_CDCETHER=y        #用ECM  使能此项
USB_NET_RNDIS_HOST=y      #用RNDIS 使能此项


三:源码修改

  1. 增加usb vid和pid
    增加vid和pid,设备连接,使用lsusb命令查看设备的vid和pid,如下图所示:
vid:3763
pid:3c93

文件修改:linux-3.10/drivers/usb/serial/option.c

static const struct usb_device_id option_ids[] = {
#if 1 //Added by Quectel{ USB_DEVICE(0x3763, 0x3c93) }, /* Quectel EC200A-CN 内置GPS */{ USB_DEVICE(0x3c93, 0xffff) }, /* Quectel EC200A-CN 外置GPS*/
#endif

文件修改:linux-3.10/drivers/usb/serial/option.c

1790 #if 1 //Added by Quectel
1791 static void cfmakeraw(struct ktermios *t)
1792 {
1793         t->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
1794         t->c_oflag &= ~OPOST;
1795         t->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
1796         t->c_cflag &= ~(CSIZE|PARENB);
1797         t->c_cflag |= CS8;
1798         t->c_cc[VMIN] = 1;
1799         t->c_cc[VTIME] = 0;
1800 }
1801
1802 static void option_init_termios(struct tty_struct *tty)
1803 {
1804         cfmakeraw(&tty->termios);
1805 }
1806 #endif

文件修改:linux-3.10/drivers/usb/serial/option.c:option_1port_device

1813 static struct usb_serial_driver option_1port_device = {
1814         .driver = {
1815                 .owner =        THIS_MODULE,
1816                 .name =         "option1",
1817         },
1818         .description       = "GSM modem (1-port)",
1819         .id_table          = option_ids,
1820         .num_ports         = 1,
1821         .probe             = option_probe,
1822         .open              = usb_wwan_open,
1823         .close             = usb_wwan_close,
1824         .dtr_rts           = usb_wwan_dtr_rts,
1825         .write             = usb_wwan_write,
1826         .write_room        = usb_wwan_write_room,
1827         .chars_in_buffer   = usb_wwan_chars_in_buffer,
1828         .set_termios       = usb_wwan_set_termios,
1829         .tiocmget          = usb_wwan_tiocmget,
1830         .tiocmset          = usb_wwan_tiocmset,
1831         .ioctl             = usb_wwan_ioctl,
1832         .attach            = option_attach,
1833         .release           = option_release,
1834         .port_probe        = usb_wwan_port_probe,
1835         .port_remove       = usb_wwan_port_remove,
1836         .read_int_callback = option_instat_callback,
1837 #ifdef CONFIG_PM
1838         .suspend           = usb_wwan_suspend,
1839         .resume            = usb_wwan_resume,
1840 #if 1 //Added by Quectel
1841         .reset_resume = usb_wwan_resume,
1842 #endif
1843 #endif
1844 };

文件修改:linux-3.10/drivers/usb/serial/option.c:option_probe

if (serial->dev->descriptor.idVendor == cpu_to_le16(0x3c93))
{__u16 idProduct = le16_to_cpu(serial->dev->descriptor.idProduct);struct usb_interface_descriptor *intf = &serial->interface->cur_altsetting->desc;if (intf->bInterfaceClass != 0xFF || intf->bInterfaceSubClass == 0x42){//ECM, RNDIS, NCM, MBIM, ACM, UAC, ADBreturn -ENODEV;}if ((idProduct&0xF000) == 0x0000){//MDM interface 4 is QMIif (intf->bInterfaceNumber == 4 &&intf->bNumEndpoints == 3 &&intf->bInterfaceSubClass == 0xFF &&intf->bInterfaceProtocol == 0xFF)return -ENODEV;}
}
if (serial->dev->descriptor.idVendor == cpu_to_le16(0x3763))
{__u16 idProduct = le16_to_cpu(serial->dev->descriptor.idProduct);struct usb_interface_descriptor *intf = &serial->interface->cur_altsetting->desc;if (intf->bInterfaceClass != 0xFF || intf->bInterfaceSubClass == 0x42){//ECM, RNDIS, NCM, MBIM, ACM, UAC, ADBreturn -ENODEV;}if ((idProduct&0xF000) == 0x0000){//MDM interface 4 is QMIif (intf->bInterfaceNumber == 4 &&intf->bNumEndpoints == 3 &&intf->bInterfaceSubClass == 0xFF &&intf->bInterfaceProtocol == 0xFF)return -ENODEV;}
}
  1. linux-3.10/drivers/usb/serial/usb_wwan.c:usb_wwan_setup_urb
    usb_wwan_setup_urb函数中添加如下内容
 //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;if (desc->idVendor == cpu_to_le16(0x3c93))urb->transfer_flags |= URB_ZERO_PACKET;if (desc->idVendor == cpu_to_le16(0x3763))urb->transfer_flags |= URB_ZERO_PACKET;}

四:测试

  1. 查看usb网卡是否生成
ifconfig -a

  1. AT指令测试
busybox microcom /dev/ttyUSB2

Quectel EC200A-CN移植相关推荐

  1. Quectel EC200N-CN驱动移植记录

    一. 1)add PID VID kernel_dir/drivers/usb/serial/option.c option_ids[]  { USB_DEVICE(0x2C7C, 0x6002) } ...

  2. OpenWRT移植EC200A驱动,并实现wifi和lan的上网,及wan和4g的负载均衡(五)

    网卡驱动方式 转载:[拨号PPP NDIS RNDIS CDC ECM NCM QMI_WWAN GOBINET RMNET MBIM概念介绍](https://blog.csdn.net/qlexc ...

  3. 在基于瑞芯微rk3568的android12上添加移远4G通信模块EC200A

    ==============================以下修改已在开发板中验证OK==================== [添加前的准备工作] 0.开发平台   CPU是rk3568,andr ...

  4. NBIOT开发(一):NBIOT模组以及芯片厂家都有哪些?

    本文来源:全球物联网观察:由"物联网时空"微信公众号(IoT-LPWAN)整理发布,转载请注明来源. 2014年,华为先提出了窄带技术NB M2M,而后与高通.爱立信等公司的方案融 ...

  5. EC20-GPS功能初次使用

    整个文档只是用于初步使用,需要开发更细节的东西,详细请见官方的规格书. 采用了下图的USB模块进行针对移远的EC20-CEFILG模块,对它的GPS功能进行使用. 将此模块插上电脑,要使用必须使用移远 ...

  6. 物联网之窄带物联网(NB-IOT)

    NB-IoT即窄带物联网(Narrow Band Internet of Things),NB-IOT构建在蜂窝网络之上,只消耗大约180KHZ的带宽,可直接部署于GSM(2G).UMTS(3G).L ...

  7. 易达号-云对讲智能门禁M101-拆机

    评测日期:2020-05-20 评测人:wuxy 本次评测的产品是易达号的M101-F3人脸识别智能门禁.本评测仅代表我个人的看法,如有错误欢迎斧正. 产品描述 功能评测 这里主要是根据说明书上的开门 ...

  8. NB-IoT 移远 BC28 TE-B 模块网络接入测试

    产品概述 BC28 是一款超紧凑.高性能.低功耗的多频段 NB-IoT 无线通信模块,支持 B1/B3/B8/B5/B20/B28 频段.其尺寸仅为17.7mm×15.8mm ×2.0mm,能最大限度 ...

  9. GNSS中静态和动态的区别

    在GNSS数据处理中,动态和静态是描述接收机状态的两个关键术语,下面介绍两者之间的区别: 区别(1)从GNSS接收机本身的运动状态来看: 动态模式:动态模式是指接收机处于移动载体上,如在车辆.飞机.船 ...

  10. Android4.2 Quectel EC20 R2.1模块移植

    注意:  本文档不支持热插拔,本文使用GobiNET方式实现4G上网,并没使用PPPD模式. 1.内核部分的移植 1.1 usb串口驱动的修改 修改: autochips/kernel/drivers ...

最新文章

  1. 18-flutter的Future和FutureBuilder
  2. 聊聊高并发(二十五)解析java.util.concurrent各个组件(七) 理解Semaphore
  3. JS高级-JQ初识-元字符-正则表达式
  4. c语言 函数调用 传值调用 引用调用 传地址调用,C语言中的传值调用和引用调用...
  5. 随讲单片机与Arduino
  6. sql not exists用法_牛客网数据库SQL实战详细剖析(5160)(更新完结)
  7. 【转载】]基于RedHatEnterpriseLinux V7(RHEL7)下SPEC CPU 2006环境搭建以及测试流程 介绍、安装准备、安装、config文件以及运行脚本介绍...
  8. 01.学习笔记-linux操作系统常用命令
  9. AttributeError: module ‘matplotlib‘ has no attribute ‘image‘
  10. 关于java前端的相关讲解
  11. vb.net 实现编辑某列并回车后不换行,查询数据进行相关处理
  12. Ms08067联合360漏洞响应平台(SRC)送给白帽子20本“精选的10本安全好书”
  13. pdf.js 跨域 php,JavaScript_js跨域资源共享 基础篇,本文详细介绍了javascript跨域资 - phpStudy...
  14. c#日期时间的操作的函数总结
  15. 2行Python给图片加水印,太强了!
  16. python发送邮件群发软件_python使用tkinter写的邮件群发软件-python图形界面编程
  17. ​李宏毅机器学习——领域适应Domain Adaptation
  18. jQuery 之过滤选择器
  19. 梦泪的服务器是qq还是微信,梦泪发现微信区1奇特现象,赛季末分数远不如QQ区,看到1细节,懂了...
  20. 谢宁方法或谢宁DOE

热门文章

  1. const与const
  2. 绿色版的谷歌浏览器chrome
  3. 格式化JSON stringify 的使用
  4. 杂项:MIME(多用途互联网邮件扩展类型)百科
  5. .java编译成.class 与 .class反编译成.java
  6. 矩阵论极简笔记(2):列空间、正交补、零空间、行空间
  7. java心得!--很好的java学习历程(转自张国宝)
  8. 毕业相关——电网项目
  9. 20189220 余超《Linux内核原理与分析》第三周作业
  10. RabbitMQ应用案例