8897 드라이버에 대한 모든 것을 설명한다.
최신버전의 드라이버는 extranet 에서 다운로드 가능하다. 현재 최신버전은 'SD-UAPSTA-8897-FC13-MMC-15.69.2.p17-15.28.2.p17-M3X15433.P8_B0-GPL.zip' 이다.
참고로 이 드라이버는 PC 용이며, lucas 용으로는 빌드가 불가하다. 그렇다면, 이 드라이버의 용도는 무엇일까?
알아두어야 할 점
8897 드라이버는 크게 두가지 종류로 나뉜다.
- Marvell 본사에서 릴리즈 되는 드라이버(extranet 에서 받을 수 있다)
- 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
드라이버 정보 확인하는 3가지 방법
proc 를 사용한 방법
현재 로딩된 드라이버에 대한 정보를 아래와 같이 확인 가능하다. 예를 들면, F/W 버전 정보를 알 수 있다.
#cat /proc/mwlan/mlan0/info driver_name = "wlan" driver_version = SD8887-15.68.4.p78-C3X15C038-GPL-(FP68) ...
위의 정보로 보아 현재 올라간 드라이버 및 F/W 버전은 p78 임을 알 수 있다.
vim 을 이용한 방법
더 간단한 방법으로는 vim 으로 해당 F/W 파일(sd8887_uapsta.bin)을 열어, '8887' 로 검색한다. 검색된 줄에 p78 이 보일 것이다.
mlanutl 을 이용한 방법
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 를 빌드하기 위해서는 크게 두가지의 소스코드가 필요하다. 아래의 주소에서 각각 다운로드 받는다.
- iw(https://www.kernel.org/pub/software/network/iw/) : iw-3.14.tar.gz 파일을 받음
- 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 보드에 올려 실행 시켜보자!