/* * Copyright (c) 2019 Rockchip Corporation * * 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. * */ #include "config.h" #include "rk_aiq.h" #include "rk_aiq_algo_des.h" #include "../protocol/rk_aiq_user_api_sysctl_ptl.h" #include "call_fun_ipc.h" RKAIQ_BEGIN_DECLARE typedef struct rk_aiq_sys_ctx_s rk_aiq_sys_ctx_t; /*! * \brief initialze aiq control system context * Should call before any other APIs * * \param[in] sns_ent_name active sensor media entity name. This represents the unique camera module\n * in system. And the whole active pipeline could be retrieved by this. * \param[in] iq_file_dir define the search directory of the iq files. * \param[in] err_cb not mandatory. it's used to return system errors to user. * \param[in] metas_cb not mandatory. it's used to return the metas(sensor exposure settings,\n * isp settings, etc.) for each frame * \return return system context if success, or NULL if failure. */ rk_aiq_sys_ctx_t* rk_aiq_uapi_sysctl_init(const char* sns_ent_name, const char* iq_file_dir, rk_aiq_error_cb err_cb, rk_aiq_metas_cb metas_cb) { rk_aiq_uapi_sysctl_init_t para; memset(¶, 0, sizeof(rk_aiq_uapi_sysctl_init_t)); if (sns_ent_name!=NULL && strlen(sns_ent_name) > sizeof(para.sns_ent_name)) { printf("%s err sns_ent_name too long\n", __func__); return NULL; } if (iq_file_dir!=NULL && strlen(iq_file_dir) > sizeof(para.iq_file_dir)) { printf("%s err iq_file_dir too long\n", __func__); return NULL; } printf("=======sns_ent_name=%s\n",sns_ent_name); if (sns_ent_name != NULL) { strcpy(para.sns_ent_name, sns_ent_name); } if (iq_file_dir != NULL) { strcpy(para.iq_file_dir, iq_file_dir); } printf("call call_fun_ipc_call enter, sns_ent_name=%s\n",para.sns_ent_name); call_fun_ipc_call((char *)__func__, ¶, sizeof(rk_aiq_uapi_sysctl_init_t), 1); printf("call call_fun_ipc_call,return_ctx=%d\n",para.return_ctx); return para.return_ctx; } /*! * \brief deinitialze aiq context * Should not be called in started state * * \param[in] ctx the context returned by \ref rk_aiq_uapi_sysctl_init */ void rk_aiq_uapi_sysctl_deinit(rk_aiq_sys_ctx_t* ctx) { rk_aiq_uapi_sysctl_deinit_t para; para.ctx = ctx; call_fun_ipc_call((char *)__func__, ¶, sizeof(rk_aiq_uapi_sysctl_deinit_t), 0); } /*! * \brief prepare aiq control system before runninig * prepare AIQ running enviroment, should be called before \ref rk_aiq_uapi_sysctl_start.\n * And if re-prepared is required after \ref rk_aiq_uapi_sysctl_start is called,\n * should call \ref rk_aiq_uapi_sysctl_stop firstly. * * \param[in] ctx the context returned by \ref rk_aiq_uapi_sysctl_init * \param[in] width sensor active output width, just used to check internally * \param[in] height sensor active output height, just used to check internally * \param[in] mode pipleline working mode * \return return 0 if success */ XCamReturn rk_aiq_uapi_sysctl_prepare(const rk_aiq_sys_ctx_t* ctx, uint32_t width, uint32_t height, rk_aiq_working_mode_t mode) { rk_aiq_uapi_sysctl_prepare_t para; para.ctx = ctx; para.width = width; para.height = height; memcpy(¶.mode,&mode, sizeof(rk_aiq_working_mode_t)); call_fun_ipc_call((char *)__func__, ¶, sizeof(rk_aiq_uapi_sysctl_prepare_t), 1); return para.xcamreturn; } /*! * \brief start aiq control system * should be called after \ref rk_aiq_uapi_sysctl_prepare. After this call, * the aiq system repeats getting 3A statistics from ISP driver, running * aiq algorimths(AE, AWB, AF, etc.), setting new parameters to drivers. * * \param[in] ctx the context returned by \ref rk_aiq_uapi_sysctl_init * \return return 0 if success */ XCamReturn rk_aiq_uapi_sysctl_start(const rk_aiq_sys_ctx_t* ctx) { rk_aiq_uapi_sysctl_start_t para; para.ctx = ctx; call_fun_ipc_call((char *)__func__, ¶, sizeof(rk_aiq_uapi_sysctl_start_t), 1); return para.xcamreturn; } /*! * \brief stop aiq control system * * \param[in] ctx the context returned by \ref rk_aiq_uapi_sysctl_init * \return return 0 if success */ XCamReturn rk_aiq_uapi_sysctl_stop(const rk_aiq_sys_ctx_t* ctx) { rk_aiq_uapi_sysctl_stop_t para; para.ctx = ctx; call_fun_ipc_call((char *)__func__, ¶, sizeof(rk_aiq_uapi_sysctl_stop_t), 1); return para.xcamreturn; } rk_aiq_static_info_t* rk_aiq_uapi_sysctl_getStaticMetas(const char* sns_ent_name) { rk_aiq_uapi_sysctl_getStaticMetas_t para; rk_aiq_static_info_t *static_info = (rk_aiq_static_info_t*)malloc(sizeof(rk_aiq_static_info_t)); if (strlen(sns_ent_name) > sizeof(para.sns_ent_name)) printf("%s err sns_ent_name too long\n", __func__); strcpy(para.sns_ent_name, sns_ent_name); call_fun_ipc_call((char *)__func__, ¶, sizeof(rk_aiq_uapi_sysctl_getStaticMetas_t), 1); memcpy(static_info, ¶.static_info, sizeof(rk_aiq_static_info_t)); return static_info; } rk_aiq_metas_t* rk_aiq_uapi_sysctl_getMetaData(const rk_aiq_sys_ctx_t* ctx, uint32_t frame_id){ rk_aiq_uapi_sysctl_getMetaData_t para; rk_aiq_metas_t *metas = (rk_aiq_metas_t*)malloc(sizeof(rk_aiq_metas_t)); para.ctx = ctx; para.frame_id = frame_id; call_fun_ipc_call((char *)__func__, ¶, sizeof(rk_aiq_uapi_sysctl_getMetaData_t), 1); memcpy(metas, ¶.metas, sizeof(rk_aiq_metas_t)); return metas; } #if 0 int32_t rk_aiq_uapi_sysctl_getState(const rk_aiq_sys_ctx_t* ctx); #endif XCamReturn rk_aiq_uapi_sysctl_setModuleCtl(const rk_aiq_sys_ctx_t* ctx, int32_t mod_en) { return 0; } int32_t rk_aiq_uapi_sysctl_getModuleCtl(const rk_aiq_sys_ctx_t* ctx){ return 0; } /*! * \brief register customized algo lib * * \param[in] ctx context * \param[in,out] algo_lib_des allocate a new unique id value for algo_lib_des->id if success.\n * this id could be used in \ref rk_aiq_uapi_sysctl_unRegLib * or other lib APIs. The deference object by * \ref algo_lib_des should be valid until \ref rk_aiq_uapi_sysctl_unRegLib * \return return 0 if success */ XCamReturn rk_aiq_uapi_sysctl_regLib(const rk_aiq_sys_ctx_t* ctx, RkAiqAlgoDesComm* algo_lib_des) { return 0; } /*! * \brief unregister customized algo lib * * \param[in] ctx context * \param[in] algo_type algo type defined by RkAiqAlgoDesComm.type * \param[in] lib_id returned by call \ref rk_aiq_uapi_sysctl_regLib * \return return 0 if success */ XCamReturn rk_aiq_uapi_sysctl_unRegLib(const rk_aiq_sys_ctx_t* ctx, const int algo_type, const int lib_id) { return 0; } /*! * \brief enable or disable algo lib * If the \ref lib_id is the same as the current running algo, this interface * could be called in any state except for the context uninitialized. Otherwise, * it could only be called in prepared or initialized state followed by * call \ref rk_aiq_uapi_sysctl_prepare , and in this case, the old algo which type * is \ref algo_type will be replaced by the new algo \ref lib_id. * * \param[in] ctx context * \param[in] algo_type algo type defined by RkAiqAlgoDesComm.type * \param[in] lib_id 0 for system integrated algos;\n * returned by call \ref rk_aiq_uapi_sysctl_regLib for customer algos * \param[in] enable enable or disable algos. enable means running the algo's processes\n * defined in \ref RkAiqAlgoDesComm; disable means\n * bypass the algo's prcosses. * \return return 0 if success */ XCamReturn rk_aiq_uapi_sysctl_enableAxlib(const rk_aiq_sys_ctx_t* ctx, const int algo_type, const int lib_id, bool enable) { return 0; } /*! * \brief get algo lib enabled status * * \param[in] ctx context * \param[in] algo_type algo type defined by RkAiqAlgoDesComm.type * \param[in] lib_id 0 for system integrated algos;\n * returned by call \ref rk_aiq_uapi_sysctl_regLib for customer algos * \return return true if enabled , false if disabled or unregistered */ bool rk_aiq_uapi_sysctl_getAxlibStatus(const rk_aiq_sys_ctx_t* ctx, const int algo_type, const int lib_id) { return 0; } /*! * \brief get enabled algo lib context * The returned algo context will be used as the first param of algo private APIs. * For those customer's algo lib, this interface should be called after * \ref rk_aiq_uapi_sysctl_enableAxlib, or will return NULL. * * \param[in] ctx context * \param[in] algo_type algo type defined by RkAiqAlgoDesComm.type * \return return current enabled algo context if success or NULL. */ const RkAiqAlgoContext* rk_aiq_uapi_sysctl_getEnabledAxlibCtx(const rk_aiq_sys_ctx_t* ctx, const int algo_type) { return NULL; } RKAIQ_END_DECLARE