FICUSONLINE F9E
Yoctoカスタムレイヤー追加(USB-WiFi)
Raspberry Pi を VoIP 専用端末として利用するため、Yocto で専用イメージをビルドし、有線 LAN 接続での動作確認を行いました。次に、USB Wi-Fi ドングルを取り付けて Wi-Fi 機能を有効にしようとしましたが、手元のドングルに搭載されているチップは Realtek RTL8188EUS であり、このドライバは Yocto のカーネル設定には含まれていないことが判明しました。そこで、Yocto で Linphone イメージをビルドするために作成したコンテナを再利用し、カスタムレイヤーを作成してドライバを追加し、再ビルドすることにしました。
Takanobu FuseAdministrator

2 weeks ago

Linux

カスタムレイヤー作成(WiFiドライバrtl8188eus)

Yocto Project Concepts

以下RTL8188EUSドライバソースコードをコンパイルします。コンテナ内での作業です。

$ docker start raspi2
$ docker exec -ti raspi2 bash

念の為、Yocto に含まれる Linux カーネルが rtl8188eu をサポートしているか確認します。Yocto のカーネル設定を確認するには、以下のコマンドを実行します。

# bitbake -c menuconfig virtual/kernel

memu_config

menu_config

ドライバソース : 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.confIMAGE_INSTALL:appendrtl8188eus を追加

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

https://busybox.net/downloads/BusyBox.html#udhcpc