2015年01月13日

[Yocto] XS36V4へのWi-Fi機能(RTL8188EEドライバ)追加

前記事に書いたとおり、Shuttle XS36V4でYocto Linuxを動かすことはトラブルに遭遇することもなくすんなりと成功してしまいました。Valley Island BSPに収納されているバイナリ・イメージと自分でビルドしたDE3815TYKHE用のイメージの2つを使いましたが、どちらでも特に問題なくXS36V4でYocto Linuxは動作しました。Valley Island BSPはデフォルト状態でRTL8168/8169/8111/8411ドライバが有効になっていたので、ドライバを組み込むことなくEthernetインターフェースも使えました。ただし、一つ大きな課題を見つけてしまいました。それは、Yocto LinuxがXS36V4の無線LANデバイスを認識していないことです。

前記事で使ったDE3815TYKHE用のcore-image-satoイメージは、カーネルレシピに主要な無線LANドライバをすべて組み込んた状態でビルドしたものです。〔2014/12/29の記事linux-yocto_3.10.bbappendを参照〕lspciコマンドの出力情報によって、XS36V4に搭載されている無線LANデバイスはRealtek RTL8188EEという物であることが判りました。しかし、dmesgコマンドのカーネル・ログを確認しても、RTL8188EE用ドライバはロードされていませんでした。Sato Mobile DesktopのGUI画面からconnman-gnomeを起動してみましが、下のとおり、やはりServicesリストに[Wireless Networks]というカテゴリ・エントリは存在していません。
UBShot_20150113_103340-YoctoLinux-Enabling_RTL8188EE_WLAN_Driver-1366x768
どうやらRTL8188EE用の無線LANドライバがカーネルへ組み込まれていないようです。

ググって調べてみると、カーネルソース・ツリーにRTL8188EE用ドライバは存在しており、これを有効にするにはCONFIG_RTL8188EEというコンフィグレーション設定項目を有効する必要があることが判りました。現状のカーネルのコンフィグレーション設定を確認すると、やはりこの項目は有効になっていませんでした。
# zcat /proc/config.gz | grep CONFIG_RTL8188EE
# CONFIG_RTL8188EE is not set

上記の情報に基いて、XS36V4のWi-Fi機能を利用可能にする作業を行ったので、その作業記録を本記事に書きます。

■ RTL8188EE無線LANドライバの組み込み


まずは、一時的にコンフィグレーション設定を変更して、カーネルへRTL8188EEドライバを組み込む作業を行いました。

bitbake linux-yocto -c menuconfig」コマンドによってカーネルのコンフィグレーション画面を開いて、以下のメニュー項目を有効にすれば、RTL8188EEドライバを組み込むことができます。〔2014/10/25の記事を参照〕
UBShot_20150113_115841-YoctoLinux-Enabling_RTL8188EE_WLAN_Driver-704x766
         Device Drivers  --->

[*] Nework device support --->

[*] Wireless LAN --->

<M> Realtek RTL8188EE Wireless Network Adapter

上の操作を行った後、以下のコマンドを実行して、RTL8188EEドライバを組み込んだcore-image-satoイメージを作成しました。
% bitbake linux-yocto -c compile -f
% bitbake linux-yocto -c deploy
% bitbake linux-yocto
% bitbake core-image-sato

core-image-satoのhddimgファイルからLive USBを作成して、このUSBメディアを使って、XS36V4でYocto Linuxを起動しました。そして、CONFIG_RTL8188EEが有効になっていることを確認しました。
# zcat /proc/config.gz | grep CONFIG_RTL8188EE
CONFIG_RTL8188EE=m

続いて、dmesgコマンドによってRTL8188EEドライバがロードされているかを確認しました。
# dmesg
.... ....
.... ....
.... ....
.... ....
[ 6.241182] cfg80211: Calling CRDA to update world regulatory domain
[ 6.375266] rtl8188ee 0000:01:00.0: enabling device (0000 -> 0003)
[ 6.383289] rtl8188ee: Using firmware rtlwifi/rtl8188efw.bin
[ 6.397905] ieee80211 phy0: Selected rate control algorithm 'rtl_rc'
[ 6.398161] rtlwifi: wireless switch is on
.... ....

connman-gnomeを起動してみると、Servicesリストにちゃんと[Wireless Networks]のエントリが追加されていました。
UBShot_20150113_123138-YoctoLinux-Enabling_RTL8188EE_WLAN_Driver-1366x768
Wi-Fiアクセスポイントへの接続を試してみると、こちらも問題なくできました。
UBShot_20150113_123405-YoctoLinux-Enabling_RTL8188EE_WLAN_Driver-1366x768

