2020年12月14日 星期一

Buildroot Raspberry Pi 3 wlan0 setup

前情提要

  • 樹莓派(以下簡稱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"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • /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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • /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 $?

資料來源: https://blog.csdn.net/leishengsheng/article/details/78784148 


沒有留言: