1.1 概述
本章主要描述Audio的相关的概念、代码结构。
1.2 概念
 CPU DAI:主控端的Audio Data Interface,比如I2S,Spdif,Pdm,Tdm
 CODEC DAI:即Codec
 DAI_LINK:绑定Cpu_Dai和Codec_Dai为一个声卡,等同于Machine Driver。
 DMAENGINE:用于Cpu和I2S/Spdif等Dai之间的Dma传输引擎,实际是通过Dma来进行数据的搬运。
 DAPM:动态音频电源管理,用于动态管理Codec等的电源管理,根据通路的开启配置开关,以达到保证功能的前提下功耗尽量小。
 JACK:耳机的接口检测,大部分使用Codec自身的检测机制,小部分使用IO来进行模拟。
Sound soc  : 主要包含公共部分代码,包括dapm控制, jack,dmaengine, core等等;    sound/soc/
rockchip platform : Rockchip平台的cpu dai的驱动,比如I2S, spdif等以及自定义声卡machine driver;sound/soc/rockchip
generic platform:simple card framework   ;sound/soc/generic
codec driver:所有的codec driver存放位置 ;sound/soc/codecs

2 Audio开发指南
音频开发指南
一个声卡包含cpu_dai, codec_dai, 以及dai_link组成,分别对应cpu dai的dirver,比如I2S driver, spdif driver;codec driver, 比如rt5640 codec driver;dai_link driver,也就是machine driver, 比如sound/soc/rockchip/rockchip_rt5640.c。 4.4的内核中支持两种方式创建声卡,一种是通用的simple-card framework,一种是传统的编写自定义的machine driver来创建。本文档均以rt5640为例。

2.2.1 simple-card
Simple card即简单通用的machine driver, 如果simple-card框架足够满足需求,建议优先使用simple card框架,简单,方便,且易用。
1. 添加codec driver,比如添加:sound/soc/codec/rt5640.c
2. 修改sound/soc/codec/Kconfig以及Makefile加入驱动编译

sound/soc/codec/Kconfig:
config SND_SOC_RT5640 tristate "Realtek ALC5640 CODEC"
depends on I2C
sound/soc/codec/Makefile:
snd-soc-rt5640-objs := rt5640.o
obj-$(CONFIG_SND_SOC_RT5640) += snd-soc-rt5640.o

3. menuconfig中enable simple card以及codec
make menuconfig Device Drivers --->
Sound card support --->
Advanced Linux Sound Architecture --->
ALSA for SoC audio support --->
ASoC support for Rockchip  Rockchip I2S Device Driver CODEC drivers --->
Realtek ALC5640 CODEC
ASoC Simple sound card support

4. 产品的DTS中添加Simple Card Node
rt5640-sound {
compatible = "simple-audio-card";
simple-audio-card,format = "i2s";
simple-audio-card,name = "rockchip,rt5640-codec";
simple-audio-card,mclk-fs = <256>;
simple-audio-card,widgets = "Microphone", "Mic Jack", "Headphone", "Headphone Jack";
simple-audio-card,routing = "Mic Jack", "MICBIAS1", "IN1P", "Mic Jack", "Headphone Jack", "HPOL", "Headphone Jack", "HPOR";
simple-audio-card,cpu { sound-dai = <&i2s_8ch>;
};
simple-audio-card,codec { sound-dai = <&rt5640>;
};
};

&i2c1
{ status = "okay";
rt5640: rt5640@1c {
#sound-dai-cells = <0>;
compatible = "realtek,rt5640";
reg = <0x1c>;
clocks = <&cru SCLK_I2S_8CH_OUT>;
clock-names = "mclk";
realtek,in1-differential;
};
};
需要注意的是,如上rt5640的clocks即mclk, upstream代码遵循谁使用clk谁申请的原则,所以后续自己添加的codec driver,如果有使用外部clk作为mclk,需要做同样的适配。

2.2.2 自定义的Machine Driver
当simple card不足以满足需求时,这个时候就需要编写相对应的machine driver,比如:sound/soc/rockchip/rockchip_rt5640.c,然后在这个machine driver添加特殊的控制,路由等等。这里不做举例,延续原有的格式,以及目录下均有参考代码可作为参照。

