/*******************************************************************/
/************************* File Description ************************/
/*******************************************************************/
/* File Name:		$Workfile:   hmx_uprade_nvram.c  $
 * Version:			$Revision:   1.0  $
 * Original Author:		Yang Hyun Uk $
 * Current Author:	$Author: huyang@humaxdigital.com $
 * Date:			$Date: 2011.11.07
 * File Description:	Humax Upgrade APIs
 * Module:
 * Remarks:
 */

/**
 * @defgroup NVRAM APIs for Upgrade Module
 * @ingroup UPGRADE
 */

/**
 * @author Hyunuk Yang(huyang@humaxdigital.com)
 * @date 07 Nov 2011
 */

/**
 * @note
 * Copyright (C) 2011 Humax Corporation. All Rights Reserved. <br>
 * This software is the confidential and proprietary information
 * of Humax Corporation. You may not use or distribute this software
 * except in compliance with the terms and conditions of any applicable license
 * agreement in writing between Humax Corporation and you.
 */

 /*@{*/

/**
 * @file hmx_upgrade_nvram.c
 */

/*******************************************************************/
/**************************** Header Files *************************/
/*******************************************************************/
/* Start Including Header Files */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include "lib_queue.h"
#include "hmx_upgrade_nvram.h"
/* End Including Headers */


/*******************************************************************/
/****************************** define *****************************/
/*******************************************************************/

#define NVRAM_TYPE_LEN			1
#define NVRAM_RECORD_LENG_LEN	4
#define NVRAM_NAME_LENG_LEN		1
#define NVRAM_DATA_LENG_LEN		4

#define MAX_NAME_LEN		(256)
#define MAX_DATA_LEN		(256*1024)
#define MAX_FIELD_LEN		(MAX_DATA_LEN+MAX_NAME_LEN*2)

#define NVRAM_TLV_TYPE_END	0x00
#define NVRAM_TLV_TYPE_ENV	0x01

#define get8bit(q) (unsigned char)((q)[0])
#define get32bit(q) (unsigned int)(((*(unsigned char *)(q)) << 24) | (*((unsigned char *)(q)+1) << 16) | (*((unsigned char *)(q)+2) << 8) | (*((unsigned char *)(q)+3)) )

#define DEBUG_ERR(fmt, args...) fprintf(stderr, fmt, #args)
#define DEBUG_INFO(fmt, args...) fprintf(stderr, fmt, #args)
#define UNUSED(x) (void)(x)

#define MAX_NVRAM_FILENAME_LENGTH	32

#define SEM_Get(x)	(void)(x)
#define SEM_Release(x)	(void)(x)

#define NVRAM_RO_OFFSET	0x0
#define NVRAM_RO_SIZE		0x00100000
#define NVRAM_RW_OFFSET	( NVRAM_RO_OFFSET + NVRAM_RO_SIZE )
#define NVRAM_RW_SIZE		0x00040000
#define NVRAM_RWB_OFFSET	( NVRAM_RW_OFFSET + NVRAM_RW_SIZE)
#define NVRAM_RWB_SIZE		0x00020000
#define RAW_FS_OFFSET		( NVRAM_RWB_OFFSET + NVRAM_RWB_SIZE)
#define RAW_FS_SIZE		0x00020000

/* End #define */

/*******************************************************************/
/****************************** typedef ****************************/
/*******************************************************************/
/* Start typedef */

typedef struct NVRAM_EVNVAR_t{
    queue_t qb;
	unsigned int recLen;
	unsigned char *name;
	unsigned char nameLen;
	unsigned char *value;
	unsigned int valueLen;
} NVRAM_EVNVAR_T;



typedef struct HMX_NVRAM_MAP_t
{
	NVRAM_FIELD_T		type;
	unsigned char					szFileName[MAX_NVRAM_FILENAME_LENGTH];
	HMX_NVRAM_PARTITION_E	storePartition;
	unsigned int					defaultSize;
} HMX_NVRAM_FIELD_INFO_T;

