포럼 회원으로 등록하신분만 다운로드가 가능합니다. 최대 업로드 가능한 용량은 20MB 입니다.

wifi marvell sd8686 혹은 sd8688 android 포팅해보기

 

안녕하세요. 고도리입니다.

 

요즘 marvell wifi를 포팅하고 있습니다.
자료를 조금씩 정리해 나갈까 합니다.

 

일단 글을 올리는 여러가지 이유 중 하나는 제가 작업할 시간이 너무 없어서
남의 경험을 빌리려는 것도 있고, 나름대로 하나씩 정리해 나가는 것도 있습니다.
(오늘 회사가서 wifi.c를 작업하려고 했는데, 다른일 처리할게 너무 많아서-영수증정리랑, 문서정리...ㅠ.ㅠ
암것도 못하고 소스 수정만 집에서 하고 있습니다)


혹시나 포팅하셨던 분들은 약간의 답글이나마 도움이 되니 글을 답글을 올려주시기 바랍니다.

============================================
1. 카드 준비하기

보통은 built-in 모듈을 사용합니다만, 저는 sd card형태로 된 것과 빌트인 된 것을 사용하고 있습니다.

 

2. kernel 준비하기

일단 커널에는 libertas라는 marvel 8686 드라이버가 있습니다(2.6.27서 작업중)

 

make menuconfig를 하시고

 

Networking support에서 wireless extension을 enable 해 줍니다.

  lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq Networking support qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk
  x  Arrow keys navigate the menu.  <Enter> selects submenus --->.  Highlighted letters are       x
  x  hotkeys.  Pressing <Y> includes, <N> excludes, <M> modularizes features.  Press <Esc><Esc>   x
  x  to exit, <?> for Help, </> for Search.  Legend: [*] built-in  [ ] excluded  <M> module  < >  x
  x  module capable                                                                               x
  x lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk x
  x x          --- Networking support                                                           x x
  x x                Networking options  --->                                                   x x
  x x          [ ]   Amateur Radio support  --->                                                x x
  x x          < >   CAN bus subsystem support  --->                                            x x
  x x          < >   IrDA (infrared) subsystem support  --->                                    x x
  x x          < >   Bluetooth subsystem support  --->                                          x x
  x x          < >   RxRPC session sockets                                                      x x
  x x                Wireless  --->                                                             x x
  x x          < >   RF switch subsystem support  --->                                          x x
  x x          < >   Plan 9 Resource Sharing Support (9P2000) (Experimental)  --->              x x
  x x                                                                                           x x
  x x                                                                                           x x
  x x                                                                                           x x
  x x                                                                                           x x
  x x                                                                                           x x
  x x                                                                                           x x
  x x                                                                                           x x
  x x                                                                                           x x
  x mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj x
  tqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqu
  x                               <Select>    < Exit >    < Help >                                x
  mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj


  lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq Wireless qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk
  x  Arrow keys navigate the menu.  <Enter> selects submenus --->.  Highlighted letters are       x
  x  hotkeys.  Pressing <Y> includes, <N> excludes, <M> modularizes features.  Press <Esc><Esc>   x
  x  to exit, <?> for Help, </> for Search.  Legend: [*] built-in  [ ] excluded  <M> module  < >  x
  x  module capable                                                                               x
  x lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk x
  x x          < > Improved wireless configuration API                                          x x
  x x          -*- Wireless extensions                                                          x x
  x x          [*]   Wireless extensions sysfs files                                            x x
  x x          < > Generic IEEE 802.11 Networking Stack (mac80211)                              x x
  x x          < > Generic IEEE 802.11 Networking Stack (DEPRECATED)                            x x
  x x                                                                                           x x
  x x                                                                                           x x
  x x                                                                                           x x
  x x                                                                                           x x
  x x                                                                                           x x
  x x                                                                                           x x
  x x                                                                                           x x
  x x                                                                                           x x
  x x                                                                                           x x
  x x                                                                                           x x
  x x                                                                                           x x
  x x                                                                                           x x
  x x                                                                                           x x
  x mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj x
  tqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqu
  x                               <Select>    < Exit >    < Help >                                x
  mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
 
 
 
  그리고 network device driver에서 다음과 같이 marvel driver를 built-in 해 줍니다.
 
  Android wifi의 경우는 모듈로딩을 기본으로 하게 되어 있는데, 개인적으로 빌트인 하기를 좋아하고
  이런게 훨 편하다고 생각하기 때문입니다.
 
  그리고, android의 hardware/libhardware_legacy/wifi.c 를 보시면 모듈을 하나만 로딩하게 되어 있는데
  libertas 드라이버는 모듈을 두개 로딩해야 합니다.
 
  해서, 어차피 wifi.c를 수정하는 거라면...
 
  빌트인 하는게 낫다 싶어서 빌트인 하였습니다.
 

  Device drivers-> network device drivers
 
    lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq Wireless LAN qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk
  x  Arrow keys navigate the menu.  <Enter> selects submenus --->.  Highlighted letters are       x
  x  hotkeys.  Pressing <Y> includes, <N> excludes, <M> modularizes features.  Press <Esc><Esc>   x
  x  to exit, <?> for Help, </> for Search.  Legend: [*] built-in  [ ] excluded  <M> module  < >  x
  x  module capable                                                                               x
  x lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk x
  x x          [ ] Wireless LAN (pre-802.11)                                                    x x
  x x          [*] Wireless LAN (IEEE 802.11)                                                   x x
  x x          <*>   Marvell 8xxx Libertas WLAN driver support                                  x x
  x x          <*>     Marvell Libertas 8385/8686/8688 SDIO 802.11b/g cards                     x x
  x x          [*]     Enable full debugging output in the Libertas module.                     x x
  x x          < > IEEE 802.11 for Host AP (Prism2/2.5/3 and WEP/TKIP/CCMP)                     x x
  x x                                                                                           x x
  x x                                                                                           x x
  x x                                                                                           x x
  x x                                                                                           x x
  x x                                                                                           x x
  x x                                                                                           x x
  x x                                                                                           x x
  x x                                                                                           x x
  x x                                                                                           x x
  x x                                                                                           x x
  x x                                                                                           x x
  x x                                                                                           x x
  x mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj x
  tqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqu
  x                               <Select>    < Exit >    < Help >                                x
  mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
 
  이렇게 한 후 커널 컴파일을 합니다...
 
