ネットワーク

【無線LAN】組み込みボードで無線LANを動かしてみた(Intel N6300編)②HW接続インタフェースを調べる、BD-SABRE-LITEでNIT6X_PCIEを動かす

【※ 当記事は2020年7月2日時点の情報です】

ペイヴメント(@pavement1234)です。

エンジニア
エンジニア

古いパソコンから抜き取ったN-6300というIntelの無線LANカードを例えばRaspberry Piみたいな組込デバイスに接続したい

こんな悩みを解決します。

今回やることは2つ。

  1. HW接続インタフェースを調べる
  2. BD-SABRE-LITEでNIT6X_PCIEを動かす

バージョン情報

Linux Kernel 3.14

HW接続インタフェース

無線LANカードのHW接続インタフェースにはどんな種類があるか?調べてみました。

①HW接続インタフェースとは?

インターフェースとは?を読んでみました。要はUSBとかPCI Expressみたいな話です。

ハードウェアインターフェースとは、複数の装置を接続して通信する際の仕様で、コネクタの形状や電気信号の形式などを定めている。コンピュータ内部のデータ伝送、コンピュータと周辺機器のデータ伝送、コンピュータ間の通信など、用途に合わせて様々なインターフェースが存在する。例としてUSB、SATA、IEEE 1394、PCI Express、HDMIなどの規格、およびこれらのコネクタなどが挙げられる。

また、接続先がコンピュータネットワーク(LAN)の場合は特にネットワークインターフェースと呼ばれることもあり、イーサネット(Ethernet)や無線LAN(Wi-Fi)などの通信規格、およびコネクタや差込口(ポート)、拡張カード、通信チップなどを指す。

②無線LANカードのHW接続インタフェースとは?

12年ぐらい前はPCカード(PCMCIA)をよく見かけましたが最近全く見ません。無線LANカードのHW接続インタフェースは以下の4つぐらいと認識しています。

USB
PCIe
SDIO
低速インタフェース(UART、SPI)

それぞれ具体例をご紹介します。

USB

いわゆるUSBドングルと呼ばれる無線LAN子機(STA)。搭載されている無線チップセット・ドライバによっては無線LAN親機(AP)やモニターモードに変身できるものもあります。お手軽なのでつい買ってしまい、以下のように増えていくわけです(写真はBluetoothのUSBドングルも含まれています)。

実は組込Linuxボードを家の無線ルータに繋ぐときUSBドングルを使うことが多く、この連載記事もUSBドングルを使えばサクサク進むのですが芸がないので、あえてminiPCIeを選択しハードルを上げている次第です。

PCIe

今回の記事で紹介しているN-6300の物理層はPCIe(PCI Express)で、コネクタはminiPCIe(Mini PCI Express)という小型のコネクタが採用されています。ノートPCの無線LANは、ちょっと前までminiPCIeが多く使われていましたが、ここ3年ぐらいでM.2(新しい規格)が主流になっている印象です。この連載でもいつかM.2の無線LANカードも紹介しようと考えています。ちなみにminiPCIeと同じコネクタに挿さるmSATA(mini SATA)という規格があるのでご注意を…。

SDIO

SDIOとはSDカードとピン互換のインタフェースで、GPS、Bluetooth、無線LANなどの機能を持っていることが多いです。SDIOの無線LANカードを一般ユーザが使うケースは稀と思います。低消費電力が売りらしく、携帯電話の無線LANにも多く採用されていますが、携帯電話にSDカードが挿さっているわけではなく、無線チップとCPUがSDIOピンで接続されているようです。

ちなみに、SDIOカードタイプの無線LANカードも市販されているため、もし入手できたら連載のどこかで紹介したいと考えています。

低速インタフェース(UART、SPI)

低速インタフェース(UART、SPI)が採用された無線LANカードは、SDIOよりも珍しいと思います。高速インタフェース(USB、PCIe、SDIO)がついていないマイコンで採用されていることが多い様子。いつかチャレンジしてみたいです。

BD-SABRE-LITEでNIT6X_PCIEを動かす

【組込Linuxボード】Boundary Devices社のSabre Liteボード(i.MX6)を動かしてみたを読みながら起動。大丈夫そうです。

①NIT6X_PCIEが到着した

こんな感じです。

なんか長いネジが付いてまして。こんな感じに使います。

②認識させてみた

