기존의 DTV 에서 Usb-to-Wireless 동글 타입을 지원해야 한다는 요구에 대응하기 위해 Wireless 프로젝트가 시작되었다. 이 문서는 현재 시중에 나와있는 제품들 가운데 하나를 선정하여 현재 타겟에서 동작하는지 여부에 관해 검증하기 위함으로 작성되어졌다. 여기서는 RALINK 칩셋을 사용하고 있는 WLB5254USB 를 선정했다.
검증 방법은 각각 윈도우, 리눅스, 타겟에서 외부와의 네트워킹이 되는지 여부로 판단한다.
참고로 사내 네트워크의 경우, AD 인증을 통해 DHCP 로 IP 를 받아오는 방식이다. 윈도우의 경우, WPA 방식을 사용하고 리눅스의 경우, WEP 방식을 사용한다.
동작 테스트
윈도우(X86)
구입시 동봉된 설치 CD 를 이용해서 드라이버를 설치해야 한다. 참고로 테스트는 윈도우 XP 기반에서 했다.
사내의 독특한(?) 환경때문에, 하드웨어 인식 이후에도 무선 AP 로 부터 IP 를 할당받지 못하는 문제가 발생했다. 가까스로 환경설정을 통해 인터넷에 접속할 수 있었다.
무선랜의 경우, 기본적으로 윈도우에서 제공하는 접속 프로그램이 있지만 이를 이용해서는 정상적인 IP 할당이 이루어지지 않았다.
그래서 설치 프로그램에서 제공되는 접속 프로그램을 사용하였다. 사내 무선 AP 의 경우, 자동으로 검색이 안되기 때문에 수동으로 등록해주어야 한다.
모든 설정이 완료되면, 위와 같은 화면이 출력된다.
접속이 되면, 위와 같이 접속 상태가 뜬다.
접속이 된 상태에서는 uLGE 라는 사내 무선 AP 가 검색된다.
위와 같이 설정했다면, 외부와 네트워킹이 가능할 것이다.
리눅스(X86)
Fedora 10 을 기준으로 테스트를 수행했다. 리눅스 커널 2.6.28 기반이다.
테스트는 Live CD 를 사용하여 부팅한 후에 Usb-to-Wireless 를 연결하여 외부와의 네트워킹이 되는지 검증하는 것이었다.
다행스럽게도(?) 자동으로 해당 모듈이 모두 올라왔고, 자동으로 인식했다.
제조사에서 제공하는 접속 프로그램이 없기 때문에, 리눅스에서 기본적으로 지원하는 프로그램을 사용했다.
Fedora 10 Live 는 기본적으로 Gnome 이 기본 윈도우 매니져로 지정되어 있다. Usb-to-Wireless 를 인식하여, 모듈이 로딩되면, 오른쪽 상단의 네트워크 접속 마법사(?)에 검색한 주변 AP 들의 목록이 뜬다.
여기서 'Connect to Hidden Wireless Network' 를 선택하면, 접속 마법사 창이 뜬다. 아래와 같이 입력한다.
Network Name | LGEWEP |
Wireless Security | WEP 40/128-bit Key |
Key | a1215a0824b0501b1009c0522d |
Show key | 체크 |
'Connect' 를 누르면, 패스워드를 입력하라는 창이 뜨는데, 여기서는 그냥 root 패스워드를 입력해주면 된다.
곧 접속되었다는 메세지가 뜨면, 'ifconfig' 를 통해 IP 할당이 제대로 이루어졌는지 확인해 본다.
DTV(타겟)
참고로 타겟에서의 테스트 환경은 다음과 같다.
H/W | Saturn 6 |
S/W | GP1 (linux-2.6.26) |
커널 2.6.26 커널에서는 기본적으로 ralink 칩셋 기반의 WLB5254USB 을 지원한다. 관련 커널 옵션을 지정해 주어야 한다.
'Networking → Wireless' 아래의 하위 옵션들을 모두 지정한다. 또한 'Device Drivers → Network device support → Wireless LAN → Wireless LAN(IEEE 802.11)' 을 선택하면, 커널에서 기본적으로 지원하는 목록들이 나온다.
'Ralink driver support' 라는 옵션이 보일 것이다. 만일 보이지 않는다면, 'Networking → Wireless' 아래의 하위 옵션들을 지정했는지 확인해보자. 여기서는 'Ralink rt73 usb support, RT73 leds support, Ralink debug output' 을 선택한다.
모듈이 올라가지 않는 문제
이후, 커널 컴파일 후에 이를 타겟에 올려서 WLB5254USB 를 테스트해보았다. 하지만, 다음과 같은 에러가 발생했다. 참고로 아래는 커널 컴파일 시 관련 옵션을 모두 모듈(M)로 처리했을 때의 경우이다.
커널 컴파일 시 관련 옵션을 모두 bulit-in(*) 으로 처리했을 때의 경우에도 발생하는 문제는 동일하다.
/mnt/lg/lgapp # lsmod Module Size Used by Tainted: P rt73usb 35344 - // 여기서는 모듈로 선택하여 빌드했기 때문에 관련 모듈들이 모두 load 된 상태다 rt2x00usb 9760 - rt2x00lib 26096 - mdrv_ve 18064 - ... /mnt/lg/lgapp # ifconfig -a 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) wlan0 Link encap:Ethernet HWaddr 00:0E:2E:4A:2E:74 // -a 옵션 시 wlan0 인터페이스가 출력되는 것으로 보아, init 은 된 것으로 보여진다 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) wmaster0 Link encap:UNSPEC HWaddr 00-0E-2E-4A-2E-74-A0-8F-00-00-00-00-00-00-00-00 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) /mnt/lg/lgapp # ifconfig wlan0 up [ 158.581000] phy0 -> rt2x00lib_request_firmware: Info - Loading firmware file 'rt73.bin'. // open 시에 rt73.bin 이라는 firmware 파일이 필요하다 [ 158.590000] firmware: requesting rt73.bin [ 218.607000] phy0 -> rt2x00lib_request_firmware: Error - Failed to request Firmware. // 일정 시간 안에 찾지 못하면, open 이 실패한다 ifconfig: ioctl 0x8914 failed: No such file or directory // 결국 제대로 i/o 할 수 없어 에러가 발생한다
문제 해결 방법
Mstar 에 위의 문제를 리포팅 한 후, 첫번째로 문제 해결 방법을 피드백 받았다.
첫번째 방법 (임시)
#ifconfig wlan0 up & (PS: After executing ‘ifconfig wlan0 up &’, you have only 60 seconds to type the following instructions) #cd /sys/class/firmware/1-1.4\:1.0 #echo 1 > ./loading #cat rt73.bin> ./data #echo 0 > ./loading
위의 방법은 단순하게 커널이 firmware 파일을 찾는 약 60 초 동안 실제 rt73.bin 파일을 찾아 입력해주는 것이다. 하지만, 이 방법의 경우, 일일이 입력을 해주어야 한다는 점과 60 초 안에 입력을 해야한다는 점 때문에 그야말로 임시적인 방법이다.
실제로 위와 같이 실행하여, WLB5254USB 이 정상적으로 동작하였다.
/mnt/lg/lgapp/drivers/wireless_util # ifconfig wlan0 up & /mnt/lg/lgapp/drivers/wireless_util # [ 554.663000] phy0 -> rt2x00lib_request_firmware: Info - Loading firmware file 'rt73.bin'. [ 554.672000] firmware: requesting rt73.bin /mnt/lg/lgapp/drivers/wireless_util # cd /sys/class/firmware/2-1\:1.0/ /sys/class/firmware/2-1:1.0 # ls data device loading subsystem uevent /sys/class/firmware/2-1:1.0 # echo 1 > ./loading /sys/class/firmware/2-1:1.0 # cd - /mnt/lg/lgapp/drivers/wireless_util # cat rt73.bin > /sys/class/firmware/2-1\:1.0/data /mnt/lg/lgapp/drivers/wireless_util # echo 0 > /sys/class/firmware/2-1\:1.0/loading /mnt/lg/lgapp/drivers/wireless_util # [ 606.004000] phy0 -> rt2x00lib_request_firmware: Info - Firmware detected - version: 1.7. // rt73.bin firmware 파일을 찾았다 /mnt/lg/lgapp/drivers/wireless_util # 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) wlan0 Link encap:Ethernet HWaddr 00:0E:2E:4A:2E:74 UP 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) wmaster0 Link encap:UNSPEC HWaddr 00-0E-2E-4A-2E-74-A0-8F-00-00-00-00-00-00-00-00 UP BROADCAST RUNNING 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)
두번째 방법 (최종)
첫번째 방법에서의 단점을 보완하기 위해 rt73.bin 파일을 소스코드 안에 집어넣는 방법이다. 아래와 같이 rt2x00firmware.c 파일의 수정이 필요하다. 주석이 추가된 부분을 유의해서 보기 바란다.
#include <linux/kernel.h> #include <linux/module.h> #include "rt2x00.h" #include "rt2x00lib.h" /* 추가된 부분 시작 */ unsigned char rt73_bin[2048]={ 0x02,0x13,0x25,0x12,0x10,0xD9,0x02,0x12, 0x58,0x02,0x13,0x58,0x02,0x13,0x5A,0xC0, 0xD0,0x75,0xD0,0x18,0x12,0x13,0x5C,0xD0, 0xD0,0x22,0x02,0x14,0x5C,0x02,0x14,0xE7, 0xED,0x4C,0x70,0x44,0x90,0x01,0xA8,0x74, 0x80,0xF0,0xEF,0x30,0xE5,0x07,0xE4,0x90, 0x00,0x0F,0xF0,0x80,0x2C,0xE5,0x40,0x24, 0xC0,0x60,0x13,0x24,0xC0,0x60,0x16,0x24, 0xC0,0x60,0x19,0x24,0xC0,0x70,0x1A,0xE4, 0x90,0x00,0x0B,0xF0,0x80,0x13,0xE4,0x90, 0x00,0x13,0xF0,0x80,0x0C,0xE4,0x90,0x00, 0x1B,0xF0,0x80,0x05,0xE4,0x90,0x00,0x23, 0xF0,0xE4,0x90,0x01,0xA8,0xF0,0xD3,0x22, 0x90,0x02,0x02,0xED,0xF0,0x90,0x02,0x01, 0xEF,0xF0,0xD3,0x22,0xEF,0x24,0xC0,0x60, 0x1F,0x24,0xC0,0x60,0x2E,0x24,0xC0,0x60, 0x3D,0x24,0xC0,0x70,0x53,0x90,0x00,0x0B, 0xE0,0x30,0xE1,0x02,0xC3,0x22,0x90,0x00, 0x09,0xE0,0xFE,0x90,0x00,0x08,0x80,0x37, 0x90,0x00,0x13,0xE0,0x30,0xE1,0x02,0xC3, 0x22,0x90,0x00,0x11,0xE0,0xFE,0x90,0x00, 0x10,0x80,0x24,0x90,0x00,0x1B,0xE0,0x30, 0xE1,0x02,0xC3,0x22,0x90,0x00,0x19,0xE0, 0xFE,0x90,0x00,0x18,0x80,0x11,0x90,0x00, 0x23,0xE0,0x30,0xE1,0x02,0xC3,0x22,0x90, 0x00,0x21,0xE0,0xFE,0x90,0x00,0x20,0xE0, 0xFD,0xEE,0xF5,0x37,0xED,0xF5,0x38,0xD3, 0x22,0x30,0x09,0x20,0x20,0x04,0x0B,0x90, 0x02,0x08,0xE0,0x54,0x0F,0x70,0x03,0x02, 0x12,0x57,0xC2,0x09,0x90,0x02,0x00,0xE0, 0x44,0x04,0xF0,0x74,0x04,0x12,0x0C,0x3A, 0xC2,0x04,0xC2,0x07,0x90,0x02,0x01,0xE0, 0x30,0xE0,0x03,0x00,0x80,0xF6,0x90,0x03, 0x26,0xE0,0x20,0xE2,0x03,0x02,0x12,0x57, 0x90,0x02,0x08,0xE0,0x70,0x1B,0x20,0x07, 0x03,0x02,0x12,0x57,0x90,0x03,0x12,0xE0, 0x64,0x22,0x60,0x03,0x02,0x12,0x57,0xD2, 0x09,0xC2,0x07,0x74,0x02,0x12,0x0C,0x3A, 0x22,0x90,0x02,0x03,0xE0,0x30,0xE4,0x47, 0x20,0x06,0x44,0xE5,0x3C,0x60,0x34,0xE5, 0x40,0x24,0xC0,0x60,0x14,0x24,0xC0,0x60, 0x18,0x24,0xC0,0x60,0x1C,0x24,0xC0,0x70, 0x22,0x90,0x00,0x0B,0xE0,0x30,0xE1,0x1B, 0x22,0x90,0x00,0x13,0xE0,0x30,0xE1,0x13, 0x22,0x90,0x00,0x1B,0xE0,0x30,0xE1,0x0B, 0x22,0x90,0x00,0x23,0xE0,0x30,0xE1,0x03, 0x02,0x12,0x57,0x90,0x02,0x03,0x74,0x01, 0xF0,0x00,0xE0,0x54,0xC0,0xF5,0x40,0xE5, 0x40,0x24,0xC0,0x60,0x20,0x24,0xC0,0x60, 0x30,0x24,0xC0,0x60,0x40,0x24,0xC0,0x70, 0x56,0x90,0x00,0x0B,0xE0,0x30,0xE1,0x03, 0x02,0x12,0x57,0x90,0x00,0x09,0xE0,0xFE, 0x90,0x00,0x08,0x80,0x3A,0x90,0x00,0x13, 0xE0,0x30,0xE1,0x03,0x02,0x12,0x57,0x90, 0x00,0x11,0xE0,0xFE,0x90,0x00,0x10,0x80, 0x26,0x90,0x00,0x1B,0xE0,0x30,0xE1,0x03, 0x02,0x12,0x57,0x90,0x00,0x19,0xE0,0xFE, 0x90,0x00,0x18,0x80,0x12,0x90,0x00,0x23, 0xE0,0x30,0xE1,0x03,0x02,0x12,0x57,0x90, 0x00,0x21,0xE0,0xFE,0x90,0x00,0x20,0xE0, 0xFD,0xEE,0xF5,0x37,0xED,0xF5,0x38,0x90, 0x03,0x27,0x74,0x82,0xF0,0x90,0x02,0x01, 0xE5,0x40,0xF0,0x90,0x02,0x06,0xE0,0xF5, 0x3C,0xC3,0xE5,0x38,0x95,0x3A,0xE5,0x37, 0x95,0x39,0x50,0x21,0xE5,0x40,0x44,0x05, 0xFF,0xE5,0x37,0xA2,0xE7,0x13,0xFC,0xE5, 0x38,0x13,0xFD,0x12,0x10,0x20,0xE5,0x3C, 0x30,0xE2,0x04,0xD2,0x06,0x80,0x02,0xC2, 0x06,0x53,0x3C,0x01,0x22,0x30,0x0B,0x07, 0xE4,0x90,0x02,0x02,0xF0,0x80,0x06,0x90, 0x02,0x02,0x74,0x20,0xF0,0xE5,0x40,0x44, 0x01,0x90,0x02,0x01,0xF0,0x90,0x02,0x01, 0xE0,0x30,0xE0,0x03,0x00,0x80,0xF6,0x90, 0x03,0x27,0x74,0x02,0xF0,0xAF,0x40,0x12, 0x10,0x74,0x40,0xA5,0x00,0x80,0xF6,0x22, 0x90,0x7F,0xF8,0xE0,0xB4,0x02,0x03,0x12, 0x16,0x38,0x90,0x02,0x01,0xE0,0x30,0xE0, 0x03,0x00,0x80,0xF6,0x90,0x03,0x26,0xE0, 0x20,0xE1,0x07,0xE5,0x3B,0x70,0x03,0x02, 0x13,0x24,0xE5,0x3B,0x70,0x15,0x90,0x03, 0x24,0xE0,0x75,0xF0,0x40,0xA4,0xF5,0x36, 0x85,0xF0,0x35,0x75,0x24,0x83,0x75,0x3B, 0x01,0x80,0x03,0x75,0x24,0x03,0xD3,0xE5, 0x36,0x95,0x3A,0xE5,0x35,0x95,0x39,0x40, 0x36,0x90,0x02,0x01,0xE0,0x30,0xE0,0x03, 0x00,0x80,0xF6,0x90,0x03,0x27,0xE5,0x24, 0xF0,0x90,0x00,0x0F,0xE0,0x30,0xE1,0x04, 0x30,0x0E,0xF6,0x22,0x30,0x0B,0x07,0xE4, 0x90,0x02,0x02,0xF0,0x80,0x06,0x90,0x02, 0x02,0x74,0x20,0xF0,0x90,0x02,0x01,0x74, 0x21,0xF0,0x75,0x24,0x03,0x80,0x3D,0xE5, 0x35,0xA2,0xE7,0x13,0xFE,0xE5,0x36,0x13, 0xFD,0xAC,0x06,0x90,0x02,0x01,0xE0,0x30, 0xE0,0x03,0x00,0x80,0xF6,0x90,0x03,0x27, 0xE5,0x24,0xF0,0x90,0x00,0x0F,0xE0,0x30, 0xE1,0x04,0x30,0x0E,0xF6,0x22,0x7F,0x25, 0x12,0x10,0x20,0xE5,0x36,0xB5,0x3A,0x08, 0xE5,0x35,0xB5,0x39,0x03,0x00,0x80,0x04, 0xE4,0xF5,0x3B,0x22,0xC3,0xE5,0x36,0x95, 0x3A,0xF5,0x36,0xE5,0x35,0x95,0x39,0xF5, 0x35,0x02,0x12,0x96,0x22,0x75,0xA8,0x0F, 0x90,0x03,0x06,0x74,0x01,0xF0,0x90,0x03, 0x07,0xF0,0x90,0x03,0x08,0x04,0xF0,0x90, 0x03,0x09,0x74,0x6C,0xF0,0x90,0x03,0x0A, 0x74,0xFF,0xF0,0x90,0x03,0x02,0x74,0x1F, 0xF0,0x90,0x03,0x00,0x74,0x04,0xF0,0x90, 0x03,0x25,0x74,0x31,0xF0,0xD2,0xAF,0x22, 0x00,0x22,0x00,0x22,0x90,0x03,0x05,0xE0, 0x30,0xE0,0x0B,0xE0,0x44,0x01,0xF0,0x30, 0x09,0x02,0xD2,0x04,0xC2,0x07,0x22,0x8D, 0x24,0xA9,0x07,0x90,0x7F,0xFC,0xE0,0x75, 0x25,0x00,0xF5,0x26,0xA3,0xE0,0x75,0x27, 0x00,0xF5,0x28,0xA3,0xE0,0xFF,0xA3,0xE0, 0xFD,0xE9,0x30,0xE5,0x14,0x54,0xC0,0x60, 0x05,0x43,0x05,0x03,0x80,0x03,0x53,0x05, 0xFC,0xEF,0x54,0x3F,0x44,0x40,0xFF,0x80, 0x06,0x53,0x07,0x3F,0x53,0x05,0xF0,0xE5, 0x24,0x30,0xE0,0x05,0x43,0x05,0x10,0x80, 0x03,0x53,0x05,0xEF,0x90,0x7F,0xFC,0xE5, 0x26,0xF0,0xA3,0xE5,0x28,0xF0,0xA3,0xEF, 0xF0,0xA3,0xED,0xF0,0x22,0x8F,0x24,0xA9, 0x05,0x90,0x7F,0xFC,0xE0,0x75,0x25,0x00, 0xF5,0x26,0xA3,0xE0,0x75,0x27,0x00,0xF5, 0x28,0xA3,0xE0,0xFF,0xA3,0xE0,0xFD,0xE5, 0x24,0x30,0xE5,0x0B,0x43,0x05,0x0F,0xEF, 0x54,0x3F,0x44,0x40,0xFF,0x80,0x06,0x53, 0x05,0xF0,0x53,0x07,0x3F,0xE9,0x30,0xE0, 0x05,0x43,0x05,0x10,0x80,0x03,0x53,0x05, 0xEF,0x90,0x7F,0xFC,0xE5,0x26,0xF0,0xA3, 0xE5,0x28,0xF0,0xA3,0xEF,0xF0,0xA3,0xED, 0xF0,0x22,0x90,0x7F,0xFC,0xE0,0xF9,0xA3, 0xE0,0xFE,0xA3,0xE0,0xFC,0xA3,0xE0,0xFB, 0xEF,0x30,0xE5,0x0B,0x43,0x03,0x0F,0xEC, 0x54,0x3F,0x44,0x40,0xFC,0x80,0x06,0x53, 0x03,0xF0,0x53,0x04,0x3F,0xED,0x30,0xE0, 0x07,0xEF,0x54,0xC0,0x60,0x07,0x80,0x0A, 0xEF,0x54,0xC0,0x60,0x05,0x43,0x03,0x10, 0x80,0x03,0x53,0x03,0xEF,0x90,0x7F,0xFC, 0xE9,0xF0,0xA3,0xEE,0xF0,0xA3,0xEC,0xF0, 0xA3,0xEB,0xF0,0x22,0xE5,0x4B,0xFD,0x54, 0x1F,0x90,0x7F,0xF8,0xF0,0xE5,0x4A,0xF5, 0x09,0x90,0x30,0x38,0xE0,0x90,0x7F,0xFC, 0xF0,0x90,0x30,0x39,0xE0,0x90,0x7F,0xFD, 0xF0,0x90,0x30,0x3A,0xE0,0x90,0x7F,0xFE, 0xF0,0x90,0x30,0x3B,0xE0,0x90,0x7F,0xFF, 0xF0,0xED,0x30,0xE5,0x0C,0x54,0xC0,0x60, 0x0D,0x90,0x7F,0xF0,0xE5,0x47,0xF0,0x80, 0x05,0xE4,0x90,0x7F,0xF0,0xF0,0x90,0x7F, 0xF8,0xE0,0x14,0x60,0x08,0x24,0xFE,0x60, 0x0D,0x24,0x03,0x80,0x12,0xAF,0x05,0xAD, 0x09,0x12,0x13,0xC5,0x80,0x10,0xAF,0x05, 0xAD,0x09,0x12,0x14,0x12,0x80,0x07,0xAF, 0x05,0xAD,0x09,0x12,0x13,0x6F,0x90,0x7F, 0xFC,0xE0,0x90,0x30,0x38,0xF0,0x90,0x7F, 0xFD,0xE0,0x90,0x30,0x39,0xF0,0x90,0x7F, 0xFE,0xE0,0x90,0x30,0x3A,0xF0,0x90,0x7F, 0xFF,0xE0,0x90,0x30,0x3B,0xF0,0x22,0xE5, 0x4B,0x64,0x01,0x60,0x03,0x02,0x15,0x71, 0xF5,0x4B,0xE5,0x44,0x45,0x43,0x70,0x03, 0x02,0x15,0xA0,0x12,0x0C,0x14,0x12,0x0B, 0x86,0x50,0xFB,0x90,0x00,0x00,0xE0,0xF5, 0x25,0x12,0x15,0xB4,0xC2,0x92,0xE4,0xF5, 0x24,0xE5,0x24,0xC3,0x95,0x25,0x50,0x49, 0x7E,0x00,0x7F,0x4C,0x74,0x40,0x25,0x24, 0xF5,0x82,0xE4,0x34,0x01,0xAD,0x82,0xFC, 0x75,0x2B,0x02,0x7B,0x10,0x12,0x07,0x1E, 0xC2,0x93,0x12,0x15,0xA1,0x7D,0xA0,0x12, 0x15,0xD0,0xE5,0x24,0x54,0x0F,0x24,0x4C, 0xF8,0xE6,0xFD,0xAF,0x4B,0xAE,0x4A,0x12, 0x15,0xD8,0x05,0x4B,0xE5,0x4B,0x70,0x02, 0x05,0x4A,0x12,0x0A,0x5F,0x05,0x24,0xE5, 0x24,0x54,0x0F,0x70,0xD5,0xD2,0x93,0x80, 0xB0,0xC3,0xE5,0x44,0x95,0x25,0xF5,0x44, 0xE5,0x43,0x94,0x00,0xF5,0x43,0x02,0x14, 0xF2,0x12,0x15,0xB4,0xC2,0x93,0xC2,0x92, 0x12,0x15,0xA1,0x7D,0x80,0x12,0x15,0xD0, 0x7D,0xAA,0x74,0x55,0xFF,0xFE,0x12,0x15, 0xD8,0x7D,0x55,0x7F,0xAA,0x7E,0x2A,0x12, 0x15,0xD8,0x7D,0x30,0xAF,0x4B,0xAE,0x4A, 0x12,0x15,0xD8,0x12,0x0A,0x5F,0xD2,0x93, 0x22,0x7D,0xAA,0x74,0x55,0xFF,0xFE,0x12, 0x15,0xD8,0x7D,0x55,0x7F,0xAA,0x7E,0x2A, 0x12,0x15,0xD8,0x22,0xAD,0x47,0x7F,0x34, 0x7E,0x30,0x12,0x15,0xD8,0x7D,0xFF,0x7F, 0x35,0x7E,0x30,0x12,0x15,0xD8,0xE4,0xFD, 0x7F,0x37,0x7E,0x30,0x12,0x15,0xD8,0x22, 0x74,0x55,0xFF,0xFE,0x12,0x15,0xD8,0x22, 0x8F,0x82,0x8E,0x83,0xED,0xF0,0x22,0xE4, 0xFC,0x90,0x7F,0xF0,0xE0,0xAF,0x09,0x14, 0x60,0x14,0x14,0x60,0x15,0x14,0x60,0x16, 0x14,0x60,0x17,0x14,0x60,0x18,0x24,0x05, 0x70,0x16,0xE4,0xFC,0x80,0x12,0x7C,0x01, 0x80,0x0E,0x7C,0x03,0x80,0x0A,0x7C,0x07, 0x80,0x06,0x7C,0x0F,0x80,0x02,0x7C,0x1F, 0xEC,0x6F,0xF4,0x54,0x1F,0xFC,0x90,0x30, 0x34,0xE0,0x54,0xE0,0x4C,0xFD,0xA3,0xE0, 0xFC,0x43,0x04,0x1F,0x7F,0x34,0x7E,0x30, 0x12,0x15,0xD8,0xAD,0x04,0x0F,0x12,0x15, 0xD8,0xE4,0xFD,0x7F,0x37,0x02,0x15,0xD8, 0x02,0x15,0xDF,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x01,0x07,0x29,0xE9}; static struct firmware rtfw; /* 추가된 부분 끝 */ static int rt2x00lib_request_firmware(struct rt2x00_dev *rt2x00dev) { struct device *device = wiphy_dev(rt2x00dev->hw->wiphy); const struct firmware *fw; char *fw_name; int retval; u16 crc; /* 추가된 부분 시작 */ rtfw.size=2048; rtfw.data=rt73_bin; fw=&rtfw; /* 추가된 부분 끝 */ /* * Read correct firmware from harddisk. */ fw_name = rt2x00dev->ops->lib->get_firmware_name(rt2x00dev); if (!fw_name) { ERROR(rt2x00dev, "Invalid firmware filename.\n" "Please file bug report to %s.\n", DRV_PROJECT); return -EINVAL; } INFO(rt2x00dev, "Loading firmware file '%s'.\n", fw_name); /* 수정된 부분 시작 */ /* retval = request_firmware(&fw, fw_name, device); if (retval) { ERROR(rt2x00dev, "Failed to request Firmware.\n"); return retval; } if (!fw || !fw->size || !fw->data) { ERROR(rt2x00dev, "Failed to read Firmware.\n"); return -ENOENT; } */ /* 수정된 부분 끝 */ crc = rt2x00dev->ops->lib->get_firmware_crc(fw->data, fw->size); if (crc != (fw->data[fw->size - 2] << 8 | fw->data[fw->size - 1])) { ERROR(rt2x00dev, "Firmware checksum error.\n"); retval = -ENOENT; goto exit; } INFO(rt2x00dev, "Firmware detected - version: %d.%d.\n", fw->data[fw->size - 4], fw->data[fw->size - 3]); rt2x00dev->fw = fw; return 0; excomputer: release_firmware(fw); return retval; } int rt2x00lib_load_firmware(struct rt2x00_dev *rt2x00dev) { int retval; if (!test_bit(DRIVER_REQUIRE_FIRMWARE, &rt2x00dev->flags)) return 0; if (!rt2x00dev->fw) { retval = rt2x00lib_request_firmware(rt2x00dev); if (retval) return retval; } /* * Send firmware to the device. */ retval = rt2x00dev->ops->lib->load_firmware(rt2x00dev, rt2x00dev->fw->data, rt2x00dev->fw->size); return retval; } void rt2x00lib_free_firmware(struct rt2x00_dev *rt2x00dev) { release_firmware(rt2x00dev->fw); rt2x00dev->fw = NULL; }
수정한 이후, 다시 커널 컴파일을 하고 정상적으로 동작이 되는지 확인해보자!
/mnt/lg/lgapp # ifconfig wlan0 up [ 124.593000] phy0 -> rt2x00lib_request_firmware: Info - Loading firmware file 'rt73.bin'. [ 124.602000] phy0 -> rt2x00lib_request_firmware: Info - Firmware detected - version: 1.7. /mnt/lg/lgapp # 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) wlan0 Link encap:Ethernet HWaddr 00:0E:2E:4A:2E:74 UP 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) wmaster0 Link encap:UNSPEC HWaddr 00-0E-2E-4A-2E-74-A0-8F-00-00-00-00-00-00-00-00 UP BROADCAST RUNNING 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)
제대로 동작한다.
연결 설정하기
외부와의 네트워킹 동작성을 확인하기 위해서는 몇가지 명령어들(iwconfig, udhcpc etc..)이 필요하다. 현재 GP1(ver.13921) 상의 rootfs 에서는 이것들이 지원되지 않는다.
따라서, 크로스 컴파일하여 직접 넣어주어야 한다. iwconfig 의 경우, wireless_tools 를 사용하고, udhcpc 는 기존 busybox 에서 dhcp client 관련한 옵션을 지정하여 새로 컴파일 했다.
udhcpc 의 경우, 실행시 simple.script 라는 설정파일을 참조한다. 파일은 아래와 같다.
#!/bin/sh # udhcpc script edited by Tim Riker <Tim@Rikers.org> [ -z "$1" ] && echo "Error: should be called from udhcpc" && exit 1 #RESOLV_CONF="/etc/resolv.conf" RESOLV_CONF="/mnt/lg/user/resolv.conf" // 위치에 따라 수정한다 [ -n "$broadcast" ] && BROADCAST="broadcast $broadcast" [ -n "$subnet" ] && NETMASK="netmask $subnet" case "$1" in deconfig) /sbin/ifconfig $interface 0.0.0.0 ;; renew|bound) /sbin/ifconfig $interface $ip $BROADCAST $NETMASK if [ -n "$router" ] ; then echo "deleting routers" while route del default gw 0.0.0.0 dev $interface ; do : done metric=0 for i in $router ; do route add default gw $i dev $interface metric $((metric++)) done fi echo -n > $RESOLV_CONF [ -n "$domain" ] && echo search $domain >> $RESOLV_CONF for i in $dns ; do echo adding dns $i echo nameserver $i >> $RESOLV_CONF done ;; esac exit 0
이 때 주의해야 할 점은 정적(static) 컴파일을 해야한다는 점이다. 현재 rootfs 에서는 용량을 최대한으로 줄이기 위해, PC 기반의 리눅스에서 지원하는 shared 라이브러리를 삭제했다. 따라서, 컴파일되어 생성되는 오브젝트 파일에 필요한 라이브러리들을 포함(bulit-in)시켜야 한다.
이를 위해서는 컴파일 시 '-static' 옵션을 주면 된다. 대부분의 경우, Makefile 에 아래와 같이 추가해 주면 된다.
... OPTION = -static ...
이후 생성된 오브젝트 파일은 다음과 같이 확인할 수 있다.
#file a.out a.out: ELF 32-bit LSB executable, MIPS, version 1 (SYSV), statically linked, not stripped
생성된 오브젝트 파일은 이후, .epk 빌드시, 포함되어야 하기 때문에, '/share/global_platform/saturn6/wjkim/drivers' 아래에 복사하면 된다.
참고로 여기서는 사내 무선망 AP 에 접속하여, IP 를 받아와서, 외부로 ping 이 되는지 확인해볼 것이다.
init 및 open 되었기 때문에, 외부와 네트워킹이 되는지 확인해보아야 한다. 여기서는 현재 사내 무선 네트워크 망을 기준으로 설명하겠다.
아래와 같이 명령어를 실행하면, 무선 AP 에 접속하여 IP 를 받아올 수 있다. 테스트를 위해 외부 호스트에 텔넷을 접속해보자!
#iwconfig wlan0 mode managed key a1215a0824b0501b1009c0522d #iwconfig wlan0 essid "LGEWEP" #iwconfig lo no wireless extensions. wmaster0 no wireless extensions. wlan0 IEEE 802.11 ESSID:"LGEWEP" // ESSID 에 LGEWEP 가 표시되는지 확인한다 Mode:Managed Frequency:2.412 GHz Access Point: 00:22:90:EB:57:72 Bit Rate=1 Mb/s Tx-Power=12 dBm Retry min limcomputer:7 RTS thr:off Fragment thr=2352 B Encryption key:A121-5A08-24B0-501B-1009-C052-2D // 입력한 키값이 맞는지 확인한다 Link Quality=79/100 Signal level=-52 dBm Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 Tx excessive retries:0 Invalid misc:0 Missed beacon:0 #busybox udhcpc -i wlan0 -s simple.script renew ### adapter index 3 ### adapter hardware address 00:0e:2e:4a:2e:74 udhcpc (v1.10.1) started ### vfork'ing and execle'ing ../../../user/simple.script ### entering raw listen mode ### opening raw socket on ifindex 3 ### got raw socket fd 23 ### attached filter to raw socket fd 23 ### bound to raw socket fd 23 ### adding option 0x35 ### adding option 0x3d ### adding option 0x3c ### adding option 0x39 Sending discover... ### Waiting on select... ### Got valid DHCP packet ### adding option 0x35 ### adding option 0x3d ### adding option 0x3c ### adding option 0x32 ### adding option 0x36 Sending select for 10.177.178.50... ### Waiting on select... ### Got valid DHCP packet Lease of 10.177.178.50 obtained, lease time 691200 ### vfork'ing and execle'ing ../../../user/simple.script deleting routers route: ioctl 0x890c failed: No such process adding dns 156.147.135.180 adding dns 156.147.135.181 adding dns 165.244.106.110 ### entering none listen mode /mnt/lg/lgapp/drivers/wireless_util # 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) wlan0 Link encap:Ethernet HWaddr 00:0E:2E:4A:2E:74 inet addr:10.177.178.50 Bcast:10.177.179.255 Mask:255.255.254.0 // IP 주소 할당 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:27 errors:0 dropped:0 overruns:0 frame:0 TX packets:2 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:2240 (2.1 KiB) TX bytes:1220 (1.1 KiB) wmaster0 Link encap:UNSPEC HWaddr 00-0E-2E-4A-2E-74-A0-8F-00-00-00-00-00-00-00-00 UP BROADCAST RUNNING 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) #telnet 211.196.153.28 // 외부 호스트로의 텔넷 접속