嵌入式产品开发中经常遇到音频的输入输出问题,如何为其添加“喇叭”、“麦克风”设备呢?本文将简单介绍arm+linux产品中的音频解决方案。
我们先认识下i2s(inter-ic sound)总线。i2s又称集成电路内置音频总线,该总线专门用于音频设备之间的数据传输,广泛应用于各种多媒体系统。它采用了沿独立的导线传输时钟与数据信号的设计,通过将数据和时钟信号分离,有效避免因时差诱发的失真。
以hdg2l-iot评估套件为例,rz/g2l处理器提供至少一路i2s总线,通过该总线与音频编解码芯片(ic型号wm8960)连接,用于提供高质量的录音播音功能。音频模块的硬件部署如下所示。
图1 hdg2l-iot音频接口
g2l核心板与wm8960的音频通讯引脚如下所示:
在linux系统的音频编解码驱动中,通过i2c通讯接口与音频ic通讯,把音频ic内的各个功能寄存器抽象成音频控件,这样用户即可在user空间内直接调整ic内的参数。i2s音频引脚,则是数字信号发送、接收的通道。
播音时,音频ic接收到数字信号后则转换为模拟信号发送出去,录音时,音频ic把收到的音频模拟量转换为数字量,发送给处理器。
alsa是linux的主流音频体系结构,它包含内核驱动集合, api 库和工具对 linux 声音进行支持,应用程序只要调用alsa-lib提供的api,即可以完成对底层音频硬件的控制。
linux通过alsa库以及alsa工具管理音频ic的控件,通过“amixer controls”列出当前系统内的音频控制项:
音频功能的关键控件信息如下所示。(录音通道、播音通道、耳机音量大小、喇叭音量大小)。
在开发板下,运行aplay程序可以对音频播放进行测试。在测试前,需要将耳机插入开发板的耳机插孔中。
为测试基于i2s的音频输出接口,在命令行下执行如下命令:
其中2.wav为需要播放的音频文件,且此处假定2.wav位于/home/root/audios目录下。
在进行音频播放时,对于基于i2s的音频输出接口,可以使用amixer程序对音量进行调节。使用amixer程序对耳机播放音量进行调节的命令行格式为:
其音量值取值范围在0~127之间,127表明最大音量。例如要将音量设置为100,可在命令行下执行如下命令:
将扬声器接入hdg2l-iot开发板的左右声道插座中,在播放音频前可先设置扬声器播放音量以及总音量,然后播放音频文件:
录音功能需设置录音控件的参数,如下所示。
用arecord命令录音并保存为“/tmp/t.wav”,然后用aplay命令回放进行验证。
由于当前的麦克风输出信号仅接到了音频处理的left端作为输入,所以播放录音文件时仅左声道有输出,若希望将麦克风输出信号同时记录在左右声道可做如下设置:
将“adc data output select”设定为1,其值含义为“left data = left adc; right data = left adc”。
由上可知,音频编解码芯片在linux系统中以控件的形式存在,内部的参数一般只记录在内存中,当系统掉电时,修改的参数就会消失,所以需要保存和恢复指令将上次的参数保存在配置文件中。
alsa的配置文件为:/var/lib/alsa/asound.state
控件修改后的写入操作如下所示。
控件恢复参数的操作如下所示(注:重启板子后会自动读取配置文件)。
三星刚性OLED销售在中国市场拓展初见成效
热电偶是什么东西
机器人越来越像人是该惊喜还是恐惧?
无风扇工控机、嵌入式工控机及嵌入式电脑如何区分?
一位测试工程师的尴尬局面
【技术干货】原来ARM+Linux音频方案如此简单!
利用土壤水分仪科学和合理灌溉,节约可贵的水资源
如何实现eView触摸屏与51单片机之间的通信
广电携手华为正式进军5G领域并发布了5G网络三年发展规划
怎么让FPGA内部超高带宽逻辑互连的方法
鸿蒙Stage模型--概述
小米10系列真机渲染图曝光或将支持100W快充技术
都说国外资源共享还是比国内好!安利国外十大文件共享网站
波音公司推出军用无人机基站 可依靠太阳能电池板持续供电
红外遥控这么简单让我看看还有谁不会
昨天魅族魅蓝6发布会价格很公道,煤油很满意!魅蓝note6航海王版很给力
迈过“三道坎” 可穿戴就能“手机化”
柔性和刚性柔性版PCB怎样做可以加强
天猫精灵的确在阿里的重视之下首战告捷,搭载AliGenie2.0的火眼
控创工控机在钢铁行业的应用及介绍