草庐IT

[原创]移远RM500U-CN模组驱动移植

2023-03-28 原文

1. 简介

  • 中国广电正式放号了,为了支持广电700MHz的5G基站,需要换用新的5G模组.移远通信的RM500U模组正好可以满足我们的使用要求;
  • 选用该模组的原因:双卡单待 支持SIM卡热插拔 支持中国广电700MHz基站 版本升级方便
  • 具体参数请到公司官网查看吧> https://www.quectel.com/cn/product/5g-rm500u-cn

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命令可以看到模组对应的PIDVID分别为0x2C7C0x0900,将其添加到option.coption_ids[]数组中,如下图:

2.4 创建驱动安装目录

  • 因为并不是在编译机上进行安装,需要进行交叉编译,因此创建一个驱动的安装目录,便于后续驱动移植
$ mkdir install

2.5 交叉编译

  • 修改Makefile如下:
# 指明内核源码路径,这里因为有些敏感信息,我隐藏了一部分路径,修改成自己的源码路径即可
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. 问题排查

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
  • tips
# 如使用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

#开启热插拔,使用该指令时模组中不能插卡
AT+QSIMDET=1,1
#查看热插拔状态
AT+QSIMDET?

NOTE:

  • 本文为原创文章,转载请注明出处
  • 禁止转载到CSDN!!!

有关[原创]移远RM500U-CN模组驱动移植的更多相关文章

  1. ruby-on-rails - 如何在 Ruby on Rails 中实现由 JSF 2.0 (Primefaces) 驱动的 UI 魔法 - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道ruby​​onrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim

  2. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  3. ruby-on-rails - 可移植 Ruby on Rails 环境 - 2

    我给自己买了一个新的8gigUSBkey,我正在寻找一个合适的解决方案来拥有一个可移植RoR环境来学习。我在谷歌上搜索了一下,发现了一些可能性,但我很想听听一些现实生活中的经历和意见。谢谢! 最佳答案 我喜欢InstantRails,非常容易使用,无需安装程序,也不会修改您的系统环境。 关于ruby-on-rails-可移植RubyonRails环境,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/q

  4. ruby - 运行测试时静音 Chrome 驱动程序控制台输出 - 2

    我使用的是最新版本的Chrome(32.0.1700.107)和Chrome驱动程序(V2.8)。但是当我在Ruby中使用以下代码运行示例测试时:require'selenium-webdriver'WAIT=Selenium::WebDriver::Wait.new(timeout:100)$driver=Selenium::WebDriver.for:chrome$driver.manage.window.maximize$driver.navigate.to'https://www.google.co.in'defapps_hoverele_hover=$driver.find_

  5. node.js - 从未编写过任何自动化测试,我应该如何开始行为驱动开发? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。多年来,我一直在使用多种语言进行编程,并且认为自己总体上相当擅长。但是,我从未编写过任何自动化测试:没有单元测试,没有TDD,没有BDD,什么都没有。我已经尝试开始为我的项目编写适当的测试套件。我可以看到在进行任何更改后能够自动测试项目中所有代码的理论值(value)。我可以看到像RSpec和Mocha这样的测试框架应该如何使设置和运行所述测试变得相当容易

  6. ruby-on-rails - 在 Rails/Capybara/Poltergeist 规范中使用 url_for 将驱动程序发送到 example.com 而不是应用程序 - 2

    如果我在功能规范中调用url_for,它会返回一个以http://www.example.com/开头的绝对URL.Capybara会很乐意尝试加载该站点上的页面,但这与我的应用程序无关。以下是重现该问题的最少步骤:从这个Gemfile开始:source'https://rubygems.org'gem"sqlite3"gem"jquery-rails"gem"draper"gem"rails",'4.1.0'gem"therubyracer"gem"uglifier"gem"rspec-rails"gem"capybara"gem"poltergeist"gem"launchy"运行

  7. ruby-on-rails - 当 AJAX 调用在 Ruby on Rails 中失败时重定向到 500 页 - 2

    我正在使用一个用RubyonRails构建的应用程序,目前错误处理非常差。如果通过ajax执行Controller方法,并且该方法导致500(或404或任何其他响应),则呈现500.html页面并将其作为AJAX请求的结果返回。显然,javascript不知道如何处理该HTML,网页看起来只是在等待响应。在AJAX调用期间发生错误时,rails是否有一种简单的方法来呈现error.rjs模板? 最佳答案 您可以在Controller的rescue_action或rescue_action_in_public方法中使用respond_

  8. 驱动开发:内核无痕隐藏自身分析 - 2

    在笔者前面有一篇文章《驱动开发:断链隐藏驱动程序自身》通过摘除驱动的链表实现了断链隐藏自身的目的,但此方法恢复时会触发PG会蓝屏,偶然间在网上找到了一个作者介绍的一种方法,觉得有必要详细分析一下他是如何实现的进程隐藏的,总体来说作者的思路是最终寻找到MiProcessLoaderEntry的入口地址,该函数的作用是将驱动信息加入链表和移除链表,运用这个函数即可动态处理驱动的添加和移除问题。MiProcessLoaderEntry(pDriverObject->DriverSection,1)添加MiProcessLoaderEntry(pDriverObject->DriverSection,

  9. ruby-on-rails - Rails 以 JSON 格式返回所有 404 和 500 错误 - 2

    我是Rails的新手,正在使用Rails4。在我的应用程序中,我想返回所有JSON格式的404和500错误{"status":404,"message":"notfound"}有一个简单的方法可以做到这一点吗?因为我只是找到了使用rails3.x执行此操作的解决方案。谢谢我正在尝试执行此解决方案NeedtoreturnJSON-formatted404errorinRails但我在故障安全响应期间收到错误:未初始化的常量ErrorsController 最佳答案 也许您正在寻找这个:render:json=>@error_objec

  10. ruby - 事件/观察者驱动的 Ruby on Rails - 2

    我有一个适用于事件/监听器模型的应用程序。发布了几种不同类型的数据(事件),然后许多不同的事情可能需要也可能不需要对该数据(监听器)采取行动。监听器的发生没有特定的顺序,每个监听器将决定是否需要对事件采取行动。Rails应用程序有哪些工具可以完成此任务?我希望自己不必这样做(尽管我可以。这没什么大不了的。)编辑:观察者模式可能是更好的选择 最佳答案 查看EventMachine.它是一个非常流行的Ruby事件处理库。它看起来相当不错,而且很多其他库似乎都在利用它(Cramp)。这是一个很好的介绍:http://rubylearnin

随机推荐