Raspberry Pi, Jetson Nano向けオーディオ入出力ボードの作成(PCM5102A+PCM1808編)

##きっかけ
DACはよく見かけるが、ADCも載せたいわゆるコーデックボードは多くない。
数少ない中Microe社の[Audio Codec Board-Proto](https://www.mikroe.com/audio-codec-proto-board 
)という製品はあるようだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/34193707-6398-7966-480a-a42648f1bf67.png)

仕様は、
On-board modules	
WM8731 Audio Codec, stereo 24-bit multi-bit sigma delta ADCs and DACs, Headphone and Microphone audio connectors
Key Features	
Hi-Quality Audio Performance. Selectable ADC High Pass Filter. ADC and DAC Sampling Frequency: 8kHz – 96kHz
Interface		I2C or SPI

とのことである。

回路図によると、Raspberry pi、およびJetson Nanoで対応しているI2S規格に対応しているのと、何らかの設定がI2C接続で行われるようだ。

Raspberry piではLinux組み込みドライバ　WM8731で動作させた事例があるようだが、Jetson Nanoは調べても事例を簡単に見つけることができなかった。

まず、Jetson NanoではI2Cデバイスとして認識させることができなかった。
ラズパイは以下の通りI2Cアドレス0x1aで認識させることができた。

```
pi@pi3:~ $ sudo i2cdetect -r -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- UU -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
```

これをクリアしたとしてもJetson Nano上に認識させるためにデバイスツリーの再構築、ドライバーインストール、ALSAの設定が必要になりそう。ハードルが高い。

3つほど購入したが無駄に終わった。

両ボード向けに使えるI2S対応のオーディオボードがないので作ってみたい。

##I2Sとは
そもそもI2Sの基本の構成はどういうものか。

https://hifiduino.wordpress.com/2014/11/13/raspberry-pi-b-digital-audio/
上記を参考にすると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/b208d4a8-2f80-1f33-f179-6d3080d6d1cb.png)
Serializerと書かれている右側に出ている、PCM_CLK,PCM_FS,PCM_DIN,PCM_DOUTの4本で構成されるらしい。
それに対応するRaspberry piの40ピンヘッダーは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/2640fcc4-1f12-212d-e206-3f16dc059875.png)

つまり
PCM_CLK　⇔　BITCLOCK(12pin)
PCM_FS　⇔　LRCLOCK(35pin)
PCM_DIN　⇔　DATA OUT(40pin)
PCM_DOUT　⇔　DATA IN(38pin)
に接続すればいいらしい。

少し前に流行したI2S DACはI2Cの設定もなくPCM5102Aを使用したすごくシンプルな構成だった。

いろいろ探していると、BeagleBoneBlack向けのADCでPCM1808を組み合わせた回路図が出てきた。
http://www.tij.co.jp/jp/lit/df/tidrim5/tidrim5.pdf

これによると、25MHzのクリスタル出力をSI5351Aで分岐し、MCLK,BCLK,WCLKを作っている。
それをPCM5101,PCM1808へ入力している。
PCM5102にも使えそうな回路で、
PCM1808 DIP化キットは250円、
http://akizukidenshi.com/catalog/g/gK-12988/
PCM5102A　DIP化キットは500円
http://akizukidenshi.com/catalog/g/gK-11836/
Ｓｉ５３５１Ａ－Ｂ自体は秋月で150円。高くない。
MCLK(マスタークロック)とは、チップがオーディオフォーマットを決める基本のクロック。
22.5792MHzと、24.576MHzがある。
LRCLKは信号レベルが0の時にL、1の時にRを送るクロック。一般的にサンプリング周波数と同値になる。
BCLKとはビットクロックのことで、32ビットを読み出すための基準のクロック。32ビットx2（L+R）で64ビットとなる。
例えば　24.5760MHz/8 =  3.072MHz /32/2 =  48KHz
24.576MHｚを8分周して、3.072MhzがBCLK、それを64で割るとLRCLK（48KHz）となる。

