3/19/2014

WIFI Linux/Android Driver Porting 확인사항

1. 개발환경확인 (Cross Compile)

  • vi .bash_profile or bashrc
PATH="/home/jhlee/CodeSourcery/Sourcery_G++_Lite/bin:${PATH}"
PATH=${HOME}/bin:${PATH}
## add tail 
export PATH
export ARCH=arm
export CROSS_COMPILE=arm-none-eabi-


2. Build 환경 및 HAL 확인 (Android)

  • vi BoardConfig.mk 확인 (Odroid 인 경우)
PATH: build/target/board/device/hardkernel/odroidx2/BoardConfig.mk
기본 WPA_SUPPLICANT의 빌드환경을 확인

BOARD_WPA_SUPPLICANT_DRIVER := WEXT
(이는 external/wpa_supplicant/Android.mk 에서 driver_wext.c 동작 )

  • WIFI_DRIVER 정보확인 
  1. WIFI_DRIVER_MODULE_NAME
  2. WIFI_DRIVER_MODULE_PATH        
  3. WIFI_DRIVER_MODULE_ARG   
만약 다른 driver를 사용시 이름변경. (MADWIFI, PRISM )

  • vi Boardconfig.mk (WIFI Driver 설정 예)
#
# Wifi related defines
#
# ralink module = rt5370sta, realtek = rtl8191su
#
BOARD_WIFI_VENDOR       := realtek
BOARD_WLAN_DEVICE       := rtl819xxu

WPA_SUPPLICANT_VERSION              := VER_0_8_X
BOARD_WPA_SUPPLICANT_DRIVER         := WEXT
BOARD_WPA_SUPPLICANT_PRIVATE_LIB    := lib_driver_cmd_rtl
WIFI_DRIVER_MODULE_NAME                 := "rtl8191su"
WIFI_DRIVER_MODULE_PATH             := "/system/lib/modules/rtl8191su.ko"
WIFI_DRIVER_MODULE_NAME2                := "rtl8192cu"
WIFI_DRIVER_MODULE_PATH2            := "/system/lib/modules/rtl8192cu.ko"
WIFI_DRIVER_MODULE_NAME3                    := "rt5370sta"
WIFI_DRIVER_MODULE_PATH3            := "/system/lib/modules/rt5370sta.ko"

# Realtek driver has FW embedded inside, and will automatically load FW
# at NIC initialization process. So there is no need to set these 
# 5 variables.
WIFI_DRIVER_MODULE_ARG           := ""
WIFI_FIRMWARE_LOADER             := ""
WIFI_DRIVER_FW_PATH_STA          := ""
WIFI_DRIVER_FW_PATH_AP           := ""
WIFI_DRIVER_FW_PATH_P2P          := ""
WIFI_DRIVER_FW_PATH_PARAM        := ""


  • Android의 HAL Layer 부분확인 
hardware/libhardware_legacy/wifi/wifi.c 확인 
위 내용을 확인 하였으면, HAL에서도 위 내용을 확인하고 각종 설정확인을 확인하자.
아래는 다른 Android HAL 예제
 https://android.googlesource.com/platform/hardware/libhardware_legacy/+/64cca04dcbf4e21a51131224b9d0f0c596f876d4/wifi/wifi.c

  •  init.rc 확인  (init.odroidx2.rc)
init.rc에서 service 각 기능확인  및 dhcpd 기능 확인
Serial에서 service를 동작 가능하며, sta의 경우 wpa_suplicant를 쉽게 Control
# start wpa_supplicant
# stop wpa_suppilcant


vi init.odroidx2.rc  (odroid 예제)
service wpa_supplicant /system/bin/wpa_supplicant \
    -Dwext -iwlan0 -c/data/misc/wifi/wpa_supplicant.conf \
    -O/data/misc/wifi/sockets \
    -e/data/misc/wifi/entropy.bin -g@android:wpa_wlan0
    #   we will start as root and wpa_supplicant will switch to user wifi
    #   after setting up the capabilities required for WEXT
    #   user wifi
    #   group wifi inet keystore
    class main
    socket wpa_wlan0 dgram 660 wifi wifi
    disabled
    oneshot

service dhcpcd_wlan0 /system/bin/dhcpcd -aABDKL
    class main
    disabled
    oneshot

service iprenew_wlan0 /system/bin/dhcpcd -n
    class main
    disabled
    oneshot

# eth0
service dhcpcd_eth0 /system/bin/dhcpcd -ABDKL
    class main
    disabled
    oneshot

