Linux系统中内核音频驱动实现

本文以I2S接口为例介绍Linux内核音频相关知识。

一、名词介绍

下面是音频调试中常见的名词缩略语。

1、AEC(Acoustic Echo Cancellor):回声消除。

2、AGC(Automatic Gain Control):自动增益补偿,调整MIC收音量。

3、ALSA(Advanced Linux Sound Architecture):高级Linux声音架构。

4、ANS(Automatic Noise Suppression):背景噪音抑制,ANS可探测出背景固定频率的杂音并消除背景噪音。

5、BCK(Bit Clock Line):位时钟,对应数字音频的每一位数据。标准称为SCK(Serial Clock),串行时钟。SCK=2x采样频率x采样位数

6、DAI(Digital Audio Interface):数字音频接口。

7、DAPM(Dynamic Audio Power Management):动态电源管理,DAPM可使基于linux的移动设备上的音频子系统,在任何时候都工作在最小功耗状态。

8、DRC(Dynamic Range Control):动态压缩,将音频输出控制在一定范围内。

9、EQ(Equaliser):均衡器,通过对声音某一个或多个频段进行增益或衰减,达到调整音色的目的。

10、I2S(Inter-IC Sound):IC间传输数字音频资料的一种接口标准,采用序列的方式传输2组(左右声道)资料。

11、LRCK(Left-Right Clock):帧时钟,用于切换左右声道数据,0:左声道;1:右声道。标准称为WS(World Select),声道选择;或称为FS(Frame Sync),帧同步;LRCK的频率=采样频率。

12、MCLK(Master Clock):主时钟,一般MCLK=256*LRCK。不是I2S标准中的一部分,主要用来同步模拟/数字转换器的内部操作。

13、Mono:单声道。

14、OSS(Open Sound System):开放声音系统。

15、PCM(Pulse Code Modulation):脉冲编码调制,I2S是PCM的子集。

16、ramp:逐步增加或减少音量等级,避免声音急速变化,用于暂停或恢复音乐。

17、Stereo:双声道

18、TDM(Time Division Multiplexing):时分复用。I2S最多只能传2声道数据,TDM最多支持16通道。

二、I2S接口

I2S是飞利浦定义的数字音频传输标准,用于数字音频数据在系统内部器件之间传输。

I2S是PCM的一个分支,接口定义相同。I2S的采样率一般为44.1/48KHZ,PCM采样频率一般为8/16KHZ等。

I2S接口有4组信号:SCK(位时钟)、LRCK(帧时钟)、SDI/SDO(数据)。

在I2S总线上,只能同时存在一个主设备和发送设备,主设备可以是发送设备或接收设备。常见的I2S框图如下:

图片

三、I2S协议

I2S接口常见的协议模式包括:I2S正常模式、I2S左对齐模式和I2S右对齐模式等。

1、I2S正常模式

I2S正常模式属于I2S左对齐中的一种特例,也叫Philips模式。下图是I2S正常模式的波形。

图片

LRCK(i2s_LRCK_rx/i2s_LRCK_tx)信号变低表示左声道,变高表示右声道。

SD(i2s_sdo,i2s_sdi)信号首先传输MSB或LSB,并在LRCK改变后的一个SCLK时钟周期发送第一个bit。

SD信号宽度的范围是从16到32位。

2、I2S左对齐模式

下图是I2S左对齐模式的波形。

图片

LRCK(i2s_LRCK_rx/i2s_LRCK_tx)信号变高表示左声道,变低表示右声道。

SD(i2s_sdo,i2s_sdi)信号首先传输MSB或LSB,并在LRCK改变的同时发送第一个bit。

SD信号宽度的范围是从16到32位。

3、I2S右对齐模式

下图是I2S右对齐模式的波形。

图片

LRCK(i2s_LRCK_rx/i2s_LRCK_tx)信号变高表示左通道,变低表示右通道。

SD(i2s_sdo、i2s_sdi)信号首先传输MSB或LSB,与I2S正常或左对齐模式不同,其数据与LRCK信号的边缘处的最后一位对齐。

SD信号宽度范围从16到32位。

其他协议格式还有:PCM early mode、PCM late1 mode和PCM late2 mode等。

四、ALSA框架

Linux内核2.6之后,ALSA取代了OSS成为了Linux内核音频子系统是一部分。

