カスタムレイヤー作成(WiFiドライバrtl8188eus)
以下RTL8188EUSドライバソースコードをコンパイルします。コンテナ内での作業です。
$ docker start raspi2
$ docker exec -ti raspi2 bash
念の為、Yocto に含まれる Linux カーネルが rtl8188eu をサポートしているか確認します。Yocto のカーネル設定を確認するには、以下のコマンドを実行します。
# bitbake -c menuconfig virtual/kernel
ドライバソース : GitHub aircrack-ng/rtl8188eus
カスタムレイヤーrtl8188eus.bbを作成するためのmetaディレクトリを準備
# pwd
~/poky
bitbake-layers create-layer meta-custom
# cd meta-custom
# mkdir -p recipes-drivers/rtl8188eus
# cd recipes-drivers/rtl8188eus
# nano rtl8188eus.bb
rtl8188eus.bbの内容は以下の通りです。
meta-custom/recipes-drivers/rtl8188eus/rtl8188eus.bb
# rtl8188eus.bb
SUMMARY = "RTL8188EUS Wi-Fi driver"
LICENSE = "GPL-2.0-or-later"
SRC_URI = "git://github.com/aircrack-ng/rtl8188eus.git;branch=v5.3.9;protocol=https"
SRCREV = "f969c544ab6100da3d80a5709e077f920f2df698"
LIC_FILES_CHKSUM = "file://include/linux/wireless.h;beginline=1;endline=12;md5=2e8246ed3abbbb95c781b51b5c89857e"
S = "${WORKDIR}/git"
inherit module
DEPENDS = "virtual/kernel"
EXTRA_OEMAKE = "KSRC=${STAGING_KERNEL_DIR}"
do_compile() {
oe_runmake
}
do_install() {
install -d ${D}${base_libdir}/modules/${KERNEL_VERSION}/kernel/drivers/net/wireless
install -m 0644 8188eu.ko ${D}${base_libdir}/modules/${KERNEL_VERSION}/kernel/drivers/net/wireless/
}
SRCREVはgithubのコミットID:SHA-1ハッシュ値
SRCREV = “f969c544ab6100da3d80a5709e077f920f2df698”
LIC_FILES_CHKSUM は任意のファイルの冒頭ライセンス内容(コメント)のmd5ハッシュ値。抽出した行をテキストファイルtext.txtで保存し、md5でファイルをハッシュして算出します。この作業はホストマシンで実行します。
$ md5sum text.txt
LIC_FILES_CHKSUM = “file://include/linux/wireless.h;beginline=1;endline=12;md5=2e8246ed3abbbb95c781b51b5c89857e”
カスタムレイヤーを ~/poky/build/conf/bblayers.conf に追加
# bitbake-layers add-layer ~/poky/meta-custom
複数のレイヤーが同じレシピやファイルを提供する場合、layer.conf ファイル内で BBFILE_PRIORITY を設定して優先順位を制御します。
meta-custom/conf/layer.conf
BBFILE_PRIORITY_meta-custom = "7"
全レイヤーの確認
# bitbake-layers show-layers
プロジェクトの build/conf/local.conf の IMAGE_INSTALL:append に rtl8188eus を追加
IMAGE_INSTALL:append = " alsa-plugins alsa-utils alsa-lib boost gettext glew libopus libsrtp libvpx v4l-utils raspi-gpio linphone-sdk openssl mpc mpd ntp rtl8188eus"
ビルド
# bitbake core-image sato
イメージをSDカードに書込み、Raspberry Piにセットします。
イメージ起動後の操作
LAN有線接続したRasperry PiにSSH接続し、RTL8188EUドライバモジュールが読込まれているか確認します。
# lsmod
.....
.....
8188eu 1142784 0
cfg80211 872448 1 8188eu
.....
.....
他ドライバとの競合回避のため、デフォルトのドライバモジュールrtl8xxxuをブラックリストで無効化し再起動
# echo "blacklist rtl8xxxu" >> /etc/modprobe.d/blacklist.conf
# reboot
WiFiの有効化
# rfkill list all
0: phy0: wlan
Soft blocked: yes
Hard blocked: no
# rfkill unblock all
# rfkill list all
0: phy0: wlan
Soft blocked: no
Hard blocked: no
インターフェイスの確認と有効化
# ip link show
# ip link set wlan0 up
# ip addr
スキャンして接続(確認)
# iw wlan0 scan
# iw wlan0 scan | grep SSID
# wpa_passphrase "<ssid>" "password" > /etc/wpa_supplicant.conf
# wpa_supplicant -B -i wlan0 -D nl80211 -c /etc/wpa_supplicant.conf
# iw dev wlan0 link
Connected to 50:41:b9:67:ba:5c (on wlan0)
SSID: <ssid>
freq: 2427.0
signal: -26 dBm
tx bitrate: 150.0 MBit/s
# wpa_cli status
Selected interface 'wlan0'
.....
ssid=<ssid>
id=1
mode=station
wifi_generation=4
pairwise_cipher=CCMP
group_cipher=TKIP
key_mgmt=WPA2-PSK
wpa_state=COMPLETED
ip_address=192.168.xx.xx
.....
DNS設定、DHCPクライアントを起動(IPv4取得)
# echo "nameserver 8.8.8.8" > /etc/resolv.conf
# udhcpc -i wlan0
再起動後にも有効にするには…
/var/lib/connman/settings
[WiFi]
Enable=true
Tethering=false
Tethering.Freq=2412
/etc/network/interfaces
# Wireless interfaces
iface wlan0 inet dhcp
wireless_mode managed
wireless_essid any
wpa-driver nl80211
wpa-conf /etc/wpa_supplicant.conf
pre-up /sbin/udhcpc -R -b -p /var/run/udhcpc.wlan0.pid -i wlan0
post-up ip link set wlan0 mtu 1500
注) udhcpcの起動エラー : pre-up, post-upオプション追加
- wlan0でinet(IPv4アドレス)取得のため、事前にバックグラウンドで udhcpc(busyboxのデフォルトDHCPクライアント)を起動すること。
- mtu 2312 がデフォルトのため、1500を指定。これをしないとUDPのパケット分割が生じ、通信ができなくなります。
https://unix.stackexchange.com/questions/261872/how-is-udhcpc-executed-and-how-to-change-it