void print_device_version(INI_FILE *fp)
{
    int8  version_buff[INI_VERSION_STR_LEN] = {0};
    int32 l_ret;

    l_ret = ini_find_var(fp, INI_MODU_PLAT, INI_VAR_PLAT_BOARD, version_buff, sizeof(version_buff));
    if (INI_FAILED == l_ret)
    {
        version_buff[0] = '\0';
        fp->f_pos = 0;
        return ;
    }
    if (INI_FAILED == ini_check_value(version_buff))
    {
        fp->f_pos = 0;
        return ;
    }
    strncpy(g_board_version.board_version, version_buff, INI_VERSION_STR_LEN);
    INI_INFO("::g_board_version.board_version = %s::", g_board_version.board_version);
    fp->f_pos = 0;

    l_ret = ini_find_var(fp, INI_MODU_PLAT, INI_VAR_PLAT_PARAM, version_buff, sizeof(version_buff));
    if (INI_FAILED == l_ret)
    {
        version_buff[0] = '\0';
        fp->f_pos = 0;
        return ;
    }
    if (INI_FAILED == ini_check_value(version_buff))
    {
        fp->f_pos = 0;
        return ;
    }
    strncpy(g_param_version.param_version, version_buff, INI_VERSION_STR_LEN);
    INI_INFO("::g_param_version.param_version = %s::", g_param_version.param_version);
    fp->f_pos = 0;
    return ;
}
 int32 ini_config_init(int32 modu)
 {
     int8  log_status[10] = {0};
     int32 log_value;
	 int32 l_ret = INI_FAILED;
     INI_FILE *fp = NULL;
	/* init only once */

	if (INI_MODU_PLAT != modu)
    {
        if (NULL == INI_FILE_PATH)
        {
            INI_ERROR("didn't get ini file path!!!");
            return INI_FAILED;
        }
		strncpy(gac_file, INI_FILE_PATH, INI_VAR_FILE_LEN);
		gac_file[INI_VAR_FILE_LEN] = '\0';
		return INI_SUCC;
	}

	INI_DEBUG("open ini file:%s", gac_file);
	fp = ini_file_open(gac_file, "rt");
	if (0 == fp)
	{
		INI_ERROR("open %s failed!!!", gac_file);
        return INI_FAILED;
	}
    INI_DEBUG("open %s succ!", gac_file);

	l_ret = ini_find_var(fp, INI_MODU_PLAT, INI_VAR_LOG_CFG_STATUS, log_status);
	if (INI_FAILED == l_ret)
	{
		ini_file_close(fp);
		return INI_FAILED;
	}

	if (INI_FAILED == ini_check_value(log_status))
	{
		ini_file_close(fp);
		return INI_FAILED;
	}
	sscanf(log_status, "%d", &log_value);
	if (0 > log_value)
	{
		INI_ERROR("log_status value=%d not support!!!", log_value);
		ini_file_close(fp);
		return INI_FAILED;
	}
	INI_INFO("::log_status value=%d::", log_value);
	ini_file_close(fp);
#if 0
	if (INI_VAR_CFG_ENABLE == log_value)
	{
		fp = ini_file_open(INI_FILE_PATH, "rt");
		if (0 == fp)
		{
			INI_ERROR("open %s failed!!!", INI_FILE_PATH);
			return INI_FAILED;
		}

		l_ret = ini_find_var(fp, INI_MODU_PLAT, INI_VAR_LOG_CFG_FILE, gac_cfg_file);
		if (INI_FAILED == l_ret)
		{
			ini_file_close(fp);
			return INI_FAILED;
		}
		if (INI_FAILED == ini_check_value(gac_cfg_file))
		{
			ini_file_close(fp);
			return INI_FAILED;
		}
		//INI_DEBUG("::gac_cfg_file = %s::", gac_cfg_file);
		strncpy(gac_file, gac_cfg_file, INI_VAR_FILE_LEN);
		gac_file[INI_VAR_FILE_LEN] = '\0';
		if (INI_FAILED == access(gac_file, 0))
		{
			INI_ERROR("%s is not exist, init log control system", gac_file);
			l_ret = system("/system/bin/set_log_hisi -S init");
			if (INI_SUCC!= l_ret)
			{
				INI_ERROR("system() run err");
				ini_file_close(fp);
				return INI_FAILED;
			}
		}
	}
	ini_file_close(fp);
#endif

	return INI_SUCC;
 }
