static int read_tp_color_from_nv(char *color_info)
{
	int ret=0;
	struct hisi_nve_info_user user_info;

	memset(&user_info, 0, sizeof(user_info));
	user_info.nv_operation = 1;
	user_info.nv_number = 16;
	user_info.valid_size = 15;
	strncpy(user_info.nv_name, "TPCOLOR", sizeof(user_info.nv_name));
	user_info.nv_name[sizeof(user_info.nv_name)-1]='\0';
	ret = hisi_nve_direct_access(&user_info);
	if (ret)
	{
		hwlog_err("hisi_nve_direct_access read error(%d)\n", ret);
		return -1;
	}
	if((!strncmp(user_info.nv_data, "white", strlen("white")))
		||(!strncmp(user_info.nv_data, "black", strlen("black")))
		||(!strncmp(user_info.nv_data, "pink", strlen("pink")))
		||(!strncmp(user_info.nv_data, "red", strlen("red")))
		||(!strncmp(user_info.nv_data, "yellow", strlen("yellow")))
		||(!strncmp(user_info.nv_data, "blue", strlen("blue")))
		||(!strncmp(user_info.nv_data, "gold", strlen("gold"))))
	{
		strncpy(color_info, user_info.nv_data, strlen(user_info.nv_data));
		color_info[strlen(user_info.nv_data)]='\0';
		return 0;
	}
	else
	{
		hwlog_err("[%s]:read_tp_color_from_nv read unormal value!!\n", __func__);
		return -1;
	}
}
static int mntn_read_nogui_flag(void)
{
    int ret = 0;
    struct hisi_nve_info_user user_info;
    int nogui_flag = 0;

    user_info.nv_operation = 1;
    user_info.nv_number = 206;
    user_info.valid_size = 1;
    strncpy(user_info.nv_name, "NOGUI", sizeof("NOGUI"));
    ret = hisi_nve_direct_access(&user_info);
    if (ret)
    {
	 MNTN_FILESYS_PRINT(KERN_ERR"mntn_err: nve_direct_access read error(%d)", ret);
        return -1;
    }
    nogui_flag = user_info.nv_data[0];
    if (nogui_flag == 1)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
int32 write_conf_to_nvram(int8 * name, int8 * pc_arr)
{
#ifdef	INI_KO_MODULE
    struct hisi_nve_info_user  info;
#endif
    int32 ret = -1;

#ifndef	INI_KO_MODULE
    ret = hweiOperaNVWR(HISI_CUST_NVRAM_WRITE, HISI_CUST_NVRAM_NUM, HISI_CUST_NVRAM_NAME, HISI_CUST_NVRAM_LEN, pc_arr);
    if (ret < -1) {
        INI_ERROR("write nvm failed");
        return INI_FAILED;
    }
#else
    memset(&info, 0, sizeof(info));
    strncpy(info.nv_name, HISI_CUST_NVRAM_NAME, strlen(HISI_CUST_NVRAM_NAME) - 1);
    info.nv_name[strlen(HISI_CUST_NVRAM_NAME) - 1] = '\0';
    info.nv_number = HISI_CUST_NVRAM_NUM;
    info.valid_size = HISI_CUST_NVRAM_LEN;
    info.nv_operation = HISI_CUST_NVRAM_WRITE;
    memcpy(info.nv_data, pc_arr, HISI_CUST_NVRAM_LEN);

    ret = hisi_nve_direct_access( &info );
    if (ret < -1) {
        INI_ERROR("write nvm failed");
        return INI_FAILED;
    }
#endif

    return INI_SUCC;
}
/*****************************************************************************
 函 数 名  : DRV_NVE_ACCESS
 功能描述  : 访问NVE
 输入参数  : NVE
 输出参数  : 无
 返 回 值  : BSP_OK / BSP_ERROR
 调用函数  :
 被调函数  :

 修改历史      :
  1.日    期   : 2013年6月27日
    作    者   : 袁勤顺 00167654
    修改内容   : 新生成函数

*****************************************************************************/
BSP_S32 DRV_NVE_ACCESS(NVE_INFO_S *nve)
{
#ifdef CONFIG_K3V2_NVE
    int ret;	
    struct nve_info_user  info;	

    if (!nve) {
    	printk(KERN_ERR "BSP_NVE_DirectAccess input is null!");
    	return BSP_ERROR;
    }    
    
    info.nv_operation = nve->nv_operation;
    info.nv_number = nve->nv_number;
    info.valid_size = nve->valid_size;
    memcpy(info.nv_name,nve->nv_name,BSP_NVE_NAME_LENGTH);
    
    /*write operation*/
    if (!nve->nv_operation)
        memcpy(info.nv_data,nve->nv_data,nve->valid_size);
        
    ret = hisi_nve_direct_access((struct hisi_nve_info_user *)&info);	        
    
    if (!ret) {
    	/*read operation*/
        if (nve->nv_operation)
            memcpy(nve->nv_data,info.nv_data,nve->valid_size);
            
        return BSP_OK;
    }
    else
        return BSP_ERROR;
#else
    return BSP_ERROR;
#endif
}
int32 hwifi_get_mac_addr(uint8 *puc_buf)
{
    struct hisi_nve_info_user st_info;
    int32 l_ret = -1;
    int32 l_sum = 0;

    if (NULL == puc_buf)
    {
        OAM_ERROR_LOG0(0, OAM_SF_ANY, "hisi_customize_wifi::buf is NULL!");
        return INI_FAILED;
    }

    oal_memset(puc_buf, 0, MAC_LEN);

    oal_memset(&st_info, 0, sizeof(st_info));
    st_info.nv_number  = NV_WLAN_NUM;   //nve item

    strncpy(st_info.nv_name, "MACWLAN", sizeof("MACWLAN"));

    st_info.valid_size = NV_WLAN_VALID_SIZE;
    st_info.nv_operation = NV_READ;

    if (0 != g_auc_wifimac[0] || 0 != g_auc_wifimac[1] || 0 != g_auc_wifimac[2] || 0 != g_auc_wifimac[3]
        || 0 != g_auc_wifimac[4] || 0 != g_auc_wifimac[5])
    {
        memcpy(puc_buf, g_auc_wifimac, MAC_LEN);
        return INI_SUCC;
    }

    l_ret = hisi_nve_direct_access(&st_info);

    if (!l_ret)
    {
        l_sum = char2byte(st_info.nv_data, puc_buf);
        if (0 != l_sum)
        {
            INI_WARNING("hisi_customize_wifi get MAC from NV: mac="MACFMT"\n", MAC2STR(puc_buf));
            oal_memcopy(g_auc_wifimac, puc_buf, MAC_LEN);
        }else{
            random_ether_addr(puc_buf);
            puc_buf[1] = 0x11;
            puc_buf[2] = 0x02;
        }
    }else{
        random_ether_addr(puc_buf);
        puc_buf[1] = 0x11;
        puc_buf[2] = 0x02;
    }

    return INI_SUCC;
}
int32 read_conf_from_nvram(int8 * name, int8 * pc_out, uint32 size)
{
#ifdef	INI_KO_MODULE
    struct hisi_nve_info_user  info;
    uint32 len = 0;
#endif
#ifndef	INI_KO_MODULE
    int8 buff[HISI_CUST_NVRAM_LEN] = {0};
#endif
    int32 ret = -1;

#ifndef	INI_KO_MODULE
    ret = hweiOperaNVWR(HISI_CUST_NVRAM_READ, HISI_CUST_NVRAM_NUM, HISI_CUST_NVRAM_NAME, HISI_CUST_NVRAM_LEN, buff);
    if (ret < -1) {
        INI_ERROR("read nvm failed");
        return INI_FAILED;
    }
#else
    memset(&info, 0, sizeof(info));
    strncpy(info.nv_name, HISI_CUST_NVRAM_NAME, strlen(HISI_CUST_NVRAM_NAME) - 1);
    info.nv_name[strlen(HISI_CUST_NVRAM_NAME) - 1] = '\0';
    info.nv_number = HISI_CUST_NVRAM_NUM;
    info.valid_size = HISI_CUST_NVRAM_LEN;
    info.nv_operation = HISI_CUST_NVRAM_READ;

    ret = hisi_nve_direct_access( &info );
    if (ret < -1) {
        INI_ERROR("read nvm failed");
        return INI_FAILED;
    }
    else
    {
        len = INI_MIN(size, NUM_OF_NV_PARAMS);
        memcpy(pc_out, info.nv_data, len);
    }
#endif
    return INI_SUCC;
}
static int write_tp_color_to_nv(void)
{
	int ret=0;
	u8 lcd_id=0;
	u8 phone_color=0;
	struct hisi_nve_info_user user_info;

	memset(&user_info, 0, sizeof(user_info));
	lcd_id = read_tp_color();
	if (lcd_id != 0xff) {
		hwlog_info("lcd id is %u from read tp color\n", lcd_id);
	}
	if(is_color_correct(cypress_tp_color[0]))
		phone_color=cypress_tp_color[0];
	else if(is_color_correct(lcd_id))
		phone_color=lcd_id;
	else
	{
		hwlog_err("LCD/TP ID both error!\n");
		return -1;
	}
	switch(phone_color)
	{
	case WHITE:
			strncpy(user_info.nv_data, "white", sizeof(user_info.nv_data));
			break;
	case BLACK:
			strncpy(user_info.nv_data, "black", sizeof(user_info.nv_data));
			break;
	case PINK:
			strncpy(user_info.nv_data,"pink", sizeof(user_info.nv_data));
			break;
	case RED:
			strncpy(user_info.nv_data,"red", sizeof(user_info.nv_data));
			break;
	case YELLOW:
			strncpy(user_info.nv_data,"yellow", sizeof(user_info.nv_data));
			break;
	case BLUE:
			strncpy(user_info.nv_data,"blue", sizeof(user_info.nv_data));
			break;
	case GOLD:
			strncpy(user_info.nv_data,"gold", sizeof(user_info.nv_data));
			break;
	default:
			strncpy(user_info.nv_data,"", sizeof(user_info.nv_data));
			break;
	}
	user_info.nv_operation = 0;
	user_info.nv_number = 16;
	user_info.valid_size = 15;
	strncpy(user_info.nv_name, "TPCOLOR", sizeof(user_info.nv_name));
	user_info.nv_name[sizeof(user_info.nv_name)-1]='\0';
	ret = hisi_nve_direct_access(&user_info);
	if (ret)
	{
		hwlog_err("hisi_nve_direct_access write error(%d)\n", ret);
		return -1;
	}
	hwlog_info("[%s]:(%s)\n", __func__, user_info.nv_data);
	return ret;
}