NanoPi NEO2 I2S AUDIO でMCLKを出すメモ

前提

  • Allwinner H5ではMCLKの出力が可能
  • PA6にアサイン可能
  • NanoPi Neo2でもこのPin(PA6)は出てる

作業内容とか

  • dtsのi2s0 pinctrlにPA6を追加するもエラー
  • PA6にi2s0のfunction設定が無いっぽい
  • functionはpinctrlのdrivers/pinctrl/sunxi/pinctrl-sun50i-h5.cあたりにテーブルがあるが、PA6のi2s0は書いてないので追加する。
  • MCLKが出たことを確認

dtsの修正例

  • 元ネタのdts/dtsiではなく、/boot以下のdtbをdtcで変換して評価しました。
  • i2s0のpinsに"PA6"を追加
i2s0 {
    pins = "PA6", "PA18", "PA19", "PA20", "PA21";
    function = "i2s0";
    linux,phandle = <0x19>;
    phandle = <0x19>;
};
  • spiのpinsから"PA6"を削除
spi0_cs_pins {
    pins = "PC3" ;
    function = "gpio_out";
    linux,phandle = <0x15>;
    phandle = <0x15>;
};
  • 2017/10/06追記 なんかタッチパネル?の割り込みにPA6が割り当てられてるよう。ここもdisableしないとなんか反応してそう。まだ、未確認ですが。
pitft-ts@1 {
    compatible = "ti,ads7846";
    reg = <0x1>;
    status = "disable";

修正の影響範囲

  • PA6のfunctionにi2s0の選択肢を追加しただけ
  • dtsにてPA6のfunctionをi2s0に明示的に指定しなければ影響なし

パッチ

https://github.com/tkztkztkz/linux/commit/07f117214cf457e5b356730f68a5539402b9e5fc

メモ

  • CPU内蔵PLL生成のクロックなので低ジッタなどは期待できないと思う
  • defaultは24.571MHzだと書いてある。0.2%くらいのズレ?
  • Allwinner H3にはMCLK出力は無いっぽい
  • RPi系にはMCLK出力が無いっぽいので、NanoPi Neo2のちょっとしたアドバンテージ?
  • 古いMCLK必須DACを繋ぐのに良さそう
  • でも外部クロック貰った方が音が良いだろうね

NanoPi NEO2 I2S AUDIO 24bit再生でNG メモ

現象

  • 16/32bitは再生OK
  • 24bit再生はホワイトノイズ(かすかに音楽が聞こえる)となる

発生環境

  • 20170909版のオフィシャルイメージ
  • npi-configでPCM5102Aを選択
  • play(sox)で24/96,24/192フォーマットのFlacデータを再生

原因

  • 24/32bit再生時の下記2レジスタの設定ミス/16bit時は問題なし
    • I2S/PCM FIFO Control RegisterのTXIM
    • I2S/PCM Format Register0のSR
  • レジスタ内容のメモ
    • TXIMとは、FIFO(32bit幅)に書かれたデータをMSB(0)から取るかLSB(1)から取るか決定
    • SRとは、SamplingRateを決定
    • SRの設定値は3bitで(sampling_rate >> 2) - 1で算出可能(3.10カーネルでの算出方法)
    • SWとは、SlotWidthの指定

原因詳細

  • 24/32bit再生時にはTXIM=0(MSB)かつSR=24bit/SW=32bitを固定で指定していた
  • 32bit再生時には
    • FIFOには32bitデータを書く
    • SRが24bitのためMSBから24bitがデータとして採用される
    • 下位8bitが捨てられ、上位24bitを再生する
    • ★結果としては32bitデータを食わせても、24bitに丸められている
  • 24bit再生時には
    • FIFOには24bitデータを書く
      • ★予想だがDMAを使う関係でMSB側8bitは0埋め or nocareで、下位24bitにデータを書く
    • SRが24bitのためMSBから24bitがデータとして採用される
    • ★下位8bitが捨てられ上位24bitを再生する
      • 実際にデータが書かれているのは下位24bitなので8bit padding + 16bitのデータとなる。
      • I2Sのデータは2の補数のため、最上位bitが0固定となると負数が表現できなくなり、ホワイトノイズに若干の音楽が紛れたような音として聞こえる。
      • 負数が表現できないため、DC直結だとDCが出ちゃってたかも。こわい。
  • 16bit再生時には
    • FIFOには16bitデータを書く
    • SR/SW共に16bitなので問題なく再生できる

対策

  • 下記二点の修正
    • I2S/PCM FIFO Control RegisterのTXIMはLSB(1)に設定
    • I2S/PCM Format Register0のSRは指定されたSamplingRate(24/32bit)を設定

修正の効果確認

  • 16bit再生が問題なく行えること(デグレチェック)
  • 24bit再生時にホワイトノイズとなる現象の解消
  • 32bit再生が問題なく行えること(24bitに丸められないこと)

パッチ

メモ

  • 32bit全部出てるかは、オシロでデータの波形を見て確認
  • プルリクってどの程度レポート付けると良いのかね

NanoPi NEO2 4.11系カーネルビルド手順メモ

概要

  • NanoPi NEO2用の4.11.xカーネルビルド方法のメモ。
  • 公式イメージ20170909版のカーネルは本手順で生成できます。
  • 公式ページの手順は3.10のころのものが混ざってる模様。
  • Ubuntu 16.04.3で確認

2018/07/21追記

  • Mediafireではなく、Linaroから直接Toolchainを取ってくる記事を書きました。こちらを参照ください。

tkz.hateblo.jp

ホスト側ツールチェインのインストール(18/02/14追記)

  • sudo apt install build-essential

ツールチェインの取得と展開

mkdir -p /opt/FriendlyARM/toolchain/
tar xf gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu.tar.xz -C /opt/FriendlyARM/toolchain/

ツールチェインにパスを通す

export PATH=/opt/FriendlyARM/toolchain/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin:$PATH

gitでカーネルを持ってきて、4.11ブランチをcheckout

git clone https://github.com/friendlyarm/linux.git
cd linux
git checkout sunxi-4.11.y

ビルド

make sunxi_arm64_defconfig ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
make Image dtbs ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-

ターゲットにコピー

  • 出来上がったarch/arm64/boot/ImageをNanoPi NEO2の/bootにコピー
  • dtbはarch/arm64/boot/dts/allwinner/あたりに生成されます。