4G模块驱动移植

一、4G模块概述

1、调试的模块型号是广和通的 NL668-EAU-00-M.2。

2、使用的接口是 M.2 Key-B。实际只用到了M2里的USB接口。

  1. 调试过程

    以QMI_WWAN号方式进行说明,其他拨号方式也试过。最后以QMI_WWAN方式调通了,拨号成功了。

    其他拨号方式因为现有文档资料工具移植平台导致失败,比如GobiNet拨号提供AT$QCRMCALL=1,1现驱动已不支持,提供的AT通信文档也没有该指令且使用其他拨号方式提供拨号AT指令也不支持,ECM拨号方式走到了获取IP地址哪一步,但是使用udhcpc -i usb0获取的ip为本公司内网的ip,初步怀疑是是该拨号方式与hisi平台udhcpc指令兼容性的问题,最后又重新选择的qmi拨号方式。

    一开始就是用的qmi拨号方式,主要是该拨号方式驱动集成简单只需要修改内核配置及其文件即可,且设置APN获取ip等通过工具即可不需要外部输入AT指令,但是可能是hisi平台系统的差异性,该厂商提供的拨号程序始终获取不到ip,最后找了个新的开源的拨号程序quectel-cm成功获取到ip且ping通网络。

1、USB串口驱动集成

1)修改内核配置

修改内核支持option驱动。

在 Device Drivers > USB support > USB Serial Converter support 下选中 USB driver for GSM and CDMA modems。

修改 USBnet 驱动支持,因此需要配置 Linux 内核,配置 方法如下:

Device Drivers->Network device support->USB Network Adapters

选中如下组件:

Multi-purpose USB Networking Framework

2)修改option.c文件

文件路径:drivers/usb/serial/option.c 。

在源码中找到option_ids数组,在数组中添加NL668产品的VID(0x1508)和PID(0x1001);

static const struct usb_device_id option_ids[] = {

… …

{ USB_DEVICE(0x1508, 0x1001),

.driver_info = RSVD(4)},

文件中已经添加了改VID,只需过来rm net端口即可。

3)修改qmi_wwan文件

文件路径:drivers/net/usb/qmi_wwan.c。

在源码中找到usb_device_id数组,在数组中添加NL668产品的VID(0x1508)和PID(0x1001);