3. android로의 부팅

libertas 드라이버는 로딩시 firmware파일 두개를 필요로 합니다.

sd8686.bin
sd8686_helper.bin

이 두개 파일은 libertas 드라이버를 보시면서 수정해 주시면 되는데, 내용물은 같다고 보여집니다
예전에 redhat linux용으로 marvell사에서 릴리즈 했던건데 요즘은 없습니다.

예전 중국의 이상한 사이트서 받아놓은게 있어서 그것을 활용했습니다(밑에 첨부합니다)

이 파일 두개를 android rootfs의

system/etc/firmware 란 디렉토리 밑에 가져다 놓습니다.


그리고, 부팅을 합니다.

eth0가 잡히는 것을 확인할 수 있습니다.


4. 테스트

밑에 첨부하는 busybox와 iwconfig를 이용해서 테스트할 수 있습니다.

이 두개의 파일을 안드로이드 rootfs 의 / 에 가져다 놓고
부팅후....

다음과 같은 명령을 내리면 인터넷을 사용할 수 있습니다.
브라우저 이용해서

-------------------------------------------
iwconfig, busybox를 rootfs의 / 에 복사하신 후에
firmware를 rootfs의 system/etc/firmware 디렉토리에 복사해 주시고

부팅 후

// 이 두줄은 한번만
ln -s busybox ./ifconfig
ln -s busybox ./route


// 이렇게 해서
./busybox ash
./ifconfig eth0 up
./iwconfig eth0 essid 'insignal'
./ifconfig eth0 192.168.0.105
./route add default gw 192.168.0.1 eth0
setprop net.dns1 168.126.63.1   
--------------------------------------------

이런 방식은 android의 wifi를 쓰는게 아니라 ethernet을 사용하는 것처럼 사용하는 것입니다.

wifi를 쓰려면 wpa_supplicant를 이용해서 처리를 합니다.


5. 안드로이드에서의 인식

1> hardware/libhardware_legacy/wifi.c
를 적절하게 수정해야 합니다.

일단 저는 이렇게 수정해 봤습니다.

