Raspberry Pi ZeroのI2S DACとポップノイズの関係 その1 力技でポップノイズを抑制

概要

  • NosPiDAC Zeroなどで音楽を楽しんでいるときに気になるポップノイズについて調べたこと・やったことをメモ。

  • ポップノイズは再生・停止・曲間で発生します。

  • 発生メカニズムが確定では無いですが、RPi ZeroのI2SドライバがI2Sのクロックを止めることから発生しているようです。
    • 2018/07/31追記 クロックだけではなくTXONも影響してそう
  • 本内容は暫定対処です。もっと良い対応方法が無いか引き続き研究中です。

I2Sクロック制御

ポップノイズ発生シーケンスおさらい

  • ALSAからのcallbackを追っていきます
    1. 再生開始
    2. startup PCMブロックのEnable
    3. hw_params サンプリングレートを設定・ここでPLLやLRCLKの分周比を設定
    4. prepare FIFOクリア
    5. trigger start 一曲目再生 クロックオン ★ここでプチ音
    6. ここで曲送り
    7. trigger stop 一曲目停止 クロックオフ
    8. prepare FIFOクリア
    9. trigger start 二曲目再生 クロックオン ★ここでプチ音
    10. ここで再生停止
    11. trigger stop 二曲目停止 クロックオフ
    12. shutdown PCMブロックのDisable/クロックオフ
    13. 再生再開
    14. trigger stop 空うち
    15. startup PCMブロックのEnable
    16. hw_params サンプリングレートを設定・ここでPLLやLRCLKの分周比を設定
    17. prepare FIFOクリア
    18. trigger start 二曲目再生再開 クロックオン ★ここでプチ音
    19. trigger stop 二曲目停止 クロックオフ
    20. shutdown PCMブロックのDisable/クロックオフ

クロックを止まらないようにしてみる

  • そんなわけで、I2Sがクロックを止めようとする制御を全部コメントアウトしてみる。
  • ポイントはbcm2835_i2s_hw_paramsでTXON時にはreturn 0する処理をつぶすこと。これをやらないと、サンプリングレートが変わってもクロックを変更してくれません。
  • デメリットは再生停止してもクロックを供給し続けるので、再生停止時の消費電力が上がります。
  • また、TXON状態のままになるので、途中で録音しようとしてもエラーになりそう。
  • 再生専用機なら問題は少ないかな?
  • 現在このコードがじんそんさんのNosPiDAC Zero用 Moode Audioに適用されています。
