NanoPi NEO2 I2S AUDIO 24bit再生でNG メモ
現象
- 16/32bitは再生OK
- 24bit再生はホワイトノイズ(かすかに音楽が聞こえる)となる
発生環境
原因
- 24/32bit再生時の下記2レジスタの設定ミス/16bit時は問題なし
- I2S/PCM FIFO Control RegisterのTXIM
- I2S/PCM Format Register0のSR
- レジスタ内容のメモ
原因詳細
- 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が出ちゃってたかも。こわい。
- FIFOには24bitデータを書く
- 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を取ってくる記事を書きました。こちらを参照ください。
ホスト側ツールチェインのインストール(18/02/14追記)
- sudo apt install build-essential
ツールチェインの取得と展開
- https://www.mediafire.com/folder/ah4i6w029912b/NanoPi-NEO2 から gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu.tar.xz をダウンロード
- 適当な場所に展開してください。
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/あたりに生成されます。