HMX_NVRAM_FIELD_INFO_T s_nvramFieldInfo[] =
{
	{NVRAM_FIELD_SYSTEM_ID			 , "SYSTEM_ID"             , HMX_NVRAM_PARTITION_RO, 0},
	{NVRAM_FIELD_SFLASH				 , "SFLASH" 			   , HMX_NVRAM_PARTITION_RO, 0},
	{NVRAM_FIELD_SERIAL_NO            , "SERIAL_NO"             , HMX_NVRAM_PARTITION_RO, 0},
	{NVRAM_FIELD_DTCP_KEY             , "DTCP_KEY"              , HMX_NVRAM_PARTITION_RO, 0},
	{NVRAM_FIELD_CI_PLUS_KEY          , "CI_PLUS_KEY"           , HMX_NVRAM_PARTITION_RO, 0},
	{NVRAM_FIELD_MAC_ADDR             , "MAC_ADDR"              , HMX_NVRAM_PARTITION_RO, 0},
	{NVRAM_FIELD_HDCP_KEY             , "HDCP_KEY"              , HMX_NVRAM_PARTITION_RO, 0},
	{NVRAM_FIELD_PARING_DATA          , "PARING_DATA"           , HMX_NVRAM_PARTITION_RO, 0},
	{NVRAM_FIELD_CM_SERIAL_NO         , "CM_SERIAL_NO"          , HMX_NVRAM_PARTITION_RO, 0},
	{NVRAM_FIELD_CM_MAC_ADDR          , "CM_MAC_ADDR"           , HMX_NVRAM_PARTITION_RO, 0},
	{NVRAM_FIELD_CM_MAC_ADDR_ANOTHER  , "CM_MAC_ADDR_ANOTHER"   , HMX_NVRAM_PARTITION_RO, 0},
	{NVRAM_FIELD_IRDETO_BBCB          , "IRDETO_BBCB"           , HMX_NVRAM_PARTITION_RO, 0},
	{NVRAM_FIELD_IRDETO_CPCB 		 , "IRDETO_CPCB"		   , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_IRDETO_CPCB_ENCRYPTED, "IRDETO_CPCB_ENCRYPTED" , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_PRIVATE              , "PRAVATE"               , HMX_NVRAM_PARTITION_RO, 0},
	{NVRAM_FIELD_CSC_KEY              , "CSC_KEY"               , HMX_NVRAM_PARTITION_RO, 0},
	{NVRAM_FIELD_1ST_SERIAL_NUMBER			, "1ST_SERIAL_NUMBER"		, HMX_NVRAM_PARTITION_RO, 0},
	{NVRAM_FIELD_2ND_SERIAL_NUMBER			, "2ND_SERIAL_NUMBER"		, HMX_NVRAM_PARTITION_RO, 0},
	{NVRAM_FIELD_GPN			, "GPN"		, HMX_NVRAM_PARTITION_RO, 0},
	{NVRAM_FIELD_MAC_ADDR_MOCA		, "MAC_ADDR_MOCA"	, HMX_NVRAM_PARTITION_RO, 0},
	{NVRAM_FIELD_MAC_ADDR_BT		, "MAC_ADDR_BT"		, HMX_NVRAM_PARTITION_RO, 0},
	{NVRAM_FIELD_GOOGLE_SSL_PEM	, "GOOGLE_SSL_PEM"	, HMX_NVRAM_PARTITION_RO, 0},
	{NVRAM_FIELD_GOOGLE_SSL_CRT	, "GOOGLE_SSL_CRT"	, HMX_NVRAM_PARTITION_RO, 0},
	{NVRAM_FIELD_LOADER_VER			 , "LOADER_VER" 		   , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_APP_VER 			 , "APP_VER"			   , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_LANGUAGE			 , "LANGUAGE"              , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_TV_STANDARD			 , "TV_STANDARD"	       , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_SCART_RGB			 , "SCART_RGB"             , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_HD_RESOULTION		 , "HD_RESOULTION"	       , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_FIELD_RATE		     , "FIELD_RATE"		       , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_OTA_FLAG1			 , "OTA_FLAG1" 			   , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_OTA_FLAG2			 , "OTA_FLAG2" 			   , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_OTA_FLAG3			 , "OTA_FLAG3" 			   , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_OTA_TYPE1			 , "OTA_TYPE1"			   , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_OTA_TYPE2			 , "OTA_TYPE2"			   , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_OTA_TYPE3			 , "OTA_TYPE3"			   , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_CH_TYPE1 			 , "CH_TYPE1"			   , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_CH_TYPE2 			 , "CH_TYPE2"			   , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_CH_TYPE3 			 , "CH_TYPE3"			   , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_TUNER_ID1			 , "TUNER_ID1"			   , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_TUNER_ID2			 , "TUNER_ID2"			   , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_TUNER_ID3			 , "TUNER_ID3"			   , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_ANTENA_POWER1		 , "ANTENA_POWER1"		   , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_ANTENA_POWER2		 , "ANTENA_POWER2"		   , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_ANTENA_POWER3		 , "ANTENA_POWER3"		   , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_ES_PID1				 , "ES_PID1" 			   , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_ES_PID2				 , "ES_PID2" 			   , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_ES_PID3				 , "ES_PID3" 			   , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_TRANSACTION_ID1		 , "TRANSACTION_ID1" 	   , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_TRANSACTION_ID2		 , "TRANSACTION_ID2" 	   , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_TRANSACTION_ID3		 , "TRANSACTION_ID3"       , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_APP_VERSION			 , "APP_VERSION"	       , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_OTALDR_VERSION		 , "OTALDR_VERSION"	       , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_CUR_OTAIMAGE_VERSION , "CUR_OTAIMAGE_VERSION"  , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_OAD_VERSION			 , "OAD_VERSION"	       , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_NET_IP_CONFIG 		 , "NET_IP_CONFIG"         , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_NET_IP_SETTING		 , "NET_IP_SETTING"        , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_RCU_CUSTOM_CODE		 , "RCU_CUSTOM_CODE"       , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_RCU_CUSTOM_CODE2	 , "RCU_CUSTOM_CODE2"      , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_PANEL_DISPLAY		 , "PANEL_DISPLAY"	       , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_PANEL_DIMMING 		 , "PANEL_DIMMING" 	       , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_ASPECT_RATIO 		 , "ASPECT_RATIO" 		   , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_COUNTRY_CODE		 , "COUNTRY_CODE"	       , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_USAGE_ID			 , "USAGE_ID"              , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_CH_INFO_S			 , "CH_INFO_S"             , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_CH_INFO_T			 , "CH_INFO_T"             , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_CH_INFO_C			 , "CH_INFO_C"             , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_OTA_FTP_INFO		 , "FTP_OTA_INFO"		   , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_NET_PORTAL_IP		 , "NET_PORTAL_IP"	       , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_NET_DOWN_PATH 		 , "NET_DOWN_PATH" 	       , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_LOADER_VERSION		 , "LOADER_VERSION"	       , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_OSD_DISPLAY			 , "OSD_DISPLAY"	       , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_ACTIVATED_KERNEL_NUM, "ACTIVATED_KERNEL_NUM"	       , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_MTD_TYPE_FOR_KERNEL			 , "MTD_TYPE_FOR_KERNEL"	       , HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_ACTIVATED_KERNEL_NAME		, "ACTIVATED_KERNEL_NAME"	, HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_EXTRA_KERNEL_OPT			, "EXTRA_KERNEL_OPT"		, HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_PLATFORM_NAME			, "PLATFORM_NAME"		, HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_PAIRED_DISK			, "PAIRED_DISK"		, HMX_NVRAM_PARTITION_RW, 0},
	{NVRAM_FIELD_PARTITION_VER			, "PARTITION_VER"		, HMX_NVRAM_PARTITION_RW, 0},

	{NVRAM_FIELD_BIN8K				 , "BIN8K"				   , HMX_NVRAM_PARTITION_RW, 0x2000},
	{NVRAM_FIELD_RAWFS				 , "RAWFS" 			       , HMX_NVRAM_PARTITION_W_RAWFS, RAW_FS_SIZE},
	{NVRAM_FIELD_DUMMY 				 , "DUMMY" 			       , HMX_NVRAM_PARTITION_RW, 0}
};

