NanoPiNEO2 HiFiBerry DAC+対応 β版
HiFiBerry DAC+ PRO対応のβ版リリース
HiFiBerry DAC+ PROに対応しました。
twitterには書いてましたがこっちにも簡単にまとめます。
- HiFiBerry DAC+ PROにて動作確認しています。クローンもたぶん動くはず。
- HiFiBerry DAC+(外部クロックなし)は未検証です。動くかもしれません。
- ソフトウェアはmpdとplay(SoX)にて動作確認しています。
- 対応フォーマット(確認済みのもの)
接続方法
NanoPiとRPiでピン配置が微妙に異なります。 そのままピンヘッダで接続せず、下記のピンのみ接続したほうが安全です。
RPiとNanoPiで互換配置ピン(I2CのPU追加は必須)
- PWR
- Pin01 3.3V
- Pin17 3.3V
- Pin02 5V
- Pin06 GND
- I2C
NanoPi NEO2は基板内でI2CのPullUpが実装されていません。NanoPiとRPiを接続したうえで、3.3Vに4.7k-22kくらいの抵抗でPullUpしてください。- Pin03 I2C0_SDA 3.3VにPU
- Pin05 I2C0_SCL 3.3VにPU
RPIとNanoPiで非互換配置ピン
- I2S (NanoPi to DAC+ PRO)
- Audio Pin08 I2S0_LRC to Pin35 LRCK
- Audio Pin09 I2S0_BCK to Pin12 BCK
- Audio Pin10 I2S0_SDOUT to Pin40 DATA
ビルド方法
ソースはGitHub - tkztkztkz/linux: Linux kernel source treeのREL_HIFIBERRYDACPLUSPRO_BETAブランチにあります。
NanoPi NEO2 4.11系カーネルビルド手順メモ - _tkz_ memoを参考に、checkoutするブランチを下記に変えてビルドしてください。
git checkout REL_HIFIBERRYDACPLUSPRO_BETA
ビルド後は、zImageのほか下記のdtbもターゲットにコピーしてください。
arch/arm64/boot/dts/allwinner/sun50i-h5-nanopi-neo2-audio.dtb をターゲットの/boot/sun50i-h5-nanopi-neo2.dtbに上書きコピーする
モジュールも必要な人はmodluesもビルドして、なんとかmodules以下を固めてターゲットで展開してください。
私は面倒なので必要なモジュールだけ手でコピーしてます。
今後の予定
improve
- dtsの整理
- digi+ PRO対応(評価用のボードを入手できれば)
- バイナリの提供
- volumio2対応
bugfix
- 再生中に停止したあと、再度再生するときにノイズの修正
- メモリリーク(初期化時)
こんな感じであたりで考えていますが、思いがけずSwitch(10G L2と任天堂)を入手してしまったのでいつになるか不明です。
dt-overlay対応はあんまりやる気が無いです。
コードの修正内容抜粋(詳細はコミットログを見てください)
AllWinner系のコード
- sun8i-i2s.c
RPiからポーティングしたコード
- hifiberry_dacplus.c
- ディレクトリをbcmからcodecに移動
- i2s-codecをdt参照対応 RPiへの影響は無いはず
- 352.8k対応
- pcm512x.c
- 20/24bitデータ再生時に、BCLKを64fs(32bit WORD)強制
bcm系は24bit WORDも可能だけど、sunxiは未対応のため - 44.1kクロック時に384k再生するときの上限チェックを無効化
バグに仮対処。44.1kHz系のクロックで再生後、384kHzを設定しようとすると上限が44.1k x 8 = 352.8kとなり、384k再生がエラーとなる模様。
clk-hifiberry-dacproの設定が後に走ることが原因の模様。クロック設定が先に走ればいいんだけど、RPiだとどうやって動いてるんだ?
- 20/24bitデータ再生時に、BCLKを64fs(32bit WORD)強制
- clk-hifiberry-dacpro.c
- 修正なし
Amazonマーケットプレイスで購入した商品が不良品だった場合の対処方法 メモ
Amazonマーケットプレイス登録業者が商品を用意しAmazonが配送するスタイルの注文で、届いた商品が不良品だったので交換を依頼しました。
手順がとても分かりにくかったのでメモしておきます。
販売店のページを表示
- まずは購入した商品のページを開く
- 「この商品は、HOGEHOGEが販売し、Amazon.co.jp が発送します。」 と記載されているところを探し、店名HOGEHOGEをクリックする
- 右上の「質問する」ボタンを押す
出品者に連絡する
- お問い合わせの種類にて「注文について」を選択
- 注文履歴が表示されるので、該当する注文を選ぶ
- 「お問い合わせ内容を選択してください」から「破損または不具合のある商品が届いた」を選択
- メッセージを入力をクリック 詳細な故障状況などを記入し、送信する。
あとは販売店から連絡が来るのでやり取りする。
この時の注意点は直接届いたメールに返信するのではなく、アカウントサービスの「Eメールとメッセージ」メニュー内にあるメッセージセンターを選び「出品者/購入者の連絡」から返信する必要があります。
面倒くさいですね。
交換について、Amazon発送の商品だったので今回はクーポン提供となりました。 クーポンを使って無料で新品を再購入する形です。Amazon側の倉庫から交換品を送付することができないため、このような手順になるようです。 今回は購入価格が低かったため、返送は不要でした。
ちなみに再購入時、色を変えて注文したところ上記クーポンは使えませんでした。購入したものとまったく同じもののみ使用できるようです。
NanoPiNEO2 HiFiBerry DAC+対応 調査メモその1
HiFiBerry DACとはなんぞ?
- RaspberryPi向けの高音質DAC
- いくつか種類があり、RPiのクロックで動くものと、DACに乗っけたクロックで動くものがある。
- RPi向けAudio用のディストロで対応したカーネルが配られている
で?
ドライバの構造調査
- soc/bcm/bcm2708-i2s.c
- CPUのI2S制御コード
- ここは、sun8i-i2s.cに置き換える
- 不足機能をsun8i-i2s.cに追加する感じ
- soc/bcm/hifiberry_dacplus.c
- I2SとCODECの制御コード
- ここで、外部マスター有か無しか判定してる
- 小改造で流用する感じ
- soc/codecs/pcm512x.c/*_i2c.cあたり
- CODEC(PCM5122)の制御コード
- 実際にPCM5122を引っ叩いてるコード
- 完全流用したい
対応が必要そうな項目のざっくり洗い出し
- i2sドライバの修正
- SND_SOC_DAIFMT_CBM_CFM(I2S Slave/Codec Master)対応
- 現状はMCLKのON/OFFしかしていない
- BCK/LRCKのin/outも変更するコードを入れる感じ
- hifiberry制御ドライバの移植
- daiをbcm2708から変更?
- なんかprobeでnode検索してるから、対応要らないかも
- hifiberryのnodeからi2s-controllerを探して設定してる
- なのでi2s-controller=sun8i-h3-i2sとか書いたら行けるかも
- codecの動作確認
メモ
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再生はホワイトノイズ(かすかに音楽が聞こえる)となる
発生環境
原因
- 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/あたりに生成されます。