■ XS36V4用BSPの作成


上記のとおり、一時的にカーネルのコンフィグレーション設定を変更してRTL8188EEドライバを組み込めば、Yocto LinuxでXS36V4のWi-Fi機能を使えるようになることを確認できました。そこで、XS36V4用のBSPを作成して、この成果をそれに反映しました。

2014/10/25の記事にDE3815TYKHE用BSPの作成方法を書きましたが、これと同じ方法でXS36V4用のBSPを作成しました。今回作成したXS36V4 BSPのファイル構成を以下に示します。

  meta-xs36v4
|-- conf
| |-- machine
| | `-- xs36v4.conf
| `-- layer.conf
|-- recipes-bsp
| `-- formfactor
| |-- formfactor
| | `-- xs36v4
| | `-- machconfig
| `-- formfactor_0.0.bbappend
`-- recipes-kernel
`-- linux
|-- linux-yocto
| `-- add_driver-net_wlan_rtl8188ee.cfg
`-- linux-yocto_3.10.bbappend

また、以下にXS36V4 BSPのレイヤ定義ファイル、ターゲット定義ファイル、カーネルレシピの内容を示します。
#We have a conf and classes directory, add to BBPATH
BBPATH .= ":${LAYERDIR}"

# We have a recipes directory, add to BBFILES
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
${LAYERDIR}/recipes-*/*/*.bbappend"

BBFILE_COLLECTIONS += "xs36v4"
BBFILE_PATTERN_xs36v4 := "^${LAYERDIR}/"
BBFILE_PRIORITY_xs36v4 = "6"

LAYERDEPENDS_xs36v4 = "intel"

LICENSE_PATH += "${LAYERDIR}/custom-licenses"

#@TYPE: Machine
#@NAME: Shuttle XS36V4

#@WEBTITLE: Intel Celeron J1900 Processor (XS36V4) 64-bit with Open Source Frame Buffer Graphics

#@DESCRIPTION: Machine configuration for XS36V4 64-bit systems, without Intel-proprietary graphics bits

PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto"
PREFERRED_VERSION_linux-yocto ?= "3.10%"

require conf/machine/include/intel-corei7-64-common.inc
require conf/machine/include/intel-common-pkgarch.inc
require conf/machine/include/meta-intel.inc

MACHINE_FEATURES += "pcbios efi"
MACHINE_FEATURES += "wifi"

MACHINE_EXTRA_RRECOMMENDS += "linux-firmware"

XSERVER ?= "${XSERVER_X86_BASE} \
${XSERVER_X86_EXT} \
${XSERVER_X86_FBDEV} \
${XSERVER_X86_I965} \
"

APPEND += "acpi_enforce_resources=lax video=efifb:off vga=0x318"

FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"

#############################
# MACHINE = xs36v4 #
#############################
COMPATIBLE_MACHINE_xs36v4 = "xs36v4"
KMACHINE_xs36v4 = "valleyisland"
KBRANCH_xs36v4 = "standard/base"
KERNEL_FEATURES_xs36v4 = " features/valleyisland-io/valleyisland-io.scc \
features/valleyisland-io/valleyisland-io-pci.scc \
features/wifi/wifi-all.scc"

LINUX_VERSION_xs36v4 = "3.10.59"
SRCREV_machine_xs36v4 = "747e1cbd12b15db8bc2ae86e2359c1b113f120d6"
SRCREV_meta_xs36v4 = "8f05306a8e6f5ee422d50c3317acce0cf9e6aada"
SRCREV_valleyisland-io_xs36v4 = "0992d01f5f382f6da60004ef87f67ebd3ca13732"

SRC_URI_xs36v4 = "git://git.yoctoproject.org/linux-yocto-3.10.git;protocol=git;nocheckout=1;branch=${KBRANCH},${KMETA},valleyisland-io-3.0;name=machine,meta,valleyisland-io"

SRC_URI_xs36v4 += "file://add_driver-net_wlan_rtl8188ee.cfg"

module_autoload_i2c-dev = "i2c-dev"

上のファイルで定義しているのは64ビット版ターゲットだけです。今回32ビット版ターゲットの定義は省略しました。XS36V4で32ビット版Yocto Linuxを動かすことはまずないだろうと思ったからです。DE3815TYKHEでも、32ビット版ターゲット用にYocto Linuxをビルドしたことはいままで一度もありません。

カーネルレシピlinux-yocto_3.10.bbappend内で参照しているコンフィグレーションフラグメントは、以下のような内容です。
++ .config	2015-01-12 15:55:39.777257022 +0900
CONFIG_RTL8188EE=m

このファイルは、カーネルのコンフィグレーション・メニュー画面で「Realtek RTL8188EE Wireless Network Adapter」の設定項目を有効にし、メニュー画面を終了した直後に「bitbake linux-yocto -c diffconfig」コマンドを実行することで作成しました。

上記のXS36V4用BSPを作成した後、このBSPを使ってcore-image-satoイメージをビルドし、XS36V4でYocto Linuxが起動することを確認しました。Wi-Fi機能も問題なく動作していました。

なお、Shuttle XS36V4にはXS35V4という姉妹モデルが存在しますが、この2つの機種のハード仕様は同一だと思われます。未確認ですが、今回作成したBSPはXS35V4でも使えるはずです。〔本記事に掲載したXS36V4 BSPを利用してXS35V4で動作確認を行った方がいれば、その結果を報告していただけると有難いです〕

【2015/01/15 追記】

本記事に掲載したXS36V4 BSPを使うと、RTL8188EEドライバと一緒に主要な無線LANドライバもすべてカーネルに組み込まれてしまいます。無線LANカードを換装したときに設定を変える必要がないので、これはこれで便利なのですが、ターゲットに搭載されていないデバイスのためのドライバが入っている状態になっています。組込みシステムではこういう状態は好ましくありません。

RTL8188EE用以外の無線LANドライバを削除したい場合は、カーネルレシピlinux-yocto_3.10.bbappendとコンフィグレーションフラグメントの内容を以下のように変更すると良いでしょう。
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"

#############################
# MACHINE = xs36v4 #
#############################
COMPATIBLE_MACHINE_xs36v4 = "xs36v4"
KMACHINE_xs36v4 = "valleyisland"
KBRANCH_xs36v4 = "standard/base"
KERNEL_FEATURES_xs36v4 = " features/valleyisland-io/valleyisland-io.scc \
features/valleyisland-io/valleyisland-io-pci.scc"

LINUX_VERSION_xs36v4 = "3.10.59"
SRCREV_machine_xs36v4 = "747e1cbd12b15db8bc2ae86e2359c1b113f120d6"
SRCREV_meta_xs36v4 = "8f05306a8e6f5ee422d50c3317acce0cf9e6aada"
SRCREV_valleyisland-io_xs36v4 = "0992d01f5f382f6da60004ef87f67ebd3ca13732"

SRC_URI_xs36v4 = "git://git.yoctoproject.org/linux-yocto-3.10.git;protocol=git;nocheckout=1;branch=${KBRANCH},${KMETA},valleyisland-io-3.0;name=machine,meta,valleyisland-io"

SRC_URI_xs36v4 += "file://add_config-wifi_rtl8188ee.cfg"

module_autoload_i2c-dev = "i2c-dev"

# Common Wifi Infrastructure
CONFIG_NET=y
CONFIG_WIRELESS=y
CONFIG_WIRELESS_EXT=y
CONFIG_NETDEVICES=y
CONFIG_WLAN=y

CONFIG_CFG80211=m
CONFIG_CFG80211_DEFAULT_PS=y
CONFIG_CFG80211_WEXT=y

CONFIG_MAC80211=m
CONFIG_MAC80211_RC_PID=y
CONFIG_MAC80211_RC_MINSTREL=y
CONFIG_MAC80211_RC_MINSTREL_HT=y
CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y
CONFIG_MAC80211_RC_DEFAULT="minstrel_ht"
CONFIG_MAC80211_MESH=y
CONFIG_MAC80211_LEDS=y

CONFIG_AVERAGE=y

# Realtek RTL8188EE Wireless Driver
CONFIG_RTLWIFI=m
CONFIG_RTL8188EE=m

上のカーネルレシピでは、「KERNEL_FEATURES_xs36v4 = " ... features/wifi/wifi-all.scc"」という設定記述を削除しています。上のコンフィグレーションフラグメントで定義しているのは、このファイル内のカーネル・コンフィグレーション設定項目の一部です。
posted by とみやん at 10:59| Comment(0) | TrackBack(0) | Embedded Linux > Yocto Project
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/111662026

この記事へのトラックバック