ボード上でマスタークロックを生成させる必要があるが、Si5351Aはそれ自体I2Cで設定するらしい。
I2Cの設定から何とか逃れたい。

PCM1808のデータシートに下記の記載がある。
7.3.5.1インタフェースモード
MD1（ピン11）とMD0（ピン10）は、インターフェイスモードとしてマスターモードとスレーブモードを選択します。
表2に、インターフェイスモードの選択を示します。電源を入れる前にMD1とMD0を設定する必要があります。
マスターモードでは、PCM1808デバイスは、PCM1808デバイスとデジタルオーディオプロセッサまたは外部回路との間のシリアルオーディオデータ通信のタイミングを提供します。

上記以降、読み進めていくとマスターモードはSCKIピンにマスタークロックを入れたら、BCK(BITCLOCK)　LRCK(LRCLOCK)を出力してくれるらしい。
Si5351Aを使わなくていいのではないか。やってみよう。

以下のような回路を考えて、バラック組をしてみた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/377f6e41-0acb-e845-6782-5cf8b2036d2a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/2825b5e3-d342-dc96-4ae1-f00f29941c4b.png)

##Raspberry piでのドライバーの組み込み
基本的には共立電子産業の[リンク](https://github.com/kyohritsu/KP-RSCSP/blob/master/docs/microphones.md)の通りドライバーを組み込むが、

今回、BCK,LRCKをコーデック側で作って、Raspberry pi側へ送る設定となるため
my_loader.cの下記44行を書き換える。
https://github.com/PaulCreaser/rpi-i2s-audio/blob/master/my_loader.c

```
.daifmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS,
↓
.daifmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFM,
```


そのほかは上記手順に従っていけば
下記の通り、snd_rpi_simple_cardとして録音、再生デバイスとして認識させることが出来る。

```
pi@pi3:~/rpi-i2s-audio $ aplay -l
**** ハードウェアデバイス PLAYBACK のリスト ****
カード 0: ALSA [bcm2835 ALSA], デバイス 0: bcm2835 ALSA [bcm2835 ALSA]
  サブデバイス: 7/7
  サブデバイス #0: subdevice #0
  サブデバイス #1: subdevice #1
  サブデバイス #2: subdevice #2
  サブデバイス #3: subdevice #3
  サブデバイス #4: subdevice #4
  サブデバイス #5: subdevice #5
  サブデバイス #6: subdevice #6
カード 0: ALSA [bcm2835 ALSA], デバイス 1: bcm2835 IEC958/HDMI [bcm2835 IEC958/HDMI]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
カード 0: ALSA [bcm2835 ALSA], デバイス 2: bcm2835 IEC958/HDMI1 [bcm2835 IEC958/HDMI1]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
カード 1: sndrpisimplecar [snd_rpi_simple_card], デバイス 0: simple-card_codec_link snd-soc-dummy-dai-0 [simple-card_codec_link snd-soc-dummy-dai-0]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0

pi@pi3:~/rpi-i2s-audio $ arecord -l
**** ハードウェアデバイス CAPTURE のリスト ****
カード 1: sndrpisimplecar [snd_rpi_simple_card], デバイス 0: simple-card_codec_link snd-soc-dummy-dai-0 [simple-card_codec_link snd-soc-dummy-dai-0]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
```

さらにRaspberry pi上のAudacity(sudo apt install audacityでインストール)で認識させる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/01716082-844f-ed8f-2ac5-1c43d5c18dab.png)

これで問題なく録音と再生ができるようになった。
上記の回路図のとおり、ジャンパピンでMD1ピンを切り替えることで
ハイ：96khz
ロー：48khz
が設定できるようにした。

elecrowで基盤が安価で気楽に作れるようになってきたので、基盤を作成してみる。
サーバー認証用のチップを追加で乗せている。

[Kicadのプロジェクトファイル](https://github.com/kmwebnet/simplecodec3)をアップロードした。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/be6eed57-f01e-d213-f983-32437eceaba9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/250e2172-fd6d-304c-da79-48d4aa4d6986.png)

この作成したボードを検証していく。