/* End typedef */

/*******************************************************************/
/************************ global variables *************************/
/*******************************************************************/
/* Start global variable */
static queue_t s_nvram_envvars[HMX_NVRAM_PARTITION_MAX] = {
							{&s_nvram_envvars[0],&s_nvram_envvars[0]},
							{&s_nvram_envvars[1],&s_nvram_envvars[1]},
							{&s_nvram_envvars[2],&s_nvram_envvars[2]},
							};

static unsigned int s_nvram_offset[HMX_NVRAM_PARTITION_MAX] = {
							NVRAM_RO_OFFSET,
							NVRAM_RW_OFFSET,
							RAW_FS_OFFSET
							};

static unsigned int s_nvram_backup_offset[HMX_NVRAM_PARTITION_MAX] = {
							0,
							NVRAM_RWB_OFFSET,
							0
							};

static unsigned int s_nvram_size[HMX_NVRAM_PARTITION_MAX] = {
							NVRAM_RO_SIZE,
							NVRAM_RW_SIZE,
							RAW_FS_SIZE
							};

/* End global variable */


/*******************************************************************/
/************************ static variables *************************/
/*******************************************************************/
/* Start static variable */
static unsigned long s_nvramSema;


/* End static variable */


/*******************************************************************/
/************************ static funtions **************************/
/*******************************************************************/
/*  *********************************************************************0
    *  HMX_NVRAM_Read(buffer,offset,length)0
    *  0
    *  Read data from the NVRAM device0
    *
    *  Input parameters:
    *  	   buffer - destination buffer
    *  	   offset - offset of data to read
    *  	   length - number of bytes to read
    *
    *  Return value:
    *  	   number of bytes read, or <0 if error occured
    ********************************************************************* */
static int drv_NVRAM_Read(unsigned char *buffer,unsigned int offset,unsigned int length)
{
	DRV_Error	drv_error;

	drv_error = HMX_UPGRADE_NVRAM_Read(offset, buffer, length);
	if (drv_error != 0)
	{
		return -1;
	}

	return length;
}

/*  *********************************************************************
    *  HMX_NVRAM_Write(buffer,offset,length)
    *
    *  Write data to the NVRAM device
    *
    *  Input parameters:
    *  	   buffer - source buffer
    *  	   offset - offset of data to write
    *  	   length - number of bytes to write
    *
    *  Return value:
    *  	   number of bytes written, or -1 if error occured
    ********************************************************************* */
static int drv_NVRAM_Write(unsigned char *buffer,unsigned int offset,unsigned int length)
{
	DRV_Error	drv_error;

	drv_error = HMX_UPGRADE_NVRAM_Write(offset, buffer, length);
	if (drv_error != 0)
	{
		return -1;
	}

	return length;
}

/*  *********************************************************************
    *  HMX_NVRAM_FindEnv(name)
    *
    *  Locate an environment variable in the in-memory list
    *
    *  Input parameters:
    *  	   name - name of env var to find
    *
    *  Return value:
    *  	   NVRAM_EVNVAR_T pointer, or NULL if not found
    ********************************************************************* */

