在高通自带的reload函数中,每次reload的时候都要先查找hash值以及lru,也就是内存中是否存在,如果存在就不会重新重新读取动态库数据。因此本文的方法是在读取hash值的位置加一个函数,不进行hash值和lru count的读取,删除之前的hash和lru,重新进行读取。

实现过程

  1. 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");
}
}
}
  1. 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;
}
  1. sensor_common.h中增加CHROMATIX_KEDA_RELOAD的枚举定义
CHROMATIX_ENUM_MIN, /* start of chromatix enums */
/* Get enums */
CHROMATIX_GET_PTR, /* sensor_chromatix_params_t * */
CHROMATIX_GET_CACHED_PTR,
/* Set enums */
CHROMATIX_SET_CM,
CHROMATIX_RESET_NAME,
CHROMATIX_KEDA_RELOAD,
CHROMATIX_ENUM_MAX, /* End of Chromatix enums*/
/* End of Actuator enums*/
  1. 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;
}
  1. 模仿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;
}
  1. chromatix_manager.c中模仿cm_getChromatix函数重新定义一个reload_getChromatix,并进行修改,删除对哈希值和页面置换算法时间的判断
//660平台
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");

/* get the least used chromatix file info */
lru_getLeastRecent(&cm->lru, &key, &cIndex);
/* delete has node and unload the library */
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;
}

//8056平台
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");
/* get the least used chromatix file info */

lru_getLeastRecent(&cm->lru, &key, &cIndex);

/* delete has node and unload the library */

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;
}
//在chromatix_manager.h中添加reload_getChromatix的定义
void *reload_getChromatix(chromatix_manager_type* cm, const char *name,
uint32_t calibration_type);

操作方法

  1. 在线或者本地编译好chromatix头文件后,将编译生成的动态库push进设备相应的地址

  2. 手动输入或者运行脚本

adb shell setprop persist.chromatix.reload 0
adb shell setprop persist.chromatix.reload 1
  1. 可以查看关键词chromatix reload,如果显示成功,则重载成功

BUG:

  1. 发现部分动态库加载不正确