※중요: test하지 않은 코드입니다. 테스트는 시간이 나야 할 수 있을 듯 합니다.


int wifi_load_driver()
{
    char driver_status[PROPERTY_VALUE_MAX];
    int count = 100; /* wait at most 20 seconds for completion */

#if 0 // ghcstop delete
    if (check_driver_loaded()) {
        return 0;
    }

    if (insmod(DRIVER_MODULE_PATH) < 0)
        return -1;
    
    property_set("ctl.start", FIRMWARE_LOADER);
    sched_yield();
    while (count-- > 0) {
        if (property_get(DRIVER_PROP_NAME, driver_status, NULL)) {
            if (strcmp(driver_status, "ok") == 0)
                return 0;
            else if (strcmp(DRIVER_PROP_NAME, "failed") == 0)
                return -1;
        }
        usleep(200000);
    }
    property_set(DRIVER_PROP_NAME, "timeout");
#else // 수정한 부분
  property_set("ctl.start", "ifcfg_ralink"); // 밑의 init.rc 부분에 설명이 되어 있음
  return 0;
#endif   
    return -1;
}

int wifi_unload_driver()
{
    int count = 20; /* wait at most 10 seconds for completion */

return 0; // ghcstop 수정한부분
   
    if (rmmod(DRIVER_MODULE_NAME) == 0) {
 while (count-- > 0) {
     if (!check_driver_loaded())
  break;
         usleep(500000);
 }
 if (count) {
         return 0;
 }
 return -1;
    } else
        return -1;
}


대략 이렇게 하면 될 듯 합니다(built-in의 경우)

 

6. 그 후에 다음의 사이트에서 처리하 듯이 처리하면 될 듯 합니다.

일단

주요 참고 자료

// 일본 사이트 best, ubuntu에서 wpa-supplicant, 세팅하는 방법에 대한 아주 자세한 결과물까지 포함
http://labs.beatcraft.com/ja/index.php?bc9%2FSoftware%2FAndroid%2FAndroid_Wi-Fi
==> 저는 여기 사이트 그대로 하면 될 듯 합니다.


// 일본사이트, 자세히 설명
http://whitesc3.blog7.fc2.com/blog-entry-111.html
==> 물론 여기 자료도 참고하는게 좋습니다. init.rc의 수정위치를 명시해 줬네요.

// aesop의 게시물
http://www.aesop.or.kr/?document_srl=55406
==> 위의 자료와 같이 참고하면 좋을 듯 합니다.


// ralink wlan을 가지고 포팅하는 방법에 대한 패치파일
http://groups.google.com/group/android-porting/msg/610881453f67749b?pli=1

// 간단한 포팅방법에 대한 설명, 아마도 htc의 wlan인 듯
http://forum.xda-developers.com/showthread.php?t=541884

 


http://labs.beatcraft.com/ja/index.php?bc9%2FSoftware%2FAndroid%2FAndroid_Wi-Fi
이 사이트를 근거로 다음과 같이 수정합니다.

순서
1> external/wpa_supplicant/.config  수정
2> build/target/board/generic/BoardConfig.mk 수정
3> external/wpa_supplicant/wpa_supplicant.conf 에서 eth0가 아니고 eth0로 수정
4> wifi.c를 위와같이 수정(제가 생각한대로)
(위의 일본 사이트는 ralink의 것을 가지고 되어 있고,
모듈이 로딩이 끝나면 다음과 같은 코드로 init.rc의  ifcfg_ralink를 control start명령으로 사용하는군요
property_set("ctl.start", "ifcfg_ralink");
)

 

5> /system/etc/wpa_supplicant.conf 의 경우 위의 사이트는 external/wpa_supplicant/wpa_supplicant.conf를
패치해서 사용하는데(default configuration으로)

저는 다음과 같이 이중 테스트해도 나쁘지는 않을거라고 보여지네요.
android의 rootfs의 해당 파일을 다음과 같이 고쳐줍니다.

vi system/etc/wifi/wpa_supplicant.conf

ctrl_interface=DIR=/data/system/wpa_supplicant GROUP=system
update_config=1

network={
    ssid="godori"
    key_mgmt=WPA-PSK
    proto=WPA WPA2
    pairwise=CCMP TKIP
    group=CCMP TKIP WEP104 WEP40
    psk="babobabo"
}

 

