Linux 音频驱动

news2024/10/9 16:22:37

1 I.MX6ULL 开发板通过此接口外接了一个 WM8960 音频 DAC 芯片。

2 在信号处理领域,外界的声音是模拟信号处理器能理解的是数字信号,因此这里就涉及到一个模拟信号转换为数字信号的过程,而完成这个功能的就是 ADC 芯片。

如果处理器要向外界传达自己的“心声”,也就是放音,那么就涉及到将处理器能理解的 0 和 1 转化为外界能理解的连续变化的声音, 这个过程就是将数字信号转化为模拟信号,而完成这个功能的是 DAC 芯片。

3 WM8960 是一颗由 wolfson(欧胜)公司出品的音频编解码芯片,是一颗低功耗、高质量的立体声(左右声道)音频 CODEC。集成 D 类喇叭功放,每个通道可以驱动一个 1W 喇叭(8Ω )。内部集成 3 个立体声输入源,可以灵活配置,拥有一路完整的麦克风接口。

WM8960 内部 ADC (录音)和 DAC(放音) 都为24 位, WM8960 主要特性如下所示:
①、 DAC 的 SNR(信噪比)为 98dB, 3.3V、 48KHz 下 THD(谐波失真)为-84dB。
②、 ADC 的 SNR(信噪比)为 94dB, 3.3V、 48KHz 下 THD(谐波失真)为-82dB。
③、 3D 增强。
④、立体声 D 类功放, 可以直接外接喇叭, 8Ω负载下每通道 1W。
⑤、集成耳机接口。
⑥、集成麦克风接口。
⑦、采样率支持 8K、 11.025K、 12K、 16K、 22.05K、 24K、 32K、 44.1K 和 48K。

4 I2S 总线接口

I2S(Inter-IC Sound)总线有时候也写作 IIS, I2S 是飞利浦公司提出的一种用于数字音频设备之间进行音频数据传输的总线。和 I2C、 SPI 这些常见的通信协议一样, I2S 总线用于主控制器和音频 CODEC 芯片之间传输音频数据。

音频DAC,一般是i2c为控制接口;i2s为音频接口。

5 硬件连接图

6.音频驱动使能

1)需要一个WM8960驱动文件,IIC框架的,用来配置WM8960的功能;

2)需要一个SOC端SAI外设的驱动文件;

3)需要一个驱动文件,将WM8960与I.MX6ULL联系起来。

因此,有三个驱动文件。

7.ASoc是在ALSA基础上,针对SOC另外改进的ALSA音频驱动框架。目前ARM处理的音频驱动框架都是ASoC。

分为三部分:SOC(platform)、Codec部分、板载硬件(Machine)。

SOC:具体的SOC音频接口驱动,比如6ULL的SAI接口,都是半导体厂商编写好的

Codec:具体的音频芯片,比如WM8960,IIC驱动。也不需要我们编写,Codec芯片厂商会写好。

板载硬件:Machine部分,将具体的SOC与具体的Codec结合。与具体的硬件设备相关,也就是我们要处理的部分。使用ASOC驱动框架将SOC于Codec结合。

eg:本开发板:

1·、Codec部分驱动文件就是wm8960.c,IIC接口的

2、SOC(platform)部分就是I.MX6ULL的SAI驱动,驱动文件就是fsl_sai.c。

3、板载硬件(Machine)部分,sound节点。驱动文件就是imx-wm8960.c。

8.设备树