int32 ini_find_var_value(int32 modu, int8 * puc_var, int8* puc_value, uint32 size)
{
	INI_FILE *fp = NULL;

#ifdef INI_KO_MODULE
	static int32 sl_once = 1;
#endif
#ifdef INI_TIME_TEST
	struct timeval tv[2];
#endif

	int32 l_ret;

	if (NULL == puc_var || '\0' == puc_var[0] || NULL == puc_value)
	{
		INI_ERROR("check if puc_var and puc_value is NULL or blank");
		return INI_FAILED;
	}

#ifdef INI_TIME_TEST
	do_gettimeofday(&tv[0]);
#endif

#ifndef INI_KO_MODULE
    if (0 == init_mutex_flag)
    {
        INI_INIT_MUTEX(&file_mutex, NULL);
        init_mutex_flag = 1;
    }
#endif

    INI_MUTEX_LOCK(&file_mutex);

#ifndef INI_KO_MODULE
    l_ret = ini_config_init(modu);
    if (INI_FAILED == l_ret)
    {
        INI_MUTEX_UNLOCK(&file_mutex);
        return INI_FAILED;
    }
#endif

	fp = ini_file_open(INI_FILE_PATH, "rt");
	if (0 == fp)
	{
		fp = NULL;
		INI_ERROR("open %s failed!!!", INI_FILE_PATH);
        INI_MUTEX_UNLOCK(&file_mutex);
		return INI_FAILED;
	}
#ifdef INI_KO_MODULE
	/* init g_board_version.board_version and g_param_version.param_version
	 * just once while call ini_find_var_value */
	if (sl_once)
	{
        print_device_version(fp);
        sl_once = 0;
	}
#endif

	l_ret = ini_find_mode(fp, modu, puc_var, puc_value, size);
	if (INI_FAILED == l_ret)
	{
        ini_file_close(fp);
        INI_MUTEX_UNLOCK(&file_mutex);
		return INI_FAILED;
	}
	else if (INI_SUCC_MODE_VAR == l_ret)
	{
		INI_DEBUG("::return %s:%s::", puc_var, puc_value);
        ini_file_close(fp);
        INI_MUTEX_UNLOCK(&file_mutex);
		return  ini_check_value(puc_value);
	}
	
	/* find puc_var in .ini return puc_value */
	l_ret = ini_find_var(fp, modu, puc_var, puc_value, size);
	if (INI_FAILED == l_ret)
	{
		puc_value[0] = '\0';
        ini_file_close(fp);
        INI_MUTEX_UNLOCK(&file_mutex);
		return INI_FAILED;
	}

#ifdef INI_TIME_TEST
	do_gettimeofday(&tv[1]);
	INI_DEBUG("time take = %ld", (tv[1].tv_sec - tv[0].tv_sec) * 1000 + (tv[1].tv_usec - tv[0].tv_usec) / 1000);
#endif

    ini_file_close(fp);
    INI_MUTEX_UNLOCK(&file_mutex);

	/* check blank space of puc_value */
	if (INI_SUCC == ini_check_value(puc_value))
	{
		INI_DEBUG("::return %s:%s::", puc_var, puc_value);
		return INI_SUCC;
	}
	return INI_FAILED;
}
int32 ini_find_var_value(int32 modu, int8 * puc_var, int8* puc_value)
{
	INI_FILE *fp = NULL;
    
#ifdef INI_KO_MODULE
	static int32 sl_once = 1;
#endif
#ifdef INI_TIME_TEST
	struct timeval tv[2];
#endif

	int32 l_ret;

	if (NULL == puc_var || '\0' == puc_var[0] || NULL == puc_value)
	{
		INI_ERROR("check if puc_var and puc_value is NULL or blank");
		return INI_FAILED;
	}

#ifdef INI_TIME_TEST
	do_gettimeofday(&tv[0]);
#endif

#ifndef INI_KO_MODULE
    if (0 == init_mutex_flag)
    {
        INI_INIT_MUTEX(&file_mutex, NULL);
        init_mutex_flag = 1;
    }
#endif

    INI_MUTEX_LOCK(&file_mutex);

	strncpy(gac_file, INI_FILE_PATH, INI_VAR_FILE_LEN);
	gac_file[INI_VAR_FILE_LEN] = '\0';
#ifndef INI_KO_MODULE
    l_ret = ini_config_init(modu);
    if (INI_FAILED == l_ret)
    {
        INI_MUTEX_UNLOCK(&file_mutex);
        return INI_FAILED;
    }
#endif

	fp = ini_file_open(gac_file, "rt");
	if (0 == fp)
	{
		fp = NULL;
		INI_ERROR("open %s failed!!!", INI_FILE_PATH);
        INI_MUTEX_UNLOCK(&file_mutex);
		return INI_FAILED;
	}
#ifdef INI_KO_MODULE
	/* init g_board_version.board_version and g_param_version.param_version
	 * just once while call ini_find_var_value */
	if (sl_once)
	{
		int8 version_buff[32] = {0};

		INI_DEBUG("sl_once = %d", sl_once);
		sl_once = 0;
		l_ret = ini_find_var(fp, INI_MODU_PLAT, INI_VAR_PLAT_BOARD, version_buff);
		if (INI_FAILED == l_ret)
		{
			version_buff[0] = '\0';
			ini_file_close(fp);
            INI_MUTEX_UNLOCK(&file_mutex);
			return INI_FAILED;
		}
		if (INI_FAILED == ini_check_value(version_buff))
		{
			ini_file_close(fp);
            INI_MUTEX_UNLOCK(&file_mutex);
			return INI_FAILED;
		}
		memset(g_board_version.board_version, 0, sizeof(g_board_version.board_version));
		strncpy(g_board_version.board_version, version_buff, sizeof(g_board_version.board_version) - 1);
		INI_DEBUG("::g_board_version.board_version = %s::", g_board_version.board_version);
		fp->f_pos = 0;

		l_ret = ini_find_var(fp, INI_MODU_PLAT, INI_VAR_PLAT_PARAM, version_buff);
		if (INI_FAILED == l_ret)
		{
			version_buff[0] = '\0';
			ini_file_close(fp);
            INI_MUTEX_UNLOCK(&file_mutex);
			return INI_FAILED;
		}
		if (INI_FAILED == ini_check_value(version_buff))
		{
			ini_file_close(fp);
            INI_MUTEX_UNLOCK(&file_mutex);
			return INI_FAILED;
		}
		INI_DEBUG("::g_param_version.param_version = %s::", g_param_version.param_version);
		memset(g_param_version.param_version, 0, sizeof(g_param_version.param_version));
		strncpy(g_param_version.param_version, version_buff, sizeof(g_param_version.param_version) - 1);
		fp->f_pos = 0;
	}
#endif

	l_ret = ini_find_mode(fp, modu, puc_var, puc_value);
	if (INI_FAILED == l_ret)
	{
        ini_file_close(fp);
        INI_MUTEX_UNLOCK(&file_mutex);
		return INI_FAILED;
	}
	else if (INI_SUCC_MODE_VAR == l_ret)
	{
		INI_DEBUG("::return %s:%s::", puc_var, puc_value);
        ini_file_close(fp);
        INI_MUTEX_UNLOCK(&file_mutex);
		return  ini_check_value(puc_value);
	}
	
	/* find puc_var in .ini return puc_value */
	l_ret = ini_find_var(fp, modu, puc_var, puc_value);
	if (INI_FAILED == l_ret)
	{
		puc_value[0] = '\0';
        ini_file_close(fp);
        INI_MUTEX_UNLOCK(&file_mutex);
		return INI_FAILED;
	}

#ifdef INI_TIME_TEST
	do_gettimeofday(&tv[1]);
	INI_DEBUG("time take = %ld", (tv[1].tv_sec - tv[0].tv_sec) * 1000 + (tv[1].tv_usec - tv[0].tv_usec) / 1000);
#endif

    ini_file_close(fp);
    INI_MUTEX_UNLOCK(&file_mutex);

	/* check blank space of puc_value */
	if (INI_SUCC == ini_check_value(puc_value))
	{
		INI_DEBUG("::return %s:%s::", puc_var, puc_value);
		return INI_SUCC;
	}
	return INI_FAILED;
}