一、前言
话不多说,这里会介绍不同系统多种上网方式,有的是通过USB WIFI模块连接wifi信号进行网络通信,有的是通过调试电脑的网络共享,为什么要联网呢,就是为了在线更新驱动,因为离线安装会有很多依赖的问题,一环套一环,很难实现驱动的安装,尤其是复杂需求的工作环境,如用到python,或者复杂一些的系统工具等等
几个方式分别是:
[纯linux系统联网配置(安装USB WIFI模块驱动)](#纯linux系统联网配置(安装USB WIFI模块驱动))
[debian/ubuntu/麒麟系统联网配置(安装USB WIFI模块驱动)](#debian/ubuntu/麒麟系统联网配置(安装USB WIFI模块驱动))
debian/ubuntu/麒麟系统联网配置(网络共享方式)
二、环境
RK3588(linux5.10.66+debian/ubuntu/麒麟是桌面文件系统)
调试笔记本window10,安装常用工具winscp,xshell,finalshell,secureRTP等等
VMware17+Ubuntu20.04源码开发环境(这里就依赖于各个硬件平台的厂家提供资料了)
三、正文
很多系统中源码并没有开放相关驱动,说白了就是需要手动去打开驱动,根据自己的设备去编译出来目标机器能够识别的驱动文件,然后通过手动加载或者自动加载的方式加载驱动,在调用驱动使用就可以了
纯linux系统联网配置(安装USB WIFI模块驱动)
我使用的是一款RTL8723BU无线WIFI模块,配置其连接wifi信号就可以让系统上网了,首先说明一下模块的驱动匹配并不是有源码就可以,还要看系统版本与源码的匹配性,这点确实不太好评估,大概率就是尝试调试,然后发现问题,查找问题,排查解决问题,最后调试使用,过程很麻烦,我一开始使用系统源码包中自带的一个驱动,一直报错,后来在网上下载了一个新版本的驱动文件,就成功编译过最终实现了。具体方式如下:
以我是用的RTL8723BU模块为例,其他模块都可以参考相识
在网上下载一个新的驱动文件,解压替换原来的rtl8723bu文件夹,需要修改一下里面的Kconfig文件,linux版本问题不识别---help---,需要把"-"去掉
之后就是在文件外边主目录下配置makefile编译了,如下
对应驱动文件的makefile文件如下图,linux大部分都是有现成源码的,只需要添加配置编译即可,如果没有就下载源码,在一步一步添加编译路径

修改makefile文件

修改Kconfig文件,添加source "drivers/net/wireless/rockchip_wlan/rtl8723bu/Kconfig"

之后在进入到rtl8723bu文件夹中
没有编译的文件内容如下

必要时再去配置一下.config文件,也是和系统开发方式有关
执行make menuconfig ARCH=arm64弹出配置界面

进入到wireless LAN目录下
配置信息如下


保存配置,之后gedit .config 查看配置文件就会有8723BU的配置

之后将.config文件复制替换系统配置
cp .config /root/workspace/aRackChip/RK3588J/OK3588_Linux_fs/kernel/arch/arm64/configs/OK3588-Linux_defconfig
这样配置就完事了
执行编译sudo ./build.sh kernel(这个是系统单独编译内核,具体执行编译系统内核的方式参考不同厂家设备提供的开源资料,应该是大差不差的,到了linux系统层都是那些东西,无非就是操作有些区别)
等待编译完毕之后查看文件夹rtl8723bu内容

有了我们期待的ko文件
网上说速度慢,要改rtl8723bu文件内的makefile文件配置,我改了如下图(这里不改也行)

之后将ko文件拷贝到开发板中运行,加载insmod /root/workspace/8723bu.ko

查看节点,可以用ifconfig -a命令,或者iwlist scan

开启节点ifconfig wlan0 up
然后可以用iwlist wlan0 scan查看一下周围的网络,会依次展示周围的网络信息
下面这个是我开启的热点网络,热点要在2.4G频段

配置wifi信息vi /etc/wpa_supplicant.conf
内容:
bash
#PSK/TKIP
ctrl_interface=/var/run/wpa_supplicant
network={
ssid="datongshui"
scan_ssid=1
psk="xxx密码"
key_mgmt=WPA-EAP WPA-PSK IEEE8021X NONE
group=CCMP TKIP WEP104 WEP40
}
配置说明链接
*必须创建连接节点*
创建一个socket文件用于通信mkdir -p /var/run/wpa_supplicant
链接wpa_supplicant -B -c /etc/wpa_supplicant.conf -i wlan0
配置动态IP方式udhcpc -i wlan0

查看连接状态wpa_cli -iwlan0 status

最终测试ping网络ping www.baidu.com

最后总结了一下,将上述步骤可以用A40i脚本的方式,打包到了wifi.sh脚本中,调用时执行下面语句即可联网了(可以自动关闭已开启的节点和驱动,并重新开启加载)
bash /root/workspace/wifi.sh -i 8723bu -s datongshui -p xxx密码
wifi.sh脚本内容
bash
#!/bin/bash
function usage()
{
echo "Usage: -i <wifi> -s <ssid> -p <password>"
echo "eg: ./wifi.sh -i 8189 -s bjforlinx -p 12345678 "
echo "eg: ./wifi.sh -i 8723du/bu -s bjforlinx -p NONE "
echo " -i : 8189 or 8723bu/du"
echo " -s : wifi ssid"
echo " -p : wifi password or NONE"
}
#传入参数赋值
function parse_args()
{
while true; do
case "$1" in
-i ) wifi=$2;echo wifi $wifi;shift 2 ;;
-s ) ssid=$2;echo ssid $ssid;shift 2 ;;
-p ) pasw=$2;echo pasw $pasw;shift 2 ;;
-h ) usage; exit 1 ;;
* ) break ;;
esac
done
}
if [ $# != 6 ]
then
usage;
exit 1;
fi
parse_args $@
#自动创建保存wpa_supplicant.conf文件
if [ -e /etc/wpa_supplicant.conf ]
then
echo "kkkkkkkbq note:remove /etc/wpa_supplicant.conf! and creat later."
rm /etc/wpa_supplicant.conf
fi
echo \#PSK/TKIP >> /etc/wpa_supplicant.conf
echo ctrl_interface=/var/run/wpa_supplicant >>/etc/wpa_supplicant.conf
echo network={ >>/etc/wpa_supplicant.conf
echo ssid=\"$ssid\" >>/etc/wpa_supplicant.conf
echo scan_ssid=1 >>/etc/wpa_supplicant.conf
if [ $pasw == NONE ]
then
echo key_mgmt=NONE >>/etc/wpa_supplicant.conf
else
echo psk=\"$pasw\" >>/etc/wpa_supplicant.conf
echo key_mgmt=WPA-EAP WPA-PSK IEEE8021X NONE >>/etc/wpa_supplicant.conf
echo group=CCMP TKIP WEP104 WEP40 >>/etc/wpa_supplicant.conf
fi
echo } >>/etc/wpa_supplicant.conf
ifconfig -a|grep wlan0 |grep -v grep > /dev/null
if [ $? -eq 0 ]
then
echo "kkkkkkkbq note:down wlan0!"
ifconfig wlan0 down > /dev/null
fi
#a40i网口0和无线不能一起用,3588这里注释掉
#ifconfig -a|grep eth0 |grep -v grep > /dev/null
#if [ $? -eq 0 ]
#then
# ifconfig eth0 down > /dev/null
#fi
#判断8723驱动开启,关闭驱动
lsmod|grep 8723bu |grep -v grep > /dev/null
if [ $? -eq 0 ]
then
echo "kkkkkkkbq note:rmmod 8723bu!"
rmmod 8723bu
fi
#加载8723驱动
if [ $wifi == 8723bu ]
then
echo "kkkkkkkbq note:insmod 8723bu!"
insmod /root/workspace/8723bu.ko > /dev/null
#elif [ $wifi == 8723du ]
#then
# insmod /lib/modules/$(uname -r)/8723du.ko > /dev/null
#elif [ $wifi == 8189 ]
#then
# insmod /lib/modules/$(uname -r)/8189es.ko > /dev/null
fi
#上面步骤是加载驱动,之后下面就是配置WiFi了
#步骤一:挂载wlan0
sleep 3
echo "kkkkkkkbq note:up wlan0!"
ifconfig wlan0 up
sleep 1
#步骤二:查看网络(省略,手动查看)
#iwlist wlan0 scan
#步骤三:创建连接点
#判断存在的话,先删除
ps -fe|grep wpa_supplicant |grep -v grep > /dev/null
if [ $? -eq 0 ]
then
echo "kkkkkkkbq note:remove /var/run/wpa_supplicant!and creat later."
kill -9 $(pidof wpa_supplicant) > /dev/null
rm /var/run/wpa_supplicant -r
fi
sleep 1
#创建文件夹
mkdir -p /var/run/wpa_supplicant
sleep 1
#创建软连接
echo "kkkkkkkbq note:ruanjianjie wlan0!"
wpa_supplicant -B -c /etc/wpa_supplicant.conf -i wlan0
#步骤四:配置动态IP
sleep 3
#dhclient wlan0
echo "kkkkkkkbq note:udhcpc wlan0!"
udhcpc -i wlan0
sleep 1
#查看连接状态
echo "kkkkkkkbq note:status wlan0!"
wpa_cli -iwlan0 status
echo "Finshed!"
这里说明一下纯linux系统的硬伤,要是使用网络模块作为无线网络通信,获取网络数据通信应该是可以的,但是如果用此模块去联网,问题就出现了,因为纯linux系统下一般系统资源比较少,缺少很多基础的功能包,没有apt命令等,无法使用在线更新安装包命令,这里也是看实际的设备情况和自己的需求场合去适配使用。
debian/ubuntu/麒麟系统联网配置(安装USB WIFI模块驱动)
在5.10.66环境下,配置wifi模块基本与上述方式一致,这里就介绍一下更新到5.10.209系统后的差异,相信很多小伙伴在使用新系统会遇到此问题
编译系统内核源码时,会遇到如下错误信息

是因为在 Linux 内核中,filp_open 是一个用于打开文件的函数,通常用于内核模块中访问文件系统。它的定义和导出规则可能会随着内核版本的变化而发生变化。以下是 Linux 5.10.66 和 Linux 5.10.209 之间可能存在的差异,以及 filp_open 的变化分析
在5.10.66 的中导出了

在5.10.209中就没有了

在 Linux 5.10.209 中,filp_open 的导出方式发生了变化,使用了 EXPORT_SYMBOL_NS 宏,并且指定了命名空间 ANDROID_GKI_VFS_EXPORT_ONLY。这与 Linux 5.10.66 中的 EXPORT_SYMBOL(filp_open) 不同,导致 8723bu 驱动模块无法使用 filp_open
修改方法1:(推荐)
修改内核中源码文件 fs/open.c
//EXPORT_SYMBOL_NS(filp_open, ANDROID_GKI_VFS_EXPORT_ONLY);
EXPORT_SYMBOL(filp_open);
修改方法2:(初始化函数位于 os_dep/linux/os_intfs.c 文件中,未好使,可能修改的不够全)
在驱动源码的初始化文件中添加命名空间
MODULE_IMPORT_NS(ANDROID_GKI_VFS_EXPORT_ONLY);

grep filp_open /proc/kallsyms
再次执行编译sudo ./build.sh kernel
等待编译完毕之后查看文件夹rtl8723bu内容

之后编译镜像,烧录验证wifi是否自动加载
debian/ubuntu/麒麟系统联网配置(网络共享方式)
进入电脑的网络配置页面
找到WLAN,笔记本的wifi网卡,然后右键设置属性,设置要共享的网络端口

之后网络端口(以太网2会被自动设置IP为192.168.137.1)
然后把在这个网络内的其他设备IP设置成同网段的设备,就可以通过该网口转发WLAN的无线网络功能了,也就可以上网更新依赖包和库了
在ubuntu/银河麒麟下默认建立的IP为192.168.1.101,比如改这个IP,用如下方法
查看网络:nmcli c
(如有需要)修改IP:nmcli c modify net2 ipv4.addr '192.168.137.101/24'
(如有需要)重新配置:nmcli c up net2
(如有需要)重新配置:nmcli d reapply eth1
(如有需要)重新配置:nmcli d connect eth1
最后在系统上查看网络是否可用即可
有的时候笔记本电脑重启后网络会不好使,开机后第一次不好使,尝试下面方式
还是进到网络配置界面,把WLAN的网络共享关闭,保存,在重新配置共享, 保存,就可以了
四、结语
在条件允许的情况下,板载USB WIFI或者其他方式wifi模块最好,如PCIE专wifi等等,条件差些就在更新系统时外挂usb wifi模块,条件在差些就用网络共享,在嵌入式设备中,基本没有不用网络的吧,哈哈
PS:想到啥说啥,这里说明一下写文章的时候发现很多文字行间距变大不协调,还有图片不清晰,是因为内容是我平时积累在word中,平时很忙,基本没有空时常来维护更新,偶尔会闲下来抽出大块时间统一整理查看一下博客,顺便更新几个可以公开分享的文章,内容和图片都是从word复制出来,文字格式和图片清晰度有些不匹配,暂时不追求极致,要啥自行车呀,能记录自己的心得,能分享帮助到大家就行呗。