static const struct usb_device_id products[] = {

... ...

{QMI_FIXED_INTF(0x1508, 0x1001, 4)},

... ...

在该文件添加RAW IP支持

添加qmi_wwan_tx_fixup函数接口

struct sk_buff *qmi_wwan_tx_fixup(struct usbnet *dev, struct sk_buff *skb,gfp_t flags)

{

if (dev->udev->descriptor.idVendor !=cpu_to_le16(0x1508))

return skb;

// Skip Ethernet header from message

If (skb_pull(skb, ETH_HLEN)) {

return skb;

}

else {

dev_err(&dev->intf->dev, "Packet Dropped");

}

// Filter the packet out, release it

dev_kfree_skb_any(skb);

return NULL;

}

找到qmi_wwan_bind函数 在err: retuen status;前添加if语句

static int qmi_wwan_bind(struct usbnet *dev, struct usb_interface *intf)

{

... ...

if (dev->udev->descriptor.idVendor == cpu_to_le16(0x1508))

{

dev_info(&intf->dev, "Fibocom nl668 work on RawIP mode\n");

dev->net->flags |= IFF_NOARP;

usb_control_msg(

interface_to_usbdev(intf),

usb_sndctrlpipe(interface_to_usbdev(intf), 0),

0x22,//USB_CDC_REQ_SET_CONTROL_LINE_STATE

0x21,//USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE

1, //active CDCDTR

intf->cur_altsetting->desc.bInterfaceNumber,

NULL, 0, 100);

}

err:

return status;

}

找到 qmi_wwan_info结构体在末尾添加.tx_fixup = qmi_wwan_tx_fixup,

static const struct driver_info qmi_wwan_info = {

... ...

.tx_fixup = qmi_wwan_tx_fixup,

};

2、内核环境确认

修改内核源码根目录.config 文 件 ,.config 中修改 CONFIG_USB_NET_QMI_WWAN=y 、

CONFIG_USB_SERIAL_OPTION=y

选中后保存配置,重新编译内核。

3、USB 串口驱动加载确认

使用lsusb 和 ls /dev/ttyUSB*命令,查看是否加载成功。如果lsusb没有相关设备出来,先确认内核是否修改成功在确认硬件问题。

ls /dev/ttyUSB* 正常可以看到4个设备。

/dev/ttyUSB0 /dev/ttyUSB1 /dev/ttyUSB2 /dev/ttyUSB3

4、USBMODE确认

QMI_WWAN模式需要特定的模式支持。用AT指令先查询模式,一般为17

用 AT+GTUSBMODE? 指令查询模式,显示如下,即不用修改。

echo -e "AT+GTUSBMODE?\r\n" > /dev/ttyUSB2 ; cat /dev/ttyUSB2

+GTUSBMODE: 17

OK

如果返回值不为17、22或25时,表示模块未进入 RMNET,需要发 AT+GTUSBMODE=x(x 为 17 、 22 或 25)成功后,并重启模块,使模块切换到 RMNET 模式。

模式切换完毕后使用ifconfig命令查看网卡信息,如果出现wwan0表示wwan0驱动加载成功,如果该网卡信息没有出现则确认qmi_wwan.c文件中修改是否有缺漏,.config配置中是否添加CONFIG_USB_NET_CDCETHER=y

CONFIG_USB_USBNET=y,CONFIG_USB_NET_CDCETHER=y, CONFIG_USB_USBNET=y

4、QMI_WWAN 拨号程序编译

该模块文档提供的拨号程序与问题始终不能通过udhcpc获取到ip可能是平台兼容性没有做好,所以在网上找了个开源的拨号程序quectel-CM(quectel-cm-main),交叉编译后移植到板机上输入一下命令即可:

Example 1: ./quectel-CM

Example 2: ./quectel-CM -s 3gnet

例2第三位参数为sim卡的apn,运行成功如下图所示成功获取ip:

注:APN要对应运营商,运营商不同则需要不同APN

最后还需给wwan0网卡分配默认路由;即可成功ping通百度等外网,如果发现延迟过高先查看是否是LTE模式若不是则发送

echo -e "at+gtact=10,3\x0D\x0A" > /dev/ttyUSB1 ; cat /dev/ttyUSB1

返回

at+gtact=10,3

OK

则重新使用拨号程序获取ip。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/136100.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过Power Platform自定义D365CE业务需求 - 1. Microsoft Power Apps 简介

Microsoft Power Apps是一个趋势性的、无代码和无代码的商业应用程序开发平台,配有一套应用程序、服务和连接器。其数据平台为构建适合任何业务需求的自定义业务应用程序提供了快速开发环境。随着无代码、少代码应用程序开发的引入,任何人都可以快速构建低代码应用程序,并与…

linux系统报“INFO: task java:xxx blocked for more than 120 seconds.”解决办法

1、问题描述 linux系统,输入dmesg -T,报“INFO: task java:xxx blocked for more than 120 seconds.”,如下 一般情况下,linux会把可用内存的40%的空间作为文件系统的缓存。当缓存快满时,文件系统将缓存中的数据整体同…

安卓系列机型 另类体验第三方系统 DSU操作步骤解析 不影响主系统开启第二系统

dsu loader即 动态系统更新,可以在使用动态分区的安卓设备上,不影响原来系统的同时安装一个副系统,用于体验最新的原生安卓系统。可以不影响主系统的基础上体验其他gsi第三方。DSU 依赖于 Android 动态分区功能,并要求 GSI 作为可…

VRTK4⭐四.和 UI 元素交互

文章目录 🟥 安装Tilia Unity.UI🟧 配置射线与UI交互器1️⃣ 配置直线射线2️⃣ 配置UI交互器 🟨 配置UI1️⃣ 更新EventSystem2️⃣ 进行Canvas设置 我们要实现的功能: 右手触摸到圆盘:显示直线射线 右手圆盘键按下:与选中UI交互 &#x1f7…

分类散点图 stripplot() 加辅助线axhline() 多图合一

分类散点图 stripplot 加辅助线axhline 多图合一 效果图代码 画图没有什么可说的,直接上图 效果图 代码 # 绘制图, 查看是否数值在阈值上 plt.figure(figsize(30, 18)) n 0 for header, value_list in info_dict.items():ref_value_list ref_info_dic…

[S2] Challenge 25 心脏病预测

问题 您是一家医疗保健公司的数据科学家,试图创建患者是否患有心脏病的预测因子。目前,您正在试验 11 种不同的特征(潜在心脏病指标)和 XGBoost 分类模型,您注意到它的性能可能会根据其调整方式而发生很大变化。在此挑…

以矩阵的形式,对点或线段或多边形绕固定点旋转方法

一、仅旋转 ,其中x,y旋转前横纵坐标,x’,y’为旋转后横纵坐标。θ旋转角度,单位为弧度。 等价于:x’ xcosθysinθ,y’-xsinθycosθ 注:此矩阵仅为旋转矩阵,不包含平移和缩放。 二、旋转平…

eclipse 源代码文件报错处理

用 eclipse 的 kepler 版本编译项目的时候没有提示、刷新之后发现居然 “新增” 了几个红叉。但是几分钟前还好好运行;都是从代码仓库更新来的、不可能报错。 看了文件最后的更新时间,更加确认了想法: 于是找一个无端报错的文件、随便加一个花…

【Linux】动静态库

目录 1.静态库2.动态库3.静态库的使用区别总结 1.静态库 我们在linux中已经帮我们下载好了C和C所需要的各种库,库也是文件,实际上就是各种接口的实现,我们在使用系统提供的譬如printf等函数时,就是使用系统中的库文件。使用一个库…

成功的海外网红营销:文化和价值观冲突的应对策略

随着全球数字化和社交媒体的崛起,海外网红营销已经成为企业推广产品和服务的一种重要方式。然而,这种全球性的营销活动也伴随着文化和价值观的多样性,容易导致潜在的冲突和误解。为了取得成功并避免不必要的争议,企业需要深入了解…

Solidity 小白教程:21. 调用其他合约

Solidity 小白教程:21. 调用其他合约 调用已部署合约 开发者写智能合约来调用其他合约,这让以太坊网络上的程序可以复用,从而建立繁荣的生态。很多web3项目依赖于调用其他合约,比如收益农场(yield farming&#xff0…

北工大汇编——综合题(2)

题目要求 编写一个比赛得分程序。共有7 个评委,按百分制打分,计分 原则是去掉一个最高分和一个最低分,求平均值。要求: 评委的打分以十进制从键盘输入。成绩以十进制给出,并保留 1位小数。输入输出时屏幕上要有相应提…

Unity WebGL 编译 报错: emcc2: error: ‘*‘ failed: [WinError 2] ϵͳ�Ҳ���ָ�����ļ���解决办法

文章目录 错误日志可能的原因及解决办法:导出路径不能有中文系统名(win)含有中文, 修改环境变量Temp和Tmp, 如下图:真正的原因: 杀毒软件删除了部分wasm相关文件,如: 错误日志 Building Library\Bee\artifacts\WebGL\build\debug_WebGL_wasm\build.js failed with output: emc…

D*算法图文详解

前面学习了Dijkstra以及A* 算法的基本原理,对于这两种算法而言,我们都能在有解的情况下找到一条沿着起点到达终点的路径。然而,这两个算法本身都是基于静态地图的,也就是说:当机器人找到路径后开始沿着起点向终点运动的…

接口测试学习

1、curl 命令 无参:curl -X POST -H"Authorization: abcdefghijklmn" https://xxx.xxxxx.com/xxxx 有参:curl -X POST -H"Authorization:abcdefghijklmn " -H"Content-Type:application/json" https://xxx.xxxxx.com/…

【Java 集合】常用的Java集合体系(134)

一、集合的体系分类 分为单列集合,双列集合。和数组相比,大小可变更加灵活。

STM32 USB CDC 虚拟串口

// 用虚拟串口(USB CDC VCP)感觉有些不稳定,尤其是下位机掉电后再上电,上位机虚拟的那个串口根本不能用,还有就是 // 必须等虚拟串口出来后且知道串口号上位机才可以执行打开操作// 上面是实际情况,但并不是STM32的USB不行&#x…

Golang 基础面试题 01

Golang 面试题合集.png 背景 在之前的文章中分享了 k8s 相关的面试题,本文我们重点来讨论和 k8s 密切相关的 Go 语言面试题。 这几年随着云原生的兴起,大部分后端开发者,特别是 Java 开发者都或多或少的想学习一些 Go 相关的技能,…

Python 基础入门

给我家憨憨写的python教程 ——雁丘 Python解释器Pycharm的安装部署 关于本专栏一 Python简介1.1 Python优点1.2 支持的编程方式1.3 版本兼容问题1.4 Python的开发环境1.4.1 常用的 Python 编辑器1.4.2 常用的 Python IDE1.4.3 Python IDLE1.4.4 第三方库安装 1.5 Python 的运…

2023年8月知识复习

物联网总括 物联网即通过网络将客观事物进行智能化互联的网络系统。互联网主要是人与人、人与计算机之间的通信,而物联网主要是物联网设备之间的通信。 注意:数据上传到云端不是物联网的必要条件。物联网可以仅在本地网络和局域网中进行通信和数据处理…