Android 下移植WIFI 驅動

參考了一篇 Android 下移植WIFI 驅動 ,記錄下來 。

英文原文 : http://blog.linuxconsulting.ro/2010/04/porting-wifi-drivers-to-android.html

1. android 中WIFI如何工作


3. 設置wpa_supplicant  使其可以debug

 默認情況 wpa_supplicant 設置爲MSG_INFO ,不能告知很多信息

爲了能夠獲得更多的信息 :

a. 修改common.c 設置 wpa_debug_level = MSG_DEBUG
b. 修改common.h  change #define wpa_printf from if ((level) >= MSG_INFO) to if ((level) >= MSG_DEBUG)

4. 爲你的設備配置合適的wpa_supplicant.conf

因爲此wpa_supplicant.conf 會爲android 指定相應的 control socket(ctr_interface). 此文件應該通過 AndroidBoad.mk 複製到  $(TARGET_OUT_ETC)/wifi (通常是/system/etc/wifi/wpa_supplicant.conf )。此文件 位置會被 用在 來自 init.rc的 wpa_supplicant service。wpa_supplicant 可以被配置成兩種不同的方式 :一個是 在 android namespace 中 使用private socket , 此socket 有 socket_local_client_connect()function in wpa_ctrl.c 創建;另一個是 使用 標準的 unix socket。注意 此


wpa_supplicant.conf 最低要求配置 :

--android private socket :

ctrl_interface = wlan0

update_config = 1

--- unix standed socket :

ctrl_interface = DIR = /data/system/wpa_supplicant GROUP = wifi

undate_config = 1


根據 自己的設備 有可能需要加上 : ap_scan = 1

如果 AP association  問題  應當 ap_scan = 0  以讓 設備自己連接 而不是wpa_supplicant .

如果 希望 wpa_supplicant 連接到 non-WPA 或者 wireless networks  (默認情況跳過了 這些) 添加:

network = { key_mgmt = NONE}

5. 擁有從 init.rc 創建的 正確的權限 和 路徑 

不正確的權限會導致 wpa_supplicant 不能夠創建或打開 control socket 並且 連接不到 libhardware_legacy/wifi/wifi.c

或者 出現如下錯誤:

E/WifiHW  (  ): Unable to open connection to supplicant on "/data/system/wpa_supplicant/wlan0": No such file or directory will appear.

由於Google 修改了wpa_supplicant  以wifi user/group 運行

同樣 wpa_supplicant 應當 屬於wifi user/group ,這是因爲 wpa_supplicant 要修改這個文件,如果你的系統有 /system 卻只有只讀權限 ,

使用地址像 :data/misc/wifi/wpa_supplicant.conf 。(這個有些不明白 所以翻譯也混亂。 原文:Also wpa_supplicant.conf should belong to wifi user/group because wpa_supplicant will want to modify this file. If your system has /system as read-only use a location like /data/misc/wifi/wpa_supplicant.conf and modify wpa_supplicant service in init.rc with new location. 
Make sure the paths are correctly created in init.rc:

give wpa_supplicant change root permission!

  修改在 init.rc 中  wpa_supplicant service 重新定位 確保 路徑能夠在init.rc 中 正確的創建。
例如:

mkdir /system/etc/wifi 0770 wifi wifi 
chmod 0770 /system/etc/wifi 
chmod 0660 /system/etc/wifi/wpa_supplicant.conf 
chown wifi wifi /system/etc/wifi/wpa_supplicant.conf 
#wpa_supplicant control socket for android wifi.c (android private socket) 
mkdir /data/misc/wifi 0770 wifi wifi 
mkdir /data/misc/wifi/sockets 0770 wifi wifi 
chmod 0770 /data/misc/wifi 
chmod 0660 /data/misc/wifi/wpa_supplicant.conf 
chown wifi wifi /data/misc/wifi 
chown wifi wifi /data/misc/wifi/wpa_supplicant.conf


如果使用 unix standard socket 則 添加:

# wpa_supplicant socket (unix socket mode) 
mkdir /data/system/wpa_supplicant 0771 wifi wifi 
chmod 0771 /data/system/wpa_supplicant 
chown wifi wifi /data/system/wpa_supplicant

注意如果使用android private socket  則 不要添加 unix standard socket , 如果加上了, hardware/libhardware_legacy/wifi/wifi.c check for existence of the /data/system/wpa_supplicant folder and will pass a wrong interface name towpa_ctrl_open() function. 而導致 wpa_supplicant 不起作用
6. 確保 wpa_supplicant and dhcpcd 起來了 (在init.rc 文件中)

For wpa_supplicant the init.rc startup like should be depending on which path you chosen: 
- Android private socket: 

service wpa_supplicant /system/bin/wpa_supplicant -dd -Dwext -iwlan0 -c /system/etc/wifi/wpa_supplicant.conf 
socket wpa_wlan0 dgram 660 wifi wifi 
group system wifi inet 
disabled 
oneshot 

- Unix standard socket: 

service wpa_supplicant /system/bin/wpa_supplicant -dd -Dwext -iwlan0 -c /system/etc/wifi/wpa_supplicant.conf 
group system wifi inet 
disabled 
oneshot

如果wifi driver 創建了另一個wifi interface with other name than wlan0, 相應的要修改上面的代碼。


dhcpcd starting from init.rc 

service dhcpcd /system/bin/dhcpcd wlan0 
group system dhcp 
disabled 
oneshot

7. 編輯驅動 (以模塊形式/編進內核形式)

首先確保  在kernel 中 CONFIG_PACKET and CONFIG_NET_RADIO (wireless extensions) 是 enabled

-- kernel module :

  Define in your BoardConfig.mk :

   1. WIFI_DRIVER_MODULE_PATH :=/system/lib/modules/wlan.ko " (path to the module to be loaded )
   2.  WIFI_DRIVER_MODULE_NAME:= " wlan0" (the name of the network interface that the driver creates)
   3. WIFI_DRIVER_MODULE_ARG:= "nohwcrypt" (any arguments that you want to pass to the driver on insmod)

-- build in kernel

      1)在hardware/libhardware_legacy/wifi/wifi.c要修改interface名字,
     2)在init.rc中添加:
        setprop wifi.interface "wlan0"
     3)在hardware/libhardware_legacy/wifi/wifi.c中當insmod/rmmod時,
        直接return 0。


到這發現已經有人 翻譯過此篇文章,後面就不寫了。

補充 :

設置dhcpcd.conf
  
  /system/etc/dhcpcd/dhcpcd.conf的配置爲:
      interface wlan0
      option subnet_mask, routers, domain_name_servers  

發佈了30 篇原創文章 · 獲贊 7 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章