ALSA系统包括:

1、alsa-driver:alsa系统驱动。

2、alsa-lib:alsa库,用户空间调用,和内核空间交互。

3、alsa-utils:命令行工具。

4、alsa-plugin:alsa插件。

5、alsa-tools:alsa工具。

ALSA框架组成如下:

图片

alsa-driver中相关功能如下(以rockchip 4a单板为例):

1、Codec:音频芯片共有的部分,包括codec初始化函数,控制接口,寄存器缓存,控件,dapm部件,音频路由,偏置电压设置函数等描述信息。

Rockchip 4A单板,Codec选用的是ES8316芯片,该芯片的dts配置如下:

图片

2、Codec DAI:codec上的音频接口驱动描述,包括:时钟配置,格式配置,能力描述等。

Codec DAI相关实现如下:

图片

3、CPU DAI:指 SoC 的 I2S、PCM 总线控制器,负责把音频数据从 I2S tx FIFO 搬运到 codec。

RK3399 CPU DAI的dts相关配置如下:

图片

4、DAI Link:音频数据链路,它指定链路用到的codec、codec_dai、cpu_dai和platform。

Linux 4.4 内核支持两种方式创建声卡:一种是通用的simple-card framework;一种是传统的编写自定义的 machine driver 来创建。

Simple card是简单通用的machine driver,如果 simple-card框架足够满足需求,可优先选择simple card 框架。

DAI Link的dts相关配置如下:

图片

DAI Link的相关实现如下:

图片

5、DAPM:动态电源管理,是基于kcontrol改进过后的相应框架,增加了相应的电源管理机制, widget是DAPM的基本单位。

Codec(es8316)中kcontrol、dapm widget和dapm routes的相关实现如下:

图片

6、DMA:负责把 dma buffer 中的音频数据搬运到 I2S tx FIFO。

五、调试命令

ALSA是Linux处理音频的基本接口,但ALSA只提供基层的接口,操作较为繁复,一般情况下可以直接使用其附带提供的 utils 工具集,utils 工具集是一些封装好了的功能模块,直接以命令的方式提供,用户只需要敲入相关命令和参数即可实现音频操作功能。

1、查看声卡信息

root@xiaotianbsp:~# cat /proc/asound/cards
 0 [rockchipes8316c]: rockchip_es8316 - rockchip,es8316-codec
                      rockchip,es8316-codec
 1 [HDMICODEC      ]: HDMI-CODEC - HDMI-CODEC
                      HDMI-CODEC
root@xiaotianbsp:~# ls -l /dev/snd/
total 0
drwxr-xr-x  2 root root       80 Aug 16 14:43 by-path
crw-rw----+ 1 root audio 116,  2 Aug 16 14:43 controlC0
crw-rw----+ 1 root audio 116,  5 Aug 16 14:43 controlC1
crw-rw----+ 1 root audio 116,  4 Aug 16 14:43 pcmC0D0c
crw-rw----+ 1 root audio 116,  3 Aug 16 14:43 pcmC0D0p
crw-rw----+ 1 root audio 116,  6 Aug 16 14:43 pcmC1D0p
crw-rw----+ 1 root audio 116,  1 Aug 16 14:43 seq
crw-rw----+ 1 root audio 116, 33 Aug 16 14:43 timer

controlCx:控制接口,提供灵活的方式管理注册的声卡和对存在的声卡进行查询。

pcmCxDxc:PCM接口,对应录音设备。

pcmCxDxp:PCM接口,对应放音设备。

timer:支持声音的同步事件提供声卡上的定时器。

seq:音序器接口,一个比原始MIDI接口高级的MIDI编程和声音同步高层接口。

2、查看声卡采集、播放PCM信息

root@xiaotianbsp:~# cat /proc/asound/pcm
00-00: ff880000.i2s-ES8316 HiFi ES8316 HiFi-0 :  : playback 1 : capture 1
01-00: ff8a0000.i2s-i2s-hifi i2s-hifi-0 :  : playback 1

3、查看ALSA驱动版本

root@xiaotianbsp:~# cat /proc/asound/version
Advanced Linux Sound Architecture Driver Version k4.4.154-90-rockchip-ga14f6502e045.

4、查看声卡0的信息

