/*------------------------------------------------------------ (C) Copyright [2006-2008] Marvell International Ltd. All Rights Reserved ------------------------------------------------------------*/ //Copyright 2005, Intel Corporation, All rights reserved. /****************************************************************************** * MODULE IMPLEMENTATION FILE ******************************************************************************* * Title: IMEI * * Filename: IMEI.h * * Authors: ashenkal * * Description: IMEI API - Set / Read / Lock IMEI number to / from / in INT_FLASH * * Last Updated: 23/1/2006 * 26/02/2008, yshemla - new design for IMEI management by Shay Shrot: means that * IMEI is now burn to specific location in Flash, and retrieved by OBM * to predefined location in DDR (predefined but still dynamic) * * Notes: ******************************************************************************/ #ifndef _IMEI_H #define _IMEI_H #include "global_types.h" //#if defined(_HERMON_B0_SILICON_) && !defined(INTEL_2CHIP_PLAT_BVD) /* OLD DESIGN */ //#else//(_TAVOR_HARBELL_) && TTC #define IMEI_NEW_DESIGN // comment this for SW that doesn't support new IMEI design // new design for IMEI management by Shay Shrot: means that // IMEI is now burn to specific location in Flash, and retrieved by OBM // to predefined location in DDR //#endif//_HERMON_B0_SILICON_ #if defined IMEI_NEW_DESIGN /******************************************************************************** \* IMEISV format (16 numbers) - : * Manufacturer Code Platform Code SV Code * digits[0]... digits[7] digits[8]... digits[13] digits[14] digits[15] * * Generic Format (support only IMEISV) as returned in IMEIRead : * * digits[0] : first char (MSB) in Manufacturer Code * digits[7] : last char (LSB) in Manufacturer Code * digits[8] : first char (MSB) in Platform Code * digits[13] : last char (LSB) in Platform Code * digits[14] : first char (MSB) in SV Code * digits[15] : last char (MSB) in SV Code * ******************************************************************************/ #define IMEI_DEFAULT_NUMBER "0010680000000000" #define IMEI_TOTAL_LEN 15 #define IMEI_LEN 14 #define IMEI_NUMBER_SIZE 16 // 16 bytes #define USER_DATA_SIZE 16 // 16 bytes #define IMEI_SUB_KEY_SIZE 26 // Longs == 104 bytes #define IMEI_USER_KEY_SIZE 26 // Longs == 104 bytes typedef enum { IMEI_IS_NOT_ENC = 0, IMEI_IS_ENC } IMEI_DEC_ENC; typedef struct { char digits[16]; } IMEIData; typedef enum { IMEI_RC_OK = 0, IMEI_RC_LOCKED, IMEI_RC_FLASH_BUSY, IMEI_RC_RW_NO_SUPPORT, IMEI_RC_VALUE_ERR, IMEI_RC_PROGRAM_ERR, IMEI_RC_VPP_LOW_ERR, IMEI_RC_FPR_MODIFIED_WARN } IMEI_ReturnCode; typedef struct { unsigned char DeycrptNumber[IMEI_NUMBER_SIZE]; unsigned char UserData[USER_DATA_SIZE]; unsigned char EncryptNumber[IMEI_NUMBER_SIZE]; unsigned long UserKey[IMEI_USER_KEY_SIZE]; // 104 bytes unsigned long SubKey[IMEI_SUB_KEY_SIZE]; // 104 bytes unsigned char ImeiEncrypt; /* this will be set to 'IMEI_IS_ENC' in case the EncryptNumber * is valid */ } IMEIExtendedData; typedef struct { // CD = Check Digit , SV = Software Version // IMEI(14 digits)+ CD(1 digit), SV(2 digits) char imei_digits[16]; char sv_digits[3]; } IMEIStr; void IMEIinit(unsigned long *ddrBuffaddr); void IMEIExtendedInit(unsigned long *ddrBuffaddr); IMEI_ReturnCode IMEIRead( IMEIData *imei); // PS calls this API with pointer to struct of size 9 void IMEIReadOnly( const IMEIData **imei); void IMEIExtendedRead( const IMEIExtendedData **ext_imei); void IMEIReadStr( IMEIStr* imeiStr ); BOOL IMEIIsDefaultNumber ( void ); void IMEI2init(unsigned long *ddrBuffaddr); void IMEI2ExtendedInit(unsigned long *ddrBuffaddr); IMEI_ReturnCode IMEI2Read( IMEIData *imei); // PS calls this API with pointer to struct of size 9 void IMEI2ReadOnly( const IMEIData **imei); void IMEI2ExtendedRead( const IMEIExtendedData **ext_imei); void IMEI2ReadStr( IMEIStr* imeiStr ); BOOL IMEI2IsDefaultNumber ( void ); #else /* IMEI_NEW_DESIGN */ //compile flags: #define IMEI_DEBUG_ENABLED //#define HEXA_DIGITS_ENABLED #define IMEI_ICAT_ENABLED #define MC_INTEL 0x89 #define INT_FLASH_ADDR 0x80000000 #define EXT_FLASH_ADDR 0x04000000 #define TETON_FLASH_ID 0x27 #define TETON_FLASH_FPR_OFFSET 0x80 #define TETON_FLASH_FPR_BITS 64 #define TETON_FLASH_FAC_ID_SIZE 4 #define FPR_LOCK_BIT_MASK 0x0002 typedef struct { unsigned int *baseFlashAddr; // unsigned int offset; //of FPR lock register from base address of flash. unsigned int facIdSize; //in words unsigned int fprSize; //in bits unsigned char imeiLength; // in digits } FPRData; typedef enum { FPR_INT_FLASH = 0, FPR_EXT_FLASH, FPR_FDI } FlashLoc; typedef enum { IMEI_RC_OK = 0, IMEI_RC_LOCKED, IMEI_RC_FLASH_BUSY, IMEI_RC_RW_NO_SUPPORT, IMEI_RC_VALUE_ERR, IMEI_RC_PROGRAM_ERR, IMEI_RC_VPP_LOW_ERR, IMEI_RC_FPR_MODIFIED_WARN } IMEI_ReturnCode; unsigned short FPRInit (FlashLoc flashPick); IMEI_ReturnCode IMEIInit (FlashLoc flashPick, unsigned char imeiLength); IMEI_ReturnCode IMEIWrite (char *imei); void IMEIRead (char* imei); IMEI_ReturnCode FPRWrite (FlashLoc flashPick, unsigned char* valPtr, unsigned char highWrBit, unsigned char lowWrBit); void FPRRead (FlashLoc flashPick, unsigned char* dataBufPtr); IMEI_ReturnCode FPRLock (FlashLoc flashPick); void FacIDRead (FlashLoc flashPick, unsigned short* facId); #endif /* IMEI_NEW_DESIGN */ #endif /* _IMEI_H */