全志V3S嵌入式驱动开发(解决kernel 5.2.y wifi驱动问题)

news2024/9/28 10:00:15

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        wifi模块,之前测试的时候,开发板上用的是esp 8089,当时内核时4.14.y,测试结果也是通过的。印象不是太深的朋友可以回顾一下,链接地址在这,

https://blog.csdn.net/feixiaoxing/article/details/131178420?spm=1001.2014.3001.5501

        那个时候测试,我们就说过,wifi驱动可能是除了镜像制作之外,最复杂的一个驱动工作。因为它除了电路分析、设备树、驱动编译之外,还得自己编译wpa_supplicant等工具。这次内核升级成5.2.y,我们也需要回过头来看下,wifi驱动在新内核是不是还能编译成功,是不是还能运行得起来。

1、重新编译esp 8089驱动代码

        因为之前下载了esp 8089的驱动代码,我们也升级了内核,所以第一步就是对驱动进行重新编译。说是重新编译,本质来说,就是将4.14.y 内核目录替换成新内核 5.2.y 的路径就可以了,

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make -C ~/Desktop/linux-zero-5.2.y M=${PWD}  modules

2、拷贝其他驱动和wpa_supplicant软件到u盘,准备测试

        在解决5.2.y内核版本网卡驱动的时候,发现很多驱动都以ko的形式存在了。我们的解决办法就是把对应的驱动改成y,这样比较简单。当然,这么做是有后果的。后果就是zImage文件的大小变了很多。这不是说,zImage就不能增加,关键是zImage发生了改变,那么uboot、rootfs的布局就要发生改变,一连串的修改就要去完成,所以这有点麻烦。最后,我们想到的办法,就是用insmod安装ko文件好了,虽然麻烦点,但是好歹也能解决驱动问题。

feixiaoxing@feixiaoxing-VirtualBox:~/Desktop/linux-zero-5.2.y$ find . -name "*.ko"
./drivers/video/backlight/lcd.ko
./drivers/input/mousedev.ko
./drivers/staging/rtl8723bs/r8723bs.ko
./drivers/usb/class/cdc-wdm.ko
./drivers/usb/serial/usbserial.ko
./drivers/usb/serial/cp210x.ko
./drivers/usb/serial/usb-serial-simple.ko
./drivers/usb/common/usb-otg-fsm.ko
./lib/crypto/libarc4.ko
./net/ipv4/tcp_westwood.ko
./net/ipv4/tcp_bic.ko
./net/ipv4/udp_diag.ko
./net/ipv4/tcp_htcp.ko
./net/wireless/cfg80211.ko
./net/mac80211/mac80211.ko

        通过分析上面这个搜索结果,大体也能看得出来。除了esp 8089的驱动外,cfg80211.ko、mac80211.ko、libarc4.ko这三个动态库文件也是用的上的。至于tcp_westwood.ko、tcp_bic.ko、udp_diag.ko、tcp_htcp.ko这四个文件是不是用得上,我们到时候再看。从名字上说,他们都是和网络相关的,但是从内容上说,前面三个更加紧密一点。

        当然除了驱动之外,wpa_supplicant也是很重要的。它最大的作用就是帮助嵌入式设备连接上wifi ap。只有连接上了ap,我们的wlan0才能配置ip、进行后续的工作。

3、准备wpa_supplicant.conf和拷贝libnl的动态库文件

        wpa_supplicant.conf主要是记录wifi ssid和密码,准备一份即可,

ctrl_interface=/var/run/wpa_supplicant
network={
    ssid="xiaoyan_home"
    psk="88888888"
}

        而libnl的动态库,则是运行wpa_supplicant需要的,所以我们有必要也把libnl的动态库拷贝到u盘上面。当然,执行的时候需要把路径带上就行。此外,如果因为链接不太好copy,可以通过cp命令直接来解决,

cp libnl-3.so.200.18.0 libnl-3.so.200
cp libnl-idiag-3.so.200.18.0 libnl-idiag-3.so.200
cp libnl-cli-3.so.200.18.0 libnl-cli-3.so.200
cp libnl-nf-3.so.200.18.0 libnl-nf-3.so.200
cp libnl-genl-3.so.200.18.0 libnl-genl-3.so.200
cp libnl-route-3.so.200.18.0 libnl-route-3.so.200

        最后,如wpa_supplicant.conf所示,到时候还需要创建一个目录,它的名称就是/var/run/wpa_supplicant,这个需要注意下。

