日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SM8150 Audio驱动分析

發(fā)布時間:2024/1/1 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SM8150 Audio驱动分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. TDM硬件接口介紹:

I2S只能傳2個聲道的數據,PCM可以傳多達16路數據,采用時分復用的方式,就是TDM。

TDM不像I2S有統一的標準,不同的IC廠商在應用TDM時可能略有差異,這些差異表現在時鐘的極性、聲道配置的觸發(fā)條件和對閑置聲道的處理等。

特點

  • 比I2S節(jié)省管腳數量
  • 支持多路傳輸
  • 最多支持16路=16通道

TDM系統框圖:

?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é)點,驅動和設備的compatible屬性相同時,才會調用probe函數。*/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>;/*端口數,最大支持端口數量為8*/qcom,msm-cpudai-tdm-group-num-ports = <4>;/*TDM端口ID數組,數組的大小由msm-cpudai-tdm-group-num-ports 中的值決定。每組最多支持 8 個端口: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時鐘速率,設置為0說明使用外部時鐘*/qcom,msm-cpudai-tdm-clk-rate = <12288000>;/*時鐘源。0 - EBIT 時鐘1 - IBIT 時鐘*/qcom,msm-cpudai-tdm-clk-internal = <1>;/*同步設置。0 - 短同步位模式1 - 長同步模式2 - 短同步槽模式*/qcom,msm-cpudai-tdm-sync-mode = <0>;/*同步源。0 - 外部源1 - 內部來源 */qcom,msm-cpudai-tdm-sync-src = <1>;/*其他主機驅動的數據輸出。0 - 禁用1 - 啟用*/qcom,msm-cpudai-tdm-data-out = <0>;/*反轉同步。0 - 正常1 - 反轉*/qcom,msm-cpudai-tdm-invert-sync = <0>;/*相對于同步邊沿延遲數據的位時鐘數。0 - 0 位時鐘周期1 - 1 位時鐘周期2 - 2 位時鐘周期*/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數組決定*/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é)點,驅動和設備的compatible屬性相同時,才會調用probe函數。*/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驅動(audio front-end (AFE) port 端):kernel/techpack/audio/asoc/msm-dai-q6-v2.c

/* DTM設備驅動,匹配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驅動*/ 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 設備驅動注冊*/ 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驅動注冊*/ 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 聲卡驅動(audio back-end (ABE) port 端):kernel/techpack/audio/asoc/sa8155.c

目的:用戶態(tài)驅動,注冊PCM聲卡,給User空間調用。

具體詳情,請看Linux alsa聲卡驅動模型。

/*后端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設備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,//根據dtsi tdm設備組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 關聯?

  • ?Stream Name關聯?
  • ?CPU dai name 關聯?

?

易混技術點:DPCM (Dynamic PCM)

? ? ? ? ? ? ? ???????DAPM (Dynamic Audio Power Manager)

Alsa驅動模型參考:

Audio System 三 之 Linux ALSA音頻系統分析_|~~~熱愛生活、努力學習的小伙汁~~~|-CSDN博客

Linux音頻子系統

Linux ALSA | Lucky Boy

總結

以上是生活随笔為你收集整理的SM8150 Audio驱动分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。