今日は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_THREADS と PARALLEL_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](モジュールとして組み込む)のどちらかに設定しましょう.設定状態は,スペースキーで切り替えられます.
また,"/"を入力すると,カーネルパラメータの検索ができます.
最後に,<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
音量を設定していないと、いきなり大音量で流れるので注意。