154 lines
8.4 KiB
ReStructuredText
Raw Permalink Normal View History

2025-10-10 16:07:00 +08:00
多媒体功耗
=======================
:link_to_translation:`en:[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
.. note::
上面的接口都不需要用户自己去封装调用使用多媒体功能时这些功能已经封装到开关内部逻辑了只需要保证使用时开关的调用是对称的。另外上面的命令是一种检查方法依赖于CLI命令功能
使用时CLI功能不一定会使能。