타겟보드에 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 에서 제공하는 드라이버에 있는 것을 사용해야 한다. 그렇지 않고, 웹 상의 최신버전을 사용하면 동작하지 않는다.

(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  

에러없이 빌드되었다면, 원하는 바이너리 파일들이 만들어졌을 것이다. 이와 함께 설정 파일들을 타겟에 복사한다.
이제 각각의 동작을 확인해보자!

아래처럼 wpa_supplicant 를 실행한다. 참고로 wlan 인터페이스는 wlan2 이다.

#wpa_supplicant -iwlan2 -Dwext -c ./wpa_0_8.conf -dd &
wpa_cli -p /var/run/wpa_supplicant scan
wpa_cli -p /var/run/wpa_supplicant scan_results
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
  1. 암호가 틀리더라도 ssid 가 존재하면, iwconfig 상에서 접속된 것처럼 나온다.
  2. 실제 통신(ping)을 해보면, 안된다.
  3. 보안상의 위험요소와 설정(key 값) 상의 혼동을 줄 수 있기 때문에 권장하지 않는다.
  4. 암호가 틀렸을 시, 접속에 실패했다는 것을 구분할 뭔가가 필요하다.
# 암호가 숫자(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
# 암호가 숫자(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
  1. 암호의 길이를 숫자의 경우 무조건 숫자(26자리), 문자(13글자)를 글자수를 맞춰 넣어야 한다. 사용자가 외우기도 어렵다.
  2. 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
# 암호가 숫자(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
  1. 암호가 맞지 않으면, 접속(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 를 처음 실행할 때, 자동으로 접속된다.

wpa_cli -p /var/run/wpa_supplicant remove_network 0
wpa_cli -p /var/run/wpa_supplicant wps_pbc any
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 모드를 실행하기 전에 Station 모드로 실행하는 프로세스들(network manager or wireless tools or wpa_supplicant)을 disable 시켜야 한다.
그리고 아래와 같이 실행한다.

#hostapd rtl_hostapd_2G.conf -B 

동작은 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"

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
...

처음 릴리즈 된 드라이버의 경우, 동작 마다 많은 디버깅 메세지가 출력된다. 이를 조절할 수 있는데, 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 로도 동작이 가능해야 한다.

wl scan
wl scanresults
wl down
wl up
wl infra 1
wl auth 0
wl wpa_auth 0
wl wsec 0
wl ssid itx
sleep 3
wl status
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
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
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
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
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
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
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
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
./wl down
./wl apsta 1
./wl up
./wl ssid -C 1 ITX
./wl bss -C 1 up
ifconfig wl0.1 up
./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

드라이버를 재빌드 해주는 것이 좋다. 설사, WiFi 또는 네트워크와 관련 없는 옵션이라고 할지라도 말이다. 경험에 비춰보자면, iptable 관련 커널 옵션을 enable 하고, 커널 이미지만 빌드한 상태에서 기존의 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 적으로 복구 및 재 초기화가 안된다면, 재부팅 밖에는 방법이 없다.

  • computer/itx/wifi_bring_up_하기.txt
  • Last modified: 3 years ago
  • by likewind