static NVRAM_EVNVAR_T *drv_NVRAM_FindEnv(HMX_NVRAM_PARTITION_E partition, const unsigned char *name)
{
    queue_t *qb;
    NVRAM_EVNVAR_T *env;

    for (qb = s_nvram_envvars[partition].q_next; qb != &s_nvram_envvars[partition]; qb = qb->q_next)
    {
		env = (NVRAM_EVNVAR_T *) qb;
		if (strcmp((char*)env->name, (char*)name) == 0)
			break;
	}

    if (qb == &s_nvram_envvars[partition])
    	return NULL;

    return (NVRAM_EVNVAR_T *) qb;

}

/*  *********************************************************************
    *  HMX_NVRAM_ScanDir(idx,name,namelen,val,vallen)
    *
    *  Enumerate environment variables.  This routine locates
    *  the nth environment variable and copies its name and value
    *  to user buffers.
    *
    *  The namelen and vallen variables must be preinitialized to
    *  the maximum size of the output buffer.
    *
    *  Input parameters:
    *  	   idx - variable index to find (starting with zero)
    *  	   name,namelen - name buffer and length
    *  	   val,vallen - value buffer and length
    *
    *  Return value:
    *  	   0 if ok
    *  	   else error code
    ********************************************************************* */

static DRV_Error drv_NVRAM_ScanDir(HMX_NVRAM_PARTITION_E partition, unsigned int idx, unsigned char *name, unsigned int *namelen, unsigned char *val, unsigned int *vallen)
{
	queue_t *qb;
	NVRAM_EVNVAR_T *env;

	for (qb = s_nvram_envvars[partition].q_next; qb != &s_nvram_envvars[partition]; qb = qb->q_next) {
		if (idx == 0)
			break;
		idx--;
	}

	if (qb == &s_nvram_envvars[partition])
	{
		return DRV_ERR;
	}
	env = (NVRAM_EVNVAR_T *) qb;

	if (name != NULL)
	{
		strncpy((char*)name, (char*)env->name, env->nameLen);
		name[env->nameLen] = 0;
	}
	*namelen = env->nameLen;
	if (val != NULL)
	{
		memcpy(val, env->value, env->valueLen);
	}
	*vallen  = env->valueLen;

	return DRV_OK;
}

/*  *********************************************************************
    *  HMX_NVRAM_Delete(name)
    *
    *  Delete an environment variable
    *
    *  Input parameters:
    *  	   name - environment variable to delete
    *
    *  Return value:
    *  	   0 if ok
    *  	   else error code
    ********************************************************************* */

static DRV_Error drv_NVRAM_Delete(HMX_NVRAM_PARTITION_E partition, const unsigned char *name)
{
    NVRAM_EVNVAR_T *env;

    env = drv_NVRAM_FindEnv(partition, name);
    if (env == NULL)
    {
    	return DRV_ERR;
    }

	q_dequeue((queue_t *) env);
	free(env);
	return DRV_OK;
}

/*  *********************************************************************
    *  HMX_NVRAM_GetEnv(name)
    *
    *  Retrieve the value of an environment variable
    *
    *  Input parameters:
    *  	   name - name of environment variable to find
    *
    *  Return value:
    *  	   value, or NULL if variable is not found
    ********************************************************************* */

static DRV_Error drv_NVRAM_GetEnv(HMX_NVRAM_PARTITION_E partition, const unsigned char *name, const unsigned int offset, unsigned char *value, unsigned int readLen)
{
	NVRAM_EVNVAR_T	*env;
	unsigned int	len;

	memset(value, 0, readLen);
	env = drv_NVRAM_FindEnv(partition, name);
	if (env != NULL)
	{
		if (readLen > env->valueLen - offset)
			len = env->valueLen - offset;
		else
			len = readLen;

		memcpy(value, env->value+offset, len);
	}

	return DRV_OK;
}

/*  *********************************************************************
    *  HMX_NVRAM_GetLength(name)
    *
    *  Retrieve the value of an environment variable
    *
    *  Input parameters:
    *  	   name - name of environment variable to find
    *
    *  Return value:
    *  	   value, or NULL if variable is not found
    ********************************************************************* */

static DRV_Error drv_NVRAM_GetLength(HMX_NVRAM_PARTITION_E partition, const unsigned char *name, unsigned int *pLen)
{
	NVRAM_EVNVAR_T	*env;

	env = drv_NVRAM_FindEnv(partition, name);
	if (env != NULL)
	{
		*pLen = env->valueLen;
		return DRV_OK;
	}

	return DRV_ERR_INVALID_PARAMETER;
}

/*  *********************************************************************
    *  HMX_NVRAM_SetEnv(name,value,flags)
    *
    *  Set the value of an environment variable
    *
    *  Input parameters:
    *  	   name - name of variable
    *  	   value - value of variable
    *  	   flags - flags for variable (ENV_FLG_xxx)
    *
    *  Return value:
    *  	   0 if ok
    *  	   else error code
    ********************************************************************* */