TeraTermでUART接続し、root(パスワードなし)でログイン。PCIデバイスを一覧表示させるコマンドlspciを打ってみましたが…。何も表示されませんでした。

root@nitrogen6x:~# lspci

当たり前だがインストールされたドライバを一覧表示させるコマンドlsmodを打ってみてもWLANモジュールは出てこない。

root@nitrogen6x:~# lsmod
Module Size Used by
ov5640_camera_mipi 53880 0
mxc_v4l2_capture 25411 1 ov5640_camera_mipi
ipu_bg_overlay_sdc 4303 1 mxc_v4l2_capture
ipu_still 1811 1 mxc_v4l2_capture
ipu_prp_enc 4919 1 mxc_v4l2_capture
ipu_csi_enc 3097 1 mxc_v4l2_capture
adv7180_tvin 8599 0
ipu_fg_overlay_sdc 5199 1 mxc_v4l2_capture
v4l2_int_device 1936 3 ov5640_camera_mipi,adv7180_tvin,mxc_v4l2_capture
snd_soc_fsl_asrc 24344 0

接触不良かもしれません。

シャットダウンして電源OFF。ネジを外し、N-6300を深く挿して再びネジ止め。再び電源ON。

再びlspciを打ったらPCI bridgeとN-6300を認識しました。

root@nitrogen6x:~# lspci
00:00.0 PCI bridge: Synopsys, Inc. Device abcd (rev 01)
01:00.0 Network controller: Intel Corporation Centrino Ultimate-N 6300 (rev 35)

lsmodも打つと、iwlwifi、cfg80211も出てきました。
もうちょっとハマると思ったのでやや拍子抜けでした(もうちょっと試行錯誤したかった…)。

root@nitrogen6x:~# lsmod
Module Size Used by
ov5640_camera_mipi 53880 0
mxc_v4l2_capture 25411 1 ov5640_camera_mipi
ipu_bg_overlay_sdc 4303 1 mxc_v4l2_capture
ipu_still 1811 1 mxc_v4l2_capture
ipu_prp_enc 4919 1 mxc_v4l2_capture
ipu_csi_enc 3097 1 mxc_v4l2_capture
adv7180_tvin 8599 0
ipu_fg_overlay_sdc 5199 1 mxc_v4l2_capture
v4l2_int_device 1936 3 ov5640_camera_mipi,adv7180_tvin,mxc_v4l2_capture
iwlwifi 70357 0
cfg80211 376620 1 iwlwifi
snd_soc_fsl_asrc 24344 0

③N-6300を無線ルータに繋いでみる

さて、N-6300がPCIeデバイスとして認識され、無線LANドライバのインストールまではできました。しかしこいつはまだ赤ちゃんみたいなもので、無線LAN子機(STA)として動かすためにはIPアドレスを設定したり、無線LAN親機(AP)に繋いだりする必要があります。

cfg80211が認識されているようなのでnetlink系です(こんど詳しく説明します)。netlink系の無線LAN設定ツールiwを打ち込んでみましたが、コマンドが入ってません。ubuntuじゃないのでapt-getが使えないため、iwをクロスコンパイルする感じ。無線LANルータに繋がってないので当然インターネットにもつながってません。楽しくなってきました。

root@nitrogen6x:~# iw
-sh: iw: not found

ネットワークインタフェースの設定ツールifconfigを打つと、eth0は見えていますがwlan0はいません。

root@nitrogen6x:~# ifconfig
eth0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx
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)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 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)

(WPA2接続を行うための)IEEE802.11iサプリカントwpa_supplicantは…。居ますが、iwが使えないので無線LAN初期化ができません。ハードルが高い。

root@nitrogen6x:~# wpa_supplicant
Successfully initialized wpa_supplicant
wpa_supplicant v2.3
Copyright (c) 2003-2014, Jouni Malinen <j@w1.fi> and contributors

This software may be distributed under the terms of the BSD license.
See README for more details.

usage:
wpa_supplicant [-BddhKLqqtuvW] [-P<pid file>] [-g<global ctrl>] \
[-G<group>] \
-i<ifname> -c<config file> [-C<ctrl>] [-D<driver>] [-p<driver_param>] \
[-b<br_ifname>] [-e<entropy file>] \
[-o<override driver>] [-O<override ctrl>] \
[-N -i<ifname> -c<conf> [-C<ctrl>] [-D<driver>] \
[-p<driver_param>] [-b<br_ifname>] [-I<config file>] …]