/{
	soc {
			sai2: sai@0202c000 {
					compatible = "fsl,imx6ul-sai",
						     "fsl,imx6sx-sai";
					reg = <0x0202c000 0x4000>;
					interrupts = <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH>;
					clocks = <&clks IMX6UL_CLK_SAI2_IPG>,
						 <&clks IMX6UL_CLK_DUMMY>,
						 <&clks IMX6UL_CLK_SAI2>,
						 <&clks 0>, <&clks 0>;
					clock-names = "bus", "mclk0", "mclk1", "mclk2", "mclk3";
					dma-names = "rx", "tx";
					dmas = <&sdma 37 24 0>, <&sdma 38 24 0>;
					status = "disabled";
				};
         }; 

    /* 板载驱动 */
    sound {
			/* 用于匹配相应的驱动文件 */
            compatible = "fsl,imx6ul-evk-wm8960",
                         "fsl,imx-audio-wm8960";
            model = "wm8960-audio";     /* 声卡名字 */
			
			/* SOC音频接口驱动 */
            cpu-dai = <&sai2>;         
			
			/* 具体的音频芯片 */
            audio-codec = <&codec>;   
			
            asrc-controller = <&asrc>;  /* asrc 控制器, asrc:异步采样频率转化器。 */
            codec-master;
            gpr = <&gpr 4 0x100000 0x100000>;
			
			/* 耳机插入检测引脚设置 */
            hp-det = <3 0>;
            /*hp-det-gpios = <&gpio5 4 0>;
              mic-det-gpios = <&gpio5 4 0>;*/
			  
			/* 音频器件一系列的连接设置 */
            audio-routing =
                "Headphone Jack", "HP_L",
                "Headphone Jack", "HP_R",
                "Ext Spk", "SPK_LP",
                "Ext Spk", "SPK_LN",
                "Ext Spk", "SPK_RP",
                "Ext Spk", "SPK_RN",
                "LINPUT2", "Mic Jack",
                "LINPUT3", "Mic Jack",
                "RINPUT1", "Main MIC",
                "RINPUT2", "Main MIC",  
                "Mic Jack", "MICB",
                "Main MIC", "MICB",
                "CPU-Playback", "ASRC-Playback",
                "Playback", "CPU-Playback",
                "ASRC-Capture", "CPU-Capture",
                "CPU-Capture", "Capture";
                status = "okay";
        };  
 };


&i2c2 {
    clock_frequency = <100000>; /* i2c2通信频率 */
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_i2c2>;
	
    status = "okay"; /* i2c2状态为开启 */

        codec: wm8960@1a {    
				compatible = "wlf,wm8960";				
				reg = <0x1a>;              /* 设置 WM8960 的 I2C 地址0X1A */
				
				/* 描述时钟相关信息 */
				clocks = <&clks IMX6UL_CLK_SAI2>; /* 指定时钟源为 SAI2 */
				clock-names = "mclk";             /* 指定时钟的名字为“mclk” */
				
				/* 这也是一个 bool 类型的属性, 如果添加了此属性, OUT3 引脚将会使能,并且为了响应耳机插入响应事件, HP_L 和 HP_R 这两个引脚都会关闭。 */
				wlf,shared-lrclk;
        };
};

&sai2 {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_sai2>;

    assigned-clocks = <&clks IMX6UL_CLK_SAI2_SEL>,
              <&clks IMX6UL_CLK_SAI2>;
    assigned-clock-parents = <&clks IMX6UL_CLK_PLL4_AUDIO_DIV>;
    assigned-clock-rates = <0>, <12288000>;

    status = "okay";
};

&iomuxc {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_hog_1>;
    imx6ul-evk {
        /* i2c */
        pinctrl_i2c2: i2c2grp {
            fsl,pins = <
                MX6UL_PAD_UART5_TX_DATA__I2C2_SCL 0x4001b8b0
                MX6UL_PAD_UART5_RX_DATA__I2C2_SDA 0x4001b8b0
            >;
        };
        /* sai2 */
        pinctrl_sai2: sai2grp {
            fsl,pins = <
                MX6UL_PAD_JTAG_TDI__SAI2_TX_BCLK    0x17088
                MX6UL_PAD_JTAG_TDO__SAI2_TX_SYNC    0x17088
                MX6UL_PAD_JTAG_TRST_B__SAI2_TX_DATA 0x11088
                MX6UL_PAD_JTAG_TCK__SAI2_RX_DATA    0x11088
                MX6UL_PAD_JTAG_TMS__SAI2_MCLK       0x17088
            >;
        };
     };
};

9.使能内核的 WM8960 驱动

 设备树配置完成以后就可以使能内核自带的 WM8960 驱动了,直接通过图形化界面配置即可。

10 查看在开发板中的 alsa 驱动框架设备文件

 controlC0:用于声卡控制, C0 表示声卡 0。
