Armadilloフォーラム

I2Sでの音声出力の件

itoumasanori

2018年2月15日 14時32分

I2Sでの音声出力の件、
貴社推奨以外のICを検討しております。
I2Cは接続せず、I2Sのみで接続。
デバイスは以下になります。
UDA1334A(NXP)
Armadillo-840で制御するためのドライバはありますでしょうか。

Armadillo-840で音声を出力をしているときにbugy信号のようなものはありますでしょうか。
スピーカーを他の音声デバイス出力と共用したいと考えているため。

コメント

at_kojiro.yamada

2018年2月15日 18時55分

> I2Sでの音声出力の件、
> 貴社推奨以外のICを検討しております。
> I2Cは接続せず、I2Sのみで接続。
> デバイスは以下になります。
> UDA1334A(NXP)
> Armadillo-840で制御するためのドライバはありますでしょうか。

ありません。

上記デバイスのデータシート見てみましたが、
データフォーマットを2ピンのH/L入力で決定して
I2Sでデータを入力すれば動作するのではないでしょうか?

デバイスドライバーを作成するのであれば、
近い型番のICのデバイスドライバー[1]があるのでそちらをベースにすると良いかもしれません。

[1]: linux-3.4-at/sound/soc/codecs/uda134x.c

>
> Armadillo-840で音声を出力をしているときにbugy信号のようなものはありますでしょうか。
> スピーカーを他の音声デバイス出力と共用したいと考えているため。

bugy信号が何かわからなかったのですが、
おそらくBusyのことでしょうか?
(例えば、Armadillo-840で音声を再生している間は、Busy信号(GPIO Xピン)をLowにするとか)

これはソフトウェアでGPIOを制御する事になると思います。

> [1]: linux-3.4-at/sound/soc/codecs/uda134x.c

これと別に、Davinci用カーネルで公開されているものの中にuda1334とされているものがありますね。

https://github.com/bticino/linux-davinci-medium/blob/master/sound/soc/c…

中身を見てみないとuda134xベースで作るのとどちらが早いかわかりませんが、参考にはなりそうです。

linux-3.4-at/sound/soc/codecs/uda134x.cの中身そのままでまずは動作しないか確認したいと思います。
uda134x.cを動作させるまでの手順を確認させてください。

またlinux-3.x\arch\arm\mach-shmobile\board-armadillo840.cの追記箇所を教えてください。
・WM8978でいうfsi_wm8978_platform_initやmaybe_unused fsi_wm8978_init_infoにあたる部分
・void a840_audio_init(void)部分
・その他あれば

手順1:linux3.x/arch/arm/mach-shmobile/Kconfig.armadillo800に以下を追記
config ARMADILLO840_FSIA_SLAVE_DEVICE_UDA134X
bool "AUDIO: UDA134X codec"
select SND_SOC_UDA134X
depends on !(ARMADILLO840_CON7EB_LCD)

手順2:linux3.x/arch/arm/mach-shmobile/board-armadillo840.c追記
追記方法不明

手順3:make menuconfig変更
コーデックの選択
System Type
[*] Armadillo-840 board
Armadillo-840 System Configuration --->
CON7 extendsion board (Custom) --->
( ) LCD
(X) Custom
[*] use FSIA as Slave
Audio Codec (AUDIO: UDA134X codec)
( ) AUDIO: WM8978 codec
( ) AUDIO: CS4270 codec
(X) AUDIO: UDA134X codec

コーデックドライバの選択
Device Drivers
-*- Sound card support
-*- Advanced Linux Sound Architecture
-*- ALSA for SoC audio support
<*> Build all ASoC CODEC drivers

上記手順に間違いや他の方法あればご教授頂きたいと思います。

at_kojiro.yamada

2018年2月27日 19時13分

> 手順1:
>  linux3.x/arch/arm/mach-shmobile/Kconfig.armadillo800に以下を追記
>
> config ARMADILLO840_FSIA_SLAVE_DEVICE_UDA134X
> bool "AUDIO: UDA134X codec"
> select SND_SOC_UDA134X
> depends on !(ARMADILLO840_CON7EB_LCD)

問題なさそうです。