2.2.3 声卡调试
1. 通过如下命令确认声卡是否注册成功
root@rk3366:/ # cat /proc/asound/cards
0 [rockchiprt5640c]: rockchip_rt5640 - rockchip,rt5640-codec rockchip,rt5640-codec

root@rk3366:/ # ls -l /dev/snd/
crw-rw---- system audio 116, 2 2013-01-18 08:51 controlC0
crw-rw---- system audio 116, 4 2013-01-18 08:51 pcmC0D0c
crw-rw---- system audio 116, 3 2013-01-18 08:51 pcmC0D0p
2. 通过命令行播放录制调试声卡:
播放:一般播放1khz 0db正弦波,然后在codec输出端示波器简单测量是否失真,杂音,然后再使用音频分析仪测试指标。
root@rk3366:/ # tinyplay Usage: tinyplay file.wav
[-D card] [-d device] [-p period_size] [-n n_periods]
|root@rk3366:/ # tinyplay /sdcard/test44.wav -D 0 -d 0 -p 1024 -n 3 Playing sample: 2 ch, 44100 hz, 32 bit

录制: root@rk3366:/
# tinycap Usage: tinycap file.wav [-D card] [-d device] [-c channels] [-r rate] [-b bits] [-p period_size] [-n n_periods]
|root@rk3366:/ # tinycap /sdcard/rec.wav -D 0 -d 0 –c 2 –r 44100 –b 16 –p 1024 –n 3

3. 通过命令行调试声卡的通路:
一般复杂的codec可提供各种通路的配置,如下图:分别是数字部分通路和模拟部分通路,通路旁边都有标注控制的寄存器bit,codec driver负责将这些控制实例化为kcontrol,提供给上层设置切换通路使用,实际的调试方法为从数字部分的通路开始,比如DACDAT然后顺着找出一条最优的路径到达模拟输出端,比如HPOUT。然后通过tinymix控制路径上的相应节点开关,打通通路。

4. tinymix 调试通路:
root@rk3366:/ # tinymix
Mixer name: 'rockchip,rt5640-codec'
Number of controls: 123
ctl type num name value
0 BOOL 1 Mono Playback Switch Off
1 INT 2 Mono DAC Playback Volume 175 175
2 BOOL 2 Speaker Channel Switch Off Off
3 INT 2 Speaker Playback Volume 31 31
4 BOOL 2 HP Channel Switch Off Off
可通路ctr id或者name来控制,例子如下,不带val设置时,为查询该mix的当前状态
root@rk3366:/ # tinymix 0 1
root@rk3366:/ # tinymix 0
Mono Playback Switch: On
root@rk3366:/ # tinymix "Mono Playback Switch" 1
root@rk3366:/ # tinymix "Mono Playback Switch"
Mono Playback Switch: On

5. 声卡功能以及通路调试ok后,需要把通路配置配置到hal层,然后可以配置不同场景下的通路路由,通路的配置即为tinymix配置成功后的通路列表的值,把这些值做成相应codec_config.h加入到hal中,比如如下:
hardware/rockchip/audio/tinyalsa_hal/codec_config/rt5640_config.h
#ifndef _RT5640_CONFIG_H_
#define _RT5640_CONFIG_H_
#include "config.h"