# IP Renew
# eth0
service iprenew_eth0 /system/bin/dhcpcd -n
    class main
    disabled
    oneshot 

        
init문법 관련내용(systemd의 경우는 다름)
  http://taehyo.egloos.com/4129642


2.1 WIFI STA의 WPA Supplicant 의 설정 

  • vi wpa_supplicant.conf
wpa_supplicant가 실행시 참조하는 configuration으로 설정 값을 확인하자.
위에서 init.rc에 보면 사용하는 wpa_supplicant.conf는 /data/misc/wifi/wpa_supplicant.conf이다.

PATH: 
/data/misc/wifi/wpa_supplicant.conf 
/etc/wifi/wpa_supplicant.conf

확인사항: 
ctrl_interfacepath 권한 및 소유를 확인하자. ( ls -ah)                      
HAL과 Kernel 모듈도 권한 및 소유 확인.       
/lib/libhardware_legacy.so
/lib/modules/rtl8191su.ko

ctrl_interface=/data/misc/wifi/sockets
update_config=1
device_name=odroidx2
manufacturer=HARDKERNEL Co., Ltd.
model_name=ODROID-X2
model_number=ODROID-X2
serial_number=
device_type=10-0050F204-5
config_methods=physical_display virtual_push_button

network={
        ssid="CWPW"
        key_mgmt=NONE
        priority=1
}

network={
        ssid="U+Net6AFB"
        psk="5000050330"
        key_mgmt=WPA-PSK
        priority=2
} 

Ref.  (Android WIFI Porting 시 참고사항)
  http://blog.linuxconsulting.ro/2010/04/porting-wifi-drivers-to-android.html  
  http://processors.wiki.ti.com/index.php/TI-Android-GingerBread-2.3.4-DevKit-2.1_PortingGuides#WLan
  http://pds22.egloos.com/pds/201205/17/14/Android_Device_Driver_Collage8.pdf

3. WIFI TEST 및 동작확인 (Tool 사용)

  • wpa_supplicant test 및 module test 
아래와 같이 test,  wpa_supplicant 의 -dd 옵션 debug
각각 의 wlan의 status 확인하자 (init.rc , hal 하고 관련)

 # lsmod    //확인
 # insmod /lib/modules/rtl8191su.ko

 # getprop wifi.interface              // wlan0 ,  이 값은 driver에 따라 변경이 가능하다. eth0, usb0, 제조사이름
 # getprop wlan.interface              // wlan0
 # getprop wlan.driver.status          // ok 
 # getprop init.svc.wpa_supplicant     // wpa_supplicant의 상태를 나타낸다,   stopped or running 체크하자. 

 # setprop wlan.interface "wlan0"     // HAL에서도 설정이 존재한다. 
 # setprop wifi.interface "wlan0"     // HAL에서도 이 설정 존재하며, 중요하다.
 # setprop wlan.driver.status "ok"    // HAL 및 init.rc에 이 설정이 존재


 # ifconfig wlan0 up
 # start wpa_supplicant       // 위의 init.rc의 service를 실행할 수 있다. 
 # stop  wpa_supplicant       //   
 or 

 # wpa_supplicant -Dwext -iwlan0 -c/data/misc/wifi/wpa_supplicant.conf -dd & 
   

  • wpa_cli test 
wpa_cli 이용하여, AP을 SCAN하고 설정하여 접속할 수 있다. 하지만
손쉽게 wpa_supplicant.conf에서 직접 설정해서 해도 된다.

 # wpa_cli -p /data/misc/wifi/sockets -iwlan0   // data/misc/wifi/wpa_supplicant.conf,  ctrl_interface 참조

 > scan             // scan 시작한다.

<3>WPS-AP-AVAILABLE 
<3>CTRL-EVENT-SCAN-RESULTS 
<3>WPS-AP-AVAILABLE 
<3>CTRL-EVENT-SCAN-RESULTS 
<3>CTRL-EVENT-SCAN-RESULTS 
<3>CTRL-EVENT-SCAN-RESULTS 
<3>CTRL-EVENT-SCAN-RESULT
   ......

 > scan_results    // scan 결과를 아래와 같이 보자 