root@xiaotianbsp:~# cat /proc/asound/card0/pcm0p/sub0/status
closed

5、查看寄存器

## regmap名称
root@xiaotianbsp:~# cat /sys/kernel/debug/regmap/1-0011/name
es8316
root@xiaotianbsp:~# cat /sys/kernel/debug/regmap/ff880000.i2s/name
rockchip-i2s

## rk3399 i2s0控制器寄存器
root@xiaotianbsp:~# cat /sys/kernel/debug/regmap/ff880000.i2s/registers
00: 0000000f
04: 0000000f
08: 00033f3f
0c: 00000000
10: 000f0010
14: 01f00000
18: XXXXXXXX
1c: 00000000
20: XXXXXXXX
28: 00000000

## es8316寄存器
root@xiaotianbsp:~# cat /sys/kernel/debug/regmap/1-0011/registers
00: c0
01: f3
02: 08
03: 20
04: 11
05: 00
06: 11
07: 00
08: 00
09: 04
0a: 0c
0b: 0c
0c: ff
0d: 3f
0e: ff
0f: ff
10: 11
11: fc
12: 28
13: 00
14: 00
15: 33
16: 00
17: 00
18: 00

6、查看时钟

## 采样率44.1KHZ,mclk = 256 * sample = 256*44.1*1000 = 11289600 HZ
root@xiaotianbsp:~# cat /sys/kernel/debug/clk/clk_summary | grep i2s0
          clk_i2s0_div                    1            1   800000000          0 0
             clk_i2s0_frac                1            1    11289600          0 0
                clk_i2s0_mux              1            1    11289600          0 0
                   clk_i2s0               1            2    11289600          0 0
                hclk_i2s0                 1            2   100000000          0 0

7、amixer命令

root@xiaotianbsp:~# amixer -h
Usage: amixer <options> [command]

Available options:
  -h,--help       this help
  -c,--card N     select the card
  -D,--device N   select the device, default 'default'
  -d,--debug      debug mode
  -n,--nocheck    do not perform range checking
  -v,--version    print version of this program
  -q,--quiet      be quiet
  -i,--inactive   show also inactive controls
  -a,--abstract L select abstraction level (none or basic)
  -s,--stdin      Read and execute commands from stdin sequentially
  -R,--raw-volume Use the raw value (default)
  -M,--mapped-volume Use the mapped volume

Available commands:
  scontrols       show all mixer simple controls
  scontents       show contents of all mixer simple controls (default command)
  sset sID P      set contents for one mixer simple control
  sget sID        get contents for one mixer simple control
  controls        show all controls for given card
  contents        show contents of all controls for given card
  cset cID P      set control contents for one control
  cget cID        get control contents for one control

7.1查看card0内容

root@xiaotianbsp:~# amixer -c 0 contents
numid=16,iface=MIXER,name='ADC Double FS Mode'
  ; type=BOOLEAN,access=rw------,values=1
  : values=off
numid=14,iface=MIXER,name='ADC Soft Ramp'
  ; type=BOOLEAN,access=rw------,values=1
  : values=on
numid=13,iface=MIXER,name='ADC Capture Volume'
  ; type=INTEGER,access=rw---R--,values=1,min=0,max=192,step=0
  : values=192
  | dBscale-min=-96.00dB,step=0.50dB,mute=1
numid=15,iface=MIXER,name='Capture Polarity'
  ; type=ENUMERATED,access=rw------,values=1,items=2
  ; Item #0 'Normal'
  ; Item #1 'Invert'
  : values=0

7.2查看和配置某个numid命令

## 查看
root@xiaotianbsp:~# amixer -c 0 cget numid=16
numid=16,iface=MIXER,name='ADC Double FS Mode'
  ; type=BOOLEAN,access=rw------,values=1
  : values=off
  
## 配置
root@xiaotianbsp:~# amixer -c 0 cset numid=16 on
numid=16,iface=MIXER,name='ADC Double FS Mode'
  ; type=BOOLEAN,access=rw------,values=1
  : values=on

8、设备名

root@xiaotianbsp:~# aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: rockchipes8316c [rockchip,es8316-codec], device 0: ff880000.i2s-ES8316 HiFi ES8316 HiFi-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: HDMICODEC [HDMI-CODEC], device 0: ff8a0000.i2s-i2s-hifi i2s-hifi-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
root@linaro-alip:~# arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: rockchipes8316c [rockchip,es8316-codec], device 0: ff880000.i2s-ES8316 HiFi ES8316 HiFi-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0

