NanoPi Neo2 I2S Audio Kernel alpha1 release

これは何?

  • NanoPi Neo2用のカーネルにI2Sオーディオ関連のパッチを当てたものになります。
  • カーネルのみのリリースとなります。音を出すにはSoXやmpdなどを自力で導入する必要があります。
  • 手軽に音を出したい方は、本カーネルを適用したVolumio2を作成予定ですので、それまでお待ちください。

  • 標準のカーネルに加えて下記の修正が施してあります

    • 特定sampling resolutionで音が出ない問題の修正(24bitでノイズになるなど)
    • MCLK出力の有効化
    • 768/1536kHzのサンプリングレートに対応
    • HifiBerry DAC+ PRO or 互換ボードに対応
    • PCM Right Justified16/24bit出力に対応
    • BCLK外部クロック駆動など特殊動作に対応
  • baseは4.11になります。

  • 現在はalpha3にアップデート済みです。

ダウンロード・使い方

バイナリダウンロード

メーカ提供 UbuntuCoreの場合

  • FriendlyArm提供のUbuntuCore ImageをSDに書き込む
  • PC上でもターゲット上でも構わないので、/bootのImageを上記からダウンロードしたもので上書きする
  • ターゲット上でmodulesを展開する
# tar xvfz npi_audio_modules_1807_alpha3.tgz -C /
or
$ sudo tar xvfz npi_audio_modules_1807_alpha3.tgz -C /
  • 再起動でAudio Kernelに差し替わります

動作モードの切り替え方

  • dtbファイルを差し替えて機能の切り替えを行ってください。
  • NanoPi Neo2のbootスクリプトは、defaultではsun50i-h5-nanopi-neo2.dtbで起動するので、sun50i-h5-nanopi-neo2.dtbへ上書きしてやるのが簡単です。
$ cd /boot
$ cp sun50i-h5-nanopi-neo2-i2s-generic.dtb sun50i-h5-nanopi-neo2.dtb
  • dtbの種類と動作モードは下の方で説明していますのでご確認ください。

ソースコード

制約など

dtbファイルと動作モードの紹介

通常利用向けdtb

  • I2S Generic
    • I2S出力に対応します。MCLKは出力しません。
    • デフォルトは64fsは32bit長固定とします。16/24bit再生時、LSBは0パディングします。
    • 32fsは16bit長固定とします。Philipsなどの16bit長DACに最適です。
    • PCM5102AやES9023PなどMCLKが不要なDACの接続に利用します。
sun50i-h5-nanopi-neo2-i2s-generic.dtb
sun50i-h5-nanopi-neo2-i2s-generic_32fs.dtb
  • I2S Generic + MCLK
    • MCLK出力に対応します。MCLKはPA6に出力します。
    • デフォルトは64fsは32bit長固定とします。16/24bit再生時、LSBは0パディングします。
    • 32fsは16bit長固定とします。
    • PCM179X/AK449XなどのMCLKが必要なI2S DACの接続に利用します。
    • 出力されるMCLKの周波数とサンプリングレートの対応は以下の通りです。
サンプリングレート MCLK周波数
48/96/192/384kHz 24.576MHz
44.1/88.2/176.4/352.8kHz 22.5792MHz
768kHz 49.152MHz
1536kHz 98.304MHz
sun50i-h5-nanopi-neo2-i2s-generic_mclk.dtb
sun50i-h5-nanopi-neo2-i2s-generic_mclk_32fs.dtb
  • HiFiBerry DAC+ Pro or compatible
    • HiFiBerry DAC+/DAC+ PROの両方に対応
    • BCLKは16bit時は32fs。24/32bit時は64fsで出力します。
    • DAC+ PRO使用時には外部クロックで動作します。
    • DAC+ PRO使用時においても強制的にDAC+モードの利用(slaveモード)も可能
    • 必要な接続はI2S(BCLK/LRCLK/DATA)とI2C(SDA/SCK)、3.3V、5V、GNDとなります。
    • NanoPi Neo2ではボード上にI2C PullUpが無いため、必ず外部にて3.3VにPullUpしてください。
sun50i-h5-nanopi-neo2-i2s-dacpluspro.dtb
sun50i-h5-nanopi-neo2-i2s-dacpluspro_slave.dtb
  • PCM RJ16/RJ24bit
    • 古いDACに多いRight Justifiedフォーマット出力に対応します。
    • MCLK出力に対応します。MCLKはPA6に出力します。
    • Right Juistifiedではbit長が自動認識できませんので、ターゲットのDACに合ったbit長を選択してください。
    • 32fsは16bit長固定とします。Philipsなどの16bit長DACに最適です。
    • FN1242Aにて動作確認済みです。
sun50i-h5-nanopi-neo2-pcm_rj16_32fs_mclk.dtb
sun50i-h5-nanopi-neo2-pcm_rj16_64fs_mclk.dtb
sun50i-h5-nanopi-neo2-pcm_rj24_64fs_mclk.dtb

実験向けdtb

  • I2S CBM_CFS fixed clock mode 実験用
    • 外部から固定BCLKを入力するモードです。
    • 水晶発振器などを利用して、NanoPi Neo2及びDACのBCLKにクロックを入力してください。
    • LRCLKはNanoPi NEO2にて生成します。
    • MCLKは出力できません。
    • 64fs固定です。(dtsを編集すれば32fs/48fsも設定可)
      • 24.576MHz入力で32bit 384kHz固定
      • 12.288MHz入力で32bit 192kHz固定
    • mpdなどでリサンプリングを有効にして利用することを想定しています。
    • クロックに合ったサンプリングレートで再生しない場合、音程が正しく出力されません。
sun50i-h5-nanopi-neo2-i2s-cbmcfs_bclkin.dtb
  • I2S Generic + MCLK less than 100MHz 実験用
    • MCLKに100MHz未満で設定可能な最大周波数を設定
    • ES9018SでMCLKをNanoPi Neo2から入力する場合に使用します。
    • I2C制御はしませんので、ES9018Sはデフォルト動作とさせるか外部マイコンで制御または、i2c-toolsなどで制御が必要です。
 sun50i-h5-nanopi-neo2-i2s-generic_mclk_lt100m.dtb
  • I2S Generic + MCLK less than 50MHz 実験用
    • MCLKに50MHz未満で設定可能な最大周波数を設定
    • PCM5102A/ES9023Pなどで、MCLKをNanoPi Neo2から入力する場合に使用します。
    • MCLKのクロックによって音が変化するか実験するときにどうぞ
 sun50i-h5-nanopi-neo2-i2s-generic_mclk_lt50m.dtb

今後の予定(あくまで予定です)

  • Volumio2のNanoPi Neo2版提供(本カーネル導入済み)
  • beta版ではbaseバージョンを最新の4.14にアップデート
  • rt patchの取り込み
  • オーディオフォーマット対応のリファクタリング

もしかしたらやるかも

  • 外部I2S Master基板の製作とドライバ作成