특정 칩셋에 상관없이 공통적으로 적용되는 marvell 드라이버에 대한 정보를 담고있다.
따라서 차후 드라이버 관련 디버깅이나 개발을 하기 위해서는 반드시 이 문서를 먼저 살펴보길 권한다.
참고사항
이 문서는 아래와 같은 환경 하에서 테스트되고 작성되었다.
Host | PC 64bit(X230) |
Target | PC 64bit(X230) |
OS | Ubuntu 13.10(3.11.0-22) |
Chipset | 8887 |
Compiler | Gcc-4.6.3 |
Driver | SD-WLAN-SD-BT-FM-NFC-8887-FC18-MMC-15.68.4.p85-15.29.4.p85-C2615038_A0-GPL-201405291917 |
Etc | wpa_supplicant-2.1, hostapd-2.1 |
드라이버 코드 받기
드라이버 코드는 크게 두가지 버전이 존재한다.
Internal 과 External 이 그것인데, Internal 은 공식적으로 최종 릴리즈된 버전은 아니지만, 내부적으로 개발팀에서 릴리즈된 버전이다. 내부적으로 재현테스트를 할 때는 이 버전을 사용한다.
External 은 외부적으로 릴리즈된 버전으로 Internal 버전에서 QA 쪽의 최종 확인이 끝나면 릴리즈되는 버전으로 이후, 최종 Customer 에게 전달된다.
이 두가지 버전은 다운로드하는 위치 또한 다르다.
Internal | \swrel\swrel\ENG_Internal_Release\EEBU_SW_REL |
External | \swrel\swrel\FAE_External_Release 또는 http://extranet.marvell.com |
같은 칩의 드라이버라도 디렉토리명 또는 파일명으로 버전을 구분을 해야한다.
예를 들면, 'SD-WLAN-SD-BT-FM-NFC-8887-FC18-MMC-15.68.4.p85-15.29.4.p85-C2615038_A0-GPL-201405291917' 은 SD 디바이스의 타입으로서 FC18(즉 fedora18 에서 테스트했고, 다시말해 target 이 PC 인)이고, firmware 버전은 p85 인 드라이버이다.
firmware 의 경우, 보통 FwImage 디렉토리 아래에 존재한다. 같은 p85 라고 해도, 여러개의 파일이 존재하는데, 여기서는 보통 'sd8887_uapsta.bin' 를 사용한다.
빌드하기
타겟용으로 빌드하기 위해서는 Makefile 의 수정이 필요하다.
아래와 같이 툴체인과 커널 경로를 지정해주면 된다.
CROSS_COMPILE=/usr/local/arm-2011.09/bin/arm-none-linux-gnueabi- // 추가 COMPATDIR=/lib/modules/$(KERNELVERSION_X86)/build/compat-wireless-3.2-rc1-1/include CC= $(CROSS_COMPILE)gcc -I$(COMPATDIR) LD= $(CROSS_COMPILE)ld BACKUP= /root/backup YMD= `date +%Y%m%d%H%M` ... KERNELVERSION_X86 := $(shell uname -r) #KERNELDIR ?= /lib/modules/$(KERNELVERSION_X86)/build KERNELDIR ?= /prj/NX1/0708/linux-3.5 // 추가 LD += -S ...
위와 같이 수정하고도 빌드 도중 툴체인을 찾지 못해 에러가 발생할 수 있다. 이때는 아래와 같이 path 를 걸어준다.
export PATH=/usr/local/arm-2011.09/bin:$PATH
드라이버 내부 구조
Marvell 드라이버는 크게 커널모듈 파일(.ko)과 firmware 파일(.bin)로 나뉜다. 따라서 드라이버를 빌드하면 이 두개의 파일을 얻게되는 것이다.
빌드 방법은 따로 설명하지 않는다. 하지만, 유의해야 할 점에 대해서 짚어 보겠다.
- Makefile 수정(툴체인, 참조할 커널의 위치)
- Makefile 옵션 확인(Debug level 등)
빌드 후에는 insmod 명령을 사용하여 커널에 적재한다. 이때 유의해야할 점에 대해 살펴보겠다.
- firmware 파일의 위치(기본적으로는 /lib/firmware/mrvl 이지만, 다른 경로일 경우에는 별도의 인자를 넣어주어야 한다)
- mlan.ko, sd8xxx.ko 의 차례로 올린다.
- 로딩 후에는 ifconfig -a 또는 dmesg | tail 과 같은 명령어로 정상적으로 로딩되었는지 확인한다.
기본적으로 아무런 인자없이 insmod 를 실행했다면, 아래와 같이 출력된다.
#insmod mlan.ko #insmod sd8xxx.ko #ifconfig -a mlan0 Link encap:Ethernet HWaddr 00:50:43:21:ad:a8 // for STA 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) uap0 Link encap:Ethernet HWaddr 00:50:43:21:ad:a8 // for SoftAP 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) wfd0 Link encap:Ethernet HWaddr 02:50:43:21:ad:a8 // for P2P 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)
같은 MAC 주소를 가진 3개의 네트워크 인터페이스가 생성된 것을 볼 수 있는데, 이것들은 각각의 기능을 사용할 때 사용된다(주석 참조).
드라이버 사용하기
insmod 시 인자 사용하기
Insmod 시, 아래 나온 여러가지 인자들을 사용하여 동작 방식이나 설정을 변경할 수 있다.
b) Install WLAN driver, There are drv_mode, max_sta_bss, max_uap_bss etc. module parameters. The bit settings of drv_mode are, Bit 0 : STA Bit 1 : uAP Bit 2 : WIFIDIRECT The default drv_mode is 7. max_sta_bss: Maximum number of STA BSS (default 1, max 1) sta_name: Name of the STA interface (default: "mlan") max_uap_bss: Maximum number of uAP BSS (default 1, max 2) uap_name: Name of the uAP interface (default: "uap") max_wfd_bss: Maximum number of WIFIDIRECT BSS (default 1, max 1) wfd_name: Name of the WIFIDIRECT interface (default: "wfd") For example, to install SD8787 driver, insmod mlan.ko insmod sd8787.ko [drv_mode=3] [fw_name=mrvl/sd8787_uapsta.bin] To load driver in STA only mode, insmod mlan.ko insmod sd8787.ko drv_mode=1 [fw_name=mrvl/sd8787_uapsta.bin] To load driver in uAP only mode, insmod mlan.ko insmod sd8787.ko drv_mode=2 [fw_name=mrvl/sd8787_uapsta.bin] To switch mode between STA only, uAP only and uAPSTA etc. in run time, echo drv_mode=1 > /proc/mwlan/config // STA mode echo drv_mode=2 > /proc/mwlan/config // uAP mode echo drv_mode=3 > /proc/mwlan/config // STA+uAP mode echo drv_mode=7 > /proc/mwlan/config // STA+uAP+WIFIDIRECT mode ... ... There are some other parameters for debugging purpose etc. Use modinfo to check details. drvdbg=<bit mask of driver debug message control> mac_addr=xx:xx:xx:xx:xx:xx <override the MAC address (in hex)> auto_ds=0|1|2 <use MLAN default | enable auto deepsleep | disable auto deepsleep> ps_mode=0|1|2 <use MLAN default | enable IEEE PS mode | disable IEEE PS mode> max_tx_buf=2048|4096|8192 <maximum AMSDU Tx buffer size> pm_keep_power=1|0 <PM keep power in suspend (default) | PM no power in suspend> cfg_11d=0|1|2 <use MLAN default | enable 11d | disable 11d> req_fw_nowait=0|1 <use request_firmware API (default) | use request_firmware_nowait API> init_cfg=<init config (MAC addresses, registers etc.) file name> e.g. copy init_cfg.conf to firmware directory, init_cfg=mrvl/init_cfg.conf cal_data_cfg=<CAL data config file name> e.g. copy cal_data.conf to firmware directory, cal_data_cfg=mrvl/cal_data.conf txpwrlimit_cfg=<Tx power limit config file name> e.g. copy txpwrlimit_cfg_set.conf to firmware directory, txpwrlimit_cfg=mrvl/txpwrlimit_cfg_set.conf init_hostcmd_cfg=<init hostcmd config file name> e.g. copy init_hostcmd_cfg.conf to firmware directory, init_hostcmd_cfg=mrvl/init_hostcmd_cfg.conf cfg80211_wext=<bit mask of CFG80211 and WEXT control> Bit 0: STA WEXT Bit 1: uAP WEXT Bit 2: STA CFG80211 Bit 3: uAP CFG80211 wq_sched_prio: Priority for work queue wq_sched_policy: Scheduling policy for work queue (0: SCHED_NORMAL, 1: SCHED_FIFO, 2: SCHED_RR, 3: SCHED_BATCH, 5: SCHED_IDLE) Please note that, both wq_sched_prio and wq_sched_policy should be provided as module parameters. If wq_sched_policy is (0, 3 or 5), then wq_sched_prio must be 0. wq_sched_prio should be 1 to 99 otherwise. low_power_mode_enable=0|1 <disable low power mode (default)| enable low power mode> When low power mode is enabled, the output power will be clipped at ~+10dBm and the expected PA current is expected to be in the 80-90 mA range for b/g/n modes
특히 위의 옵션 중에 중요한 것들을 꼽자면, 아래와 같다.
cfg80211_wext | cfg80211 의 지원여부를 설정하고, 이로 인하여 wpa_supplication 의 동작 여부가 결정된다 |
drvdbg | debug print level 을 설정한다 |
P2P 관련
WiFi Direct 를 사용하기 위해서는 특별한 인자값을 사용해야 한다. 만일 그렇지 않으면, p2p_find, p2p_connect 등 P2P 기본적인 기능들을 사용할 수 없게 된다. 따라서 P2P 를 사용하려면 반드시 아래와 같이 insmod 시 인자를 사용해야 한다.
#insmod mlan.ko #insmod sd8xxx.ko cfg80211_wext=15 max_vir_bss=1 p2p_enh=1
p2p_enh=1 | if p2p_find will not fail, use parameter |
max_vir_bss=1 | if p2p_connect will not fail, use parameter |
위와 같이 insmod 를 실행했다고 해도, wpa_supplication 를 실행 시, 아래와 같이 옵션을 추가해야 한다.
#./wpa_supplicant -Dnl80211 -iwfd0 -c /etc/wpa_supplicant/p2p.conf -puse_p2p_group_interface=1 -dd
Sleep, Power 관련
일정 시간동안 WIFI 동작이 없을 시, 자동으로 sleep 모드로 들어가는 것을 방지하기 위해서는 'auto_ds=2' 인자로 주면 된다.
휴대폰과 같은 모바일이 아닌 경우, Power save 모드를 비활성화 하기 위해서는 'ps_mode=2' 로 주면 된다.
RF 신호 측정 시
'ps_mode=2 auto_ds=2 hw_test=1' 을 주면 된다.
Insmod 시 관련 파일 로딩 옵션들
insmod 를 하면서 여러가지 파일들을 로딩하고 이를 적용하여 WIFI 드라이버를 초기화 한다.
cal_data_cfg=mrvl/WlanCalData_ext.conf | cal 파일 지정 |
fw_name=mrvl/sd8887_uapsta.bin | firmware 파일 지정 |
txpwrlimit_cfg=mrvl/txpowerlimit.conf | tx power 세기를 조정하는 파일 지정 |
rmmod 시 절차
c) Uninstall WLAN driver, ifconfig mlanX down ifconfig uapX down rmmod sd8xxx rmmod mlan
WiFi 기본 기능 사용하기
모듈과 firmware 가 정상적으로 커널에 로딩되면, 이제 기본적인 WiFi 기능을 확인해볼 차례다. 여기서는 각각 wpa_supplicant 와 hostapd 를 사용한다. 테스트 환경을 다시한번 참고하기 바란다.
먼저 아래와 같이 초기화 했다.
#insmod mlan.ko #insmod sd8xxx.ko cfg80211_wext=15 max_vir_bss=1 p2p_enh=1
사전 준비(wpa_supplicant/hostapd)
wpa_supplicant 빌드
wpa_supplicant 관련 내용은 wpa supplicant 핵심가이드 를 참고한다. 여기서는 빌드에 필요한 config 파일만을 다룬다.
# Wi-Fi Protected Setup (WPS) CONFIG_WPS=y # Enable WSC 2.0 support CONFIG_WPS2=y # Enable WPS external registrar functionality CONFIG_WPS_ER=y # Disable credentials for an open network by default when acting as a WPS # registrar. #CONFIG_WPS_REG_DISABLE_OPEN=y # Enable WPS support with NFC config method #CONFIG_WPS_NFC=y ... # AP mode operations with wpa_supplicant # This can be used for controlling AP mode operations with wpa_supplicant. It # should be noted that this is mainly aimed at simple cases like # WPA2-Personal while more complex configurations like WPA2-Enterprise with an # external RADIUS server can be supported with hostapd. CONFIG_AP=y # P2P (Wi-Fi Direct) # This can be used to enable P2P support in wpa_supplicant. See README-P2P for # more information on P2P operations. CONFIG_P2P=y # Enable TDLS support CONFIG_TDLS=y ...
나머지 옵션은 기본값으로 한다.
hostapd 빌드
앞서와 마찬가지로 빌드에 필요한 .config 파일만을 살펴보겠다.
... CONFIG_DRIVER_HOSTAP=y CONFIG_DRIVER_NL80211=y CONFIG_IAPP=y CONFIG_RSN_PREAUTH=y CONFIG_PEERKEY=y CONFIG_EAP=y CONFIG_EAP_MD5=y CONFIG_EAP_TLS=y CONFIG_EAP_MSCHAPV2=y CONFIG_EAP_PEAP=y CONFIG_EAP_GTC=y CONFIG_EAP_TTLS=y CONFIG_WPS=y CONFIG_WPS2=y CONFIG_WPS_UPNP=y CONFIG_PKCS12=y CONFIG_IPV6=y CONFIG_AP=y ...
STA(Station)
Station 모드에서는 wpa_suppliant 만을 사용한다. 이때 사용되는 wps.conf 파일은 아래와 같다.
ctrl_interface=/var/run/wpa_supplicant ap_scan=1
아래와 같이 실행한다.
#./wpa_supplicant -Dnl80211 -imlan0 -c /etc/wpa_supplicant/wpa.conf -dd &
NONE/WEP/WPA/WPS
wifi bring up 하기 이 문서 를 참고하여 테스트한 결과 정상적으로 접속됨을 확인했다.
WiFi Direct(P2P)
여기서는 P2P 가 지원되는 휴대폰인 갤럭시 노트3 를 사용하여 동작을 테스트했다.
P2P 의 경우, 앞서 언급한 바와 같이 아래와 같이 wpa_supplicant 를 실행해야 한다.
#./wpa_supplicant -Dnl80211 -iwfd0 -c /etc/wpa_supplicant/p2p.conf -puse_p2p_group_interface=1 -dd
여기서 사용하는 p2p.conf 파일의 내용은 다음과 같다.
ctrl_interface=/var/run/wpa_supplicant ap_scan=1 device_name=P2P-JJJ device_type=1-0050F204-1 p2p_go_intent=1 // PC 에는 별도의 dhcp server 가 실행되지 않기 때문에 GO 가 아닌 무조건 GC 로 동작하도록 함
Become P2P_CLIENT after GO negotiation(PBC)
타겟에서 휴대폰으로 PBC 모드 접속 요청을 하는 시나리오다.
>p2p_find // 입력 후 실행 <3>P2P-DEVICE-FOUND 00:22:58:00:C3:30 p2p_dev_addr=00:22:58:00:C3:30 pri_dev_type=1-0050f204-1 name=”stone_test” config_methods=0x188 dev_capab=0x0 group_capab=0x0 // 접속하려는 기기의 MAC 주소 확인(이때 휴대폰에서는 타겟의 SSID 가 검색되어 보인다) >p2p_prov_disc 00:22:58:00:C3:30 pbc // 입력 후 실행 <3>P2P-PROV-DISC-PBC-RESP 00:22:58:00:C3:30 // 접속하려는 기기에 대한 discovery 접속요청 모드(PBC) 설정 >p2p_connect 00:22:58:00:C3:30 pbc // 입력 후 실행
곧이어 휴대폰으로 접속 요청 팝업이 뜨면서, PBC 윈도우 버튼을 누르면, 접속이 완료된다. 완료되면, 새로운 인터페이스(p2p-wfd0-0)가 생성된다.
#dhclient p2p-wfd0-0 // IP 할당 요청 #ping 192.168.49.1 // GO 로의 ping 테스트
접속 상태를 확인하자. 아래는 GC 로 접속되었을 때의 상태 출력이다.
> status bssid=ca:14:79:f0:ce:ab ssid=DIRECT-6e-Woojong Kim (Galaxy No id=0 mode=station pairwise_cipher=CCMP group_cipher=CCMP key_mgmt=WPA2-PSK wpa_state=COMPLETED ip_address=192.168.49.219 p2p_device_address=02:50:43:21:ad:a8 address=02:50:43:21:2d:a8 uuid=2e1f5afa-07a2-5afe-8b98-049d3765861d
아래는 GO 로 접속되었을 때의 출력이다.
> status bssid=02:50:43:21:2d:a8 ssid=DIRECT-sV id=0 mode=P2P GO pairwise_cipher=CCMP group_cipher=CCMP key_mgmt=WPA2-PSK wpa_state=COMPLETED p2p_device_address=02:50:43:21:ad:a8 address=02:50:43:21:2d:a8 uuid=2e1f5afa-07a2-5afe-8b98-049d3765861d
Become P2P_CLIENT after GO negotiation(PIN)
타겟에서 휴대폰으로 PIN 모드 접속 요청을 하는 시나리오다.
>p2p_find // 입력 후 실행 <3>P2P-DEVICE-FOUND 00:22:58:00:C3:30 p2p_dev_addr=00:22:58:00:C3:30 pri_dev_type=1-0050f204-1 name=”stone_test” config_methods=0x188 dev_capab=0x0 group_capab=0x0 // 접속하려는 기기의 MAC 주소 확인 >p2p_prov_disc 00:22:58:00:C3:30 display // 입력 후 실행 <3>P2P-PROV-DISC-ENTER-PIN 00:22:58:00:C3:30 // 접속하려는 기기에 대한 discovery 접속요청 모드(PBC) 설정 >p2p_connect 00:22:58:00:C3:30 85172494 display // 입력 후 실행 <3>P2P-GO-NEG-REQUEST 00:22:58:00:C3:33 dev_passwd_id=5
잠시후 휴대폰에서 PIN code 를 입력하라는 입력 창이 뜬다. 여기서 앞서 입력한 '85172494' 를 입력하면 접속된다.
Become P2P_GO after GO negotiation(PBC)
앞선 예제에서는 강제로 GC 를 할당한 경우(intent=1) 였고, 이번에는 강제로 GO 가 된 상태(intent=15)에서의 접속 방법에 대해 설명하겠다. 앞서 사용한 p2p.conf 파일에서 아래와 같이 수정하는 것이다.
p2p_go_intent=15
그리고 나서 wpa_supplicant 를 재시작한다. 접속 명령어는 아래와 같다.
>p2p_find // 입력 후 실행 <3>P2P-DEVICE-FOUND 00:22:58:00:C3:30 p2p_dev_addr=00:22:58:00:C3:30 pri_dev_type=1-0050f204-1 name=”stone_test” config_methods=0x188 dev_capab=0x0 group_capab=0x0 // 접속하려는 기기의 MAC 주소 확인(이때 휴대폰에서는 타겟의 SSID 가 검색되어 보인다) >p2p_prov_disc 00:22:58:00:C3:30 pbc // 입력 후 실행 <3>P2P-PROV-DISC-PBC-RESP 00:22:58:00:C3:30 // 접속하려는 기기에 대한 discovery 접속요청 모드(PBC) 설정 >p2p_connect 00:22:58:00:C3:30 pbc // 입력 후 실행
보다시피, 앞서와 동일하다. 하지만, 높은 intent 값 때문에 GO 가 되는데, dhcp server 가 실행되어 GC(휴대폰)에게 IP 를 할당해주어야 한다. 여기서는 udhcpd 를 사용하는데, 설정 및 사용방법은 dhcp 서버 구축하기 문서 를 참조한다.
GC(휴대폰) 측에서는 P2P 접속 후, 일정 시간동안 IP 할당을 받지 못하면, 자동으로 접속을 끊는다. 때문에 접속되자마자, P2P 인터페이스 상에 dhcp server 가 실행되도록 해야 휴대폰 UI 상에 접속이 완료된 것으로 표시된다.
이 상태에서 status 명령을 실행하면 아래와 같이 출력된다.
> status bssid=06:50:43:21:ad:a8 ssid=DIRECT-o0 id=0 mode=P2P GO pairwise_cipher=CCMP group_cipher=CCMP key_mgmt=WPA2-PSK wpa_state=COMPLETED ip_address=10.10.10.10 p2p_device_address=02:50:43:21:ad:a8 address=06:50:43:21:ad:a8 uuid=2e1f5afa-07a2-5afe-8b98-049d3765861d
Become P2P_GO after GO negotiation(PIN)
이번에는 Marvell 드라이버에서 PIN 코드를 생성하고, 이를 상대방의 기기에서 입력하여 접속하는 방법을 설명한다.
> p2p_find // 입력 OK <3>CTRL-EVENT-SCAN-STARTED <3>CTRL-EVENT-SCAN-STARTED <3>CTRL-EVENT-SCAN-STARTED <3>CTRL-EVENT-SCAN-STARTED <3>CTRL-EVENT-SCAN-STARTED <3>CTRL-EVENT-SCAN-STARTED <3>CTRL-EVENT-SCAN-STARTED <3>CTRL-EVENT-SCAN-STARTED <3>CTRL-EVENT-SCAN-STARTED <3>CTRL-EVENT-SCAN-STARTED <3>P2P-DEVICE-FOUND ca:14:79:f0:4e:ab p2p_dev_addr=ca:14:79:f0:4e:ab pri_dev_type=10-0050F204-5 name='Woojong Kim (Galaxy No' config_methods=0x188 dev_capab=0x25 group_capab=0x0 vendor_elems=1 <3>CTRL-EVENT-SCAN-STARTED <3>CTRL-EVENT-SCAN-STARTED <3>CTRL-EVENT-SCAN-STARTED <3>CTRL-EVENT-SCAN-STARTED <3>CTRL-EVENT-SCAN-STARTED > p2p_prov_disc ca:14:79:f0:4e:ab keypad // 입력 OK <3>P2P-PROV-DISC-SHOW-PIN ca:14:79:f0:4e:ab 75865481 <3>CTRL-EVENT-SCAN-STARTED <3>CTRL-EVENT-SCAN-STARTED <3>CTRL-EVENT-SCAN-STARTED <3>CTRL-EVENT-SCAN-STARTED > p2p_connect ca:14:79:f0:4e:ab 75865481 keypad // 입력 (이후 휴대폰에 PIN 번호를 입력하라는 창이 뜬다. 하지만, 핸드폰에서는 keypad 가 없으므로 불가하다) OK <3>P2P-FIND-STOPPED <3>P2P-GO-NEG-SUCCESS role=client freq=5745 ht40=0 peer_dev=ca:14:79:f0:4e:ab peer_iface=ca:14:79:f0:ce:ab wps_method=Keypad <3>CTRL-EVENT-SCAN-RESULTS <3>WPS-FAIL msg=8 config_error=18 <3>P2P-GROUP-FORMATION-FAILURE <3>P2P-GROUP-REMOVED p2p-wfd0-0 client reason=FORMATION_FAILED
위의 로그를 보면 알겠지만, 휴대폰에서는 위의 접속이 불가하다. 별도의 키패드가 있어서 앞서 입력한 PIN 번호(75865481)를 입력하고 확인 버튼을 눌러야 한다.
Auto-Go
이번에는 타겟이 자동으로 GO 가 되어 상대방 디바이스의 접속이 되는 방식이다.
>p2p_group_add OK <3>P2P-GROUP-STARTED p2p-wfd0-0 GO ssid="DIRECT-yL" freq=2412 passphrase="NoaY0aRL" go_dev_addr=02:50:43:21:8a:37 >
위의 명령어 이후, 일반 AP scan 시에 'DIRECT-yL' SSID 가 보인다. 접속 암호는 'NoaY0aRL' 이며, 이를 통해 보통의 방법으로 STA 로 접속 가능하다.
STA/P2P Multi-connection
여기서는 8897 의 경우를 들어 설명하겠다. 동시에 STA 와 P2P 접속이 되어 있는 multi-connection 이 가능하다.
STA 는 2.4G, P2P 는 5G 대역으로 접속될 수 있고 이와 반대의 경우도 마찬가지다. 또는 STA 과 P2P 가 같은 주파수 대역으로 접속도 가능하다.
이를 확인하기 위해 몇 가지 스크립트들이 필요하다. 유의할 점은 F/W 및 Driver 를 'swrel' 상의 최신 버전으로 사용하는 것이 좋다는 것이다. 일례로 기존에 사용하던 Driver 를 사용했을 때, 부분적인 multi-connection 만 이뤄졌었다.
multi-connection 테스트 시, 사용할 스크립트는 아래와 같다.
#!/bin/bash check_hw() { echo "This is check_hw()" } regdb() { echo "This is regdb()" } nojam() { echo "This is nojam()" } mac() { echo "This is mac()" } __start() { echo "This is __start()" } start() { # echo "This is start()" # echo insmod /lib/modules/3.16-2-486/kernel/drivers/net/wireless/mwifiex/mlan.ko # insmod /lib/modules/3.16-2-486/kernel/drivers/net/wireless/mwifiex/mlan.ko # echo insmod /lib/modules/3.16-2-486/kernel/drivers/net/wireless/mwifiex/sd8xxx.ko cfg80211_wext=15 fw_name=mrvl/sd8897_uapsta.bin # insmod /lib/modules/3.16-2-486/kernel/drivers/net/wireless/mwifiex/sd8xxx.ko cfg80211_wext=15 fw_name=mrvl/sd8897_uapsta.bin sleep 1 echo Starting wpa_supplicant... /usr/local/sbin/mrvl/wpa_supplicant -Dnl80211 -imlan0 -c /etc/wpa_supplicant/wpa-test.conf -puse_multi_chan_concurrent=1 -d & } stop() { echo "This is stop()" killall wpa_supplicant ifconfig mlan0 down rmmod sd8xxx rmmod mlan } force_stop() { echo "This force_stop()" } softap() { echo "This is softap()" } p2p() { echo "This is p2p()" # echo insmod /lib/modules/3.16-2-486/kernel/drivers/net/wireless/mwifiex/mlan.ko # insmod /lib/modules/3.16-2-486/kernel/drivers/net/wireless/mwifiex/mlan.ko # echo insmod /lib/modules/3.16-2-486/kernel/drivers/net/wireless/mwifiex/sd8xxx.ko cfg80211_wext=15 fw_name=mrvl/sd8897_uapsta.bin # insmod /lib/modules/3.16-2-486/kernel/drivers/net/wireless/mwifiex/sd8xxx.ko cfg80211_wext=15 max_vir_bss=1 p2p_enh=1 fw_name=mrvl/sd8897_uapsta.bin # echo Starting wpa_supplicant... #/usr/local/sbin/mrvl/wpa_supplicant -Dnl80211 -imlan0 -c /etc/wpa_supplicant/wpa.conf -B #/usr/local/sbin/mrvl/wpa_supplicant -Dnl80211 -iwfd0 -c /etc/wpa_supplicant/p2p.conf -puse_p2p_group_interface=1 use_multi_chan_concurrent=1 -B #/usr/local/sbin/mrvl/wpa_supplicant -Dnl80211 -imlan0 -c /etc/wpa_supplicant/wpa.conf -puse_multi_chan_concurrent=1 -N -iwfd0 -Dnl80211 -c /etc/wpa_supplicant/p2p.conf -puse_p2p_group_interface=1 -puse_multi_chan_concurrent=1 -B #/usr/local/sbin/mrvl/wpa_supplicant -Dnl80211 -iwfd0 -c /etc/wpa_supplicant/wpa.conf -B /usr/local/sbin/mrvl/wpa_supplicant -Dnl80211 -iwfd0 -c /etc/wpa_supplicant/p2p.conf -puse_p2p_group_interface=1 -puse_multi_chan_concurrent=1 -B #/usr/local/sbin/mrvl/wpa_supplicant -Dnl80211 -iwfd0 -c /etc/wpa_supplicant/p2p.conf -puse_p2p_group_interface=1 -B #/usr/local/sbin/mrvl/wpa_supplicant -Dnl80211 -imlan0 -c /etc/wpa_supplicant/wpa.conf -d -N -iwfd0 -Dnl80211 -c /etc/wpa_supplicant/p2p.conf -puse_p2p_group_interface=1 use_multi_chan_concurrent=1 -d & #/usr/local/sbin/mrvl/wpa_supplicant -Dnl80211 -iwfd0 -c /etc/wpa_supplicant/p2p.conf -puse_p2p_group_interface=1 use_multi_chan_concurrent=1 -B -N -imlan0 -c /etc/wpa_supplicant/wpa.conf -B } init() { echo "This is p2p()" echo insmod /lib/modules/3.16-2-486/kernel/drivers/net/wireless/mwifiex/mlan.ko insmod /lib/modules/3.16-2-486/kernel/drivers/net/wireless/mwifiex/mlan.ko echo insmod /lib/modules/3.16-2-486/kernel/drivers/net/wireless/mwifiex/sd8xxx.ko cfg80211_wext=15 fw_name=mrvl/sd8897_uapsta.bin insmod /lib/modules/3.16-2-486/kernel/drivers/net/wireless/mwifiex/sd8xxx.ko cfg80211_wext=15 max_vir_bss=1 p2p_enh=1 fw_name=mrvl/sd8897_uapsta.bin #insmod /lib/modules/3.16-2-486/kernel/drivers/net/wireless/mwifiex/sd8xxx.ko cfg80211_wext=15 max_vir_bss=2 p2p_enh=1 fw_name=mrvl/sd8897_uapsta.bin } rftest() { echo "This is rftest()" } case $1 in "nojam") nojam ;; "mac") mac ;; "start") start ;; "force_stop") force_stop ;; "stop") stop ;; "check_hw") check_hw ;; "softap") softap ;; "p2p") p2p ;; "init") init ;; "rftest") rftest ;; *) echo wlan.sh [start] [stop] [force_stop] [init] [softap] [p2p] [check_hw] [rftest] exit 1 ;; esac
다음은 2.4G 접속 스크립트(wifi_test-2g)다.
/root/wpa_supplicant-2.3/wpa_supplicant/wpa_cli -i mlan0 -p /var/run/wpa_supplicant remove_network 0 /root/wpa_supplicant-2.3/wpa_supplicant/wpa_cli -i mlan0 -p /var/run/wpa_supplicant ap_scan 1 /root/wpa_supplicant-2.3/wpa_supplicant/wpa_cli -i mlan0 -p /var/run/wpa_supplicant add_network /root/wpa_supplicant-2.3/wpa_supplicant/wpa_cli -i mlan0 -p /var/run/wpa_supplicant set_network 0 ssid '"iptime-2.4G-N8004R"' /root/wpa_supplicant-2.3/wpa_supplicant/wpa_cli -i mlan0 -p /var/run/wpa_supplicant set_network 0 psk '"88888888"' /root/wpa_supplicant-2.3/wpa_supplicant/wpa_cli -i mlan0 -p /var/run/wpa_supplicant select_network 0
다음은 5G 접속 스크립트(wifi_test-5g)다.
/root/wpa_supplicant-2.3/wpa_supplicant/wpa_cli -i mlan0 -p /var/run/wpa_supplicant remove_network 0 /root/wpa_supplicant-2.3/wpa_supplicant/wpa_cli -i mlan0 -p /var/run/wpa_supplicant ap_scan 1 /root/wpa_supplicant-2.3/wpa_supplicant/wpa_cli -i mlan0 -p /var/run/wpa_supplicant add_network /root/wpa_supplicant-2.3/wpa_supplicant/wpa_cli -i mlan0 -p /var/run/wpa_supplicant set_network 0 ssid '"iptime-5G-N8004R"' /root/wpa_supplicant-2.3/wpa_supplicant/wpa_cli -i mlan0 -p /var/run/wpa_supplicant set_network 0 psk '"88888888"' /root/wpa_supplicant-2.3/wpa_supplicant/wpa_cli -i mlan0 -p /var/run/wpa_supplicant select_network 0
위의 스크립트를 사용해서 아래와 같이 실행한다.
#wlan.sh init // Driver & F/W load #wlan.sh start // run wpa_supplicant for sta #wlan.sh p2p // run wpa_supplicant for p2p
multi-connection 을 위한 모든 준비가 끝났다. 이제 각각 접속하면 된다.
#wifi_test-2g
p2p 를 접속해보자.
#wpa_cli >p2p_find >P2P-DEVICE-FOUND ca:14:79:f0:4e:ab p2p_dev_addr=ca:14:79:f0:4e:ab pri_dev_type=10-0050F204-5 name='Woojong Kim (Galaxy No' config_methods=0x188 dev_capab=0x25 group_capab=0x0 vendor_elems= >p2p_prov_disc ca:14:79:f0:4e:ab pbc >p2p_connect ca:14:79:f0:4e:ab pbc
참고로 갤럭시노트 3 로 P2P GO 접속 시, 무조건 2.4G 대로 접속된다. 8897 이 GO 가 되면, 5G 대로 접속된다.
SoftAP(uAP)
SoftAP 를 테스트하기 위해서는 hostapd 가 필요하다. 실행 방법은 아래와 같은 데, 설정파일(hostapd.conf)을 아래처럼 수정한다.
... interface=uap0 driver=nl80211 logger_syslog=-1 logger_syslog_level=2 logger_stdout=-1 logger_stdout_level=2 ctrl_interface=/var/run/hostapd ssid=test-jjj hw_mode=g channel=11 beacon_int=100 device_name=WirelessAP ...
나머지 항목들은 기본값으로 설정한다. 아래와 같이 hostapd 를 실행하고, dhcp server 를 실행해야 한다. 역시 dhcp 서버 구축하기 문서 를 참고한다.
#./hostapd ./hostapd.conf
Test procedure for None mode in hostapd
앞선 설정 대로 hostapd 를 실행하면, 'test-jjj' 라는 이름의 ssid 가 보이고, 암호없이 접속이 된다.
Test procedure for WEP mode in hostapd
Test procedure for WPA/WPA2 mode in hostapd
Test procedure for WPS2.0 in hostapd
FAQ
디버깅 시
Firmware memory dump 생성하기
이슈 검토를 위해 f/w memory dump 를 생성해야 하는 경우가 있을 때는 아래와 같이 실행한다.
#echo "debug_dump" > /proc/mwlan/config
dump 파일은 /var 밑에 file_이라는 이름으로 생성되고 이 파일을 사용하면 된다.
debug level 지정
아래와 같이 debug 출력 레벨을 지정할 수 있다.
#insmod drvdbg=0x800a7 ...
Bluetooth 의 경우
#insmod mbt_drvdbg=0x800a7 ...