pcmC0D0c 和 pcmC0D1c: 用于录音的 pcm 设备,其中的“COD0”和“C0D1”分别表示
声卡 0 中的设备 0 和设备 1,最后面的“c”是 capture 的缩写,表示录音。
pcmC0D0p 和 pcmC0D1p:用于播放的 pcm 设备,其中的“COD0”和“C0D1”分别表示
声卡 0 中的设备 0 和设备 1,最后面的“p”是 playback 的缩写,表示放音。
timer: 定时器。
音频驱动使能以后还不能直接播放音乐或录音,我们还需要移植 alsa-lib 和 alsa-utils 这两个东西。


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/135669.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL的锁

把那些可能会被多个线程同时操作的资源称为临界资源&#xff0c;加锁的目的就是让这些临界资源在同一时刻只能有一个线程可以访问。数据库作为用户共享的一个资源&#xff0c;如何保证数据并发访问一致性也是所有数据库必须解决的问题&#xff0c;如何加锁是数据库并发访问性能…

字节前端高频手写面试题(持续更新中)

Promise // 模拟实现Promise // Promise利用三大手段解决回调地狱&#xff1a; // 1. 回调函数延迟绑定 // 2. 返回值穿透 // 3. 错误冒泡// 定义三种状态 const PENDING PENDING; // 进行中 const FULFILLED FULFILLED; // 已成功 const REJECTED REJECTED; // 已…

Vite构建工具

什么是构建工具&#xff1a;打包:将我们写的浏览器不认识的代码交给构建工具进行编译处理的过程就叫做打包&#xff0c;打包完成以后会给我们一个浏览器可以认识的文件 一个构建工具他到底承担了哪些脏活累活: 1. 模块化开发支持:支持直接从node_modules里引入代码&#xff0b…

十三、Kubernetes yaml资源清单详解

1、概述 kubectl提供了各种命令&#xff0c;来管理集群中的pod&#xff0c;但是这些命令都是为了方便运维测试&#xff0c;实际生产部署还得用yaml文件来部署&#xff0c;所以弄清楚各类资源的字段是非常重要的。 资源清单就是k8s当中用来定义pod的文件&#xff0c;语法格式遵…

C#语言实例源码系列-实现ID卡的识别

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过程中…

Vlan的原理与配置

传统以太网的问题 规模大了&#xff0c;之后导致性能也很差&#xff0c;广播会增加 解决&#xff1a;用Vlan&#xff0c;不受地域限制&#xff0c;同一Vlan内的设备才能直接进行二层通信 实验 首先配置以上vlan与电脑ip 配置IP之后可以进行ping命令测试刚开始是连通的&#x…

计算机视觉实战----AlexNet网络及使用colab跑YoloV5代码

系列文章目录 文章目录系列文章目录前言一、用colab薅羊毛二、使用百度飞浆操作三、二、使用步骤1.引入库2.读入数据总结前言 一、用colab薅羊毛 Colaboratory 简称“Colab”&#xff0c;是 Google Research 团队开发的一款产品。在 Colab 中&#xff0c;任何人都可以通过浏览…

分享107个PHP源码,总有一款适合您

链接&#xff1a;https://pan.baidu.com/s/1Su77mBUx87vk0lzSLyvnyw?pwdyo96 提取码&#xff1a;yo96 PHP源码 分享107个PHP源码&#xff0c;总有一款适合您 page_count 1 # 每个栏目开始业务content"text/html; charsetgb2312"base_url "https://down.c…

基于 Spring Boot 的 RESTful API 设计与实现

RESTful 是一种规范&#xff0c;符合 RESTful 的 Api 就是 RESTful Api。简单的说就是可联网设备利用 HTTP 协议通过 GET、POST、DELETE、PUT、PATCH 来操作具有 URI 标识的服务器资源&#xff0c;返回统一格式的资源信息&#xff0c;包括 JSON、XML、CSV、ProtoBuf、其他格式。…

OpenVINS 官方文档 第一部分

参考链接&#xff1a;OpenVINS https://docs.openvins.com/index.html 1. Getting Started 欢迎来到OpenVIINS项目&#xff01;以下指南将帮助新用户下载软件并在我们支持的数据集上运行。此外&#xff0c;我们还提供有关如何在我们的系统上运行您自己的传感器的信息&#xff0…

