安卓智能手机芯片上audio的bringup
基于安卓平台的智能手机芯片回来后要做bringup。首先是负责平台的把安卓OS起来,然后就轮到各功能模块做bringup了,Audio是其中主要功能模块之一。Audio由于场景多和牵涉到的core多,bringup工作会多些。本人曾多次做过智能手机和智能手表上audio 的bringup,主要负责audio DSP上的软件调试。本文就讲讲一款安卓智能手机芯片上audio的bringup。
芯片先是设计,做完硬件相关的验证后去流片,过一段时间后才回来。这是一个相对较长的时间。在这期间软件人员一方面在FPGA上做芯片验证,另一方面在FPGA上做软件功能开发。要求芯片回来前跟硬件无关的软件要ready,跟硬件相关的代码要写好,芯片回来后就开始调试,确保各基本功能OK,可以快速推向市场。所谓bringup就是芯片回来后做软件调试看硬件是否有问题以及软件基本功能完成的过程。对于智能手机来说,audio的基本功能如下:codec播放音乐,codec APP录音,codec电话,蓝牙播放音乐,蓝牙电话,codec VoIP电话,蓝牙 VoIP电话。这些功能调完了,bringup就算结束了。Audio牵涉到AP、ADSP以及CP,做bringup时是各模块相互配合联合调试完成的。
在讲bringup前先看看这款手机芯片跟音频相关的硬件框图,如图1。

图 1
从上图看出,跟音频相关的core有AP、ADSP以及CP,各个core之间通过IPC通信。可以通过codec或者蓝牙采集和播放音频,其中Codec芯片内置,蓝牙芯片(它负责与蓝牙耳机通过蓝牙空口通信)外置。先看看各种基本功能下的audio data path。
1,codec音乐播放
图2是codec播放音乐时的data path。音频流从AP发给ADSP,ADSP做解码以及后处理等,然后把音频数据经过ADMA送给codec播放出来。

图 2
2,codec APP录音
图3是codec APP录音时的data path。从codec采集到音频,经过ADMA送给ADSP,ADSP处理后送给AP,AP将音频数据编码后保存成文件。

图 3
3,codec电话
图4是codec电话时的data path。上行时codec 采集音频数据通过ADMA送给ADSP,ADSP处理后送给CP,CP处理后通过空口送给对方。下行时CP从空口收到对方数据,处理后发给ADSP,ADSP处理后通过ADMA发给codec播放出来。AP主要负责控制流程。

图 4
4,蓝牙播放音乐
图5是蓝牙播放音乐时的data path。音频流从AP发给ADSP,ADSP做解码以及后处理等,然后把音频数据经过UART发给蓝牙芯片, 蓝牙芯片再通过空口发给蓝牙耳机播放出来。

图 5
5,蓝牙电话
图6是蓝牙电话时的data path。上行时蓝牙耳机采集音频数据通过蓝牙空口发给蓝牙芯片,蓝牙芯片通过PCM bus和ADMA把音频数据送给ADSP,ADSP处理后送给CP,CP处理后通过空口送给对方。下行时CP从空口收到对方数据,处理后发给ADSP,ADSP处理后通过ADMA和PCM bus发给c蓝牙芯片,蓝牙芯片通过蓝牙空口把音频数据发给蓝牙耳机播放出来。AP依旧主要负责控制流程。

图 6
6,codec VoIP电话
VoIP电话主要是指APP里的语音通话,比如微信里的微信语音。图7是codec VoIP电话时的data path。上行时codec 采集音频数据通过ADMA送给ADSP,ADSP处理后送给AP。下行时AP把音频数据发给ADSP,ADSP处理后通过ADMA发给codec播放出来。这时AP不仅负责控制流程,同时语音通信的整个方案大部分都是在AP的APP里做的。ADSP主要就是负责音频的采集和播放。