drivers:
nl80211 = Linux nl80211/cfg80211
wext = Linux wireless extensions (generic)
hostap = Host AP driver (Intersil Prism2/2.5/3)
wired = Wired Ethernet driver
options:
-b = optional bridge interface name
-B = run daemon in the background
-c = Configuration file
-C = ctrl_interface parameter (only used if -c is not)
-i = interface name
-I = additional configuration file
-d = increase debugging verbosity (-dd even more)
-D = driver name (can be multiple drivers: nl80211,wext)
-e = entropy file
-g = global ctrl_interface
-G = global ctrl_interface group
-K = include keys (passwords, etc.) in debug output
-t = include timestamp in debug messages
-h = show this help text
-L = show license (BSD)
-o = override driver parameter for new interfaces
-O = override ctrl_interface parameter for new interfaces
-p = driver parameters
-P = PID file
-q = decrease debugging verbosity (-qq even less)
-u = enable DBus control interface
-v = show version
-W = wait for a control interface monitor before starting
-N = start describing new interface
example:
wpa_supplicant -Dnl80211 -iwlan0 -c/etc/wpa_supplicant.conf

iwをPCで動かしてみた

BD-SABRE-LITE向けLinuxイメージ(Yocto)に無線LANの設定ツールiwが入っていなかったため初期化できませんでした。

iwを組み込みデバイスにインストールのは追々やるとして、そもそも無線LANドライバの初期化ってどうやるのか。

とりあえずLinuxの無線LANについて俯瞰すべくワイヤレス設定を読みました。

まず、ip linkというコマンドを打ってwlan0が生成されているか確認せよ、と書いてあるのですぐにip linkと打ってみたら…。wlan0ありません。

# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: can0: <NOARP40000> mtu 16 qdisc noop qlen 10
link/[280] 3: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:19:b8:06:ca:7f brd ff:ff:ff:ff:ff:ff
4: sit0@NONE: <NOARP> mtu 1480 qdisc noop
link/sit 0.0.0.0 brd 0.0.0.0

wlan0が無いときは、dmesgでiwlwifiのファームが読み込まれてるか?iwlwifiのエラーが発生してないか?調べてみろと書いてあるので実行してみると…。”iwlwifi-6000-4.ucode”というファームがなくて、ファームの読み込みが失敗していることが分かりました。

# dmesg | grep firmware
imx-sdma 20ec000.sdma: loaded firmware 3.1
usbserial: USB Serial support registered for Keyspan – (without firmware)
egalax_ts 2-0004: Failed to read firmware version
ili210x_i2c 2-0041: Failed to get firmware version, err: -5

# dmesg | grep iwlwifi
iwlwifi 0000:01:00.0: request for firmware file ‘iwlwifi-6000-4.ucode’ failed.
iwlwifi 0000:01:00.0: no suitable firmware found!

思いついた入手方法は以下の2つ。どっちも454608バイトでバイナリ比較結果も一致。今回は②を使いました。

①BD-SABRE-LITEをYoctoでビルドしたときのSDKに含まれる/lib/firmware。

/opt/poky/1.8.2/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/lib/firmware/iwlwifi-6000-4.ucode

②Ubuntu14(開発PC)の/lib/firmware。

/lib/firmware/iwlwifi-6000-4.ucode

②の/lib/firmware/iwlwifi-6000-4.ucodeはTeraTermのメニューから「ファイル」「SSH SCP」をクリック。

画面下半分の「From」と「To」を指定して「Receive」をクリック。無事c:\tmp\iwlwifi-6000-4.ucodeをゲット。

iwlwifi-6000-4.ucodeをコピーするためUSBメモリ(FAT32で初期化したもの)をBD-SABRE-LITEに挿したら、こんなメッセージが出ました。/dev/sdaとして認識されたようです。

