全志V3S嵌入式驱动开发(wifi驱动)

news2025/2/12 0:43:34

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

        荔枝派上面除了支持v3s自带的有线网口,还带有一个支持sd协议的esp 8089 wifi模块。有了这个模块,v3s没有网线,也可以用它和外界联系了。但是,我们实际测试下来,效果并不算很理想。这其中最主要的原因,就是网络延迟有点高,哪怕路由器就在测试桌旁,改善也不是很大。当然,我们也看到有人使用了wifi模块RTL8723BS,不知道效果如何。有使用经验的朋友不妨留个言,相互学习下。

        当然,不管esp8089自身质量如何,都不妨碍我们了解一下整个开发过程,比如在Linux下面,一个WiFi设备驱动应该如何加载,测试应该如何进行。

1、原理图

         开始今天的讨论之前,我们不妨重新看一下这个wifi电路图。首先最上面是两个晶振的引脚,右上方是26M晶振的输入输出图。右侧是SDC信号,除了clk和cmd之外,就是d0-d3。下方除了一个3v3,其他都是悬空。左侧除了一个ipex天线,剩下来就是一个CHIP_EN,通看全图的话,发现它和PWM0复用同一个信号。

 

2、修改dtsi文件

        看完了原理图,下面第一个要准备的就是修改设备树文件。修改的地方都位于同一个文件,即sun8i-v3s-licheepi-zero-with-lcd.dtsi。首先,关闭led,因为和wifi模块有冲突,

	leds {
		/* The LEDs use PG0~2 pins, which conflict with MMC1 */
		status = "disbaled";
	};

        其次,使能mmc1,也就是这个wifi接口,

&mmc1 {
	broken-cd;
	bus-width = <4>;
	vmmc-supply = <&reg_vcc3v3>;
	status = "okay";
};

        有同学如果想要对pin引脚和寄存器、中断了解更多,可以参考文件sun8i-v3s-licheepi-zero.dts中的内容。编译好之后,记得把新的dtb文件拷贝到sd卡上面。

3、准备驱动文件

        目前在linux 4.14.y上面没有看到esp 8089的驱动,所以这部分需要自己去其他地方下载。比如,有一个下载的地址位于github这个地方,即

https://github.com/al177/esp8089

        下载好之后,可以拷贝到ubuntu虚拟机,准备开始编译。编译方法很多,可以选用这种,直接赋值KBUILD和SRC_DIR,

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KBUILD=~/Desktop/linux-zero-4.14.y SRC_DIR=~/Desktop/esp8089-master

        或者含蓄一点,使用-C和M来代替,也是可以的

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

        不管哪一种方法,其实都是可以生成esp8089.ko文件的,

