타겟보드에 WiFi 모듈을 포팅하는 방법을 설명한다. 여기서는 Broadcom 과 Realtek 모듈을 포팅할 것이다.
드라이버 빌드 전 커널 컴파일 하기
WiFi 관련 커널 옵션을 선택하여 빌드해야 한다. 자세한 내용은 dm385_사용하기 를 참고한다.
Realtek (무선 카메라)
제공받은 드라이버 코드의 압축을 푼다.
#tar xzf rtl8188EUS_rtl8189ES_linux_v4.1.2_4787.20120803.tar.gz #cd rtl8188EUS_rtl8189ES_linux_v4.1.2_4787.20120803 #./make_drv Please select card type(1/2): 1) RTL8188eus 2) RTL8189es #? 2 You have selected RTL8189es rtw_version.h has existed! #make
빌드가 완료되면, X86 용 ko 파일(8189es.ko)이 만들어 진다.
크로스 컴파일
Makefile 을 아래와 같이 추가한다.
CONFIG_PLATFORM_I386_PC = n // 수정 CONFIG_PLATFORM_ITX = y // 추가 CONFIG_PLATFORM_ANDROID_X86 = n ... ifeq ($(CONFIG_PLATFORM_ITX), y) // 추가 EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN #-DCONFIG_PLATFORM_TI_DM365 ARCH := arm CROSS_COMPILE := /opt/CodeSourcery/arm-2009q1/bin/arm-none-linux-gnueabi- #KVER := 2.6.37 KSRC := /root/Source/ti_tools/ipnc_psp_arago/kernel // 커널 경로 #KSRC := /selinux/kernel endif
이제 빌드해보자.
#make
8189es.ko 파일이 생성되었다면 성공이다.
동작확인을 위한 준비
간단한 동작확인은 iwconfig 나 iwlist 를 사용해서 가능하다. 여기서는 암호화된 공유기에 접속하는 Station 모드와 WPS, 그리고 Soft AP 기능을 사용해보겠다.
Station 모드는 wpa_supplicant 를 사용해서, Soft AP 기능은 hostapd 라는 프로그램을 사용해야 한다. 특히 이 두 프로그램은 realtek 에서 제공하는 드라이버에 있는 것을 사용해야 한다. 그렇지 않고, 웹 상의 최신버전을 사용하면 동작하지 않는다.
wpa_supplicant 빌드하기
(1-1)unzip wpa_supplicant_hostapd-0.8_rtw_20111118.zip (1-2)cd wpa_supplicant_hostapd-0.8\wpa_supplicant (1-3) vim Makefile added: CC = mipsel-linux-gcc (1-4)make (1-5)copy "wpa_supplicant" and "wpa_cli" to target platform (1-6)copy "wpa_0_8.conf" file to target platform (1-7)./wpa_supplicant -iwlan0 -Dwext -c wpa_0_8.conf -dd & (1-8)./wps_cli (for wps in Interactive mode) (1-9) > help > wps_pbc > wps_pin any 12345678 }}} === hostapd 빌드하기 === {{{ (1-1)unzip wpa_supplicant_hostapd-0.8_rtw_20111118.zip (1-2)cd wpa_supplicant_hostapd-0.8\hostapd (1-3) vim Makefile added: CC = mipsel-linux-gcc (1-4)make (1-5)copy "hostapd" and "hostapd_cli" to target platform (1-6)copy "rtl_hostapd_2G.conf" file to target platform (1-7)start hostapd daemon: ./hostapd rtl_hostapd_2G.conf -B
에러없이 빌드되었다면, 원하는 바이너리 파일들이 만들어졌을 것이다. 이와 함께 설정 파일들을 타겟에 복사한다.
이제 각각의 동작을 확인해보자!
동작 확인
Station 모드
아래처럼 wpa_supplicant 를 실행한다. 참고로 wlan 인터페이스는 wlan2 이다.
#wpa_supplicant -iwlan2 -Dwext -c ./wpa_0_8.conf -dd &
AP 스캔 및 결과 보기
wpa_cli -p /var/run/wpa_supplicant scan wpa_cli -p /var/run/wpa_supplicant scan_results
AP 접속하기(암호없음)
wpa_cli -p /var/run/wpa_supplicant remove_network 0 wpa_cli -p /var/run/wpa_supplicant ap_scan 1 wpa_cli -p /var/run/wpa_supplicant add_network wpa_cli -p /var/run/wpa_supplicant set_network 0 ssid '"itx"' wpa_cli -p /var/run/wpa_supplicant set_network 0 key_mgmt NONE wpa_cli -p /var/run/wpa_supplicant select_network 0
AP 접속하기(WEP40 OPEN)
- 암호가 틀리더라도 ssid 가 존재하면, iwconfig 상에서 접속된 것처럼 나온다.
- 실제 통신(ping)을 해보면, 안된다.
- 보안상의 위험요소와 설정(key 값) 상의 혼동을 줄 수 있기 때문에 권장하지 않는다.
- 암호가 틀렸을 시, 접속에 실패했다는 것을 구분할 뭔가가 필요하다.
# 암호가 숫자(16진수)인 경우 wpa_cli -p /var/run/wpa_supplicant remove_network 0 wpa_cli -p /var/run/wpa_supplicant ap_scan 1 wpa_cli -p /var/run/wpa_supplicant add_network wpa_cli -p /var/run/wpa_supplicant set_network 0 ssid '"itx"' wpa_cli -p /var/run/wpa_supplicant set_network 0 key_mgmt NONE wpa_cli -p /var/run/wpa_supplicant set_network 0 wep_key0 1234567890 wpa_cli -p /var/run/wpa_supplicant set_network 0 wep_tx_keyidx 0 wpa_cli -p /var/run/wpa_supplicant select_network 0 # 암호가 문자열인 경우 wpa_cli -p /var/run/wpa_supplicant remove_network 0 wpa_cli -p /var/run/wpa_supplicant ap_scan 1 wpa_cli -p /var/run/wpa_supplicant add_network wpa_cli -p /var/run/wpa_supplicant set_network 0 ssid '"itx"' wpa_cli -p /var/run/wpa_supplicant set_network 0 key_mgmt NONE wpa_cli -p /var/run/wpa_supplicant set_network 0 wep_key0 '"wjkim"' wpa_cli -p /var/run/wpa_supplicant set_network 0 wep_tx_keyidx 0 wpa_cli -p /var/run/wpa_supplicant select_network 0
AP 접속하기(WEP40 SHARED)
# 암호가 숫자(16진수)인 경우 wpa_cli -p /var/run/wpa_supplicant remove_network 0 wpa_cli -p /var/run/wpa_supplicant ap_scan 1 wpa_cli -p /var/run/wpa_supplicant add_network wpa_cli -p /var/run/wpa_supplicant set_network 0 ssid '"itx1"' wpa_cli -p /var/run/wpa_supplicant set_network 0 key_mgmt NONE wpa_cli -p /var/run/wpa_supplicant set_network 0 wep_key0 1234567890 wpa_cli -p /var/run/wpa_supplicant set_network 0 wep_tx_keyidx 0 wpa_cli -p /var/run/wpa_supplicant set_network 0 auth_alg SHARED wpa_cli -p /var/run/wpa_supplicant select_network 0 # 암호가 문자열인 경우 wpa_cli -p /var/run/wpa_supplicant remove_network 0 wpa_cli -p /var/run/wpa_supplicant ap_scan 1 wpa_cli -p /var/run/wpa_supplicant add_network wpa_cli -p /var/run/wpa_supplicant set_network 0 ssid '"itx1"' wpa_cli -p /var/run/wpa_supplicant set_network 0 key_mgmt NONE wpa_cli -p /var/run/wpa_supplicant set_network 0 wep_key0 '"wjkim"' wpa_cli -p /var/run/wpa_supplicant set_network 0 wep_tx_keyidx 0 wpa_cli -p /var/run/wpa_supplicant set_network 0 auth_alg SHARED wpa_cli -p /var/run/wpa_supplicant select_network 0
AP 접속하기(WEP104 OPEN)
- 암호의 길이를 숫자의 경우 무조건 숫자(26자리), 문자(13글자)를 글자수를 맞춰 넣어야 한다. 사용자가 외우기도 어렵다.
- WEP40 과 명령은 동일하고, 암호 글자수 만 다르다.
# 암호가 숫자(16진수)인 경우 wpa_cli -p /var/run/wpa_supplicant remove_network 0 wpa_cli -p /var/run/wpa_supplicant ap_scan 1 wpa_cli -p /var/run/wpa_supplicant add_network wpa_cli -p /var/run/wpa_supplicant set_network 0 ssid '"itx1"' wpa_cli -p /var/run/wpa_supplicant set_network 0 key_mgmt NONE wpa_cli -p /var/run/wpa_supplicant set_network 0 wep_key0 12345678901234567890123456 wpa_cli -p /var/run/wpa_supplicant set_network 0 wep_tx_keyidx 0 wpa_cli -p /var/run/wpa_supplicant select_network 0 # 암호가 문자열인 경우 wpa_cli -p /var/run/wpa_supplicant remove_network 0 wpa_cli -p /var/run/wpa_supplicant ap_scan 1 wpa_cli -p /var/run/wpa_supplicant add_network wpa_cli -p /var/run/wpa_supplicant set_network 0 ssid '"itx1"' wpa_cli -p /var/run/wpa_supplicant set_network 0 key_mgmt NONE wpa_cli -p /var/run/wpa_supplicant set_network 0 wep_key0 '"aaaaaaaaaaaaa"' wpa_cli -p /var/run/wpa_supplicant set_network 0 wep_tx_keyidx 0 wpa_cli -p /var/run/wpa_supplicant select_network 0
AP 접속하기(WEP104 SHARED)
# 암호가 숫자(16진수)인 경우 wpa_cli -p /var/run/wpa_supplicant remove_network 0 wpa_cli -p /var/run/wpa_supplicant ap_scan 1 wpa_cli -p /var/run/wpa_supplicant add_network wpa_cli -p /var/run/wpa_supplicant set_network 0 ssid '"itx1"' wpa_cli -p /var/run/wpa_supplicant set_network 0 key_mgmt NONE wpa_cli -p /var/run/wpa_supplicant set_network 0 wep_key0 12345678901234567890123456 wpa_cli -p /var/run/wpa_supplicant set_network 0 wep_tx_keyidx 0 wpa_cli -p /var/run/wpa_supplicant set_network 0 auth_alg SHARED wpa_cli -p /var/run/wpa_supplicant select_network 0 # 암호가 문자열인 경우 wpa_cli -p /var/run/wpa_supplicant remove_network 0 wpa_cli -p /var/run/wpa_supplicant ap_scan 1 wpa_cli -p /var/run/wpa_supplicant add_network wpa_cli -p /var/run/wpa_supplicant set_network 0 ssid '"itx1"' wpa_cli -p /var/run/wpa_supplicant set_network 0 key_mgmt NONE wpa_cli -p /var/run/wpa_supplicant set_network 0 wep_key0 '"ccccccccccccc"' wpa_cli -p /var/run/wpa_supplicant set_network 0 wep_tx_keyidx 0 wpa_cli -p /var/run/wpa_supplicant set_network 0 auth_alg SHARED wpa_cli -p /var/run/wpa_supplicant select_network 0
키번호가 다른 경우
WEP 의 경우, 키번호를 지정할 수 있다. IPTIME 공유기에서는 1~4 번까지 총 4개의 키번호 중 하나를 선택할 수 있다. WPA_Supplicant 에서는 0 ~ 3 까지의 키 번호를 선택할 수 있다.
만일의 경우, 공유기를 WEP40-OPEN 에 3번 키에 비밀번호(aaaaa) 라고 설정했다면, 아래와 같이 명령한다.
wpa_cli -p /var/run/wpa_supplicant remove_network 0 wpa_cli -p /var/run/wpa_supplicant ap_scan 1 wpa_cli -p /var/run/wpa_supplicant add_network wpa_cli -p /var/run/wpa_supplicant set_network 0 ssid '"itx"' wpa_cli -p /var/run/wpa_supplicant set_network 0 key_mgmt NONE wpa_cli -p /var/run/wpa_supplicant set_network 0 wep_key2 '"aaaaa"' wpa_cli -p /var/run/wpa_supplicant set_network 0 wep_tx_keyidx 2 wpa_cli -p /var/run/wpa_supplicant select_network 0
AP 접속하기(TKIP & AES)
- 암호가 맞지 않으면, 접속(assoc) 자체가 안된다.
wpa_cli -p /var/run/wpa_supplicant remove_network 0 wpa_cli -p /var/run/wpa_supplicant ap_scan 1 wpa_cli -p /var/run/wpa_supplicant add_network wpa_cli -p /var/run/wpa_supplicant set_network 0 ssid '"itx1"' wpa_cli -p /var/run/wpa_supplicant set_network 0 psk '"11111111"' wpa_cli -p /var/run/wpa_supplicant select_network 0
접속 설정 저장하기
wpa_cli -p /var/run/wpa_supplicant save_config
위 명령어를 실행하면, 현재 접속 중인 설정값들이 wpa_0_8.conf 파일에 저장된다. 예를 들면 아래와 같다.
ctrl_interface=/var/run/wpa_supplicant update_config=1 device_name=RTL8192CU manufacturer=Realtek model_name=RTW_STA model_number=WLAN_CU serial_number=12345 device_type=1-0050F204-1 os_version=01020300 config_methods=virtual_display virtual_push_button keypad network={ ssid="itx" psk="77777777" proto=RSN key_mgmt=WPA-PSK auth_alg=OPEN }
성공했을 당시의 세팅값을 저장하면, 이후 나중에 wpa_supplicant 를 처음 실행할 때, 자동으로 접속된다.
WPS(PBC)
wpa_cli -p /var/run/wpa_supplicant remove_network 0 wpa_cli -p /var/run/wpa_supplicant wps_pbc any
WPS(PIN)
wpa_cli -p /var/run/wpa_supplicant remove_network 0 wpa_cli -p /var/run/wpa_supplicant wps_pin any 12345670
PIN 번호를 '12345670' 으로 지정했다. 공유기에서 이 PIN 번호를 입력하고 접속시도를 하면 된다.
현재 상태 확인하기
wpa_cli -p /var/run/wpa_supplicant status
위와 같이 명령하면, 아래처럼 결과가 출력된다.
Selected interface 'wlan0' RX ctrl_iface - hexdump_ascii(len=6): 53 54 41 54 55 53 STATUS bssid=00:26:66:aa:e7:b4 ssid=itx id=0 mode=station pairwise_cipher=NONE group_cipher=NONE key_mgmt=NONE wpa_state=COMPLETED ip_address=10.10.10.20 address=00:02:72:37:de:62 signal_level=100
접속 끊기
wpa_cli -p /var/run/wpa_supplicant disable_network 0
Soft AP 모드
Soft AP 모드를 실행하기 전에 Station 모드로 실행하는 프로세스들(network manager or wireless tools or wpa_supplicant)을 disable 시켜야 한다.
그리고 아래와 같이 실행한다.
#hostapd rtl_hostapd_2G.conf -B
hostapd 설정하기
동작은 rtl_hostapd_2G.conf 에서 설정한 대로 실행된다. rtl_hostapd_2G.conf 파일을 보자.
interface=wlan0 ssid=rtwap # channel 1-14 is 2.4 GHz ; channel 36, 40, 44, 46, 48, 52, 56, 60, # 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, # 153, 157, 161 is 5GHz # The channels that are available for use in a particular country differ # according to the regulations of that country. channel=6 # Operation mode (a = IEEE 802.11a, b = IEEE 802.11b, g = IEEE # 802.11g, Default: IEEE 802.11b ) hw_mode=g #If the wireless interface is included in a bridge, #an additional configuration parameter, bridge, is needed #bridge=br0 # This field is a bit field that can be used to enable WPA # (IEEE 802.11i/D3.0) # and/or WPA2 (full IEEE 802.11i/RSN): # bit1 = IEEE 802.11i/RSN (WPA2) (dot11RSNAEnabled) wpa=2 # wpa_passphrase=secret passphrase wpa_passphrase=87654321 # Set of accepted key management algorithms # (WPA-PSK, WPA-EAP, or both). wpa_key_mgmt=WPA-PSK # Set of accepted cipher suites (encryption algorithms) # for pairwise keys wpa_pairwise=CCMP # ieee80211n: Whether IEEE 802.11n (HT) is enabled # 0 = disabled (default) # 1 = enabled ieee80211n=1 # ht_capab: HT capabilities (list of flags) # Supported channel width set: [HT40-] = both 20 MHz and 40 MHz # with secondary channel below the primary channel; # [HT40+] = both 20 MHz and 40 MHz with secondary channel upon # the primary channel # Note:There are limits on which channels can be used with HT40- and # HT40+.Following table shows the channels that may be available for # HT40- and HT40+ use per IEEE 802.11n Annex J: # freq HT40- HT40+ # 2.4 GHz 5-13 1-7 (1-9 in Europe/Japan) # 5 GHz 40,48,56,64 36,44,52,60 # Short GI for 20 MHz: [SHORT-GI-20] (disabled if not set) # Short GI for 40 MHz: [SHORT-GI-40] (disabled if not set) ht_capab=[SHORT-GI-20][SHORT-GI-40][HT40]
위의 설정대로라면, 아래 표와 같이 실행된다.
SSID | rtwap |
암호화 | WPA2 |
인증방식 | PSK |
채널 | 6 |
프로토콜 | 802.11g |
접속 상태 확인
현재 Station 이 접속되어 있는지를 확인하는 명령은 아래와 같다.
#hostapd_cli all_sta
Station 이 접속되지 않은 경우는 아래와 같이 출력된다.
#./hostapd_cli all_sta Selected interface 'wlan0'
Station 이 접속된 경우에는 다음과 같이 출력된다.
Selected interface 'wlan0' 00:08:9f:d8:00:23 dot11RSNAStatsSTAAddress=00:08:9f:d8:00:23 // 접속된 Station 의 MAC 주소 dot11RSNAStatsVersion=1 dot11RSNAStatsSelectedPairwiseCipher=00-0f-ac-4 dot11RSNAStatsTKIPLocalMICFailures=0 dot11RSNAStatsTKIPRemoteMICFailures=0 hostapdWPAPTKState=11 hostapdWPAPTKGroupState=0
Broadcom (무선 카메라)
Broadcom 의 경우, 받은 파일에서 아래와 같이 경로를 이동한다.
#cd bcm/bcm43362/dhd/linux #vi build.sh
빌드를 위해 툴체인과 커널 경로를 아래와 같이 추가해야 한다.
make dhd-cdc-arm-sdmmc-gpl CROSS_COMPILE=arm-none-linux-gnueabi- LINUXDIR=/usr/src/linux
컴파일 및 모듈 올리기
이제 빌드할 차례다.
#make clean #./build.sh
성공적으로 빌드가 되었다면, dhd.ko 파일이 보인다. 이를 커널에 올리기 위해서는 firmware 와 nvram 파일이 필요하다. 아래처럼 파일명과 경로를 함께 적어주어야 한다.
#insmod dhd.ko "firmware_path=fw_bcmdhd_user.bin nvram_path=NVRAM_20130221.txt"
WPA_Supplicant 빌드하기
realtek 과는 달리 wpa_supplicant 빌드 시, 참조 80211 라이브러리를 찾지못해 에러가 발생한다. 이럴 때는 빌드 옵션 파일 defconfig 을 다운로드받아 빌드한다.
드라이버 수정사항
Soft AP 로 동작시 kernel exception 오류 발생하여 아래와 같이 코드(src/dhd/sys/dhd_linux.c) 를 수정한다.
... #if defined(SOFTAP) if (ap_fw_loaded && !(dhd->dhd_state & DHD_ATTACH_STATE_CFG80211)) { // 주석 제거 printf(" ======================================\n\n"); printf(" =====AP %d interface device created\n", ifp->idx); /* semaphore that the soft AP CODE waits on */ flags = dhd_os_spin_lock(&dhd->pub); if(ifp->idx == 1) { /* save ptr to wl0.1 netdev for use in wl_iw.c */ ap_net_dev = ifp->net; /* signal to the SOFTAP 'sleeper' thread, wl0.1 is ready */ up(&ap_eth_ctl.sema); //cgkim_test command ·Î Çҽÿ¡ check } else if(ifp->idx == 2) ap_net_dev2 = ifp->net; dhd_os_spin_unlock(&dhd->pub, flags); } // 주석 제거 #endif ...
printf 문 제거방법
처음 릴리즈 된 드라이버의 경우, 동작 마다 많은 디버깅 메세지가 출력된다. 이를 조절할 수 있는데, wl/sys/wl_iw.c 파일을 다음과 같이 수정하면 된다.
#define WL_ERROR(x) // printf x 제거 #define WL_TRACE(x) #define WL_ASSOC(x) #define WL_INFORM(x) #define WL_WSEC(x) #define WL_SCAN(x)
동작 확인
여기서는 BCM 에서 제공하는 wl 명령어를 사용하여 동작을 확인해보겠다. 참고로 wpa_supplicant 로도 동작이 가능해야 한다.
Station 모드
AP 스캔 및 결과 보기
wl scan wl scanresults
AP 접속하기(암호없음)
wl down wl up wl infra 1 wl auth 0 wl wpa_auth 0 wl wsec 0 wl ssid itx sleep 3 wl status
AP 접속하기(WEP40 OPEN)
wl disassoc wl infra 1 wl auth 0 wl wpa_auth 0 wl wsec 1 wl addwep 0 1234567890 wl ssid itx sleep 3 wl status
AP 접속하기(WEP40 SHARED)
wl down wl up wl infra 1 wl auth 1 wl wpa_auth 0 wl wsec 1 wl addwep 0 1234567890 wl ssid itx sleep 3 wl status
AP 접속하기(WEP104 OPEN)
wl down wl up wl infra 1 wl auth 0 wl wpa_auth 0 wl wsec 1 wl addwep 0 aaaaaaaaaaaaa wl ssid itx sleep 3 wl status
AP 접속하기(WEP104 SHARED)
wl down wl up wl infra 1 wl auth 2 wl wpa_auth 0 wl wsec 1 wl addwep 0 aaaaaaaaaaaaa wl ssid itx sleep 3 wl status
AP 접속하기(WPA-TKIP)
wl down wl up wl infra 1 wl wsec 2 wl sup_wpa 1 wl wpa_auth 4 wl set_pmk 77777777 wl ssid itx sleep 3 wl status
AP 접속하기(WPA-AES)
wl down wl up wl infra 1 wl wsec 4 wl sup_wpa 1 wl wpa_auth 4 wl set_pmk 77777777 wl ssid itx sleep 3 wl status
AP 접속하기(WPA2-TKIP)
wl down wl up wl infra 1 wl wsec 2 wl sup_wpa 1 wl wpa_auth 128 wl set_pmk 77777777 wl ssid itx sleep 3 wl status
AP 접속하기(WPA2-AES)
wl down wl up wl infra 1 wl wsec 4 wl sup_wpa 1 wl wpa_auth 128 wl set_pmk 77777777 wl ssid itx sleep 3 wl status
Soft AP 모드
암호없음(SSID : ITX)
./wl down ./wl apsta 1 ./wl up ./wl ssid -C 1 ITX ./wl bss -C 1 up ifconfig wl0.1 up
WPA2-AES(SSID : ITX, 암호 : 11111111)
./wl down ./wl apsta 1 ./wl ssid -C 1 $1 ./wl -i wl0.1 wsec 4 ./wl -i wl0.1 set_pmk $2 ./wl -i wl0.1 wpa_auth 0x80 ./wl bss -C 1 up ./wl up
FAQ
Kernel Configuration 을 수정했다면
드라이버를 재빌드 해주는 것이 좋다. 설사, WiFi 또는 네트워크와 관련 없는 옵션이라고 할지라도 말이다. 경험에 비춰보자면, iptable 관련 커널 옵션을 enable 하고, 커널 이미지만 빌드한 상태에서 기존의 WiFi 드라이버를 올렸을 때, 커널 패닉이 발생하는 경우가 있었다.
이때, 드라이버를 수정된 커널을 참조하여 재빌드 한 결과, 정상적으로 로딩 되었다.
WIFI 동작 중 커널 패닉 발생했다면
아래와 같은 메세지를 뿌리고, 죽었다면 원인은 무엇일까?
[ 18.153788] WARNING: driver bcmsdh_sdmmc did not remove its interrupt handler! [ 18.184455] kernel BUG at drivers/mmc/core/sdio_io.c:28! ... [ 18.153788] WARNING: driver bcmsdh_sdmmc did not remove its interrupt handler! [ 18.184455] kernel BUG at drivers/mmc/core/sdio_io.c:28! [ 18.190260] Unable to handle kernel NULL pointer dereference at virtual address 00000000 [ 18.205009] pgd = c0004000 [ 18.207868] [00000000] *pgd=00000000 [ 18.212061] Internal error: Oops: 817 [#1] PREEMPT [ 18.216863] last sysfs file: [ 18.219835] Modules linked in: dhd mac80211 lib80211_crypt_wep lib80211_crypt_tkip lib80211_crypt_ccmp lib80211 cfg80211 rear adc sensor relay [ 18.232721] CPU: 0 Not tainted (2.6.37_IPNC_DM365_4.1.0+ #2) [ 18.238741] pc : [<c002c2ec>] lr : [<c02f48e0>] psr: 60000013 [ 18.238757] sp : c2b53cd0 ip : c2b53bd8 fp : c2b53cdc [ 18.250231] r10: c2b53d3c r9 : 00000001 r8 : 0000a040 [ 18.255461] r7 : 00000001 r6 : bf0a5300 r5 : 00000004 r4 : 00000004 [ 18.261994] r3 : 00000000 r2 : 00000000 r1 : 00000000 r0 : 00000042 [ 18.268529] Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment kernel [ 18.275846] Control: 0005317f Table: 82b24000 DAC: 00000017 [ 18.281599] Process ksdioirqd/mmc1 (pid: 739, stack limit = 0xc2b52270) [ 18.288219] Stack: (0xc2b53cd0 to 0xc2b54000)
위 문제가 발생한 보드는 QA 에 전달된 것으로서, Soft AP 모드로 동작시 커널 패닉이 발생하였고, 회로 담당자가 시방을 잘못했다고, 시인했던 보드다.
에러 로그의 backtrace 함수인 drivers/mmc/core/sdio_io.c:28 를 보면, mmc host 쪽에 claim(복구를 요구한다) 하지만, 이마저도 되지 않아 패닉이 발생한 것으로 보인다.
해당 함수인 sdio_claim_host 의 경우, TI 커널이나 일반 커널이나 코드는 동일하다.
H/W 적으로 복구 및 재 초기화가 안된다면, 재부팅 밖에는 방법이 없다.