kernel
Edison
EdisonDay 3

Intel Edisonのカーネルビルド

More than 3 years have passed since last update.

今日はEdisonのLinuxのカーネルとモジュールを,自分好みにカスタマイズする方法について勉強します.

題材として,EdisonにUSBオーディオを接続して,音楽を鳴らしてみましょう.


母艦の作業


必要なツールのインストール

カーネルのビルドは,Edison上ではなく,CPUのコアとメモリと記録容量が潤沢にある別のPC上で行います.以下は,Ubuntuマシンで行った手順になります.

$ sudo apt-get install build-essential git diffstat gawk chrpath texinfo libtool gcc-multilib u-boot-tools


BSP source package edison-src.tgzのダウンロード・解凍

Intelのページから,EdisonのBoard Support Packageをダウンロードしてきます.

カスタマイズしたカーネルのビルド方法については,この文章を参考にしました.

$ tar xvf edison-src.tgz

$ cd edison-src/


ビルド環境のセットアップ

$ mkdir dl

$ mkdir sst

$ ./device-software/setup.sh --dl_dir=./dl --sstate_dir=./sst

環境変数の設定も行います.

$ source poky/oe-init-build-env

これを行うと,自動的にbuildディレクトリに移動するはず.

ついでに, ./conf/local.conf の中の BB_NUMBER_THREADSPARALLEL_MAKE の値を,母艦のコア数×2くらいに設定しておくと,ビルドが早くなって幸せになれます.


カーネルをビルドしてみる

$ bitbake virtual/kernel

PCの強さによって,ビルドにかかる時間が変わります.

後から説明するカーネルコンフィグの設定を行うためには,先に一度はビルドしておく必要があるようです.


カーネルコンフィグ

$ bitbake linux-yocto -c menuconfig

カスタマイズを行う画面が開きます.

この画面で,

Device Drivers -> Sound card support (SOUND [=y]) -> Advanced Linux Sound Architecture (SND [=y]) -> USB sound devices (SND_USB [=y])

とたどって,USB sound deviceの指定を[y](カーネルに組み込む)か[M](モジュールとして組み込む)のどちらかに設定しましょう.設定状態は,スペースキーで切り替えられます.

また,"/"を入力すると,カーネルパラメータの検索ができます.

USB Audioのドライバをビルドするカーネルの設定

最後に,<SAVE>を選んで,保存することを忘れずに.その後は,ずっと<EXIT>を選択すれば終了できます.

終わったら,設定した.configをコピーします.

$ cp tmp/work/edison-poky-linux/linux-yocto/3.10.17+gitAUTOINC+6ad20f049a_c03195ed6e-r0/linux-edison-standard-build/.config ../device-software/meta-edison/recipes-kernel/linux/files/defconfig

そして,カスタマイズしたカーネルをビルドします.

$ bitbake virtual/kernel

うまくいったら,全体のビルド.

$ bitbake edison-image

途中で中のファイルをいじったりして,どうにもエラーが取れなくなってしまった場合は,

$ bitbake virtual/kernel -c clean

とすると,初期状態に戻せるようです.


焼き込み

このコマンドで,Edisonに焼き込むファイルをtoFlashフォルダにまとめます.

$ ../device-software/utils/flash/postBuild.sh

実際にEdisonに焼き込みます.

$ cd toFlash

$ sudo ./flashall.sh

ここで,EdisonのUSB OTGと母艦を接続します.

焼き込みが完了したら、とりあえずEdisonの電源を切って,母艦と切り離してください.


Edison上の作業


USBオーディオのドライバが認識されていることを確認

初期アカウントはrootでパスワードなし.

USBオーディオを接続して,lsmodすると,以下のようにサウンド関連のモジュールがインストールされていることがわかります.

# lsmod

Module Size Used by

snd_usb_audio 119941 0

snd_usbmidi_lib 24140 1 snd_usb_audio

snd_hwdep 13232 1 snd_usb_audio

snd_rawmidi 24231 1 snd_usbmidi_lib

usb_f_acm 14335 1

u_serial 18582 6 usb_f_acm

g_multi 70703 0

libcomposite 39245 2 usb_f_acm,g_multi

bcm_bt_lpm 13676 0

bcm4334x 578947 0

dmesg中からも確認できます.

# dmesg|tail

[ 100.750482] usb 1-1: Product: USB AUDIO

[ 100.751284] usb 1-1: ep 0x82 - rounding interval to 64 microframes, ep desc says 80 microframes

[ 100.751333] usb 1-1: ep 0x84 - rounding interval to 64 microframes, ep desc says 80 microframes

[ 100.761554] input: USB AUDIO as /devices/pci0000:00/0000:00:11.0/dwc3-host.2/usb1/1-1/1-1:1.3/input/input2

[ 100.762873] hid-generic 0003:1130:F211.0001: input,hidraw0: USB HID v1.10 Device [USB AUDIO ] on usb-dwc3-host.2-1/input3

[ 100.767713] input: USB AUDIO as /devices/pci0000:00/0000:00:11.0/dwc3-host.2/usb1/1-1/1-1:1.4/input/input3

[ 100.769354] hid-generic 0003:1130:F211.0002: input,hidraw1: USB HID v1.10 Device [USB AUDIO ] on usb-dwc3-host.2-1/input4

[ 100.890609] usbmixer: volume control quirk for Tenx TP6911 Audio Headset

[ 100.890656] usbmixer: volume control quirk for Tenx TP6911 Audio Headset

[ 100.892506] usbcore: registered new interface driver snd-usb-audio

ドライバが入っていないと、下3行がないはず。


各種設定

# configure_edison --setup で各種初期設定

# vi /etc/opkg/base-feeds.conf

以下を入力


src/gz all http://repo.opkg.net/edison/repo/all

src/gz edison http://repo.opkg.net/edison/repo/edison

src/gz core2-32 http://repo.opkg.net/edison/repo/core2-32


# opkg update


オーディオ用のツールをインストール

# opkg install alsa-utils

母艦から、何か適当なwavファイルをEdisonに送っておく.


サウンドデバイスの確認

# aplay -l

**** List of PLAYBACK Hardware Devices ****

card 0: Loopback [Loopback], device 0: Loopback PCM [Loopback PCM]

Subdevices: 8/8

Subdevice #0: subdevice #0

Subdevice #1: subdevice #1

Subdevice #2: subdevice #2

Subdevice #3: subdevice #3

Subdevice #4: subdevice #4

Subdevice #5: subdevice #5

Subdevice #6: subdevice #6

Subdevice #7: subdevice #7

card 0: Loopback [Loopback], device 1: Loopback PCM [Loopback PCM]

Subdevices: 8/8

Subdevice #0: subdevice #0

Subdevice #1: subdevice #1

Subdevice #2: subdevice #2

Subdevice #3: subdevice #3

Subdevice #4: subdevice #4

Subdevice #5: subdevice #5

Subdevice #6: subdevice #6

Subdevice #7: subdevice #7

card 1: AUDIO [USB AUDIO], device 0: USB Audio [USB Audio]

Subdevices: 1/1

Subdevice #0: subdevice #0

何番のカードなのかを確認。たぶん1。


再生してみる

# aplay ./music.wav -D hw:1

音量を設定していないと、いきなり大音量で流れるので注意。

EdisonにUSBオーディオをつなぐ