feixiaoxing@feixiaoxing-VirtualBox:~/Desktop/esp8089-master$ make
make -C /usr/src/linux-headers-5.15.0-73-generic M=/home/feixiaoxing/Desktop/esp8089-master
make[1]: Entering directory '/usr/src/linux-headers-5.15.0-73-generic'
./scripts/pahole-flags.sh: line 7: return: can only `return' from a function or sourced script
./scripts/pahole-flags.sh: line 7: return: can only `return' from a function or sourced script
./scripts/pahole-flags.sh: line 7: return: can only `return' from a function or sourced script
  CC [M]  /home/feixiaoxing/Desktop/esp8089-master/esp_debug.o
  CC [M]  /home/feixiaoxing/Desktop/esp8089-master/sdio_sif_esp.o
  CC [M]  /home/feixiaoxing/Desktop/esp8089-master/spi_sif_esp.o
  CC [M]  /home/feixiaoxing/Desktop/esp8089-master/esp_io.o
  CC [M]  /home/feixiaoxing/Desktop/esp8089-master/esp_file.o
  CC [M]  /home/feixiaoxing/Desktop/esp8089-master/esp_main.o
  CC [M]  /home/feixiaoxing/Desktop/esp8089-master/esp_sip.o
/home/feixiaoxing/Desktop/esp8089-master/esp_sip.c: In function ‘sip_recalc_credit_timeout’:
/home/feixiaoxing/Desktop/esp8089-master/esp_sip.c:220:24: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
  220 |  struct esp_sip *sip = (struct esp_sip *)list->flags;
      |                        ^
  CC [M]  /home/feixiaoxing/Desktop/esp8089-master/esp_ext.o
  CC [M]  /home/feixiaoxing/Desktop/esp8089-master/esp_ctrl.o
  CC [M]  /home/feixiaoxing/Desktop/esp8089-master/esp_mac80211.o
  CC [M]  /home/feixiaoxing/Desktop/esp8089-master/esp_utils.o
  CC [M]  /home/feixiaoxing/Desktop/esp8089-master/esp_pm.o
  CC [M]  /home/feixiaoxing/Desktop/esp8089-master/testmode.o
  LD [M]  /home/feixiaoxing/Desktop/esp8089-master/esp8089.o
./scripts/pahole-flags.sh: line 7: return: can only `return' from a function or sourced script
./scripts/pahole-flags.sh: line 7: return: can only `return' from a function or sourced script
  MODPOST /home/feixiaoxing/Desktop/esp8089-master/Module.symvers
  CC [M]  /home/feixiaoxing/Desktop/esp8089-master/esp8089.mod.o
  LD [M]  /home/feixiaoxing/Desktop/esp8089-master/esp8089.ko
  BTF [M] /home/feixiaoxing/Desktop/esp8089-master/esp8089.ko
Skipping BTF generation for /home/feixiaoxing/Desktop/esp8089-master/esp8089.ko due to unavailability of vmlinux
make[1]: Leaving directory '/usr/src/linux-headers-5.15.0-73-generic'

        编译好之后,就可以把es8089.ko拷贝到sd卡的root目录下,等待准备驱动安装了。

4、编译wpa_supplicant

        wpa_supplicant是wifi配置一个非常常见的工具,某种意义上来说,近乎于标配。它对于wifi模块的意义,就和tslib对于触摸屏的意义是一样的。此外,wpa_supplicant又依赖于libnl和openssl这两个库,所以我们需要把这三个文件一起下载下。

        有同学也许会说,为什么不用buildroot去尝试编译wpa_supplicant,省的自己麻烦。主要是我们确实去尝试了,无奈编译出错,所以只好又搭建交叉编译环境来生成wps_supplicant文件了。

https://ftp.openssl.org/source/old/1.0.2/openssl-1.0.2.tar.gz
https://www.infradead.org/~tgr/libnl/files/libnl-3.2.23.tar.gz
https://w1.fi/releases/wpa_supplicant-2.9.tar.gz

        三个文件的链接地址如上所述。首先编译libnl,

tar xzvf libnl-3.2.23.tar.gz
cd libnl-3.2.23/
mkdir __install
./configure --host=arm-linux-gnueabihf --prefix=/home/feixiaoxing/Desktop/wpa/libnl-3.2.23/__install/
make
make install

        其次,编译openssl,它的configure有一点特殊,主要是os/compiler这个标签,大家注意下,

tar xzvf openssl-1.0.2.tar.gz
cd openssl-1.0.2/
mkdir __install
./Configure os/compiler:arm-linux-gnueabihf-gcc --prefix=/home/feixiaoxing/Desktop/wpa/openssl-1.0.2/__install/
make
make install

        准备好了libnl和openssl之后,就可以开始编译wpa_supplicant了。当然,因为它还依赖于libnl和openssl,所以必要的解压和环境准备是少不了的,

tar xzvf wpa_supplicant-2.9.tar.gz
cd wpa_supplicant-2.9/wpa_supplicant
cp defconfig .config

        在.config种需要修改这几个变量

CC=arm-linux-gnueabihf-gcc
CFLAGS += -I/home/feixiaoxing/Desktop/wpa/libnl-3.2.23/__install/include
CFLAGS += -I/home/feixiaoxing/Desktop/wpa/openssl-1.0.2/__install/include
LIBS += -L/home/feixiaoxing/Desktop/wpa/libnl-3.2.23/__install/lib
LIBS += -L/home/feixiaoxing/Desktop/wpa/openssl-1.0.2/__install/lib

        另外,.config中还需要注销DBUS的内容,不然编译有错误,

# Add support for new DBus control interface
# (fi.w1.hostap.wpa_supplicant1)
#CONFIG_CTRL_IFACE_DBUS_NEW=y

# Add introspection support for new DBus control interface
#CONFIG_CTRL_IFACE_DBUS_INTRO=y

        最后一步,就是重新设置PKG_CONFIG_PATH,开始编译,

export PKG_CONFIG_PATH=/home/feixiaoxing/Desktop/wpa/libnl-3.2.23/__install/lib/pkgconfig:$PKG_CONFIG_PATH
make

        如果一切顺利,编译结束后,我们就可以看到wpa_supplicant和wpa_cli这两个我们需要的可执行文件了。前面我们把dbt文件拷贝好了,也把驱动esp8089.ko拷贝到root目录下,这里同样也需要把wpa_supplicant和wpa_cli拷贝到root目录下。另外,因为wpa_supplicant依赖libnl的动态库文件,建议把libnl-3.2.23/__install/lib/目录下面的所有文件拷贝到root目录下,这样就省得麻烦了。

5、准备测试

        前面我们已经把esp8089.ko和两个wpa软件、动态库拷贝进来。这个时候还要继续设置一下环境变量,这样wpa_supplicant才使用地起来。

 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root

        首先安装esp8089.ko驱动,这个43就是CHIP_EN引脚,

insmod esp8089.ko esp_reset_gpio=43

        之后,就可以用ifconfig让wlan0上线了,

ifconfig wlan0 up

        wlan0虽然准备好了,但是还没有ssid和密码,这部分需要配置下,即准备/etc/wpa_supplicant.conf这个文件,

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

        这里psk用的是明文,大家可以根据自己的情况做一个修改。如脚本所示,当然还需要创建一个wpa_supplcant的目录,即,

mkdir -p /var/run/wpa_supplicant

        此外,因为我们测试的时候,有线网口和无线网口来自同一个路由器,为了减少不必要的麻烦,我们先关闭eth0,未测试做准备,

ifconfig eth0 down

        所有这些都做好之后,就可以开始测试wifi了。主要的工作流程也是两步,第一步就是连上wifi,这个工作由wpa_supplicant完成,ssid和密码位于/etc/supplicant.conf文件,

 ./wpa_supplicant -D wext -c /etc/wpa_supplicant.conf -i wlan0 &

        第二步就是用ifconfig对wlan0进行ip设置,注意这里就没有使用udhcpc命令了,大家自己测试的时候也可以换成udhcpc,一般都是busybox自带的,

ifconfig wlan0 192.168.0.231 netmask 255.255.255.0 broadcast 192.168.0.1

        如上面脚本所示,ip被设置为了231,这个时候pc地址是100,而且当前开发板和外界唯一的通信就是wifi模块,所以可以看下ping的质量如何,

         测试结果看,延时的起伏还是比较大的。这说明,本身模块的功能,只是解决有无的问题,可以在小范围使用,如果是大规模出货的话,还是要斟酌一下的。

6、总结

        esp8089这个驱动,可能是目前位置我们遇到的、最复杂的驱动。当然,这也没关系。学会了它,要是以后再遇到类似的驱动,相信也不会比它更复杂了,我们也心里更有底了。有兴趣的同学可以好好看下这个过程,争取活学活用,为进一步的开发工作打下基础。

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

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

相关文章

chatgpt赋能python:Python程序与SEO:如何建立程序使您的网站优化更好

Python程序与SEO&#xff1a;如何建立程序使您的网站优化更好 今天&#xff0c;越来越多的网站和在线业务转向搜索引擎优化&#xff0c;以吸引更多访问者和客户。Python编程语言是一种快速、灵活、易于学习的工具&#xff0c;如果正确使用它可以使您的网站SEO更好。下面我们来…

【从删库到跑路】MySQL系列——数据库的介绍MySQL的启动

&#x1f38a;专栏【MySQL】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 文章目录 &#x1f354;什么是数据库⭐组成⭐数据库的优势 &#x1f35…

Spring Security--自动登录

也就是remember me 在配置链上加一个 然后发送请求时加上:remember-me字段 value值可以为&#xff0c;ture&#xff0c;1&#xff0c;on 我们记住登录后&#xff0c;关掉浏览器再打开&#xff0c;访问一下接口&#xff0c;可以访问&#xff0c;说明记住登录成功了。 因为有的…

Spring中Bean的生命 周期与作用域

文章目录 前言Bean的作用域概念Bean作用域类型1. singleton&#xff1a;单例作⽤域2. prototype&#xff1a;原型作⽤域&#xff08;多例作⽤域&#xff09;3. request&#xff1a;请求作⽤域4. session&#xff1a;回话作⽤域5. application&#xff1a;全局作⽤域6. websocke…

51单片机实训项目之“红外控制小风扇”代码详解

本代码实现的功能是通过红外遥控来控制风扇的转速。废话不多说&#xff0c;直接上代码。 另外补充一点红外通信的原理&#xff1a; 红外接收 NEC协议&#xff1a; 数据格式 发射端的方波图&#xff0c;接收端的正好与之相反&#xff0c;数据传输从最低位开始 NEC 标准下…

mqtt.fx连接阿里云物联网平台

这里写目录标题 注册公共示例创建产品添加设备创建云产品流转生成基本信息配置mqtt.fx客户端数据传送 前提条件&#xff1a;下载mqtt.fx软件&#xff0c;以及注册好阿里云物联网平台账号 本实验用两个mqtt.fx客户端接入阿里云物联网平台&#xff0c;来实现不同设备间消息的传输…

大数据Doris(四十):Routine Load基本原理和语法介绍

文章目录 Routine Load基本原理和语法介绍 一、基本原理 二、Routine Load 语法 Routine Load基本原理和语法介绍 例行导入(Routine Load)功能,支持用户提交一个常驻的导入任务,通过不断的从指定的数据源读取数据,将数据导入到 Doris 中。目前Rou

chatgpt赋能python:如何使用Python获取Listview

如何使用Python获取Listview 在现代数据驱动的世界中&#xff0c;处理大量数据已经成为一项关键技能。准确地说&#xff0c;操作大量数据要比操作一小部分数据要困难得多。Python是一门非常出色的编程语言&#xff0c;它的处理大量数据的能力无人能敌。在这篇文章中&#xff0…

MySQL面试题详解

优化 如何定位慢查询 mysql中慢查询通常发生在以下几种情况&#xff0c;聚合查询&#xff0c;多表查询&#xff0c;表数据量过大查询&#xff0c;深度分页查询。 表象&#xff1a;页面加载过慢&#xff0c;接口压测响应时间过长(超过1s) 定位慢查询的方法主要有两种。方法一…

Windows 下编译 OpenCV 和 OpenCV-contrib

文章目录 导言环境准备源码获取环境获取 配置 CMake 并编译ConfigureGenerate 生成项目总结 导言 在本文中&#xff0c;我们将介绍如何在 Windows 系统下编译 OpenCV 和 OpenCV-contrib。OpenCV 是一个开源的计算机视觉库&#xff0c;它包含了许多图像处理和计算机视觉的功能。…

gismo调试-组总刚

文章目录 前言一、1 组总刚main文件的断点2 跳转到gsElasticityAssembler.hpp3 gsElasticityAssembler.hpp的177行进入gsVisitorLinearElasticity.h4 进入gsAssembler.h重新进入gsVisitorLinearElasticity.h进入gsSparseSystem.h1.14 进入gsAssembler.h1.21.31.4 二、2.12.22.3…

Cracking C++(11): CMake代码高亮调研

文章目录 1. 目的2. VSCode 插件CMake 和 CMake ToolsCMake Language SupportCMake Highlights 3. JetBrains 系列3.1 CLion3.2 Fleet 4. Kate5. Sublime Text6. 总结 1. 目的 CMake 已经是开源 C 项目的主流 building system&#xff0c; 这里简单调研关注的编辑器 / IDE 下&…

Jetson nano 进阶教程4_通过IIC输出PWM

Jetson nano 进阶教程4_通过IIC输出PWM Jetson nano的40PIN不能直接发出PWM波&#xff0c;在很多控制舵机&#xff0c;电机调速方面很不方便&#xff0c;因此利用一块PCA9685模块&#xff0c;通过I2C总线控制PCA9685输出pwm波&#xff0c;并且可以调整占空比。 How do I use P…

Android Activity启动过程详解

目录 一&#xff0c;背景介绍 二&#xff0c;Activity启动过程 2.1 调用 ATMS 系统进程 2.1.1 时序图 2.1.2 Launcher 桌面的 App 图标入口 2.1.3 startActivitySafely() 方法 2.1.4 execStartActivity() 方法 2.2 ATMS 向 AMS 发送创建应用进程的过程 2.2.1 时序图 …

03- 流程控制(C语言)

一 概述 C语言支持三种程序运行结构&#xff1a;顺序结构、选择结构、循环结构。 顺序结构&#xff1a;按照语句编写的顺序 上到下逐句执行。选择结构&#xff1a;也叫 分支结构&#xff0c;依据是否满足条件&#xff0c;有选择的执行相应功能。循环结构&#xff1a;依据条件…

动态字符串SDS

基本概括 Redis中保存的Key是字符串&#xff0c;value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。 但Redis没有直接使用C语言中的字符串&#xff0c;因为C语言字符串存在很多问题&#xff08;C语言中实际上没有字符串&#xff0c;本质上是字符数…

面向对象的封装

9. 面向对象特征一&#xff1a;封装性(encapsulation) 什么是封装 就像快递一样我们在网上买的物品&#xff0c;快递都会给我们添加外包装&#xff0c;给我们封装起来&#xff0c;这就是封装 客观世界里每一个事物的内部信息都隐藏在其内部&#xff0c;外界无法直接操作和修改…

怎样才算一个计算机知识体系完整的毕业生

为什么突然想写这个话题呢&#xff1f; 最近有不少新关注的读者&#xff0c;在后台问&#xff1a;大学学 Java 和 C 哪个好找工作&#xff0c;学前端好还是后端好&#xff0c;该学 Vue 还是 React。。。 仿佛看到了自己当年的模样&#xff0c;所以觉得有必要单独写一篇文章&a…

CSS基础学习--8 盒子模型(Box Model)

一、介绍 所有HTML元素可以看作盒子&#xff0c;在CSS中&#xff0c;"box model"这一术语是用来设计和布局时使用。 CSS盒模型本质上是一个盒子&#xff0c;封装周围的HTML元素&#xff0c;它包括&#xff1a;边距&#xff0c;边框&#xff0c;填充&#xff0c;和实…

调用阿里API实现图片中的文字识别

作者介绍 王雪玉&#xff0c;女&#xff0c;西安工程大学电子信息学院&#xff0c;2022级研究生 研究方向&#xff1a;机器视觉与人工智能 电子邮件&#xff1a;2239580540qq.com 王泽宇&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2022级研究生&#xf…