4、开始测试

        因为测试的内容比较多,所以我们可以写成脚本一步一步来。首先,第一步肯定是插好u盘,安装好基础驱动,

mount /dev/sda1 /mnt
cd /mnt/v3s
insmod libarc4.ko
insmod cfg80211.ko
insmod mac80211.ko

        等第一步没问题,下面就是安装esp 8089驱动,

insmod esp8089.ko esp_reset_gpio=43

        驱动安装好了,接着就是为执行wpa_supplicant做准备,

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mnt/v3s/lib
ifconfig wlan0 up
mkdir -p /var/run/wpa_supplicant

        有了上面这些铺垫,终于到了最重要的一步,那就是利用wpa_supplicant看一下,wlan0是不是可以连接上ap节点。连接上,那么问题不大,否则就有点麻烦了,

./wpa_supplicant -D wext -c /mnt/v3s/wpa_supplicant.conf -i wlan0 &

        让我们没想到是,这前面的步骤都很顺利,就是这最后一步出了麻烦,

# ./wpa_supplicant -D wext -c /mnt/v3s/wpa_supplicant.conf -i wlan0 &
# Successfully initialized wpa_supplicant
rfkill: Cannot open RFKILL control device
ioctl[SIOCSIWMODE]: Operation not supported
ioctl[SIOCGIWRANGE]: Operation not supported
ioctl[SIOCGIWMODE]: Operation not supported
ioctl[SIOCSIWAP]: Operation not supported
ioctl[SIOCSIWESSID]: Operation not supported
ioctl[SIOCSIWENCODEEXT]: Operation not supported
ioctl[SIOCSIWENCODE]: Operation not supported
ioctl[SIOCSIWENCODEEXT]: Operation not supported
ioctl[SIOCSIWENCODE]: Operation not supported
ioctl[SIOCSIWENCODEEXT]: Operation not supported
ioctl[SIOCSIWENCODE]: Operation not supported
ioctl[SIOCSIWENCODEEXT]: Operation not supported
ioctl[SIOCSIWENCODE]: Operation not supported
ioctl[SIOCSIWENCODEEXT]: Operation not supported
ioctl[SIOCSIWENCODE]: Operation not supported
ioctl[SIOCSIWENCODEEXT]: Operation not supported
ioctl[SIOCSIWENCODE]: Operation not supported
ioctl[SIOCSIWSCAN]: Operation not supported
wlan0: CTRL-EVENT-SCAN-FAILED ret=-1 retry=1
ioctl[SIOCSIWSCAN]: Operation not supported

5、尝试解决问题

5.1 尝试配置RFKILL

        解决问题的第一步,肯定是观察现象,分析日志。从日志当中,我们看到了这么一句,

rfkill: Cannot open RFKILL control device

        后来查资料说,是menuconfig里面需要配置下RFKILL。结果是我们重新配置、编译了,结果没有改善。

5.2 查看dmesg信息

        内核信息一般用dmesg进行查看、分析的,不过很可惜,没有特别有用的信息。

5.3 将其他udp/tcp的ko文件也加进来

        走这一步有点病急乱投医的味道,安装驱动倒是没有什么问题,结果没有改善。

5.4 将wpa_supplicant和lib文件拷贝到root目录

        因为打印日志上面,有关于权限的打印,所以我们的一个直觉就是,是不是执行文件的权限设置错了。所以,就把wpa_supplicant和依赖的lib文件都拷贝到root目录下来执行,

ioctl[SIOCSIWMODE]: Operation not supported
ioctl[SIOCGIWRANGE]: Operation not supported

        思路没啥问题,可是没有解决问题。

5.5 重新编译wpa_supplicant

        之前wpa_supplicant和kernel 4.14.y搭配没问题的,但是换成kerenel 5.2.y就不行了。那是不是wpa_supplicant重新编译一下就好了,毕竟升级了内核,而且我们还替换了编译器。wpa_supplicant之前依赖的文件代码都还在,本身编译过程不复杂,重新做一次就好了。只是结果很失望,没有解决问题。

