智能手机无音频场景使用时Audio DSP低功耗的处理
智能手机(或智能手表)等用电池的电子设备对功耗比较敏感,因此不管是使用中还是待机时都要做低功耗处理来省电。前面的文章(智能手表音乐播放功耗的优化)讲了一款智能手表在播放音乐时的低功耗优化,这属于音频场景使用中的低功耗处理,智能手机上的处理也类似。本文讲讲没有音频场景使用时Audio DSP(下文简称ADSP)的低功耗处理。
没有音频场景使用时,ADSP的低功耗处理我处理过两种,一种是音频子系统(包含ADSP、SRAM等)没有PMU(power management unit,电源管理单元)的,另一种则是有PMU的。没有PMU单元的处理比较简单,就是没有音频场景使用时AP把ADSP下电,这样ADSP没任何功耗,但是当有音频场景使用时,AP首先去boot ADSP(boot过程见文章 Audio DSP boot 过程),然后开始具体的音频场景。Boot需要一定的时间,比如十几毫秒。对于有PMU单元的音频子系统,则要通过PMU做低功耗处理。即ADSP在没有音频场景使用时进入低功耗模式(Low Power Mode, LPM),有音频场景在使用时,ADSP被唤醒,开始具体的音频场景。下面具体讲。
ADSP被boot起来后,如果没有音频场景在使用中,就会进入idle状态。虽然在idle状态,但是也会耗电的,有一定的底电流。对于有PMU的音频子系统,就会通过PMU来做无音频场景使用时的低功耗处理,让功耗降到最小。低功耗处理是硬件和软件相结合的来做。硬件相关的由ASIC做好了,软件是要做好PMU相关的寄存器配置以及相关的逻辑。
先看要做低功耗处理PMU有哪些寄存器要配置。首先是低功耗模式。低功耗有三个模式,分别是CLOCK_GATING , PLL_OFF , PWR_OFF 。 CLOCK_GATING是关clock, PLL_OFF是关PLL,PWR_OFF是ADSP下电,这三种模式是功耗依次变小。通常情况下,既然做低功耗了,肯定要把功耗做到最低,即PWR_OFF模式。其次是memory配置模式。memory的配置有两种,分别是SHUTDOWN和RETENTION。SHUTDOWN是彻底下电,memory里的内容没了。RETENTION是带电保持,memory里的内容还在。在低功耗模式配成PWR_OFF的情况下,如果memory配成SHUTDOWN,让ADSP再起来就跟boot过程完全一样了。所以memory要配成RETENTION,在ADSP进入低功耗模式后让memory里的内容还在,当ADSP被唤醒后可以快速的进入工作模式。需要配置RETENTION的memory包括audio SRAM, ITCM, DTCM等。最后是唤醒源的配置。ADSP进入低功耗模式后要能被唤醒,即从低功耗模式出来开始工作。唤醒源就是那些能唤醒ADSP的中断,通常配置的唤醒源有其他核的IPC(比如AP的IPC)、内置的timer等,ADSP收到这些中断后就会被唤醒,先走唤醒流程,然后开始工作。
再看相关逻辑的处理,主要包括两方面,一是判断是否要进低功耗模式,二是从低功耗模式出来的唤醒流程。ADSP不仅在没有音频场景使用时处于idle状态,在有音频场景使用时也是频繁的在active和idle状态间切换,而且大部分时间处于idle状态。以codec播放音乐为例,是靠Audio DMA(ADMA)中断来驱动音乐播放的。ADMA中断通常10毫秒一次,来一次ADMA中断就会让ADSP从idle状态变成工作状态。ADSP工作一两毫秒后,任务完成,又回到Idle状态,所以说ADSP在音频场景使用时大部分时间处于idle状态。在ADSP处于idle状态时要判断是否进低功耗模式,在有音频场景使用时不进,没有则要进。具体软件实现时采用投票机制。每种音频场景都有一票,当所有音频场景都投票可进低功耗模式时才进低功耗模式,否则不进。
唤醒流程是指ADSP被唤醒后的软件处理流程。前面的文章(Audio DSP boot 过程)说过ADSP被boot时有入口地址,同样被唤醒时也有入口地址(这个入口地址是ADSP被boot起来后由ADSP去配的),也是在ctr0.c里,如下图:

