/* * Copyright 2020 Rockchip Electronics Co. LTD * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef __MPP_CFG_H__ #define __MPP_CFG_H__ #include "rk_type.h" #include "mpp_err.h" typedef enum CfgType_e { CFG_FUNC_TYPE_S32, CFG_FUNC_TYPE_U32, CFG_FUNC_TYPE_S64, CFG_FUNC_TYPE_U64, CFG_FUNC_TYPE_St, CFG_FUNC_TYPE_Ptr, CFG_FUNC_TYPE_BUTT, } CfgType; typedef struct MppCfgApi_t { const char *name; CfgType data_type; RK_U32 flag_offset; RK_U32 flag_value; RK_U32 data_offset; RK_S32 data_size; } MppCfgApi; typedef struct MppCfgInfo_t { /* size for the whole node including name */ RK_S32 node_size; RK_U32 name_len; /* CfgType */ RK_S32 data_type; /* update flag info 32bit */ RK_S32 flag_offset; RK_U32 flag_value; /* data access info */ RK_S32 data_offset; RK_S32 data_size; /* linked next node offset for pointer type */ RK_S32 node_next; /* function pointer for get / put accessor (user filled) */ RK_U64 set_func; RK_U64 get_func; /* reserve for extension */ RK_U64 stuff[2]; char name[]; } MppCfgInfoNode; typedef MPP_RET (*CfgSetS32)(MppCfgInfoNode *info, void *cfg, RK_S32 val); typedef MPP_RET (*CfgGetS32)(MppCfgInfoNode *info, void *cfg, RK_S32 *val); typedef MPP_RET (*CfgSetU32)(MppCfgInfoNode *info, void *cfg, RK_U32 val); typedef MPP_RET (*CfgGetU32)(MppCfgInfoNode *info, void *cfg, RK_U32 *val); typedef MPP_RET (*CfgSetS64)(MppCfgInfoNode *info, void *cfg, RK_S64 val); typedef MPP_RET (*CfgGetS64)(MppCfgInfoNode *info, void *cfg, RK_S64 *val); typedef MPP_RET (*CfgSetU64)(MppCfgInfoNode *info, void *cfg, RK_U64 val); typedef MPP_RET (*CfgGetU64)(MppCfgInfoNode *info, void *cfg, RK_U64 *val); typedef MPP_RET (*CfgSetSt) (MppCfgInfoNode *info, void *cfg, void *val); typedef MPP_RET (*CfgGetSt) (MppCfgInfoNode *info, void *cfg, void *val); typedef MPP_RET (*CfgSetPtr)(MppCfgInfoNode *info, void *cfg, void *val); typedef MPP_RET (*CfgGetPtr)(MppCfgInfoNode *info, void *cfg, void **val); #define MPP_CFG_SET_S32(info, cfg, val) (mpp_cfg_ops.fp_SetS32)(info, cfg, val) #define MPP_CFG_GET_S32(info, cfg, val) (mpp_cfg_ops.fp_GetS32)(info, cfg, (RK_S32 *)(val)) #define MPP_CFG_SET_U32(info, cfg, val) (mpp_cfg_ops.fp_SetU32)(info, cfg, val) #define MPP_CFG_GET_U32(info, cfg, val) (mpp_cfg_ops.fp_GetU32)(info, cfg, (RK_U32 *)(val)) #define MPP_CFG_SET_S64(info, cfg, val) (mpp_cfg_ops.fp_SetS64)(info, cfg, val) #define MPP_CFG_GET_S64(info, cfg, val) (mpp_cfg_ops.fp_GetS64)(info, cfg, (RK_S64 *)(val)) #define MPP_CFG_SET_U64(info, cfg, val) (mpp_cfg_ops.fp_SetU64)(info, cfg, val) #define MPP_CFG_GET_U64(info, cfg, val) (mpp_cfg_ops.fp_GetU64)(info, cfg, (RK_U64 *)(val)) #define MPP_CFG_SET_St(info, cfg, val) (mpp_cfg_ops.fp_SetSt )(info, cfg, val) #define MPP_CFG_GET_St(info, cfg, val) (mpp_cfg_ops.fp_GetSt )(info, cfg, (void *)(val)) #define MPP_CFG_SET_Ptr(info, cfg, val) (mpp_cfg_ops.fp_SetPtr)(info, cfg, val) #define MPP_CFG_GET_Ptr(info, cfg, val) (mpp_cfg_ops.fp_GetPtr)(info, cfg, (void **)(val)) /* header size 128 byte */ typedef struct MppCfgInfoHead_t { char version[112]; RK_S32 info_size; RK_S32 info_count; RK_S32 node_count; RK_S32 cfg_size; } MppCfgInfoHead; typedef struct MppCfgOps_t { CfgSetS32 fp_SetS32; CfgGetS32 fp_GetS32; CfgSetU32 fp_SetU32; CfgGetU32 fp_GetU32; CfgSetS64 fp_SetS64; CfgGetS64 fp_GetS64; CfgSetU64 fp_SetU64; CfgGetU64 fp_GetU64; CfgSetSt fp_SetSt; CfgGetSt fp_GetSt; CfgSetPtr fp_SetPtr; CfgGetPtr fp_GetPtr; } MppCfgOps; #ifdef __cplusplus extern "C" { #endif extern const char *cfg_type_names[]; extern MppCfgOps mpp_cfg_ops; MPP_RET mpp_cfg_node_fixup_func(MppCfgInfoNode *node); #define CHECK_CFG_INFO(node, name, type) \ check_cfg_info(node, name, type, __FUNCTION__) MPP_RET check_cfg_info(MppCfgInfoNode *node, const char *name, CfgType type, const char *func); #ifdef __cplusplus } #endif #endif /*__MPP_CFG_H__*/