ZBOX picoにrealtime kernelとmpd-dsd-rtを入れる。

作成日2015年4月29日


前回から だいぶ時間が経ってしまいましたが、やってることは相変わらずです。

今年もゴールデンウィークに遠出するつもりもありません。工作三昧の休みを過ごせるかと思ってたのですが...
連休中の楽しみに期待していたIntelのCOMPUTE STICKの発売がいきなり5月後半にリスケです。
その発表を見て、それではと、ZOTAC pico工作の開始です。

目の前にはpicoとm-stickがあり、どちらも同じBaytrail PCです。そしてどちらもlinuxのinstallに成功してます。
どちらかといえば、より小さなm-stickの方が工作の自由度も高いので本当はm-stickに気合入れようとしていたのですが...

結論として、picoで工作することにしました。その理由は後述します。

picoもEdison同様、取りあえずはアクリル板工作で実戦評価してきました。
使い勝手やソフト環境が中々いい感じになってきたので本番のアルミ工作開始です。


picoもm-stickもubuntuを入れる事が出来たので、いつものパターンでmobile music playerにしてみようと試していました。
その過程でいろいろと問題にぶち当たって居たのですが...とりあえずエッセンスだけ紹介します。

  • picoはUbuntu Studioが普通に使える。つまりLIVA同様「Ubuntuが入った普通のPC」にすることができた。

  • picoで上手く行ったので、m-stickにもUbuntu Studio入れようとしたら....install途中でハングアップする。

  • Ubuntu Studio、Desktopとも14.10だとmpdがDatabaseのupdateで死ぬ...。

    ZOTAC ZBOX pico music player Version 1.1
    pico1
    ZOTAC ZBOX pico music player Version 1.1
    pico1
    ZOTAC ZBOX pico music player Version 1.1
    pico1


    レシピ

  • ZOTAC ZBOX PI321 pico
  • UASP対応MSATA SSD用高速USB3.0接続ケース[PM-MSATAU3]
  • SHICOH K3505AP-06QCV 小型ブロアファン(6V)
  • BUFFALO WLI-UC-GNM
  • 超小型2線式LEDデジタル電圧計(パネルメータ)3桁表示 DC3〜15V(青色)オートレンジ
    あとはいつもの部材関係です。

    今回もただのアルミ板サンドイッチ構造です。サイズはEdisonと同じ150mm x 100mm。但し高さは内寸27mm。
    Edisonではこのベースサイズで全部品を平面置きできましたが、今回はSSDとFANを天面配置し、5mm程の隙間でエアフローを確保しています。
    picoは殻割してメイン基板とドーターボードだけ使っています。

    メイン基板はM2-5mmのスペーサーがジャストなのですが、今回は(も?)若干の手違いで...電力ライン用のコネクタとUSBポートが干渉しちゃったので7mmです。

    豪華なZOTACロゴと青丸のEL?LED?インジケータ基板は未使用です。
    ロゴ基板への接続ライン(3.1V位)はPOWER ONで導通するのを利用してそのままLEDをつなげちゃいました。
    例によってRGB LEDに適当な手持ち抵抗噛ませてシアン系の色にしています。

    この電源ラインって、FAN接続用に用意したのかな?って気もする。そのままFANが刺さるコネクタだったし、発熱ヤバかった際の保険だったりして...



    ようやく本題に入ります。

    既に忘却気味なので手順詳細はかなり雑な記述になっちゃいますが...自分の為の備忘録と言う事でご容赦下さい。

    かねてより最新版のmpd-dsdが通常のUbuntu等ではmakeできないと言う状況に陥っていました。

    解決策はxmos-native-dsdの通り、 kernelおよびalsalibにpatchを当て、native-dsdサポートライブラリが使えるようにすれば良い事も分かりました。

    でも、xmosのDACにしか恩恵は無い上に、kernelだけじゃなくalisalibにもpatchが必要です。

    ここで、mpd-dsdのmakeが失敗する原因も分かったけど、まだsourceすら確認してない自分に気が付きました。

    mpd-dsdの作者さんが
    と、どこかに書いていたのを何も考えずに期待しちゃってたのかもしれません。

    でも最初からsource見ておくべきでした。

    mpd-dsd/src/output/AlsaOutputPlugin.cxxを以下の様に修正すればオッケーでした。

    これを
    
    	case SampleFormat::DSD_U32_BE:
    		return SND_PCM_FORMAT_DSD_U32_BE;
    	case SampleFormat::DSD_U32_LE:
    		return SND_PCM_FORMAT_DSD_U32_LE;
    
    

    以下の様に変更
    
    	case SampleFormat::DSD_U32_BE:
    		return SND_PCM_FORMAT_UNKNOWN;
    	case SampleFormat::DSD_U32_LE:
    		return SND_PCM_FORMAT_UNKNOWN;
    


    たったこれだけでした。XMOSのnative dsdは使えないですが、それ以外は最新版のmpd-dsdです。これで満足。


    最新版になったついでに、mpd-dsd-0.18のgit版には、なんとrealtimeパッチも同梱されています。

    どんなもんでしょう...ドキドキします。

    この辺の手順、忘れてますが...

    README-RT-PATCHES及びREADME-RTに従いパッチ当てて
    README-RTには"--enable-rtopt"になってるけど、

    
    ./configure -enable-rtopt
    

    でconfigureすればイケる様です。
    あとはいつもと同じ手順です。


    mpd -Vコマンドで確認すると

    
    Music Player Daemon 0.18.23-dsd-rt 
    

    無事realtime版のmpdが完成です。


    ところで...現在のUbuntu StudioはLow latencyなkernelではありますが、Realtime kernelではありません。
    以前はRealtime kernelを採用していたようですが、Low latencyで充分であるという判断もあったようです。


    mpd-dsd-rtはLowlatency kernelでちゃんとrealtimeで動くのでしょうか?

    答えは「多分ダメだったけど..詳細忘れた」です...。自分に残念。

    mpdとしては普通に動くけど、realtimeに特化した状態にはなってなかったハズ...

    Realtime kernel作ってみようなんて思う位だからダメだったんだと思う。


    この情報 で問題無くRealtime kernelは作れます。

    ちなみにZOTAC picoでセルフコンパイルすると、3時間以上かかります。
    また、64GBメモリモデルでUbuntuに30GB程度割り当てた状態でもdisk領域が90%程度まで消費されます。
    32GBモデルだと結構厳しいかもしれません。あ、Windows消しちゃえば何の問題も無いか。


    3時間程放置し、運が良ければ以下の5つのdebファイルができます。
    以下のサンプルは名前の付け方を失敗した悪例ですが...

    
    -rw-r--r-- 1 root root    966424  4月 22 15:36 linux-firmware-image-3.18.11-rt7rt-lactoria2_3.18.11-rt7rt-lactoria2-4_amd64.deb
    -rw-r--r-- 1 root root   6707586  4月 22 15:37 linux-headers-3.18.11-rt7rt-lactoria2_3.18.11-rt7rt-lactoria2-4_amd64.deb
    -rw-r--r-- 1 root root 369357904  4月 22 17:15 linux-image-3.18.11-rt7rt-lactoria2-dbg_3.18.11-rt7rt-lactoria2-4_amd64.deb
    -rw-r--r-- 1 root root  39095244  4月 22 15:44 linux-image-3.18.11-rt7rt-lactoria2_3.18.11-rt7rt-lactoria2-4_amd64.deb
    -rw-r--r-- 1 root root    775932  4月 22 15:38 linux-libc-dev_3.18.11-rt7rt-lactoria2-4_amd64.deb
    

    散々時間掛かって5つも作った割には、使うのは2つだけ。
    dbgパッケージが一番掛かってる割に結局使わないのでキャンセルさせる旨い方法あればなぁ。


    installはdpkgコマンドを使う。

    
    dpkg -i linux-headers-3.18.11-rt7rt-lactoria2_3.18.11-rt7rt-lactoria2-4_amd64.deb linux-image-3.18.11-rt7rt-lactoria2_3.18.11-rt7rt-lactoria2-4_amd64.deb       
    



    ちなみに削除するときはapt-getで削除できる。

    
    apt-get remove linux-headers-3.18.11-rt7rt-lactoria linux-image-3.18.11-rt7rt-lactoria
    


    dpkg -iでinstallすると、勝手にupdate-grubまで実行してくれるので、あとは再起動するだけ。

    ...なんだけど、studio使ってるとlowlatencyって名前の付いたkernelがデフォルトOSになってしまう。
    これを回避するには、/etc/grub.d/09_lowlatencyを上回るパワーの08_rt-kernelとかをでっち上げておけばオッケー。
    中身は09_lowlatencyを参考にすれば簡単。lowlatencyをキーにしているところを別のキーにすれば良い。
    それが目的で私はkernelに変な名前を付けちゃいました。目的は達せたけど、長すぎてイマイチ..


    ここまででなんとかmpd-dsd-rtもrealtime kerrnelも動くようになります。


    ところが今まで使えていたHPET(High Precision Event Timer)が使えなくなります。

    そもそもclocksourceがtscだけになっちゃってます。hpetが消えた。

    結論としては「Intel BaytrailマシンのHPETは信用できないので問答無用に無効」にされてました。

    現在、kernel3.18系には暫定的にBaytrailだったら一律HPETを無効にするコードが入っています。
    Ubuntu 14系のkernelにはこのコードはまだ入っていません。

    確かにUbuntu studioで時々clock missingが出たりしてましたが、それほどの頻度でもありませんでした。
    問題としてBaytrailマシンでハングアップする場合があるなどの事例が有るようなので、安全サイドに振ったという事でしょう。
    でも逆に一律無効にされてしまった結果、映像編集などで支障が出てるようです。ALSAもHPETが使えないと警告出してきますし。


    今回はいきなりsourceを追ってみました。


    linux-3.18.11/arch/x86/kernel/early-quirks.cの一行をコメントアウトするだけでした。

    
    static void __init force_disable_hpet(int num, int slot, int func)
    {
    #ifdef CONFIG_HPET_TIMER
    /*
            boot_hpet_disable = 1;
    */
            pr_info("x86/hpet: Will disable the HPET for this platform because it's not reliable\n");
    #endif
    }
    


    但し、上記変更でもdefaultのclocksourceはtscのままです。

    参考:現在有効なclocksourceは以下で確認できる。
    
    # cat /sys/devices/system/clocksource/clocksource0/available_clocksource
    tsc hpet
    

    参考:現在使用されているclocksourceは以下で確認できる。
    
    # cat /sys/devices/system/clocksource/clocksource0/current_clocksource
    hpet
    


    参考:一時的にclocksourceを変えるには、
    
    # echo hpet > /sys/devices/system/clocksource/clocksource0/current_clocksource
    

    でOK


    特に問題なさそうなら、/etc/default/grubを以下の様に修正してupdate-grub2する。

    
    #GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
    GRUB_CMDLINE_LINUX_DEFAULT="text clocksource=hpet"
    

    上記はtextモードも同時に指定した場合ですので、変更するのはclocksource=hpetだけで良い。

    あとは再起動してclocksourceがhpetになってることを確認する。
    ちなみにpicoの場合、上記変更以降、hpetのclock delayは発生していません。
    ...syslogに出すのを止めてるだけだったりするのかもしれませんけど。





    取りあえず忘却との戦いの中、一気に書いてみました。


    picoの殻を割ったら温度は10度位下がります。
    上蓋をはずしちゃってもPOWER ON LEDがコネクタから取れるのでちょっとは工作できる。
    でもPOWER ONボタンはハンダで丸ごと取り外さないと改造は厳しそう。


    戻る

    inserted by FC2 system