全体の流れ
- x86_64対応のdriverをdownloadし展開して修正する
- tarballを展開するかgit clone
- Makefileに変更: CHIPSETへ追加、LINUX_SRCの変更
- common/utusb_dev_id.cへUSB_DEVICE_ID追加
- conf/RT2870STA.datを修正
- os/linux/config.mkを修正 (-Wno-error=incompatible-pointer-types)
- os/linux/rt_linux.cを修正 (__vfs_read, __vfs_writeへ変更)
- Kernelの修正とrebuild (CONFIG_WIRELESS_EXT=y, CONFIG_WEXT_PRIV=y)
- buildしてinstall
- make
- make install (もしくは手動でcopy)
- depmod -a
- Debian specificなnetworkの設定 (or NetworkManagerやwicdで設定する)
- /etc/Wireless/RT2870STA/RT2870STA.datの調整
- /etc/networking/interfacesの変更
- modprobe mt7650u_sta
- service networking restart
今回遭遇した問題
主にdriverのbuildに際して問題があった。- incompatible-pointer-typesのwarningがerror扱いされてbuildが止まる
- net_device、iw_handler_defなどstructの初期化を行う部分でerrorが出る
incompatible-pointer-types対策
1つ目のincompatible-pointer-typesに関しては、gccに-Wno-error=incompatible-pointer-typesを渡して見逃してもらった。os/linux/rt_linux.cのWFLAGSに直接書き込むという力技を使ったが、たぶんもっと適切な場所 (もしくは方法)があると思う。unknown field対策
2つ目のstructの初期化 (designated initializer)に関しては、kernel moduleとしてbuildする際に見ているLinux kernelの設定に問題があった。具体的には"error: unknown field 'private' specified in initializer"といったerrorが出るのだが、kernel sourceの側で必要なsymbolを有効にしていないのが原因だった。必要なのはCONFIG_WIRELESS_EXTとCONFIG_WEXT_PRIV。
これらはmake menuconfigで'/'を使って調べると出て来るが、依存関係の問題なのか有効にできなかったのでnet/wireless/Kconfigを直接編集して対応。make oldconfigを実行して.configに2つが=yで出力されているのを確認して、kernelをrebuild & install。
以上でdriver (mt7650u_sta.ko)をbuildできる。
Pitfalls
- 普段楽をしてmake-kpkgでkernel packageをbuildしているので、driverをinstallした後にdepmod -aを忘れていた
- SSIDがstealthなので/etc/networking/interfacesあたりにap_scan=1とかssid_scan=1を設定する必要があった
追記
Rebootが必要とあるが、本当に必要なのはkernelでCONFIG_WIRELESS_EXTとCONFIG_WEXT_PRIVが有効になっていない場合に新しくbuildしたkernelに切り替える時だけで、後はservice networking restartとかmodprobe (-r) mt7650u_staでどうにかなる。
参考リンク
Driverのsource code
- [sanrath / MediaTek_mt7610u_STA_driver_Linux 64bit — Bitbucket](https://bitbucket.org/sanrath/mediatek_mt7610u_sta_driver_linux-64bit.git)
GW-460DをLinuxで使う方法について
- [パリッと行こう!: Planex GW-450Dをlinuxで使う](http://paritparit.blogspot.jp/2013/08/planex-gw-450dlinux.html)
Buildに必要なLinux kernelの設定について
- [BeagleBoard上のAndroidでWiFiを使う - h_kojimaの日記](http://d.hatena.ne.jp/h_kojima/20110617/1308324429)
/etc/Wireless/RT2870STA/RT2870STA.datの読み込みに失敗する問題への対策
- [neuralassemblyのメモ: Raspberry Pi 2 + kernel 4.1.6 で5GHz対応WifiドングルGW-450Dを動かした](http://neuralassembly.blogspot.jp/2015/09/raspberry-pi-2-kernel-416-5ghzwifigw.html)
Cのdesignated initializerについて
- [Designated Initializer - BOOLEANLABEL](http://d.hatena.ne.jp/fd0/20100213/p1)
- [プログラミング言語 C の新機能](http://seclan.dll.jp/c99d/c99d07.htm#dt19991025)
- [Using and Porting the GNU Compiler Collection (GCC) - C 言語ファミリに対する拡張機能](http://www.asahi-net.or.jp/~wg5k-ickw/html/online/gcc-2.95.2/gcc_4.html#SEC81)
- [Designated Inits - Using the GNU Compiler Collection (GCC)](https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html)
0 件のコメント:
コメントを投稿