Intel Edisonのカーネルビルド

今日は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のページ](https://communities.intel.com/docs/DOC-23242)から，EdisonのBoard Support Packageをダウンロードしてきます．
カスタマイズしたカーネルのビルド方法については，[この文章](https://communities.intel.com/docs/DOC-23159)を参考にしました．

$ 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]（モジュールとして組み込む）のどちらかに設定しましょう．設定状態は，スペースキーで切り替えられます．
また，"/"を入力すると，カーネルパラメータの検索ができます．

![USB Audioのドライバをビルドするカーネルの設定](https://pbs.twimg.com/media/B31lBYeCEAA7msv.png "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オーディオをつなぐ](https://pbs.twimg.com/media/B32l8lQCEAEM9Wc.jpg "EdisonにUSBオーディオをつなぐ")