01 RK3568调试4G 模块 EG800AK-CN
1、添加pid、vid信息
为了识别模块,需将模块的VID和PID信息添加到[KERNEL]/drivers/usb/serial/option.c文件中,对应的VID和PID下图所示:EG800AK参考EC800M
static const struct usb_device_id option_ids[] = {
#if 1 //此处为添加的代码,到endif结束。{USB_DEVICE(0x2C7C, 0x6002) },
#endif
2 、使用USBNet驱动
在1添加VID和PID中,配置会使模块的所有 USB 接口均绑定 USB 转串口 option 驱动程序,导致 USBNet 驱动程序接口无法工作。我们需要添加以下语句以防止 USBNet 驱动程序接口绑定 USB 转串口 option 驱动程序。
static int option_probe(struct usb_serial *serial,const struct usb_device_id *id)
{struct usb_interface_descriptor *iface_desc =&serial->interface->cur_altsetting->desc;unsigned long device_flags = id->driver_info;#if 1 //此处为添加的代码,到endif结束。 if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2C7C)) {__u16 idProduct = le16_to_cpu(serial->dev->descriptor.idProduct);//printk("aaaaaaaaaaaaaaaaaaddfasdf");//print("Detected device with Product ID: 0x%04X\n", idProduct) ;struct usb_interface_descriptor *intf = &serial->interface->cur_altsetting->desc; if (intf->bInterfaceClass != 0xFF || intf->bInterfaceSubClass == 0x42) {//ECM, RNDIS, NCM, MBIM, ACM, UAC, ADB return -ENODEV; } if ((idProduct&0xF000) == 0x0000) {//MDM interface 4 is QMI if (intf->bInterfaceNumber == 4 && intf->bNumEndpoints == 3 && intf->bInterfaceSubClass == 0xFF && intf->bInterfaceProtocol == 0xFF) return -ENODEV; } }
#endif
3、修改内核配置
检查内核配置:,默认是打开的
CONFIG_USB_SERIAL;
CONFIG_USB_SERIAL_WWAN;
CONFIG_USB_SERIAL_OPTION;
4、 添加零包机制
根据 USB 协议的要求,通过在kernel/drivers/usb/serial/usb_wwan.c文件中添加如下语句在 bulk-out 传输过程中添加处理零包的机制。
static struct urb *usb_wwan_setup_urb(struct usb_serial_port *port,int endpoint,int dir, void *ctx, char *buf, int len,void (*callback) (struct urb *))
{struct usb_serial *serial = port->serial;struct usb_wwan_intf_private *intfdata = usb_get_serial_data(serial);struct urb *urb;urb = usb_alloc_urb(0, GFP_KERNEL); /* No ISO */if (!urb)return NULL;usb_fill_bulk_urb(urb, serial->dev,usb_sndbulkpipe(serial->dev, endpoint) | dir,buf, len, callback, ctx);
#if 1 //此处为添加的代码,endif为结束。if (dir == USB_DIR_OUT) {//struct usb_device_descriptor *desc = &serial->dev->descriptor; if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2C7C)) urb->transfer_flags |= URB_ZERO_PACKET; }
#endifif (intfdata->use_zlp && dir == USB_DIR_OUT)urb->transfer_flags |= URB_ZERO_PACKET;return urb;
}
5 、添加Reset-resume机制
部分 USB 主机控制器或 USB hub 在 MCU 进入 Suspend/Sleep(挂起/睡眠)模式时会发生掉电或复位,并且在 MCU 退出Suspend/Sleep模式后不能使模块恢复。需要通过在kernel/drivers/usb/serial/option.c文件中添加以下语句来启用reset-resume机制。
#ifdef CONFIG_PM.suspend = usb_wwan_suspend,.resume = usb_wwan_resume,
#if 1 //此处为添加代码 ednif结束 .reset_resume = usb_wwan_resume,
#endif
#endif
};
6、 联网
该4G模块是可以通过ECM或者RNDIS驱动的方式进行上网的。
本文选择ECM驱动方式,在内核的配置中需要开启以下配置项。
CONFIG_USB_NET_DRIVERS
CONFIG_USB_USBNET
CONFIG_USB_NET_CDCETHER
7、测试指令
busybox microcom /dev/ttyUSB1 -s 115200 -t 10000 #10S内无操作退出串口检查SIM卡返回OK代表识别到
AT+CPIN?
切换接口模式,将模块配置为 ECM 状态,
AT+QCFG="usbnet",1拨号上网
at+qnetdevctl=1,1,1
QA: ping百度域名无法解析
1. 手动配置 DNS 服务器
修改 /etc/resolv.conf 文件,添加可靠的公共 DNS 服务器:# 备份原配置
cp /etc/resolv.conf /etc/resolv.conf.bak# 编辑配置文件
echo "nameserver 114.114.114.114" > /etc/resolv.conf # 国内DNS
echo "nameserver 8.8.8.8" >> /etc/resolv.conf # Googl