특정 칩셋에 상관없이 공통적으로 적용되는 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)로 나뉜다. 따라서 드라이버를 빌드하면 이 두개의 파일을 얻게되는 것이다.

빌드 방법은 따로 설명하지 않는다. 하지만, 유의해야 할 점에 대해서 짚어 보겠다.

  1. Makefile 수정(툴체인, 참조할 커널의 위치)
  2. Makefile 옵션 확인(Debug level 등)

빌드 후에는 insmod 명령을 사용하여 커널에 적재한다. 이때 유의해야할 점에 대해 살펴보겠다.

  1. firmware 파일의 위치(기본적으로는 /lib/firmware/mrvl 이지만, 다른 경로일 경우에는 별도의 인자를 넣어주어야 한다)
  2. mlan.ko, sd8xxx.ko 의 차례로 올린다.
  3. 로딩 후에는 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 시, 아래 나온 여러가지 인자들을 사용하여 동작 방식이나 설정을 변경할 수 있다.

    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 을 설정한다

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

일정 시간동안 WIFI 동작이 없을 시, 자동으로 sleep 모드로 들어가는 것을 방지하기 위해서는 'auto_ds=2' 인자로 주면 된다.

휴대폰과 같은 모바일이 아닌 경우, Power save 모드를 비활성화 하기 위해서는 'ps_mode=2' 로 주면 된다.

'ps_mode=2 auto_ds=2 hw_test=1' 을 주면 된다.

insmod 를 하면서 여러가지 파일들을 로딩하고 이를 적용하여 WIFI 드라이버를 초기화 한다.

cal_data_cfg=mrvl/WlanCalData_ext.conf cal 파일 지정
fw_name=mrvl/sd8887_uapsta.bin firmware 파일 지정
txpwrlimit_cfg=mrvl/txpowerlimit.conf tx power 세기를 조정하는 파일 지정
    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 관련 내용은 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
...

나머지 옵션은 기본값으로 한다.

앞서와 마찬가지로 빌드에 필요한 .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
...

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 &

wifi bring up 하기 이 문서 를 참고하여 테스트한 결과 정상적으로 접속됨을 확인했다.

여기서는 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 로 동작하도록 함

타겟에서 휴대폰으로 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

타겟에서 휴대폰으로 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' 를 입력하면 접속된다.

앞선 예제에서는 강제로 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

이번에는 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)를 입력하고 확인 버튼을 눌러야 한다.

이번에는 타겟이 자동으로 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 로 접속 가능하다.

여기서는 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 를 테스트하기 위해서는 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

앞선 설정 대로 hostapd 를 실행하면, 'test-jjj' 라는 이름의 ssid 가 보이고, 암호없이 접속이 된다.

FAQ

이슈 검토를 위해 f/w memory dump 를 생성해야 하는 경우가 있을 때는 아래와 같이 실행한다.

#echo "debug_dump" > /proc/mwlan/config 

dump 파일은 /var 밑에 file_이라는 이름으로 생성되고 이 파일을 사용하면 된다.

아래와 같이 debug 출력 레벨을 지정할 수 있다.

#insmod drvdbg=0x800a7 ...
#insmod mbt_drvdbg=0x800a7 ...
  • computer/marvell/marvell_드라이버_핵심가이드.txt
  • Last modified: 3 years ago
  • by likewind