8897 드라이버에 대한 모든 것을 설명한다.
최신버전의 드라이버는 extranet 에서 다운로드 가능하다. 현재 최신버전은 'SD-UAPSTA-8897-FC13-MMC-15.69.2.p17-15.28.2.p17-M3X15433.P8_B0-GPL.zip' 이다.

참고로 이 드라이버는 PC 용이며, lucas 용으로는 빌드가 불가하다. 그렇다면, 이 드라이버의 용도는 무엇일까?

8897 드라이버는 크게 두가지 종류로 나뉜다.

  1. Marvell 본사에서 릴리즈 되는 드라이버(extranet 에서 받을 수 있다)
  2. Chrome OS kernel 에 포함된 드라이버

물론 위 두가지 드라이버의 코드는 다르며, 심지어 버전도 다르다. 이것의 다른 점을 구체적으로 설명하면, 아래 표와 같다.

종류 특징 목적
1 빌드하면, sd8xxx.ko, mlan.ko 파일이 생성된다. 함께 빌드되는 유틸리티(mlanutl 등)를 통해 거의 모든 설정을 설정할 수 있다. 별도로 컴파일 가능 Reference board 를 이용한 테스트 목적
2 빌드하면, mwifiex.ko, mwifiex_sdio.ko 파일이 생성된다. mlanutl 같은 유틸리티는 사용할 수 없고, 오직 iw 명령어를 이용한 설정만 제한적으로 가능하다. 별도로 컴파일 불가능 사용자 모드(Normal mode)에서 사용

2번은 리눅스 커널 상에 포함된 open 된 드라이버인 반면에 1번은 private 한 드라이버라서 설정 및 자유도가 1번이 훨씬 높다.

빌드하기(PC)

앞서 받은 드라이버 파일을 압축을 풀고, 아래와 같이 빌드한다. 참고로 빌드환경은 ubuntu 13.10 에 3.11.0-18 이다.

#tar xzf SD-UAPSTA-8897-FC13-MMC-15.69.2.p17-M3X15433.P8_B0-GPL-src.tgz
#tar xzf SD-UAPSTA-8897-FC13-MMC-15.69.2.p17-M3X15433.P8_B0-app-src.tgz
#tar xzf SD-UAPSTA-8897-FC13-MMC-15.69.2.p17-M3X15433.P8_B0-mlan-src.tgz
#cd wlan_src
#make build

에러없이 빌드되었다면, 'mlan.ko, sd8xxx.ko' 파일이 생성된다. 두개의 파일을 모두 insmod 해야 한다. 또한 Firmware 가 정해진 디렉토리에 위치해야 한다. 이를 위해 아래와 같이 작업한다.

#cp sd8897_uapsta.bin /lib/firmware/mrvl/
#insmod mlan.ko
#insmod sd8xxx.ko

현재 로딩된 드라이버에 대한 정보를 아래와 같이 확인 가능하다. 예를 들면, F/W 버전 정보를 알 수 있다.

#cat /proc/mwlan/mlan0/info
driver_name = "wlan"
driver_version = SD8887-15.68.4.p78-C3X15C038-GPL-(FP68)
...

위의 정보로 보아 현재 올라간 드라이버 및 F/W 버전은 p78 임을 알 수 있다.

더 간단한 방법으로는 vim 으로 해당 F/W 파일(sd8887_uapsta.bin)을 열어, '8887' 로 검색한다. 검색된 줄에 p78 이 보일 것이다.

mlanutl 을 이용하여 아래와 같이 실행하면 간단하게 버전 정보를 알 수 있다.

#mlanutl mlan0 version
Version string received: SD8887-15.68.4.p85-C3X15C038-GPL-(FP68)

유틸리티 설명(PC)

앞선 빌드과정을 거치고 나면, 상위 디렉토리(bin_sd8897)에 드라이버를 제어할 수 있는 프로그램들이 생성된다.

