8887 개발을 위한 환경 설정 방법을 기술했다.
더 정확히 말하자면, 칩 양산시 MFG 라고하는 모드에서 WiFi 칩의 특성을 세팅할 수 있도록 해주는 방법이다.

준비운동하기

환경 설정을 위해 필요한 것들은 아래와 같다.

이름 운영체제 설정 파일 설명
PC1 Windows 7 HOST Laptool 을 실행하는 쪽
PC2 Debian 7 DUT Ref 타겟을 연결하여, 8887 을 제어하는 쪽

PC1 과 PC2 는 같은 네트워크 안에 있어야 하기 때문에 유무선 공유기가 필요하다.

MFG 모드 개요

앞서 잠깐 언급했지만, MFG 모드는 일반적으로 normal 한 상황에서는 사용하지 않는다. MFG 라는 모드 자체의 목적은 WiFi 칩 고유의 성능과 특성 및 신호 세팅을 하는데 있다.

따라서 칩이 어느정도 인식 후 동작이 되면(대개 H/W 수정이 더이상 이뤄지지 않는 시점), 최고의 성능을 내기 위해 WiFi 칩을 세팅한다. 이때 MFG 모드로 진입하여 장비를 통해 어떤 값으로 설정했을 때, 가장 최적의 성능을 내는지 측정한다.

측정이 끝나면, 도출된 설정 값을 WiFi 칩 내부의 OTP(One-Time Programming) 라는 영역에 쓴다(Write). 이것은 EEPROM 과 같아서 R/W 하는데 한계가 있다. 각 칩 벤더들 마다 고유의 방식으로 OTP 를 사용한다.

보통 OTP 는 WiFi 모듈업체에서 관장하지만, 요즘에는 칩 가격을 최대한 낮추기 위해 모듈업체를 거치지 않고, 제품회사에서 직접 관장하는 추세가 늘고 있다.
Marvell 8887 의 MFG 모드는 다음과 같이 동작한다.

Host PC 에서는 Labtool 을 사용하여 명령을 내리고, 이를 받은 Dut PC 에서는 WiFi 칩에 명령을 내린다. 2 대의 PC 는 서로 TCP/IP 통신을 하며, Host PC 는 9931 번 포트를 Dut PC 는 9930 번 포트를 사용한다.

환경 구축하기

여기서 필요한 파일은 8797.tar.gz 에서 다운 받는다.
압축을 풀고 'mfgbridge' 파일을 생성하기위해 아래와 같이 컴파일한다.

#cd 8797
#cd mfg_and_Labtool/bridge_linux_0.1.0.29/bridge
#make

에러없이 빌드되었다면, mfgbridge 파일이 보일 것이다. 실행하자.

#./mfgbridge
UART: initialize ...
Can't get port settings: Input/output error
NET:  initialize ...
NET:  socket bind is completed!
NET:  initialization is completed.
NET:  server port: 9930
NET:  client port: 9931

이제 드라이버를 빌드할 차례다. 새로운 창을 열어 아래와 같이 빌드한다. 참고로 드라이버는 커널 3.5.x 이하에서만 가능하다. 이보다 상위 커널에서는 빌드 중 에러가 발생한다.

#cd /tmp/8797/mfg_and_Labtool/src/wlan_src
#make

에러없이 빌드되었다면, 'mlan.ko, sd8xxx.ko' 파일이 보일 것이다.
이제 타겟보드의 전원을 켜고, SDIO 슬롯을 PC 에 연결한다.

#insmod mlan.ko
#cp SDIOSDIO8797.bin /lib/firmware/mrvl
#insmod sd8xxx.ko mfg_mode=1 drv_mode=1 fw_name=mrvl/SDIOSDIO8797.bin

모듈이 제대로 올라갔다면, mlan0 인터페이스가 보일 것이다.

#ifconfig
mlan0     Link encap:Ethernet  HWaddr ff:ff:ff:ff:ff:ff  
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

MFG 용 펌웨어가 올라가있기 때문에 MAC 주소가 이상한 것을 볼 수 있다. 실제로 이 상태에서는 제대로된 WIFI 통신을 할 수 없다.