static DRV_Error drv_NVRAM_SetEnv(HMX_NVRAM_PARTITION_E partition, const unsigned char *name, unsigned char *value, unsigned int valueLen)
{
	NVRAM_EVNVAR_T *env;
	unsigned int namelen;

	env = drv_NVRAM_FindEnv(partition, name);
	if (env)
	{
		q_dequeue((queue_t *) env);
		free(env);
	}

	namelen = strlen((char*)name);
	env = malloc(sizeof(NVRAM_EVNVAR_T) + namelen + 1 + valueLen);
	if (!env)
	{
		return DRV_ERR_OUTOFMEMORY;
	}
	env->name = (unsigned char *) (env+1);
	env->value = env->name + namelen + 1;
	env->nameLen = namelen;
	env->valueLen = valueLen;
	env->recLen = (NVRAM_NAME_LENG_LEN + namelen + NVRAM_DATA_LENG_LEN + valueLen);

	strncpy((char*)env->name, (char*)name, namelen);
	env->name[namelen] = 0;
	memcpy(env->value, value, valueLen);

	q_enqueue(&s_nvram_envvars[partition],(queue_t *) env);

	return DRV_OK;
}


/*  *********************************************************************
    *  HMX_NVRAM_Load()
    *
    *  Load the environment from the NVRAM device.
    *
    *  Input parameters:
    *  	   nothing
    *
    *  Return value:
    *  	   0 if ok
    *  	   else error code
    ********************************************************************* */


static DRV_Error drv_NVRAM_LoadByAddress(HMX_NVRAM_PARTITION_E partition, unsigned int address, unsigned int size)
{
	unsigned int nvram_size;
	unsigned char *buffer;
	unsigned char *ptr;
	unsigned int recLen;
	unsigned int recType;
	unsigned int offset;
	unsigned int retval;
	unsigned char fileName[MAX_NAME_LEN];
	unsigned char nameLen;
	unsigned int dataLen;

    nvram_size = size;
    buffer = malloc(MAX_FIELD_LEN);
    if (buffer == NULL)
    {
    	return DRV_ERR_OUTOFMEMORY;
    }

    ptr = buffer;
    offset = 0;

    retval = DRV_OK;
    /* Read the record type and length */
    if (drv_NVRAM_Read(ptr,offset+address,NVRAM_TYPE_LEN) != NVRAM_TYPE_LEN)
    {
		retval = DRV_ERR_EXTERNAL_ERROR;
		goto error;
	}

    while ((*ptr != NVRAM_TLV_TYPE_END)  && (nvram_size > NVRAM_TYPE_LEN))
    {
		/* Adjust pointer for TLV type */
		recType = get8bit(ptr);
		nvram_size -= NVRAM_TYPE_LEN;
		offset += NVRAM_TYPE_LEN;

		if (recType != NVRAM_TLV_TYPE_ENV)
		{
			retval = DRV_ERR_EVENT_INITIALIZATION;
			goto error;
		}

		/* Read the record type and length - 16 bits, MSB first */
		if (drv_NVRAM_Read(ptr, offset+address, NVRAM_RECORD_LENG_LEN) != NVRAM_RECORD_LENG_LEN)
		{
			retval = DRV_ERR_EXTERNAL_ERROR;
			goto error;
		}
		recLen = get32bit(ptr);
		nvram_size -= NVRAM_RECORD_LENG_LEN;
		offset += NVRAM_RECORD_LENG_LEN;

		if (recLen > MAX_FIELD_LEN)
		{
			retval = DRV_ERR_EVENT_INITIALIZATION;
			goto error;
		}
		if (recLen > nvram_size)
		{
			retval = DRV_ERR_EVENT_INITIALIZATION;
			goto error; /* should not happen, bad NVRAM */
		}

		/* Read the TLV data */
		if (drv_NVRAM_Read(ptr,offset+address,recLen) != (int)recLen)
		{
			retval = DRV_ERR_EXTERNAL_ERROR;
			goto error;
		}

		nameLen = get8bit(ptr);
		ptr += NVRAM_NAME_LENG_LEN;
		if (nameLen)
		{
		    memcpy(fileName, ptr, nameLen);
		}
		fileName[nameLen] = 0;
		ptr += nameLen;

		dataLen = get32bit(ptr);
		ptr += NVRAM_DATA_LENG_LEN;
		if (dataLen > MAX_DATA_LEN)
		{
			retval = DRV_ERR_EVENT_INITIALIZATION;
			goto error;
		}

		if (recLen != (NVRAM_NAME_LENG_LEN + nameLen + NVRAM_DATA_LENG_LEN + dataLen))
		{
			retval = DRV_ERR_EVENT_INITIALIZATION;
			goto error;
		}

		drv_NVRAM_SetEnv(partition, fileName, ptr, dataLen);

		nvram_size -= (unsigned int)recLen;
		offset += recLen;

		/* Read the next record type */
		ptr = buffer;
		if (drv_NVRAM_Read(ptr,offset+address, NVRAM_TYPE_LEN) != NVRAM_TYPE_LEN)
		{
			retval = DRV_ERR_EXTERNAL_ERROR;
			goto error;
		}
	}

error:
    free(buffer);

    return retval;

}

static DRV_Error drv_NVRAM_Load(HMX_NVRAM_PARTITION_E partition)
{
	DRV_Error	drv_error;

	drv_error  = drv_NVRAM_LoadByAddress(partition, s_nvram_offset[partition], s_nvram_size[partition]);
	if (drv_error != DRV_OK)
	{
		DEBUG_ERR("[HMX_NVRAM_Load] error(%d) loading partition (%d)\n", drv_error, partition);
		if (s_nvram_backup_offset[partition] != 0)
		{
			drv_error  = drv_NVRAM_LoadByAddress(partition, s_nvram_backup_offset[partition], s_nvram_size[partition]);
			if (drv_error != DRV_OK)
			{
				DEBUG_ERR("[HMX_NVRAM_Load] error(%d) loading backup partition (%d)\n", drv_error, partition);
			}
			else
			{
				DEBUG_INFO("[HMX_NVRAM_Load] load OK loading backup partition (%d)\n", partition);
			}
		}
	}
	return drv_error;
}