이름 설명
mlanconfig configure the additional parameters available for the Marvell mdriver
mlanutl configure the additional parameters available for the Marvell mdriver
mlan2040coex This application handles the 11n 20/40 coexistence operation for the Marvell mdriver
uaputl.exe This tool can be used to set/get uAP`s settings
mlanevent.exe This tool can be used to listen for and obtain events from the driver through the netlink layer
wifidirectutl This tool can be used to configure WifiDirect parameters

빌드하기(ARM)

최신버전으로 lucas 개발환경에서 여러번 빌드 시도를 했지만, 에러가 발생했다. 또한 확인한 결과 lucas 빌드 시, 사용되는 드라이버 코드가 이와 다르다는 것도 알아냈다.

결과적으로 extranet 에 릴리즈되는 드라이버 코드와 lucas 커널 안에 들어가 있는 드라이버 코드는 다른 것이다.

따라서 lucas 보드에서 실행되는 ARM 용 ko 파일은 별도로 빌드가 불가능하고, 커널 코드 안의 드라이버 코드(/home/lucas/trunk/src/third_party/kernel-next/drivers/net/wireless/mwifiex)를 사용하여 빌드해야 한다.
드라이버 빌드를 포함한 커널 빌드 방법은 lucas 개발환경 구축하기 를 참고한다.

에러없이 빌드되었으면, 'mwifiex.ko, mwifiex_sdio.ko' 파일이 생성된다.
생성되는 경로는 아래와 같다.

./chroot/build/peach_pit/var/cache/portage/sys-kernel/chromeos-kernel-next/drivers/net/wireless/mwifiex/mwifiex.ko
./chroot/build/peach_pit/lib/modules/3.8.11/kernel/drivers/net/wireless/mwifiex/mwifiex.ko
./chroot/build/peach_pit/var/cache/portage/sys-kernel/chromeos-kernel-next/drivers/net/wireless/mwifiex/mwifiex_sdio.ko
./chroot/build/peach_pit/lib/modules/3.8.11/kernel/drivers/net/wireless/mwifiex/mwifiex_sdio.ko

프로그램 빌드(ARM)

lucas 툴체인을 사용하기 위해 Makefile 파일을 수정해야 한다.

...
CROSS_COMPILE=/usr/bin/armv7a-cros-linux-gnueabi-                                  # 추가
COMPATDIR=/lib/modules/$(KERNELVERSION_X86)/build/compat-wireless-3.2-rc1-1/include
...
 
default:
#       $(MAKE) -C $(KERNELDIR) M=$(PWD) modules                      # 주석처리
endif
 
build:          echo default
 
        @if [ ! -d $(BINDIR) ]; then \
                mkdir $(BINDIR); \
        fi
 
#       cp -f mlan.$(MODEXT) $(BINDIR)/mlan$(DBG).$(MODEXT)        # 주석처리
#       cp -f sd8xxx.$(MODEXT) $(BINDIR)/sd8897$(DBG).$(MODEXT)     # 주석처리
#       cp -rpf script/sdio_mmc/* $(BINDIR)/                                       # 주석처리
 
ifeq ($(CONFIG_STA_SUPPORT),y)
...

수정 후 아래와 같이 빌드하면, 실행 파일들이 생성된 것을 볼 수 있다.

#make build

앞서 설명한 프로그램들은 모두 wext 를 이용한 ioctl 명령어을 내린다. 하지만, 이 방식이 lucas 보드 상에서는 제대로 동작하지 않는다. 따라서 iw 를 사용한다. iw 는 cfg80211 을 사용한다.

설치 및 사용하기

드라이버를 빌드하여 ko 파일이 생성되었다면, 타겟보드에 설치할 차례다. ko 파일 뿐만 아니라 firmware 파일(sd8897_uapsta.bin)을 정해진 경로에 복사한다.

#cp mwifiex.ko mwifiex_sdio.ko /lib/modules/3.8.11/kernel/drivers/net/wireless/mwifiex
#cp sd8897_uapsta.bin /lib/firmware/mrvl/

이제 모듈을 올릴 차례다.

#insmod mwifiex.ko
#insmod mwifiex_sdio.ko      // 여러가지 인자를 줄 수 있다. 자세한 내용은 README 파일을 참조한다

위와 같이 아무런 인자값을 지정하지 않을 경우, 기본값으로 설정된다. 몇가지 중요한 인자에 대해 살펴보자.

#insmod mwifiex_sdio.ko drv_mode=4 cfg80211_wext=4            // WiFi Direct 모드이며, STA CFG80211 을 사용하도록 설정

iw 사용하기

앞서 언급한 대로 Chrome OS kernel 에 포함된 드라이버 상에서는 mlanutl 같은 프로그램을 사용할 수 없기 때문에, 사용가능한 다른 프로그램을 사용해야 한다. 바로 'iw' 라는 프로그램이다.
chrome os 를 빌드하면, 기본적으로 빌드 후 파일시스템에 설치가 되기 때문에 별도의 빌드는 필요하지 않지만, 나중에 특정버전이나 다른 플랫폼에 포팅할 일에 대비하여 빌드 방법을 소개한다.

iw 를 빌드하기 위해서는 크게 두가지의 소스코드가 필요하다. 아래의 주소에서 각각 다운로드 받는다.

  1. iw(https://www.kernel.org/pub/software/network/iw/) : iw-3.14.tar.gz 파일을 받음
  2. libnl(http://www.carisma.slowglass.com/~tgr/libnl/) : libnl-1.1.4.tar.gz 파일을 받음

libnl 은 netlink socket 을 사용하는 iw 컴파일을 위해 필요한 라이브러리를 생성하기 위해 필요하다. libnl 의 경우, 해당 페이지에 여러가지 버전을 제공하는데, libnl-3.x 를 사용하지 말고 반드시 libnl-1.x 를 받기 바란다.
사실 처음에 3.x 를 받아 시도를 했었는데, 결국 iw 컴파일에 실패했다. 때로는 최신버전이 좋지 않을 때가 있다. 따라서 1.x 을 사용한다.

여기서는 lucas2 board 상에서 실행가능한 iw 바이너리 파일을 생성하는 것이 목적이기 때문에 당연히(!) lucas2 의 빌드 환경으로 진입하여 빌드를 수행한다. 빌드환경 및 진입 방법에 대한 사항은 lucas 개발환경 구축하기 을 참고한다.

먼저 libnl 를 빌드하자.

#tar xzf libnl-1.1.4.tar.gz
#cd libnl-1.1.4
#./configure --prefix=/tmp/bbb --host=/usr/bin/armv7a-cros-linux-gnueabi          
#make CC=/usr/bin/armv7a-cros-linux-gnueabi-gcc
#make install

에러없이 빌드되었다면, /tmp/bbb 디렉토리 아래와 같은 파일이 보일 것이다.

(cr) lucas@lucas /tmp/bbb/lib $ ls -al
합계 3336
drwxr-xr-x 3 lucas eng    4096  4월 23 17:31 .
drwxr-xr-x 4 lucas eng    4096  4월 23 17:31 ..
-rw-r--r-- 1 lucas eng 2152304  4월 23 17:31 libnl.a
lrwxrwxrwx 1 lucas eng      10  4월 23 17:31 libnl.so -> libnl.so.1
lrwxrwxrwx 1 lucas eng      14  4월 23 17:31 libnl.so.1 -> libnl.so.1.1.4
-rwxr-xr-x 1 lucas eng 1247491  4월 23 17:31 libnl.so.1.1.4
drwxr-xr-x 2 lucas eng    4096  4월 23 17:31 pkgconfig

이제 iw 를 빌드하자!

#tar xzf iw-3.14.tar.gz
#cd iw-3.14

크로스 컴파일 위해 Makefile 을 아래와 같이 수정한다.

...
#CC ?= "gcc"                     // 주석처리
CC = /usr/bin/armv7a-cros-linux-gnueabi-gcc          // 추가
...
ifeq ($(NLLIBNAME),)
#$(error Cannot find development files for any supported version of libnl)                  // 주석 처리
endif
 
LIBS += -L/tmp/bbb/lib $(shell $(PKG_CONFIG) --libs $(NLLIBNAME))                     // 라이브러리 경로 추가
CFLAGS += $(shell $(PKG_CONFIG) --cflags $(NLLIBNAME)) -I/tmp/bbb/include      // 헤더파일 경로 추가
 
endif # NO_PKG_CONFIG
 
ifeq ($(V),1)
...
iw:     $(OBJS)
        @$(NQ) ' CC  ' iw
        $(Q)$(CC) $(LDFLAGS) $(OBJS) $(LIBS) -lnl -o iw                              // -lnl 추가
...

수정 후 빌드한다.

#make

에러없이 빌드되면 iw 파일이 보일 것이다. 이를 lucas2 보드에 올려 실행 시켜보자!

  • computer/marvell/driver_8897_핵심가이드.txt
  • Last modified: 3 years ago
  • by likewind