| /** | 
 |  *  | 
 |  * @file      amtnv.c | 
 |  * @brief      | 
 |  *            This file is part of FTM. | 
 |  *            AMTÄ£¿éNV²Ù×÷½Ó¿Ú | 
 |  *             | 
 |  * @details    | 
 |  * @author    Tools Team. | 
 |  * @email      | 
 |  * @copyright Copyright (C) 2013 Sanechips Technology Co., Ltd. | 
 |  * @warning    | 
 |  * @date      2019/02/02 | 
 |  * @version   1.1 | 
 |  * @pre        | 
 |  * @post       | 
 |  *             | 
 |  * @par        | 
 |  * Change History : | 
 |  * --------------------------------------------------------------------------- | 
 |  * date        version  author         description | 
 |  * --------------------------------------------------------------------------- | 
 |  * 2018/04/28  1.0      liu.xin        Create file | 
 |  * 2019/02/02  1.1      jiang.fenglin  ÐÞ¸Ä×¢ÊÍ·½Ê½Îªdoxygen | 
 |  * --------------------------------------------------------------------------- | 
 |  *  | 
 |  *  | 
 |  */ | 
 |  | 
 | #include <stdio.h> | 
 | #include <stdlib.h> | 
 | #include <assert.h> | 
 | #include <errno.h> | 
 | #include <sys/types.h> | 
 | #include <sys/stat.h> | 
 | #include <string.h> | 
 | #include <unistd.h> | 
 | #include "amtnv.h" | 
 | #include "libcpnv.h" | 
 | #include "cfg_api.h" | 
 | #include "NvParam_drv.h" | 
 |  | 
 | /** | 
 |  * È«¾Ö±äÁ¿¶¨Òå | 
 |  */ | 
 |  | 
 | typedef struct | 
 | { | 
 |     UINT32   dwMsgID; | 
 |     UINT32   dwAddress; | 
 |     UINT32   dwSize; | 
 | } T_zAMT_CommNv_Info; | 
 |  | 
 | const T_zAMT_CommNv_Info g_amtCommNvCfg[] = | 
 | { | 
 |     { ABIMEI_NVPARAM,         OS_FLASH_AMT_COMM_RO_IMEI_ADDRESS,        OS_FLASH_AMT_COMM_RO_IMEI_SIZE          }, | 
 |     { ABIMEISV_NVPARAM,       OS_FLASH_AMT_COMM_RO_IMEISV_ADDRESS,      OS_FLASH_AMT_COMM_RO_IMEISV_SIZE        }, | 
 |     { ABBORDNUm_NVPARAM,      OS_FLASH_AMT_COMM_RO_BOARDNNUM_ADDRESS,   OS_FLASH_AMT_COMM_RO_BOARDNNUM_SIZE     }, | 
 |     { ABMSERIALNUM_NVPARAM,   OS_FLASH_AMT_COMM_RO_MSerialNum_ADDRESS,  OS_FLASH_AMT_COMM_RO_MSerialNum_SIZE    }, | 
 |     { ABVALIDFLAG_NVPARAM,    OS_FLASH_AMT_COMM_RO_ValidFlag_ADDRESS,   OS_FLASH_AMT_COMM_RO_ValidFlag_SIZE     }, | 
 |     { ABMAC_INT_NVPARAM,      OS_FLASH_AMT_COMM_RO_InternalMAC_ADDRESS, OS_FLASH_AMT_COMM_RO_InternalMAC_SIZE   }, | 
 |     { ABMAC_EXT_NVPARAM,      OS_FLASH_AMT_COMM_RO_ExternalMAC_ADDRESS, OS_FLASH_AMT_COMM_RO_ExternalMAC_SIZE   }, | 
 |     { ABMAC_WIFI_NVPARAM,     OS_FLASH_AMT_COMM_RO_WIFIMAC_ADDRESS,     OS_FLASH_AMT_COMM_RO_WIFIMAC_SIZE       }, | 
 |     { ABNV_VERSION_NVPARAM,   OS_FLASH_AMT_COMM_RO_NvVersion_ADDRESS,   OS_FLASH_AMT_COMM_RO_NvVersion_SIZE     }, | 
 |     { ABTESTINFO_NVPARAM,     OS_FLASH_AMT_COMM_RO_TestInfo_ADDRESS,    OS_FLASH_AMT_COMM_RO_TestInfo_SIZE      }, | 
 |     { ABSOFTVERSION_NVPARAM,  OS_FLASH_AMT_COMM_RO_SOFTVERSION_ADDRESS, OS_FLASH_AMT_COMM_RO_SOFTVERSION_SIZE   }, | 
 |     { ABNET_V4KEY_NVPARAM,    OS_FLASH_AMT_COMM_RO_V4Key_ADDRESS,       OS_FLASH_AMT_COMM_RO_V4Key_SIZE         }, | 
 |     { ABSALE_STATE_NVPARAM,   OS_FLASH_AMT_COMM_RO_SaleState_ADDRESS,   OS_FLASH_AMT_COMM_RO_SaleState_SIZE     }, | 
 |     { ABBANDBITMAP_NVPARAM,   OS_FLASH_AMT_COMM_RO_BANDBITMAP_ADDRESS,  OS_FLASH_AMT_COMM_RO_BANDBITMAP_SIZE    }, | 
 |     { ABMAC_ETH_NVPARAM,      OS_FLASH_AMT_COMM_RO_ETHMAC_ADDRESS,      OS_FLASH_AMT_COMM_RO_ETHMAC_SIZE        }, | 
 |     { ABNET_LCOKKEY_NVPARAM,  OS_FLASH_AMT_COMM_RO_LockKey_ADDRESS,     OS_FLASH_AMT_COMM_RO_LockKey_SIZE       }, | 
 |     { ABMAC_WIFI2_NVPARAM,    OS_FLASH_AMT_COMM_RO_WIFIMAC2_ADDRESS,    OS_FLASH_AMT_COMM_RO_WIFIMAC2_SIZE      }, | 
 |     { ABMAC_USBMAC_NVPARAM,   OS_FLASH_AMT_COMM_RO_USBMAC_ADDRESS,      OS_FLASH_AMT_COMM_RO_USBMAC_SIZE        }, | 
 |     { ABMAC_GMAC_NVPARAM,     OS_FLASH_AMT_COMM_RO_GMAC_ADDRESS,        OS_FLASH_AMT_COMM_RO_GMAC_SIZE          }, | 
 |     { ABFEATURE_KEY_MD5_NVPARAM,	  OS_FLASH_AMT_COMM_RO_FEATURE_KEY_MD5_ADDRESS,	OS_FLASH_AMT_COMM_RO_FEATURE_KEY_MD5_SIZE}, | 
 |     { ABAUTH_KEY_NVPARAM,     OS_FLASH_AMT_COMM_RO_AUTH_KEY_ADDRESS,        OS_FLASH_AMT_COMM_RO_AUTH_KEY_SIZE  }, | 
 |     { ABSOFTDOG_CIPHER_TEXT_NVPARAM,     OS_FLASH_AMT_COMM_RO_SOFTDOG_CIPHER_TEXT_ADDRESS,   OS_FLASH_AMT_COMM_RO_SOFTDOG_CIPHER_TEXT_SIZE  }, | 
 |     { ABGBDATA_NVPARAM,       OS_FLASH_AMT_COMM_RO_GBDATA_ADDRESS,      OS_FLASH_AMT_COMM_RO_GBDATA_SIZE        }, | 
 | }; | 
 |  | 
 | SINT32 GetBitOffset(SINT32 testItem) | 
 | { | 
 |     return 2 * (3 - (testItem % 4)); | 
 | } | 
 |  | 
 | /** | 
 |  * @brief дnvro | 
 |  * @param dwStart nvÆðʼµØÖ·Æ«ÒÆ,0 ~ 2M-1 bytes | 
 |  * @param dwLen nv³¤¶È,1 ~ 2M bytes | 
 |  * @param from ´ýдÈëµÄÊý¾Ý | 
 |  * @return 0 ³É¹¦   | 
 |  * @return -1 ʧ°Ü | 
 |  * @note    | 
 |  * @warning  | 
 |  */ | 
 | unsigned int amt_nvro_write(unsigned int dwStart, unsigned int dwLen, unsigned char *from) | 
 | { | 
 |     UINT32  retCode = CPNV_ERROR; | 
 |  | 
 |     /*ÕâÀïÊ×Ïȵ÷ÓÃÇý¶¯½Ó¿Ú·Å¿ª¶ÔÖ»¶ÁÇøÓòд²Ù×÷µÄÏÞÖÆ*/ | 
 | 	/*amtģʽÏ£¬zte_amtÓ¦ÓÃÆðÀ´Ö®ºóÒѾ¹Ò³É¿ÉдµÄÁË*/ | 
 | 	if(!is_amt_mode())  | 
 | 	{ | 
 | 	    retCode = cpnv_ChangeFsPartitionAttr(FS_NVROFS, 1); | 
 | 	    if(CPNV_OK != retCode) | 
 | 	    { | 
 | 	        return retCode; | 
 | 	    } | 
 | 	} | 
 |  | 
 |     retCode = cpnv_NvItemWriteNvro(dwStart, from, dwLen); | 
 |     if(CPNV_OK != retCode) | 
 |     { | 
 |         return retCode; | 
 |     } | 
 |  | 
 |     cpnv_FsGcWait(FS_NVROFS); | 
 | 	if(!is_amt_mode())  | 
 | 	{ | 
 | 	    retCode = cpnv_ChangeFsPartitionAttr(FS_NVROFS, 0); | 
 | 	    if(CPNV_OK != retCode) | 
 | 	    { | 
 | 	        return retCode; | 
 | 	    } | 
 | 	} | 
 | 	return retCode; | 
 | } | 
 |  | 
 | /** | 
 |  * @brief ¶Ánvro | 
 |  * @param dwStart nvÆðʼµØÖ·Æ«ÒÆ,0 ~ 2M-1 bytes | 
 |  * @param dwLen nv³¤¶È,1 ~ 2M bytes | 
 |  * @param to ¶Á³öµÄÊý¾Ý | 
 |  * @return 0 ³É¹¦   | 
 |  * @return -1 ʧ°Ü | 
 |  * @note    | 
 |  * @warning  | 
 |  */ | 
 | unsigned int amt_nvro_read(unsigned int dwStart, unsigned int dwLen, unsigned char *to) | 
 | { | 
 |     unsigned int ret = CPNV_ERROR; | 
 |     unsigned int max_length = OS_FLASH_RO_NVRAM_SIZE + OS_FLASH_ROW_NVRAM_SIZE; | 
 |      | 
 |     if (dwStart >= max_length || dwLen > max_length || (dwStart + dwLen) > max_length) | 
 |     { | 
 |         return -1; | 
 |     } | 
 |      | 
 |     ret = cpnv_NvItemRead(dwStart, to, dwLen); | 
 |      | 
 |     if(ret ==  CPNV_ERROR) | 
 |     { | 
 |         return -1; | 
 |     } | 
 |     else | 
 |     { | 
 |         return 0; | 
 |     } | 
 |  | 
 | } | 
 |  | 
 | /** | 
 |  * @brief дһÏîNVROÊý¾Ý | 
 |  * @param nvParam ¸ÃNVÏîÀàÐÍ | 
 |  * @param NvItemData ´ýдÈëÊý¾ÝµÄµØÖ· | 
 |  * @param NvItemLen Êý¾Ý³¤¶È | 
 |  * @return 0 ³É¹¦   | 
 |  * @return -1 ʧ°Ü | 
 |  * @note    | 
 |  * @warning  | 
 |  */ | 
 | int  amt_write_nv_item(NvParam_AMT nvParam, UINT8 *NvItemData, UINT32 NvItemLen) | 
 | { | 
 |     UINT32  retCode = CPNV_ERROR; | 
 |     UINT32  i = 0; | 
 |  | 
 |     if (nvParam >= MAXABNVPARAM_NVPARAM || NULL == NvItemData || NvItemLen == 0) | 
 |     { | 
 |         return  -1; | 
 |     } | 
 |  | 
 |     for (i = 0; i < (sizeof(g_amtCommNvCfg) / sizeof (g_amtCommNvCfg[0])); i++) | 
 |     { | 
 |         if ( nvParam == g_amtCommNvCfg[i].dwMsgID ) | 
 |         { | 
 |             if (NvItemLen > g_amtCommNvCfg[i].dwSize) | 
 |             { | 
 |                 NvItemLen = g_amtCommNvCfg[i].dwSize; | 
 |             } | 
 |  | 
 |             retCode = amt_nvro_write(g_amtCommNvCfg[i].dwAddress, NvItemLen, NvItemData); | 
 |  | 
 |             break; | 
 |         } | 
 |     } | 
 |              | 
 |     if (retCode != CPNV_OK) | 
 |     { | 
 |         assert(0); | 
 |     } | 
 |     return  0; | 
 | } | 
 |  | 
 | /** | 
 |  * @brief ¶Á³öÒ»ÏîNVROÊý¾Ý | 
 |  * @param nvParam  ¸ÃNVÏîÀàÐÍ | 
 |  * @param NvItemData ¶Á³öµÄÊý¾Ý | 
 |  * @param NvItemLen  Êý¾Ý³¤¶È | 
 |  * @return 0 ³É¹¦   | 
 |  * @return -1 ʧ°Ü | 
 |  * @note    | 
 |  * @warning  | 
 |  */ | 
 | int amt_read_nv_item(NvParam_AMT nvParam,UINT8 *NvItemData, UINT32 NvItemLen) | 
 | { | 
 |     UINT32  retCode = CPNV_ERROR; | 
 |     UINT32  i = 0; | 
 |  | 
 |     //  zOss_Printf(0x7f, 0x2,"[zPS_NvAMTItemRead]nvParam is %d and NvItemLen is %d\n",nvParam,NvItemLen); | 
 |     if (nvParam >= MAXABNVPARAM_NVPARAM || NULL == NvItemData || NvItemLen == 0) | 
 |     { | 
 |         return  -1; | 
 |     } | 
 |  | 
 |    /* if (ABBANDBITMAP_NVPARAM == nvParam) | 
 |     { | 
 |         BYTE band_bit_map_flag = 0; | 
 |         zPS_NvAMFlagsTItemRead(BAND_BIT_MAP_FLAG, &band_bit_map_flag); | 
 |  | 
 |         if (band_bit_map_flag != '1') | 
 |         { | 
 |             retCode = zPs_NvCheckBandBitmap(NvItemData, NvItemLen); | 
 |  | 
 |             return retCode; | 
 |         } | 
 |     }*/ | 
 |     for (i = 0; i < (sizeof(g_amtCommNvCfg) / sizeof (g_amtCommNvCfg[0])); i++) | 
 |     { | 
 |         if ( nvParam == g_amtCommNvCfg[i].dwMsgID ) | 
 |         { | 
 |             if (NvItemLen > g_amtCommNvCfg[i].dwSize) | 
 |             { | 
 |                 NvItemLen = g_amtCommNvCfg[i].dwSize; | 
 |             } | 
 |             retCode = cpnv_NvItemRead(g_amtCommNvCfg[i].dwAddress, NvItemData, NvItemLen); | 
 |             break;         | 
 |         } | 
 |     } | 
 |     if(retCode == CPNV_ERROR) | 
 |     { | 
 |          return  -1; | 
 |     } | 
 |     else | 
 |     { | 
 |          return  0; | 
 |     } | 
 | } | 
 |  | 
 | /** | 
 |  * @brief дÉú²ú²âÊÔ±ê־λ | 
 |  * @param nvParam  Éú²ú²âÊÔ±ê־λÏîö¾ÙÖµ | 
 |  * @param NvItemData ´ýдÈëÊý¾Ý | 
 |  * @return 0 ³É¹¦   | 
 |  * @return -1 ʧ°Ü | 
 |  * @note    | 
 |  * @warning  | 
 |  */ | 
 | int amt_write_test_flag_item(NvParam_AMTFlags nvParam,UINT8 *NvItemData) | 
 | { | 
 |     UINT32 retCode = CPNV_ERROR; | 
 |     UINT32 AMTFlagAddress = 0; | 
 |     BYTE   pTestInfoBuf[1]; | 
 |     BYTE   *pByte; | 
 |     int byteIndex = 0; | 
 |  | 
 |     if (nvParam >= MAXAMTFALGS_NVPARAM) | 
 |     { | 
 |         return -1; | 
 |     } | 
 |     memset(pTestInfoBuf, 0, sizeof(pTestInfoBuf)); | 
 |     byteIndex = nvParam/4; //ҪдµÄ±ê־λÏà¶ÔÓÚ±ê־λÊ×µØÖ·µÄÆ«ÒÆ | 
 |     AMTFlagAddress = OS_FLASH_AMT_COMM_RO_TestInfo_ADDRESS + byteIndex; | 
 |  | 
 |     /*Ê×ÏȽ«NVÖеÄÄÚÈݶÁµ½pTestInfoBufÖÐ*/ | 
 |     retCode = cpnv_NvItemRead(AMTFlagAddress , pTestInfoBuf,1); | 
 |     if (CPNV_ERROR ==retCode ) | 
 |     { | 
 |        return -1; | 
 |     } | 
 |     /*ÐÞ¸ÄÏàÓ¦µÄ±ê־λ*/ | 
 |     pByte = pTestInfoBuf ; | 
 |     *pByte &= ~(0x03 << GetBitOffset(nvParam)); | 
 |     *pByte |= (*NvItemData-0x30) << GetBitOffset(nvParam); | 
 |      | 
 |  | 
 |     /*ÐÞ¸ÄÖ®ºóдÈë*/ | 
 |     retCode = amt_nvro_write(AMTFlagAddress, 1, pTestInfoBuf); | 
 |  | 
 |     if (CPNV_ERROR ==retCode ) | 
 |     { | 
 |         assert(0); | 
 |     } | 
 |     return  0; | 
 | } | 
 |  | 
 | /** | 
 |  * @brief ¶ÁÉú²ú²âÊÔ±ê־λ | 
 |  * @param nvParam  Éú²ú²âÊÔ±ê־λÏîö¾ÙÖµ | 
 |  * @param NvItemData ¶Á³öµÄÊý¾Ý | 
 |  * @return 0 ³É¹¦   | 
 |  * @return -1 ʧ°Ü | 
 |  * @note    | 
 |  * @warning  | 
 |  */ | 
 | int amt_read_test_flag_item(NvParam_AMTFlags nvParam,UINT8 *NvItemData) | 
 | { | 
 |     UINT32 retCode = CPNV_ERROR; | 
 |     UINT32 AMTFlagAddress = 0; | 
 |     BYTE   pTestInfoBuf[1]; | 
 |     BYTE byteVal = 0; | 
 |     BYTE byteRet = 0; | 
 |     int byteIndex = 0; | 
 |  | 
 |     if (nvParam >= MAXAMTFALGS_NVPARAM) | 
 |     { | 
 |         return -1; | 
 |     } | 
 |      | 
 |     byteIndex = nvParam/4; //Òª¶ÁµÄ±ê־λÏà¶ÔÓÚ±ê־λÊ×µØÖ·µÄÆ«ÒÆ | 
 |     AMTFlagAddress = OS_FLASH_AMT_COMM_RO_TestInfo_ADDRESS + byteIndex; | 
 |     /*Ê×ÏȽ«NVÖеÄÄÚÈݶÁµ½pTestInfoBufÖÐ*/ | 
 |     retCode = cpnv_NvItemRead(AMTFlagAddress,pTestInfoBuf, 1); | 
 |     if (CPNV_ERROR ==retCode ) | 
 |     { | 
 |        return -1; | 
 |     } | 
 |     /*¶ÁÈ¡¶ÔÓ¦µÄbitλ*/ | 
 |    | 
 |     byteVal =( (*pTestInfoBuf ) >> GetBitOffset(nvParam)) & 0x03; | 
 |      | 
 |     switch (byteVal) | 
 |     { | 
 |     case 0: | 
 |         byteRet = 0x30; | 
 |         break; | 
 |     case 1: | 
 |         byteRet = 0x31; | 
 |         break; | 
 |     case 2: | 
 |         byteRet = 0x32; | 
 |         break; | 
 |     case 3: | 
 |         byteRet = 0x33; | 
 |         break; | 
 |     default: | 
 |         break; | 
 |     } | 
 |      | 
 |     memcpy(NvItemData, &byteRet, sizeof(byteRet)); | 
 |     #if 0 | 
 |     if (CPNV_ERROR ==retCode ) | 
 |     { | 
 |         assert(0); | 
 |     } | 
 |     #endif | 
 |     return 0; | 
 | } | 
 |  | 
 | /** | 
 |  * @brief NVROÓû§×Ô¶¨ÒåÇøÓò¶Áº¯Êý | 
 |  * @param dwStart nvÆðʼµØÖ·Æ«ÒÆ,0 ~ 1023 | 
 |  * @param dwLen nv³¤¶È,1 ~ 1024 bytes | 
 |  * @param from ´ýдÈëµÄÊý¾Ý | 
 |  * @return 0 ³É¹¦   | 
 |  * @return -1 ʧ°Ü | 
 |  * @note    | 
 |  * @warning  | 
 |  */ | 
 |  int amt_nvro_user_write(UINT32 dwStart, UINT32 dwLen, UINT8* from) | 
 |  { | 
 |     unsigned int  ret = CPNV_ERROR; | 
 |      | 
 |     if (dwStart >= OS_FLASH_AMT_COMM_RO_USER_DEFINE_SIZE || dwLen > OS_FLASH_AMT_COMM_RO_USER_DEFINE_SIZE || (dwStart + dwLen) > OS_FLASH_AMT_COMM_RO_USER_DEFINE_SIZE) | 
 |     { | 
 |         return -1; | 
 |     } | 
 |  | 
 |     ret = amt_nvro_write(dwStart + OS_FLASH_AMT_COMM_RO_USER_DEFINE_ADDRESS, dwLen, from); | 
 |  | 
 |     cpnv_FsGcWait(FS_NVROFS); | 
 |           | 
 |     if(ret == CPNV_ERROR) | 
 |     { | 
 |         return -1; | 
 |     } | 
 |     else | 
 |     { | 
 |         return 0; | 
 |     } | 
 |      | 
 |  } | 
 |  | 
 | /** | 
 |  * @brief NVROÓû§×Ô¶¨ÒåÇøÓòдº¯Êý | 
 |  * @param dwStart nvÆðʼµØÖ·Æ«ÒÆ,0 ~ 1023 | 
 |  * @param dwLen nv³¤¶È,1 ~ 1024 bytes | 
 |  * @param from ¶Á³öµÄÊý¾Ý | 
 |  * @return 0 ³É¹¦   | 
 |  * @return -1 ʧ°Ü | 
 |  * @note    | 
 |  * @warning  | 
 |  */ | 
 | int amt_nvro_user_read(UINT32 dwStart, UINT32 dwLen, UINT8* to) | 
 | { | 
 |     unsigned int ret = CPNV_ERROR; | 
 |      | 
 |     if (dwStart >= OS_FLASH_AMT_COMM_RO_USER_DEFINE_SIZE || dwLen > OS_FLASH_AMT_COMM_RO_USER_DEFINE_SIZE || (dwStart + dwLen) > OS_FLASH_AMT_COMM_RO_USER_DEFINE_SIZE) | 
 |     { | 
 |         return -1; | 
 |     } | 
 |      | 
 |     ret = cpnv_NvItemRead(dwStart + OS_FLASH_AMT_COMM_RO_USER_DEFINE_ADDRESS, to,dwLen); | 
 |      | 
 |     if(ret ==  CPNV_ERROR) | 
 |     { | 
 |         return -1; | 
 |     } | 
 |     else | 
 |     { | 
 |         return 0; | 
 |     } | 
 | } | 
 |  | 
 | /** | 
 |  * @brief NVRO²Î¿¼Éè¼Æ×Ô¶¨ÒåÇøÓòдº¯Êý | 
 |  * @param dwStart nvÆðʼµØÖ·Æ«ÒÆ,0 ~ 1023 | 
 |  * @param dwLen nv³¤¶È,1 ~ 1024 bytes | 
 |  * @param from ´ýдÈëµÄÊý¾Ý | 
 |  * @return 0 ³É¹¦   | 
 |  * @return -1 ʧ°Ü | 
 |  * @note    | 
 |  * @warning  | 
 |  */ | 
 | int amt_nvro_ref_write(UINT32 dwStart, UINT32 dwLen, UINT8* from) | 
 | { | 
 |     unsigned int ret = CPNV_ERROR; | 
 |      | 
 |     if (dwStart >= OS_FLASH_AMT_COMM_RO_REF_DEFINE_SIZE || dwLen > OS_FLASH_AMT_COMM_RO_REF_DEFINE_SIZE || (dwStart + dwLen) > OS_FLASH_AMT_COMM_RO_REF_DEFINE_SIZE) | 
 |     { | 
 |         return -1; | 
 |     } | 
 |  | 
 |     ret = amt_nvro_write(dwStart + OS_FLASH_AMT_COMM_RO_REF_DEFINE_ADDRESS, dwLen, from); | 
 |      | 
 |     if(ret ==  CPNV_ERROR) | 
 |     { | 
 |         return -1; | 
 |     } | 
 |     else | 
 |     { | 
 |         return 0; | 
 |     } | 
 | } | 
 |  | 
 | /** | 
 |  * @brief NVRO²Î¿¼Éè¼Æ×Ô¶¨ÒåÇøÓò¶Áº¯Êý | 
 |  * @param dwStart nvÆðʼµØÖ·Æ«ÒÆ,0 ~ 1023 | 
 |  * @param dwLen nv³¤¶È,1 ~ 1024 bytes | 
 |  * @param to ¶Á³öµÄÊý¾Ý | 
 |  * @return 0 ³É¹¦   | 
 |  * @return -1 ʧ°Ü | 
 |  * @note    | 
 |  * @warning  | 
 |  */ | 
 | int amt_nvro_ref_read(UINT32 dwStart, UINT32 dwLen, UINT8* to) | 
 | { | 
 |     unsigned int  ret = CPNV_ERROR; | 
 |      | 
 |     if (dwStart >= OS_FLASH_AMT_COMM_RO_REF_DEFINE_SIZE || dwLen > OS_FLASH_AMT_COMM_RO_REF_DEFINE_SIZE || (dwStart + dwLen) > OS_FLASH_AMT_COMM_RO_REF_DEFINE_SIZE) | 
 |     { | 
 |         return -1; | 
 |     } | 
 |      | 
 |     ret = cpnv_NvItemRead(dwStart + OS_FLASH_AMT_COMM_RO_REF_DEFINE_ADDRESS, to,dwLen); | 
 |      | 
 |     if(ret ==  CPNV_ERROR) | 
 |     { | 
 |         return -1; | 
 |     } | 
 |     else | 
 |     { | 
 |         return 0; | 
 |     } | 
 | } | 
 |  | 
 |  | 
 |  /** | 
 |  * @brief Ó¦ÓòãÅжϵ±Ç°ÊÇ·ñÊÇamtģʽ | 
 |  * @param  | 
 |  * @return 1 amtģʽ | 
 |  * @return 0 normalģʽ | 
 |  * @note    | 
 |  * @warning  | 
 |  */ | 
 | int is_amt_mode(void) | 
 | { | 
 |     char verMode[4] = {0}; | 
 |     int ret = 0; | 
 |  | 
 |     ret = sc_cfg_get("ver_mode", verMode, sizeof(verMode)); | 
 |     if(!strncmp(verMode, "0", strlen("0"))) | 
 |     { | 
 |         ret = 1; | 
 |     } | 
 |     else | 
 |     { | 
 |         ret = 0; | 
 |     } | 
 | 	 | 
 | 	return ret; | 
 | } | 
 |  | 
 | /** | 
 |  * @brief ÉèÖÃbootÆô¶¯Ä£Ê½ | 
 |  * @param bootmode 2¸ö×ֽڵıêʶ:  | 
 |  *              {0x54,0x00} : user, | 
 |  *              {0x54,0x01} : debug, | 
 |  *              {0x54,0x02} : factory, | 
 |  *              {0x54,0x4D} : amt, | 
 |  * @return 0 ³É¹¦   | 
 |  * @return -1 ʧ°Ü | 
 |  * @note    | 
 |  * @warning  | 
 |  */ | 
 | unsigned int amt_set_bootmode(unsigned char  bootmode[]) | 
 | { | 
 |     unsigned int  ret = CPNV_OK; | 
 |  | 
 |     if(CPNV_ERROR == cpnv_ChangeFsPartitionAttr(FS_IMAGEFS, 1)) | 
 |     { | 
 |         printf("cpnv_ChangeFsPartitionAttr failed\r\n"); | 
 |         return -1; | 
 |     } | 
 |     ret = cpnv_NvItemWrite(OS_FLASH_TSP_RW_NONFAC_OFFSET_FROM_NV, bootmode, 2); | 
 |     if(CPNV_ERROR == ret) | 
 |     { | 
 |         printf("cpnv_NvItemWrite bootmode fail !\n"); | 
 |         return ret; | 
 |     } | 
 |      | 
 |     cpnv_NvItemWriteFactory(OS_FLASH_TSP_RW_NONFAC_OFFSET_FROM_NV, bootmode, 2); | 
 |     ret = cpnv_NvramFlush(); | 
 |     if(CPNV_ERROR == ret) | 
 |     { | 
 |         printf("cpnv_NvramFlush bootmode fail !\n"); | 
 |     } | 
 |      | 
 |     cpnv_FsGcWait(FS_IMAGEFS); | 
 |     if(CPNV_ERROR == cpnv_ChangeFsPartitionAttr(FS_IMAGEFS, 0)) | 
 |     { | 
 |         printf("cpnv_ChangeFsPartitionAttr failed\r\n"); | 
 |         return -1; | 
 |     } | 
 |  | 
 |     return ret; | 
 | } | 
 |  | 
 | unsigned int amt_set_batdet_flag(int batdet_value) | 
 | { | 
 | 	unsigned int  ret = CPNV_OK; | 
 |  | 
 |     if(CPNV_ERROR == cpnv_ChangeFsPartitionAttr(FS_IMAGEFS, 1)) | 
 |     { | 
 |         printf("cpnv_ChangeFsPartitionAttr failed\r\n"); | 
 |         return -1; | 
 |     } | 
 |     ret = cpnv_NvItemWrite(DRV_PERI_NV_ADDR,(unsigned char*)&batdet_value,1); | 
 |     if(CPNV_ERROR == ret) | 
 |     { | 
 |         printf("cpnv_NvItemWrite batdet_value fail !\n"); | 
 |         return ret; | 
 |     } | 
 |      | 
 |     cpnv_NvItemWriteFactory(DRV_PERI_NV_ADDR, (unsigned char*)&batdet_value,1); | 
 |     ret = cpnv_NvramFlush(); | 
 |     if(CPNV_ERROR == ret) | 
 |     { | 
 |         printf("cpnv_NvramFlush batdet_value fail !\n"); | 
 |     } | 
 |      | 
 |     cpnv_FsGcWait(FS_IMAGEFS); | 
 |     if(CPNV_ERROR == cpnv_ChangeFsPartitionAttr(FS_IMAGEFS, 0)) | 
 |     { | 
 |         printf("cpnv_ChangeFsPartitionAttr failed\r\n"); | 
 |         return -1; | 
 |     } | 
 |  | 
 |     return ret; | 
 | } | 
 |  | 
 | unsigned int amt_get_batdet_flag(int *pbatdet_value) | 
 | { | 
 | 	unsigned int retCode= CPNV_ERROR; | 
 |     | 
 |     retCode =cpnv_NvItemRead(DRV_PERI_NV_ADDR, (unsigned char *)pbatdet_value, 1); | 
 |  | 
 | 	return retCode; | 
 |      | 
 | } | 
 |  | 
 | unsigned int amt_set_amt_atmode(unsigned char  bootmode[],unsigned char  atmode[]) | 
 | { | 
 | 	 unsigned int  ret = CPNV_OK; | 
 |  | 
 |     if(CPNV_ERROR == cpnv_ChangeFsPartitionAttr(FS_IMAGEFS, 1)) | 
 |     { | 
 |         printf("cpnv_ChangeFsPartitionAttr failed\r\n"); | 
 |         return -1; | 
 |     } | 
 |     ret = cpnv_NvItemWrite(OS_FLASH_TSP_RW_NONFAC_OFFSET_FROM_NV, bootmode, 2); | 
 |     if(CPNV_ERROR == ret) | 
 |     { | 
 |         printf("cpnv_NvItemWrite bootmode fail !\n"); | 
 |         return ret; | 
 |     } | 
 |     cpnv_NvItemWriteFactory(OS_FLASH_TSP_RW_NONFAC_OFFSET_FROM_NV, bootmode, 2); | 
 | 	 | 
 |     ret = cpnv_NvItemWrite(OS_FLASH_TSP_RW_NONFAC_AT_MODE_ADDR, atmode, 2); | 
 |     if(CPNV_ERROR == ret) | 
 |     { | 
 |         printf("cpnv_NvItemWrite at mode fail !\n"); | 
 |         return ret; | 
 |     } | 
 |     cpnv_NvItemWriteFactory(OS_FLASH_TSP_RW_NONFAC_AT_MODE_ADDR, atmode, 2); | 
 |     ret = cpnv_NvramFlush(); | 
 |     if(CPNV_ERROR == ret) | 
 |     { | 
 |         printf("cpnv_NvramFlush fail !\n"); | 
 |     } | 
 |      | 
 |     cpnv_FsGcWait(FS_IMAGEFS); | 
 |     if(CPNV_ERROR == cpnv_ChangeFsPartitionAttr(FS_IMAGEFS, 0)) | 
 |     { | 
 |         printf("cpnv_ChangeFsPartitionAttr failed\r\n"); | 
 |         return -1; | 
 |     } | 
 |  | 
 |     return ret; | 
 |  | 
 | } | 
 |  | 
 | unsigned int is_amt_atmode() | 
 | { | 
 | 	unsigned int  ret = CPNV_OK; | 
 | 	unsigned char  mode[4] = {0}; | 
 |  | 
 |     ret = cpnv_NvItemRead(OS_FLASH_TSP_RW_NONFAC_BASE_ADDR, mode, 2); | 
 |     if(CPNV_ERROR == ret) | 
 |     { | 
 |         printf("cpnv_NvItemRead at mode fail !\n"); | 
 |         return ret; | 
 |     } | 
 | 	 | 
 | 	ret = cpnv_NvItemRead(OS_FLASH_TSP_RW_NONFAC_AT_MODE_ADDR, mode+2, 2); | 
 |     if(CPNV_ERROR == ret) | 
 |     { | 
 |         printf("cpnv_NvItemRead at mode fail !\n"); | 
 |         return ret; | 
 |     } | 
 |  | 
 | 	printf("mode[0] = %x,mode[1] = %x,mode[2] = %x,mode[3] = %x!\n",mode[0],mode[1],mode[2],mode[3]); | 
 |  | 
 | 	if((mode[0] == 0x54)&&(mode[1] == 0x4D)&&(mode[2] == 0x41)&&(mode[3] == 0x54)) | 
 | 	{ | 
 | 	    printf("mode = 1\n"); | 
 | 		return 1; | 
 | 	} | 
 | 	else | 
 | 	{ | 
 | 	    printf("mode = 0\n"); | 
 | 		return 0; | 
 | 	} | 
 |  | 
 | } | 
 |  | 
 |  | 
 |  | 
 |  | 
 |  |