SM8150 Audio驱动分析
1. TDM硬件接口介紹:
I2S只能傳2個(gè)聲道的數(shù)據(jù),PCM可以傳多達(dá)16路數(shù)據(jù),采用時(shí)分復(fù)用的方式,就是TDM。
TDM不像I2S有統(tǒng)一的標(biāo)準(zhǔn),不同的IC廠商在應(yīng)用TDM時(shí)可能略有差異,這些差異表現(xiàn)在時(shí)鐘的極性、聲道配置的觸發(fā)條件和對(duì)閑置聲道的處理等。
特點(diǎn):
- 比I2S節(jié)省管腳數(shù)量
- 支持多路傳輸
- 最多支持16路=16通道
TDM系統(tǒng)框圖:
?2.?Kernel Dtsi 配置:
參考:Documentation/devicetree/bindings/sound/qcom-audio-dev.txt
sa8155-audio.dtsi :
/*TDM Pri組RX端口組配置*/ tdm_pri_rx: qcom,msm-dai-tdm-pri-rx {/*匹配節(jié)點(diǎn),驅(qū)動(dòng)和設(shè)備的compatible屬性相同時(shí),才會(huì)調(diào)用probe函數(shù)。*/compatible = "qcom,msm-dai-tdm";/*TDM 群組ID:支持列表如下:Primary RX: 37120Primary TX: 37121Secondary RX: 37136Secondary TX: 37137Tertiary RX: 37152Tertiary TX: 37153Quaternary RX: 37168Quaternary TX: 37169*/qcom,msm-cpudai-tdm-group-id = <37120>;/*端口數(shù),最大支持端口數(shù)量為8*/qcom,msm-cpudai-tdm-group-num-ports = <4>;/*TDM端口ID數(shù)組,數(shù)組的大小由msm-cpudai-tdm-group-num-ports 中的值決定。每組最多支持 8 個(gè)端口:Primary RX: 36864, 36866, 36868, 36870,36872, 36874, 36876, 36878Primary TX: 36865, 36867, 36869, 36871,36873, 36875, 36877, 36879Secondary RX: 36880, 36882, 36884, 36886,36888, 36890, 36892, 36894Secondary TX: 36881, 36883, 36885, 36887,36889, 36891, 36893, 36895Tertiary RX: 36896, 36898, 36900, 36902,36904, 36906, 36908, 36910Tertiary TX: 36897, 36899, 36901, 36903,36905, 36907, 36909, 36911Quaternary RX: 36912, 36914, 36916, 36918,36920, 36922, 36924, 36926Quaternary TX: 36913, 36915, 36917, 36919,36921, 36923, 36925, 36927*/qcom,msm-cpudai-tdm-group-port-id = <36864 36866 36868 36870>;/*TDM時(shí)鐘速率,設(shè)置為0說(shuō)明使用外部時(shí)鐘*/qcom,msm-cpudai-tdm-clk-rate = <12288000>;/*時(shí)鐘源。0 - EBIT 時(shí)鐘1 - IBIT 時(shí)鐘*/qcom,msm-cpudai-tdm-clk-internal = <1>;/*同步設(shè)置。0 - 短同步位模式1 - 長(zhǎng)同步模式2 - 短同步槽模式*/qcom,msm-cpudai-tdm-sync-mode = <0>;/*同步源。0 - 外部源1 - 內(nèi)部來(lái)源 */qcom,msm-cpudai-tdm-sync-src = <1>;/*其他主機(jī)驅(qū)動(dòng)的數(shù)據(jù)輸出。0 - 禁用1 - 啟用*/qcom,msm-cpudai-tdm-data-out = <0>;/*反轉(zhuǎn)同步。0 - 正常1 - 反轉(zhuǎn)*/qcom,msm-cpudai-tdm-invert-sync = <0>;/*相對(duì)于同步邊沿延遲數(shù)據(jù)的位時(shí)鐘數(shù)。0 - 0 位時(shí)鐘周期1 - 1 位時(shí)鐘周期2 - 2 位時(shí)鐘周期*/qcom,msm-cpudai-tdm-data-delay = <1>;/*TDM CLK 屬性配置*/qcom,msm-cpudai-tdm-clk-attribute = /bits/ 16 <1>;/*TDM RX端口配置,幾路端口由msm-cpudai-tdm-group-num-ports 中的值決定msm-cpudai-tdm-dev-id 由 msm-cpudai-tdm-group-port-id 端口ID數(shù)組決定*/dai_pri_tdm_rx_0: qcom,msm-dai-q6-tdm-pri-rx-0 {compatible = "qcom,msm-dai-q6-tdm";qcom,msm-cpudai-tdm-dev-id = <36864>;qcom,msm-cpudai-tdm-data-align = <0>;};dai_pri_tdm_rx_1: qcom,msm-dai-q6-tdm-pri-rx-1 {compatible = "qcom,msm-dai-q6-tdm";qcom,msm-cpudai-tdm-dev-id = <36866>;qcom,msm-cpudai-tdm-data-align = <0>;};dai_pri_tdm_rx_2: qcom,msm-dai-q6-tdm-pri-rx-2 {compatible = "qcom,msm-dai-q6-tdm";qcom,msm-cpudai-tdm-dev-id = <36868>;qcom,msm-cpudai-tdm-data-align = <0>;};dai_pri_tdm_rx_3: qcom,msm-dai-q6-tdm-pri-rx-3 {compatible = "qcom,msm-dai-q6-tdm";qcom,msm-cpudai-tdm-dev-id = <36870>;qcom,msm-cpudai-tdm-data-align = <0>;}; };/*TDM Pri組TX端口組配置*/ tdm_pri_tx: qcom,msm-dai-tdm-pri-tx {/*匹配節(jié)點(diǎn),驅(qū)動(dòng)和設(shè)備的compatible屬性相同時(shí),才會(huì)調(diào)用probe函數(shù)。*/compatible = "qcom,msm-dai-tdm";qcom,msm-cpudai-tdm-group-id = <37121>;qcom,msm-cpudai-tdm-group-num-ports = <4>;qcom,msm-cpudai-tdm-group-port-id = <36865 36867 36869 36871>;qcom,msm-cpudai-tdm-clk-rate = <12288000>;qcom,msm-cpudai-tdm-clk-internal = <1>;qcom,msm-cpudai-tdm-sync-mode = <0>;qcom,msm-cpudai-tdm-sync-src = <1>;qcom,msm-cpudai-tdm-data-out = <0>;qcom,msm-cpudai-tdm-invert-sync = <0>;qcom,msm-cpudai-tdm-data-delay = <1>;qcom,msm-cpudai-tdm-clk-attribute = /bits/ 16 <1>;dai_pri_tdm_tx_0: qcom,msm-dai-q6-tdm-pri-tx-0 {compatible = "qcom,msm-dai-q6-tdm";qcom,msm-cpudai-tdm-dev-id = <36865>;qcom,msm-cpudai-tdm-data-align = <0>;};dai_pri_tdm_tx_1: qcom,msm-dai-q6-tdm-pri-tx-1 {compatible = "qcom,msm-dai-q6-tdm";qcom,msm-cpudai-tdm-dev-id = <36867>;qcom,msm-cpudai-tdm-data-align = <0>;};dai_pri_tdm_tx_2: qcom,msm-dai-q6-tdm-pri-tx-2 {compatible = "qcom,msm-dai-q6-tdm";qcom,msm-cpudai-tdm-dev-id = <36869>;qcom,msm-cpudai-tdm-data-align = <0>;};dai_pri_tdm_tx_3: qcom,msm-dai-q6-tdm-pri-tx-3 {compatible = "qcom,msm-dai-q6-tdm";qcom,msm-cpudai-tdm-dev-id = <36871>;qcom,msm-cpudai-tdm-data-align = <0>;}; };3. Kernel Driver:
?3.1 tdm驅(qū)動(dòng)(audio front-end (AFE) port 端):kernel/techpack/audio/asoc/msm-dai-q6-v2.c
/* DTM設(shè)備驅(qū)動(dòng),匹配dtsi中 dtm組端口的 tdm_pri_rx: qcom,msm-dai-tdm-pri-rx {compatible = "qcom,msm-dai-tdm";...dai_pri_tdm_rx_0: qcom,msm-dai-q6-tdm-pri-rx-0 {compatible = "qcom,msm-dai-q6-tdm";qcom,msm-cpudai-tdm-dev-id = <36864>;qcom,msm-cpudai-tdm-data-align = <0>;};... }; */ static const struct of_device_id msm_dai_q6_tdm_dev_dt_match[] = {{ .compatible = "qcom,msm-dai-q6-tdm", },{} };MODULE_DEVICE_TABLE(of, msm_dai_q6_tdm_dev_dt_match);static struct platform_driver msm_dai_q6_tdm_driver = {.probe = msm_dai_q6_tdm_dev_probe,.remove = msm_dai_q6_tdm_dev_remove,.driver = {.name = "msm-dai-q6-tdm",.owner = THIS_MODULE,.of_match_table = msm_dai_q6_tdm_dev_dt_match,}, };/*DTM驅(qū)動(dòng)*/ static const struct of_device_id msm_dai_tdm_dt_match[] = {{ .compatible = "qcom,msm-dai-tdm", },{} };MODULE_DEVICE_TABLE(of, msm_dai_tdm_dt_match);static struct platform_driver msm_dai_tdm_q6 = {.probe = msm_dai_tdm_q6_probe,.remove = msm_dai_tdm_q6_remove,.driver = {.name = "msm-dai-tdm",.owner = THIS_MODULE,.of_match_table = msm_dai_tdm_dt_match,}, };/*DTM 設(shè)備驅(qū)動(dòng)注冊(cè)*/ rc = platform_driver_register(&msm_dai_q6_tdm_driver); if (rc) {pr_err("%s: fail to register dai TDM dev drv\n", __func__);goto dai_q6_tdm_drv_fail; } /*DTM驅(qū)動(dòng)注冊(cè)*/ rc = platform_driver_register(&msm_dai_tdm_q6); if (rc) {pr_err("%s: fail to register dai TDM\n", __func__);goto dai_tdm_q6_fail; }3.2 聲卡驅(qū)動(dòng)(audio back-end (ABE) port 端):kernel/techpack/audio/asoc/sa8155.c
目的:用戶態(tài)驅(qū)動(dòng),注冊(cè)PCM聲卡,給User空間調(diào)用。
具體詳情,請(qǐng)看Linux alsa聲卡驅(qū)動(dòng)模型。
/*后端Dai Link 鏈路配置后端 <---> DSP/CODEC <---> DAC/ADC <---> SPK/MIC */ static struct snd_soc_dai_link msm_auto_be_dai_links[] = {/* Backend DAI Links */{.name = LPASS_BE_PRI_TDM_RX_1,.stream_name = "Primary TDM1 Playback", //名稱(播放流).cpu_dai_name = "msm-dai-q6-tdm.36866", //查詢DTSI可以查到該dtm設(shè)備id.platform_name = "msm-pcm-routing",.codec_name = "msm-stub-codec.1",.codec_dai_name = "msm-stub-rx",.no_pcm = 1,.dpcm_playback = 1,.id = MSM_BACKEND_DAI_PRI_TDM_RX_1,//根據(jù)dtsi tdm設(shè)備組ID(36866)配置.be_hw_params_fixup = msm_tdm_be_hw_params_fixup,.ops = &sa8155_tdm_be_ops,.ignore_suspend = 1,},{.name = LPASS_BE_PRI_TDM_RX_2,.stream_name = "Primary TDM2 Playback",.cpu_dai_name = "msm-dai-q6-tdm.36868",.platform_name = "msm-pcm-routing",.codec_name = "msm-stub-codec.1",.codec_dai_name = "msm-stub-rx",.no_pcm = 1,.dpcm_playback = 1,.id = MSM_BACKEND_DAI_PRI_TDM_RX_2,.be_hw_params_fixup = msm_tdm_be_hw_params_fixup,.ops = &sa8155_tdm_be_ops,.ignore_suspend = 1,},ABE snd_soc_dai_link 如何與 AFE的?snd_soc_dai_driver 關(guān)聯(lián)?
- ?Stream Name關(guān)聯(lián)?
- ?CPU dai name 關(guān)聯(lián)?
?
易混技術(shù)點(diǎn):DPCM (Dynamic PCM)
? ? ? ? ? ? ? ???????DAPM (Dynamic Audio Power Manager)
Alsa驅(qū)動(dòng)模型參考:
Audio System 三 之 Linux ALSA音頻系統(tǒng)分析_|~~~熱愛生活、努力學(xué)習(xí)的小伙汁~~~|-CSDN博客
Linux音頻子系統(tǒng)
Linux ALSA | Lucky Boy
總結(jié)
以上是生活随笔為你收集整理的SM8150 Audio驱动分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 清新时尚岗位竞聘个人介绍PPT模板(85
- 下一篇: 第四阶段vue项目总结(新手小白一枚,不