多媒体功耗

[English]

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功能不一定会使能。