/* * Copyright (c) XMEDIA. All rights reserved. */ #ifndef XMEDIA_SYS_H #define XMEDIA_SYS_H #include "xmedia_type.h" #include "common.h" #include "xmedia_video_common.h" #ifdef __cplusplus extern "C" { #endif #define BIND_DEST_MAXNUM 64 #define UNIQUE_ID_NUM 6 #define SWITCH_MAX_GRP_NUM 2 #define SWITCH_MAX_PIPE_NUM 2 #define VSYNC_MAX_NUM 4 typedef enum { XMEDIA_WORK_MODE_OFFLINE = 0, XMEDIA_WORK_MODE_ONLINE, XMEDIA_WORK_MODE_MAX, } xmedia_work_mode; typedef struct { xmedia_work_mode vicap_viproc_mode; xmedia_work_mode viproc_vpss_mode; xmedia_work_mode gdc_vpss_mode; } xmedia_pipe_work_mode; typedef struct { xmedia_pipe_work_mode pipe_mode[VI_MAX_PIPE_NUM]; } xmedia_sys_config; typedef enum { XMEDIA_SYS_MULTI_PIPE_MODE_NORMAL = 0, XMEDIA_SYS_MULTI_PIPE_MODE_DUAL_SWITCH, XMEDIA_SYS_MULTI_PIPE_MODE_MAX } xmedia_sys_multi_pipe_mode; typedef enum { XMEDIA_SYS_SWITCH_SYNC_MODE_SOC_MASTER_SLAVE = 0, XMEDIA_SYS_SWITCH_SYNC_MODE_SOC_SLAVE, XMEDIA_SYS_SWITCH_SYNC_MODE_SENSOR_MASTER_SLAVE, XMEDIA_SYS_SWITCH_SYNC_MODE_MAX } xmedia_sys_switch_sync_mode; typedef struct { xmedia_sys_multi_pipe_mode multi_pipe_mode; xmedia_u32 pipe_num; xmedia_s32 master_pipe_id; xmedia_s32 pipe_id[SWITCH_MAX_PIPE_NUM]; xmedia_bool pipe_sel[SWITCH_MAX_PIPE_NUM]; xmedia_sys_switch_sync_mode sync_mode; xmedia_bool ext_switch_en; } xmedia_sys_switch_config; typedef struct { xmedia_mod_id mod_id; xmedia_s32 dev_id; xmedia_s32 chn_id; } xmedia_chn_info; typedef struct { xmedia_u32 num; xmedia_chn_info mpp_chn[BIND_DEST_MAXNUM]; } xmedia_sys_bind_dest; typedef struct { xmedia_u32 id[UNIQUE_ID_NUM]; } xmedia_unique_id; typedef enum { XMEDIA_SCALE_RANGE_0 = 0, /* scale range < 8/64 */ XMEDIA_SCALE_RANGE_1, /* scale range >= 8/64 */ XMEDIA_SCALE_RANGE_2, /* scale range >= 9/64 */ XMEDIA_SCALE_RANGE_3, /* scale range >= 12/64 */ XMEDIA_SCALE_RANGE_4, /* scale range >= 17/64 */ XMEDIA_SCALE_RANGE_5, /* scale range >= 21/64 */ XMEDIA_SCALE_RANGE_6, /* scale range >= 26/64 */ XMEDIA_SCALE_RANGE_7, /* scale range >= 31/64 */ XMEDIA_SCALE_RANGE_8, /* scale range >= 34/64 */ XMEDIA_SCALE_RANGE_9, /* scale range >= 36/64 */ XMEDIA_SCALE_RANGE_10, /* scale range >= 40/64 */ XMEDIA_SCALE_RANGE_11, /* scale range >= 43/64 */ XMEDIA_SCALE_RANGE_12, /* scale range >= 46/64 */ XMEDIA_SCALE_RANGE_13, /* scale range >= 49/64 */ XMEDIA_SCALE_RANGE_14, /* scale range >= 52/64 */ XMEDIA_SCALE_RANGE_15, /* scale range >= 54/64 */ XMEDIA_SCALE_RANGE_16, /* scale range >= 56/64 */ XMEDIA_SCALE_RANGE_17, /* scale range >= 58/64 */ XMEDIA_SCALE_RANGE_18, /* scale range > 1 */ XMEDIA_SCALE_RANGE_MAX, } xmedia_scale_range; typedef struct { xmedia_scale_range horizontal; xmedia_scale_range vertical; } xmedia_sys_scale_range; typedef enum { XMEDIA_COEFF_LEVEL_0 = 0, /* coefficient level 0 */ XMEDIA_COEFF_LEVEL_1, /* coefficient level 1 */ XMEDIA_COEFF_LEVEL_2, /* coefficient level 2 */ XMEDIA_COEFF_LEVEL_3, /* coefficient level 3 */ XMEDIA_COEFF_LEVEL_4, /* coefficient level 4 */ XMEDIA_COEFF_LEVEL_5, /* coefficient level 5 */ XMEDIA_COEFF_LEVEL_6, /* coefficient level 6 */ XMEDIA_COEFF_LEVEL_7, /* coefficient level 7 */ XMEDIA_COEFF_LEVEL_8, /* coefficient level 8 */ XMEDIA_COEFF_LEVEL_9, /* coefficient level 9 */ XMEDIA_COEFF_LEVEL_10, /* coefficient level 10 */ XMEDIA_COEFF_LEVEL_11, /* coefficient level 11 */ XMEDIA_COEFF_LEVEL_12, /* coefficient level 12 */ XMEDIA_COEFF_LEVEL_13, /* coefficient level 13 */ XMEDIA_COEFF_LEVEL_14, /* coefficient level 14 */ XMEDIA_COEFF_LEVEL_15, /* coefficient level 15 */ XMEDIA_COEFF_LEVEL_16, /* coefficient level 16 */ XMEDIA_COEFF_LEVEL_17, /* coefficient level 17 */ XMEDIA_COEFF_LEVEL_18, /* coefficient level 18 */ XMEDIA_COEFF_LEVEL_MAX, } xmedia_coeff_level; typedef struct { xmedia_coeff_level horizontal_lum; /* horizontal luminance coefficient level */ xmedia_coeff_level horizontal_chr; /* horizontal chrominance coefficient level */ xmedia_coeff_level vertical_lum; /* vertical luminance coefficient level */ xmedia_coeff_level vertical_chr; /* vertical chrominance coefficient level */ } xmedia_scale_coef_level; typedef struct { xmedia_char gps_latitude_ref; /* GPS LatitudeRef Indicates whether the latitude is north or south latitude, * 'N'/'S', default 'N' */ xmedia_u32 gps_latitude[3][2]; /* GPS Latitude is expressed as degrees, minutes and seconds, a typical format * like "dd/1, mm/1, ss/1", default 0/0, 0/0, 0/0 */ xmedia_char gps_longitude_ref; /* GPS LongitudeRef Indicates whether the longitude is east or west longitude, * 'E'/'W', default 'E' */ xmedia_u32 gps_longitude[3][2]; /* GPS Longitude is expressed as degrees, minutes and seconds, a typical format * like "dd/1, mm/1, ss/1", default 0/0, 0/0, 0/0 */ xmedia_u8 gps_altitude_ref; /* GPS AltitudeRef Indicates the reference altitude used, 0 - above sea level, * 1 - below sea level default 0 */ xmedia_u32 gps_altitude[2]; /* GPS AltitudeRef Indicates the altitude based on the reference gps_altitude_ref, * the reference unit is meters, default 0/0 */ } xmedia_gps_info; typedef struct { xmedia_bool all_online; xmedia_u32 frame_rate; /* Input frame rate of VIPROC(linear/Frame mode WDR is the sensor frame rate, * and the line mode WDR is the frame rate after synthesis) */ xmedia_u32 full_lines_std; /* Total height of sensor, include of VBlank */ xmedia_video_size large_stream_size; /* VENC Large Stream Size */ xmedia_video_size small_stream_size; /* VENC Small Stream Size */ xmedia_payload_type type; /* VENC encode type */ } xmedia_vpss_venc_wrap_param; typedef enum { XMEDIA_SYS_COMPRESS_LEVEL_0 = 0, //较低压缩率 XMEDIA_SYS_COMPRESS_LEVEL_1, //折中压缩率 XMEDIA_SYS_COMPRESS_LEVEL_2, //较高压缩率 XMEDIA_SYS_COMPRESS_LEVEL_MAX } xmedia_sys_compress_level; /* * 函数功能:SYS模块初始化 * 函数参数: * sys_config - 输入参数,配置pipe工作模式 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_NULL_PTR - 空指针 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 * XMEDIA_ERRCODE_INVALID_PARAM - 参数非法 */ xmedia_s32 xmedia_sys_init(const xmedia_sys_config *sys_config); /* * 函数功能:SYS模块去初始化 * 函数参数: * 无 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 * XMEDIA_ERRCODE_CLOSE_FAILED - 关闭节点失败 */ xmedia_s32 xmedia_sys_exit(xmedia_void); /* * 函数功能:设置sensor帧同步管脚 * 函数参数: * pipe - 输入参数,指定pipe号,范围[0, 3] * vsync - 输入参数,同步信号,范围[0, 3] * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 * XMEDIA_ERRCODE_INVALID_PARAM - 参数非法 * 注:针对sensor需要soc给同步信号,但用户硬件设计同步管脚走线不同的场景 * 以11a举例: * vsync0-----pin113或pin115 * vsync1-----pin114或pin118 * vsync2-----pin108或pin116 * vsync3-----pin109或pin118 * 对应pipe的sensor帧同步信号连接哪个pin脚,配合管脚复用,配对应vsyncx */ xmedia_s32 xmedia_sys_set_vsync(xmedia_s32 pipe, xmedia_u32 vsync); /* * 函数功能:获取sensor帧同步管脚 * 函数参数: * pipe - 输入参数,指定pipe号,范围[0, 3] * vsync - 输出参数,同步信号,范围[0, 3] * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 * XMEDIA_ERRCODE_INVALID_PARAM - 参数非法 * XMEDIA_ERRCODE_NULL_PTR - 空指针 */ xmedia_s32 xmedia_sys_get_vsync(xmedia_s32 pipe, xmedia_u32 *vsync); /* * 函数功能:设置switch配置信息 * 函数参数: * grp_id - 输入参数,switch组号 * xmedia_sys_switch_config - 输入参数,switch配置信息 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_NULL_PTR - 空指针 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 * XMEDIA_ERRCODE_INVALID_PARAM - 参数非法 */ xmedia_s32 xmedia_sys_set_switch_config(xmedia_s32 grp_id, const xmedia_sys_switch_config *switch_config); /* * 函数功能:获取switch配置信息 * 函数参数: * grp_id - 输入参数,switch组号 * xmedia_sys_switch_config - 输出参数,获取到的switch配置信息 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_NULL_PTR - 空指针 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 */ xmedia_s32 xmedia_sys_get_switch_config(xmedia_s32 grp_id, xmedia_sys_switch_config *switch_config); /* * 函数功能:数据源到数据接收者绑定 * 函数参数: * src_chn - 输入参数,数据源的描述信息 * dest_chn - 输入参数,数据接收者的描述信息 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_NULL_PTR - 空指针 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 * XMEDIA_ERRCODE_INVALID_PARAM - 参数非法 * XMEDIA_ERRCODE_NOT_ENOUGH_MEMORY - 申请绑定相关内存失败 */ xmedia_s32 xmedia_sys_bind(const xmedia_chn_info *src_chn, const xmedia_chn_info *dest_chn); /* * 函数功能:数据源到数据接收者解除绑定 * 函数参数: * src_chn - 输入参数,数据源的描述信息 * dest_chn - 输入参数,数据接收者的描述信息 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_NULL_PTR - 空指针 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 * XMEDIA_ERRCODE_INVALID_PARAM - 参数非法 */ xmedia_s32 xmedia_sys_unbind(const xmedia_chn_info *src_chn, const xmedia_chn_info *dest_chn); /* * 函数功能:获取目标通道上绑定的源通道的信息 * 函数参数: * dest_chn - 输入参数,数据接收者的描述信息 * src_chn - 输出参数,获取的对应数据源的描述信息 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_NULL_PTR - 空指针 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 * XMEDIA_ERRCODE_INVALID_PARAM - 参数非法 */ xmedia_s32 xmedia_sys_get_bind_by_dest(const xmedia_chn_info *dest_chn, xmedia_chn_info *src_chn); /* * 函数功能:根据源获取绑定的目标 * 函数参数: * src_chn - 输入参数,数据源的描述信息 * bind_dest - 输出参数,获取的源对应所有接收者的描述信息 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_NULL_PTR - 空指针 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 * XMEDIA_ERRCODE_INVALID_PARAM - 参数非法 */ xmedia_s32 xmedia_sys_get_bind_by_src(const xmedia_chn_info *src_chn, xmedia_sys_bind_dest *bind_dest); /* * 函数功能:获取当前芯片的 ID * 函数参数: * chip_id - 输出参数,当前芯片的ID,来源OTP * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_NULL_PTR - 空指针 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 */ xmedia_s32 xmedia_sys_get_chip_id(xmedia_u32 *chip_id); /* * 函数功能:获取芯片唯一识别码 * 函数参数: * unique_id - 输出参数,芯片唯一识别码 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_NULL_PTR - 空指针 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 */ xmedia_s32 xmedia_sys_get_unique_id(xmedia_unique_id *unique_id); /* * 函数功能:获取当前芯片的客户识别码 * 函数参数: * custom_code - 输出参数,当前芯片的客户识别码 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_NULL_PTR - 空指针 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 */ xmedia_s32 xmedia_sys_get_custom_code(xmedia_u32 *custom_code); /* * 函数功能:获取系统的当前时间戳 * 函数参数: * cur_pts - 输出参数,系统的当前时间戳 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_NULL_PTR - 空指针 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 */ xmedia_s32 xmedia_sys_get_cur_pts(xmedia_u64 *cur_pts); /* * 函数功能:初始化系统的时间戳基准 * 函数参数: * pts_base - 输入参数,设置的时间戳基准 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 */ xmedia_s32 xmedia_sys_init_pts_base(xmedia_u64 pts_base); /* * 函数功能:同步系统的时间戳 * 函数参数: * pts_base - 输入参数,设置的时间戳基准 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 */ xmedia_s32 xmedia_sys_sync_pts(xmedia_u64 pts_base); /* * 函数功能:配置内存参数,设置模块设备通道使用的 MMZ 区域名称 * 函数参数: * chn_info - 输入参数,设备通道描述信息 * mmz_name - 输入参数,MMZ区域名称 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_NULL_PTR - 空指针 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 * XMEDIA_ERRCODE_INVALID_PARAM - 参数非法 */ xmedia_s32 xmedia_sys_set_mem_config(const xmedia_chn_info *chn_info, const xmedia_char *mmz_name); /* * 函数功能:获取模块设备通道使用的 MMZ 区域名称 * 函数参数: * chn_info - 输入参数,设备通道描述信息 * mmz_name - 输出参数,返回的对应MMZ区域名称 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_NULL_PTR - 空指针 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 * XMEDIA_ERRCODE_INVALID_PARAM - 参数非法 */ xmedia_s32 xmedia_sys_get_mem_config(const xmedia_chn_info *chn_info, xmedia_char *mmz_name); /* * 函数功能:设置 VPSS 模块和 VGS 模块的缩放系数等级 * 函数参数: * scale_range - 输入参数,缩放区域信息 * scale_coef_level - 输入参数,缩放等级信息 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_NULL_PTR - 空指针 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 * XMEDIA_ERRCODE_INVALID_PARAM - 参数非法 */ xmedia_s32 xmedia_sys_set_scale_coef_level(const xmedia_sys_scale_range *scale_range, const xmedia_scale_coef_level *scale_coef_level); /* * 函数功能:获取 VPSS 和 VGS 缩放系数等级 * 函数参数: * scale_range - 输入参数,缩放区域信息 * scale_coef_level - 输出参数,缩放等级信息 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_NULL_PTR - 空指针 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 * XMEDIA_ERRCODE_INVALID_PARAM - 参数非法 */ xmedia_s32 xmedia_sys_get_scale_coef_level(const xmedia_sys_scale_range *scale_range, xmedia_scale_coef_level *scale_coef_level); /* * 函数功能:设置时区信息 * 函数参数: * timezone - 输入参数,时区信息 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 * XMEDIA_ERRCODE_INVALID_PARAM - 参数非法 */ xmedia_s32 xmedia_sys_set_timezone(xmedia_s32 timezone); /* * 函数功能:获取时区信息 * 函数参数: * timezone - 输出参数,时区信息 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_NULL_PTR - 空指针 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 */ xmedia_s32 xmedia_sys_get_timezone(xmedia_s32 *timezone); /* * 函数功能:设置 GPS 信息 * 函数参数: * gps_info - 输入参数,GPS信息 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_NULL_PTR - 空指针 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 * XMEDIA_ERRCODE_INVALID_PARAM - 参数非法 */ xmedia_s32 xmedia_sys_set_gps_info(const xmedia_gps_info *gps_info); /* * 函数功能:获取 GPS 信息 * 函数参数: * gps_info - 输出参数,GPS信息 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_NULL_PTR - 空指针 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 */ xmedia_s32 xmedia_sys_get_gps_info(xmedia_gps_info *gps_info); /* * 函数功能:设置 Tuning 工具连接 * 函数参数: * connect - 输入参数,Tuning 工具连接控制状态 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 */ xmedia_s32 xmedia_sys_set_tuning_connect(xmedia_s32 connect); /* * 函数功能:获取 Tuning 工具连接状态 * 函数参数: * connect - 输出参数,Tuning 工具连接控制状态 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 */ xmedia_s32 xmedia_sys_get_tuning_connect(xmedia_s32 *connect); /* * 函数功能:获取VPSS-VENC卷绕模式下的buffer像素行数 * 函数参数: * wrap_param - 输入参数,计算卷绕buffer像素行数的参数 * buf_line - 输出参数,卷绕buffer的像素行数 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 * XMEDIA_ERRCODE_INVALID_PARAM - 参数非法 * XMEDIA_ERRCODE_NOT_SUPPORT - 不支持 */ xmedia_s32 xmedia_sys_get_vpss_venc_wrap_buf_line(const xmedia_vpss_venc_wrap_param *wrap_param, xmedia_u32 *buf_line); /* * 函数功能:设置系统压缩率等级 * 函数参数: * compress_level - 输入参数,系统压缩率等级 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 * XMEDIA_ERRCODE_INVALID_PARAM - 参数非法 * XMEDIA_ERRCODE_NOT_PERMITTED - 函数调用时机错误,必须在确定vb block大小前调用 * 注意: * 1、必须在确定vb block大小前调用,不调用则使用默认等级 * 2、默认系统压缩率等级为XMEDIA_SYS_COMPRESS_LEVEL_0 */ xmedia_s32 xmedia_sys_set_compress_level(xmedia_sys_compress_level compress_level); /* * 函数功能:获取系统压缩率等级 * 函数参数: * compress_level - 输出参数,系统压缩率等级 * 返回值: * XMEDIA_SUCCESS - 函数执行成功 * XMEDIA_ERRCODE_OPEN_FAILED - 打开设备节点失败 * XMEDIA_ERRCODE_NULL_PTR - 空指针 */ xmedia_s32 xmedia_sys_get_compress_level(xmedia_sys_compress_level *compress_level); #ifdef __cplusplus } #endif #endif