Howto

I2S 接続のオーディオコーデックを使用する方法 (Armadillo-IoT ゲートウェイ G4/X2)

Armadillo-IoTゲートウェイ G4においてI2S接続のオーディオコーデックを使用して、マイクから録音し、ヘッドホンやスピーカーから再生する方法を紹介します。

Armadillo-IoTゲートウェイ G4をベースにした内容になっていますが、Armadillo-X2でも動作確認しています。 Armadillo-X2はArmadillo-IoTゲートウェイ G4の機能を一部減らして小型にした製品で、基本的には同じソフトウェアで動作します。 また、拡張インターフェース(CON11)の仕様も同じですので、CON11用に作った拡張ボードは両方の製品で動作します。

必要なもの

本Howtoでは以下のものが必要となります。

機材 説明
Armadillo-IoTゲートウェイ G4 一式 Armadillo-IoTゲートウェイ G4 本体、ACアダプタ、USBケーブル、LANケーブルが必要です。
TLV320AIC3110ボード 本Howtoに掲載している回路図を参考に作成する必要があります。
ヘッドセット(4極 ミニプラグ CTIA) 動作確認にはHS-DK03TBK/ELECOMを使用しました。
スピーカー(8Ω) 定格1.3W 以上のものが必要です。
作業用PC VMwareが動作可能なスペックのPCが必要です。
ネットワーク環境 Armadillo-IoTゲートウェイ G4と作業用PCはネットワーク通信ができるようにしてください。

使用するオーディオコーデック

オーディオコーデックは以下を使用します。

TLV320AIC3110/Texas Instruments

TLV320AIC3110はTLV320AIC31xxファミリのオーディオコーデックで、 Class-Dアンプ、ステレオオーディオDAC、モノラルオーディオADCを備えています。

デバイスの詳しい情報については、メーカーのホームページを参照してください。

オーディオコーデックの採用ポイント

下記観点で本HowtoではTLV320AIC3110を採用しました。

  • スピーカー、マイクが1つ以上接続できる
  • 2022年6月現在入手可能であるデバイス
  • 歴史のあるデバイスで情報が豊富

TLV320AICxxxxは末尾型番の違いで、アンプ有/無、入出力数の違うもの、LDO内蔵のもの等、様々なラインアップがあります。 また、型番のAIC部分をDACにするとADCなし、ADCにするとDACなしを選択できます。

Texas Instruments製以外ですと、Armadillo-IoTゲートウェイG4に搭載しているSoC(i.MX8M Plus)と同じメーカー製のSGTL5000や i.MX8M Plus評価キット(8MPLUSLPD4-EVK)で使用されているCirrus Logic製のWM8960等も情報が豊富です。

DAC/ADC両方必要なのか、アンプは内蔵か外付けか、マイク、スピーカーはいくつ必要か、音質にこだわるのか等、 選定ポイントは色々あると思いますので、目的にあったデバイスを採用するのが良いかと思います。

ハードウェア

参考回路図

本Howtoで作成したTLV320AIC3110ボードの回路図は以下からダウンロードすることができます。

項目 ファイル
参考回路図 armadillo-iot-g4_tlv320-demo_schematic.pdf

マイクはヘッドセット用のシングルエンド1つにしましたが、シングルエンドは最大3つ、差動は1つまで対応できるようです。

参考回路は動作を保証するものではありません。回路設計の際にはデバイスのデータシートやアプリケーションノートをご確認の上、十分な評価をお願いいたします。

ピンアサイン

Armadillo-IoTゲートウェイ G4のCON11に接続します。

使用するピンは以下のとおりです。

CON11ピン番号 i.MX8MP 信号名 TLV320AIC3110 信号名
5 I2C4_SCL SCL
7 I2C4_SDA SDA
14 SAI3_TX_SYNC WCLK
16 SAI3_TX_BCLK BCLK
18 SAI3_TX_DATA0 DIN
20 SAI3_RX_DATA0 DOUT
22 SAI3_MCLK MCLK
24 GPIO1_IO15 RESET
30 VDD_1V8 1.8V
32 VDD_5V 5V
34 GND GND

TLV320AIC3110を動作させるには、I2S信号に加え、I2C信号、リセット信号(GPIO)が必要となります。 I2CバスはArmadillo-IoT ゲートウェイ G4上で4.7kΩプルアップされているI2C4、GPIOはI2Sの近くのピンを選択しました。

電源回路

TLV320AIC3110は以下の電源が必要となります。

電源種類 ピン名称 電圧範囲
スピーカー電源 SPLVDD、SPRVDD 2.7~5.5V
コア電源 DVDD 1.65~1.95V
IO電源 IOVDD 1.65~1.95V
ヘッドホン電源 HPVDD 2.7~3.6V
アナログ電源 AVDD 2.7~3.6V