9、放音

aplay -D hw:0,0 -r 44100 -c 2 -f s16_le play.wav

10、录音

arecord -D hw:0,0 -r 16000 -c 1 -f s16_le record.wav

-D:播放设备,aplay -l 或arecord -l列出的设备名

-r:采样率

-c:音频文件通道

-f:采样格式,常用的有S16_LE ,S24_LE ,S32_LE, cd (可忽略)

也可参考tinyalsa命令,如:tinymix、tinypcminfo、tinyplay和tinycap的用法。

11、mp3转wav

lame test.mp3 test.wav --decode

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ZEM20台式扫描电子显微镜在三元材料锂电池中的应用

在当今环保能源需求日益增长的背景下&#xff0c;新型储能材料特别是锂离子电池在新能源汽车和移动互联网设备中的应用越来越广泛。其中&#xff0c;以镍钴锰三元素为基础的分层材质因具有体系能量密度高、原材料来源广、合成过程相对简单等优势&#xff0c;被公认为最有应用前…

字符串展开(Python)

展开字符串中用-压缩的连续小写字母或者数字&#xff0c;不是压缩形式的-不用理会&#xff0c;-没有压缩字符的去除-。 (笔记模板由python脚本于2024年01月21日 18:18:19创建&#xff0c;本篇笔记适合熟悉 p y t h o n python python字符串和列表的coder翻阅) 【学习的细节是欢…

Java线程池七大参数详解和配置(面试重点)

一、corePoolSize核心线程数 二、maximunPoolSize最大线程数 三、keepAliveTime空闲线程存活时间 四、unit空闲线程存活时间的单位 五、workQueue线程工作队列 1、ArrayBlockingQueue FIFO有界阻塞队列 2、LinkedBlockingQueue FIFO无限队列 3、PriorityBlockingQueue V…

2023年度环境电器行业数据分析(洗地机、扫地机器人、吸尘器等)

在家电行业整体消费不振的环境下&#xff0c;环境电器市场也受到影响&#xff0c;2023年度市场大盘销售呈下滑趋势。根据鲸参谋平台的数据显示&#xff0c;2023年京东平台环境电器市场的销量累计约7100万&#xff0c;同比下滑约12%&#xff1b;销售额约360亿&#xff0c;同比下…

二.用户和权限管理(一)

用户和管理权限 1.用户管理1.1登录MySQL服务器1.2创建用户1.3修改用户1.4删除用户1.5设置当前用户密码1.6 修改其它用户密码 2.权限管理2.1权限列表2.2授予权限的原则2.3授予权限2.4产看权限2.5收回权限 3.权限表3.1user表3.2db表3.3tables_priv表和columns_priv表3.4procs_pri…

【iOS】UICollectionView使用

使用UITableView作为表格来展示数据完全没有问题&#xff0c;但仍有许多局限性&#xff0c;对于一些更加复杂的布局样式&#xff0c;就有些力不从心了 比如&#xff0c;UITableView只允许表格每一行只能显示一个cell&#xff0c;而不能在一行中显示多个cell&#xff0c;对于这…

IN操作符

目录 IN NOT IN Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 IN IN 指的是根据一个指定的范围进行数据查询 1.查询出员工编号是 7369、7566、7788、9999 的员工信息 利用前面学的知识,得出: SQL> set linesize 250 SQL>…

​第14节-高质量简历写作求职通关-在线测试

在线测试主要包括性格测试、综合能力测试、技能测试三类 性格测试 性格测试主要用于考察个人与工岗位的匹配程度 考察内容包含性格、能力、动机、价值观等&#xff0c;考察形式一般为给出相应的工作场景&#xff0c;让你选择最喜欢或者最不喜欢的答案 技能考试 这类测试一般是针…

Windows云服务器如何配置多用户登录?(Windows 2012)华为云官方文档与视频地址

Windows云服务器如何配置多用户登录&#xff1f;&#xff08;Windows 2012&#xff09;_弹性云服务器 ECS_故障排除_多用户登录_华为云 打开任务栏左下角的“服务器管理器”&#xff0c;在左侧列表中选中“本地服务器” 然后将右侧“远程桌面”功能的选项修改为“启用”&#x…