上图意思是ADSP把被唤醒的入口地址配成了0x80,ADSP被唤醒后就从0x80处开始运行,进入唤醒处理流程。唤醒处理主要有哪些内容呢?上文说过,低功耗模式时memory配的是RETENTION模式,进入低功耗模式后memory里的内容还在,即软件还在,要处理的就是跟硬件相关的。主要是因为ADSP进入低功耗模式后,ADSP下电了,跟硬件相关的配置都没了,需要重新配置一下。硬件的配置主要包括cache的配置,中断控制器的配置等。还有就是在ADSP进入低功耗模式前要记下有哪些中断没有被mask。ADSP被唤醒后,这些中断也要被配成unmask,保持与ADSP进入低功耗模式前的一致。这些说白了就是硬件的配置要还原成ADSP进入低功耗模式前的样子。ADSP收到的唤醒源中断把ADSP唤醒后,中断还pending在那,没被处理。当软件把中断使能后,立刻进入中断服务程序处理,并进而进入后续的处理流程。
下面就以手机先开机然后播放音乐为例看看整个过程,示意如下图:

1, 手机开机,ADSP被AP boot起来,做软硬件的初始化等。由于没有音频场景,ADSP先进idle,再进低功耗模式(LPM)
2, 要播放音乐,AP给ADSP发IPC,把ADSP唤醒,走音乐播放流程。在音乐播放过程中,每个loop内ADSP大部分时间处于idle状态,但是由于有音频场景在,不会进入LPM
3, 音乐播放结束,没有音频场景了,ADSP就从idle进入了LP模式。如果后续又有新的音频场景开始,ADSP又会给唤醒,开始新的音频场景。
过程清楚了后再看怎么调试。我把调试分成了两个阶段,第一阶段是ADSP刚被boot起来后没有音频场景的单步调试,第二阶段是带音频场景的联合调试。第一阶段主要分3步:
1, ADSP被boot起来后,由于无活可干,会进idle,再通过配置寄存器让ADSP进入低功耗模式。通过读相关寄存器看ADSP是否能进低功耗模式。如没进,则要去调查原因,最终要进入低功耗模式。
2, 在ADSP进入低功耗模式后,AP给ADSP发一个IPC,看ADSP是否会被唤醒以及是否会进唤醒流程。同样如果ADSP没被唤醒或者没进唤醒流程,需要去调查,最终要能被唤醒以及进唤醒流程
3, 在唤醒流程中做上文说的一些处理,最后进IPC的中断服务程序。又无活可干,再进idle,再进低功耗模式。
上面这3步就把ADSP能进低功耗模式以及能被唤醒以及唤醒流程处理调好了。然后就是带音频场景的联合调试,期望结果是有音频场景时ADSP被唤醒,音频场景结束后ADSP又进低功耗模式。把每个音频场景都要调试一下后整个调试就算完成了。无音频场景的低功耗处理看上去没什么,但是从理解过程到完成调试是需要花一些时间的,因为它牵涉到硬件以及最底层软件的处理。
智能手机无音频场景使用时Audio DSP低功耗的处理的更多相关文章
- Android智能手机中各种音频场景下的audio data path
上一篇文章(Android智能手机上的音频浅析)说本篇将详细讲解Android智能手机中各种音频场景下的音频数据流向,现在我们就开始.智能手机中音频的主要场景有音频播放.音频录制.语音通信等.不同场景 ...
- Toolbar 和 CollapsingToolbarLayout一起使用时menu item无点击反应解决办法
昨天一直在琢磨为什么Toolbar和CollapsingToolbarLayout一起使用时menu item无点击放应的原因,后来在stackoverflow上一条回答,说可能是Toolbar的背景 ...
- Java 中无返回值的方法在使用时应该注意的问题
Java 中的方法是形态多样的.无返回值的方法在使用时应该规避哪些问题呢? 一.不可以打印调用或是赋值调用,只能是单独调用(非常重要): 二.返回值没有,不代表参数就没有: 三.不能return一个具 ...
- 【原】无脑操作:IDEA使用时,提示"8080端口被占用"的解决
1.问题描述:IDEA使用时,提示"8080端口被占用" Description: The Tomcat connector configured to listen on ...
- Android手机上Audio DSP频率低 memory小的应对措施
我在前面的文章(Android智能手机上的音频浅析)中说过Android手机上有一块专门用于音频处理的DSP,它的特点是频率低(一般几百MHZ).内部memory小(通常不超过100k word).要 ...
- html5之音频、视频(video&audio)
音频&视频 本篇为本人的学习笔记. 在Html5之前,浏览器对于视频和音频的处理并没有一个标准.因此在网页中看到的视频,都是通过第三插件的方式嵌入的,如:QuickTime.RealPlaye ...
- Netty4.0.24.Final 版本中 IdleStateHandler 使用时的局限性
使用Netty在客户端和服务端建立通讯通道,一般来说,一个连接可能很久没有访问,由于各种各样的网络问题导致连接已经失效,客户端再次发送请求时会产生连接异常. 基于这个原因,需要在客户端和服务端之间建立 ...
- bootstrap-datepicker 与bootstrapValidator同时使用时,选择日期后,无法正常触发校验
bootstrap-datepicker 与bootstrapValidator同时使用时,选择日期后,无法正常触发校验 (解决办法) http://blog.csdn.net/biedazhangs ...
- selenium + PhantomJS使用时 PhantomJS报错解决
selenium + PhantomJS使用时 PhantomJS报错解决 在做动态网页爬虫时用到了selenium + PhantomJS,安装好之后运行时报错: UserWarning: Sele ...
- 华为音频编辑服务(Audio Editor Kit),快速构建应用音频编辑能力
音频编辑服务(Audio Editor Kit)是华为为开发者开放的各类场景音频处理能力的集合,汇聚了华为在音乐.语音等相关音频领域的先进技术.音频编辑服务提供基础编辑.伴奏提取.空间渲染.变声降噪等 ...
随机推荐
- Lambda表达式的省略规则、Lambda和匿名内部类的区别--java进阶day03
1.省略规则 2.流程讲解 主方法中调用useStringhandler,该方法的形参是接口,所以我们要给实现类对象,这里我们使用匿名内部类 use...方法进栈,形参也是变量,接收到匿名内部类(如下 ...
- 【Java】关键字的使用
java中有很多的关键字,他们的使用让Java语言变得更加灵活.易用,下面将介绍Java中最常用的几个关键字并说明其用法. 一.关键字:return--跳出 使用在方法体中,用于:① 结束方法② 针对 ...
- creative打靶学习笔记(4)
参考视频[Tryhackme系列网安课程-Creative-难度3-哔哩哔哩] https://b23.tv/6qzkzyh nmap扫描
1.环境 centos6 2.描述 设置Nginx开机启动,当服务器重启后,可自行启动nginx 3.方案一 3.1.创建nginx.service文件 vim /usr/lib/systemd/sy ...
- 判断页面是否存在指定内容,校验结果(page should contain element指令的用法)
会员调整成分销商后,分销商列表寻找该记录的方法
- QUBO建模
技术背景 QUBO(Quadratic Unconstrained Binary Optimization)模型是一种常用于求解组合优化问题的一种技术,它所能够求解的问题是这样定义的:给定一个布尔类型 ...
- Streamlit快速入门指南
theme: orange Streamlit是一个Python库,允许您创建交互式的数据科学和机器学习Web应用程序. Streamlit介绍 Streamlit是一个Python库,允许您创建交互 ...
- CF1774C题解
题目传送门 假设最后一场的环境为 111,即温度大的人赢,那么温度为 111 的人即使活到了最后一场也必输. 同理,如果最后 kkk 场的环境都为 111,那么有 k(1∼k)k(1\sim k)k( ...
- Mybatis 框架课程第四天
目录 1 Mybatis 延迟加载策略 1.1 何为延迟加载 1.2 实现需求 1.3 使用 assocation 实现延迟加载 1.3.1 账户的持久层 DAO 接口 1.3.2 账户的持久层映射文 ...