여기서 godori는 essid이고, psk 는 "babobabo"이고, 당연히 AP는 동일하게 세팅되어 있어야 하겠지요?

 

6> 이밖에 android - 1.5r3 소스 코드에서 tieth0되어있는 부분
(android-1.5r3/external/dhcpcd/android.conf,
frameworks/base/services/java/com/android/server/WifiWatchdogService.java、
android-1.5r3/frameworks/base/wifi/java/android/net/wifi/WifiStateTracker.java)
을 eth0로 수정합니다.

이 부분은 안드로이드 버전에 따라 약간 틀릴거라고 보여집니다.

 

7> wifi interface 이름을 설정하기 위해 system/build.prop에 다음을 추가합니다.
# WiFi settings
wifi.interface = eth0

 

 

8> init.rc를 다음과 같이 고쳐줍니다.
추가하는 위치는 대략 밑부분으로 알아서 처리해주면 될 듯 합니다.

 

   setprop wifi.interface eth0
   setprop wlan.driver.status ok

   # 이 부분은 wifi.c의 수정과 관련이 있으니, 위에서 해줘야할지 고민입니다.
   # 아마도 해줘야 할 듯 하네요.
   service ifcfg_ralink /system/bin/ifconfig eth0 up
   #   disabled
   #   oneshot

   service wpa_supplicant /system/bin/logwrapper /system/bin/wpa_supplicant -Dwext -ieth0 -c /system/etc/wifi/wpa_supplicant.conf -dd
       disabled
       group system

   service dhcpcd /system/bin/logwrapper /system/bin/dhcpcd -d eth0
       disabled
       oneshot
       #group system dhcp

   on property:init.svc.wpa_supplicant=stopped
       stop dhcpcd


9> setting에서 wifi-on을 시켜서 되는지 확인해 봅니다.

 

=======================================

대략 이런 순서로 해보면 될 듯 한데.........시간이 없어서 미치겠습니다.

누가 marvell sd8686이나 sd8688을 가지고 테스트가 가능하신분은 다음과 같이 테스트해서
하우투를 올려주시기 바랍니다.

물론 제가 테스트한다면 먼저 해보도록 하겠습니다......ㅠ.ㅠ

그럼...


고도리

2009.09.22 10:21:40
*.59.122.199

제가 성격이 머해서 그런지는 모르겠는데........


글을 좀 길게 써서 붙였더니 완전 이상하게 붙어버리네요........에디팅도 엄청 힘들고....

제로보드가 이상한건지 제가 이상한건지.......ㅠ.ㅠ

김성재

2009.09.23 00:44:59
*.133.50.150

안녕하세요. 고도리님.

 

Libertas_sdio.ko 를 만들어서 insmod 로 올리고 rmmod 후에 다시 insmod 하면 timeout 에러가 발생합니다.

혹시 이부분 어찌 해야 하는지 여쭤봅니다.

 

------------------------------------------------------

$ insmod libertas_sdio.ko

ibertas_sdio: Libertas SDIO driver
libertas_sdio: Copyright Pierre Ossman
libertas_sdio mmc0:0001:1: firmware: requesting sd8686_helper.bin
libertas: failed to load helper firmware
libertas_sdio: probe of mmc0:0001:1 failed with error -110

김성재

2009.09.23 01:01:44
*.133.50.150

https://wiki.ubuntu.com/Marvell8686Firmware

 

보면 firmware 받는 곳이 나옵니다.

 

그리고 lib/firmware에 firmware를 넣으라고 나오는데요. 안드로이드와 디렉토리가 달라도 될런지요.

 

그리고 nfs로 테스트 할때에는 모듈로 안만들면 firmware 로딩이 안됩니다.

고도리

2009.09.23 01:16:23
*.106.37.196

libertas 드라이버가 rmmod 하면 문제가 터진다는 얘기가 있습니다.

 

저도 그 부분은 아직 못찾아봤는데, 아마도 firmware 이중 로딩에 문제가 있지 않을래나 생각이 되고요...

 

android는 /etc/firmware에 넣게 소스에 되어 있습니다. 해서 /system/etc/firmware에 넣으셔야 합니다.

