Raspberry Pi ZeroでRJフォーマットDACを鳴らす方法のメモ

概要

  • TDA1545AやTDA1543AなどRJフォーマットを採用しているDACRaspberry Piで鳴らす方法のメモです。
  • NosPiDACでTDA1545Aを鳴らしたかったので、調査・検証してみました。

仕組み

  • 通常ALSAのSoCドライバではdai linkを設定するdriverでPCMフォーマットを設定しているのでそこを直す
  • Raspberry PiのI2S DAC出力を構成するドライバは下記の三種
    • sound/soc/bcm/bcm2835-i2s.c (dai driver)
    • sound/soc/bcm/hifiberry_dac.c (dai link driver)
    • sound/soc/codecs/pcm5102a.c (codec driver)
  • なので、hifiberry_dac.cを修正します。

注意事項

  • Raspberry PiのI2Sドライバは再生ストリームのbit depthと出力bit depthを調整する機能がありません。
    • 再生ストリームのbit depthが出力bit depthになってしまっているようです。
    • RJ16bitのDACを使う場合には、再生bit depthを16bitにしてください。
    • mpdなどで再生bit depthを16bit固定にしてあげるのが簡単です。
      • /etc/mpd.confを下記のように設定 audio_output_format "*:16:*"
  • RJ24bit / RJ32bitに関しては未確認です。
    • RJ32bitはLJ設定32bit固定でも鳴りそうですね。

ソースDiff

diff --git a/sound/soc/bcm/hifiberry_dac.c b/sound/soc/bcm/hifiberry_dac.c
index ee9f13395354..221a8dc820b4
--- a/sound/soc/bcm/hifiberry_dac.c
+++ b/sound/soc/bcm/hifiberry_dac.c
@@ -53,7 +53,8 @@ static struct snd_soc_dai_link snd_rpi_hifiberry_dac_dai[] = {
        .codec_dai_name = "pcm5102a-hifi",
        .platform_name  = "bcm2708-i2s.0",
        .codec_name     = "pcm5102a-codec",
-       .dai_fmt        = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
+       .dai_fmt        = SND_SOC_DAIFMT_RIGHT_J | SND_SOC_DAIFMT_NB_NF |
                                SND_SOC_DAIFMT_CBS_CFS,
        .ops            = &snd_rpi_hifiberry_dac_ops,
        .init           = snd_rpi_hifiberry_dac_init,

備考

  • hifiberry_dac.cでdevice treeを読んでPCMフォーマットを切り替えられるようになると便利だね。
  • 出力bit depthもDAC合わせて固定したいな。
  • ついでにcodecもdevice treeから読むようにすれば、電子ボリュームとかに簡単に対応できるようになりそう。
  • どっかで時間が取れたら作ってみようかな。