LeetCode 13.罗马数字转整数(python版)

需求 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如&#xff0c; 罗马数字 2 写做 II &#xff0c;即为两个并列的 1 。12 写做 XII &#xff0c;即为 X …

如何对遗留 C++ 代码进行现代化改造?

C 在过去的十年中进步很大&#xff0c;以至于有些人把它看作是一种完全不同的语言&#xff0c;而不是“老旧的遗留 C”。尽管现代 C 依然保留了与原来的准则和基本语法&#xff0c;但这些更新和进步对 C 语言和标准库意义重大。 不过&#xff0c;也不是每个人都在使用最新版本…

Unity 工厂方法模式(实例详解)

文章目录 在Unity中&#xff0c;工厂方法模式是一种创建对象的常用设计模式&#xff0c;它提供了一个接口用于创建对象&#xff0c;而具体的产品类是由子类决定的。这样可以将对象的创建过程与使用过程解耦&#xff0c;使得代码更加灵活和可扩展。 工厂模式的主要优点如下&…

快速排序(三)——hoare法

目录 ​一.前言 二.快速排序 hoare排法​ 三.结语 一.前言 本文给大家带来的是快速排序&#xff0c;快速排序是一种很强大的排序方法&#xff0c;相信大家在学习完后一定会有所收获。 码字不易&#xff0c;希望大家多多支持我呀&#xff01;&#xff08;三连&#xff0b;关…

PADS自动导出Gerber文件 —— 双面板

视频地址&#xff1a;PADS_2层PCB板(双面板) 快速出GERBER光绘文件实战视频教程_哔哩哔哩_bilibili 像pads做封装不用做阻焊层&#xff0c;因为在出GERBER文件的时候调用了焊盘&#xff0c;并在焊盘的基础上增加了几个mil来做阻焊层。 出Gerber文件之前一定要先铺铜并且检查无错…

双指针算法专题

前言 双指针算法入门&#xff0c;干就完了 下面的题目都是来自灵神的基础算法精讲&#xff0c;有思路不清晰的地方&#xff0c;可以去看讲解。 灵茶山艾府的个人空间-灵茶山艾府个人主页-哔哩哔哩视频 (bilibili.com) 相向双指针 1.两数之和 题目链接&#xff1a;167. 两数之…

清华大模型Chatglm2-6B的微调方法和微调模型使用方式(非常仔细,值得借鉴)

一、下载chatglm2-6b的项目代码和模型 1、下载chatglm2-6b的项目 方法一、chatglm2-6b的项目下载地址&#xff1a; https://github.com/THUDM/ChatGLM2-6B方法二、百度网盘提取chatglm2-6b的项目&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1BEwUhiIJlB4SJrGw7N…

力扣:474. 一和零(动态规划)(01背包)

题目&#xff1a; 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度&#xff0c;该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素&#xff0c;集合 x 是集合 y 的 子集 。 示例 1&#xff1a; 输入&#…

MacOS受欢迎的数据库开发工具 Navicat Premium 15 中文版

Navicat Premium 15 Mac是一款数据库管理工具&#xff0c;提供了一个全面的解决方案&#xff0c;用于连接、管理和维护各种数据库系统。以下是Navicat Premium 15 Mac的一些主要功能和特点&#xff1a; 软件下载&#xff1a;Navicat Premium 15 中文版下载 多平台支持&#xff…

【UE5】第一次尝试项目转插件(Plugin)的时候,无法编译

VS显示100条左右的错误&#xff0c;UE热编译也不能通过。原因可能是[名字.Build.cs]文件的错误&#xff0c;缺少一些内容&#xff0c;比如说如果要写UserWidget类&#xff0c;那么就要在 ]名字.Build.cs] 中加入如下内容&#xff1a; public class beibaoxitong : ModuleRules …

140:vue+leaflet加载here地图(v2软件多种形式)

第140个 点击查看专栏目录 本示例介绍如何在vue+leaflet中添加HERE地图(v2版本的软件),并且含多种的表现形式。包括地图类型,文字标记的设置、语言的选择、PPI的设定。 v3版本和v2版本有很大的区别,关键是引用方法上,请参考文章尾部的API链接。 直接复制下面的 vue+leaf…