驅動開發硬核特訓 · Day 30(下篇): 深入解析 lm48100q I2C 音頻編解碼器驅動模型(基于 i.MX8MP)

作者:嵌入式Jerry
視頻教程請關注 B 站:“嵌入式Jerry”


一、背景與目標

在本篇中,我們圍繞 TI 的 lm48100q 音頻編解碼器 展開,深入講解其作為 I2C 外設如何集成至 Linux 內核音頻子系統(ASoC),配合 i.MX8MP 平臺上的 SAI 接口 實現音頻回放功能。

目標包括:

  • 理解 lm48100q 的設備樹綁定方式
  • 解析 codec 驅動與 machine 驅動的協同工作
  • 分析其 register map、音頻路徑、power domain 的實現方式
  • 展示 ASoC codec 驅動完整注冊流程及常用結構體
  • 給出核心代碼結構 + 注釋 + 驅動關系圖

在這里插入圖片描述

二、設備樹配置分析(i.MX8MP)

imx8mp-evk.dts 中:

&i2c2 {clock-frequency = <100000>;pinctrl-names = "default";pinctrl-0 = <&pinctrl_i2c2>;status = "okay";lm48100q_codec: lm48100q@7d {compatible = "ti,lm48100q";reg = <0x7d>;#sound-dai-cells = <0>;};
};

解釋:

  • i2c2 為 I2C 控制器,lm48100q 為掛載在 I2C 總線上的 codec,地址為 0x7d
  • #sound-dai-cells = <0>:表示 DAI(Digital Audio Interface)不接受參數,是一個單一 DAI。

對應的 sound-pcm1754 節點配置了該 codec:

sound-pcm1754 {compatible = "simple-audio-card";...simple-audio-card,codec {sound-dai = <&lm48100q_codec>;};
};

三、Linux 驅動結構概覽

lm48100q 采用標準的 ASoC codec 驅動模型,主要涉及三個部分:

  • lm48100q.c:codec 驅動本體(提供 DAI,電源,widget,路由定義)
  • simple-audio-card.c:machine 驅動(描述 CPU 和 codec 的連接關系)
  • fsl-sai.c:SAI 接口的 platform 驅動

整體結構如下圖:

       Userspace (aplay)↓ALSA PCM Interface↓ASoC Core Framework↓            ↓Codec Driver   Platform Driverlm48100q.c       fsl-sai.c↓              ↓I2C (regmap)     SAI (platform)↓              ↓音頻編解碼芯片      i.MX SAI 控制器

四、lm48100q Codec 驅動詳解

源碼路徑:sound/soc/codecs/lm48100q.c(或 TI 提供)

1. 模塊入口與 of 綁定

static const struct of_device_id lm48100q_of_match[] = {{ .compatible = "ti,lm48100q" },{},
};
MODULE_DEVICE_TABLE(of, lm48100q_of_match);

綁定設備樹節點中的 "ti,lm48100q"


2. I2C 驅動結構

static struct i2c_driver lm48100q_i2c_driver = {.driver = {.name = "lm48100q",.of_match_table = lm48100q_of_match,},.probe = lm48100q_i2c_probe,.remove = lm48100q_i2c_remove,
};

3. codec 結構體注冊

static const struct regmap_config lm48100q_regmap = {.reg_bits = 8,.val_bits = 8,.max_register = LM48100Q_MAX_REG,.volatile_reg = lm48100q_volatile,
};static int lm48100q_i2c_probe(struct i2c_client *i2c)
{struct regmap *regmap;regmap = devm_regmap_init_i2c(i2c, &lm48100q_regmap);...return devm_snd_soc_register_component(&i2c->dev,&soc_component_dev_lm48100q, &lm48100q_dai, 1);
}
  • 使用 regmap 管理寄存器讀寫
  • 通過 snd_soc_register_component() 注冊 codec

4. DAI 定義

static struct snd_soc_dai_driver lm48100q_dai = {.name = "lm48100q-hifi",.playback = {.stream_name = "Playback",.channels_min = 2,.channels_max = 2,.rates = SNDRV_PCM_RATE_8000_192000,.formats = SNDRV_PCM_FMTBIT_S16_LE |SNDRV_PCM_FMTBIT_S24_LE,},.ops = &lm48100q_dai_ops,
};

該 DAI 只支持 Playback,不支持錄音。


5. 控件與路徑配置(Widgets & Routes)

static const struct snd_soc_dapm_widget lm48100q_dapm_widgets[] = {SND_SOC_DAPM_DAC("DAC", "Playback", SND_SOC_NOPM, 0, 0),SND_SOC_DAPM_OUTPUT("HPOL"),SND_SOC_DAPM_OUTPUT("HPOR"),
};static const struct snd_soc_dapm_route lm48100q_dapm_routes[] = {{ "HPOL", NULL, "DAC" },{ "HPOR", NULL, "DAC" },
};

定義音頻組件的連接路徑。


五、Machine 驅動部分(simple-audio-card)

無需用戶實現,使用設備樹進行配置:

sound-pcm1754 {compatible = "simple-audio-card";simple-audio-card,name = "pcm1754-audio";...simple-audio-card,cpu {sound-dai = <&sai3>;};simple-audio-card,codec {sound-dai = <&lm48100q_codec>;};
};

ASoC core 解析 device tree 并自動注冊 machine 驅動。


六、SAI 平臺驅動(以 SAI3 為例)

路徑:sound/soc/fsl/fsl_sai.c

它通過 platform_driver 提供 snd_soc_dai_driver,用于與 codec 的 DAI 建立連接關系。


七、應用層播放驗證

音頻配置好后,在根文件系統中可使用如下命令驗證:

aplay -D plughw:0,0 test.wav

如果設備樹、驅動、路徑配置都正確,lm48100q 會響應并輸出音頻信號至耳機口。


八、完整調試技巧總結

1. 確認設備樹生效:

dmesg | grep lm48100q
cat /proc/device-tree/soc@0/bus@30800000/i2c@30a20000/lm48100q@7d/compatible

2. 查看注冊的聲卡與 DAI:

cat /proc/asound/cards
cat /proc/asound/pcm

3. 檢查 regmap:

i2cget -y 0 0x7d 0x01

九、小結

模塊類型驅動入口
lm48100qCodecI2C + ASoC Codec
SAI3Platformfsl-sai
Sound CardMachinesimple-audio-card DT

lm48100q codec 的驅動模型是典型的 I2C + ASoC codec 類型,配合 i.MX 的 SAI 控制器,適用于嵌入式音頻設備中的播放場景,具有較好的模塊化與可移植性。


🔚 結語

至此,《驅動開發硬核特訓 · Day 30》完整結束,我們已完整解析了兩個典型的 I2C 總線驅動:at24 EEPROM 與 lm48100q 音頻 codec,分別展示了 字符設備模型子系統型 Codec 驅動 的集成方式。


📌 技術平臺:嵌入式Jerry
📺 視頻教程請關注 B 站:“嵌入式Jerry”

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/79549.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79549.shtml
英文地址,請注明出處:http://en.pswp.cn/web/79549.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

idea寫spark程序

步驟 1&#xff1a;創建 Maven 項目 打開 IntelliJ IDEA&#xff0c;選擇 File > New > Project。選擇 Maven&#xff0c;勾選 Create from archetype&#xff0c;選擇 org.apache.maven.archetypes:maven-archetype-quickstart。填寫 GroupId&#xff08;如 com.exampl…

【C語言練習】032. 編寫帶參數的函數

032. 編寫帶參數的函數 032. 編寫帶參數的函數1. 定義帶參數的函數示例1:定義一個帶參數的函數輸出結果2. 傳遞多個參數示例2:定義一個帶多個參數的函數輸出結果3. 傳遞數組作為參數示例3:定義一個帶數組參數的函數輸出結果4. 傳遞結構體作為參數示例4:定義一個帶結構體參數…

Java虛擬機的基本結構

jvm它包含以下部分 第一個&#xff1a;類加載系統 類加載子系統&#xff0c;負責類的加載。類加載器有三種類型&#xff1a;引導類加載器、擴展類加載器、應用程序類加載器。 第二個&#xff1a;運行時數據區 包含了程序計數器、Java虛擬機棧、本地方法棧、堆 、方法區。 程…

uniapp引入七魚客服微信小程序SDK

小程序引入七魚sdk 1.微信公眾平臺引入2.代碼引入3.在pagesQiyu.vue初始化企業appKey4.跳轉打開七魚客服 1.微信公眾平臺引入 賬號設置->第三方設置->添加插件->搜索 QIYUSDK ->添加 2.代碼引入 在分包中引入插件 "subPackages": [{"root":…

手撕算法(定制整理版2)

最長無重復子字符串 class Solution(object):def lengthOfLongestSubstring(self, s):""":type s: str:rtype: int"""if not s:return 0max_len 0tp []for a in s:while a in tp:del tp[0]tp.append(a)if len(tp) > max_len:max_len len(…

數字IC后端培訓教程之數字后端項目典型案例分析

今天給大家分享下最近小編幫助學員解決的幾個經典數字IC后端項目問題。希望能夠對大家的學習和工作有所幫助。 數字IC后端項目典型問題之后端實戰項目問題記錄&#xff08;2025.04.24&#xff09; 數字IC后端設計實現培訓教程&#xff08;整理版&#xff09; Q1: 老師好&…

window 顯示驅動開發-將虛擬地址映射到內存段(二)

在將虛擬地址映射到段的一部分之前&#xff0c;視頻內存管理器調用顯示微型端口驅動程序的 DxgkDdiAcquireSwizzlingRange 函數&#xff0c;以便驅動程序可以設置用于訪問可能重排的分配位的光圈。 驅動程序既不能將偏移量更改為訪問分配的 PCI 光圈&#xff0c;也不能更改分配…

Termius ssh連接服務器 vim打開的文件無法復制問題

你的問題是&#xff1a; ? 在 Termius (macOS) SSH 連接到 VMware Ubuntu&#xff0c;使用 vim 打開 .cpp 文件時&#xff0c;可以復制文本&#xff1b; ? 但在 Windows 10 上 SSH 到 VMware 的 Red Hat 6.4 時&#xff0c;復制操作無效。 ? &#x1f3af; 初步分析 復制…

楊校老師項目之基于SSM與JSP的鮮花銷售系統-【成品設計含文檔】

基于SSMJSP鮮花商城系統 隨著電子商務的快速發展&#xff0c;鮮花在線銷售已成為一種重要的消費模式。本文設計并實現了一個基于JSP技術的鮮花銷售管理系統&#xff0c;采用B/S架構&#xff0c;使用SSM框架進行開發&#xff0c;并結合Maven進行項目依賴管理。系統分為前臺用戶模…

集成學習——Bagging,Boosting

一.什么是集成學習 集成學習的基本思想是通過結合多個基學習器的預測結果&#xff0c;來提高模型的泛化能力和穩定性。這些基學習器可以是相同類型的算法&#xff0c;也可以是不同類型的算法。 當基學習器之間具有一定的差異性時&#xff0c;它們在面對不同的樣本子集或特征子…

【筆試訓練】給一個數組構建二叉樹|從前序遍歷與中序遍歷構建二叉樹|二叉樹中的最大路徑和

文章目錄 1.給一個數組構建二叉樹2.從前序遍歷和中序遍歷構建二叉樹3.二叉樹中的最大路徑和 1.給一個數組構建二叉樹 思路&#xff1a;就是借助一個隊列實現層序遍歷的思想。 先將root節點入隊列&#xff0c;構造左右節點后&#xff0c;root取出來時&#xff0c;將其左右孩子都…

Swift實戰:如何優雅地從二叉搜索樹中挑出最接近的K個值

文章目錄 摘要描述題解答案題解代碼分析示例測試及結果時間復雜度空間復雜度總結未來展望 摘要 在日常開發中&#xff0c;我們經常會遇到“在一堆數據中找出最接近某個值”的需求。尤其在搜索引擎、推薦系統或者地理坐標匹配中&#xff0c;這種“最近匹配”的問題非常常見。Le…

Linux512 ssh免密登錄 ssh配置回顧

下載MX 官網 參考 OK 登個tom試試 然后再計劃登個RealServer 計劃再用僅主機網卡試試 連不上 看來要通過JumpServer再聯 通過網卡訪問 被踢掉了 成功通過跳板機JumpServer登入到RealServer 方法一免密登錄 現計劃嘗試方法二 只有1個tom 我連了兩個tom 看來是根據IP劃…

編譯原理AST以Babel為例進行解讀、Webpack中自定義loader與plugin

AST樹詳解 編譯原理 主要研究如何將高級編程語言的源代碼轉換為機器能理解的目標代碼&#xff08;通常是二進制代碼或中間代碼&#xff09;。編譯器的底層實現通常包含多個階段&#xff0c;包括詞法分析、語法分析、語義分析和代碼生成。 一、AST的核心概念與作用 AST&#…

51c大模型~合集127

我自己的原文哦~ https://blog.51cto.com/whaosoft/13905076 #Executor-Workers架構 圖解Vllm V1系列2 本文詳細介紹了vllm v1的Executor-Workers架構&#xff0c;包括Executor的四種類型&#xff08;mp、ray、uni、external_launcher&#xff09;及其適用場景&#xff…

《Effective Python》第1章 Pythonic 思維詳解——深入理解流程控制中的解構利器match

《Effective Python》第1章 Pythonic 思維詳解——深入理解流程控制中的解構利器match 引言 Python 3.10 引入了全新的 match 語句&#xff0c;它不僅是一個“類 switch”的語法結構&#xff0c;更是一種**結構化模式匹配&#xff08;structural pattern matching&#xff09…

Nacos源碼—8.Nacos升級gRPC分析五

大綱 7.服務端對服務實例進行健康檢查 8.服務下線如何注銷注冊表和客戶端等信息 9.事件驅動架構源碼分析 7.服務端對服務實例進行健康檢查 (1)服務端對服務實例進行健康檢查的設計邏輯 (2)服務端對服務實例進行健康檢查的源碼 (3)服務端檢查服務實例不健康后的注銷處理 (…

[手寫系列]Go手寫db — — 完整教程

[手寫系列]Go手寫db ZiyiDB是一個簡單的內存數據庫實現&#xff0c;支持基本的SQL操作&#xff0c;包含create、insert、delete、select、update、drop。目前一期暫支持int類型以及字符類型數據&#xff0c;后續會支持更多數據結構以及能力。本項目基于https://github.com/eato…

十三、動態對象創建(Dynamic Object Creation)

十三、動態對象創建&#xff08;Dynamic Object Creation&#xff09; 目錄 13.1 對象創建&#xff08;Object creation&#xff09;13.2 new / delete 操作符13.3 數組的 new 與 delete13.4 總結 背景說明 有時候我們需要知道程序中對象的數量、類型和聲明周期&#xff0c;…

一、網絡基礎

IPv4&#xff1a;32位二進制 -- 點分十進制標識 192.168.1.1&#xff08;連續的32位&#xff0c;為了好看方便每8位一段&#xff09; IPv6&#xff1a;128位二進制 IP&#xff08;Internet協議&#xff09; 洪泛&#xff1a;除流量進入接口外的所有接口的復制 OSI模型&#…