在高通自带的reload函数中,每次reload的时候都要先查找hash值以及lru,也就是内存中是否存在,如果存在就不会重新重新读取动态库数据。因此本文的方法是在读取hash值的位置加一个函数,不进行hash值和lru count的读取,删除之前的hash和lru,重新进行读取。
实现过程
在port_sensor.c
文件中的port_sensor_handle_upstream_module_event
函数判断传入参数非空之后增加对自定义perisist的处理:当persist从0变为1,重载chromatix头文件
char value[PROPERTY_VALUE_MAX];static char chromatix_reload = 0 ;if (property_get("persist.chromatix.reload" , value, "" ) > 0 ){ if (strcmp ("0" , value) == 0 ) chromatix_reload = 1 ; else { if (chromatix_reload){ chromatix_reload = 0 ; if (keda_reload_chromatix_ptr(module ,event, bundle_info->s_bundle) == TRUE) SERR("chromatix reload sucess" ); else SERR("chromatix reload failed" ); } } }
在port_sensor_handle_upstream_module_event
函数上方加入keda_reload_chromatix_ptr
的定义,在8056平台中要删除CAMERA_CHROMATIX_MODULE_ALL
参数
static boolean keda_reload_chromatix_ptr (mct_module_t *module , mct_event_t *event, module_sensor_bundle_info_t * s_bundle) { sensor_chromatix_params_t chromatix_params; int32_t rc = SENSOR_FAILURE; memset (&chromatix_params, 0 , sizeof (chromatix_params)); RETURN_ON_NULL(s_bundle); RETURN_ON_NULL(event); RETURN_ON_NULL(module ); SHIGH("load chromatix for sensor %s" , s_bundle->sensor_lib_params->sensor_lib_ptr->sensor_slave_info.sensor_name); SENSOR_SUB_MODULE_PROCESS_EVENT(s_bundle, SUB_MODULE_SENSOR, SENSOR_GET_CUR_CHROMATIX_NAME, &chromatix_params, rc); RETURN_FALSE_IF(rc < 0 ); SENSOR_SUB_MODULE_PROCESS_EVENT(s_bundle, SUB_MODULE_CHROMATIX, CHROMATIX_KEDA_RELOAD, &chromatix_params, rc); RETURN_FALSE_IF(rc < 0 ); RETURN_ON_FALSE(sensor_util_validate_chromatix_params(&chromatix_params)); RETURN_ON_FALSE(sensor_util_post_chromatix_event_downstream( module , s_bundle, event->identity, &chromatix_params, CAMERA_CHROMATIX_MODULE_ALL)); return TRUE; }
在sensor_common.h
中增加CHROMATIX_KEDA_RELOAD
的枚举定义
CHROMATIX_ENUM_MIN, CHROMATIX_GET_PTR, CHROMATIX_GET_CACHED_PTR, CHROMATIX_SET_CM, CHROMATIX_RESET_NAME, CHROMATIX_KEDA_RELOAD, CHROMATIX_ENUM_MAX,
在chromatix_sub_module.c
中的chromatix_process
函数添加对CHROMATIX_KEDA_RELOAD
的处理
switch (event) {case CHROMATIX_SET_CM: ctrl->cm = (chromatix_manager_type *)data; break ; case CHROMATIX_GET_PTR: chromatix_get_ptr(ctrl, data); break ; case CHROMATIX_GET_CACHED_PTR: chromatix_get_cached_ptr(ctrl, data); break ; case CHROMATIX_RESET_NAME: chromatix_reset_name(ctrl); break ; case CHROMATIX_KEDA_RELOAD: chromatix_reload_get_ptr(ctrl, data); break ; default : SERR("invalid event %d" , event); rc = SENSOR_FAILURE; break ; }
模仿chromatix_get_ptr
函数,在chromatix_process
函数上方加入chromatix_reload_get_ptr
的定义
static int32_t chromatix_reload_get_ptr (chromatix_data_t *ctrl, void *data) { int32_t i; sensor_chromatix_params_t *params; SLOW("Enter" ); RETURN_ERROR_ON_NULL(ctrl); RETURN_ERROR_ON_NULL(data); params = (sensor_chromatix_params_t *)data; for (i = 0 ; i < SENSOR_CHROMATIX_MAX; i++) { SLOW("type[%d]:[%s]" , i, params->chromatix_lib_name[i]); if (params->chromatix_lib_name[i] == ctrl->chromatix_name[i]) params->chromatix_reloaded[i] = FALSE; else params->chromatix_reloaded[i] = TRUE; if (i == SENSOR_CHROMATIX_EXTERNAL) continue ; if (!params->chromatix_lib_name[i]) { params->chromatix_ptr[i] = NULL ; continue ; } ctrl->chromatix_ptr[i] = reload_getChromatix(ctrl->cm, params->chromatix_lib_name[i], pick_calibration_type[i]); if (!ctrl->chromatix_ptr[i]) { SERR("Can't get chromatix pointer : %s" , params->chromatix_lib_name[i]); return SENSOR_FAILURE; } params->chromatix_ptr[i] = ctrl->chromatix_ptr[i]; SLOW("chromatix version: 0x%x" , ((chromatix_parms_type*)ctrl->chromatix_ptr[i]) ->chromatix_version_info.chromatix_version); ctrl->chromatix_name[i] = params->chromatix_lib_name[i]; } SLOW("Exit" ); return SENSOR_SUCCESS; }
在chromatix_manager.c
中模仿cm_getChromatix
函数重新定义一个reload_getChromatix
,并进行修改,删除对哈希值和页面置换算法时间的判断
void *reload_getChromatix (chromatix_manager_type* cm, const char *name, uint32_t calibration_type) { void *data_sym = NULL ; void *data_hdl = NULL ; char *key = NULL ; uint32_t cIndex; if (!cm || !name) { SERR("NULL pointer detected" ); return NULL ; } SLOW("%s" , name); PTHREAD_MUTEX_LOCK(&cm->mutex); SERR("delete least used file from cache, and add" ); lru_getLeastRecent(&cm->lru, &key, &cIndex); hash_delete(&cm->hash, key, &data_hdl, &data_sym); unload_chromatix(data_hdl, data_sym); data_sym = addLib_getSymbol(cm, name, calibration_type); if (data_sym == NULL ) SERR("failed : addLib2" ); lru_traverse(&cm->lru); PTHREAD_MUTEX_UNLOCK(&cm->mutex); return data_sym; } void *reload_getChromatix (chromatix_manager_type* cm, const char *name, uint32_t calibration_type) { void *data_sym = NULL ; void *data_hdl = NULL ; char *key = NULL ; uint32_t cIndex; if (!cm || !name) { SERR("NULL pointer detected" ); return NULL ; } SLOW("%s" , name); PTHREAD_MUTEX_LOCK(&cm->mutex); SERR("delete least used file from cache, and add" ); lru_getLeastRecent(&cm->lru, &key, &cIndex); hash_delete(&cm->hash, key, &data_hdl); chromatix_unload_library(data_hdl); data_sym = addLib_getSymbol(cm, name, calibration_type); if (data_sym == NULL ) SERR("failed : addLib2" ); lru_traverse(&cm->lru); PTHREAD_MUTEX_UNLOCK(&cm->mutex); return data_sym; }
void *reload_getChromatix (chromatix_manager_type* cm, const char *name, uint32_t calibration_type) ;
操作方法
在线或者本地编译好chromatix头文件后,将编译生成的动态库push进设备相应的地址
手动输入或者运行脚本
adb shell setprop persist.chromatix.reload 0 adb shell setprop persist.chromatix.reload 1
可以查看关键词chromatix reload
,如果显示成功,则重载成功
BUG:
发现部分动态库加载不正确