codec音訊編解碼器驅動分析

2021-07-30 11:13:01 字數 3301 閱讀 5584

之前在公司做過cs42l52編解碼器的驅動,不過現在已然已經忘記了。目前手中有友善之臂的一款三星4412的開發板,那麼就分析這款產品的音訊編解碼器吧。

如圖所示,可以看出該開發板使用的是wm8960的音訊編解碼器,查詢原始碼android-5.0.2/linux-3.0.86/sound/soc/codecs/wm8960.c存在,檢視mach-tiny4412.c可以看到如下圖

很顯然可以看到wm8960音訊編解碼器的i2c位址是0x1a,其i2c連線如下圖

也就是該裝置還是乙個i2c裝置,現在來看它的**

模組入口:

module_init(wm8960_modinit);
初始化函式:

static

int __init wm8960_modinit(void)

#endif

return ret;

}

對應的wm8960_i2c_driver資料

static struct i2c_driver wm8960_i2c_driver = ,

.probe = wm8960_i2c_probe,

.remove = __devexit_p(wm8960_i2c_remove),

.id_table = wm8960_i2c_id,

};

一旦探測到裝置執行wm8960_i2c_probe函式

static __devinit int wm8960_i2c_probe(struct i2c_client *i2c,

const

struct i2c_device_id *id)

顯然最重要的是snd_soc_register_codec(&i2c->dev,

&soc_codec_dev_wm8960, &wm8960_dai, 1);這一句了

static struct snd_soc_codec_driver soc_codec_dev_wm8960 = ;

static int wm8960_probe(struct snd_soc_codec *codec)

else

if (pdata->capless)

wm8960->set_bias_level = wm8960_set_bias_level_capless;

}ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8960->control_type);

if (ret < 0)

ret = wm8960_reset(codec);

if (ret < 0)

wm8960->set_bias_level(codec, snd_soc_bias_standby);

/* latch the update bits */

reg = snd_soc_read(codec, wm8960_linvol);

snd_soc_write(codec, wm8960_linvol, reg | 0x100);

reg = snd_soc_read(codec, wm8960_rinvol);

snd_soc_write(codec, wm8960_rinvol, reg | 0x100);

reg = snd_soc_read(codec, wm8960_ladc);

snd_soc_write(codec, wm8960_ladc, reg | 0x100);

reg = snd_soc_read(codec, wm8960_radc);

snd_soc_write(codec, wm8960_radc, reg | 0x100);

reg = snd_soc_read(codec, wm8960_ldac);

snd_soc_write(codec, wm8960_ldac, reg | 0x100);

reg = snd_soc_read(codec, wm8960_rdac);

snd_soc_write(codec, wm8960_rdac, reg | 0x100);

reg = snd_soc_read(codec, wm8960_lout1);

snd_soc_write(codec, wm8960_lout1, reg | 0x100);

reg = snd_soc_read(codec, wm8960_rout1);

snd_soc_write(codec, wm8960_rout1, reg | 0x100);

reg = snd_soc_read(codec, wm8960_lout2);

snd_soc_write(codec, wm8960_lout2, reg | 0x100);

reg = snd_soc_read(codec, wm8960_rout2);

snd_soc_write(codec, wm8960_rout2, reg | 0x100);

snd_soc_add_controls(codec, wm8960_snd_controls,

array_size(wm8960_snd_controls));

wm8960_add_widgets(codec);

return

0;}

在wm8960_probe這個函式中,我們可以看到一些寫暫存器的操作,這個就是對應的wm8960裝置的初始值,具體暫存器設定來哪些初始值得結合datasheet來分析,之前公司弄的cs42l52也是這樣的,當時為了調節從codec出來的音量大小,就是修改這個位置的引數來解決的。

static struct snd_soc_dai_driver wm8960_dai = ,

.capture = ,

.ops = &wm8960_dai_ops,

.symmetric_rates = 1,

};static struct snd_soc_dai_ops wm8960_dai_ops = ;

這裡面東西太多,得結合現實情況來分析。

列舉本機安裝的解碼器 CODEC

include stdio.h include conio.h include stdlib.h for function wcstombs include windows.h include vfw.h pragma comment lib,vfw32.lib 此行可省去 int enumcode...

語音編解碼器 2

2.1.1.1 ilbc協議 6 2.1.1.2 eg.711 eg.711是gips公司基於標準g.711編碼 解碼器的改進型產品,具有極好的抗包丟失強健性。這種改進型編碼 解碼器,使嚴重超載的網路也能保持良好音質。2.1.1.3 ipcm wb ipcm wb是優質 低複雜度寬頻編碼 解碼器,對...

語音編解碼器 3

語音壓縮編碼研究的基本問題就是在一定的編碼速率下,如何用較低的複雜度和較小的時延獲得盡量好的重建語音,因此重建語音質量 編碼速率 演算法複雜度 演算法延遲是衡量編解碼器效能的四個主要因素。表2 1是上述voip常用語音編碼器的指標的對比 1 4 5 6 縱觀集中編解碼器,ilbc有很多技術優勢,主要...