aesop howto ralink rt2571wf
TRANSCRIPT
1 [임베디드 리눅스(2.6)에 WIFI를 써보자]
AESOP Embedded Forum
[ 임베디드 리눅스(2.6)에 WIFI를 써보자 ]
소속 - AESOP
작성자 - 장병남 (http://blog.naver.com/pimco01)
개 요
임베디드 리눅스로 WIFI를 돌려보고 싶으신 분들께서 참고 할만한 문서를 만들어 보았습니다.
[ 임베디드 리눅스(2.6)에 WIFI를 써보자]
1. USB WIFI 무선랜카드를 준비하자. 가장 많이 쓰이는 Ralink사의 칩을 쓰는 제품 선정
사용장비
- ipTIME G054U-A (Ralink RT2571WF 칩셋, 외장안테나 有)
- 세부스펙
항 목 제 품 사 양
무선 IEEE 802.11b, IEEE 802.11g
전원 USB Bus-Power
크기 82 × 30 × 10mm
사용가능 운영체제 Windows 98, ME, 2000, XP, VISTA, MAC OS, Linux
인터페이스 USB1.1 / USB 2.0 (USB 2.0 권장)
Application Note
http://www.aesop-embedded.org
2 [임베디드 리눅스(2.6)에 WIFI를 써보자]
주파수 2.4 GHz
수신감도 -65dBm in 54M 64QAM
-87dBm in 1M BPSK
송신파워 16dBm ± 2dB
변조방식 OFDM, CCK, BPSK, QPSK
보안 64/128bit WEP, WPA-PSK, WPA2PSK, WPAPSK/WPA2PSK
802.11g 속도 54,48,36,18,9,6Mbps
802.11b 속도 11, 5.5, 2, 1Mbps
LED Link/Act
안테나 외장형 SMA 안테나 2.5dB
구성물 USB 무선랜카드, USB 연장 크래들(1.5m), 외장형 안테나,
드라이버 CD, 매뉴얼
허용동작 온도 0℃ ~ 50℃
허용동작 습도 10% ~ 75%
위 장비를 선정한 이유는 기존에 임베디드리눅스에서 잘 돌아간다고 소문난 ASUS USB
무선랜의 수신율이 너무나 떨어져 제품이 단종되었고 이에 용산을 이잡듯 뒤졌지만 구하
지 못한 관계로 제조사에서 리눅스 드라이버를 공식으로 지원하고 구하기 쉽고 잘팔린다
는 제품으로 위 제품을 선택 하였음.
2. 커널에 무선랜 기능을 추가하고 빌드하자
여기서는 linux 커널 2.6.20 버전을 사용하였습니다.
1) make menuconfig
2) Device Drivers Network device support [*] Network device support
Wireless LAN (non-hamradio) [*] Wireless LAN drivers (non-hamradio) & Wireless
Extensions, [*] Wireless Extension API over RtNetlink (파란색으로 표시한 부분에 각각
체크표시[*] 해줄것 )
3) make clean && make
3. WIFI 드라이버, 무선 유틸리티 다운로드 및 컴파일
1) http://www.ralinktech.com/ralink/Home/Support/Linux.html 사이트에 가서
RT2501USB(RT73:RT2571W/RT2573/RT2671)를 클릭하여 다운로드 받는다.
2) 리눅스로 가져와서 원하는 디렉토리에 압축을 풀고 Module/Makefile을 수정한다.
####################################################################
# Module Name: Makefile
# Abstract: Makefile for rt73 linux driver on kernel series 2.6
####################################################################
http://www.aesop-embedded.org
3 [임베디드 리눅스(2.6)에 WIFI를 써보자]
##
PLATFORM=PC
#PLATFORM=CMPC
#Enable for wpa_supplicant's spcific driver "driver_ralink.c", default enabled.
HAS_RALINK_WPA_SUPPLICANT_SUPPORT=y(WPAPSK 암호화를 사용하기 위해 체크했음)
#Enable for wpa_supplicant's generic driver "driver_wext.c", used for NetworkManager
HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=n
#Support Block Net-If during TxSw queue full.
HAS_BLOCK_NET_IF=n
WFLAGS := -Wall -Wstrict-prototypes -Wno-trigraphs
ifeq ($(HAS_RALINK_WPA_SUPPLICANT_SUPPORT),y)
WFLAGS += -DRALINK_WPA_SUPPLICANT_SUPPORT
endif
ifeq ($(HAS_NATIVE_WPA_SUPPLICANT_SUPPORT),y)
WFLAGS += -DNATIVE_WPA_SUPPLICANT_SUPPORT
endif
ifeq ($(HAS_BLOCK_NET_IF),y)
WFLAGS += -DBLOCK_NET_IF
endif
## Comment/uncomment the following line to enable/disable debugging
#EXTRA_CFLAGS += -DDBG
EXTRA_CFLAGS += $(WFLAGS)
ifeq ($(PLATFORM),PC)
LINUX_SRC =/home/jang/linux-2.6.20-pollux-080715-WIZ-jffs2 (커널소스경로)
endif
ifeq ($(PLATFORM),CMPC)
LINUX_SRC = /home/fonchi/vendor/kernel-default-2.6.21/linux-2.6.21
http://www.aesop-embedded.org
4 [임베디드 리눅스(2.6)에 WIFI를 써보자]
endif
EXTRA_CFLAGS += -I$(LINUX_SRC)/include
obj-m := rt73.o
rt73-objs := \
rtmp_main.o \
mlme.o \
connect.o \
rtusb_bulk.o \
rtusb_io.o \
sync.o \
assoc.o \
auth.o \
auth_rsp.o \
rtusb_data.o \
rtmp_init.o \
sanity.o \
rtmp_wep.o \
rtmp_info.o \
rtmp_tkip.o \
wpa.o md5.o
ifeq ($(HAS_NATIVE_WPA_SUPPLICANT_SUPPORT),y)
rt73-objs += rtmp_wext.o
endif
ifeq ($(HAS_BLOCK_NET_IF),y)
rt73-objs += netif_block.o
endif
## Configuration files on SuSE
#NDDIR=/etc/sysconfig/network
#MOD_CONF=/etc/modprobe.d/module-renames
## NDDIR/ifcfg-rausb0
http://www.aesop-embedded.org
5 [임베디드 리눅스(2.6)에 WIFI를 써보자]
ND_CONF=/etc/sysconfig/network-scripts/ifcfg-rausb0
ifdef NDDIR
NDDIR := $(NDDIR)
else
NDDIR := /etc/sysconfig/network-scripts
endif
ifdef MOD_CONF
MOD_CONF := $(MOD_CONF)
else
MOD_CONF := /etc/modprobe.conf
endif
all:
make -C $(LINUX_SRC) SUBDIRS=$(shell pwd) modules
arm-linux-strip -S rt73.ko(만들어진 드라이버 모듈의 심벌테이블 없애서 사이즈를 줄임)
clean:
rm -rf *.o *~ .*.cmd *.ko *.mod.c .tmp_versions built-in.o
install:
make -C /lib/modules/$(shell uname -r)/build \
INSTALL_MOD_DIR=extra SUBDIRS=$(shell pwd) \
modules_install
@echo "Network device directory $(NDDIR)";
@echo "Module configuration file $(MOD_CONF)";
@if [ -d "$(NDDIR)" ] ; then \
if [ ! -f "$(ND_CONF)" ]; then \
echo "Create 'ifcfg-rausb0' in $(NDDIR)/"; \
cp ifcfg-rausb0 $(NDDIR)/ ; \
fi; \
fi
@if ! grep -q 'rausb0' $(MOD_CONF) ; then \
http://www.aesop-embedded.org
6 [임베디드 리눅스(2.6)에 WIFI를 써보자]
echo "append 'alias rausb0 rt73' to $(MOD_CONF)"; \
echo "alias rausb0 rt73" >> $(MOD_CONF) ; \
fi
/sbin/depmod -a
# auto copy *.bin to /etc/Wireless/RT73STA
# mkdir /etc/Wireless ;
# mkdir /etc/Wireless/RT73STA ;
# cp $(shell pwd)/*.bin /etc/Wireless/RT73STA ;
# cp $(shell pwd)/*.dat /etc/Wireless/RT73STA ;
# Copy file on Mandriva 2007.1
# cp $(shell pwd)/*.bin /lib/firmware/ ;
config:
@touch config.mk
@./Configure
3) Module/rt_config.h 파일을 에디터로 열고
#define PROFILE_PATH, #define RT2573_IMAGE_FILE_NAME 의 값을 해당파일이 실제 넣을
절대경로로 변경한다.
4) make clean && make 로 드라이버를 빌드한다
5) rt73sta.dat은 Module/README 파일을 보고 무선공유기 설정에 맞게 변경한다
6) 빌드한 후에 Module 디렉토리에 있는 rt73.bin, rt73.ko, rt73sta.dat 파일을 잘 챙긴다
7) http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/wireless_tools.29.tar.gz 사이트에
가서 무선유틸리티를 다운로드 받는다.
8) 리눅스로 가져와서 원하는 디렉토리에 압축을 푼다
9) 아래와 같이 Makefile을 수정한다
##
## Please check the configurion parameters below
##
## Installation directory. By default, go in /usr/local.
## Distributions should probably use /, but they probably know better...
ifndef PREFIX
PREFIX = /usr/local
http://www.aesop-embedded.org
7 [임베디드 리눅스(2.6)에 WIFI를 써보자]
endif
## Compiler to use (modify this for cross compile).
CC = arm-linux-gcc
## Other tools you need to modify for cross compile (static lib only).
AR = arm-linux-ar
RANLIB = arm-linux-ranlib
## Uncomment this to build tools using static version of the library.
## Mostly useful for embedded platforms without ldd, or to create
## a local version (non-root).
# BUILD_STATIC = y
## Uncomment this to build without using libm (less efficient).
## This is mostly useful for embedded platforms without maths.
# BUILD_NOLIBM = y
## Uncomment this to strip binary from symbols. This reduce binary size.
## by a few percent but make debug worse...
# BUILD_STRIPPING = y
## Uncomment this to build with only essential functionality.
## This leaves out the less used features and cut in half the tools.
## This is mostly useful for embedded platforms without limited feature needs.
# BUILD_WE_ESSENTIAL = y
# ***************************************************************************
# ***** Most users should not need to change anything beyond this point *****
# ***************************************************************************
# Version of the Wireless Tools
WT_VERSION := $(shell sed -ne "/WT_VERSION/{s:\([^0-9]*\)::;p;q;}" < iwlib.h )
# Version of Wireless Extensions.
WE_VERSION := $(shell sed -ne "/WE_VERSION/{s:\([^0-9]*\)::;p;q;}" < iwlib.h )
# Always use local header for wireless extensions
http://www.aesop-embedded.org
8 [임베디드 리눅스(2.6)에 WIFI를 써보자]
WEXT_HEADER = wireless.$(WE_VERSION).h
# Targets to build
STATIC=libiw.a
DYNAMIC=libiw.so.$(WT_VERSION)
PROGS= iwconfig iwlist iwpriv iwspy iwgetid iwevent ifrename
MANPAGES8=iwconfig.8 iwlist.8 iwpriv.8 iwspy.8 iwgetid.8 iwevent.8 ifrename.8
MANPAGES7=wireless.7
MANPAGES5=iftab.5
EXTRAPROGS= macaddr iwmulticall
# Composition of the library :
OBJS = iwlib.o
# Select which library to build and to link tool with
ifdef BUILD_STATIC
IWLIB=$(STATIC)
IWLIB_INSTALL=install-static
else
IWLIB=$(DYNAMIC)
IWLIB_INSTALL=install-dynamic
endif
# Standard name for dynamic library so that the dynamic linker can pick it.
# We will just create a symbolic link to the real thing.
DYNAMIC_LINK= libiw.so
# Install directories
INSTALL_DIR= $(PREFIX)/sbin/
INSTALL_LIB= $(PREFIX)/lib/
INSTALL_INC= $(PREFIX)/include/
INSTALL_MAN= $(PREFIX)/man/
# Various commands
RM = rm -f
RM_CMD = $(RM) *.BAK *.bak *.d *.o *.so ,* *~ *.a *.orig *.rej *.out
LDCONFIG = ldconfig
http://www.aesop-embedded.org
9 [임베디드 리눅스(2.6)에 WIFI를 써보자]
# Do we want to build with or without libm ?
ifdef BUILD_NOLIBM
LIBS=
WELIB_FLAG= -DWE_NOLIBM=y
else
LIBS= -lm
endif
# Stripping or not ?
ifdef BUILD_STRIPPING
STRIPFLAGS= -Wl,-s
else
STRIPFLAGS=
endif
# Do we want to build with only essential functionality ?
ifdef BUILD_WE_ESSENTIAL
WEDEF_FLAG= -DWE_ESSENTIAL=y
endif
# Other flags
CFLAGS=-Os -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow \
-Wpointer-arith -Wcast-qual -Winline -I.
#CFLAGS=-O2 -W -Wall -Wstrict-prototypes -I.
DEPFLAGS=-MMD
XCFLAGS=$(CFLAGS) $(DEPFLAGS) $(WARN) $(HEADERS) $(WELIB_FLAG) $(WEDEF_FLAG)
PICFLAG=-fPIC
# Standard compilation targets
all:: $(IWLIB) $(PROGS)
%: %.o
$(CC) $(LDFLAGS) $(STRIPFLAGS) $(XCFLAGS) -o $@ $^ $(LIBS)
%.o: %.c wireless.h
$(CC) $(XCFLAGS) -c $<
%.so: %.c wireless.h
http://www.aesop-embedded.org
10 [임베디드 리눅스(2.6)에 WIFI를 써보자]
$(CC) $(XCFLAGS) $(PICFLAG) -c -o $@ $<
iwconfig: iwconfig.o $(IWLIB)
iwlist: iwlist.o $(IWLIB)
iwpriv: iwpriv.o $(IWLIB)
iwspy: iwspy.o $(IWLIB)
iwgetid: iwgetid.o $(IWLIB)
iwevent: iwevent.o $(IWLIB)
ifrename: ifrename.o $(IWLIB)
macaddr: macaddr.o $(IWLIB)
# Always do symbol stripping here
iwmulticall: iwmulticall.o
$(CC) $(LDFLAGS) -Wl,-s $(XCFLAGS) -o $@ $^ $(LIBS)
# It's a kind of magic...
wireless.h:
cp $(WEXT_HEADER) wireless.h
# Compilation of the dynamic library
$(DYNAMIC): $(OBJS:.o=.so)
$(CC) -shared -o $@ -Wl,-soname,$@ $(STRIPFLAGS) $(LIBS) -lc $^
# Compilation of the static library
$(STATIC): $(OBJS:.o=.so)
$(RM) $@
$(AR) cru $@ $^
$(RANLIB) $@
# Installation : So crude but so effective ;-)
http://www.aesop-embedded.org
11 [임베디드 리눅스(2.6)에 WIFI를 써보자]
# Less crude thanks to many contributions ;-)
install:: $(IWLIB_INSTALL) install-bin install-hdr install-man
# Install the dynamic library
install-dynamic:: $(DYNAMIC)
install -m 755 -d $(INSTALL_LIB)
install -m 755 $(DYNAMIC) $(INSTALL_LIB)
ln -sfn $(DYNAMIC) $(INSTALL_LIB)/$(DYNAMIC_LINK)
@echo "*** Don't forget to add $(INSTALL_LIB) to /etc/ld.so.conf, and run ldconfig as root.
***"
@$(LDCONFIG) || echo "*** Could not run ldconfig ! ***"
# Install the static library
install-static:: $(STATIC)
install -m 755 -d $(INSTALL_LIB)
install -m 644 $(STATIC) $(INSTALL_LIB)
# All the binaries. Careful, no dependancy on install-dynamic
install-bin:: all
install -m 755 -d $(INSTALL_DIR)
install -m 755 $(PROGS) $(INSTALL_DIR)
# Headers to go with the wireless lib (dev)
install-hdr:: wireless.h
install -m 755 -d $(INSTALL_INC)
install -m 644 iwlib.h $(INSTALL_INC)
install -m 644 wireless.h $(INSTALL_INC)
# How could you live without those manapages ?
install-man::
install -m 755 -d $(INSTALL_MAN)/man8/
install -m 644 $(MANPAGES8) $(INSTALL_MAN)/man8/
install -m 755 -d $(INSTALL_MAN)/man7/
install -m 644 $(MANPAGES7) $(INSTALL_MAN)/man7/
install -m 755 -d $(INSTALL_MAN)/man5/
install -m 644 $(MANPAGES5) $(INSTALL_MAN)/man5/
http://www.aesop-embedded.org
12 [임베디드 리눅스(2.6)에 WIFI를 써보자]
install-iwmulticall:: iwmulticall
install -m 755 -d $(INSTALL_DIR)
install -m 755 $< $(INSTALL_DIR)/iwconfig
( cd $(INSTALL_DIR) ; \
ln -f -s iwconfig iwlist ; \
ln -f -s iwconfig iwspy ; \
ln -f -s iwconfig iwpriv ; \
ln -f -s iwconfig iwgetid )
clean::
$(RM_CMD)
realclean::
$(RM_CMD)
$(RM) $(STATIC) $(DYNAMIC) $(PROGS) $(EXTRAPROGS) libiw* wireless.h
uninstall::
for f in $(PROGS); do \
$(RM) $(INSTALL_DIR)/$$f; \
done
$(RM) $(INSTALL_LIB)/$(STATIC)
$(RM) $(INSTALL_LIB)/$(DYNAMIC)
$(RM) $(INSTALL_LIB)/$(DYNAMIC_LINK)
$(RM) $(INSTALL_INC)/iwlib.h
$(RM) $(INSTALL_INC)/wireless.h
for f in $(MANPAGES8); do \
$(RM) $(INSTALL_MAN)/man8/$$f; \
done
for f in $(MANPAGES7); do \
$(RM) $(INSTALL_MAN)/man7/$$f; \
done
for f in $(MANPAGES5); do \
$(RM) $(INSTALL_MAN)/man5/$$f; \
done
# Include dependancies
-include *.d
http://www.aesop-embedded.org
13 [임베디드 리눅스(2.6)에 WIFI를 써보자]
10) make clean && make
11) iwconfig, iwevent, iwgetid, iwlist, iwpriv, iwspy, libiw.so.29 파일을 잘 챙긴다
4. 준비가 끝났으면 본격적으로 WIFI를 돌려보도록 하겠습니다.
1) 2.에서 준비한 커널을 보드에 설치하고 rt73.bin, rt73.ko, rt73sta.dat 파일을 설정한
경로에 맞게 무선유틸리티 iwconfig, iwevent, iwgetid, iwlist, iwpriv, iwspy, libiw.so.29
를 사용할 경로에 모아서 넣는다.
2) 보드에 무선랜카드를 장착한다
3) rt73.ko가 있는 경로로 이동한다
4) ifconfig lo inet 127.0.0.1 up + enter
ifconfig rausb0 inet 192.168.1.10 up + enter (여기서 192.168.1.10은 임의 부여한 IP)
ifconfig 를 실행시켜서 제대로 설정이 되었는지 확인한다.
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 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:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
rausb0 Link encap:Ethernet HWaddr 00:08:9F:F0:49:F7
inet addr:192.168.1.10 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:63 errors:0 dropped:0 overruns:0 frame:0
TX packets:11 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:5352 (5.2 KiB) TX bytes:946 (946.0 B)
http://www.aesop-embedded.org
14 [임베디드 리눅스(2.6)에 WIFI를 써보자]
5) 무선랜 유틸리티 경로로 이동해서 ./iwconfig 를 실행시켜서 AP와 정상적으로 접속
했는지 확인한다
lo no wireless extensions.
rausb0 RT73 WLAN ESSID:"NETGEAR" Nickname:""
Mode:Managed Frequency=2.462 GHz Access Point: 00:0F:B5:E1:B6:3A
Bit Rate=54 Mb/s
RTS thr:off Fragment thr:off
Encryption key:off
Link Quality=94/100 Signal level:-40 dBm Noise level:-79 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
6) route add default gw 192.168.1.1 + enter 해서 외부 route를 열어준다
route –n 해서 경로가 제대로 설정되어 있는지 확인한다.
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 rausb0
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 rausb0
7) 여기까지 설정이 끝났으면 핑테스트를 해서 외부로 핑이 제대로 전송되는지
확인한다. 설정 끝!
이후 부터는 TIP 입니다. 참고 하세요 ^^
1) NFS 연결
1> NFS를 마운팅 시킬 서버에 접속한다.
2> vim /etc/exports 를 실행하고 서버에서 구동하고 있는 nfs의 경로와 접속할 장비의
아이피(공유기의 고정아이피)와 권한을 셋팅하고 저장한다.
/hd/hyun/nfs 220.90.136.168/24(rw,no_root_squash,insecure,sync)
3> 서버 프롬프트에서 exportfs –a + enter 해서 저장한 내용을 서버에 적용시킨다
4> 장비 터미널에서 아래와 같이 입력해서 마운팅 시킨다
(분홍색은 서버아이피/경로, 녹색은 장비에 마운팅될 경로)
Ex) 테스트 주소
mount -t nfs -o nolock 220.90.136.186:/hd/hyun/nfs /mnt/embedded
http://www.aesop-embedded.org
15 [임베디드 리눅스(2.6)에 WIFI를 써보자]
2) Allegro NFS 설치하기 (자세한 내용은 http://www.nfsforwindows.com/home )
1> setup-nfs-4.5-demo.exe 실행한다
2> 아래 그림과 같이 설정한다
- Name에는 client에서 mount할 경로를 지정한다. 위에 나와 있는대로 /export/src 로 해도 됨
- Path는 NFS로 공유할 디렉토리를 설정한다. Browse 버튼을 눌러서 경로 설정
- Uid, Gid, Umask, Set mode bits는 위에 나온대로 59,50,000,000으로 설정한다.
- 호스트리스트, R/W, R/O에 대한 설정은 나중에 하기로 하고 Apply 를 누른다
http://www.aesop-embedded.org
16 [임베디드 리눅스(2.6)에 WIFI를 써보자]
- User lists는 everyone으로 설정하고 Apply를 누른다
- Host lists는 New를 누르고 새로운 이름을 입력한 후 아래 New address에 아이피/포트
형태로 입력하고 Add 한다. 설정 후 Apply 한다.
Ex) 220.90.136.177/24 내 컴퓨터의 모든 포트(24)를 열어놓는다
http://www.aesop-embedded.org
17 [임베디드 리눅스(2.6)에 WIFI를 써보자]
- 포트맵퍼를 쓸것이냐는 질문인데,, no라고 한다. 설정 후 Apply 한다.
- Allegro NFS Console에서 디버그 메시지를 볼 항목들을 체크한다. 설정 후 Apply한다
http://www.aesop-embedded.org
18 [임베디드 리눅스(2.6)에 WIFI를 써보자]
- 여기까지 마무리가 되었으면 Exports 탭으로 이동해서 위에서 설정한 항목들의 리스트에
마우스로 클릭하고(Allowed host lists, Read/Write user lists)
Apply -> OK 해서 설정을 마무리 한다.
3> 설정이 마무리 되었으면 단말기 콘솔로 이동해서 아래와 같이 입력하여 Windows
NFS에 연결 한다.
mount –t nfs –o nolock,tcp 220.90.136.177:/export/src /mnt/embedded
220.90.136.177:/export/src : Allegro NFS가 설치된 PC의 IP와 위에서 설정한 경로
/mnt/embedded : 내 장비에 마운트 시킬 경로
Revision History
Date Editor Version Descriptions
2008.10.10 장병남 0.8 초안작성