嵌入式设备路由网络共享开发(2):移远Quectel系列4G模块驱动移值

前言

本文章介绍了在linux系统下,如何修改usb驱动支持移远模块,移远模块正常启动后,通过USB连接到linux设备上,驱动正常加载后会在/dev/下产ttyUSB*设备。

一、USB串口驱动

1.1 添加VID和PID   

linux下通过lsusb就可以查看USB的VID和PID

#lsusb

Bus 001 Device 011: ID 2C7C:0125

说明这个USB设备的VID为2C7C,PID为0125;

File: [KERNEL]/drivers/usb/serial/option.c

static const struct usb_device_id option_ids[] = {
//Added by Quectel
{ USB_DEVICE(0x2C7C, 0x0125) }, 
//End by Quectel
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) },
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_LIGHT) },
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_QUAD) },
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_QUAD_LIGHT) },

1.2 屏蔽冲突

File: [KERNEL]/drivers/usb/serial/qcserial.c

{USB_DEVICE(0x2C7C, 0x0125)}, /* Acer Gobi 2000 Modem device (VP413) */

File: [KERNEL]/drivers/net/usb/qmi_wwan.c

{QMI_GOBI_DEVICE(0x2C7C, 0x0125)}, /* Acer Gobi 2000 Modem device (VP413) */

1.3 添加零包机制

File: [KERNEL]/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);
    //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) && desc->idProduct == cpu_to_le16(0x0125))
        urb->transfer_flags |= URB_ZERO_PACKET;
    }
    //End by Quectel for zero packet
    return urb;
}

1.4 添加重置

File: [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,
//Added by Quectel
    .reset_resume = usb_wwan_resume,
//End by Quectel
#endif
};

1.5 使用添加GobiNet

File: [KERNEL]/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;
……
//Added by Quectel
if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2C7C) 
&& serial->dev->descriptor.idProduct == cpu_to_le16(0x0125)
&& serial->interface->cur_altsetting->desc.bInterfaceNumber >= 4)
    return -ENODEV;
//End by Quectel
/* Store device id so we can use it during attach. */
usb_set_serial_data(serial, (void *)id);
return 0;
}

1.6 模块内核配置

二、  GobiNet驱动

2.1 模块添加

2.2 添加程序

把Quectel_WCDMA&LTE_Linux&Android_GobiNet_Driver_V1.3.0.zip/src/目录下的文件拷贝到 [KERNEL]/drivers/net/usb/ 下,makefile Readme.txt不拷贝,源码下载:移远模块Linux下GobinNet驱动_quectel-CM-C代码类资源-CSDN下载

修改[KERNEL]/drivers/net/usb/下的makefile在文件最后添加

obj-y += GobiNet.o
GobiNet-objs := GobiUSBNet.o QMIDevice.o QMI.o

2.3 编译内核

make ARCH=arm CROSS_COMPILE=arm-hisiv300-linux- uImage

三、  环境变量配置

3.1、udhcpc配置:

把文件default.script拷贝到/usr/share/udhcpc/下:

把文件resolv.conf拷贝到/var/dvr/下,然后

ln  -s  /var/dvr/resolv.conf    /etc/resolv.conf

3.2、拨号:

编译quectel-CM程序源码,编译出quectel-CM工具进行拨号;

quectel-CM源码下载:Linux下移远4G模块quectel-CM拨号工具_quectelag35开发板-C代码类资源-CSDN下载

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: Linux 模块驱动是指在Linux操作系统中通过驱动程序来支持Quectel)无线通信模块的功能。模块是一款可用于通信和网络连接的设备,常见于物联网、智能设备等领域。 模块驱动的主要目的是通过与Linux内核的交互来实现对模块的控制和数据传输。驱动程序负责与硬件模块进行通信,包括模块的初始化、配置、发送和接收数据等功能。 在Linux中,驱动程序通常是一个内核模块,可以通过编译和加载到内核中。一旦加载成功,驱动程序就能够识别和操作模块,使得用户可以通过命令行或者其他操作界面对模块进行设置和使用。 模块驱动开发需要对Linux内核有深入的了解,包括驱动框架、设备模型等知识。同时,对模块本身的通信协议和接口也需要有一定的了解。 开发模块驱动可以提供给用户更好的使用体验和更多的功能支持。例如,通过驱动程序可以实现短信功能、数据传输功能、网络连接功能等。此外,驱动程序的开发也需要注意与Linux内核的兼容性和稳定性,以保证系统的稳定运行。 总之,Linux模块驱动是一种用于支持无线通信模块功能的驱动程序,它能够与模块进行交互并提供相关的功能。它的开发需要对Linux内核和模块有深入的了解,并注重兼容性和稳定性。 ### 回答2: Linux模块驱动指的是在Linux操作系统中对通信模块进行驱动程序的开发和使用。通信模块是一种用于物联网设备的调制解调器,用于实现设备和互联网之间的通信。 在Linux中使用模块驱动有以下几个步骤: 1. 驱动程序开发开发者需要编写模块驱动程序,这个驱动程序需要根据模块的硬件特性和通信协议进行编写。驱动程序可以控制模块的电源开关,发送和接收数据,还可以处理模块的状态信息。 2. 驱动程序编译和安装:编写好的驱动程序需要被编译成可执行文件,然后通过命令行或者脚本进行安装。安装的过程包括将驱动程序复制到指定的目录,修改系统配置文件,以及重新启动系统等。 3. 驱动程序加载和卸载:在Linux系统中,驱动程序可以通过insmod命令加载到内核中,也可以通过rmmod命令从内核中卸载。加载驱动程序后,就可以开始使用通信模块进行通信了。如果不再需要使用该驱动程序,可以通过卸载命令将其从内核中除。 4. 驱动程序的应用:加载驱动程序后,可以通过编写应用程序来调用驱动程序,实现与模块的交互。应用程序可以通过驱动程序提供的函数接口读取模块的状态信息,发送指令和数据,接收模块的响应等。 总结来说,Linux模块驱动开发和使用步骤包括驱动程序的开发、编译和安装、加载和卸载,以及应用程序的开发。通过驱动程序和应用程序的配合,可以实现对通信模块的有效控制和使用。 ### 回答3: Linux 模块驱动是指在Linux操作系统中对模块进行驱动开发和管理。模块是指一种常见的通信模块,通常用于无线通信和物联网设备的连接。 开发Linux 模块驱动需要以下几个步骤: 首先,需要了解模块的硬件特性和通信协议。了解模块的工作原理和命令集是开发模块驱动的基础,可以通过官方文档或者代码资料来学习。 其次,需要在Linux内核中添加对模块驱动程序。这包括编写驱动程序的代码以及将其编译为内核模块并加载到系统中。驱动程序负责与硬件进行通信,并提供相应的接口供用户层应用程序使用。 然后,需要在设备树中描述模块的硬件信息。设备树是一种描述硬件资源的数据结构,它可以告诉内核如何与硬件进行交互。通过在设备树中添加对模块的描述,内核可以正确地初始化和管理该模块。 最后,可以通过编写用户层应用程序来利用模块的功能。应用程序可以使用驱动程序提供的接口,与模块进行通信或控制。 总结来说,Linux 模块驱动开发需要对硬件特性、通信协议、驱动程序编写和设备树描述等方面有一定的了解和掌握。通过合理的驱动开发和管理,可以使模块在Linux系统中正常工作并为用户提供相应的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ProYuan28

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值