이제 윈도우 PC 차례다. 앞서 언급한 8797.tar.gz 파일을 여기서도 다운받는다.
압축을 풀고, mfg_and_Labtool/labtool 디렉토리로 이동한다. 'SetUp.ini' 파일을 열어 DUT 와 HOST PC 의 IP 주소를 설정한다.

/** @file SetUp.ini
 *
 *  Copyright (C) 2009-2010, Marvell International Ltd.
 *  All Rights Reserved
 */
 
;for UDP routine implementation
[DutIp] 
;DutIpAddress  = 192.168.0.10
DutIpAddress  = 192.168.0.101      // 수정 
HostIpAddress = 192.168.0.100      // 수정
;HostIpAddress = 192.168.0.101
Protocol = TCP
Protocol =  UDP
 
[GoldenIp]
GoldenIpAddress  = 192.168.0.12
...

DutApiMimoBtFmBrdigeEth.exe 파일을 실행한다.

Name:           Dut labtool
Version:        1.0.9.00
Date:           Jan 28 2013 (18:46:42)
 
Note:
 
1. =========WiFi tool=============
2. =========BT   tool=============
3. =========FM   tool=============
99.Exit
Enter option: 1          // 입력
Name:           DutApiClass
Interface:      CF
Version:        1.0.9.03
Date:           Jan 28 2013 (18:45:58)
 
Note:
 
C:\Users\wjkim\Desktop\8797\mfg_and_Labtool\labtool\setup.ini
Dut's IP 192.168.0.101:9930
Host's IP 192.168.0.100:9931
DutIf_UdpIp::delay 0
DutIf_UdpIp::vg_IfSpy 0
TCP connecting...
 DutIf_InitConnection: 0
--------------------------------------------------------
                W87xx (802.11a/g/b/n) TEST MENU
--------------------------------------------------------
Enter option: 88               // 입력
DLL Version : 1.0.9.3
LabTool Version: 1.0.9.0
FW Version:  14.1.11.189        Mfg Version: 1.0.9.0
SOC:    0380    10
BBP:    9C      00
RF:     38      00
OR Version:     2.1      Customer ID:   0
Enter option:

이때 DUT PC 에서는 아래와 같은 로그가 출력된다.

