1. 程式人生 > >音效卡驅動除錯過程

音效卡驅動除錯過程

 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------將驅動原始碼資訊新增到相應檔案

  • 根據驅動原始碼資訊新增裝置資訊,需要修改DTS

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: 
[email protected]
{ 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>; /* <left slot number> */ ti,right-slot = <1>; /* <right slot number> */ ti,imon-slot-no = <0>; /* <current sense slot number> */ ti,vmon-slot-no = <2>; /* <current voltage slot number> */ status = "ok"; }; //用到I2S引腳 aud_pins_default: audiodefault { pins_cmd_dat { pinmux = <MT8167_PIN_25_EINT25__FUNC_I2S_8CH_MCK>, <MT8167_PIN_55_I2S_DATA_IN__FUNC_I2S_8CH_DO1>, <MT8167_PIN_56_I2S_LRCK__FUNC_I2S_8CH_LRCK>, <MT8167_PIN_57_I2S_BCK__FUNC_I2S_8CH_BCK>, <MT8167_PIN_100_CMDAT0__FUNC_TDM_RX_MCK>, <MT8167_PIN_101_CMDAT1__FUNC_TDM_RX_BCK>, <MT8167_PIN_102_CMMCLK__FUNC_TDM_RX_LRCK>, <MT8167_PIN_103_CMPCLK__FUNC_TDM_RX_DI>, <MT8167_PIN_1_EINT1__FUNC_I2S2_DI>, <MT8167_PIN_60_SDA2__FUNC_SDA2_0>, <MT8167_PIN_61_SCL2__FUNC_SCL2_0>, <MT8167_PIN_36_MRG_CLK__FUNC_I2S0_BCK>, <MT8167_PIN_37_MRG_SYNC__FUNC_I2S0_LRCK>, <MT8167_PIN_38_MRG_DI__FUNC_I2S0_DI>, <MT8167_PIN_20_EINT20__FUNC_I2S3_DO>, <MT8167_PIN_13_EINT13__FUNC_SPDIF_IN>; drive-strength = <MTK_DRIVE_8mA>; };

 

  • 將.c和.h檔案放到同一個資料夾下,在該資料夾下的Makefile(定義編譯哪些檔案以及怎樣編譯這些檔案)和Kconfig(在核心配置時作為配置選項)根據驅動原始碼資訊新增相關資訊
  • 修改Kconfig來配置驅動,定義用到的巨集
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開頭
  • 假如想使這個驅動被編譯,要修改Makefile,新增驅動原始碼相關資訊。
//多檔案模組的定義
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最終連結進核心**************/

 

  •  如果希望編譯成功,需要使能配置項,有兩種方法可選擇,方法一更規範                          
  • 方法一:修改defconfig,啟用某些巨集定

Y:\mtk8516m3v6\src\kernel\linux\v4.4\arch\arm\configs\aud8516m3v4_slc_avs_yocto_defconfig 

  • 方法二:修改上級掛載平臺的kcongfig,在其上級晶片下選中它  

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".

 

  • 修改mt8167s-som.新增dai_link  

 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-------編譯核心

  • export TEMPLATECONF=${PWD}/meta/meta-mediatek-mt8516/conf/base/aud8516m3v4-slc-32b-avs
  • source meta/poky/oe-init-build-env
  • bitbake virtual/kernel -c cleanall
  • bitbake virtual/kernel

 

3------檢視編譯是否成功

  • 編譯後.config(有效的巨集定義)配置項為Y說明定義的配置項有效,可以在Makefile中編譯

Y:\mtk8516m3v6\build\tmp\work\aud8516m3v4_slc_32b_avs-poky-linux-gnueabi\linux-mtk-extension\4.4-r0\linux-mtk-extension-4.4

  • 編譯生成的.o目標檔案

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