Android 4.2.2 , RT3070 wifi porting note [2]
Android version :
Android 4.2.2
Wifi module :
TOTOLINK N150UM (RT3070)
之前提到在BBB上做了android的porting,又在上做了wifi的配置,結果忘了把過程寫出來,上半年真是太懶散了,多虧有網友提醒,我在這裡把相關的配置設定做個記錄,這裡的資料是我參考一些網路上的資料,綜合而來,希望對各方朋友能有所幫助。
這篇Note分成2個部分:
1. RT3070 wifi driver
porting
2. Android 4.2.2
setting
在1.
RT3070 wifi driver porting時,我會簡介一下如何把RT3070的驅動程式修改程能在Android上用的版本,基本上程式碼是不太需要動到的,只是需要修改一些設定,在cross-compiler到ARM的android平台上。
在2.
Android 4.2.2 setting時,我會簡介一下如何修改部分的Android source,把wifi的設定匹配到我們剛剛cross-compiler的
driver上。
在這篇文章中有些地方也許沒辦法解釋的很清楚,因為我在這方面還是個新手,如果有地方說明錯誤,請各方朋友不吝指教。
這篇文章為
2.
Android 4.2.2 setting
==================================================================================================
取得Android Source
在這裡我使用的Source,是TI-Android-JB-4.2.2-DevKit-4.1.1版本,而TI也提供了一個非常棒的porting
guide和Development Guide,如下網址;但是這個版本似乎預設是沒有把wifi給加入編譯環境的,所以需要加一些小修改,讓Android在編譯時一同加入wifi的選項。
http://processors.wiki.ti.com/index.php/TI-Android-JB-4.2.2-DevKit-4.1.1_ReleaseNotes
|
基本上需要確認的以下內容:
1.
Linux kernel device
driver enable
2.
修改Android對應開發版的Boardconfig.mk
3.
修改device.mk,增加wifi device
4.
修改Android初始化檔案init.am335xevm.rc
5.
更新Android
overlay
6.
重新編譯Android
7.
新增wifi
device驅動
8.
新增wpa_supplicant.conf檔案
9.
新增dhcpcd_wlan.conf檔案
10.
結果
這篇文章使用得是TOTOLINK N150UM
(RT3070)的wifi網卡,因為需要對這個wifi網卡的驅動作一些修改,詳細的修改方法請參閱:
http://vegetableavenger.blogspot.tw/2014/06/android-422-rt3070-wifi-porting-note-1.html
|
==================================================================================================
Linux kernel device driver enable
先確認一下,linux kernel上有沒有勾選wireless LAN相關的設定
Device Drivers --->
[*] Network device
support --->
[*] Wireless LAN --->
|
==================================================================================================
修改Android對應開發版的Boardconfig.mk
再確認完linux kernel之後,接著對Android source修改一些內容,首先需要修改Boardconfig.mk,這個檔案位於”device/ti/beagleboneblack/BoardConfig.mk”,這個檔案記錄了一些平台的資訊,由於我使用得是beaglebone black,因此便選這個平台,在這個檔案中需要新增Android對wpa_supplicant的設定,新增或修改以下內容:
BOARD_HAVE_WIFI := true
BOARD_WPA_SUPPLICANT_DRIVER :=WEXT
WPA_SUPPLICANT_VERSION := VER_0_8_X
BOARD_WLAN_DEVICE := wlan0
BOARD_SOFTAP_DEVICE := wlan0
WIFI_DRIVER_MODULE_PATH :=
"/system/lib/modules/rt3070sta.ko"
WIFI_DRIVER_MODULE_NAME := "rt3070sta"
|
§
BOARD_WPA_SUPPLICANT_DRIVER:
在這裡使用WEXT,似乎是WPA_SUPPLICANT用來跟linux kernel的wifi driver互動的driver,這我不是很清楚,需要再找找資料補充補充。
§
WPA_SUPPLICANT_VERSION:
WPA_SUPPLICANT的版本,這裡使用0.8的版本。
§
BOARD_WLAN_DEVICE
& BOARD_SOFTAP_DEVICE:
wifi
device的名字,這取決於你的wifi
device註冊後的名字,因為在之前的RT3070
wifi 修改中,我已經將wifi
device的名字從ra改成wlan,因此在這裡使用wlan0,作為預設的board wlan device
§
WIFI_DRIVER_MODULE_PATH:
wifi
driver的路徑,這取決於你的wifi
driver放的地方,這個路徑要注意一下,因為/system/lib/下應該是沒有modules這個資料夾的,因此,如果你要使用這個路徑,請記得在燒錄SD卡之後,在mount,把這個資料夾創出來(往後會在提一次)
§
WIFI_DRIVER_MODULE_NAME:
wifi
deriver的檔名,不用加ko
==================================================================================================
修改device.mk,增加wifi device
接著需要增加wifi device的名字,這取決於你的wifi device註冊後的名字,因為在之前的RT3070 wifi 修改中,我已經將wifi device的名字從ra改成wlan,因此在這裡使用wlan0,作為預設的board wlan device
修改”device/ti/beagleboneblack/device.mk”這個檔案,新增或修改下內容
# BBBwifi
PRODUCT_PROPERTY_OVERRIDES += \
wifi.interface=wlan0
|
請注意是使用+=,而不是:=,所以要注意新增的位置,因為PRODUCT_PROPERTY_OVERRIDES這個變量在device.mk中,可能已經做了一些設定,所以使用+=來新增新的變量,在新增這行時,要注意使用:=設定PRODUCT_PROPERTY_OVERRIDES的位置,如下圖所示,在35行行處使用:=來進行第一次的設定,因此我們新增的內容要放在這行之後(這裡放在46行),否則可能會出現一些問題。
接著,在”device/ti/beagleboneblack/device.mk”中,新增permissions file
PRODUCT_COPY_FILES := \
{原本的內容} \
frameworks/native/data/etc/android.hardware.wifi.xml:system/etc/permissions/android.hardware.wifi.xml
|
注意不要把原本在PRODUCT_COPY_FILES就設定好的變量給刪掉,將原本的內容最後面加一個「\」,然後在加上上面那行,如下所示。
==================================================================================================
修改Android初始化檔案init.am335xevm.rc
Android開機時會讀取init.rc來進行一些設定,而init.rc會在針對不同的平台獨取子init.rc來進行存取,而我所使用的是beaglebone black,其子init.rc ” 位於device/ti/beagleboneblack/init.am335xevm.rc”,在這個檔案中我們會:
§
新增wifi需要資料夾設定
§
install wifi的module
§
設定service給wifi使用
1.
新增wifi需要資料夾設定
找到on
boot區域,新增以下內容,修改存取權限
mkdir /data/misc/wifi/sockets 0770 wifi wifi
mkdir /data/misc/dhcp 0770 dhcp dhcp
chown dhcp dhcp /data/misc/dhcp
setprop wifi.interface wlan0
|
2.
install wifi的module
找到on
boot區域,新增以下內容,請注意路徑,這個路徑是你放wifi
driver的地方。
insmod /system/lib/modules/cfg80211.ko
insmod /system/lib/modules/mac80211.ko
insmod /system/lib/modules/rt3070sta.ko
|
3. 修改權限 (2015/5/1新增)
再on boot區域,新增以下內容:
chown wifi wifi 將/data/misc/wifi/wpa_supplicant.conf
mkdir /data/system/wpa_supplicant 0770 wifi:wifi
video=720x480-16@60
4.
設定service給wifi使用
找到on
fs區域,新增以下內容。
service
wpa_supplicant /system/bin/wpa_supplicant -iwlan0 -Dwext -c/data/misc/wifi/wpa_supplicant.conf –dd
disabled
oneshot
service dhcpcd_wlan0
/system/bin/dhcpcd -ABKL -f/system/etc/dhcpcd/dhcpcd_wlan.conf
disabled
oneshot
service iprenew_wlan0
/system/bin/dhcpcd –n
disabled
oneshot
|
在service wpa_supplicant中,如果你的裝置不是wlan0,請修改成您的device name。
請特別注意”/data/misc/wifi/wpa_supplicant.conf”和” /system/etc/dhcpcd/dhcpcd_wlan.conf”路徑,以上2個路徑的檔案都是不存在的,需要自己手動新增,而新增的內容,請參閱後面的內容
==================================================================================================
更新Android overlay
接著需要更新一下android的overlay,因為這個source預設在android setting的UI中是沒有wifi介面的,因此需要新增一下overlay,請修改這個檔案”device/ti/beagleboneblack/overlay/frameworks/base/core/res/res/values/config.xml”,新增以下內容:
<string-array
translatable="false" name="networkAttributes">
<item>"ethernet,9,9,2,-1,true"</item>
<item>"wifi,1,1,1,-1,true"</item>
</string-array>
<string-array
translatable="false" name="radioAttributes">
<item>"1,1"</item>
<item>"9,1"</item>
</string-array>
|
==================================================================================================
重新編譯Android
接著請重新編譯Android,然後燒到SD卡中。
==================================================================================================
新增wifi device驅動
因為我們剛剛沒有把驅動加入到編譯的環境中,因此在燒入好SD卡之後,請先使用以下的指令,將Android的file system mount起來,燒完應該會有5個分割,不一定會是sdf,請根據您的環境稍做修改,在這裡使用的是第2個分割區。
#mount –t ext4 /dev/sdf2 /mnt/fs
|
首先新增放kernel module的資料夾
#mkdir /mnt/fs/system/lib/modules
|
然後到android的kernel路徑,使用以下指令搜尋kernel module,然後將搜尋到的.ko檔全部複製到”/mnt/fs/system/lib/modules/”之中;
# cd {your dir}/kernel/
# find ./ -name “*.ko”
|
由於我使用的driver是自己重編的,因此也需要將此檔案複製過來,同時RT3070這個驅動也需要一些額外的設定檔,一並複製過去。
# cp 2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO/os/linux/rt3070sta.ko
/mnt/fs/system/lib/modules/
# mkdir /mnt/fs/system/etc/Wireless/
# mkdir /mnt/fs/system/etc/Wireless/RT2870STA
# cp 2011_0719_RT3070_RT3370_RT5370_RT5372_Linux_STA_V2.5.0.3_DPO/
RT2870STA.dat /mnt/fs/system/etc/Wireless/RT2870STA
|
==================================================================================================
新增wpa_supplicant.conf檔案
接著我們需要新增wpa_supplicant.conf這個檔案,讓wpa_supplicant能夠讀取這個檔案,請一定要新增這個檔案,否則我們在之前新增的service
wpa_supplicant會無法成功運作。
而這個檔案放的位置是根據我們上面的init.am335xevm.rc中設定的service wpa_supplicant來決定,我設定是放在” /data/misc/wifi/wpa_supplicant.conf”之中,接著請mount SD卡,來新增這個檔案,在這裡使用的是第3個分割區
# mount -t ext4 /dev/sdf3 /mnt/fs2/
# mkdir /mnt/fs2/misc/wifi/
# vim /mnt/fs2/misc/wifi/wpa_supplicant.conf
|
在wpa_supplicant.conf中新增以下內容:
ctrl_interface=DIR=/data/system/wpa_supplicant GROUP=wifi
update_config=1
|
==================================================================================================
新增dhcpcd_wlan.conf檔案
而dhcp也需要一個設定檔,在上面的init.am335xevm.rc中,service dhcpcd_wlan0需要這個設定檔,此設定檔放在” /system/etc/dhcpcd/dhcpcd_wlan.conf”之中。
# mount -t ext4 /dev/sdf2 /mnt/fs/
# vim /mnt/fs/system/etc/dhcpcd/dhcpcd_wlan.conf
|
在dhcpcd_wlan.conf中新增以下內容:
interface wlan0
option domain_name_servers, domain_name,
domain_search, host_name
|
==================================================================================================
結果
接著就可以把SD卡接上Beaglebone black,然後等他開機測試完成之後,到seting應該就可以看到wifi的選項已經出現了。
接著就可以來測試看看能不能正常的搜尋網路,從圖中可以看到已經能夠搜尋出附近的網路!
接著嘗試連線其中一台AP,可以看到已經能夠取得IP了,然後就可以測試看看能不能正常上網了!