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