多媒体功耗
1、多媒体功耗概述
基于BK7258的工程,多媒体功能都是在CPU1上实现的,且各个硬件模块,比如PSRAM、LCD、H264、USB等,都有对应的时钟配置、电源管理等。为了达到更低的功耗,开关需要对称使用。
2、多媒体应用
多媒体SDK提供功能丰富且齐全的接口,供用户使用,且用户不需要考虑相关投票的接口的应用,是需要保证是对称调用即可,接口参考地址:
./components/multimedia/include/media_app.h
,说明如下。开关摄像头的接口,需要注意填写的形参的内容:
bk_err_t media_app_camera_open(media_camera_device_t *device); bk_err_t media_app_camera_close(camera_type_t type);使能/关闭获取图像的接口,获取不同类型的图像需要传递不同类型的形参,允许直接在回调函数(形参cb)中处理获取的图像数据,这个接口只能在摄像头打开后才有效:
bk_err_t media_app_register_read_frame_callback(pixel_format_t fmt, frame_cb_t cb); bk_err_t media_app_unregister_read_frame_callback(void);使能/关闭h264编码功能,这个接口支持将JPEG图像通过解码,将图像转成YUV格式,然后再进行H264编码输出:
bk_err_t media_app_h264_pipeline_open(void); bk_err_t media_app_h264_pipeline_close(void);使能/关闭图像旋转功能,这个接口支持将JPEG解码后的图像,旋转任意角度,然后显示到对应的LCD屏幕上:
bk_err_t media_app_lcd_pipline_rotate_open(media_rotate_t rotate); bk_err_t media_app_lcd_pipline_rotate_close(void);除了上面的基本功能外,还支持一些额外的功能,比如当开启的是UVC摄像头时,支持注册回调函数获取UVC的枚举信息和连接状态,获取之后需要调用参数配置接口,让UVC真正启动, 支持在注册的回调函数中直接设置参数,启动UVC:
bk_err_t media_app_uvc_register_info_notify_cb(uvc_device_info_t cb); bk_err_t media_app_set_uvc_device_param(bk_uvc_config_t *config);支持在进行H264编码时,调整压缩率,以达到更好的图像效果,具体的调试说明请参考H264编码文档,此接口仅在H264编码功能打开后生效:
bk_err_t media_app_set_compression_ratio(compress_ratio_t * ratio);上面的接口都有对应的参考用例,请参考``./components/multimedia/cli/media_cli.c``.
3、多媒体投票
多媒体的功能都在CPU1上实现,调用SDK接口,会默认将CPU1投票上电,然后再去处理相应的流程,投票接口为:
bk_err_t bk_pm_module_vote_boot_cp1_ctrl(pm_boot_cp1_module_name_e module,pm_power_module_state_e power_state);该接口支持不同模块投票,进行上下电,具体参考结构体:
typedef enum { PM_BOOT_CP1_MODULE_NAME_FFT = 0, PM_BOOT_CP1_MODULE_NAME_AUDP_SBC ,// 1 PM_BOOT_CP1_MODULE_NAME_AUDP_AUDIO ,// 2 PM_BOOT_CP1_MODULE_NAME_AUDP_I2S ,// 3 PM_BOOT_CP1_MODULE_NAME_VIDP_JPEG_EN ,// 4 PM_BOOT_CP1_MODULE_NAME_VIDP_JPEG_DE ,// 5 PM_BOOT_CP1_MODULE_NAME_VIDP_DMA2D ,// 6 PM_BOOT_CP1_MODULE_NAME_VIDP_LCD ,// 7 PM_BOOT_CP1_MODULE_NAME_MULTIMEDIA ,// 8 PM_BOOT_CP1_MODULE_NAME_APP ,// 9 PM_BOOT_CP1_MODULE_NAME_VIDP_ROTATE ,// 10 PM_BOOT_CP1_MODULE_NAME_VIDP_SCALE ,// 11 PM_BOOT_CP1_MODULE_NAME_GET_MEDIA_MSG ,// 12 PM_BOOT_CP1_MODULE_NAME_MAX ,// attention: MAX value can not exceed 31. }pm_boot_cp1_module_name_e;不同模块其电源也需要投票进行控制,保证共用该电源域的模块,有一个模块需要使用时,该电源需要打开,当全部模块都不需要工作时,才进行掉电处理,这些操作默认已经封装在各个模块内部了, 客户使用时,不需要关注,但可以注意当进入低功耗模式时,对应模块是否真正已经掉电,投票接口为:
bk_err_t bk_pm_module_vote_power_ctrl(pm_power_module_name_e module,pm_power_module_state_e power_state);上面接口可以通过配置不同的形参,达到不同模块的开关功能,第一个形参的类型参考文件:
./bk_idk/include/modules/pm.h
;如下是多媒体模块定义的票:/*----SUB POWER DOMAIN VIDP--------*/ #define PM_POWER_SUB_MODULE_NAME_VIDP_DMA2D (POWER_SUB_MODULE_NAME_VIDP_DMA2D) #define PM_POWER_SUB_MODULE_NAME_VIDP_YUVBUF (POWER_SUB_MODULE_NAME_VIDP_YUVBUF) #define PM_POWER_SUB_MODULE_NAME_VIDP_JPEG_EN (POWER_SUB_MODULE_NAME_VIDP_JPEG_EN) #define PM_POWER_SUB_MODULE_NAME_VIDP_JPEG_DE (POWER_SUB_MODULE_NAME_VIDP_JPEG_DE) #define PM_POWER_SUB_MODULE_NAME_VIDP_LCD (POWER_SUB_MODULE_NAME_VIDP_LCD) #define PM_POWER_SUB_MODULE_NAME_VIDP_ROTT (POWER_SUB_MODULE_NAME_VIDP_ROTT) #define PM_POWER_SUB_MODULE_NAME_VIDP_SCAL0 (POWER_SUB_MODULE_NAME_VIDP_SCAL0) #define PM_POWER_SUB_MODULE_NAME_VIDP_SCAL1 (POWER_SUB_MODULE_NAME_VIDP_SCAL1) #define PM_POWER_SUB_MODULE_NAME_VIDP_H264 (POWER_SUB_MODULE_NAME_VIDP_H264)针对PASRAM不同模块使用时也会对其投票,保证功能正常,且功耗较低,投票接口为:
bk_err_t bk_pm_module_vote_psram_ctrl(pm_power_psram_module_name_e module,pm_power_module_state_e power_state);上面接口可以通过配置不同的形参,达到不同模块对PASRAM的控制,不同模块的枚举值参考如下:
typedef enum { PM_POWER_PSRAM_MODULE_NAME_FFT = 0, PM_POWER_PSRAM_MODULE_NAME_AUDP_SBC ,// 1 PM_POWER_PSRAM_MODULE_NAME_AUDP_AUDIO ,// 2 PM_POWER_PSRAM_MODULE_NAME_AUDP_I2S ,// 3 PM_POWER_PSRAM_MODULE_NAME_VIDP_JPEG_EN ,// 4 PM_POWER_PSRAM_MODULE_NAME_VIDP_H264_EN ,// 5 PM_POWER_PSRAM_MODULE_NAME_VIDP_JPEG_DE ,// 6 PM_POWER_PSRAM_MODULE_NAME_VIDP_DMA2D ,// 7 PM_POWER_PSRAM_MODULE_NAME_VIDP_LCD ,// 8 PM_POWER_PSRAM_MODULE_NAME_APP ,// 9 PM_POWER_PSRAM_MODULE_NAME_AS_MEM ,// 10 PM_POWER_PSRAM_MODULE_NAME_CPU1 ,// 11 PM_POWER_PSRAM_MODULE_NAME_MEDIA ,// 12 PM_POWER_PSRAM_MODULE_NAME_LVGL_CODE_RUN,// 13 PM_POWER_PSRAM_MODULE_NAME_MAX ,// attention: MAX value can not exceed 31. }pm_power_psram_module_name_e;
4、多媒体低功耗检查
当需要进入低功耗时,需要将外设全部关掉,包括PSRAM,保证各个模块全部掉电,可以发送下面命令进行检查:
pm_debug 8默认情况下,比如上电发送上面命令,输出如下:
1、pm video and audio state:0x0 0x0
2、pm ahpb and bakp state:0x0 0x10001
3、pm low vol[module:0xffbfefff] [need module:0xffffffff]
4、pm deepsleep[module:0xc0][need module:0x3c0]
5、pm power and pmu state[0x200000c8][0x2f1]
6、Attention the bakp not power down[modulue:0x10001]
7、pm_psram_ctrl_state:0x0 0x0
8、pm_cp1_ctrl_state:0x0
9、pm_cp1_boot_ready:0x0 0xffffffff
10、pm_module_lv_sleep_state:0x0
多媒体模块只需要关注第一行(表示多媒体各个模块内部电源控制,对应的票为pm_power_module_name_e,不使用时,应该都为0)、第七行(表示PSRAM电源控制,因为存在多个模块使用PARAM, 不适用时,应该都为0)、第八行(表示不同模块投票让CPU1启动,对应的票为pm_boot_cp1_module_name_e,不适用时,应该都为0)。
备注
上面的接口都不需要用户自己去封装调用,使用多媒体功能时,这些功能已经封装到开关内部逻辑了,只需要保证使用时,开关的调用是对称的。另外上面的命令是一种检查方法,依赖于CLI命令功能, 使用时,CLI功能不一定会使能。