导读
本文基于M6G2C-128LI核心板内核源码,完成EC200G-CN 4G模块驱动适配,配置ECM拨号网络方案,梳理内核编译、参数调试流程,实现模块稳定联网,为我司M6G2C/M6Y2C等系列核心板产品的4G模块移植 提供实践参考。
M6G2C核心板产品简介
M6G2C是ZLG致远电子精心设计,采用板对板连接器接口的低功耗、高性能的嵌入式核心板。基于NXP的Cortex®-A7内核i.MX6UL处理器,主频高达528MHz,集成了DDR3、NandFlash、硬件看门狗等外设。同时,产品自带8路UART、2路USB OTG、2路CAN-bus、2路以太网等丰富的工业控制通讯接口。
软硬件准备
1. 软件方面
安装好虚拟机的电脑(VMware Workstation 12及以上最佳,电脑配置越高越好);
M6G2C的内核源码linux-src-b85fbbf.tar.gz(详见光盘资料,找FAE索取);
虚拟机镜像(找FAE索取)。
2. 硬件方面
EPC-6G2C-L评估套件1套(可官网旗舰店购买);
网线1根;
USB转232调试串口1个;
读卡器1个,TF卡1张(使用TF卡烧录);
4G模块 EC200G-CN 1个;
SIM卡 1张;
USB转minipci转接板 1个。
EC200G-CN适配步骤
1. 认识硬件
因为EPC-6G2C-L评估板上本身没有minipcie座子,所以需要插入USB转minipcie转接板,转接板上再插好4G模块 EC200G-CN以及SIM卡。
给评估板上电,插入网线,使用ssh登录调试,ssh登录账号:root,密码:root。登录到板子系统之后,执行以下指令:
[root@EPC-M6G2C ~]# lsusbBus 001 Device 003: ID 2c7c:0904Bus 001 Device 001: ID 1d6b:0002[root@EPC-M6G2C ~]# ls /dev/ttyUSB*ls: /dev/ttyUSB*: No such file or directory
可以看到 lsusb 能够识别到已经接入4G模块,硬件连接正常,vid 2c7c;pid 0904。因为目前还没进行4G模块的适配,所以此时文件系统还没生成/dev/ttyUSB*节点。
2. 配置工具链,编译内核
默认大家已经安装好虚拟机并打开我司制作好的Ubuntu镜像文件,并且已经下载M6G2C-128LI内核源码linux-src-c6a534d.tar.gz,并成功解压。
vmuser@ubuntu:~/M6G2C_A6G2C$ tar -zxvf linux-src-c6a534d.tar.gzvmuser@ubuntu:~/M6G2C_A6G2C$ cd A7-linux-src/vmuser@ubuntu:~/M6G2C_A6G2C/A7-linux-src$ ls built-zImage.shbuilt-zImage.sh
built-zImage.sh即为内核源码的编译脚本,注意在编译源码之前需要声明一下M6G2C-128LI的交叉编译工具链,确保使用了正确的工具链。
#编译内核./built-zImage.sh
3. 修改内核源码适配EC200G-CN
3.1 添加VID和PID
路径:drivers/usb/serial/option.c
staticconststructusb_device_idoption_ids[] = {#if 1 //Added by Quectel{ USB_DEVICE(0x2C7C, 0x0904) },#endif
3.2 使用 USBNet 驱动
路径:drivers/usb/serial/option.c
static int option_probe(struct usb_serial *serial, const struct usb_device_id *id) {struct usb_wwan_intf_private *data;……#if 1if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2C7C)) {__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;}}#endif/* Store device id so we can use it during attach. */usb_set_serial_data(serial, (void *)id);return 0;}
3.3 添加 Reset-resume 机制
路径:drivers/usb/serial/option.c
staticstructusb_serial_driveroption_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}
3.4 添加零包机制
路径:drivers/usb/serial/usb_wwan.c
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 *)){……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) {structusb_device_descriptor *desc = &serial->dev->descriptor;if (desc->idVendor == cpu_to_le16(0x2C7C))urb->transfer_flags |= URB_ZERO_PACKET;}#endifreturn urb;}
3.5 修改内核配置并编译
./built-zImage.sh #脚本中会执行make menuconfig
进入make menuconfig界面,启用以下选项(设置为*),将USB 转串口 option 驱动、ECM驱动编译到内核镜像:
#USB 转串口 optionCONFIG_USB_SERIALCONFIG_USB_SERIAL_QUALCOMMCONFIG_USB_SERIAL_IPWCONFIG_USB_SERIAL_OPTION#ECM驱动ONFIG_USB_NET_DRIVERSUSB_NET_RNDIS_WLAN
4. ECM拨号测试
烧录上面编译出来的新内核,烧录成功之后,板子启动,可以看到驱动正常加载,并且/dev/ttyUSB设备节点正常生成。
通过查看4G模块的手册,可以知道EC200G-CN的 /dev/ttyUSB0 是AT命令交互接口。
执行以下命令,设置拨号模式为 ECM拨号,分配ip地址,尝试ping通外网。
#执行下述命令拨号上网busybox microcom /dev/ttyUSB0AT+CPIN? #检查SIM卡,+CPIN: READY表示SIM卡状态正常AT+CSQ #查看信号质量,第一个参数代表RSSI值,范围0~31,越大代表信号越好AT+QCFG="usbnet",1 #设置模组为ECM拨号模式#选择运营商,根据插入的sim卡类型来选择对应的命令AT+CGDCONT=1,"IP","CMNET" #设置运营商为移动AT+CGDCONT=1,"IP","3GNET" #设置运营商为联通AT+CGDCONT=1,"IP","CTNET" #设置运营商为电信AT+QNETDEVCTL=1,1,1 #手动拨号Ctrl+X退出microcom#分配ip,ping外网udhcpc -i usb0ifconfig usb0ping -c 5 baidu.com
拨号成功,分配IP地址成功,ping通baidu.com。
4G模组只有第一次使用的时候需要配置参数,后续使用无需重复配置,一上电就可以开始拨号。
如果想停止拨号,执行以下命令:
busybox microcom /dev/ttyUSB0AT+QNETDEVCTL=0Ctrl+X退出microcom
5. 注意事项
本文使用的是外接的USB转Minipcie转接板,插到USB A口之后,默认就正常供电,模块进入工作状态。但是一般情况下,在底板上设计4G模块Minipcie座子的时候,往往会有供电控制脚、飞行模式控制脚、复位引脚等等。记得要配置这些控制脚到正确的电平状态,才能让4G模块正常上电,正常工作。
| M6G2C Cortex®-A7工控核心板 | |
| 低功耗、高主频
小体积、应用更灵活 内置AWorksOS工业智能物联开发平台 |
83