《500强高管谈VE价值工程》-对经营变革期下VE的期待

文章出处&#xff1a;日本VE协会杂志 文章翻译&#xff1a;泰泽项目部 关注泰泽&#xff1a;实现高利润企业 《500强高管谈VE价值工程》-对经营变革期下VE的期待 作者: 鹿岛建设常务董事小野馨喜 随着21世纪的到来&#xff0c;社会结构和经济环境正在发生重大转变&…

MobPush 创建推送

功能说明 MobPush提供遵循REST规范的HTTP接口&#xff0c;适用各开发语言环境调用。 IP绑定 工作台可以绑定服务器IP地址&#xff0c;未绑定之前所有IP均可进行REST API的调用&#xff0c;绑定后进仅绑定的IP才有调用权限。 调用地址 POSThttp://api.push.mob.com/v3/push/c…

东南亚开年大促必爆商品;2023Lazada家居家饰需求品类来袭

为持续提升商家体验&#xff0c;保障经营效率&#xff0c;2023年Lazada平台将调整Birthday sale生日大促的活动时间节奏 2023年6个国家站点&#xff08;印尼、马来西亚、菲律宾、新加坡、泰国、越南&#xff09;均会将生日大促提前至2023年3月3日开始。 家居家饰需求清单&…

什么是快速排序?

本文首发自「慕课网」&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注&#xff01; 作者| 慕课网精英讲师 JdreamZhang 快速排序&#xff08;Quick Sort&#xff09;&#xff0c;是计算机科学与技术领域中非常经典的一种排序算法&#xff0…

华为云工程师HCIA——桌面云解决方案概述

一、桌面云解决方案概述 瘦终端和胖终端 瘦终端&#xff1a;提供屏幕&#xff0c;和很小的计算能力胖终端&#xff1a;提供主要计算能力 桌面云架构VDI与IDV 华为桌面云解决方案逻辑架构 FusionCompute云平台架构 桌面云的优势 二、桌面云组件介绍 接入和访问控制层 WI&…

图像处理(2)——图像特征提取LBP

图像处理&#xff08;2&#xff09;——图像特征提取LBP 其实现在大家都说图像处理&#xff0c;其实计算机是不认识图片的&#xff0c;之所以可以处理图像&#xff0c;其实图像就是一个个矩阵&#xff0c;其实是数字&#xff0c;转而其实都是在处理数字。深度学习在图像上的建…

数字图像处理实验——数字图像处理初步

一、实验目的与要求 1.熟悉及掌握在MATLAB中能够处理哪些格式的图像&#xff1b; 2.熟练掌握在MATLAB中如何读取图像及图像的属性信息&#xff08;大小、颜色、亮度&#xff08;灰度&#xff09;、宽度、高度等&#xff09;&#xff1b; 3.掌握如何在MATLAB中按照指定要求存储一…

Windows 内核安全编程技术实践

《Windows 内核安全编程技术实践》&#xff0c;这是一本Windows 10内核安全开发系列丛书&#xff0c;探索 AntiRootKit 反内核工具核心原理与技术实现细节&#xff0c;揭开ARK工具的神秘面纱&#xff0c;本书以实战角度出发摒弃了大量无用的专业术语&#xff0c;欢迎阅读并提出…

在Qt中设置窗体背景颜色及透明度的方法介绍

本文主要介绍在 Qt 中设置窗体背景颜色及透明度的方法。 说明&#xff1a; 本文中的应用程序是面向 Windows 操作系统的&#xff1b;本文中使用的 Qt Creator 版本号为&#xff1a;7.0.0&#xff1b;本文中使用的 Qt 版本号为&#xff1a;5.14.2。 1 利用样式表&#xff08;S…

Github每日精选(第82期):还在用logging试试loguru

Loguru 如果你还在使用logging&#xff0c;不妨花点时间来看看Loguru&#xff0c;Loguru是一个Python日志记录的库。 您是否曾懒于配置记录器而使用print&#xff08;&#xff09;&#xff1f;。。。 我确实这样做了&#xff0c;但日志记录对于每个应用程序来说都是基本的&a…