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驱动分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 清新时尚岗位竞聘个人介绍PPT模板(85
- 下一篇: Mac rar解压