图 7
7,蓝牙VoIP电话
图8是蓝牙VoIP电话时的data path。上行时蓝牙耳机采集音频数据通过蓝牙空口发给蓝牙芯片,蓝牙芯片通过PCM bus 和ADMA把音频数据送给ADSP,ADSP处理后送给AP。下行时AP把音频数据发给ADSP,ADSP处理后通过ADMA和PCM bus把音频数据送给蓝牙芯片,蓝牙芯片再通过蓝牙空口发给蓝牙耳机播放出来。同codec VoIP电话一样,ADSP主要就是负责音频的采集和播放。

图 8
做bringup时有个相对的先后顺序,比如调IPC通常是最先做的,因为它不仅是核间通信,ADSP上的log以及dump音频数据等debug手段也要靠它,可以说是基础设施了,它好了才可以调其他功能。下面就以相对的先后顺序来讲bringup。
1,IPC调试
这里的IPC调试是指AP与ADSP之间的IPC。后面还有ADSP与CP之间的IPC调试,主要用在打电话时,就放在那里调了。AP把ADSP boot起来后ADSP会给AP发个IPC,告诉ADSP已经boot起来了。AP收到IPC中断后能进中断服务程序就说明ADSP给AP的IPC通了。调AP给ADSP的IPC也类似。调试过程中出现问题通常是中断号不对、IPC基地址不对等,相对好查。IPC调好后就可以通过它把ADSP的log发给AP打印出来,要dump音频数据也通过IPC把音频数据发给AP保存成音频文件。之所以这么做是因为ADSP上通常没有打印和dump音频功能。
2,调试audio driver
这里audio driver是指codec的driver,要能播放和录音。这也是audio功能的基础设施。播放和录音好了才可以开发具体的功能。我的习惯是先调播放,把正弦波送给codec,如从扬声器里能听到tone音,就说明播放功能ok。再调录音,把采集到的音频数据通过IPC发给AP保存成文件,然后用工具听,跟自己说的内容一样就说明录音调好了。调试过程中遇到问题需要硬件、ASIC和analog的support,比如某个寄存器的配置是否正确,量某个pin输出的波形是否符合期望,跳线帽有没有跳对等。
3,基本功能调试
基本功能调试时用的都是一些常规的方法,比如log和dump 音频数据等。
codec音乐播放:前面说过在芯片回来前已把在FPGA上能调的功能基本调好,音乐播放就是其中之一。在FPGA上用命令行来做音乐播放,由于没有codec,就把送给codec的音频数据保存成文件来确认结果。不管是WAV格式的还是需要解码的如MP3之类格式的,当时均已调好。当芯片回来后且codec driver已调好时,音乐播放很快调好了。
codec APP录音:同codec音乐播放一样,芯片回来前已在FPGA上用命令行把流程调好。用正弦波来替代codec录到的音频数据,ADSP把正弦波送给AP保存成文件,再去用类似CoolEdit这样的工具去听,是正弦波就算录音流程ok了。当芯片回来后且codec driver已调好时,用真正采集到的音频替代正弦波,APP录音也很快调好了。
codec电话:在芯片回来前ADSP上的语音通路已通过打桩做过调试。上行时用正弦波替代通过codec采集到的音频,把上行处理后发给CP的音频数据(语音编解码在CP上做)dump出来看是否符合期望。下行时把CP发给ADSP的用正弦波替代,把下行处理后送给codec的音频dump出来看是否符合预期。也定义好了ADSP和CP的交互接口,写好了代码等芯片回来后调试。语音通话牵涉到3个core(AP,ADSP,CP),模块较多,调试参与的人也较多。通常是链路上其他模块先调好,最后跟ADSP联调,调的就是ADSP和CP之间的接口,很快会调好能打电话了。需要说明的是VE(voice enhancement,语音增强,比如回声消除、降噪等)没在这时调,VE要在bringup结束后专门去调试和tuning。
蓝牙音乐播放:这款芯片上BT music为了省播放时的功耗做成了A2DP offload模式。A2DP offload是指把BT host里的A2DP从AP移到ADSP上,这样ADSP就多了A2DP的功能(这功能由BT的同学负责)。这么处理后播放蓝牙音乐时AP就能长时间的睡下去来降功耗。Audio做好SBC编码后把SBC码流送给A2DP,A2DP处理后通过UART送给蓝牙芯片,进而送给蓝牙耳机播放出来。开发时就写好了A2DP向audio要SBC码流的机制,即A2DP的SBC码流buffer空到threshold时向audio要SBC码流,来驱动audio来干活。芯片回来前把能调的都调好了,芯片回来后主要调的就是A2DP和audio的交互机制。要确保从蓝牙耳机里听到的音乐不断续卡顿。经过一番联调后,蓝牙音乐播放基本不断续卡顿了。
蓝牙电话:相对于codec 电话,蓝牙电话主要区别在于声音的采集和播放。蓝牙电话时ADSP从外置的蓝牙芯片处获取采集到的音频数据,也会把音频数据送给蓝牙芯片。ADSP和蓝牙芯片是通过PCM Bus通信的,其driver在芯片回来前就已写好。在调蓝牙电话前要先把相关驱动调好。调试过程中通过示波器看pcm bus的时钟信号以及帧同步信号是否符合预期。Driver调好后再与ADSP上调codec电话时已调好的上下行通路联调,很快就能调好打蓝牙电话了。
VoIP电话:VoIP电话的大部分实现是在AP上,ADSP上仅仅负责音频的采集和播放。ADDP把采集到的音频通过IPC发给AP,同时把从AP收到的音频送给外设播放出来。调试时基于一款有VoIP功能的APP来调,我调试时就在手机EVB板上装上微信然后打微信语音来调。Codec VoIP电话和BT VoIP电话也仅仅是采集和播放不一样,就不再细讲了。这两种VoIP电话也能很快调好。
以上基本功能调完后,bringup就算结束了。
为了更好的跟大家沟通,互帮互助,我建了一个微信讨论群。如您有兴趣,请扫下方的二维码加好友(备注来意),我拉您进群。谢谢!