NET:  socket FD = 4
NET:  new connection from 192.168.0.101
Initialize drvwrapper ....
Cannot open device /dev/mbtchar0DRV:  driver is initialized.
NET:  socket FD = 5
NET:  receive a packet (bytes = 40
BRDG: process Rx msg ... 
NET:  WLAN command.
DRV:  send host cmd thr ioctl
DRV:  host cmd is completed
NET:  send a msg.
NET:  the msg is sent.
NET:  socket FD = 5
NET:  receive a packet (bytes = 48
BRDG: process Rx msg ... 
NET:  WLAN command.
DRV:  send host cmd thr ioctl
DRV:  host cmd is completed
NET:  send a msg.
NET:  the msg is sent.
NET:  socket FD = 5
NET:  receive a packet (bytes = 36
BRDG: process Rx msg ... 
NET:  WLAN command.
DRV:  send host cmd thr ioctl
DRV:  host cmd is completed
NET:  send a msg.
NET:  the msg is sent.

Lab Tool 사용하기

랩툴에 대한 자세한 사용방법은 아래 문서를 참고한다.

labtool.pdf

본격적인 칩 검증을 하기 위해서는 측정 장비를 사용해야 한다. 'LITE POINT' 사에서 만든 'IQ 2010' 이란 장비이다. 또한
측정 장비를 사용하기 위한 프로그램을 설치해야 한다. 설치할 PC 가 64bit 라면, 별도의 설치 파일(Win_64bitdriver_v1.2.10)이 필요하다.
프로그램을 설치하고, 장비에 연결된 USB 를 꼽고, 'IQ Signal' 이라는 프로그램을 실행하면, 장비를 사용할 준비는 끝난 것이다.

칩 정상여부 판단을 위해서 가장 중요한 작업은 세팅한 bit rate 이 나오는 지 여부이다.

1, 2 , 5.5 , 11 M 는 IEEE 802.11b 방식이며 6, 9 ,12 , 18, 24 , 36 , 48 , 54 M 는 IEEE 802.11g 방식이다.
MCS 부분은 IEEE 802.11n 방식 전송속도 라고 보면 된다.

MCS0 20MHz채널일 경우(6.5~7.2M), 40Mhz채널일 경우(13.5~15M)
MCS1 20MHz채널일 경우(13~14.4M), 40Mhz채널일 경우(27~30M)
MCS2 20MHz채널일 경우(19.5~21.7M), 40Mhz채널일 경우(40.5~45M)
MCS3 20MHz채널일 경우(26~28.9M), 40Mhz채널일 경우(54~60M)
MCS4 20MHz채널일 경우(39.3~43.3M), 40Mhz채널일 경우(81~90M)
MCS5 20MHz채널일 경우(52~57.8M), 40Mhz채널일 경우(108~120M)
MCS6 20MHz채널일 경우(58.5~65M), 40Mhz채널일 경우(121.5~135M)
MCS7 20MHz채널일 경우(65~72.2M), 40Mhz채널일 경우(135~150M)
MCS8 20MHz채널일 경우(13~14.4M), 40Mhz채널일 경우(27~30M)
MCS9 20MHz채널일 경우(26~28.9M), 40Mhz채널일 경우(54~60M)
MCS10 20MHz채널일 경우(39~43.3M), 40Mhz채널일 경우(81~90M)
MCS11 20MHz채널일 경우(52~57.8M), 40Mhz채널일 경우(108~120M)
MCS12 20MHz채널일 경우(78~86.7M), 40Mhz채널일 경우(162~180M)
MCS13 20MHz채널일 경우(104~115.6M), 40Mhz채널일 경우(216~240M)
MCS14 20MHz채널일 경우(117~130M), 40Mhz채널일 경우(243~270M)
MCS15 20MHz채널일 경우(130~144.4M), 40Mhz채널일 경우(270~300M)

사용하려는 클라이언트가 802.11b 방식만 지원하면 11M가 최대 속도 이며(최대 이론 속도이다. 실제속도는 6~7M가 정상)
802.11g 방식이라면 54M가 최대 속도(최대 이론 속도이다. 실제속도는 20~25M가 정상)

n방식모드라면 MCS7 으로 사용해야 가장 최적의 성능을 발휘한다.

이제부터 칩을 검증하기 위해 아래에 나온 예제를 통해 살펴보도록 한다.

25          // Stop Tx
10 1 1      // Set Path A Only
30 0        // Set to 2.4 GHz Band
112 0       // Set to 20 MHz BW
12 6        // Set to CH 6
22 0 6 17 0 // Set to CH 6 at 17 dBm Output Power with CCK/BPSK Data Rate on Path A
25 1 4      // Tx at 11 Mbps
25          // Stop Tx 

위의 명령어는 11b 를 측정하기 위한 설정으로, External Atten 항목은 '5 dB' 로 세팅한다. 이 값은 보드와 장비를 연결한 선의 저항값이다.
채널 설정 후, Auto Range 를 누르고, Run 버튼을 누르면, 실제 측정이 이루어진다.
이때 Plot Window 를 누르면, 현재 신호가 규격에 적합한지 여부를 확인할 수 있다.
여기서 유의할 점은 11b 의 경우, modulation 이 CCK 라는 점이다. 참고로 g/a/n 은 OFDM 방식을 사용한다.
또한 11b 에서의 최대 bit rate 속도는 11Mbps 이다.

25          // Stop Tx
10 1 1      // Set Path A Only
30 0        // Set to 2.4 GHz Band
112 0       // Set to 20 MHz BW
12 6        // Set to CH 6
22 0 6 15 0 // Set to CH 6 at 15 dBm Output Power with OFDM Data Rate on Path A
25 1 13      // Tx at 54 Mbps
25          // Stop Tx 

11g/a 에서는 변조화 방식이 OFDM 이다. 따라서 명령어 22 번의 인자를 전과 달리 해주어야 한다. bit rate 역시, 최대 속도인 54Mbps 로 설정한다. 여기서도 External Atten 항목은 '5 dB' 로 세팅한다.

25          // Stop Tx
10 1 1      // Set Path A Only
30 1        // Set to 5 GHz Band
112 0       // Set to 20 MHz BW
12 36        // Set to CH 36
22 0 36 13 1 // Set to CH 36 at 13 dBm Output Power with OFDM Data Rate on Path A
25 1 13      // Tx at 54 Mbps
25          // Stop Tx 

여기서도 External Atten 항목은 '5 dB' 로 세팅한다. 나머지 항목은 11g 와 동일하다.

25          // Stop Tx
10 3 3      // Set Path A and B
30 1        // Set to 5 GHz Band
112 0       // Set to 20 MHz BW
12 36        // Set to CH 36
22 2 36 8 1 // Set to CH 36 at 8 dBm Output Power with OFDM Data Rate on Path A + B
25 1 22      // Tx at MCS7
25         // Stop Tx 
2G 11b 11Mbps
11g 54Mbps
11n MCS7
5G 11a 54Mbps
11an MCS7

안드로이드 빌드

안드로이드를 빌드 시에는 빌드 환경변수 파일들을 모두 로딩하는 것이 중요하다. 아래 절차는 빌드하기전에 반드시 실행해주어야 한다.

root@ubuntu:/srv/pxa988_jb4.3-beta1# source build/envsetup.sh      // 환경변수 파일 로딩을 위한 명령어 실행
including device/marvell/common/vendorsetup.sh
including device/marvell/pxa1L88dkb/vendorsetup.sh
including sdk/bash_completion/adb.bash
root@ubuntu:/srv/pxa988_jb4.3-beta1# ls device/marvell/
common/     pxa1L88dkb/ 
root@ubuntu:/srv/pxa988_jb4.3-beta1# ls device/marvell/pxa1L88dkb/                    // 빌드에 사용되는 파일은 pxa1L88dkb_def.mk 이다
AndroidProducts.mk  all_modules.mk  extfs            modules       pxa1L88dkb_def.mk  sign_image.mk            
BoardConfig.mk      blf             kernel_build.mk  obm_build.mk  pxa1L88dkb_tz.mk   uboot_build.mk
PowerDaemon         copyfiles       keymaps          overlay       recovery           vendorsetup.sh
root@ubuntu:/srv/pxa988_jb4.3-beta1# choosecombo                  // 빌드 환경 변수 지정을 위한 명령어 실행
Build type choices are:
     1. release
     2. debug
 
Which would you like? [1]            // 엔터 입력
 
Which product would you like? [full] pxa1L88dkb_def            // pxa1L88dkb_def 입력
 
Variant choices are:
     1. user
     2. userdebug
     3. eng
Which would you like? [eng]    // 엔터 입력
 
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.3
TARGET_PRODUCT=pxa1L88dkb_def
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a-neon
TARGET_CPU_VARIANT=cortex-a7
HOST_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-3.5.0-45-generic-x86_64-with-Ubuntu-12.10-quantal
HOST_BUILD_TYPE=release
BUILD_ID=JSS15Q
OUT_DIR=out
============================================
 
root@ubuntu:/srv/pxa988_jb4.3-beta1# 

이제부터 본격적인 안드로이드 빌드를 하면된다.

FAQ

이런 경우, 다음의 순서로 진행해본다.

  1. 현재 로딩되어 있는 모듈(sd8xxx.ko, mlan.ko)을 모두 내린다.
  2. 꽂혀있는 보드를 SD 슬롯으로부터 분리한다.
  3. 다시 꼽는다. 그리고 dmesg 를 통해 제대로 인식하는지 메세지를 확인한다.
  4. 다시 분리한다. 역시 dmesg 를 통해 제대로 인식하는지 메세지를 확인한다.
  5. 다시 꼽고, 차례대로 드라이버 모듈을 올린다.

만일 이렇게 시도했음에도 제대로 인식하지 않는다면, 타켓보드의 전원을 끈다(전원 어댑터를 보드로부터 분리한다). 잠시 후 다시 전원을 연결하고, 그리고 앞서 설명한 순서대로 다시 시도한다.

타겟보드의 전원이 켜져 있는 상태에서는 드라이버 로딩 시, 펌웨어를 다시 올렸더라도 제대로 로딩이 안될 수 있다.
따라서 타켓보드의 전원을 끈다(전원 어댑터를 보드로부터 분리한다). 그리고 앞서 설명한 순서대로 다시 시도한다.

  • computer/marvell/8887_bring-up_하기.txt
  • Last modified: 3 years ago
  • by likewind