ALSA声卡驱动
https://blog.csdn.net/droidphone/article/category/1118446
PCM(Pulse-code modulation)脉冲编码调制,把声音从模拟转换成数字信号的一种技术
https://blog.csdn.net/droidphone/article/details/6308006
数字音频接口,即The Digital Audio Interface,简称DAI,连接codec和CPU进行通信
https://blog.csdn.net/xgbing/article/details/79578165
声卡驱动调试过程
1------将驱动源码信息添加到相应文件
Y:\mtk8516m3v6\src\kernel\linux\v4.4\arch\arm\boot\dts\mediatek\aud8516m3v4_slc_avs_yocto.dts
sound: sound {
compatible = "mediatek,mt8167s-som";
mediatek,platform = <&afe>;
pinctrl-names = "default";
pinctrl-0 = <&aud_pins_default>;
mediatek,audio-codec = <&tas2770>;
status = "okay";
};
//设备信息,挂载在I2C2下
tas2770: tas2770@41 {
compatible = "ti,tas2770";
reg = <0x41>;//地址(0x82转换=(1000 0010)最后一位0是读写位0x41=(0100 0001))
ti,reset-gpio = <&pio 4 0>;//复位4号引脚
ti,irq-gpio = <&pio 6 0>;//中断6号引脚
ti,asi-format = <0>; /* 0, i2S; 1, DSP; */
ti,left-slot = <0>; /* */
ti,right-slot = <1>; /* */
ti,imon-slot-no = <0>; /* */
ti,vmon-slot-no = <2>; /* */
status = "ok";
};
//用到I2S引脚
aud_pins_default: audiodefault {
pins_cmd_dat {
pinmux = ,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
;
drive-strength = ;
};
menuconfig SND_SOC_TAS2770
tristate "Texas Instruments TAS2770 SmartAmp(R)"
config TAS2770_REGMAP
bool "Use of RegMap API"
config TAS2770_CODEC
bool "Codec Driver support"
endmenu
//包含在menu/endmenu中的内容为菜单项,可以有多个菜单项,需要以config开头
//多文件模块的定义
snd-soc-tas2770-objs := tas2770-codec.o tas2770-regmap.o
obj-$(CONFIG_SND_SOC_TAS2770) += snd-soc-tas2770.o
snd-soc-tas2770-y := tas2770-codec.o tas2770-regmap.o
obj-$(CONFIG_SND_SOC_TAS2770) += snd-soc-tas2770.o
/************模块的名字为snd-soc-tas2770,
由tas2770-codec.h和 tas2770-codec.c文件编译得到tas2770-codec.o并链接进内核,
由tas2770-regmap.h和tas2770-regmap.c文件编译得到tas2770-regmap.o并链接进内核,
如果CONFIG_SND_SOC_TAS2770的值是m,由tas2770-codec.o 和tas2770-regmap.o两个目标文件最终链接生成snd-soc-tas2770.o 直至snd-soc-tas2770.ko文件
如果CONFIG_SND_SOC_TAS2770的值是y,生成的snd-soc-tas2770.o将被链接进built-in.o最终链接进内核**************/
Y:\mtk8516m3v6\src\kernel\linux\v4.4\arch\arm\configs\aud8516m3v4_slc_avs_yocto_defconfig
Y:\mtk8516m3v6\src\kernel\linux\v4.4\sound\soc\mediatek\kcongfig
/************defconfig开启*************/
CONFIG_SND_SOC_MT8167S_SOM_MACH=y
CONFIG_TAS2770_REGMAP=y
CONFIG_TAS2770_CODEC=y
/************Kconfig自选*************/
config SND_SOC_MT8167S_SOM_MACH
tristate "ASoC Audio driver for MT8167SSOM"
depends on MACH_MT8167
select SND_SOC_MT8167
select SND_SOC_TAS5782M
select SND_SOC_MT8167_CODEC
select SND_SOC_TLV320WN
/****add****/
select SND_SOC_TAs2770
select SND_SOC_TAs2770.codec
select SND_SOC_TAs2770.regmap
/****end****/
help
This adds support for ASoC machine driver for Mediatek MT8167 SOM
platforms with internal audio codec and speaker codec TAS5782M.
Select Y if you have such device.
If unsure select "N".
Y:\mtk8516m3v6\src\kernel\linux\v4.4\sound\soc\mediatek\mt8167
{
.name = "HDMI BE",
.cpu_dai_name = "HDMIO",//CPU的dai接口
.no_pcm = 1,
.codec_dai_name = "tas2770 ASI1",//codec芯片里的使用的一个接口
.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
SND_SOC_DAIFMT_CBS_CFS,
.dpcm_playback = 1,
},
..........
..........
{
.name = "I2S BE",
.cpu_dai_name = "I2S",//CPU的dai接口
.no_pcm = 1,
.codec_dai_name = "tas2770 ASI1",//codec芯片里的使用的一个接口,进行匹配
.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
SND_SOC_DAIFMT_CBS_CFS,
.dpcm_capture = 1,
},
/*********这里不需要codec的地址,也可以通过名字.codec_dai_name匹配****************
.codec_name = "tas2770.3-0041",
tas2770是codec(编解码芯片)的名字,
0代表I2C总线1,如果是1则代表I2C总线2,依次类推
0041是I2C设备的地址
********************************************************************************/
2-------编译内核
3------查看编译是否成功
Y:\mtk8516m3v6\build\tmp\work\aud8516m3v4_slc_32b_avs-poky-linux-gnueabi\linux-mtk-extension\4.4-r0\linux-mtk-extension-4.4
Y:\mtk8516m3v6\build\tmp\work\aud8516m3v4_slc_32b_avs-poky-linux-gnueabi\linux-mtk-extension\4.4-r0\linux-mtk-extension-4.4\sound\soc\codecs
4-------查看编译错误日志
Y:\mtk8516m3v6\build\tmp\work\aud8516m3v4_slc_32b_avs-poky-linux-gnueabi\linux-mtk-extension\4.4-r0\temp
5--------查看烧录后,开发板是否有声卡设备
adb shell
cd proc
cd asound
ls
//声卡若存在,则有设备card0