> 手順2:
>  linux3.x/arch/arm/mach-shmobile/board-armadillo840.c追記
>
> 追記方法不明

arch/arm/mach-shmobile/board-armadillo840.c
sound/soc/sh/fsi.c
sound/soc/generic/simple-card.c
sound/soc/codec/wm8978.c
sound/soc/codec/uda134x.c
の内容から推測しました。
uda1334が無いので動作確認しておらず、以下のようにしても動作する保証はありません。
参考になれば幸いです。

- a840_audio_init()
- uda1334 向けのstruct platform_device をここでregisterしてください。
- wm8978, cs4270のようにCONFIGで分岐するように実装すれば、uda1334専用ソースにならずに済みます。

- uda1334 向けの struct platform_device
- .name は "asoc-simple-card"
- .dev.platform_data には uda1334 向けの struct asoc_simple_card_info をいれます

- uda1334 向けの struct asoc_simple_card_info
- .name, .card, .codecは、動作に関係ないただの名前のようなので
wm8978, cs4270 を参考に適当に名前をつけてください
- .cpu_dai, .codec_dai, .platformは、device driver同士を関連付けるた
めの名前で、codec_daiだけ変えます
- .cpu_dai = fsia-dai
- .codec_dai = uda134x-hifi
- linux-3.4-at/sound/soc/codecs/uda134x.c の
snd_soc_dai_driver uda134x_dai の name が "uda134x-hifi" なので。
- .platform = "sh_fsi2",
- .init には uda1334向けのstruct asoc_simple_dai_init_info をいれます

- uda1334向けのstruct asoc_simple_dai_init_info
- 中身は変更しなくて良いです
- .fmt .codec_daifmt, .cpu_daifmt
- 意味は、linux-3.4-at/include/sound/soc-dai.h を読むとわかると思
います
- .sysclk
- Armadillo-840では、ボード上に搭載したオシレータ(12.88MHz)を
FSIACKとAUDIO_CLK(CON7_60 -> WM8978)に接続してるので 12288000 に
なります。

> 手順3:
>  make menuconfig変更
>
> コーデックの選択
> System Type
> [*] Armadillo-840 board
> Armadillo-840 System Configuration --->
> CON7 extendsion board (Custom) --->
> ( ) LCD
> (X) Custom
> [*] use FSIA as Slave
> Audio Codec (AUDIO: UDA134X codec)
> ( ) AUDIO: WM8978 codec
> ( ) AUDIO: CS4270 codec
> (X) AUDIO: UDA134X codec
>
> コーデックドライバの選択
> Device Drivers
> -*- Sound card support
> -*- Advanced Linux Sound Architecture
> -*- ALSA for SoC audio support
> <*> Build all ASoC CODEC drivers

問題なさそうですが、
<*> Build all ASoC CODEC drivers
は不要です。
# 手順1で「AUDIO: UDA134X codec」選択時に
# 「select SND_SOC_UDA134X」するようにしているので

ご回答ありがとうございます。

uda1334を接続して試験した結果、下記のようなエラーが発生しました。
[root@armadillo840-0 (ttySC2) ~]# gst-launch-1.0 audiotestsrc ! "audio/x-raw,cha
nnels=2,rate=48000,width=16" ! alsasink device=hw:1
Setting pipeline to PAUSED ...
ERROR: Pipeline doesn't want to pause.
ERROR: from element /GstPipeline:pipeline0/GstAlsaSink:alsasink0: Could not open
audio device for playback.
Additional debug info:
gstalsasink.c(851): gst_alsasink_open (): /GstPipeline:pipeline0/GstAlsaSink:als
asink0:
Playback open error on device 'hw:1': No such file or directory
Setting pipeline to NULL ...
Freeing pipeline ...

> <*> Build all ASoC CODEC drivers
> は不要です。
> # 手順1で「AUDIO: UDA134X codec」選択時に
> # 「select SND_SOC_UDA134X」するようにしているので
は設定を外すとコンパイルエラーが発生したので
<*> Build all ASoC CODEC driversの状態にしました。

解決するには時間がかかりそうなので、uda1334ではなく、他のICを検討します。

ありがとうございました。