一、EC20

i.MX6ULL驱动开发 | 30 - 使用EC20 4G网卡(移植移远GobiNet驱动)_ec20


EC20在Linux下的驱动架构:

i.MX6ULL驱动开发 | 30 - 使用EC20 4G网卡(移植移远GobiNet驱动)_ec20_02

二、Linux内核中USB驱动的修改与配置

1. EC20 USB驱动修改

默认插上之后没有出来ttyUSB设备,需要在内核中添加EC20的USB设备信息。

1.1. 添加USB设备信息

修改文件​​drivers/usb/serial/option.c​​。

(1)option_ids数组添加EC20 ID信息

#if 1//Added by Quectel
{ USB_DEVICE(0x05C6, 0x9090) }, /* Quectel UC15 */
{ USB_DEVICE(0x05C6, 0x9003) }, /* Quectel UC20 */
{ USB_DEVICE(0x2C7C, 0x0125) }, /* Quectel EC25 */
{ 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, 0x0512) }, /* Quectel EG12/EP12/EM12/EG16/EG18 */
{ USB_DEVICE(0x2C7C, 0x0296) }, /* Quectel BG96 */
{ USB_DEVICE(0x2C7C, 0x0435) }, /* Quectel AG35 */
#endif

i.MX6ULL驱动开发 | 30 - 使用EC20 4G网卡(移植移远GobiNet驱动)_#if_03


(3)修改 option_probe 函数,添加EC20相关代码(Use GobiNet or QMI WWAN)

#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&EG91&EG95&EG06&EP06&EM06&BG96/AG35'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

i.MX6ULL驱动开发 | 30 - 使用EC20 4G网卡(移植移远GobiNet驱动)_驱动开发_04


(4)修改 option_1port_device 结构体,加入休眠后唤醒接口

#if 1//Added by Quectel
.reset_resume = usb_wwan_resume,
#endif

i.MX6ULL驱动开发 | 30 - 使用EC20 4G网卡(移植移远GobiNet驱动)_驱动开发_05

1.2. 添加零包处理代码

编辑​​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

i.MX6ULL驱动开发 | 30 - 使用EC20 4G网卡(移植移远GobiNet驱动)_驱动开发_06

1.3. 编译内核

编译内核,检查下有无编译错误。

make

2. 配置Linux内核

(1)使能USB NET功能

i.MX6ULL驱动开发 | 30 - 使用EC20 4G网卡(移植移远GobiNet驱动)_#endif_07


(2)使能USB串口GSM、CDMA驱动

i.MX6ULL驱动开发 | 30 - 使用EC20 4G网卡(移植移远GobiNet驱动)_linux内核_08


(3)使能USB的CDC ACM模式

i.MX6ULL驱动开发 | 30 - 使用EC20 4G网卡(移植移远GobiNet驱动)_#if_09


至此,Linux内核配置完成,将修改的配置保存到开发板配置文件,编译:

make

3. USB设备测试

使用新的内核启动,可以看到日志:

i.MX6ULL驱动开发 | 30 - 使用EC20 4G网卡(移植移远GobiNet驱动)_#if_10


查看ttyUSB设备节点:

i.MX6ULL驱动开发 | 30 - 使用EC20 4G网卡(移植移远GobiNet驱动)_#if_11

设备名称

作用

ttyUSB0

DM

ttyUSB1

GPS的NMEA信息输出接口

ttyUSB2

AT指令接口

ttyUSB3

PPP连接或AT指令接口

i.MX6ULL驱动开发 | 30 - 使用EC20 4G网卡(移植移远GobiNet驱动)_ec20_12

三、添加移远官方的GobiNet驱动

1. 驱动源码

移远为EC20提供了GobiNet驱动,

i.MX6ULL驱动开发 | 30 - 使用EC20 4G网卡(移植移远GobiNet驱动)_驱动开发_13

2. 添加驱动到内核中

将所有的c文件和h文件拷贝到Linux内核的 drivers/net/usb目录下:

i.MX6ULL驱动开发 | 30 - 使用EC20 4G网卡(移植移远GobiNet驱动)_linux内核_14


拷贝完成以后,修改 driver/net/usb/Makefile 文件:

obj-$(CONFIG_USB_GOBI_NET)  += GobiNet.o

GobiNet-objs :=

在 drivers/net/usb/Kconfig 文件中加入以下内容:

config USB_GOBI_NET
tristate"Gobi USB Net driver for Quectel module"
help
Support Quectelmodule.

A modemmanager with support for

i.MX6ULL驱动开发 | 30 - 使用EC20 4G网卡(移植移远GobiNet驱动)_#if_15


至此,驱动添加完成。

3. 配置内核,开启驱动

i.MX6ULL驱动开发 | 30 - 使用EC20 4G网卡(移植移远GobiNet驱动)_驱动开发_16


配置后重新编译内核:

make

4. 测试

启动内核:

i.MX6ULL驱动开发 | 30 - 使用EC20 4G网卡(移植移远GobiNet驱动)_#if_17


查看是否有设备节点:

i.MX6ULL驱动开发 | 30 - 使用EC20 4G网卡(移植移远GobiNet驱动)_#if_18


至此,EC20驱动修改完成,Gobi驱动正常工作。

四、移植quectel-CM工具

1. 工具源码

i.MX6ULL驱动开发 | 30 - 使用EC20 4G网卡(移植移远GobiNet驱动)_#if_19

2. 交叉编译

make CROSS_COMPILE=arm-linux-gnueabihf-

i.MX6ULL驱动开发 | 30 - 使用EC20 4G网卡(移植移远GobiNet驱动)_驱动开发_20


i.MX6ULL驱动开发 | 30 - 使用EC20 4G网卡(移植移远GobiNet驱动)_ec20_21

3. 拷贝到开发板根文件系统

cp

4. EC20上网测试

quectel-CM -s cenet &

i.MX6ULL驱动开发 | 30 - 使用EC20 4G网卡(移植移远GobiNet驱动)_linux内核_22


查看网卡:

i.MX6ULL驱动开发 | 30 - 使用EC20 4G网卡(移植移远GobiNet驱动)_驱动开发_23


查看路由表:

i.MX6ULL驱动开发 | 30 - 使用EC20 4G网卡(移植移远GobiNet驱动)_#endif_24


ping外网测试:

i.MX6ULL驱动开发 | 30 - 使用EC20 4G网卡(移植移远GobiNet驱动)_驱动开发_25