diff --git a/sound/soc/bcm/bcm2835-i2s.c b/sound/soc/bcm/bcm2835-i2s.c
index d5f73a8ab893..b2773fb1ce20 100644
--- a/sound/soc/bcm/bcm2835-i2s.c
+++ b/sound/soc/bcm/bcm2835-i2s.c
@@ -357,8 +357,8 @@ static int bcm2835_i2s_hw_params(struct snd_pcm_substream *substream,
         */
        regmap_read(dev->i2s_regmap, BCM2835_I2S_CS_A_REG, &csreg);

-       if (csreg & (BCM2835_I2S_TXON | BCM2835_I2S_RXON))
-               return 0;
+//     if (csreg & (BCM2835_I2S_TXON | BCM2835_I2S_RXON))
+//             return 0;

        data_length = params_width(params);
        data_delay = 0;
@@ -652,17 +655,19 @@ static void bcm2835_i2s_stop(struct bcm2835_i2s_dev *dev,
 {
        uint32_t mask;

        if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
                mask = BCM2835_I2S_RXON;
        else
                mask = BCM2835_I2S_TXON;

-       regmap_update_bits(dev->i2s_regmap,
-                       BCM2835_I2S_CS_A_REG, mask, 0);
+//     regmap_update_bits(dev->i2s_regmap,
+//                     BCM2835_I2S_CS_A_REG, mask, 0);

        /* Stop also the clock when not SND_SOC_DAIFMT_CONT */
-       if (!dai->active && !(dev->fmt & SND_SOC_DAIFMT_CONT))
-               bcm2835_i2s_stop_clock(dev);
+//     if (!dai->active && !(dev->fmt & SND_SOC_DAIFMT_CONT))
+//             bcm2835_i2s_stop_clock(dev);
 }
@@ -735,14 +742,14 @@ static void bcm2835_i2s_shutdown(struct snd_pcm_substream *substream,
                return;

        /* Disable the module */
-       regmap_update_bits(dev->i2s_regmap, BCM2835_I2S_CS_A_REG,
-                       BCM2835_I2S_EN, 0);
+//     regmap_update_bits(dev->i2s_regmap, BCM2835_I2S_CS_A_REG,
+//                     BCM2835_I2S_EN, 0);

        /*
         * Stopping clock is necessary, because stop does
         * not stop the clock when SND_SOC_DAIFMT_CONT
         */
-       bcm2835_i2s_stop_clock(dev);
+//     bcm2835_i2s_stop_clock(dev);
 }

改造後シーケンスおさらい

  • クロック停止処理削除
    1. 再生開始
    2. startup
    3. hw_param
    4. prepare
    5. trigger start 一曲目再生 クロックオン ★ここでプチ音
    6. ここで曲送り
    7. trigger stop 一曲目停止 クロック止めない
    8. prepare
    9. trigger start 二曲目再生
    10. ここで再生停止
    11. trigger stop 二曲目停止 クロック止めない
    12. shutdown クロック止めない
    13. 再生再開
    14. trigger stop 空うち
    15. startup PCMブロックのEnable
    16. hw_params サンプリングレートを設定・ここでPLLやLRCLKの分周比を設定
    17. prepare FIFOクリア
    18. trigger start 二曲目再生再開
    19. trigger stop 二曲目停止 クロック止めない
    20. shutdown クロック止めない

改造後シーケンス+rc.localで無音再生

無音再生の追加

  • 最初の曲で出るポップノイズを抑制するため、起動中に無音再生することでI2Sのクロック出力を開始する試み
  • SoXのplayコマンドを使って、400HzのSine波を-100dB(無音までゲインを下げる)で再生する処理を追加してます。

  • 以下をRPi MoodeAudio上で実行する

sudo apt update
sudo apt install sox
  • エディタでrc.localを開く
sudo vi /etc/rc.local
  • exit 0の前あたりに下記を追加
/usr/bin/play -n synth 1 sine 400 gain -100 &
  • SHIFT + ZZなどで保存して終了

シーケンス

  • 事前に無音音声再生&クロック停止削除
    1. 無音再生開始
    2. startup
    3. hw_param
    4. prepare
    5. trigger start 無音再生 クロックオン ★ここでプチ音(無音再生なので軽微)
    6. trigger stop 無音再生停止
    7. shutdown クロック止めない
    8. 再生開始
    9. trigger stop 空うち
    10. startup PCMブロックのEnable
    11. hw_params サンプリングレートを設定・ここでPLLやLRCLKの分周比を設定
    12. prepare
    13. trigger start 一曲目再生
    14. trigger stop 一曲目停止 クロック止めない
    15. prepare
    16. trigger start 二曲目再生
    17. trigger stop 二曲目停止 クロック止めない
    18. shutdown クロック止めない
    19. 再生再開
    20. trigger stop 空うち
    21. startup PCMブロックのEnable
    22. hw_params サンプリングレートを設定・ここでPLLやLRCLKの分周比を設定
    23. prepare FIFOクリア
    24. trigger start 二曲目再生再開
    25. trigger stop 二曲目停止 クロック止めない
    26. shutdown クロック止めない

備考

  • SND_SOC_DAIFMT_CONTでtrigger stopのクロック停止を抑制できそう。
  • ただ、このフラグを立てるのはhifiberry_dac.cを直さなきゃいけないので、1ファイルの差し替えで済むので現行のままがお手軽かも。

NanoPi Neo2のビルド環境構築(公式サイトからToolchain取得)

概要

  • 過去記事でNEO2用のビルド環境構築を解説したけど、MediafireからToolchainを持ってきたりでちょっと怪しい感じだったので、Linaroから直接Toolchainをとってきてビルドする手順を確認したのでメモします。
  • Ubuntu 18.04LTS AMD64環境で確認しました。32bit環境は未確認

Build関連パッケージのインストール

  • ビルドするならまずはbuild-essentialを入れる。gcc, g++, make, libc-devあたりを纏めてインストールしてくれる仮想パッケージ。
$ sudo apt install build-essential

Toolchainの取得と展開

  • Linaroのサイトからツールチェインを取得。
  • ポイントは6.x系を選ぶこと。7.x系からはABIが変わる?とかで互換性が無いとか。
  • 取ってきて/opt以下にバラします。
$ wget https://releases.linaro.org/components/toolchain/binaries/6.4-2017.11/aarch64-linux-gnu/gcc-linaro-6.4.1-2017.11-x86_64_aarch64-linux-gnu.tar.xz
$ sudo mkdir -p /opt/linaro/toolchain/
$ sudo tar xvf aarch64-linux-gnu/gcc-linaro-6.4.1-2017.11-x86_64_aarch64-linux-gnu.tar.xz -C /opt/linaro/toolchain/
  • 未確認ですが、32bitだと下記をDLしてください。
https://releases.linaro.org/components/toolchain/binaries/6.4-2017.11/aarch64-linux-gnu/gcc-linaro-6.4.1-2017.11-i686_aarch64-linux-gnu.tar.xz

パスを通す

$ export PATH=/opt/linaro/toolchain/gcc-linaro-6.4.1-2017.11-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
$ git clone https://github.com/tkztkztkz/linux.git
$ cd linux
$ git checkout npi-audio-4.11.y

ビルド

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

モジュールを集める

$ make modules_install ARCH=arm64 INSTALL_MOD_PATH=./mod_root/
$ cd mod_root
$ tar cvfz ../modules.tar.gz ./

ターゲットにコピー

  • 出来上がったarch/arm64/boot/ImageをNanoPi NEO2の/bootにコピー
  • dtbはarch/arm64/boot/dts/allwinner/あたりに生成されます。これも必要なものをコピー
  • modules.tar.gzをターゲット(NEO2)のrootに展開。下記コマンドはNEO2上で実行すること。
$ sudo tar xvfz modules.tar.gz -C /

次回から

  • パスを通してビルドしてターゲットにコピーするだけです。
  • モジュールはカーネルのマイナーバージョンが同じなら2度目以降は全コピー不要。修正したものがあれば手動でコピーしてください。

moode audioのカーネルをクロスビルドする手順メモ

  • moode audioで使用しているRaspbianのカーネルイメージをクロスビルドするにあたっていろいろハマったのでメモして置きます。
  • Ubuntu 18.04LTS AMD64環境で確認
  • ターゲットはRaspberry Pi Zero用。RPi3とか64bitの奴はツールチェインやビルドオプションが変わるはず。

1. toolchainとkernelをとってくる

git clone https://github.com/raspberrypi/tools
git clone https://github.com/raspberrypi/linux

2. toolchainにパスを通す

$ vim rpisetup
export PATH=`pwd`/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin:$PATH
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-

って感じで環境変数を書いたファイルを作成して

source ./rpisetup

とかして読み込む。毎回コマンドラインでexportしても良いです。お好きな方法で。

3. kernel hashを探す

  • まずはmoode audioのプロパティを見て使用しているカーネルを探す。
  • https://github.com/moode-player/mosbuild
  • modbuild.properties ファイルの中身を見る

  • ここにKERNEL_HASHがある

    • KERNEL_HASHという名前だが、raspberrypi/linuxリポジトリのHashではなく、
    • rpi-updateが使ってるHexxeh/rpi-firmwareリポジトリのHashであることに注意
    • 例えば 171c962793f7a39a6798ce374d9d63ab0cbecf8c って感じの文字列がKERNEL_HASHです。

4. kernel git hashを探す

5. rpi kernelを指定のバージョンでチェックアウトする

  • git_hashのハッシュでcheckoutする。これでやっとmoode audioで使ってるバージョンのkernelが取得できる。
cd linux
git checkout b6e99accda7519a48dfd38992d31baefb56b0e10

6. configを実機から持ってくる場合(任意)

  • RPi実機でconfigsをロードしてconfig.gzをクロスビルド環境に持ってきておく
modprobe configs
scp /proc/config.gz hoge とかで実機からビルドマシンに吸い上げる。
zcat config.gz > .config でlinuxディレクトリ配下に展開しておく

7. buildする

  • あとはビルドするだけ
  • .configを実機から持ってきてる場合はoldconfigで。デフォルト設定でビルドするならbcmrpi_defconfigで。
KERNEL=kernel
make oldconfig or make bcmrpi_defconfig
make -j8 zImage modules dtbs

編集履歴

NanoPi Neo2用 Volumio2

NanoPi Neo2 Volumio2 release

  • NanoPi Neo2 I2S Audio Kernelを適用したVolumio2です。
  • バージョンはv2.413を採用しています。
  • 2018/1012追記
    • ロット変更なのか、ブートローダを更新しないと起動しないNEO2があるようです。
    • もし、動作しないようであれば、下記ツイートの暫定版をお試しください。

特徴

  • I2S + MCLK出力可能
  • I2S 16bit長(32fs固定)出力対応
  • RJ 24bit(64fs)/ RJ 16bit(64fs)/ RJ 16bit(32fs)出力対応
  • HiFiBerry DAC+ PRO or compatible対応
  • AK4490/4495/4497/4493対応
  • DACが対応していれば、768kHzや1536kHzの再生が可能
  • 詳しくはNanoPi Neo2 I2S Audio Kernelを参照ください

既知の問題

  • DSD to PCM変換でサンプリングレートが上がりすぎる
    • I2Sの再生サンプリングレート上限が1536kHzとなっているため、DSD to PCM変換時の再生レートが高くなります。
      • DSD64 352.8kHz
      • DSD128 705.6kHz
      • DSD256 1411.2kHz
    • I2S Driver or Codec Driver側にて上限設定する方法を検討中です。
  • 高負荷時にカーネルクラッシュ
  • 再起動(reboot)でこける時がある
    • Linux Kernel 4.14へのアップデート時に解消予定
    • sdのレギュレータ制御不正
  • 標準でsshdが有効になっていません
    • http://volumio.local/dev or http://ipaddress/devで開発者モードに入り有効化してください。

制約など

  • 本Volumio2はNanoPi Neo2 I2S Audio Kernel評価用に作成したものです。
    • Volumio2の使い方については他のサイトを参照ください。
    • Volumio2への機能追加などをリクエストを頂いても基本的には対応できません。
  • ビルド手順を下の方に書いてますので、ぜひいろいろカスタムしてみてください。

使い方

バイナリダウンロード

書き込みと起動

  • windowsならrufuslinuxならddなどでSDカードにイメージを書き込んでください。
  • 初回起動はSDカードのresizeが走るため2-10分程度かかります。途中で電源を落とさないようしてください。

動作モードの切り替え方

  • デフォルトではI2S genericとなっています。
  • その他のモードで使う場合には、dtbファイルを差し替えて機能の切り替えを行ってください。
  • NanoPi Neo2のbootスクリプトは、defaultではsun50i-h5-nanopi-neo2.dtbで起動するので、sun50i-h5-nanopi-neo2.dtbへ上書きしてやるのが簡単です。
  • 下記はNEO2にSSHで接続orシリアルコンソール時の差し替え例で、sun50i-h5-nanopi-neo2-i2s-generic.dtbを使う場合の設定方法です。
$cd /boot
$ cp sun50i-h5-nanopi-neo2-i2s-generic.dtb sun50i-h5-nanopi-neo2.dtb

ソースコード

ビルド手順メモ

$ git clone https://github.com/tkztkztkz/Build.git
$ cd Build
$ sudo ./build.sh -b armv7 -d nanopineo2 -v 2.413
  • Ubuntu 16.04LTSにてビルドを確認済みです。18.04LTSではビルドに失敗することを確認しています。
    • ビルドに必要なパッケージはVolumioのドキュメントを参照ください。参考までにこちらでは下記を実行しました。
sudo apt install git squashfs-tools kpartx multistrap qemu-user-static samba debootstrap parted dosfstools qemu binfmt-support qemu-utils build-essential

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基板の製作とドライバ作成

NanoPiNEO2 HiFiBerry DAC+対応 β版

HiFiBerry DAC+ PRO対応のβ版リリース

HiFiBerry DAC+ PROに対応しました。
twitterには書いてましたがこっちにも簡単にまとめます。

  • HiFiBerry DAC+ PROにて動作確認しています。クローンもたぶん動くはず。
  • HiFiBerry DAC+(外部クロックなし)は未検証です。動くかもしれません。
  • ソフトウェアはmpdとplay(SoX)にて動作確認しています。
  • 対応フォーマット(確認済みのもの)
    • CBM_CFM/CBM_CFS(CBM_CFSは未検証)
    • 16/24/32bit (16bitはバグっててちゃんと出ません。修正版を評価中です。)
    • 44.1/88.2/176.4/352.8k 44.1k系
    • 48/96/192/384k 48k系

接続方法

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の整理
    • 1イメージでI2S Generic(PCM510x)とHifiBerry DAC+ PROの両対応
    • MCLKの有効・無効もdtbの差し替えで対応できるようにしたい
    • Neo PLUS2対応
  • digi+ PRO対応(評価用のボードを入手できれば)
  • バイナリの提供
  • volumio2対応

bugfix

  • 再生中に停止したあと、再度再生するときにノイズの修正
  • メモリリーク(初期化時)

こんな感じであたりで考えていますが、思いがけずSwitch(10G L2と任天堂)を入手してしまったのでいつになるか不明です。
dt-overlay対応はあんまりやる気が無いです。

コードの修正内容抜粋(詳細はコミットログを見てください)

AllWinner系のコード

  • sun8i-i2s.c
    • DAIFMTのCBM_CFM/CBM_CFSサポート
    • Codecノードが見つからない場合にも登録するように修正
      若干メモリリークしていますが、初期化一発のみなのでとりあえず放置。そのうち直す

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だとどうやって動いてるんだ?
  • clk-hifiberry-dacpro.c
    • 修正なし

Amazonマーケットプレイスで購入した商品が不良品だった場合の対処方法 メモ

 Amazonマーケットプレイス登録業者が商品を用意しAmazonが配送するスタイルの注文で、届いた商品が不良品だったので交換を依頼しました。

 手順がとても分かりにくかったのでメモしておきます。

販売店のページを表示

  • まずは購入した商品のページを開く
  • 「この商品は、HOGEHOGEが販売し、Amazon.co.jp が発送します。」 と記載されているところを探し、店名HOGEHOGEをクリックする
  • 右上の「質問する」ボタンを押す

出品者に連絡する

  • お問い合わせの種類にて「注文について」を選択
  • 注文履歴が表示されるので、該当する注文を選ぶ
  • 「お問い合わせ内容を選択してください」から「破損または不具合のある商品が届いた」を選択
  • メッセージを入力をクリック  詳細な故障状況などを記入し、送信する。

あとは販売店から連絡が来るのでやり取りする。

 この時の注意点は直接届いたメールに返信するのではなく、アカウントサービスの「Eメールとメッセージ」メニュー内にあるメッセージセンターを選び「出品者/購入者の連絡」から返信する必要があります。

 面倒くさいですね。

 交換について、Amazon発送の商品だったので今回はクーポン提供となりました。  クーポンを使って無料で新品を再購入する形です。Amazon側の倉庫から交換品を送付することができないため、このような手順になるようです。  今回は購入価格が低かったため、返送は不要でした。

 ちなみに再購入時、色を変えて注文したところ上記クーポンは使えませんでした。購入したものとまったく同じもののみ使用できるようです。