Linux 音频驱动

这篇具有很好参考价值的文章主要介绍了Linux 音频驱动。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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 硬件连接图

Linux 音频驱动

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 驱动框架设备文件

Linux 音频驱动

 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 这两个东西。


 文章来源地址https://www.toymoban.com/news/detail-431427.html

到了这里,关于Linux 音频驱动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 018——红外遥控模块驱动开发(基于HS0038和I.MX6uLL)

    目录 一、 模块介绍 1.1 简介 1.2 协议 二、 驱动代码 三、 应用代码 四、 实验 五、 程序优化         红外遥控被广泛应用于家用电器、工业控制和智能仪器系统中,像我们熟知的有电视机盒子遥控器、空调遥控器。红外遥控器系统分为发送端和接收端,如图下图所示。

    2024年04月16日
    浏览(43)
  • 017——DS18B20驱动开发(基于I.MX6uLL)

    目录 一、 模块介绍 1.1 简介 1.2 主要特点 1.3 存储器介绍 1.4 时序 1.5 命令 1.5.1 命令大全    1.5.2 命令使用 1.5.3 使用示例 1.6 原理图 二、 驱动程序 三、 应用程序 四、 测试         DS18B20 温度传感器具有线路简单、体积小的特点,用来测量温度非常简单,在一根通信线上

    2024年04月12日
    浏览(47)
  • I.MX6ULL开发笔记(二)——硬件外设操作

    在文章http://t.csdnimg.cn/EGWt9中有介绍Linux下文件目录,那么在Linux系统下,RGB灯也是一个设备,所以我们需要到 /sys 目录下去操作这个设备。 之后,我们进入到 class 目录,这里挂载着开发板上的外设: 在这里就能看到熟悉的硬件接口了,那么我们进入到 leds 的目录下: 可以看

    2024年01月24日
    浏览(52)
  • I.MX6ull UART

     一 简介 UART 全称叫做串行接口,通常也叫做 COM 接口,串行接口指的是数据一个一个的顺序传输,通信线路简单。使用两条线即可实现双向通信,一条用于发送,一条用于接收。串口通 信距离远 ,但是速 度相对会低 ,串口是一种很常用的工业接口。I.MX6U 自带的 UART 外设

    2024年02月09日
    浏览(41)
  • 使用一根网线,让Ubuntu和正点原子I.MX6ULL开发板互相ping通

    准备一根网线即可 2.1 找根网线将I.MX6ULL和电脑连起来 2.2 让I.MX6ULL通电运行起来,我这里使用的是正点原子版本的内核、 2.3 进入电脑的网络连接后,按照如下步骤操作 2.4 将ip地址、子网掩码、默认网关设置如下,= 注意,子网掩码一定要是255.255.255.0 IP地址推荐使用192.168.5.

    2024年02月19日
    浏览(50)
  • I.MX6ull EPIT定时器

    一 简介 EPIT定时器是一种增强的周期中断定时器,完成周期性中断定时的功能。 具有以下特点  EPIT定时器是一个32位的定时器  时钟源可选的向下计数器  EPIT 共有 3 个时钟源可选择,ipg_clk、ipg_clk_32k 和 ipg_clk_highfreq  当计数值和比较值相等的时候产生中断  12 位分频器 对

    2024年02月08日
    浏览(48)
  • 【Linux 裸机篇(五)】I.MX6ULL BSP工程管理下的 Makefile编写、链接脚本

    文件夹 描述 bsp 存放驱动文件 imx6ul 存放跟芯片有关的文件,比如 NXP 官方的 SDK库文件 obj 存放编译生成的.o 文件 project 存放 start.S 和 main.c 文件,也就是应用文件 行 描述 1~7 定义了一些变量,除了第 2 行以外其它的都是跟编译器有关的,如果使用其它编译器的话只需要修改第

    2023年04月20日
    浏览(44)
  • i.MX6ULL移植NXP官方Linux内核imx_5.4.47_2.2.0

    系统:Ubuntu18.04 参考资料:百问网 IMX6ULL开发板(从零移植篇-预览版)-V0.1,正点原子驱动开发指南 开发板:100ask i.MX6ULL PRO 交叉编译工具链的获取就不写了 打开 .bashrc 文件。 vi ~/.bashrc 。在该文件最后面添加如下(根据自己的交叉编译工具链) (1)直接从官网下载,非常慢而

    2024年02月12日
    浏览(59)
  • I.MX6ull GPT高精度定时器

    一 简介 GPT的全称是General Purpose Timer,它是一个32位的向上的定时器, GPT 定时器也可以跟一个值进行比较,当计数器值和这个值相等的话就发生比较事件,产生比较中断。GPT 定时器有一个 12 位的分频器,可以对 GPT 定时器的时钟源进行分频。 分析方式 同EPTI  它具有以下特点

    2024年02月08日
    浏览(53)
  • I.MX6ULL_Linux_驱动篇(57)linux Regmap API驱动

    我们在前面学习 I2C 和 SPI 驱动的时候,针对 I2C 和 SPI 设备寄存器的操作都是通过相关的 API 函数进行操作的。这样 Linux 内核中就会充斥着大量的重复、冗余代码,但是这些本质上都是对寄存器的操作,所以为了方便内核开发人员统一访问 I2C/SPI 设备的时候,为此引入了 Reg

    2024年03月26日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包