usb 1-1.1: new high-speed USB device number 3 using ci_hdrc
usb-storage 1-1.1:1.0: USB Mass Storage device detected
scsi1 : usb-storage 1-1.1:1.0
scsi 1:0:0:0: Direct-Access BUFFALO USB Flash Disk 4000 PQ: 0 ANSI: 4
sd 1:0:0:0: [sda] 15950592 512-byte logical blocks: (8.16 GB/7.60 GiB)
sd 1:0:0:0: [sda] Write Protect is off
sd 1:0:0:0: [sda] No Caching mode page found
sd 1:0:0:0: [sda] Assuming drive cache: write through
sd 1:0:0:0: [sda] No Caching mode page found
sd 1:0:0:0: [sda] Assuming drive cache: write through
sda:
sd 1:0:0:0: [sda] No Caching mode page found
sd 1:0:0:0: [sda] Assuming drive cache: write through
sd 1:0:0:0: [sda] Attached SCSI removable disk
FAT-fs (sda): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.

しかしながら/mediaに自動マウントされなかったので。

# ls /media

というコマンドを打ち、手動マウントして、/lib/firmwareにコピーしてreboot。

# mount /dev/sda /mnt
root@nitrogen6x:~# ls /mnt
System Volume Information iwlwifi-6000-4.ucode

# cp /mnt/iwlwifi-6000-4.ucode /lib/firmware/

# reboot

♯ reboot

リブート後、無事認識されました。

# dmesg | grep iwlwifi
iwlwifi 0000:01:00.0: loaded firmware version 9.221.4.1 build 25532 op_mode iwldvm
iwlwifi 0000:01:00.0: CONFIG_IWLWIFI_DEBUG disabled
iwlwifi 0000:01:00.0: CONFIG_IWLWIFI_DEBUGFS disabled
iwlwifi 0000:01:00.0: CONFIG_IWLWIFI_DEVICE_TRACING disabled
iwlwifi 0000:01:00.0: Detected Intel(R) Centrino(R) Ultimate-N 6300 AGN, REV=0x74
iwlwifi 0000:01:00.0: L1 Disabled – LTR Disabled

再びip linkを打つと、無事wlan0が出てきました。

# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: can0: <NOARP40000> mtu 16 qdisc noop qlen 10
link/[280] 3: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:19:b8:06:ca:7f brd ff:ff:ff:ff:ff:ff
4: sit0@NONE: <NOARP> mtu 1480 qdisc noop
link/sit 0.0.0.0 brd 0.0.0.0
5: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop qlen 1000
link/ether 3c:a9:f4:8b:fe:d0 brd ff:ff:ff:ff:ff:ff

インタフェース有効化まで行けたので、いよいよiwを動かします。

iwって何?

iw(Linux)を読みました。IEEE 802.11規格の無線LANネットワークの設定を行うためのコマンドラインユーティリティとあります。私がLinuxの無線LANドライバを始めて触ったのはカーネル2.4から2.6への過渡期で、net_device(WIRELESS_EXT)に依存するwireless-toolsが一般的でしたが、最近はnetlinkに依存するiwに置き換わっています。

iwは、IEEE 802.11規格の無線LANネットワークの設定を行うためのコマンドラインユーティリティです。wireless-toolsの置き換えを目標に開発が行われています。

iwは、ISCライセンスの下で配布されているフリーソフトウェアで、iwlwifiなど多くの無線ドライバに対応しています。WPAで暗号化された無線ネットワークに接続する場合は、wpa_supplicantの使用が必要になります。

Ubuntu14(開発PC)でiwと打つとヘルプが表示されます。which iwと打ち、/sbin/iwにインストールされていることが確認できました。

$ which iw
/sbin/iw

共有ライブラリの依存関係を表示するlddコマンドを打ってみました。/lib/x86_64-linux-gnu/にライブラリがインストールされてるようです。

$ ldd /sbin/iw
linux-vdso.so.1 => (0x00007ffebdeb9000)
libnl-genl-3.so.200 => /lib/x86_64-linux-gnu/libnl-genl-3.so.200 (0x00007f79be756000)
libnl-3.so.200 => /lib/x86_64-linux-gnu/libnl-3.so.200 (0x00007f79be53b000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f79be172000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f79bdf54000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f79bdc4e000)
/lib64/ld-linux-x86-64.so.2 (0x00007f79be95c000)

ライブラリってどうやって検索されるのか?共有ライブラリへパスを通すを読みました。

①LD_LIBRARY_PATHにパスを通す
②システム全体にパスを通す

の2種類あるみたいです。

まず①のLD_LIBRARY_PATHをechoしてみたところ、何も表示されません(設定されてない様子)。ウチの環境は②であると考えました。

$ echo $LD_LIBRARY_PATH