6、灵光一闪

        有一个很奇怪的现象,那就是wpa_supplicant和4.14.y kernel搭配就没有问题,和现在的kernel搭配就有问题,而驱动代码都没有变。这说明wpa_supplicant和esp8089出问题的可能性不大,问题还是出在5.2.y kernel的配置上,带着这个疑问,我们比较了一下两者的menuconfig配置差别。没想到还真的有不一样的地方,

        在4.14.y kernel上面,关于无线通信的配置,是这么做的,

         通过和5.2.y kernel上面比较,这其中cfg wireless extensions compatibility是没有选上的。所以,我们猜测原因很有可能是这个。除此之外,wpa_supplicant上面有一个wext选项,估计也是wireless extensions的缩写。如果对应的内容没有选上,那么命令当然就不得不到执行了。

        所以,我们选上wext,快速生成zImage和ko文件之后,重新烧录了一把,没想到还真的解决了问题,

        回过头来看,整个过程的解决虽然花费了一天多的时间,但是好歹学了一点东西。此外,对于曾经成功的配置,一定要注意保存,不要轻易地丢弃、或者处理掉。

 

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

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

相关文章

《C++ Primer》--学习10

反向迭代器 反向迭代器就是在容器中从尾元素向首元素反向移动的迭代器,递增一个反向迭代器会移动到前一个元素 反向迭代器需要递减运算符 我们只能从既支持也支持--的迭代器来定义反向迭代器,除了 forward_list 外的标准容器都支持 流迭代器不支持递减…

【分布式存储】聊聊共识和一致性

在分布式存储系统中,对于提高性能、可用性、可拓展性来说都有相关机制可以保证,比如复制、切片等,但是一旦涉及到分布式系统中选主的问题,就比较难,因为网络是不可靠的,并且可能还有拜占庭将军问题。所以如…

JAVA8-lambda表达式7:重要的函数接口

从什么是好代码讲起 最近又在看《clean code》&#xff0c;回顾了一下里面提到的整洁代码的标准。 然后审视了一下现在的项目代码&#xff0c;里面还有很多if&#xff0c;for循环。比如&#xff1a; // 查询用户列表 List<User> userList userService.list(); // 打印…

VSC++: 验证身份证

缘由https://ask.csdn.net/questions/1082358 void 验证身份证() {//缘由https://ask.csdn.net/questions/1082358int 权重[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }, 个 0, j 0, a 0, he 0;char M[] "10X98765432", 身份号[100][20]{};//…

如何备份 Kubernetes MySQL Operator 集群

Oracle 的MySQL Operator for Kubernetes 是在集群内自动化 MySQL 数据库配置的便捷方法。该运营商的主要功能之一是集成的自动备份支持,可提高您的弹性。备份会定期将数据库复制到外部存储。 本文将引导您完成设置到与 Amazon S3 兼容的对象存储服务的备份。您还将了解如何将…

C/C++结构体内存对齐的一些思考

在C中&#xff0c;结构体的内存对齐是为了提高访问结构体成员变量的效率和保证硬件的要求。 结构体对齐 C/C C 结构体内存对齐的示例代码C/C结构体内存对齐的原则结合汇编代码分析结构体的内存对齐问题 C 结构体内存对齐的示例代码 #include <iostream>struct Test_Stru…

运维必学 | 初识介绍-从零开始学Windows批处理(Batch)编程系列教程

欢迎关注「全栈工程师修炼指南」公众号 设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习&#xff01; 专注 企业运维实践、网络安全、系统运维、应用开发、物联网实战、全栈文章 等知识分享 “ 花开堪折直须折&#xff0c;莫待无花空折枝。 ” 作者主页&#xff1…

ACL 2023长文 | 基于能量超球体模型提升以事件为中心的结构化预测

论文标题&#xff1a; SPEECH: Structured Prediction with Energy-Based Event-Centric Hyperspheres 收录会议&#xff1a; ACL 2023 Main Conference 论文链接&#xff1a; https://arxiv.org/abs/2305.13617 开源链接&#xff1a; https://github.com/zjunlp/SPEECH 总述 以…

硬件知识:条码打印机5大接口类型介绍

目录 1、串口 2、并行接口 &#xff08;并口&#xff09; 3、USB接口 4、网口 5、PS/2接口 接口选择的不同&#xff0c;其打印输出的速度也不同。 条码打印机与计算机之间都是通过接口连接的&#xff0c;条码打印机常见的分为5种接口&#xff1a;串口&#xff08;也有称之…