const struct config_control rt5640_speaker_normal_controls[] = {
{ .ctl_name = "DAI select", .str_val = "1:2|2:1", },
{ .ctl_name = "Mono DAC Playback Volume", .int_val = {175, 175}, },
{ .ctl_name = "DAC2 Playback Switch", .int_val = {on, on}, },

hardware/rockchip/audio/tinyalsa_hal/codec_config/config_list.h
struct alsa_sound_card_config sound_card_config_list[] = {
……
{ .sound_card_name = "rockchiprt5640c", .route_table = &rt5640_config_table, },
……
通过以上步骤即完成基本的声卡创建,简单调试, 以上使用的tinyplay, tinycap, tinymix代码位于android/external/tinyalsa中,如果系统中没有该命令,可进到该目录执行mm生成相应的命令。

VS-RK3399 and VS-RK3288 Audio 开发指南相关推荐

  1. rk3288 ddr 开发指南

    ddr loader中的打印 DDR Version 1.08 20190523 //ddr版本号 //开始初始化ddr In SRX Channel a: DDR3 400MHz Bus Width ...

  2. 【资源共享】《RK3399 VR Sensor 开发指南》

    关于VR设备的sensor调试文档:<RK3399 VR Sensor 开发指南> 下载地址:http://developer.t-firefly.com/thread-12472-1-1 ...

  3. 3588 Rockchip_基于 DRM 框架的 HDMI 开发指南

    ROCKCHIP_基于 DRM 框架的 HDMI 开发指南-1 1 简介 OVERVIEW-1 2 变量定义 VARIABLE DEFINITION -1 3 HDMI/DP 相关配置 HDMI/DP ...

  4. 【资源共享】Rockchip I2C 开发指南 V1.0

    I2C设备的设备应用非常广泛,常见的包含重力传感器,触摸屏驱动芯片,音频解码等 这个文档是RK3399的I2C开发文档:<Rockchip I2C 开发指南 V1.0> 内容预览: 下载地 ...

  5. Html5和CSS3开发指南学习

    Html5和CSS3开发指南学习 1. 为什么学习HTML5 跨平台运行--PC/手机/Pad跨平台使用 硬件要求低 flash之外的选择,尤其是手机端开发 2. HTML介绍 2-1 什么是HTML ...

  6. Android开发指南中文版

    Android开发指南中文版 -应用程序框架   iefreer@hotmail.com 2009/9/10 个人主页: http://blog.csdn.net/iefreer 本文是对Androi ...

  7. 【正点原子STM32连载】第五十一章 视频播放器实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  8. Android修炼之道——GoogleGlass开发指南

    Google Glass 开发指南 https://developers.google.com/glass/ 时间轴(Timeline) 你的用户的时间轴被分为时间表项目.您可以使用API​​接入和管 ...

  9. Android C/C++开发指南

    Android C/C++开发指南 1.Android C/C++简介 众所周知,Android作为目前主流的移动终端领域的开发平台,其主要的开发语言就是JAVA.Android借助于JAVA高效.灵 ...

  10. WatchKit-Programming-Guide-Apple-Watch开发指南官方翻译及总结

    鉴于CSDN的Markdown很多bug,大家请看这里: WatchKit-Programming-Guide-Apple-Watch开发指南官方翻译及总结 Overview ### Developi ...

最新文章

  1. jar包升级部署到服务器详细流程,将服务部署在linux中
  2. 【FFmpeg】结构体详解(二):AVStream、AVPacket、AVOutputFormat
  3. VB调用C#写的WinForm.NET控件
  4. 打开excel发送错误报告
  5. Spring事务失效的 8 大原因,这次可以吊打面试官了!
  6. mysql 对多列进行排序 分组,尝试从多列全文mysql搜索中对结果进行排序
  7. Selenium无法点击元素,报错:ElementClickInterceptedException:element click intercepted
  8. flink的scala版本的wordcount+flink没有输出结果的几种原因
  9. 如何查找SAP UI5控件ID
  10. 实战演练:MySQL手动注册binlog文件造成主从同步异常
  11. 终极解密!输入网址按回车到底发生了什么?
  12. 重定向与请求转发的区别
  13. 【线段树入门题目集】
  14. 利用linux打造工科男的办公娱乐利器 ——以centos为例
  15. LCD显示--TM1640芯片驱动程序
  16. 【通讯录】Excel通讯录导入手机详细教程
  17. 辛格函数sinc(x)和抽样函数Sa(t)
  18. ROS中gazebo工具学习(使用gazebo加载机器人模型)
  19. fx5800p编程教程_fx5800P编程计算器操作方法.pdf
  20. PM2.5数据的清洗,汇总与制作散点图(含源数据链接)

热门文章

  1. Vscode配置ftp连接远程服务器
  2. 深度学习优化算法:AdaDelta算法
  3. 概要设计和详细设计区别_塑胶模具设计常用知识要点概要
  4. 微信活动报名源码php,fb1357 Thinkphp活动报名发布微信小程序源码 聚会活动报名小程序含说明...
  5. 计算机网络自顶向下方法 第四章 作业习题答案
  6. 如何使用VideoProc从MKV提取字幕?
  7. 【Python办公自动化】根据excel中数据批量生成word文档(适用劳动合同、质检报告、通知书等应用场景)
  8. c语言中 gotoxy() 函数的使用
  9. oracle巡检计划书,网络巡检计划表.doc
  10. 小甲鱼 c语言 20课 二维数组