Linux下声卡小析

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流程

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值