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 번 포트를 사용한다.
환경 구축하기
DUT PC
여기서 필요한 파일은 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 통신을 할 수 없다.
HOST PC
이제 윈도우 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 사용하기
랩툴에 대한 자세한 사용방법은 아래 문서를 참고한다.
칩 검증하기
준비운동 하기
본격적인 칩 검증을 하기 위해서는 측정 장비를 사용해야 한다. '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 으로 사용해야 가장 최적의 성능을 발휘한다.
이제부터 칩을 검증하기 위해 아래에 나온 예제를 통해 살펴보도록 한다.
802.11b, 6ch, 11Mbps, 17db
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 이다.
802.11g, 6ch, 54Mbps, 15db
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' 로 세팅한다.
802.11a, 36ch, 54Mbps, 13db
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 와 동일하다.
802.11n, 36ch, MCS7 Mbps, 8db
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
드라이버 모듈(sd8xxx.ko)이 제대로 올라가지 않는다
이런 경우, 다음의 순서로 진행해본다.
- 현재 로딩되어 있는 모듈(sd8xxx.ko, mlan.ko)을 모두 내린다.
- 꽂혀있는 보드를 SD 슬롯으로부터 분리한다.
- 다시 꼽는다. 그리고 dmesg 를 통해 제대로 인식하는지 메세지를 확인한다.
- 다시 분리한다. 역시 dmesg 를 통해 제대로 인식하는지 메세지를 확인한다.
- 다시 꼽고, 차례대로 드라이버 모듈을 올린다.
만일 이렇게 시도했음에도 제대로 인식하지 않는다면, 타켓보드의 전원을 끈다(전원 어댑터를 보드로부터 분리한다). 잠시 후 다시 전원을 연결하고, 그리고 앞서 설명한 순서대로 다시 시도한다.
펌웨어를 변경했음에도 불구하고 labtool 에서 펌웨어 버전이 제대로 나오지 않는다
타겟보드의 전원이 켜져 있는 상태에서는 드라이버 로딩 시, 펌웨어를 다시 올렸더라도 제대로 로딩이 안될 수 있다.
따라서 타켓보드의 전원을 끈다(전원 어댑터를 보드로부터 분리한다). 그리고 앞서 설명한 순서대로 다시 시도한다.