概要
- TDA1545AやTDA1543AなどRJフォーマットを採用しているDACをRaspberry 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から読むようにすれば、電子ボリュームとかに簡単に対応できるようになりそう。
- どっかで時間が取れたら作ってみようかな。