功耗优化的高通文档:
功耗优化的2个层面:
平台:高通8909
2.1 硬件层面的功耗优化
1.CPU(平台)
平台级别的优化,除了硬件上架构不同,软件上框架也是不一样的。
比如8909平台通信的时候,会有一个守护进程进行通信,
高端一点的平台就移除了这一点,功耗就降低了。
目前我们使用新平台,同样的sensor,功耗优化有30mA以上!
2.Camera 供电
DVDD供电这一块,选用高效率的供电,对功耗优化有很大裨益!
LDO电源:效率低,功耗高
来看一组测试数据:
也就是说sensor的分辨率越大,优化得越多。
3.sensor选型
不同的sensor,功耗不一样。目前以我的经验来看,ov的sensor比三星的总体偏优!
因此,摄像头的选型也很重要,如果你特别关心功耗这一块的话!
2.2 软件层面的功耗优化
1.采用最低的sensor output resolution
APP请求的尺寸是320x360,Sensor输出尽量选择最小的尺寸:640x480,而不是全尺寸800w的!
源码:
vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/sensors/sensor.c
这个函数就是用了匹配app请求的宽高和底层输出的!
代码主要逻辑就是:
app:宽/高=绝对值,假设这个值为A
遍历底层所有的尺寸:
底层:宽/高=绝对值,假设这个值为B1,B2,B3,B4
A和所有的B1,B2,B3,B4相比较,谁最小,谁就最匹配!
但是工作中,我发现这个代码逻辑好像有点问题,就是无法完美匹配最接近的尺寸!
那么可以强制选择你觉得合适的尺寸:
这里*pick_res = 1代表的就是驱动代码里配置的res1,如下:640x480这一组参数!
2.采用合适的帧率(fps)
帧率越低,对应的功耗也就越低!
因此,选择合适的fps很重要!
源码:
以ov5675为例
vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/sensor_libs/ov5675/
ov5675_lib.c
帧率的计算公式
fps = vt_pixel_clk /(frame_length_lines * line_length_pclk )
这里带入公式:
fps=45000000 ÷(2000x750)=30fps
因此max_fps配置成30fps
min_fps 的修改和效果文件有关。
参数含义
一般来说,我们只需要改frame_length_lines 这个值就可了,其他值保持不变!
帧率的修改
假设我们想改成20fps,怎么修改呢!
1.改寄存器
2.改配置
frame_length_lines = 45000000 ÷ 750 ÷ 20fps = 3000
修改如下:
3.VFE时钟的修改
op_pixel_clk就是vfe时钟,实际上就是需要通过 MIPI 通道从摄像头获取的数据量!
概念如下:
VFE时钟越小,功耗越低!如图
图中的MIPI速率和我们这里说的VFE是对应起来的!
能随便改小,一定要改一个合适的值!
以上图的数据为例子:
sensor:s5k4h7
分辨率:1280x720
帧率:15
数据类型:bayer(一个像素10bit)
MIPI通道:4 lane
总数据量 = 1280x720x15x10 x 4 lane = 138,240,000 x4
op_pixel_clk = 138,240,000x4 /10=138.24 x4 MHZ(4 lane的数据)
这里最小要配置成138.24 x4 MHZ
不过一般来说我们要配置大一下,否正有可能会数据溢出!导致预览黑屏!
而且还要考虑到op_pixel_clk对天线的干扰!
考虑到天线干扰和数据溢出问题,这里我们配置这224MHZ!
计算公式:
MIPI_output_clk=ExtClk(MCLK=24MHz)/0x030D*0x030F/(2^0x3C17)
0x030D = 0x06(默认值 不要动)
0x030F = 0x70(可以修改这个值)十进制:112
0x3C17 = 0x00 (默认值 不要动)
带入公式得:
MIPI_output_clk=24/6*112/1=448Mbps
op_pixel_clk = 448 Mbps x 4 lane / 10bit = 179200000
改完之后把MIPI_output_clk化成16进制填入0x0820、0x0821寄存器
448Mbps = 0x01C0
源码:
vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/sensor_libs/s5k4h7/
s5k4h7_lib.c
4. 关闭过多的log
打开摄像头时,有很多数据流的log。可以关闭这样的log,达到节省功耗的目的!
但是在我看来,好像优化不大!
5.关闭ZSL模式
如果你开启了ZSL模式,预览的时候,会有ZSL通道,预览流会以全尺寸在跑!
造成导致功耗增大10mA左右!
6.APP端的优化
App端的优化,我也不太熟悉,大概说一下思路吧!
如果是你自己写的APP,你可以拿骁龙相机做对比功耗!
如果你的APP功耗比骁龙相机大了,就要找出原因,看是否可以优化!
到此,功耗优化的干货就这些了!