44922004.doc
– Adds an item to the watermark(添加一条记录到watermark中) – Calls each_item_func(), if any(调用函数each_item_func())
– If this is the first item in the watermark, calls non_empty_func_ptr(如果这是watermark的第
一条记录(队头),则调用non_empty_func_ptr) – If highwater mark in bytes is reached, calls hiwater_func_ptr(deassert CTS)(如果字节数到达了watermark上线则调用hiwater_func_ptr)
– If it does not_exceed_cnt bytes in the watermark, drops the item(如果item中的字节数没有达到要求则忽略这个item) dsm_dequeue(wmark)
– Removes the first item from the watermark(从watermark中去掉队头(出队))
– If no other items are left in the watermark, calls gone_empty_func_ptr(如果watermark中已经没有item了,则调用gone_empty_func_ptr)
– If low-water mark is reached, calls lowater_func_ptr(assert CTS)(如果到达watermark底线,则调用lowater_func_ptr)
注意: watermark counts是指byte数而不是item数。
可以看出,dsm watermark就是通过对队列的出队入队的管理来实现流控制的。 在DSM入队操作中,其中有这么一句:
这里就是对队列进行watermark监测,下面看watermark监测做了什么事情。
联想移动产品开发部软件处 - 23 -
44922004.doc
上面的代码可以看出,在入队时,根据队列的情况进行了相应情况的call back调用。换句话讲,就是当队列发生变化时,watermark将调用不同的函数以响应这些变化。 可见,watermark可以看成是一种基于队列操作的队列管理机制。示意图如下 联想移动产品开发部软件处 - 24 -
44922004.doc
3.5 Sleep
3.5.1 Sleep硬件相关知识
一般我们直观观察高通是否进入睡眠可以通过数字电源来观察,那么有必要对睡眠相关的Sleep电流概念有所了解:
联想移动产品开发部软件处 - 25 -
44922004.doc
CDMA 手机的Idle 状态的电流如上。有3 个概念描述如下: Average sleep current: 0.4-0.9mA.根据手机功能,显示屏的要求不同而不同。
Average Rx current:手机处于睡眠状态时,需要定时从基站接收消息。此刻手机接收系统唤醒。正常的手机paging 应是规则的。
Idle 电流: 是指手机 sleep current 和Rx current 的时间平均值。影响手机Idle 电流的主要因素是sleep 底电流。RX 电流的宽度和高度在芯片组和协议栈定好以后,一般开发者没有能力改变。
3.5.2 Sleep软件相关知识 在高通平台上,Sleep由sleep task进行管理, sleep任务的优先级最低(优先级2). 当没有其他任务使用CPU时, 调度器才会让sleep task获得CPU的使用权限, sleep task会根据当前的任务调用状态, 决定CPU是否可以进入睡眠状态, 如果判定当前状态可以进入sleep状态, 则通过sleep_power_down_and_halt关闭主晶振TCXO及其他LDO电源, 以获得省电效果。具体流程如下图所示: TMC initFor(;;)Query signalsif ( sleep_sigs != 0 ) deal some signalselse sleep_power_down_and_haltSleep taskDeal some signals
sleep_initsleep_power_down_and_halt联想移动产品开发部软件处 - 26 -
44922004.doc
Sleep鉴权:
sleep_power_down_and_halt能否关闭TCXO及其他LDO电源, 以获得省电效果由sleep鉴权机制决定
Sleep鉴权机制大体可以分为两块鉴权部分:
1) sleep任务本身是否容许进行睡眠 2) 是否有其他任务不容许进行睡眠
3.5.3 查Sleep电流方法
1. 首先确保所有 task 都可以进sleep
. 在Sleep.c 里面添加代码,把所有not_okts 的task 从log 打出来, 如果这时只有SLEEP_DIAG_OKTS_SIG 和SLEEP_USB_OKTS_SIG 则正常.
. 再把上面加的代码去掉, 用示波器测量TCXO, 看是否有周期性关闭. 如果有则正常,没有则需查diag 和usb task 是否有问题.
2. 在 TCXO 关闭基础上,查板子是否存在漏电 . 测量板上所有电阻两端是否存在压降; . 把板子一些无关器件吹掉;
. 测试PM 输出的几个电压值是否正常
联想移动产品开发部软件处 - 27 -