00:40:5a:9c:6a:fa 2422 -69 [WPA2-EAP-CCMP][ESS] U+zone
00:40:5a:9c:6a:f9 2422 -70 [WPA2-PSK-CCMP][ESS] U+Net6AFB
00:40:5a:9c:6a:f8 2422 -69 [WPA-PSK-TKIP][ESS] 
00:26:66:a0:35:ba 2432 -88 [WPA-PSK-CCMP][WPA2-PSK-CCMP][WPS][ESS] iptime89
6c:fd:b9:30:ba:82 2457 -76 [WEP][ESS] SAMSUNG
00:90:a2:12:b5:b1 2457 -92 [WPA2-PSK-CCMP][ESS] U+NetB5B3
00:27:1c:55:71:ed 2412 -91 [WPA2-PSK-CCMP][ESS] U+Net71EF
00:27:1c:55:71:ee 2412 -90 [WPA2-EAP-CCMP][ESS] U+zone
00:24:a5:34:2f:b3 2462 -92 [WPS][ESS] 0024A5342FB3

 > list_networks                          // 현재 나의 network를 점검, wpa_supplican.conf 기반으로 점검이 된다. 
   network id / ssid / bssid / flags
   0 CWPW any 

 > add_network                         // 현재 내가 접속하고자 하는 Network이 없기에 추가.
 1

 > set_network 1 ssid "U+Net6AFB"      // add_network 에서 받은 번호를 입력하고, SSID를 입력하자!, scan_result 참조. 
 OK

 > set_network 1 psk "5000050330"      // 암호를 입력하자. psk 형태이다. scan_result 참조. 
 OK

 > select_network 1                    // 설정된 1번 을 선택하자 , select_network를 이용하여 여러 접속가능.
 OK

 > status                              // 상태 확인 

bssid=00:40:5a:9c:6a:f9
ssid=U+Net6AFB
id=1
mode=station
pairwise_cipher=CCMP
group_cipher=CCMP
key_mgmt=WPA2-PSK
wpa_state=COMPLETED
address=e8:4e:06:0a:96:14
 
 > disconnect                    // 현재 연결된 AP 종료     
 > reconnect                     // 현재 연결된 AP 재연결 
 > remove_network 1              // 1 번 network 제거
 > quit                          // wpa_cli 종료  


  • dhcpcd 설정
아래와 같이 AP 접속 후, dhcpcd를 이용하여 IP를 받아온다.

DHCP Success
# dhcpcd wlan0  & // dhcpc service 성공. 
[1] 2771
dhcpcd[2771]: version 5.5.6 starting
dhcpcd[2771]: wlan0: sending IPv6 Router Solicitation
dhcpcd[2771]: wlan0: rebinding lease of 192.168.123.164
dhcpcd[2771]: wlan0: acknowledged 192.168.123.164 from 192.168.123.254
dhcpcd[2771]: wlan0: checking for 192.168.123.164
dhcpcd[2771]: wlan0: sending IPv6 Router Solicitation
dhcpcd[2771]: wlan0: leased 192.168.123.164 for 86400 seconds
dhcpcd[2771]: forked to background, child pid 2806 
DHCP Fail
# dhcpcd wlan0   // dhcpc service 에러. 
dhcpcd[2670]: version 5.5.6 starting
dhcpcd[2670]: wlan0: sending IPv6 Router Solicitation
dhcpcd[2670]: wlan0: checking for 169.254.155.41
dhcpcd[2670]: wlan0: sending IPv6 Router Solicitation
dhcpcd[2670]: wlan0: using IPv4LL address 169.254.155.41
dhcpcd[2670]: forked to background, child pid 2695
        둘다 실행은 했지만 위에는 성공을 하고, 아래는 받지 못해, 169.254.155.41 IP설정된다.
        반드시 ack를 확인하고 해당 IP 확인하자
        test 시 ps 확인하고 kill로 해당 프로세스를 없애자.

        만약 지속적으로 dhcpcd 문제가 발생시 dhcpcd -n ( renew하고 다시 실행)

  • WIFI Module 점검 
     -  lsmod로 vendor driver 확인   
         ( kernel 포함가능성 확인 , make menuconfig 확인 )

     -  ifconfig wlan0   명령으로 연결확인
         (ifconfig wlan0 up 시도  및 다른 이름 찾기:wlan0 이 아닐 경우)
       
SIOCGIFFLAGS  :  Link 에러로 Module 이상이나, 연결이 안되었을 가능성 있음. 기본문제
wlan0: Cannot assign requested address : wpa_supplicant 문제

  • wpa_supplicant 점검
아래와 같이 각종 interface를 점검을 하고, configuration도 점검하자.

wpa_supplicant -Dnl80211 -iwlan0 -c/etc/wifi/wpa_supplicant.conf
wpa_supplicant -Dwext -iwlan0 -c/etc/wifi/wpa_supplicant.conf