5.1 px30 - rt5640音频驱动
文章目录
- 写在前面
- ALSA代码架构
- 重要概念
- a Kcontrol
- b widget
- c route
- 工具使用
- amixer 的用法
- arecord
- aplay
- alsactrl
- 如何设置通路
- 1 确认出入口
- 2 mic通路
- 3 speaker通路
- 耳机拔插检测
- 遇到mic不收声的问题
写在前面
这一章节主要是介绍px30移植5640驱动的过程,实现的目标如下
1 rt5640驱动移植
2 alsa通路配置
3 alsa通路保存默认配置信息
如果对alsa框架想详细了解可以参考这位大神的博客。
https://www.cnblogs.com/xinghuo123/category/1786302.html
ALSA代码架构
kernel/sound
目录 | 内容 |
---|---|
/aoa | 苹果主板驱动 |
/arm | arm架构相关驱动 |
/atmel | atmel设备驱动 |
/core | 该目录包含了ALSA驱动的中间层,它是整个ALSA驱动的核心部分 |
/drivers | 不同架构中一些驱动共享文件放置一些与CPU、BUS架构无关的公用代码 |
/i2c | ALSA自己的I2C控制代码 |
/isa | isa声卡的上层模块 |
/mips | MIPS声卡设备驱动 |
/oos | oos架构 |
/parisc | gsc声卡驱动 |
/pci | pci声卡 |
/ppc | powerPC架构有关 |
/sh | SUPERH声卡驱动 |
/soc | system-on-chip |
/sparc | Sparc声卡驱动 |
/synth | synth中间层 |
/usb | usb-audio驱动 |
名词解释:
CPU DAI : 主控端的 Audio Data Interface,比如 I²S,Spdif,Pdm,Tdm (就是通常所说的platform层)
CODEC DAI:即 Codec (通常所说的codec层)
DAI_LINK : 绑定 Cpu_Dai 和 Codec_Dai 为一个声卡,等同于 Machine Driver (platform
层)。
DMAENGINE:用于 Cpu 和 I²S/Spdif 等 Dai 之间的 Dma 传输引擎,实际是通过 Dma
来进行数据的搬运。
DAPM:动态音频电源管理,用于动态管理 Codec 等的电源管理,根据通路的开启配置开
关,以达到保证功能的前提下功耗尽量小。
JACK:耳机的接口检测,大部分使用 Codec 自身的检测机制,小部分使用 IO 来进行模拟。
目录层级结构
框架 | 代码 |
---|---|
codec层 | kernel/sound/soc/codecs/rt5640.c |
platfrom层 | |
Machine | Driver 层 kernel/sound/soc/rockchip/rockchip_px30_rt5640.c |
重要概念
DAPM
DAPM是Dynamic Audio Power Management的缩写,直译过来就是动态音频电源管理的意思,DAPM是为了使基于linux的移动设备上的
音频子系统,在任何时候都工作在最小功耗状态下。DAPM对用户空间的应用程序来说是透明的,所有与电源相关的开关都在ASoc core
中完成。用户空间的应用程序无需对代码做出修改,也无需重新编译,DAPM根据当前激活的音频流(playback/capture)和声卡中的
mixer等的配置来决定那些音频控件的电源开关被打开或关闭。
a Kcontrol
一个kcontrol代表着一个mixer(混音器),或者是一个mux(多路开关),又或者是一个音量控制器等等
b widget
可以理解为对kcontrol的进一步升级和封装,同样指音频系统中的某个部件,如mixer,mux;
c route
一个路径的连接至少包含以下几个元素:起始端widget,跳线path,到达端widget,其实route就是连接起各个widget
可以看出,这三大组件的关系是由点及面的。
工具使用
我的linux系统中自带了aplay arecord amixer 使用这个测试,不详细介绍工具的使用了,网上资料太多了,只是介绍个简单的用法
amixer 的用法
总结来说就是
amixer controls 查看命令
amixer cget 得到命令
amixer cset 设置命令
重点是分析下音频流如何打开,并且流向自己想要的方向
arecord
arecord -D hw:0,0 -d 10 -f dat -t wav test.wav
-D :指定声卡
-d: 指定录制时间
-f : 指定音频格式
-t :指定录制文件格式
aplay
aplay play.wav
alsactrl
保存设置
alsactl store
恢复设置
alsactl restore
要实现所有的通路 ,可以打开之后,使用alsactl store 保存配置,默认路径在:/var/lib/alsa/asound.state 之后开机时通过将alsactl restore写入脚本恢复
如何设置通路
重难点再次,根据官方手册,讲解一下如何配置通路。
1 确认出入口
先看一下原理图,将收音和放音的设备接到哪里,即先确认下这张图的入口和出口
我就以入口是IN2P 出口为SPORP为例,说明一下通路配置
2 mic通路
步骤 根据mx-[n] 查找rtl5640.h 然后查找相应的Kcontrol 或者route
amixer cset name="RECMIXL BST2 Switch" 1 #MX-3C[1]
amixer cset name="Stereo ADC MIXL ADC1 Switch" 1 #MX-27[14]
amixer cset name="ADC Capture Switch" 1 #MX-1C[15]amixer cset name="RECMIXR OUT MIXR Switch" 1 # MX-3E[0]
3 speaker通路
amixer cset name="DAI select" 0
amixer cset name='DAC MIXR INF1 Switch' 1 #MX-29 [6]
amixer cset name="Stereo DAC MIXR DAC R1 Switch" 1 # MX-2A[6]
amixer cset name="OUT MIXR DAC R1 Switch" 1 #MX-52 [0]amixer cset name="SPK MIXR OUT MIXR Switch" 1 # MX-47 [1]amixer cset name="Speaker Channel Switch" 1 #MX-01[6]
amixer cset name="SPOR MIX SPKVOL R Switch" 1 #MX-49[12]
amixer cset name="Speaker R Playback Switch" 1 #MX-01[7]
amixer cset name="Speaker Playback Volume" 26
耳机拔插检测
设备树 : kernel/arch/arm64/boot/dts/rockchip/px30-evb-ddr3-rgb-v10-linux.dts
rk_headset: rk-headset {compatible = "rockchip_headset";headset_gpio = <&gpio1 RK_PC1 GPIO_ACTIVE_HIGH>;pinctrl-names = "default";pinctrl-0 = <&hp_det>;status ="okay";
};
kernel/arch/arm64/configs/px30_linux_defconfig
CONFIG_SWITCH=y
CONFIG_SWITCH_GPIO=y
CONFIG_RK_HEADSET=y
涉及文件夹
/kernel/drivers/headset_observe/
文件名 | 功能 |
---|---|
rk_headset.c | 检测耳机拔插 |
rockchip_headset_core.c | 核心函数 |
rk_headset_irq_hook_adc.c |
简单的调用流程
遇到mic不收声的问题
我再调试过程中,rt5640遇到了录音这块死活没有声音的问题,查了好久,发现我手里的驱动代码DAPM好像有点问题
这个代码里没有描述MICBIAS1和IN1P IN2P IN3P,修改了一下代码
diff --git a/sound/soc/codecs/rt5640.c b/sound/soc/codecs/rt5640.cstatic const struct snd_soc_dapm_route rt5640_dapm_routes[] = {+ {"IN1P", NULL, "MICBIAS1"},
+ {"IN2P", NULL, "MICBIAS1"},
+ {"IN3P", NULL, "MICBIAS1"},
}
5.1 px30 - rt5640音频驱动相关推荐
- linux驱动:音频驱动(六)ASoc之codec设备
linux驱动:音频驱动(六)ASoc之codec设备
- linux驱动:音频驱动(五)ASoc之codec驱动
linux驱动:音频驱动(五)ASoc之codec驱动
- linux驱动:音频驱动(四)ASoc之machine设备
linux驱动:音频驱动(四)ASoc之machine设备
- linux 音频驱动的流程,Intel平台下Linux音频驱动流程分析
[软件框架] 在对要做的事情一无所知的时候,从全局看看系统的拓扑图对我们认识新事物有很大的帮助.Audio 部分的驱动程序框架如下图所示: 这幅图明显地分为 3 级. 上方蓝色系的 ALSA Kern ...
- Linux 音频驱动
Linux 音频驱动 硬件介绍 WM8960与IMX6ULL之间有两个通信接口:I2C和I2S 其中I2C用于配置WM8960 I2S用于音频数据传输 修改设备树文件 编写I2C子节点设备树 code ...
- Linux音频驱动开发概括
原址 1.嵌入式音频系统硬件连接 下图所示的嵌入式设备使用IIS将音频数据发送给编解码器.对编解码器的I/O寄存器的编程通过IIC总线进行. 2.音频体系结构-ALSA ALSA是Advanced L ...
- RK系列开发板音频驱动适配指南(二)
背景: 上一篇文章RK系列开发板音频驱动适配指南-DAI模块适配中已经阐述音频驱动适配的DAI模块适配步骤以及核心代码的展示,本次主要介绍音频驱动适配中的DMA模块适配. RK系列开发板 DMA模块适 ...
- Linux 音频驱动(一) ASoC音频框架简介
目录 1. ALSA简介 2. ASoC音频驱动构成 3. PCM数据流 4. 数据结构简介 5. ASoC音频驱动注册流程 1. ALSA简介 Native ALSA Application:tin ...
- 一.音频驱动-音频基础知识
在这里记录一下做音频驱动时遇到的音频基础知识 数模转换 我们能听到的音频,都是声波.声波是声音的传播形式,发出声音的物体称为声源.声波是一种机械波,由声源振动产生,声波传播的空间就称为声场.人耳可以听 ...
最新文章
- 【Visual C++】游戏开发笔记十三 游戏输入消息处理(二) 鼠标消息处理
- python和java一样吗-Python和Java有什么不一样?
- ios开发值json数据文件的存取
- 【Web安全】从xxe到phar反序列化
- vue+express+mongoose项目构建
- bzoj 1926: [Sdoi2010]粟粟的书架 (主席树+二分)
- 解决在 WP8/ WP8.1 项目中 引用 C++ 组件时出现的 System.TypeLoadException 错误
- 图像的上采样、下采样
- 收评:5月24日资金流向(摘自益盟)
- c++三子棋游戏程序
- layui菜鸟教程--乐字节前端
- python pip gpl_Python PICOS包_程序模块 - PyPI - Python中文网
- 今日头条新闻采集爬虫分享
- CLion中回退和前进的快捷键
- poi设置表格内容水平垂直居中
- IFAHP直觉模糊层次分析法matlab
- Oracle数据库的毗邻
- GDB内存断点(Memory break)的使用举例
- 2019年我的技术自我救赎之路
- shopee虾皮货代仓储打包系统erp铺货中转仓
热门文章
- 计算机都要学高等数学和英语么,大学所有专业都要学英语、高数和大学语文吗?...
- 购物狂欢节?购物比惨节?
- QoS服务质量五QoS边界行为之流量整形
- Unity中的Shuriken粒子系统(4)
- Adobe Dreamweaver CS5中文版安装
- Opencv_100问_第四章 (16-20)
- android沉浸式状态栏底部背景用图片代替
- Improving the Efficiency of Grammatical Error Correction with Erroneous Span Detection翻译
- Linux环境安装Jenkins
- 【论文笔记】Remote Sensing Image Change Detection with Transformers