安卓智能手机芯片上audio的bringup的更多相关文章
- H5活动全屏滚动页面在安卓智能电视TV调试
前段时间公司做一个线上活动,在电视上商品促销.产品的要求是每个商品介绍刚好满一屏,按下遥控器向下键可以整屏切换.这种功能如果实在PC端,实现起来非常容易,引用jQuery插件就能实现.但是在安卓智能电 ...
- 安卓智能手持POS打印票据 扫描盘点移动开单软件/无线开单系统/PDA移动开单软件
移动开单手持机,它通过WIFI或者GPRS连接并访问电脑数据,实现移动扫描开单,数据同步上传等功能.方便.实用,大大提高工作效率!安卓智能手持POS是一套适合大酒店.咖啡馆..洗衣店.按摩洗浴,商场等 ...
- paip.输入法编程---智能动态上屏码儿长调整--.txt
paip.输入法编程---智能动态上屏码儿长调整--.txt 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csd ...
- 100%解决ios上audio不能自动播放的问题
由于ios的安全机制问题,不允许audio和video自动播放,所以想要使audio标签自动播放那是实现不了的,即使给play()也是播放不了. 解决方法: 首先,创建audio标签:<audi ...
- 怎样通过 DLNA 将电脑上的媒体投射到智能电视上
DLNA 是一种网络设备间共享媒体的解决方案.从 Windows 7 开始就支持 DLNA,现在一些国产智能电视也已经支持 DLNA 了,这就为我们在电脑和电视之间方便地共享多媒体提供了条件. 工具/ ...
- 如何在windows上调试安卓机谷歌浏览器上的页面
- 下面的方法仅在windows和安卓机上测试过,,,, - 手机(安卓机)需要安装chrome与电脑(Windows)上的chrome配合,也就是只能调试谷歌浏览器上的页面 1.手机的准备工作 打开 ...
- 为安卓手机刷上手机kali系统Nethunter
kali Nethunter是一个装在手机上的kali,集成了kali的工具包,hid,无线攻击等等. 本文主要叙述如何安装此系统并正确的配置.不让你走弯路. 首先我们拒绝傻瓜安装软件 kali ne ...
- 浩瀚PDA开单器-结束手工开单模式【百货、商超】PDA安卓智能手持POS 进销存管理系统移动收银管理软件
移动销售终端:先进的跨平台技术,支持智能PDA等移动终端提供移动销售开单.移动POS.移动查询货品.移动盘点等功能. 移动开单器的操作说明 第一步:选客户 Ø 用户在空白开单主页左划屏幕 ...
- 安卓智能POS终端手持机PDA应用仓库出入库,移库,盘点,销售开单系统
随着移动互联网的兴起,目前仓储管理所面临的的问题可以迎刃而解,WMS仓库系统解决方案通过智能终端扫描条码技术应用解决了工作量大导致工作效率不高,以及数据实时传输等问题,该方案主要提供仓库出入库,移库, ...
- 浩瀚技术团队... 安卓智能POS移动PDA开单器 开单器 进销存系统 进销存系统
浩瀚技术团队... 智能POS移动PDA开单器 开单器 进销存系统 进销存系统 点餐 会员管理 会员管理 深度解读 手机APP移动办公到底是什么? 快速打单POS·不仅仅是快那么简单!
随机推荐
- 蝉联第一,天翼云电脑持续领跑中国DaaS市场!
近日,IDC发布的<中国虚拟桌面软件及云服务市场半年跟踪报告>数据显示,中国电信天翼云在2023年上半年中国桌面即服务(Desktop as a Service,以下简称"Daa ...
- 1.6~THUWC 的总结
THUWC 虽然拿到了一等奖,但是其实不如预期的发挥. Day1 获得 260~300 分.快速地想出了 T1T2 然后在调试上花费了很多的时间,T3 没有想出来,T4 想出了 \(O(n\log^3 ...
- CTFHub技能树-信息泄露wp
信息泄露 信息泄露(Information Disclosure)通常指题目中意外暴露了敏感数据或隐藏信息,这些信息可能直接或间接帮助解题者获取Flag 常见类型如下: HTTP请求 robots协议 ...
- JUC并发—3.volatile和synchronized原理
大纲 1.volatile关键字的使用例子 2.主内存和CPU的缓存模型 3.CPU高速缓存的数据不一致问题 4.总线锁和缓存锁及MESI缓存一致性协议 5.Java的内存模型JMM 6.JMM如何处 ...
- Linux环境Docker使用代理推拉镜像
闲扯几句 不知不觉已经2月中了,1个半月忙得没写博客,这篇其实很早就想写了(可追溯到Docker刚刚无法拉镜像的时候),由于工作和生活上的事比较多又在备考软考架构,拖了好久-- 简单记录下怎么做的,以 ...
- [Ynoi2015] 我回来了 题解
\(NOIP\) 考前祈福. 实际上,每种伤害 \(d\) 打出的亵渎次数可以转化为: \[1+\max\limits_{i=0}^{\lceil\frac{n}{d}\rceil}(i[\sum\l ...
- 当向json数组追加节点时,再去修改它,发现所有的该节点的数据都被修改了
当向一个json数组追加的节点被修改时,所有对象的的节点都被修改了 众所周知,追加json节点时,我们通常会直接给不存在的节点赋值 比如这样: let json = [ { id:'1' }, { i ...
- QT5笔记:10. 容器类的迭代
1. 这里指的是Java类型的迭代器,即使用方式和Java中一致 代器的使用例子(适用于可读可写迭代器) QList<QString>list;//声明容器类 list << ...
- Sqoop - 使用场景
Oracle >> HDFS sqoop import --connect jdbc:oracle:thin:@<oracle_host>:<oracle_port> ...
- 【资源分享】Latex mathematical symbol
https://files.cnblogs.com/files/blogs/705982/symbols.zip?t=1660463874 上面这个是pdf版,把这个压缩包下载之后,后缀改为pdf即可 ...