1. 简介
2. 编译驱动
2.1 获取驱动包
2.2 选择合适的版本
| tar -xvf Quectel_Linux_USB_Serial_Option_Driver_20211012.tgz |
- 解压成功后,会产生一个目录
20211012
,其中存放着各个版本的驱动源码,如下

- 根据自己的内核版本,选择相应版本的驱动.比如我的内核版本是
3.17.0
,我就选择v3.17.1
版本的驱动
| # 查看内核版本 |
| $ uname -a |
| Linux (none) 3.17.0-xilinx #1 SMP PREEMPT Fri Nov 3 11:57:52 CST 2017 armv7l GNU/Linux |
| |
| # 选择版本最接近的驱动 |
| $ cd 20211012/v3.17.1/ |
2.3 修改驱动源码
- 奇怪,移远提供的源码包默认竟然不支持
RM500U-CN
模组,还需要自己在源码中手动添加对RM500U-CN模组的支持,难道是因为这个模组比较新,驱动还未更新?(2022/7/16)
- 修改驱动源码路径下的
drivers/usb/serial/option.c
,添加对RM500U-CN模组的支持
- linux下
lsusb
命令可以看到模组对应的PID
和VID
分别为0x2C7C
和0x0900
,将其添加到option.c
的option_ids[]数组
中,如下图:

