DAI/Digital Audio Interfaces 数字音频接口
先看下声卡模型
以展讯平台为例,进行讲解
声卡平台(dma资源)
sprd_pcm_iis: sprd-pcm-iis {
compatible = "sprd,sharkl3-pcm-platform";
#sound-dai-cells = <0>;
dmas = <&ap_dma 5 &ap_dma 6>;
dma-names = "iis0_tx", "iis0_rx";
sprd,dma-2stage-usecase = <2>;
sprd,node-count-2stage-level-1 = <1>;
sprd,syscon-pmu-apb = <&pmu_apb_regs>;
sprd,dma-2stage-level-1-int-source = <1>;
};
声卡cpu_dai
i2s0: i2s@70d00000 {
...
compatible = "sprd,i2s";
sprd,config_type = "pcm";
sprd,slave_timeout = <0xF11>;
sprd,_hw_port = <0>;
sprd,fs = <8000>;
sprd,bus_type = <1>;
sprd,rtx_mode = <3>;
sprd,byte_per_chan = <1>;
sprd,slave_mode = <0>;
sprd,lsb = <0>;
sprd,lrck = <0>;
sprd,low_for_left = <1>;
sprd,clk_inv = <0>;
sprd,pcm_short_frame = <1>;
sprd,pcm_slot = <0x1>;
sprd,pcm_cycle = <1>;
sprd,tx_watermark = <12>;
sprd,rx_watermark = <20>;
};
声卡codec_dai
esmicarray:es7210@40{
compatible = "MicArray_0";
#sound-dai-cells = <1>;
en1-gpios = <&ap_gpio 15 GPIO_ACTIVE_HIGH>;//1.8v
en2-gpios = <&ap_gpio 16 GPIO_ACTIVE_HIGH>;//3.3v
reg = <0x40>;
};
三个驱动都跑完后,进行声卡绑定和注册
compatible = "sprd,i2s-null-codec";
status = "okay";
sprd-audio-card,name = "all-i2s";
sprd-audio-card,dai-link@0 {
plat {
sound-dai = <&sprd_pcm_iis>;
};
cpu {
sound-dai = <&i2s0>;
};
codec {
sound-dai = <&esmicarray 0>;
};
};
};
声卡snd_soc_register_card数据结构
struct snd_soc_pcm_runtime {
struct snd_soc_card *card;
struct snd_soc_dai_link *dai_link;
struct snd_pcm *pcm; //soc_new_pcm
struct snd_soc_codec *codec;
//soc_bind_dai_link
struct snd_soc_platform *platform;
struct snd_soc_dai *codec_dai;
struct snd_soc_dai *cpu_dai;
};
重点关注下snd_soc_instantiate_card
static int snd_soc_instantiate_card(struct snd_soc_card *card)
{
soc_bind_dai_link();
snd_card_new(card->dev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1,card->owner, 0, &card->snd_card);
soc_probe_link_components(card, rtd, order);//es7210_probe
soc_probe_link_dais(card, rtd, order);
snd_card_register(card->snd_card);
}
看下soc_probe_link_dais函数
看下录音和播放的关键流程
pcm_open流程
pcm_read/pcm_write流程