/*  *********************************************************************
    *  HMX_NVRAM_Save()
    *
    *  Write the environment to the NVRAM device.
    *
    *  Input parameters:
    *  	   nothing
    *
    *  Return value:
    *  	   0 if ok, else error code
    ********************************************************************* */

static DRV_Error drv_NVRAM_Save(HMX_NVRAM_PARTITION_E partition)
{
    unsigned int nvram_size;
    unsigned char *buffer;
    unsigned char *buffer_end;
    unsigned char *ptr;
    queue_t *qb;
    NVRAM_EVNVAR_T *env;
    unsigned char namelen;
    unsigned int valuelen;
    unsigned int recLen;

    nvram_size = s_nvram_size[partition];
    buffer = malloc(nvram_size);
    if (buffer == NULL)
    {
    	return DRV_ERR_OUTOFMEMORY;
	}
    buffer_end = buffer + nvram_size - 1;

    ptr = buffer;

    for (qb = s_nvram_envvars[partition].q_next; qb != &s_nvram_envvars[partition]; qb = qb->q_next)
    {
		env = (NVRAM_EVNVAR_T *) qb;

		namelen = env->nameLen;
		valuelen = env->valueLen;
		recLen = env->recLen;

		if ((ptr + NVRAM_TYPE_LEN + NVRAM_RECORD_LENG_LEN + recLen) > buffer_end)
		{
			break;
		}

		*ptr++ = NVRAM_TLV_TYPE_ENV;		/* TLV record type */

		*ptr++ = (recLen>>24) & 0xFF;			/* TLV record length */
		*ptr++ = (recLen>>16) & 0xFF;			/* TLV record length */
		*ptr++ = (recLen>>8) & 0xFF;			/* TLV record length */
		*ptr++ = (recLen>>0) & 0xFF;			/* TLV record length */

		*ptr++ = (namelen>>0) & 0xFF;			/* NAME record length */

		memcpy(ptr, env->name, namelen);		/* NAME record data */
		ptr += namelen;

		*ptr++ = (valuelen>>24) & 0xFF;			/* VALUE record length */
		*ptr++ = (valuelen>>16) & 0xFF;			/* VALUE record length */
		*ptr++ = (valuelen>>8) & 0xFF;			/* VALUE record length */
		*ptr++ = (valuelen>>0) & 0xFF;			/* VALUE record length */

		memcpy(ptr,env->value, valuelen);
		ptr += valuelen;

	}

    *ptr++ = NVRAM_TLV_TYPE_END;

    nvram_size = drv_NVRAM_Write(buffer,0+s_nvram_offset[partition],ptr-buffer);
	if (s_nvram_backup_offset[partition] != 0)
	{
		drv_NVRAM_Write(buffer,0+s_nvram_backup_offset[partition],ptr-buffer);
	}

    free(buffer);

    return (nvram_size == (unsigned int)(ptr-buffer)) ? DRV_OK : DRV_ERR_EXTERNAL_ERROR;
}

static unsigned int NVRAM_SWAP32(unsigned int A)
{
	return ((A << 24) | ((A << 8) &  0xFF0000) | ((A >> 8) &  0xFF00) |(A >> 24));
}

static unsigned long s_nvramSema;

static DRV_Error drv_NVRAM_GetFieldInfo(const NVRAM_FIELD_T type, HMX_NVRAM_PARTITION_E *pPartition, unsigned char *pszFileName, unsigned int *defaultSize)
{
	int	i;

	SEM_Get(s_nvramSema);
	for (i=0;;i++)
	{
		if (NVRAM_FIELD_DUMMY == s_nvramFieldInfo[i].type)
			break;
		if (type != s_nvramFieldInfo[i].type)
			continue;
		strncpy((char*)pszFileName, (char*)(s_nvramFieldInfo[i].szFileName), MAX_NVRAM_FILENAME_LENGTH);
		*pPartition = s_nvramFieldInfo[i].storePartition;
		*defaultSize = s_nvramFieldInfo[i].defaultSize;
		SEM_Release(s_nvramSema);
		return DRV_OK;
	}
	SEM_Release(s_nvramSema);
	return 1;
}


DRV_Error	HMX_NVRAM_Init(void)
{
	drv_NVRAM_Load(HMX_NVRAM_PARTITION_RO);
	drv_NVRAM_Load(HMX_NVRAM_PARTITION_RW);
	return DRV_OK;
}

DRV_Error	HMX_NVRAM_Write(HMX_NVRAM_PARTITION_E partition, unsigned char *pName, unsigned int offset, unsigned char *pValue, unsigned int ulSize)
{
	DRV_Error	drv_error;

	UNUSED(offset);

	SEM_Get(s_nvramSema);
	drv_error = drv_NVRAM_SetEnv(partition, pName, pValue, ulSize);
	drv_error = drv_NVRAM_Save(partition);
	SEM_Release(s_nvramSema);
	return drv_error;
}