두 디렉토리가 부팅시 softlink 걸리게 되어 있습니다.

 

로딩이 안될때는 libertas 소스를 보시고 firmware이름이 맞는지 확인해 보시기 바랍니다.

 

김성재

2009.09.23 02:28:24
*.133.50.150

kernel에 드라이버가 포함된 상태에서 /etc/firmware 에 *.bin을 넣게 되어 있으면 첫부팅할때 libertas_sdio 는 /lib/firmware에서 *.bin을 찾지만 softlink가 걸리지 않아서 디렉토리가 없으므로 firmware 로딩에러가 날것 같습니다.

고현철

2009.09.23 05:11:57
*.7.206.75

softlink는 init.rc에서 걸립니다.

 

로딩에러 나지 않습니다. 왜냐하면 안드로이드 부팅 초기에 init.rc에서 system/etc를 etc로 링크 걸어놓기 때문이죠

김성재

2009.09.23 23:27:22
*.133.50.150

libertas_sdio 드라이버를 빌트인 하게되면 안드로이드가 부팅하기 전인 커널이 부팅할때 libertas_sdio가 /lib/firmware 에서 *.bin을 찾게되는것 같습니다. system/etc가 /etc로 링크하고 상관 없이...

 

고현철

2009.09.24 04:09:37
*.7.206.75

그럼 둘 다 넣어보시면 될 듯 하네요...^^

 

저는 일요일에나 볼 수 있을 듯 합니다........잘 하면...쩝

고현철

2009.09.28 18:21:14
*.32.117.22

system/etc/firmware만 넣어도 잘 됩니다...

 

테스트 끝냈습니다.....^^

이상호

2009.10.28 02:07:38
*.25.183.150

insmod -> rmmod -> insmod 하면 -110 timeout 에러는 해결이 안되는 건가요?

빌트인하면 -2 번 에러가 발생하네요.

List of Articles
번호 제목 글쓴이 날짜 조회 수
64 Google 의 새로운 코덱 VP8 Video Codec 규격자료를 올려 봅니다... file [1] 장석원 2010-05-24 14955
63 [실습-03] android source compile시 battery 부분 patch하기 [7] 고도리 2010-05-24 15897
62 [실습-02] android에서 new product 만들고 compile하기 file [7] 고도리 2010-05-18 13223
61 [이론-00] Android의 개요와 구성 part0 [2] 고도리 2010-05-17 12471
60 [실습-01] android 개발환경 세팅과 source download [2] 고도리 2010-05-17 13781
59 [실습-00] android eclair porting을 위한 ubuntu 설치하기 file [6] 고도리 2010-05-17 12321
58 AudioSystem과 AudioSystem.java를 이용한 JNI 단에서의 연결 [1] JhoonKim 2010-04-14 10871
57 AudioPolicyService와 AudioFlinger 및 HAL의 연결 구조 JhoonKim 2010-04-08 11294
56 Android 2.x AudioFlinger와 HAL의 연결 구조 분석 [2] JhoonKim 2010-04-08 19343
55 busybox에 대한 질문 [3] 득드로이드 2010-03-24 8881
54 누가 Android 에 tslib를 포팅해 놓은듯 합니다. file 최종환 2009-11-11 11062
53 Android Battery 부분 조금 정리해 놓은것 file [2] 최종환 2009-11-04 10726
52 Power Management from Linux Kernel to Android file [10] 최종환 2009-11-01 14996
51 이솝 임베디드 포럼 - 10월 31일 Google Android Seminar 발표 ... file [16] 관리자 2009-10-28 10898
50 Dummy Battery 드라이버 입니다. file [3] 관리자 2009-10-10 10263
» [참고] Android wifi howto - 아직 테스트는 다 못했습니다. file [10] 고도리 2009-09-22 21723
48 [번역] Android Camera Framework 번역 file [7] 고도리 2009-09-10 19665
47 Android home key is not working(home key 동작 안 할경우 ) [1] 고현철 2009-09-10 10597
46 S3C6410 프로세서용 Andoird Kernel 2.6.29 이식 방법 #1 [2] 김재훈 2009-09-04 15823
45 삼성 안드로이드폰(갤럭시) 리눅스 커널 소스코드 file [3] 유형목 2009-09-01 15909

사용자 로그인