4G模块驱动移植

news2024/11/24 2:31:32

一、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.coloradmin.cn/o/1021964.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

上四休三,未来的期许

近日“少上一天班,究竟香不香”引发关注,英国媒体2月21日报道,一项全世界目前为止参加人数最多的“四天工作制”试验,不久前在英国取得了成功。很多人表示上过四天班之后,给多少钱也回不去五天班的时代了。 来百度APP畅…

【Vue入门】语法 —— 插值、指令、过滤器、计算属性、监听器

目录 一、模版语法 1.1 插值 1.1.1 文本 1.1.2 html解析 1.1.3 属性 1.1.4 表达式 1.2 指令 1.2.1 核心指令 1.2.3 动态参数 二、过滤器 2.1 局部过滤器 2.2 全局过滤器 三、计算属性 四、监听器 五、排座案例 小结:计算属性和监听属性的区别 一、模…

Linux ____02、Linux开关机、目录介绍、文件目录相关命令(常用命令)

Linux开关机、目录介绍、目录相关命令(常用命令) 一、Linux开关机二、目录介绍三、目录相关命令(常用命令)1、ls命令,列出目录内容2、cd命令,切换目录;pwd,查看当前工作路径3、mkdi…

fire-voc 火光 烟火 火灾 目标检测数据集

一年中最容易引发火灾的季节是在冬季,主要原因有这样几点。 1、秋冬季节,随着用火、用电、用气增加,加上天气干燥,棉花、木材 、衣物等物体内含有的水分也较低。2、秋冬季风力较大,一旦有火苗冒起就很容易随风蔓延,是火灾的高发期。3、春季也是火灾多发季节&#x…

malloc是如何实现内存分配的?

文章目录 前言一、malloc实现原理概括?二、brk() 函数与mmap()函数三、mmap实现原理普通读写与mmap对比mmap内存映射实现过程mmap 的适用场景 前言 在C和C中,malloc函数是用于动态分配内存的常用函数。本文将深入探究malloc函数的内存分配实现机制&…

背靠背 Nature 新方向 - 蛋白质结构家族图谱的“潘多拉魔盒”

NBT - Foldseek快速准确搜索结构相似的蛋白,AlphaFold蛋白质数据库提供了一个快速的搜索工具 AlphaFold的极限:高中生揭示人工智能在生物信息学挑战中的缺陷AlphaFold2开源了,不是土豪也不会编程的你怎么蹭一波? 对蛋白结构的大规模分析揭示了…

对抗网络爬虫:反爬虫技术与策略详解

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 在今天的互联网世界中&a…

机器学习入门与实践:从原理到代码

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 在本文中,我…

PDF编辑内容怎么做?这几个方法快来了解

PDF(便携式文档格式)是一种常用的文档格式,但有时我们需要对PDF文件进行编辑,那么小伙伴们知道PDF编辑内容怎么做吗?下面将介绍几种编辑PDF的方法以及注意事项。 1.使用手机编辑PDF文档 最近有个小伙伴说由于工作经常…

模拟实现C语言--strcpy函数

模拟实现C语言–strcpy函数 文章目录 模拟实现C语言--strcpy函数一、strcpy函数是什么?二、使用示例三、模拟实现 一、strcpy函数是什么? strcpy函数是将字符串中的内容复制到另一个字符串中使用的库函数 char* strcpy(char * destination, const char…

【LeetCode热题100】--15.三数之和

15.三数之和 注意:最后答案中不能包含重复的三元组 使用排序双指针 可以使用三重循环枚举三元组,但是需要哈希表进行去重操作,得到不包含重复三元组的最终答案,消耗量大量的时间和空间 对于不重复的本质,保持三重循环…

【Linux学习笔记】 - 常用指令学习及其验证(下)

前言:本文延续上一篇文章【Linux学习笔记】 - 常用指令学习及其验证(上)对常用的指令进行介绍和验证。 一、mv指令 (1)功能:用来移动文件或者将文件改名 (2)语法及验证&#xff1a…

【QT--使用百度地图API显示地图并绘制路线】

QT--使用百度地图API显示地图并绘制路线 前言准备工作申请百度地图密钥(AK)安装开发环境 开发过程新建项目ui界面GPSManager类主窗口Map 效果展示 前言 先吐槽一下下,本身qt学的就不咋滴,谁想到第一件事就是让写一个上位机工具,根据CAN总线传…

OJ练习第177题——打家劫舍 IV(二分查找)

打家劫舍 IV 力扣链接:2560. 打家劫舍 IV 题目描述 沿街有一排连续的房屋。每间房屋内都藏有一定的现金。现在有一位小偷计划从这些房屋中窃取现金。 由于相邻的房屋装有相互连通的防盗系统,所以小偷 不会窃取相邻的房屋 。 小偷的 窃取能力 定义为…

人脸修复祛马赛克算法CodeFormer——C++与Python模型部署

一、人脸修复算法 1.算法简介 CodeFormer是一种基于AI技术深度学习的人脸复原模型,由南洋理工大学和商汤科技联合研究中心联合开发,它能够接收模糊或马赛克图像作为输入,并生成更清晰的原始图像。算法源码地址:https://github.c…

同步 -- 互斥锁

本篇文章基于Linux-6.5源码 建议:搭配Linux源码观看更佳 struct mutex {atomic_long_t owner;spinlock_t wait_lock; //自旋锁,该自旋锁的作用是保护后面的等待队列的原子性struct list_head wait_list; //等待队列 }; API接口 mutex_init 互斥锁初…

C语言入门Day_22 初识指针

目录 前言: 1.内存地址 2.指针的定义 3.指针的使用 4.易错点 5.思维导图 前言: 之前我们学过变量可以用来存储数据,就像一个盒子里面可以放不同的球一样。 这是一个方便大家理解专业概念的比喻。 在计算机世界里面,数据实…

海外ASO优化之提高应用曝光度的技巧1

作为应用程序的开发者,如何使我们的应用在众多竞争对手中脱颖而出?如何应用在App Store搜索中排名更高,以确保它符合App Store搜索中的搜索意图?这些都是我们要重点考虑的。 1、做好应用程序描述。 在填写应用描述之前&#xff0…

直线模组的常用语

在工业生产中,直线模组的叫法有很多种,对于新手小白来说,很容易就会被绕晕,今天我们就来简单说一下直线模组的常用称呼吧! 1、直线模组:与直线滑台同义,基本可以相互互换。直线模组一般是指可以…

编译原理.龙书学习1

第一章: 编译器:将程序翻译成一种能够被计算机执行的形式 解释器:解释器直接利用用户提供的输入执行源程序中指定的操作 一个编译器的结构 编译器将源程序映射为语义上等价的目标程序,这个映射过程由两部分组成:分析…