②のシステム全体にライブラリパスを通すには/etc/ld.so.confという設定ファイルに登録するようなので、/etc/ld.so.confを開いたところ他の*.confをインクルードしてるみたい。階層が深いです。

$ sudo vi /etc/ld.so.conf

(/etc/ld.so.confの中身)

include /etc/ld.so.conf.d/*.conf

他の*.confをリスト表示しました。

$ ls /etc/ld.so.conf.d
合計 20
-rw-rw-r– 1 root root 38 3月 24 2014 fakeroot-x86_64-linux-gnu.conf
-rw-r–r– 1 root root 44 8月 10 2009 libc.conf
-rw-r–r– 1 root root 68 4月 12 2014 x86_64-linux-gnu.conf
lrwxrwxrwx 1 root root 43 2月 17 2019 x86_64-linux-gnu_EGL.conf -> /etc/alternatives/x86_64-linux-gnu_egl_conf
lrwxrwxrwx 1 root root 42 2月 17 2019 x86_64-linux-gnu_GL.conf -> /etc/alternatives/x86_64-linux-gnu_gl_conf
-rw-r–r– 1 root root 56 1月 16 2018 zz_i386-biarch-compat.conf
-rw-r–r– 1 root root 58 1月 16 2018 zz_x32-biarch-compat.conf

/etc/ld.so.conf.d/x86_64-linux-gnu.confを開いてみたところ、libnl-3.so.200libnl-3.so.200 が居る/lib/x86_64-linux-gnu/が書かれていました。この仕組みでライブラリが探せるわけですね。

$ sudo vi /etc/ld.so.conf.d/x86_64-linux-gnu.conf
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu

iwをUbuntu14(開発PC)で練習ビルドする

さて、iwをまずUbuntu14(x86_64の開発PC)で練習ビルドすることにしました。まずソースコードを入手するためiw(Linux)を調べたところ、iw(Linux)にgitのリポジトリも書いてありました。

さらに参照先のgitリポジトリにgitのクローンURLが書いてありました。(最近はURLじゃなくてURIって言うんですよね。でもなんか慣れなくてついついURLって言ってしまう私です)

git://git.kernel.org/pub/scm/linux/kernel/git/jberg/iw.git

Ubuntu14(開発PC)でiwをgit clone。

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/jberg/iw.git
Cloning into ‘iw’…
remote: Counting objects: 2984, done.
remote: Compressing objects: 100% (219/219), done.
remote: Total 2984 (delta 127), reused 0 (delta 0)
Receiving objects: 100% (2984/2984), 734.38 KiB | 657.00 KiB/s, done.
Resolving deltas: 100% (1989/1989), done.
Checking connectivity… done.

カレントディレクトリにiwというディレクトリが出来ましたのでlsしてみました。

$ ls -l ./iw
合計 768
-rw-rw-r– 1 pavement1234 pavement1234 491 9月 21 23:26 Android.mk
-rw-rw-r– 1 pavement1234 pavement1234 1871 9月 21 23:26 CONTRIBUTING
-rw-rw-r– 1 pavement1234 pavement1234 849 9月 21 23:26 COPYING
-rw-rw-r– 1 pavement1234 pavement1234 2915 9月 21 23:26 Makefile
-rw-rw-r– 1 pavement1234 pavement1234 464 9月 21 23:26 README
-rw-rw-r– 1 pavement1234 pavement1234 3246 9月 21 23:26 ap.c
-rw-rw-r– 1 pavement1234 pavement1234 6708 9月 21 23:26 bitrate.c
-rw-rw-r– 1 pavement1234 pavement1234 3796 9月 21 23:26 bloom.c
-rw-rw-r– 1 pavement1234 pavement1234 7241 9月 21 23:26 coalesce.c
-rw-rw-r– 1 pavement1234 pavement1234 5146 9月 21 23:26 connect.c
-rw-rw-r– 1 pavement1234 pavement1234 1199 9月 21 23:26 cqm.c
-rw-rw-r– 1 pavement1234 pavement1234 33273 9月 21 23:26 event.c
-rw-rw-r– 1 pavement1234 pavement1234 4715 9月 21 23:26 ftm.c
-rw-rw-r– 1 pavement1234 pavement1234 2445 9月 21 23:26 genl.c
-rw-rw-r– 1 pavement1234 pavement1234 3507 9月 21 23:26 hwsim.c
-rw-rw-r– 1 pavement1234 pavement1234 3206 9月 21 23:26 ibss.c
-rw-rw-r– 1 pavement1234 pavement1234 1594 9月 21 23:26 ieee80211.h
-rw-rw-r– 1 pavement1234 pavement1234 28980 9月 21 23:26 info.c
-rw-rw-r– 1 pavement1234 pavement1234 17900 9月 21 23:26 interface.c
-rw-rw-r– 1 pavement1234 pavement1234 1117 9月 21 23:26 iw.8
-rw-rw-r– 1 pavement1234 pavement1234 13970 9月 21 23:26 iw.c
-rw-rw-r– 1 pavement1234 pavement1234 7725 9月 21 23:26 iw.h
-rw-rw-r– 1 pavement1234 pavement1234 7874 9月 21 23:26 link.c
-rw-rw-r– 1 pavement1234 pavement1234 8476 9月 21 23:26 measurements.c
-rw-rw-r– 1 pavement1234 pavement1234 14303 9月 21 23:26 mesh.c
-rw-rw-r– 1 pavement1234 pavement1234 3662 9月 21 23:26 mgmt.c
-rw-rw-r– 1 pavement1234 pavement1234 6048 9月 21 23:26 mpath.c
-rw-rw-r– 1 pavement1234 pavement1234 1941 9月 21 23:26 mpp.c
-rw-rw-r– 1 pavement1234 pavement1234 11089 9月 21 23:26 nan.c
-rw-rw-r– 1 pavement1234 pavement1234 280715 9月 21 23:26 nl80211.h
-rw-rw-r– 1 pavement1234 pavement1234 851 9月 21 23:26 ocb.c
-rw-rw-r– 1 pavement1234 pavement1234 904 9月 21 23:26 offch.c
-rw-rw-r– 1 pavement1234 pavement1234 669 9月 21 23:26 p2p.c
-rw-rw-r– 1 pavement1234 pavement1234 22269 9月 21 23:26 phy.c
-rw-rw-r– 1 pavement1234 pavement1234 1693 9月 21 23:26 ps.c
-rw-rw-r– 1 pavement1234 pavement1234 2893 9月 21 23:26 reason.c
-rw-rw-r– 1 pavement1234 pavement1234 7553 9月 21 23:26 reg.c
-rw-rw-r– 1 pavement1234 pavement1234 825 9月 21 23:26 roc.c
-rw-rw-r– 1 pavement1234 pavement1234 59949 9月 21 23:26 scan.c
-rw-rw-r– 1 pavement1234 pavement1234 45 9月 21 23:26 sections.c
-rw-rw-r– 1 pavement1234 pavement1234 5601 9月 21 23:26 sha256.c
-rw-rw-r– 1 pavement1234 pavement1234 1709 9月 21 23:26 sha256.h
-rw-rw-r– 1 pavement1234 pavement1234 28210 9月 21 23:26 station.c
-rw-rw-r– 1 pavement1234 pavement1234 3732 9月 21 23:26 status.c
-rw-rw-r– 1 pavement1234 pavement1234 2751 9月 21 23:26 survey.c
-rw-rw-r– 1 pavement1234 pavement1234 38669 9月 21 23:26 util.c
-rw-rw-r– 1 pavement1234 pavement1234 3262 9月 21 23:26 vendor.c
-rwxrwxr-x 1 pavement1234 pavement1234 1103 9月 21 23:26 version.sh
-rw-rw-r– 1 pavement1234 pavement1234 12793 9月 21 23:26 wowlan.c

とりあえずmakeしてみたのですがエラーで瞬殺。libnlが見つからないと言っています。

$ cd iw
$ make
Makefile:75: *** Cannot find development files for any supported version of libnl. 中止.

READMEを開きました。えーと、makeが失敗したらlibnlが見つかるように環境変数PKG_CONFIG_PATHを設定してください、みたいな感じのことが書いてあります。

This is ‘iw’, a tool to use nl80211.

To build iw, just enter ‘make’. If that fails, set the
PKG_CONFIG_PATH environment variable to allow the Makefile
to find libnl.

‘iw’ is currently maintained at http://git.sipsolutions.net/iw.git/,
some more documentation is available at
http://wireless.kernel.org/en/users/Documentation/iw.

Please send all patches to Johannes Berg <johannes@sipsolutions.net>
and CC linux-wireless@vger.kernel.org for community review.

(Google和訳)

これは、nl80211を使用するツールである「iw」です。

iwをビルドするには、「make」と入力します。 それが失敗した場合、設定
Makefileを許可するPKG_CONFIG_PATH環境変数
libnlを見つけます。

「iw」は現在http://git.sipsolutions.net/iw.git/で管理されています。
さらにいくつかのドキュメントが利用可能です
http://wireless.kernel.org/en/users/Documentation/iw。

すべてのパッチをJohannes Berg <johannes@sipsolutions.net>に送信してください。
コミュニティレビュー用のCC linux-wireless@vger.kernel.org。

$PKG_CONFIG_PATHをechoしたが、何も出てきません(=設定されてません)。

が、そもそもPKG_CONFIG_PATHって何かよくわかってません。PKG_CONFIG_PATHで検索かけたところpkg-configという単語が出てきました。さらにpkg-configを調べてみたところ、PKG_CONFIG_PATHには*.pcというファイルを置かなきゃならないみたいです。

pkg-configは、環境変数PKG_CONFIG_PATHのパスに存在する *.pc ファイルに記録された情報を元に、ビルドの際に必要な文字列を返します。

一般的には/usr/lib/pkgconfig/に*.pcファイルを置くみたいですね。

独り言

*.pcは普通は/usr/lib/pkgconfig/以下に作成されます。pkg-config が読みにいくデフォルトのパスもここですがが、/usr/share/pkgconfigの場合もあるみたいです。

*.pcの作り方を知りたくなりました。

取り急ぎ、pkg-configに対応するを読んでみました。さらにpkg-config をクロス開発で使うも読んだのですが、イマイチ書き方がわかりません。さらに/usr/lib/pkgconfig/*.pcも読みましたが、それぞれ微妙に書き方が異なっていて、標準的な書き方が見いだせません。段々ハマり始めた感じ。ズブズブ…。

ちょっと一歩引いて整理してみよう

iwのREADMEにはこんなことが書いてありました

「iw」は現在http://git.sipsolutions.net/iw.git/で管理されています。
さらにいくつかのドキュメントが利用可能です
http://wireless.kernel.org/en/users/Documentation/iw

https://wireless.wiki.kernel.org/en/users/documentation/iwを開いたところ、Linux Wirelessというサイトのabout iwというページでした。ここにiwのビルドに関するヒントらしきものが書いてあり、更にヒントとなりそうなURLリンクが書いてあります。

Build requirements

libnl >= libnl1
libnl-dev >= libnl-dev-1
pkg-config Using iw requires you to have libnl, the first working version is 1.0 pre8 as this release introduced genl, Generic Netlink, which nl80211 relies on. If your distribution’s libnl is a wrong version then you’ll have to download and compile libnl yourself for now (http://www.infradead.org/~tgr/libnl/).

(Google和訳)
ビルド要件

libnl> = libnl1
libnl-dev> = libnl-dev-1
pkg-config iwを使用するにはlibnlが必要です。このリリースでは、nl80211が依存するgenl、Generic Netlinkが導入されたため、最初の作業バージョンは1.0 pre8です。 ディストリビューションのlibnlのバージョンが間違っている場合は、今のところlibnlをダウンロードしてコンパイルする必要があります(http://www.infradead.org/~tgr/libnl/)。

http://www.infradead.org/~tgr/libnl/を開いたところ、Netlink Protocol Library Suite (libnl)というページでした。SWの階層構造が説明されており、めちゃめちゃわかりやすいのですがpkg-configを解決できそうな記載はありませんでした(pkg-configでページ内を検索しただけですが)。

まとめ

今回、HW接続インタフェースを調べる、BD-SABRE-LITEでNIT6X_PCIEを動かす、をやってみました。

iwのビルドにハマり始めなかなか突破口が開けません。こういうときは、一旦寝るに限りますね…。

 

ABOUT ME
ペイヴメント
ペイヴメントのエンジニア塾(当ブログ)では20年以上の経験から得られたプログラミング系ノウハウについてベテランにも満足して頂けるような内容の濃いコンテンツを初心者にも分かりやすい形で日々発信しています。【経歴】ベンチャーのソフトハウスで4年勤務後、精密機器メーカーのソフト開発部門に勤務し今に至ります。