一次树莓派wifi 调试的过程

前情提要

  • 树莓派(以下简称 rpi) 的镜像是通过 buildroot 编译出来的。
  • 生成 sdcard.img 通过 dd 命令写进 sd 卡中
  • 之前没有处理过跟无线相关的东西,本次希望让树莓派可以使用无线(客户端)
  • 由于采用 buildroot ,之前未处理,所以驱动基本都是模块,没有正式编译进内核

做过的事

  1. 编译内核时将 mac80211 选项加入 (Networking Support -> Wireless -> cfg80211)
  2. 没有作用
  3. 在看了无线芯版是 broadcom之后,在内核编译中搜索这个关键字。
  4. 同时想到是不是模块没有加载进去,于是在 /lib/modules目录下去找,在 kernel/net/wireless目录下找到了 lib80211 相关的,都 modprobe进去,没有效果。
  5. 又在 kernel/drivers/net/wireless中找到了 brcm 相关的驱动。
  6. 同时重新编译的内核,将 Device Drivers -> Network device support -> PHY Device support and infrastructure 里面的 Broadcom PHYs 选中。并且将相关的都改成了编译到内核中而不是模块。
  7. 重启之后,ifconfig没有东西,但是在 /sys/class/ieee80211下面有phy0设备了。
  8. 接着查询网上 wifi相关工具和连接方法
  9. 通过 * iw dev wlan0 scan*可以扫描可连接的无线。iwlist [dev] scan命令也一样可以。
  10. 提示没有开启wlan0,于是 ifconfig wlan0 up再搜索,能找到
  11. 开始连接,连接使用 wpa_supplicant命令,直接输入此命令就可以得到提示,提示的最后一行有现成的用法wpa_supplicant -B -Dnl80211 -iwlan0 -c/etc/wpa_supplicant.conf
  12. wpa_supplicant.conf是写好可以连接的无线有哪些,可以自行搜索用法。
  13. 为了让它自动连接工可以用 ifconfig看到,要加入到 /etc/network/interfaces配置文件中。并体配置文件的写法在网上搜索即可,或者照配置文件里面的 eth0来写
  14. 写好之后 /etc/init.dS30network restart 即可,就会在 ifconfig命令中看到。
  15. 再重启系统,一看还是有问题。主要在启动顺序上有问题
  16. 创建启动文件 S30wpa_supplicant 用于使能 wlan0,启动 wpa_supplicant
  17. 同时加入 modprobe brcmfmac,这是broadcom无线的驱动,可能是没有编译到内核中,要作为模块加载
  18. 再重启,可以了,自动连接了

补充

  1. mac80211_hwsim只是内核提供的无线模拟驱动
  2. brcmfmac是broadcom的无线驱动,加载此驱动才有效果
  3. 加载此驱动时,需要在 /lib/firmware/brcm目录 下有 brcmfmac43430-sdio.bin, brcmfmac43430-sdio.txt文件存在,这些文件需要在 linux-firmware下去提取
  4. 加载后在 /sys/class/ieee80211目录下会生成形如 phy*的设备名,到此说明有效
  5. 要想利用此wifi 来连接无线网络,需要启动 wpa_supplicant,具体用户可去查询,然后 ifup wlan0即可启动连接进行dhcp 地址获取,需要先配置 /etc/network/interfaces ,见下面示例文件

总结

  • 之所以有这些问题,是因为不是采用 rpi 自己的系统 ,系统是通过 buildroot编译而来,跟原生的系统可能会有些不同的地方。
  • 如果在 iwlist wlan0 scan 的时候返回没有结果,这种情况可以先考虑是不是不止一个 wlan口,有可能生效的是其的口,可以尝试。

相关文件事例

  • /etc/wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant
ap_scan=1
update_config=1

network={
  ssid="yourwifissid"
  psk="yourpassword"
}
  • /etc/network/interfaces
# 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 $?

你可能感兴趣的:(技术解决)