국가마다 서로 다른 규격을 가지고 있기 때문에 향후 양산을 위해서는 각각의 규격을 맞춰줘야 한다.
무선 특성 중에 특히 rssi 라 불리는 신호세기는 반드시 설정해줘야 하는 부분이다.
lucas2 에서 rssi 를 변경하는 방법에는 크게 3 가지가 있다.
- cal data
- firmware
- power table
여기서는 마지막 3번째 방법인 power table 을 사용하는 방법을 다룬다.
신호 대역별 설정 방법
먼저 삼성에서 요청한 채널별 rssi 테이블을 먼저 살펴보겠다. ss_pt.doc 파일을 다운받는다.
표를 보면, 각 대역별 채널별로 rssi 값이 적혀있는 것을 볼 수 있다. 이 테이블을 기준으로 power table 을 만들어야 한다.
기존의 power table 파일인 txpwrlimit_cfg_w8897_pwt.conf 을 보면 아래와 같다.
## TLVChanNum : Channel Number ## TLVPwr[] : ModulationGroup ## 0: CCK (1,2,5.5,11 Mbps) ## 1: OFDM (6,9,12,18 Mbps) ## 2: OFDM (24,36 Mbps) ## 3: OFDM (48,54 Mbps) ## 4: HT20 (MCS0,1,2) ## 5: HT20 (MCS3,4) ## 6: HT20 (MCS5,6,7) ## 7: HT40 (MCS0,1,2) ## 8: HT40 (MCS3,4) ## 9: HT40 (MCS5,6,7) ## 10: HT2_20 (MCS8,9,10) ## 11: HT2_20 (MCS11,12) ## 12: HT2_20 (MCS13,14,15) ## 13: HT2_40 (MCS8,9,10) ## 14: HT2_40 (MCS11,12) ## 15: HT2_40 (MCS13,14,15) ## 16: VHT_20_QAM256 (MCS8) ## 17: VHT_40_QAM256 (MCS8,9) ## 18: VHT_80_PSK (MCS0,1,2) ## 19: VHT_80_QAM16 (MCS3,4) ## 20: VHT_80_QAM64 (MCS5,6,7) ## 21: VHT_80_QAM256 (MCS8,9) ## 22: VHT2_20_QAM256 (MCS8,9) ## 23: VHT2_40_QAM256 (MCS8,9) ## 24: VHT2_80_PSK (MCS0,1,2) ## 25: VHT2_80_QAM16 (MCS3,4) ## 26: VHT2_80_QAM64 (MCS5,6,7) ## 27: VHT2_80_QAM256 (MCS8,9) ## Power Limit in dBm
각각의 modulation 방식에 따라 0~27 까지 숫자가 할당되어 있는 것을 알 수 있는데, 표로 정리하면 아래와 같다.
프로토콜 | 번호 |
802.11b | 0 |
802.11g | 1,2,3 |
802.11a | 1,2,3 |
802.11n | BW20(4,5,6,10,11,12), BW40(7,8,9,13,14,15) |
802.11ac | BW20(16,22), BW40(17,23), BW80(18,19,20,21,24,25,26,27) |
Power table 파일 분석
앞서 설명한 내용을 숙지하고, 본격적인 power table 을 보도록 하자.
## 2G Tx power limit CFG // 2.4 GHz 대역 설정 US_txpwrlimit_2g_cfg_set={ CmdCode=0x008f # do NOT change this line정 Action:2=1 # 1 - SET type:2=0x0006 # 6 - host_TYPE_TPRC_CONFIG Length:2={ ChanTRPC.TlvType:2=0x0189 ChanTRPC.TlvLength:2={ TLVStartFreq:2=2407 TLVChanWidth:1=20 TLVChanNum:1=1 // 채널 번호 1 TLVPwr:32='0,11,1,10,2,12,3,12,4,16,5,13,6,13,7,16,8,13,9,13,10,16,11,13,12,13,13,16,14,13,15,13' // power table } ChanTRPC.TlvType:2=0x0189 ChanTRPC.TlvLength:2={ TLVStartFreq:2=2407 TLVChanWidth:1=20 TLVChanNum:1=2 // 채널 번호 2 TLVPwr:32='0,16,1,10,2,12,3,12,4,16,5,13,6,13,7,16,8,13,9,13,10,16,11,13,12,13,13,16,14,13,15,13' // power table } ChanTRPC.TlvType:2=0x0189 ChanTRPC.TlvLength:2={ TLVStartFreq:2=2407 TLVChanWidth:1=20 TLVChanNum:1=3 // 채널 번호 3 TLVPwr:32='0,16,1,14,2,12,3,12,4,16,5,13,6,13,7,16,8,13,9,13,10,16,11,13,12,13,13,16,14,13,15,13' // power table } ... ## 5G Sub0 Tx power limit CFG US_txpwrlimit_5g_cfg_set_sub0={ // 5 GHz 대역 sub0 설정 ... US_txpwrlimit_5g_cfg_set_sub1={ // 5 GHz 대역 sub1 설정 CmdCode=0x008f # do NOT change this line Action:2=1 # 1 - SET type:2=0x0006 # 6 - host_TYPE_TPRC_CONFIG ... US_txpwrlimit_5g_cfg_set_sub2={ // 5 GHz 대역 sub2 설정 CmdCode=0x008f # do NOT change this line Action:2=1 # 1 - SET type:2=0x0006 # 6 - host_TYPE_TPRC_CONFIG Length:2={ ChanTRPC.TlvType:2=0x0189 ... US_txpwrlimit_5g_cfg_set_sub3={ // 5 GHz 대역 sub3 설정 CmdCode=0x008f # do NOT change this line Action:2=1 # 1 - SET type:2=0x0006 # 6 - host_TYPE_TPRC_CONFIG Length:2={ ChanTRPC.TlvType:2=0x0189 ChanTRPC.TlvLength:2={ ...
conf 파일을 보면, 크게 다섯개의 설정 부분으로 나뉜다. 2.4G 설정 1 곳과 5G 설정 4 곳이다. 각 설정부분을 보면, 그안에 채널별로 세부 설정들이 있다.
US_txpwrlimit_2g_cfg_set={ CmdCode=0x008f # do NOT change this line정 Action:2=1 # 1 - SET type:2=0x0006 # 6 - host_TYPE_TPRC_CONFIG Length:2={ ChanTRPC.TlvType:2=0x0189 ChanTRPC.TlvLength:2={ TLVStartFreq:2=2407 TLVChanWidth:1=20 TLVChanNum:1=1 // 채널 번호 1 TLVPwr:32='0,11,1,10,2,12,3,12,4,16,5,13,6,13,7,16,8,13,9,13,10,16,11,13,12,13,13,16,14,13,15,13' // power table }
power table 은 '0,16,1,10,2,12,3,12,4,16,5,13,6,13,7,16,8,13,9,13,10,16,11,13,12,13,13,16,14,13,15,13' 과 같이 숫자들의 나열로 이루어져 있는데, 이것에는 규칙이 있다.
- 두개의 숫자가 한쌍이며, 1씩 증가한다. 예를 들면, 첫번째 값은 '0' 과 '16' 이다.
- 0 은 CCK(modulation) 을 뜻하고, 16 은 rssi 값이다. 다시말하면, 802.11b 에서 1 번 채널에 대한 rssi 설정을 16으로 한다는 뜻이다.
위의 규칙으로 파일을 수정하면, 아래와 같다.
US_txpwrlimit_2g_cfg_set={ CmdCode=0x008f # do NOT change this line Action:2=1 # 1 - SET type:2=0x0006 # 6 - host_TYPE_TPRC_CONFIG Length:2={ ChanTRPC.TlvType:2=0x0189 ChanTRPC.TlvLength:2={ TLVStartFreq:2=2407 TLVChanWidth:1=20 TLVChanNum:1=1 TLVPwr:32='0,11,1,10,2,10,3,10,4,10,5,10,6,10,7,9,8,9,9,9,10,10,11,10,12,10,13,9,14,9,15,9' } ChanTRPC.TlvType:2=0x0189 ChanTRPC.TlvLength:2={ ... US_txpwrlimit_5g_cfg_set_sub0={ CmdCode=0x008f # do NOT change this line Action:2=1 # 1 - SET type:2=0x0006 # 6 - host_TYPE_TPRC_CONFIG Length:2={ ChanTRPC.TlvType:2=0x0189 ChanTRPC.TlvLength:2={ TLVStartFreq:2=5000 TLVChanWidth:1=20 TLVChanNum:1=36 TLVPwr:54='1,11,2,11,3,11,4,11,5,11,6,11,7,8,8,8,9,8,10,11,11,11,12,11,13,8,14,8,15,8,16,8,17,8,18,6,19,6,20,6,21,6,22,8,23,8,24,6,25,6,26,6,27,6' } ChanTRPC.TlvType:2=0x0189 ChanTRPC.TlvLength:2={ ...
수정된 파일은 txpwrlimit_j.conf 에 있다.
dtsi 파일 생성하기
앞서 수정된 conf 파일을 바탕으로 dtsi 파일을 생성해야 한다. 리눅스 커널에서 지원하는 형태로 변환시키는 작업이다.
marvell 에서 만든 'mlanutl' 라는 프로그램이 필요한데, 아래와 같이 생성할 수 있다.
#./mlanutl mlan0 hostcmd txpwrlimit_j.conf generate_raw txpwrlimit_j.bin buf_len = 574 buf_len = 510 buf_len = 696 buf_len = 758 buf_len = 510 #ls
실행 후 txpwrlimit_j.bin, txpwrlimit_j.dtsi 파일이 생성된 것을 알 수 있다.
/ { marvell_cfgdata { marvell,caldata_00_txpwrlimit_2g_cfg_set = /bits/ 8 < 0x01 0x00 0x06 0x00 0x30 0x02 0x89 0x01 0x24 0x00 0x67 0x09 0x14 0x01 0x00 0x0b 0x01 0x0a 0x02 0x0a 0x03 0x0a 0x04 0x0a 0x05 0x0a 0x06 0x0a 0x07 0x09 0x08 0x09 0x09 0x09 0x0a 0x0a 0x0b 0x0a 0x0c 0x0a 0x0d 0x09 0x0e 0x09 0x0f 0x09 0x89 0x01 0x24 0x00 0x67 0x09 0x14 0x02 0x00 0x10 0x01 0x0a 0x02 0x0a 0x03 0x0a 0x04 0x0d 0x05 0x0d 0x06 0x0d 0x07 0x09 0x08 0x09 0x09 0x09 0x0a 0x0d 0x0b 0x0d 0x0c 0x0d 0x0d 0x09 0x0e 0x09 0x0f 0x09 0x89 0x01 ...
커널에 적용하기
dtsi 파일을 커널에 복사한다. 경로는 /home/lucas/trunk/src/third_party/kernel-next/arch/arm/boot/dts/ 이다. 그리고 나서 /home/lucas/trunk/src/third_party/kernel-next/arch/arm/boot/dts/exynos542x-peach.dtsi 파일을 아래와 같이 추가한다.
/* * Common device tree include for all Peach board revisions * * Copyright (c) 2013 Google, Inc * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #include "marvell_txpwrlimit.dtsi" // 추가
확인하기
설정이 제대로 적용되었는지 rssi 를 측정해보자. 신호세기 측정하기 문서를 참고하자.