前情提要
- 树莓派(以下简称 rpi) 的镜像是通过 buildroot 编译出来的。
- 生成 sdcard.img 通过 dd 命令写进 sd 卡中
- 之前没有处理过跟无线相关的东西,本次希望让树莓派可以使用无线(客户端)
- 由于采用 buildroot ,之前未处理,所以驱动基本都是模块,没有正式编译进内核
做过的事
- 编译内核时将 mac80211 选项加入 (Networking Support -> Wireless -> cfg80211)
- 没有作用
- 在看了无线芯版是
broadcom
之后,在内核编译中搜索这个关键字。 - 同时想到是不是模块没有加载进去,于是在
/lib/modules
目录下去找,在 kernel/net/wireless
目录下找到了 lib80211 相关的,都 modprobe
进去,没有效果。 - 又在
kernel/drivers/net/wireless
中找到了 brcm
相关的驱动。 - 同时重新编译的内核,将
Device Drivers -> Network device support -> PHY Device support and infrastructure
里面的 Broadcom PHYs
选中。并且将相关的都改成了编译到内核中而不是模块。 - 重启之后,
ifconfig
没有东西,但是在 /sys/class/ieee80211
下面有phy0设备了。 - 接着查询网上 wifi相关工具和连接方法
- 通过 ** iw dev wlan0 scan**可以扫描可连接的无线。
iwlist [dev] scan
命令也一样可以。 - 提示没有开启
wlan0
,于是 ifconfig wlan0 up
再搜索,能找到 - 开始连接,连接使用
wpa_supplicant
命令,直接输入此命令就可以得到提示,提示的最后一行有现成的用法wpa_supplicant -B -Dnl80211 -iwlan0 -c/etc/wpa_supplicant.conf
wpa_supplicant.conf
是写好可以连接的无线有哪些,可以自行搜索用法。- 为了让它自动连接工可以用
ifconfig
看到,要加入到 /etc/network/interfaces
配置文件中。并体配置文件的写法在网上搜索即可,或者照配置文件里面的 eth0
来写 - 写好之后
/etc/init.dS30network restart
即可,就会在 ifconfig
命令中看到。 - 再重启系统,一看还是有问题。主要在启动顺序上有问题
- 创建启动文件
S30wpa_supplicant
用于使能 wlan0
,启动 wpa_supplicant
。 - 同时加入
modprobe brcmfmac
,这是broadcom无线的驱动,可能是没有编译到内核中,要作为模块加载 - 再重启,可以了,自动连接了
补充
mac80211_hwsim
只是内核提供的无线模拟驱动brcmfmac
是broadcom的无线驱动,加载此驱动才有效果- 加载此驱动时,需要在
/lib/firmware/brcm
目录 下有 brcmfmac43430-sdio.bin, brcmfmac43430-sdio.txt
文件存在,这些文件需要在 linux-firmware
下去提取 - 加载后在
/sys/class/ieee80211
目录下会生成形如 phy*
的设备名,到此说明有效 - 要想利用此wifi 来连接无线网络,需要启动 wpa_supplicant,具体用户可去查询,然后
ifup wlan0
即可启动连接进行dhcp 地址获取,需要先配置 /etc/network/interfaces
,见下面示例文件
总结
- 之所以有这些问题,是因为不是采用 rpi 自己的系统 ,系统是通过 buildroot编译而来,跟原生的系统可能会有些不同的地方。
- 如果在
iwlist wlan0 scan
的时候返回没有结果,这种情况可以先考虑是不是不止一个 wlan
口,有可能生效的是其的口,可以尝试。
相关文件事例
ctrl_interface=/var/run/wpa_supplicant
ap_scan=1
update_config=1
network={
ssid="yourwifissid"
psk="yourpassword"
}
# cat /etc/network/interfaces
# interface file auto-generated by buildroot
auto lo
iface lo inet loopback
#auto eth0
iface eth0 inet dhcp
pre-up /etc/network/nfs_check
wait-delay 15
auto wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant.conf
/etc/init.d/S30wpa_supplicant
# cat /etc/init.d/S30wpa_supplicant
#!/bin/sh
#
# Start the wpa_supplicant....
#
dev=wlan0
case "$1" in
start)
printf "Starting wpa_supplicant: "
modprobe brcmfmac
ifconfig $dev up
/usr/sbin/wpa_supplicant -B -Dnl80211 -i$dev -c/etc/wpa_supplicant.conf
[ $? = 0 ] && echo "OK" || echo "FAIL"
;;
stop)
printf "Stopping wpa_supplicant: "
killall wpa_supplicant
[ $? = 0 ] && echo "OK" || echo "FAIL"
;;
restart|reload)
"$0" stop
"$0" start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit $?