반응형


연구 목적으로 compat-wireless 패키지에 들어 있는 Qualcomm Atheros 칩셋 중 하나인 ath9k의 소스코드를 고치고 있는데,아무리 봐도 내가 원하는 기능을 해당 코드에서 달성할 수 없는 것 같다. 디바이스 드라이버(device driver) 레벨보다 더 하위 레벨로 내려가야 할 것 같아서 찾아보니, 내가 갖고 있는 USB 랜카드(TP-LINK TL-WN722N)는 htc_9271.fw 라는 이름의 펌웨어를 쓴다는 것을 알게 되었다.


해당 펌웨어의 소스코드가 있는지 찾아 보니, 반갑게도 Qualcomm Atheros에서 htc 9271 펌웨어 소스코드를 오픈소스로 git에 올려 놓았다.


아래와 같은 순서대로 하면 ath9k 펌웨어 개발 환경을 얻을 수 있다. (주의사항: ath9k 디바이스 드라이버와는 다르다. 디바이스 드라이버는 compat-wireless 소스코드를 받아서 빌드해야 한다.)



1. Git에서 소스코드 다운받기 (https://github.com/qca/open-ath9k-htc-firmware)

 $ git clone https://github.com/qca/open-ath9k-htc-firmware



2. make 명령으로 toolchain 다운받고 설치하기

 $ cd ./open-ath9k-htc-firmware

 $ make toolchain

(한참 걸린다. 약 30분~1시간)



3. Firmware 빌드하기 

(참고로 cmake가 필요하다. 없으면 sudo apt-get install cmake 로 설치하자.)

 $ make -C target_firmware

(그리 오래 걸리지 않는다.)



4. open-ath9k-htc-firmware/target_firmware 디렉토리에 .fw 파일이 생성되어 있으면 빌드 성공.

htc_9271.fw 파일을 /lib/firmware/ 에 복사한 뒤에, 기존에 설치된 ath9k_htc 커널 모듈을 지우고 재설치한다.

$ sudo cp htc_9271.fw /lib/firmware/

$ sudo rmmod ath9k_htc

$ sudo modprobe ath9k_htc





반응형
블로그 이미지

Bryan_

,
반응형

OS: Ubuntu 계열 (11.04 32bit, 12.04 64bit 에서 테스트)

무선랜카드: IPTIME N150UA (Ralink RT2870/RT3070 칩셋)



<문제의  배경>

  • Ubuntu 시스템에서 실험을 목적으로 무선랜(Wi-Fi) 디바이스 드라이버(device driver) 코드를 수정하고 재설치하기 위해 compat-wireless-3.6.8-1 의 소스코드를 수정하였다.
  • 개발의 대상이 되는 디바이스 드라이버는 Atheros 계열의 ath9k와 ath9k-htc였고, 이에 따라 compat-wireless 소스코드에서 컴파일 대상을 ath9k로 한정지었다.
    ( $ ./scripts/driver-select ath9k )
  • 저렇게 설정하고 나서 compat-wireless를 컴파일하면($ sudo make install), 원래 Ubuntu에 들어 있던 네트워크 관련 커널모듈을 전부 교체해 버리게 된다. 즉, mac80211, cfg80211과 같이 리눅스에서 무선랜 제어에 사용하는 공통 커널 모듈까지 교체된다는 얘기.
  • 문제는 컴파일 대상 디바이스가 ath9k로 한정되는 바람에 Atheros ath9k 칩셋이 아닌 다른 USB 무선랜카드 (e.g. Ralink 계열, Broadcom 계열 등)는 인식을 못하는 경우가 생긴다.



<문제 상황>

ath9k 디바이스 드라이버를 개발하기 전에 쓰던 USB 무선랜카드는 IPTIME N150UA였다. compat-wireless 개발환경을 사용하고 나서 해당 무선랜카드를 PC에 꽂으니 커널 출력 메세지(dmesg 또는 /var/log/kern.log)에서 아래와 같이 수많은 기능들을 이해할 수 없다는 에러를 뿌린다.

$ dmesg

[338283.992800] usb 1-1.1: new high-speed USB device number 11 using ehci_hcd

[338284.102160] usb 1-1.1: New USB device found, idVendor=148f, idProduct=3070

[338284.102165] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3

[338284.102168] usb 1-1.1: Product: 802.11 n WLAN

[338284.102171] usb 1-1.1: Manufacturer: Ralink

[338284.102173] usb 1-1.1: SerialNumber: 1.0

[338284.122269] Compat-wireless backport release: compat-wireless-v3.6.8-1

[338284.122273] Backport based on linux-stable.git v3.6.8

[338284.122274] compat.git: linux-stable.git

[338284.124318] cfg80211: Calling CRDA to update world regulatory domain

[338284.129011] rt2x00lib: disagrees about version of symbol ieee80211_register_hw

[338284.129016] rt2x00lib: Unknown symbol ieee80211_register_hw (err -22)

[338284.129022] rt2x00lib: disagrees about version of symbol ieee80211_get_hdrlen_from_skb

[338284.129024] rt2x00lib: Unknown symbol ieee80211_get_hdrlen_from_skb (err -22)

[338284.129031] rt2x00lib: disagrees about version of symbol ieee80211_wake_queue

[338284.129033] rt2x00lib: Unknown symbol ieee80211_wake_queue (err -22)

[338284.129039] rt2x00lib: disagrees about version of symbol ieee80211_get_buffered_bc

[338284.129041] rt2x00lib: Unknown symbol ieee80211_get_buffered_bc (err -22)

[338284.129048] rt2x00lib: disagrees about version of symbol wiphy_rfkill_set_hw_state

[338284.129050] rt2x00lib: Unknown symbol wiphy_rfkill_set_hw_state (err -22)

[338284.129060] rt2x00lib: disagrees about version of symbol ieee80211_queue_delayed_work

[338284.129061] rt2x00lib: Unknown symbol ieee80211_queue_delayed_work (err -22)

[338284.129065] rt2x00lib: disagrees about version of symbol wiphy_rfkill_stop_polling

[338284.129066] rt2x00lib: Unknown symbol wiphy_rfkill_stop_polling (err -22)

[338284.129069] rt2x00lib: disagrees about version of symbol ieee80211_ctstoself_get

[338284.129071] rt2x00lib: Unknown symbol ieee80211_ctstoself_get (err -22)

[338284.129081] rt2x00lib: disagrees about version of symbol ieee80211_rx

[338284.129083] rt2x00lib: Unknown symbol ieee80211_rx (err -22)

[338284.129088] rt2x00lib: disagrees about version of symbol ieee80211_iterate_active_interfaces

[338284.129090] rt2x00lib: Unknown symbol ieee80211_iterate_active_interfaces (err -22)

[338284.129093] rt2x00lib: disagrees about version of symbol ieee80211_free_txskb

[338284.129095] rt2x00lib: Unknown symbol ieee80211_free_txskb (err -22)

[338284.129102] rt2x00lib: disagrees about version of symbol ieee80211_tx_status

[338284.129104] rt2x00lib: Unknown symbol ieee80211_tx_status (err -22)

[338284.129107] rt2x00lib: disagrees about version of symbol ieee80211_stop_queue

[338284.129109] rt2x00lib: Unknown symbol ieee80211_stop_queue (err -22)

[338284.129112] rt2x00lib: disagrees about version of symbol ieee80211_stop_queues

[338284.129114] rt2x00lib: Unknown symbol ieee80211_stop_queues (err -22)

[338284.129119] rt2x00lib: disagrees about version of symbol wiphy_rfkill_start_polling

[338284.129121] rt2x00lib: Unknown symbol wiphy_rfkill_start_polling (err -22)

[338284.129124] rt2x00lib: disagrees about version of symbol ieee80211_iterate_active_interfaces_atomic

[338284.129126] rt2x00lib: Unknown symbol ieee80211_iterate_active_interfaces_atomic (err -22)

[338284.129134] rt2x00lib: disagrees about version of symbol ieee80211_channel_to_frequency

[338284.129136] rt2x00lib: Unknown symbol ieee80211_channel_to_frequency (err -22)

[338284.129139] rt2x00lib: disagrees about version of symbol ieee80211_unregister_hw

[338284.129140] rt2x00lib: Unknown symbol ieee80211_unregister_hw (err -22)

[338284.129146] rt2x00lib: disagrees about version of symbol ieee80211_beacon_get_tim

[338284.129148] rt2x00lib: Unknown symbol ieee80211_beacon_get_tim (err -22)

[338284.129150] rt2x00lib: disagrees about version of symbol ieee80211_rts_get

[338284.129152] rt2x00lib: Unknown symbol ieee80211_rts_get (err -22)

[338284.129159] rt2x00lib: disagrees about version of symbol ieee80211_queue_work

[338284.129161] rt2x00lib: Unknown symbol ieee80211_queue_work (err -22)

[338284.130166] cfg80211: World regulatory domain updated:

[338284.130170] cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)