2.4 创建驱动安装目录
- 因为并不是在编译机上进行安装,需要进行交叉编译,因此创建一个驱动的安装目录,便于后续驱动移植
2.5 交叉编译
| # 指明内核源码路径,这里因为有些敏感信息,我隐藏了一部分路径,修改成自己的源码路径即可 |
| KERNELDIR := /***/***/***/***/***/kernel/build/linux-***-v2014.4 # 内核源码路径 |
| PWD := $(shell pwd) |
| |
| obj-m+=./drivers/usb/serial/option.o |
| obj-m+=./drivers/usb/serial/usb_wwan.o |
| obj-m+=./drivers/usb/serial/qcserial.o |
| |
| modules: clean |
| $(MAKE) -C $(KERNELDIR) M=$(PWD) modules |
| |
| install: modules |
| # 这里表示编译完成后,执行make install时将驱动拷贝到步骤2.4自定义的路径下 |
| cp $(PWD)/drivers/usb/serial/*.ko ./install |
| |
| clean: |
| $(MAKE) -C $(KERNELDIR) M=$(PWD) clean |
| # make install ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- |
| $ ls install/ |
| option.ko qcserial.ko usb_wwan.ko |
3. 安装驱动
3.1 将编译好的驱动拷贝到目标机上,安装之
| # insmod usb_wwan.ko |
| # insmod option.ko |
| # insmod qcserial.ko |
3.2 检查驱动是否正常
- 驱动安装完成后,正常情况下就会在
/dev
目录下产生5个ttyUSB,dmesg
如下:
| # dmesg | grep ttyUSB* |
| [ 1121.543526] usb 1-1.1: GSM modem (1-port) converter now attached to ttyUSB9 |
| [ 1121.593404] usb 1-1.1: GSM modem (1-port) converter now attached to ttyUSB10 |
| [ 1121.614269] usb 1-1.1: GSM modem (1-port) converter now attached to ttyUSB11 |
| [ 1121.655317] usb 1-1.1: GSM modem (1-port) converter now attached to ttyUSB12 |
| [ 1121.684846] usb 1-1.1: GSM modem (1-port) converter now attached to ttyUSB13 |
- 如果驱动安装过程中没有报错,但是模组没有识别,重新给模组上下电试试
4. 问题排查
4.1 没有模组对应的interface
Q:驱动安装正常,设备节点也正常,但是ifconfig
看不到5G模组对应的interface,这是什么原因呢?
- 因为RM500U-CN模组默认使用的是
USB NCM
驱动,但是我司的嵌入式设备上使用的是cdc_ether
驱动,需要修改5G模组的模式
- 务必查看RM500U-CN模组相关文档,确定驱动类型
- 使用
minicom 或 microcom
输入如下AT指令,并重启模组(minicom或microcom如何使用这里就不赘述了,网上资料一大堆):
| # minicom -D /dev/ttyUSB11 |
| AT+QCFG="usbnet",1 # 重启模组生效 |
- 模组重启后,dmesg可以看到如下信息:说明usb0就是5G模组对应的interface
| [ 1121.500432] cdc_ether 1-1.1:1.0 usb0: register 'cdc_ether' at usb-zynq-ehci.0-1.1, CDC Ethernet Device, 3e:37:f1:99:c9:6e |
| # 如使用RNDIS驱动,需要执行如下AT指令 |
| AT+QCFG="usbnet",3 |
| # 如使用NCM驱动,需要执行如下AT指令 |
| AT+QCFG="usbnet",5 |
5. 常用AT指令
| #查询卡是否成功识别 |
| AT+CPIN? |
| +CPIN: READY |
| |
| OK |
| |
| #查询APN |
| AT+CGDCONT? |
| +CGDCONT: 1,"IPV4V6","3gnet","0.0.0.0",0,0,0,0,,,,,,0,,,0,,0,0,0,0 |
| +CGDCONT: 11,"IPV4V6","ims","0.0.0.0",0,0,0,0,,,,,,0,,,0,,0,0,0,0 |
| |
| OK |
| |
| #查询运营商 |
| AT+QSPN |
| +QSPN: "CHN-UNICOM","UNICOM","CHN-UNICOM",0,"46001" |
| |
| OK |
| |
| #设置APN |
| AT+CGDCONT=1,"IP","3gnet" |
| OK |
| |
| #查询网络信息:访问计数,运营商,频段 |
| AT+QNWINFO |
| +QNWINFO: "FDD LTE",46001,"LTE BAND 3",1506 |
| +QNWINFO: "NR5G-NSA",46001,"",0 |
| |
| OK |
| |
| #查询网络配置优先级 |
| AT+QNWPREFCFG="mode_pref" |
| +QNWPREFCFG: "mode_pref",AUTO |
| |
| OK |
| |
| #设置NSA入网 |
| AT+QNWPREFCFG="mode_pref",NR5G-NSA |
| OK |
| |
| #设置SA入网 |
| AT+QNWPREFCFG="mode_pref",NR5G-SA |
| OK |
| |
| #设置模组自动选择入网方式及优先级 |
| AT+QNWPREFCFG="mode_pref",AUTO |
| OK |
| |
| #拨号 |
| AT+QNETDEVCTL=1,1,0 |
| OK |
| |
| #查询IP |
| AT+CGPADDR |
| +CGPADDR: 1,"10.66.98.208" |
| +CGPADDR: 11,"" |
| |
| OK |
| |
| #查询信号强度NSA |
| AT+QENG="servingcell" |
| +QENG: "servingcell", "NOCONN" |
| +QENG: "LTE","FDD",460,01,B61D52,312,350,1,3,3,184B,-88,-9,-62,8,12,0,37 |
| +QENG: "NR5G-NSA",460,01,589,-88,17,-3,627264,78,0,6219,1 |
| |
| OK |
| |
| #查询信号强度SA |
| AT+QENG="servingcell" |
| +QENG: "servingcell","NOCONN","NR5G-SA","TDD",460,11,596961006,341,590E02,627264,78,100,-88,-10,5,20,28,1 |
| |
| OK |
| |
| #查询运营商 |
| AT+QSPN |
| +QSPN: "CHN-UNICOM","UNICOM","CHN-UNICOM",0,"46001" |
| |
| OK |
| |
| #查询运营商的另一种方法 |
| AT+COPS=3,1 |
| OK |
| AT+COPS? |
| +COPS: 0,1,"CUCC",13 |
| |
| OK |
| |
| #查询当前使用的卡槽 |
| AT+QUIMSLOT? |
| +QUIMSLOT: 1 |
| |
| OK |
| |
| #切换为卡槽2 |
| AT+QUIMSLOT=2 |
| OK |
| |
| #切换为卡槽1 |
| AT+QUIMSLOT=1 |
| OK |
| |
| #查看模组温度 |
| AT+QTEMP |
| +QTEMP: "soc-thermal","33" |
| +QTEMP: "pa-thermal","31" |
| +QTEMP: "pa5g-thermal","31" |
| +QTEMP: "board-thermal","32" |
| |
| OK |
| |
| #设置用户名,密码,鉴权方式 |
| AT+QICSGP=1,3,"3gnet","cogent","cogent",2 |
| OK |
| |
| #查询用户名,密码,鉴权方式 |
| AT+QICSGP? |
| +QICSGP: 1,1,"cmnet","user","passwd",3 |
| |
| OK |
| |
| #常开型SIM卡座 开启热插拔,使用该指令时模组中不能插卡 |
| AT+QSIMDET=1,1 |
| #常闭型SIM卡座 开启热插拔,使用该指令时模组中不能插卡 |
| AT+QSIMDET=1,0 |
| #查看热插拔状态 |
| AT+QSIMDET? |
| |
NOTE:
- 本文为原创文章,转载请注明出处
- 禁止转载到CSDN!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步