DRV_Error	HMX_NVRAM_Read(HMX_NVRAM_PARTITION_E partition, unsigned char *pName, unsigned int offset, unsigned char *pValue, unsigned int ulSize)
{
	DRV_Error	drv_error;

	SEM_Get(s_nvramSema);
	memset(pValue, 0, ulSize);
	drv_error = drv_NVRAM_GetEnv(partition, pName, offset, pValue, ulSize);
	SEM_Release(s_nvramSema);
	return drv_error;
}

DRV_Error HMX_NVRAM_GetField(NVRAM_FIELD_T field, unsigned int offset, void *data, int nDataSize)
{
	DRV_Error errCode = DRV_ERR;
	unsigned char		szFileName[MAX_NVRAM_FILENAME_LENGTH];
	HMX_NVRAM_PARTITION_E partition;
	int					nvramHandle;
	unsigned int				defaultSize;

	if( data == NULL || field == NVRAM_FIELD_DUMMY )
	{
		return 2;
	}

	errCode = drv_NVRAM_GetFieldInfo(field, &partition, szFileName, &defaultSize);
	if (errCode != DRV_OK)
	{
		DEBUG_ERR("[HMX_NVRAM_GetField] field(%d) error(%08X) : HMX_NVRAM_GetFieldInfo\n", field, errCode);
		return errCode;
	}

	switch (partition)
	{
	case HMX_NVRAM_PARTITION_W_RAWFS :
		break;
	case HMX_NVRAM_PARTITION_RO :
	case HMX_NVRAM_PARTITION_RW :
		if (defaultSize == 0)
		{
			errCode = HMX_NVRAM_Read(partition, szFileName, offset, data, nDataSize);
			if (errCode != DRV_OK)
			{
				DEBUG_ERR("[HMX_NVRAM_GetField] field(%d)-%s error(%08X) : HMX_NVRAM_Read\n", field, szFileName, errCode);
				return errCode;
			}
			if (field == NVRAM_FIELD_SYSTEM_ID && errCode == 0)
			{
				*((unsigned int*)data) = NVRAM_SWAP32((unsigned int)*(unsigned int*)data);
			}
		}
		else
		{
			unsigned char *pBuf;

			pBuf = malloc(defaultSize);
			if (pBuf == NULL)
			{
				DEBUG_ERR("[HMX_NVRAM_GetField] malloc\n");
				return 3;
			}
			errCode = HMX_NVRAM_Read(partition, szFileName, 0, pBuf, defaultSize);
			if (errCode != DRV_OK)
			{
				memset(pBuf, 0, defaultSize);
			}
			memcpy(data, pBuf + offset, nDataSize);
			free(pBuf);
		}
		break;
	default :
		DEBUG_ERR("[HMX_NVRAM_GetField] DI_ERR_INVALID_PARAM field(%d)-%s error(%08X) : HMX_NVRAM_Write\n", field, szFileName, errCode);
		return 2;
	}

	return errCode;
}

DRV_Error HMX_NVRAM_SetField(NVRAM_FIELD_T field, unsigned int offset, void *data, int nDataSize)
{
	DRV_Error errCode = DRV_ERR;
	unsigned char		szFileName[MAX_NVRAM_FILENAME_LENGTH];
	HMX_NVRAM_PARTITION_E partition;
	int					nvramHandle;
	unsigned int				defaultSize;
	unsigned char				*pBuf;
	unsigned int				systemId;

	if( data == NULL || field == NVRAM_FIELD_DUMMY )
	{
		return 2;
	}

	pBuf = malloc(nDataSize);
	if (pBuf == NULL)
	{
		return 5;
	}

	errCode = HMX_NVRAM_GetField(field, offset, pBuf, nDataSize);
	if (errCode == DRV_OK)
	{
		if (memcmp(pBuf, data, nDataSize) == 0)
		{
			free(pBuf);
			return 0;
		}
	}
	free(pBuf);

	errCode = drv_NVRAM_GetFieldInfo(field, &partition, szFileName, &defaultSize);
	if (errCode != DRV_OK)
	{
		DEBUG_ERR("[HMX_NVRAM_SetField] error(%08X) : HMX_NVRAM_GetFieldInfo, field (%d)\n", errCode, field);
		return errCode;
	}

	switch (partition)
	{
	case HMX_NVRAM_PARTITION_W_RAWFS :
		errCode = DRV_NANDFLASH_GetNvramHandle(&nvramHandle);
		if (errCode != DRV_OK)
		{
			return errCode;
		}

		errCode = DRV_FLASH_Write(s_nvram_offset[HMX_NVRAM_PARTITION_W_RAWFS] + offset, data, nDataSize);
		if (errCode != DRV_OK)
		{
			DEBUG_ERR("[HMX_NVRAM_SetField] field(%d)-%s error(%08X) : HMX_NVRAM_Write\n", field, szFileName, errCode);
			return errCode;
		}
		break;
	case HMX_NVRAM_PARTITION_RO :
	case HMX_NVRAM_PARTITION_RW :
		if (defaultSize == 0)
		{
			if (field == NVRAM_FIELD_SYSTEM_ID && errCode == 0)
			{
				systemId = NVRAM_SWAP32((unsigned int)*(unsigned int*)data);
				data = (void*)&systemId;
			}
			errCode = HMX_NVRAM_Write(partition, szFileName, 0, data, nDataSize);
			if (errCode != DRV_OK)
			{
				DEBUG_ERR("[HMX_NVRAM_SetField] field(%d)-%s error(%08X) : HMX_NVRAM_Write\n", field, szFileName, errCode);
				return errCode;
			}
		}
		else
		{
			unsigned char *pBuf;

			pBuf = malloc(defaultSize);
			if (pBuf == NULL)
			{
				DEBUG_ERR("[HMX_NVRAM_SetField] malloc\n");
				return 3;
			}
			errCode = HMX_NVRAM_Read(partition, szFileName, 0, pBuf, defaultSize);
			if (errCode != DRV_OK)
			{
				memset(pBuf, 0, defaultSize);
			}
			memcpy(pBuf + offset, data, nDataSize);

			errCode = HMX_NVRAM_Write(partition, szFileName, 0, pBuf, defaultSize);
			free(pBuf);
			if (errCode != DRV_OK)
			{
				DEBUG_ERR("[HMX_NVRAM_SetField] field(%d)-%s error(%08X) : HMX_NVRAM_Write\n", field, szFileName, errCode);
				return errCode;
			}
		}
		break;
	default :
		DEBUG_ERR("[HMX_NVRAM_SetField] DI_ERR_INVALID_PARAM field(%d)-%s error(%08X) : HMX_NVRAM_Write\n", field, szFileName, errCode);
		return 1;
	}

	return errCode;
}