[338284.130173] cfg80211:   (2402000 KHz - 2472000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)

[338284.130175] cfg80211:   (2457000 KHz - 2482000 KHz @ 20000 KHz), (300 mBi, 2000 mBm)

[338284.130177] cfg80211:   (2474000 KHz - 2494000 KHz @ 20000 KHz), (300 mBi, 2000 mBm)

[338284.130179] cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)

[338284.130180] cfg80211:   (5735000 KHz - 5835000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)

$


USB 연결에는 이상이 없는지 확인해 보니 USB 장치 수준에서는 제대로 인식을 하고 있다.

$ lsusb

Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub

Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub

Bus 001 Device 012: ID 148f:3070 Ralink Technology, Corp. RT2870/RT3070 Wireless Adapter

$




<해결 방법>

원인이 명확하게 Compat-wireless 개발환경이기 때문에 해결 방법은 간단하다.

Ralink 계열도 이해할 수 있도록 ath9k 뿐만 아니라 다른 모든 칩셋의 소스코드를 다 컴파일하면 된다. 그러면 다른 칩셋 계열의 기능을 이해할 수 있는 mac80211, cfg80211 커널 모듈이 새로 생성되고, 이들이 자동으로 시스템의 /lib/modules/ 에 복사된다.


  (먼저 compat-wireless 개발환경의 최상위 디렉토리로 이동한다.)

$ ./scripts/driver-select restore    <-- 소스코드 전체를 컴파일하도록 기본 설정으로 되돌림

$ sudo make install

  (모든 칩셋을 다 컴파일하기 때문에 성능이 안좋은 PC에서는 꽤 긴 시간이 걸린다.)


$ sudo make wlunload      <-- 기존에 로드된 무선네트워크 관련 모듈을 unload 시킨다.


위와 같이 하고 나서 USB 디바이스 드라이버에 해당하는 모듈을 sudo modprobe를 이용해서 load한다. (예: $ sudo modprobe rt2800usb) 콘솔 화면에서 무슨 모듈이 unload되었는지 확인하고 그것들을 다시 load하면 되는데, 무엇을 load해야 할 지 잘 모르는 경우가 있을 수도 있다. 

그럴 때는 USB 무선랜카드를 뽑았다가 다시 PC에 꽂으면 된다또는 깔끔하게 재부팅하는 것도 좋은 방법이다.





반응형
블로그 이미지

Bryan_

,