CON11に出ている電源はVDD_5V(5V)とVDD_1.8V(1.8V)ですので、アナログ、ヘッドホン電源(3.3V)の電源回路が別途必要となります。 Armadillo-X2の場合は、CON11の隣りのCON16のVEXT_3V3(3.3V)を使用することも可能です。

電源シーケンスについては、守らなくても故障することはないようですが、予期しない動作を防ぐため、データシートどおりに設計することをお勧めします。

Armadillo-IoTゲートウェイ G4の電源シーケンスについては、製品マニュアル「14.1.6. 電源シーケンス」で確認することができます。

5V(スピーカー) -> 1.8V(コア、IO) -> 3.3V(ヘッドホン、アナログ)の順に電源を供給したいので、VDD_5Vから3.3Vを生成し、EnableピンをVDD_1.8Vで制御しています。

コネクタ

ヘッドセットのジャックは4極ミニプラグ(CTIA)用に配線しています。

未使用ピン

未使用の入力ピンがある場合、終端されていない入力からのノイズを防ぐために、約0.47uFのコンデンサを介してGNDにAC終端することが推奨されています。 アナログ入力にはDCバイアスがあるため、GNDへの直接短絡はしないほうが良いです。

ソフトウェア

使用ソフトウェア

本Howtoで使用したソフトウェアは次のとおりです。

項目 ファイル
開発環境 ATDE9 (v20220124)
Linuxカーネル linux-at-5.10.118-r0.tar
Linuxカーネルパッチ 0001-g4-tlv320aic3110-support.patch

Armadillo-X2は下記ソフトウェアで動作確認しています。

項目 ファイル
Linuxカーネル linux-at-x2-5.10.161-r0.tar
Linuxカーネルパッチ 0001-g4-tlv320aic3110-support.patch

LinuxカーネルイメージとDTBファイルの作成

TLV320AIC3110に対応したLinuxカーネルイメージとDTBファイルを作成します。

作業用PC上でATDEを立ち上げ、ソースコードの準備を行います。 Linuxカーネルのソースアーカイブを展開し、パッチを適用します。

[ATDE ~]$ ls
0001-g4-tlv320aic3110-support.patch  linux-at-5.10.118-r0.tar
[ATDE ~]$ tar xf linux-at-5.10.118-r0.tar
[ATDE ~]$ tar xf linux-at-5.10.118-r0/linux-5.10-5.10.118-r0.tar.gz
[ATDE ~]$ cd linux-5.10-5.10.118-r0/
[ATDE ~/linux-5.10-5.10.118-r0]$ patch -p1 < ../0001-g4-tlv320aic3110-support.patch
patching file arch/arm64/boot/dts/freescale/armadillo_iotg_g4.dts
patching file arch/arm64/configs/x2_defconfig

デフォルトカーネルコンフィギュレーションを適用します。

[ATDE ~/linux-5.10-5.10.118-r0]$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- x2_defconfig
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
  HOSTCC  scripts/kconfig/confdata.o
  HOSTCC  scripts/kconfig/expr.o
  LEX     scripts/kconfig/lexer.lex.c
  YACC    scripts/kconfig/parser.tab.[ch]
  HOSTCC  scripts/kconfig/lexer.lex.o
  HOSTCC  scripts/kconfig/parser.tab.o
  HOSTCC  scripts/kconfig/preprocess.o
  HOSTCC  scripts/kconfig/symbol.o
  HOSTCC  scripts/kconfig/util.o
  HOSTLD  scripts/kconfig/conf
#
# configuration written to .config
#

ビルドします。ビルドには数分かかります。

[ATDE ~/linux-5.10-5.10.118-r0]$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j4

LinuxカーネルイメージとDTBファイルを確認します。

[ATDE ~/linux-5.10-5.10.118-r0]$ ls arch/arm64/boot/Image
arch/arm64/boot/Image
[ATDE ~/linux-5.10-5.10.118-r0]$ ls arch/arm64/boot/dts/freescale/armadillo_*.dtb
arch/arm64/boot/dts/freescale/armadillo_iotg_g4.dtb

動作確認

動作確認環境

Armadillo-IoTゲートウェイ G4の動作確認環境は次のとおりです。

項目 ファイル
Armadillo Base OS Armadillo-Base OS(3.15.4-at.7)

Armadillo-X2は下記で動作確認しています。

項目 ファイル
Armadillo Base OS Armadillo-Base OS(v3.17.1-at.2)

LinuxカーネルイメージとDTBファイルの変更

Armadillo-IoTゲートウェイ G4のLinuxカーネルイメージとDTBファイルを開発中のDTBファイルの書き換えの手順で変更します。