DRV_Error HMX_NVRAM_GetLength(NVRAM_FIELD_T field, int *pLen)
{
	DRV_Error errCode = DRV_ERR;
	unsigned char		szFileName[MAX_NVRAM_FILENAME_LENGTH];
	HMX_NVRAM_PARTITION_E partition;
	int					nvramHandle;
	unsigned int				defaultSize;
	unsigned char				*pBuf;

	if( pLen == NULL)
	{
		return 2;
	}

	*pLen = 0;

	errCode = drv_NVRAM_GetFieldInfo(field, &partition, szFileName, &defaultSize);
	if (errCode != DRV_OK)
	{
		DEBUG_ERR("[HMX_NVRAM_GetLength] error(%08X) : HMX_NVRAM_GetFieldInfo, field (%d)\n", errCode, field);
		return errCode;
	}

	errCode = drv_NVRAM_GetLength(partition, szFileName, pLen);

	return DRV_OK;
}

DRV_Error	HMX_NVRAM_Remove(HMX_NVRAM_PARTITION_E partition, unsigned char *pName)
{
	int	result;

	SEM_Get(s_nvramSema);
	result = drv_NVRAM_Delete(partition, pName);
	if (result == 0)
	{
		result = drv_NVRAM_Save(partition);
	}
	SEM_Release(s_nvramSema);
	return result;
}

DRV_Error HMX_NVRAM_Dump(unsigned char* pucBuffer, unsigned int uiLen, unsigned int uiAlign)
{
	unsigned int uiIndex;
	unsigned int skip;

	skip = 1;
	for (uiIndex=0 ; uiIndex<uiLen ; uiIndex++)
	{
		if (uiAlign!=0 && (uiIndex%uiAlign)==0)
		{
			if (skip == 0)
			{
				printf("\n");
			}
			else
				skip = 0;
		}
		printf("%02X ", *(pucBuffer+uiIndex));
	}
	printf("\n");
	return DRV_OK;
}

DRV_Error HMX_NVRAM_Dir(void)
{
    char name[80];
    char *value;
    int nameLen, valueLen;
    int idx;

	value = malloc(MAX_DATA_LEN);
	if (value == NULL)
	{
		return DRV_ERR_OUTOFMEMORY;
	}

	SEM_Get(s_nvramSema);

    printf("ROM Name        Value\n");
    printf("-------------------- --------------------------------------------------\n");

    for (idx=0;;idx++)
	{
		if (drv_NVRAM_ScanDir(HMX_NVRAM_PARTITION_RO, idx, (unsigned char*)name, (unsigned int*)&nameLen, (unsigned char*)value, (unsigned int*)&valueLen) != DRV_OK)
			break;
		printf("%20s ", name);
		(void)HMX_NVRAM_Dump((unsigned char*)value, valueLen, 16);
	}
    printf("-------------------- --------------------------------------------------\n");

    printf("\n");

    printf("Variable Name        Value\n");
    printf("-------------------- --------------------------------------------------\n");

    for (idx=0;;idx++)
	{
		if (drv_NVRAM_ScanDir(HMX_NVRAM_PARTITION_RW, idx, (unsigned char*)name, (unsigned int*)&nameLen, (unsigned char*)value, (unsigned int*)&valueLen) != DRV_OK)
			break;
		printf("%20s ", name);
		(void)HMX_NVRAM_Dump((unsigned char*)value, valueLen, 16);
	}
    printf("-------------------- --------------------------------------------------\n");

	free(value);

	SEM_Release(s_nvramSema);
    return DRV_OK;
}

/*@}*/
