4G网络连接简介
大部分4G模块实际的通信接口都是USB,所以4G模块的驱动就转换为了USB的驱动,而这些4G模块厂家都提供了详细的文档讲解如何在Linux下使用4G模块,以及修改Linux内核加入4G模块驱动。下面介绍如何移植 Linux USB 转串口驱动和 USB 网卡驱动。
USB转串口驱动
EC20 4G模块驱动修改
添加USB设备信息(VID/PID)
根据USB规范的规定,所有的USB设备都有供应商ID(VID)和产品识别码(PID),主机通过不同的VID和PID来区别不同的设备。VID和PID都是两个字节长,其中,供应商ID(VID)由供应商向USB执行论坛申请,每个供应商的VID是唯一的,PID由供应商自行决定,理论上来说,不同的产品、相同产品的不同型号、相同型号的不同设计的产品最好采用不同的PID,以便区别相同厂家的不同设备。
我们需要在Linux内核中添加EC20的USB设备信息,因为EC20 4G模块使用的是USB接口。打开 Linux 源码的 drivers/usb/serial/option.c 文件,首先定义 EC20 的 ID 宏。
添加USB零包机制
对于 USB 请求块批量输出,如果发送的数据长度是 USB 数据包长的整数倍,需要额外再发送一个长度为零的数据包以通知对端数据传送完毕。
对 于 Linux 内 核 2.6.35 及以上版本,添加如下语句至文件
[KERNEL]/drivers/usb/serial/usb_wwan.c。
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;
struct usb_device_descriptor *desc = &serial->dev->descriptor;
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 //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(0x2C7C))
urb->transfer_flags |= URB_ZERO_PACKET;
}
#endif
增加复位恢复机制
当 MCU 进入挂起或睡眠模式时,某些 USB 主机控制器或 USB 集线器可能会断电或复位,且 MCU 退出挂起或睡眠模式后无法自动恢复 USB 设备。请添加以下语句以使能复位恢复流程。
对于 Linux 内核 3.5 及以上版本,请添加如下语句至文件[KERNEL]/drivers/usb/serial/option.c。
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
};
使能内核配置项
⚫ CONFIG_USB_SERIAL
⚫ CONFIG_USB_SERIAL_WWAN
⚫ CONFIG_USB_SERIAL_OPTION
Device Drivers --->
[*] USB support --->
<*> USB Serial Converter support --->
<*> USB driver for GSM and CDMA modems
配置完成
USB网卡驱动移植
- 进入到kernel目录
- 执行如下命令设置环境变量并导出用户设备操作系统的 defconfig 文件。
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
make rv1126_defconfig
在执行make rv1126_defconfig的时候,可能会把刚才配置usb转串口驱动的使能项给覆盖掉,所以,可以在rv1126_defconfig文件里面打开使能项。
- 执行如下命令通过如下图所示选项启用 USB 网卡功能。
> Device Drivers
> Network device support
[*] Wireless LAN --->
<*> Wireless RNDIS USB support
这里需要先打开,不然后面的配置项不会出现。
使能PPP拨号
PPP 拨号相对于 USB 网卡上网方式,有如下缺点:
⚫ 使用方式更复杂
⚫ 相同网速下会消耗更高的 CPU
⚫ 数据传输达不到理论速率
因此,不推荐使用 PPP 拨号。如果确实需要,则必须使能以下 Linux 内核配置项:
⚫ CONFIG_PPP
⚫ CONFIG_PPP_ASYNC
⚫ CONFIG_PPP_SYNC_TTY
⚫ CONFIG_PPP_DEFLATE