K230系统控制API参考
1. 概述
1.1 概述
系统控制根据 k230芯片特性,完成硬件各个部件的复位、基本初始化工作,同时负责完成 MPP(Media Process Platform 媒体处理平台)系统内存管理,日志管理,绑定管理等模块的初始化、去初始化。
1.2 功能描述
1.2.1 视频缓存池
视频缓存池是一组缓冲区(而不是一个),主要提供给多媒体硬件设备使用,并在多媒体硬件设备之间流转。缓存池分为公共缓存池和私有缓存池,公共缓存池主要是针对VI的,使用前要根据VI的图像参数确定缓存块的大小,然后向 申请一定数量的缓存块组成一个缓存池。总体来说,对于VI输入的原始画面,一帧的大小对应一个缓存块的大小,多个缓存块相当于给VI提供了多帧缓存的机制。同时这些公共缓存块也可以给VO或VENC使用。私有的缓存池往往代表存储在内存中的数据是与多媒体设备本身紧密相关的,例如编码的码流数据与实际的图像像素组成的视频流差别还是很大的,这些码流只有编解码器可用,而VB为这些设备提供专用的缓冲池。下图展示了虚拟VI和虚拟VO使用VB进行缓存块流转的流程。
1.2.2 系统绑定
系统绑定,即通过数据接收者绑定数据源来建立两者之间的关联关系(只允许数据接收者绑定数据源)。绑定后,数据源生成的数据将自动发送给接收者。K230大的语音和视频处理主要分为几个大的模块如下:
语音:语 音输入(Audio Input,简称AI), 语音编码(Audio Encoder,简称AENC),语音识别(Audio recognize,简称AREC),语音解码(Audio Decoder,简称ADEC),语音输出(Audio Output,简称AO)
图像:视频输入(Video Input,简称VI),视频编码(Video Encoder,简称VENC),图像旋转(由GSDMA完成,简称DMA),深度处理单元(Depth Process Unit, 简称DPU),图像解码(Video Decoder,简称VDEC),视频输出(Video Output,简称VO),虚拟视频输入(Virtual Video Input,简称VVI),虚拟视频输出(Virtual Video Output,简称VVO)
K230支持的绑定关系如下
表 11
数据源 | 数据接收者 | 说明 |
---|---|---|
VI(视频输入) | GSDMA | VI的数据可以送到GSDMA进行旋转处理 |
VO | VI的数据可以直接送到VO进行显示 | |
DPU | VI的数据可以直接送到DPU进行处理 | |
VENC | VI的数据可以直接送到VENC进行处理 | |
GSDMA(图像旋转) | VO | GSDMA 处理后的数据,可以直接送给VO显示 |
DPU | GSDMA处理后的数据,可以直接送给DPU进行处理 | |
VENC | VPROC处理后的数据,可以直接送给VENC进行编码 | |
VDEC(视频解码) | GSDMA | VDEC的数据最终会本地播放,播放前可能需要做旋转 |
VO | VDEC的数据最终会本地播放 | |
DPU(深度处理单元) | 无 | DPU是视频数据的终点,不支持绑定关系 |
VENC(视频编码) | 无 | 不支持绑定关系 |
VO(视频显示) | 无 | VO是视频数据的终点,不支持绑定关系 |
AI(音频输入) | AREC | AI处 理后的数据,可以直接送给语音识别模块进行识别 |
AENC | AI处理后的数据,可以直接送给语音编码模块进行编码 | |
AO | AI处理后的数据,可以直接进行播放 | |
ADEC(语音解码) | AO | ADEC处理后的数据,可以直接进行播放 |
AREC(语音识别) | AO | AREC处理后的数据,可以直接进行播放,例如本地离线语音翻译 |
AENC(语音编码) | 无 | 不支持绑定关系 |
AO(音频输出) | 无 | AO是音频数据的终点,不支持绑定关系 |
2. API 参考
2.1 多媒体内存管理
该功能模块提供以下API:
- kd_mpi_sys_mmz_alloc
- kd_mpi_sys_mmz_alloc_cached
- kd_mpi_sys_mmap
- kd_mpi_sys_mmap_cached
- kd_mpi_sys_munmap
- kd_mpi_sys_mmz_flush_cache
- kd_mpi_sys_mmz_free
- kd_mpi_sys_get_virmem_info
- kd_mpi_vb_set_config
- kd_mpi_vb_get_config
- kd_mpi_vb_init
- kd_mpi_vb_exit
- kd_mpi_vb_create_pool
- kd_mpi_vb_destory_pool
- kd_mpi_vb_get_block
- kd_mpi_vb_release_block
- kd_mpi_vb_phyaddr_to_handle
- kd_mpi_vb_handle_to_phyaddr
- kd_mpi_vb_handle_to_pool_id
- kd_mpi_vb_inquire_user_cnt
- kd_mpi_vb_get_supplement_attr
- kd_mpi_vb_set_supplement_config
- kd_mpi_vb_get_supplement_config
- kd_mpi_vb_set_mod_pool_config
- kd_mpi_vb_get_mod_pool_config
- kd_mpi_vb_init_mod_common_pool
- kd_mpi_vb_exit_mod_common_pool
2.1.1 kd_mpi_sys_mmz_alloc
【描述】
在用户空间申请MMZ内存
【语法】
k_s32 kd_mpi_sys_mmz_alloc(k_u64* phy_addr, void** virt_addr, const k_char* mmb, const k_char* zone, k_u32 len);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
phy_addr | 物理地址指针。 | 输出 |
virt_addr | 指向虚拟地址指针的指针。 | 输出 |
mmb | Mmb 名称的字符串指针。 | 输入 |
zone | MMZ zone 名称的字符串指针。 | 输入 |
len | 内存块大小。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【芯片差异】
无。
【需求】
- 头文件:mpi_sys_api.h
- 库文件:libsys.a
【注意】
MMZ由多个zone组成,每个zone有多个MMB。你可以调用这个MPI,在MMZ的*zone分配一个大小为len的内存块*mmb。在这种情况下,指向物理地址和用户模式虚拟地址的指针被返回。如果在MMZ中存在匿名区,将*zone设置为null。如果*mmb被设置为null,创建的MMB就被命名为null。【举例】
无
【相关主题】
无
2.1.2 kd_mpi_sys_mmz_alloc_cached
【描述】
在用户空间申请带cache的MMZ内存
【语法】
k_s32 kd_mpi_sys_mmz_alloc_cached(k_u64* phy_addr, void** virt_addr, const k_char* mmb, const k_char* zone, k_u32 len);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
phy_addr | 物理地址指针。 | 输出 |
virt_addr | 指向虚拟地址指针的指针。 | 输出 |
mmb | Mmb 名称的字符串指 针。 | 输入 |
zone | MMZ zone 名称的字符串指针。 | 输入 |
len | 内存块大小。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【芯片差异】
无
【需求】
- 头文件:mpi_sys_api.h
- 库文件:libsys.a
【注意】
- kd_mpi_sys_mmz_alloc_cached与kd_mpi_sys_mmz_alloc之间的区别:通过调用kd_mpi_sys_mmz_alloc_cached分配的内存支持缓存,如果要分配的内存将被频繁使用,推荐使用kd_mpi_sys_mmz_alloc_cached。这样可以提高CPU的读/写效率和系统性能。
- 当 cpu 访问此接口分配的内存时,会将内存中的数据放在 cache 中。硬件设备只能访问物理内存而不是缓存。在这种情况下kd_mpi_sys_mmz_flush_cache需要被调用来同步数据。
【举例】
无
【相关主题】
无
2.1.3 kd_mpi_sys_mmap
【描述】
memory 存储映射接口。
【语法】
void *kd_mpi_sys_mmap(k_u64 phy_addr, k_u32 size);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
phy_addr |