智能手机无音频场景使用时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又进低功耗模式。把每个音频场景都要调试一下后整个调试就算完成了。无音频场景的低功耗处理看上去没什么,但是从理解过程到完成调试是需要花一些时间的,因为它牵涉到硬件以及最底层软件的处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值