開発後に変更する場合は、DTB確定後の書き換えの手順を確認してください。

[armadillo ~/]# ls 
Image armadillo_iotg_g4.dtb 
[armadillo ~/]# rm -f /boot/armadillo_iotg_g4.dtb
[armadillo ~/]# rm -f /boot/Image
[armadillo ~/]# cp armadillo_iotg_g4.dtb /boot/armadillo_iotg_g4.dtb
[armadillo ~/]# cp Image /boot/Image
[armadillo ~/]# persist_file -rvp /boot/
'/boot/Image' -> '/mnt/boot/Image'
'/boot/armadillo_iotg_g4.dtb' -> '/mnt/boot/armadillo_iotg_g4.dtb'

書き換え後、再起動をしてください。 変更後のLinuxカーネルイメージとDTBファイルを使用して起動します。

コンテナの作成

Armadillo Base OSでは基本的にユーザーアプリケーションをpodmanコンテナ上で実行します。 スピーカーやマイクをコンテナ内から扱うためには、ホストOS側のデバイスファイル /dev/snd をコンテナに渡す必要があります。 /dev/snd を渡してdebianイメージからsnd_exampleという名前でコンテナを作成し、起動します。 (インターネットに繋がっている必要があります。)

[armadillo ~]# podman run -it --name=snd_example --device=/dev/snd docker.io/debian /bin/bash

alsa-utilsのインストール

alsa-utils をインストールします。

[container ~]# apt update && apt upgrade -y
[container ~]# apt install alsa-utils -y

デバイスの確認

再生デバイスができていることを確認をします。card 0 が今回追加した再生デバイスです。

[container /]# aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: armadilloiotgg4 [armadillo_iotg_g4-tlv320aic3110], device 0: 30c30000.sai-tlv320aic31xx-hifi tlv320aic31xx-hifi-0 [30c30000.sai-tlv320aic31xx-hifi tlv320aic31xx-hifi-0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: audiohdmi [audio-hdmi], device 0: imx8 hdmi i2s-hifi-0 [imx8 hdmi i2s-hifi-0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

録音デバイスができていることを確認をします。card 0 が今回追加した録音デバイスです。

[container /]# arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: armadilloiotgg4 [armadillo_iotg_g4-tlv320aic3110], device 0: 30c30000.sai-tlv320aic31xx-hifi tlv320aic31xx-hifi-0 [30c30000.sai-tlv320aic31xx-hifi tlv320aic31xx-hifi-0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

ヘッドホンの設定

ヘッドホンの設定をします。 音の大きさは、DAC、HP Analog、HP Driverの設定で変更できます。

[container /]# amixer sset 'DAC' 127
[container /]# amixer sset 'HP Analog' 50
[container /]# amixer sset 'HP Driver' 0 on
[container /]# amixer sset 'HP Left' on
[container /]# amixer sset 'HP Right' on
[container /]# amixer sset 'Output Left From Left DAC' on
[container /]# amixer sset 'Output Right From Right DAC' on

スピーカーの設定

スピーカーの設定をします。 音の大きさは、DAC、Speaker Analog、 Speaker Driverの設定で変更できます。

[container /]# amixer sset 'DAC' 127
[container /]# amixer sset 'Speaker Analog' 50
[container /]# amixer sset 'Speaker Driver' 0 on
[container /]# amixer sset 'Speaker Left' on
[container /]# amixer sset 'Speaker Right' on
[container /]# amixer sset 'Output Left From Left DAC' on
[container /]# amixer sset 'Output Right From Right DAC' on

マイクの設定

マイクの設定をします。

[container /]# amixer sset 'MIC1LM M-Terminal' 'Off'
[container /]# amixer sset 'MIC1LM P-Terminal' 'Off'
[container /]# amixer sset 'MIC1LP P-Terminal' 'Off'
[container /]# amixer sset 'MIC1RP P-Terminal' 'FFR 10 Ohm'
[container /]# amixer sset 'ADC' 64
[container /]# amixer cset name='ADC Capture Switch' on

録音

録音します。以下は 192kHz 16bit で 10 秒間録音する例です。

[container /]# arecord -Dhw:0,0 -r192000 -fS16_LE -c2 mic_rec.wav -d10
Recording WAVE 'mic_rec.wav' : Signed 16 bit Little Endian, Rate 192000 Hz, Stereo

再生

再生します。再生したいファイルを転送し、再生してください。 ヘッドセット、スピーカーの両方から同じものが再生されます。

[container /]# aplay -Dhw:0,0 mic_rec.wav
Playing WAVE 'mic_rec.wav' : Signed 16 bit Little Endian, Rate 192000 Hz, Stereo