文章目录

  • 写在前面
  • 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音频驱动相关推荐

  1. linux驱动:音频驱动(六)ASoc之codec设备

    linux驱动:音频驱动(六)ASoc之codec设备

  2. linux驱动:音频驱动(五)ASoc之codec驱动

    linux驱动:音频驱动(五)ASoc之codec驱动

  3. linux驱动:音频驱动(四)ASoc之machine设备

    linux驱动:音频驱动(四)ASoc之machine设备

  4. linux 音频驱动的流程,Intel平台下Linux音频驱动流程分析

    [软件框架] 在对要做的事情一无所知的时候,从全局看看系统的拓扑图对我们认识新事物有很大的帮助.Audio 部分的驱动程序框架如下图所示: 这幅图明显地分为 3 级. 上方蓝色系的 ALSA Kern ...

  5. Linux 音频驱动

    Linux 音频驱动 硬件介绍 WM8960与IMX6ULL之间有两个通信接口:I2C和I2S 其中I2C用于配置WM8960 I2S用于音频数据传输 修改设备树文件 编写I2C子节点设备树 code ...

  6. Linux音频驱动开发概括

    原址 1.嵌入式音频系统硬件连接 下图所示的嵌入式设备使用IIS将音频数据发送给编解码器.对编解码器的I/O寄存器的编程通过IIC总线进行. 2.音频体系结构-ALSA ALSA是Advanced L ...

  7. RK系列开发板音频驱动适配指南(二)

    背景: 上一篇文章RK系列开发板音频驱动适配指南-DAI模块适配中已经阐述音频驱动适配的DAI模块适配步骤以及核心代码的展示,本次主要介绍音频驱动适配中的DMA模块适配. RK系列开发板 DMA模块适 ...

  8. Linux 音频驱动(一) ASoC音频框架简介

    目录 1. ALSA简介 2. ASoC音频驱动构成 3. PCM数据流 4. 数据结构简介 5. ASoC音频驱动注册流程 1. ALSA简介 Native ALSA Application:tin ...

  9. 一.音频驱动-音频基础知识

    在这里记录一下做音频驱动时遇到的音频基础知识 数模转换 我们能听到的音频,都是声波.声波是声音的传播形式,发出声音的物体称为声源.声波是一种机械波,由声源振动产生,声波传播的空间就称为声场.人耳可以听 ...

最新文章

  1. 【Visual C++】游戏开发笔记十三 游戏输入消息处理(二) 鼠标消息处理
  2. python和java一样吗-Python和Java有什么不一样?
  3. ios开发值json数据文件的存取
  4. 【Web安全】从xxe到phar反序列化
  5. vue+express+mongoose项目构建
  6. bzoj 1926: [Sdoi2010]粟粟的书架 (主席树+二分)
  7. 解决在 WP8/ WP8.1 项目中 引用 C++ 组件时出现的 System.TypeLoadException 错误
  8. 图像的上采样、下采样
  9. 收评:5月24日资金流向(摘自益盟)
  10. c++三子棋游戏程序
  11. layui菜鸟教程--乐字节前端
  12. python pip gpl_Python PICOS包_程序模块 - PyPI - Python中文网
  13. 今日头条新闻采集爬虫分享
  14. CLion中回退和前进的快捷键
  15. poi设置表格内容水平垂直居中
  16. IFAHP直觉模糊层次分析法matlab
  17. Oracle数据库的毗邻
  18. GDB内存断点(Memory break)的使用举例
  19. 2019年我的技术自我救赎之路
  20. shopee虾皮货代仓储打包系统erp铺货中转仓

热门文章

  1. 计算机都要学高等数学和英语么,大学所有专业都要学英语、高数和大学语文吗?...
  2. 购物狂欢节?购物比惨节?
  3. QoS服务质量五QoS边界行为之流量整形
  4. Unity中的Shuriken粒子系统(4)
  5. Adobe Dreamweaver CS5中文版安装
  6. Opencv_100问_第四章 (16-20)
  7. android沉浸式状态栏底部背景用图片代替
  8. Improving the Efficiency of Grammatical Error Correction with Erroneous Span Detection翻译
  9. Linux环境安装Jenkins
  10. 【论文笔记】Remote Sensing Image Change Detection with Transformers