分布式学习第五条 Nginx + FastDFS

使用nginx和FastDFS可以实现下载&#xff0c;类似百度网盘&#xff0c;需要对环境进行配置&#xff0c;nginx作为代理服务器&#xff0c;fastDFS负责执行上传下载操作。 1. 文件上传下载流程 文件上传流程 文件下载流程 优化 优化思路: 直接让客户端连接fastDFS的存储节点, …

Flutter之 Bloc实战实现购物车功能

Flutter之 Bloc实现购物车功能 前言商品列表模块状态设置UI设计业务逻辑测试代码购物车模块状态设置业务逻辑UI设计加入购物车测试代码参考资料前言 本篇以官方购物车项目为例,说明Bloc在Flutter的应用。该项目很简单,就两个模块,一个是商品列表页面模块catalog,一个是购物…

使用gradio库的File模块实现文件上传和展示

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

MATLAB迭代

目录 黄金分割比 习题 符号运算 固定点 WHY hello world Goldrect 黄金分割比 format for循环 %% For loopx 42for k 1:12x sqrt(1x);disp(x)end while循环 %% While loopx 42;k 1;while abs(x-sqrt(1x)) > 5e-5x sqrt(1x);k k1;endk 绘图语句 %% Plotx -pi:…

现在的前端,到底是技术深度重要,还是技术广度重要?

前言 大家好&#xff0c;&#xff0c;用最通俗易懂的话讲最难的知识点是我的座右铭&#xff0c;基础是进阶的前提是我的初心。 前几天跟朋友讨论“技术广度和技术深度哪个重要”&#xff0c;再想想自己像过山车一般的前端历程&#xff0c;有感而发&#xff0c;想给小兄弟们一…

简单的学习下 JavaScript 录屏API

学习如何使用这个简单易用的API进行屏幕共享、屏幕录制等操作。尽管需要对JavaScript有一定的了解&#xff0c;但我相信你已经具备了这方面的知识。 1、开始录制 让我们创建一个按钮&#xff1a; <button id"recording-toggle">Start recording</button>…

BUUCTF变异凯撒

根据题目可以得知&#xff0c;这道题使用的是凯撒密码 凯撒密码&#xff0c;是一种位移加密方式&#xff0c;只对26个字母进行位移替换加密&#xff0c;规则简单&#xff0c;容易破解。 但是根据题目下发的文件看来&#xff0c;出现了关于除字母以外的字符&#xff0c;结合题目…

综合评价算法 | Matlab实现基于变异系数法的综合评价算法

文章目录 效果一览文章概述研究内容源码设计参考资料效果一览 文章概述 综合评价算法 | Matlab实现基于变异系数法的综合评价算法 研究内容 变异系数法是根据统计学方法计算得出系统各指标变化程度的方法,是一种客观赋权法。根据该方法变化差异较大的指标权重较大,变化差异较…

【C++ 实现】图论概念,最小生成树,单/多源最短路径实现

文章目录 数据结构表示图最小生成树KruskalPrim 最短路径DijkstraBellman-Ford算法多源最短路径&#xff1a;FloydWarshall 总结 数据结构表示图 首先节点的存取&#xff0c;V是节点key&#xff0c;vector<pair<V,V>> map;其实已经能表达一个图了&#xff0c;但是…

MWCS 2023,到底有些啥?(上篇)

大家好&#xff0c;MWCS 2023&#xff08;世界移动通信大会上海展&#xff09;已经结束了。按照老规矩&#xff0c;我来给大家汇报一下现场情况。 █ 展会总结 今年是MWC在中国的第十届&#xff0c;也是疫情管控解除后的第一届。从总体情况来看&#xff0c;人气非常火爆。展区人…

ElasticSearch - 根据经纬度,简单搜索指定距离范围内的数据

ES的地图检索方式 ES支持的地图检索方式有以下几种&#xff1b; geo_distance geo_bounding_box geo_polygon 1、geo_distance&#xff1a;直线距离检索&#xff0c;如给定点A&#xff0c;要求返回地图上距离点A三千米的商家&#xff08;点外卖场景&#xff09; 2、查找索引…