# HG changeset patch # User Michael Spacefalcon # Date 1411889245 0 # Node ID b34e5351438e47baca5443ef6dcb6350e7ade61a # Parent 8f9389e59ca2945550ccca65dcb67d2b5107d715 cl_imei.[ch]: revamped for FreeCalypso diff -r 8f9389e59ca2 -r b34e5351438e gsm-fw/comlib/cl_imei.c --- a/gsm-fw/comlib/cl_imei.c Sun Sep 28 05:45:38 2014 +0000 +++ b/gsm-fw/comlib/cl_imei.c Sun Sep 28 07:27:25 2014 +0000 @@ -33,47 +33,33 @@ #ifndef CL_IMEI_C #define CL_IMEI_C +#include "config.h" +#include "fixedconf.h" + #include "typedefs.h" #include "vsi.h" /* to get a lot of macros */ -#ifndef _SIMULATION_ -#include "ffs/ffs.h" -#include "config/chipset.cfg" -#include "config/board.cfg" -#include "memif/mem.h" +#include "../services/ffs/ffs.h" +#include "../bsp/mem.h" #include "pcm.h" -#endif /* ifdef SIMULATION */ #include "cl_imei.h" #include "cl_des.h" #include -#if defined(CL_IMEI_CALYPSO_PLUS_PLATFORM) && defined(FF_PROTECTED_IMEI) -#include "secure_rom/secure_rom.h" -#endif - static UBYTE stored_imei[CL_IMEI_SIZE]; /* when the imei is read once, the value is stored in this buffer */ static UBYTE imei_flag = 0; /* this flag indicates, if IMEI was successful read and is stored in the stored_imei buffer */ -#if !defined (CL_IMEI_CALYPSO_PLUS_PLATFORM) /* Default IMEISV for D-Sample 00440000-350-111-20 */ const UBYTE C_DEFAULT_IMEISV_DSAMPLE[CL_IMEI_SIZE] = {0x00, 0x44, 0x00, 0x00, 0x35, 0x01, 0x11, 0x20}; -#define CL_IMEI_FFS_PATH "/gsm/imei.enc" -#endif /* CL_IMEI_CALYPSO_PLATFORM */ - -#ifdef CL_IMEI_CALYPSO_PLUS_PLATFORM -/* Default IMEISV for E-Sample 00440000-351-222-30 */ -const UBYTE C_DEFAULT_IMEISV_ESAMPLE[CL_IMEI_SIZE] = - {0x00, 0x44, 0x00, 0x00, 0x35, 0x12, 0x22, 0x30}; -#endif /* CL_IMEI_CALYPSO_PLUS_PLATFORM */ +#define CL_IMEI_FFS_PATH "/etc/IMEISV" /*==== FUNCTIONS ==================================================*/ -#ifdef FF_PROTECTED_IMEI -#ifdef CL_IMEI_CALYPSO_PLATFORM +#if CONFIG_TARGET_PIRELLI /* +------------------------------------------------------------------------------ | Function : get_dieID @@ -106,11 +92,13 @@ } } +#if 0 // function for reading from Pirelli's factory block not written yet /* +------------------------------------------------------------------------------ -| Function : ffs_get_imeisv +| Function : pirelli_get_imeisv +------------------------------------------------------------------------------ -| Description : the function reads IMEI from FFS +| Description : This function attempts to read and decrypt a valid IMEISV +| record from Pirelli's factory data block. | | Parameters : inBufSize - size of buffer where to store IMEI, min. 8 BYTE | *outBufPtr - pointer to buffer where to store the IMEI @@ -118,15 +106,14 @@ | <0 - ERROR +------------------------------------------------------------------------------ */ -LOCAL BYTE ffs_get_imeisv (USHORT inBufSize, UBYTE *outBufPtr) +LOCAL BYTE pirelli_get_imeisv (USHORT inBufSize, UBYTE *outBufPtr) { - UBYTE i; UBYTE isdid_buf[CL_IMEI_ISDID_SIZE]; UBYTE r_dieId[CL_DES_KEY_SIZE]; /* read Die ID */ UBYTE d_dieId[CL_DES_KEY_SIZE]; /* deciphered Die ID */ SHORT ret; - TRACE_FUNCTION("ffs_get_imeisv()"); + TRACE_FUNCTION("pirelli_get_imeisv()"); if(inBufSize < CL_IMEI_SIZE){ TRACE_ERROR("CL IMEI ERROR: buffer size for IMEI to short!"); @@ -135,6 +122,7 @@ /* * Read ISDID(enciphered IMEISV+DieID) from FFS. + * TODO: change the code to read from Pirelli's factory data block instead */ if((ret = ffs_file_read(CL_IMEI_FFS_PATH, isdid_buf, CL_IMEI_ISDID_SIZE)) >= EFFS_OK) { @@ -171,107 +159,12 @@ ret = CL_IMEI_READ_IMEI_FAILED; } - return ret; - -}/* ffs_get_imeisv() */ -#endif /* CL_IMEI_CALYPSO_PLATFORM */ - - -#ifdef CL_IMEI_CALYPSO_PLUS_PLATFORM -/* -+------------------------------------------------------------------------------ -| Function : securerom_get_imeisv -+------------------------------------------------------------------------------ -| Description : the function reads IMEI from Secure ROM -| -| Parameters : inBufSize - size of buffer where to store IMEI, min. 8 BYTE -| *outBufPtr - pointer to buffer where to store the IMEI -| Return : 0 - OK -| <0 - ERROR -+------------------------------------------------------------------------------ -*/ -LOCAL BYTE securerom_get_imeisv (USHORT inBufSize, UBYTE *outBufPtr) -{ - BYTE ret; - - TRACE_FUNCTION("securerom_get_imeisv()"); - - if((ret = securerom_drv(inBufSize, outBufPtr)) == CL_IMEI_OK){ - return CL_IMEI_OK; - } else { - return CL_IMEI_READ_IMEI_FAILED; - } -} -#endif /* CL_IMEI_CALYPSO_PLUS_PLATFORM */ + return ret; -/* -+------------------------------------------------------------------------------ -| Function : get_secure_imeisv -+------------------------------------------------------------------------------ -| Description : the function reads IMEI either from FFS or from Secure ROM of -| from other locations depended on hardware platform -| -| Parameters : inBufSize - size of buffer where to store IMEI, min. 8 BYTE -| *outBufPtr - pointer to buffer where to store the IMEI -| Return : 0 - OK -| negative value - ERROR -+------------------------------------------------------------------------------ -*/ -LOCAL BYTE get_secure_imeisv(USHORT inBufSize, UBYTE *outBufPtr) -{ - BYTE ret = 0; - UBYTE chipset = CHIPSET; - UBYTE board = BOARD; - - TRACE_FUNCTION("get_secure_imeisv()"); +}/* pirelli_get_imeisv() */ +#endif /* #if 0 */ +#endif /* CONFIG_TARGET_PIRELLI */ -/* - * SW is running on Calypso platform (D-Sample) - */ -#ifdef CL_IMEI_CALYPSO_PLATFORM - /* - * Read IMEI from FFS inclusive deciphering with DES. - */ - if((ret = ffs_get_imeisv (inBufSize, outBufPtr)) == CL_IMEI_OK) - { - /* store IMEI */ - memcpy(stored_imei, outBufPtr, CL_IMEI_SIZE); - imei_flag = 1; - return CL_IMEI_OK; - } -#else /* CL_IMEI_CALYPSO_PLATFORM */ -/* - * SW is running on Calypso plus platform (E-Sample) - */ -#ifdef CL_IMEI_CALYPSO_PLUS_PLATFORM - if((ret = securerom_get_imeisv (inBufSize, outBufPtr)) == CL_IMEI_OK) - { - /* store IMEI */ - memcpy(stored_imei, outBufPtr, CL_IMEI_SIZE); - imei_flag = 1; - return CL_IMEI_OK; - } -#else /* CL_IMEI_CALYPSO_PLUS_PLATFORM */ -/* - * SW is running on an other platform (neither Calypso nor Calypso plus) - */ -#ifdef CL_IMEI_OTHER_PLATFORM - { - TRACE_EVENT_P2("CL IMEI WARNING: unknown hardware: board=%d, chipset=%d, return default imei", - board, chipset); - memcpy(outBufPtr, C_DEFAULT_IMEISV_DSAMPLE, CL_IMEI_SIZE); - return CL_IMEI_OK; - } -#endif /* CL_IMEI_OTHER_PLATFORM */ -#endif /* CL_IMEI_CALYPSO_PLUS_PLATFORM */ -#endif /* CL_IMEI_CALYPSO_PLATFORM */ - - return ret; /* get_secure_imeisv is failed, return error code */ - -} /* get_secure_imeisv() */ - - -#endif /* FF_PROTECTED_IMEI */ /* +------------------------------------------------------------------------------ @@ -296,16 +189,14 @@ */ extern BYTE cl_get_imeisv(USHORT imeiBufSize, UBYTE *imeiBufPtr, UBYTE imeiType) { - BYTE ret = 0; + USHORT ret; +#if CONFIG_MOKOFFS + UBYTE version; + UBYTE buf[SIZE_EF_IMEI]; +#endif TRACE_FUNCTION("cl_get_imeisv()"); -#ifdef _SIMULATION_ - memcpy(imeiBufPtr, C_DEFAULT_IMEISV_DSAMPLE, CL_IMEI_SIZE); - return CL_IMEI_OK; -#else /* _SIMULATION_ */ - -#ifdef FF_PROTECTED_IMEI /* * The user has required a stored IMEI. If it has been already read * and stored, so return stored IMEI @@ -315,76 +206,68 @@ return CL_IMEI_OK; } /* - * The user has required a secure IMEI. Read IMEI from FFS or from Secure ROM + * The user has required a "secure" IMEI. How we get it depends on what + * platform we are running on. */ - if((ret = get_secure_imeisv(imeiBufSize, imeiBufPtr)) == CL_IMEI_OK) - { - return CL_IMEI_OK; - } else { - TRACE_ERROR("CL IMEI FATAL ERROR: IMEI not available!"); - /* - * Notify the Frame entity about FATAL ERROR, but not in the case, - * if ACI is checking IMEI, because ACI will take trouble about it. - */ - if (imeiType != CL_IMEI_CONTROL_IMEI){ - TRACE_ASSERT(ret == CL_IMEI_OK); - } - return ret; - } -/* - * The feature flag FF_PROTECTED_IMEI is not enabled. - */ -#else /* FF_PROTECTED_IMEI */ - -/* - * Return default CALYPSO+ IMEISV value - */ -#ifdef CL_IMEI_CALYPSO_PLUS_PLATFORM - - TRACE_EVENT("CL IMEI INFO: return default IMEI-SV number"); - memcpy(imeiBufPtr, C_DEFAULT_IMEISV_ESAMPLE, CL_IMEI_SIZE); -/* - * CL_IMEI_CALYPSO_PLATFORM or CL_IMEI_OTHER_PLATFORM is defined. - * Try to read the IMEI number from the old ffs:/pcm/IMEI file, - * if it failes, return default CALYPSO IMEISV value - */ -#else /* CL_IMEI_CALYPSO_PLUS_PLATFORM */ - { - UBYTE version; - USHORT ret; - UBYTE buf[SIZE_EF_IMEI]; - - ret = pcm_ReadFile ((UBYTE *)EF_IMEI_ID, SIZE_EF_IMEI, buf, &version); - if(ret == PCM_OK){ - TRACE_EVENT("CL IMEI INFO: return IMEI-SV number from ffs:/pcm/IMEI"); - /* - * swap digits - */ - imeiBufPtr[0] = ((buf[0] & 0xf0) >> 4) | ((buf[0] & 0x0f) << 4); - imeiBufPtr[1] = ((buf[1] & 0xf0) >> 4) | ((buf[1] & 0x0f) << 4); - imeiBufPtr[2] = ((buf[2] & 0xf0) >> 4) | ((buf[2] & 0x0f) << 4); - imeiBufPtr[3] = ((buf[3] & 0xf0) >> 4) | ((buf[3] & 0x0f) << 4); - imeiBufPtr[4] = ((buf[4] & 0xf0) >> 4) | ((buf[4] & 0x0f) << 4); - imeiBufPtr[5] = ((buf[5] & 0xf0) >> 4) | ((buf[5] & 0x0f) << 4); - imeiBufPtr[6] = ((buf[6] & 0xf0) >> 4) | ((buf[6] & 0x0f) << 4); - imeiBufPtr[7] = ((buf[7] & 0xf0) >> 4) | ((buf[7] & 0x0f) << 4); - /* store IMEI */ - memcpy(stored_imei, imeiBufPtr, CL_IMEI_SIZE); - imei_flag = 1; - - }else{ - TRACE_EVENT("CL IMEI INFO: return default IMEI-SV number"); - memcpy(imeiBufPtr, C_DEFAULT_IMEISV_DSAMPLE, CL_IMEI_SIZE); - } +#if CONFIG_MOKOFFS + /* + * Running on Openmoko GTA0x and using the original FFS. + * Get the nibble-swapped IMEI record from PCM. + */ + ret = pcm_ReadFile ((UBYTE *)EF_IMEI_ID, SIZE_EF_IMEI, buf, &version); + if(ret == PCM_OK){ + TRACE_EVENT("CL IMEI INFO: return IMEI-SV number from ffs:/pcm/IMEI"); + /* + * swap digits + */ + imeiBufPtr[0] = ((buf[0] & 0xf0) >> 4) | ((buf[0] & 0x0f) << 4); + imeiBufPtr[1] = ((buf[1] & 0xf0) >> 4) | ((buf[1] & 0x0f) << 4); + imeiBufPtr[2] = ((buf[2] & 0xf0) >> 4) | ((buf[2] & 0x0f) << 4); + imeiBufPtr[3] = ((buf[3] & 0xf0) >> 4) | ((buf[3] & 0x0f) << 4); + imeiBufPtr[4] = ((buf[4] & 0xf0) >> 4) | ((buf[4] & 0x0f) << 4); + imeiBufPtr[5] = ((buf[5] & 0xf0) >> 4) | ((buf[5] & 0x0f) << 4); + imeiBufPtr[6] = ((buf[6] & 0xf0) >> 4) | ((buf[6] & 0x0f) << 4); + imeiBufPtr[7] = ((buf[7] & 0xf0) >> 4) | ((buf[7] & 0x0f) << 4); + /* store IMEI */ + memcpy(stored_imei, imeiBufPtr, CL_IMEI_SIZE); + imei_flag = 1; + }else{ + /* + * pcm_ReadFile() can't really fail, as it merely reads out of a + * RAM buffer that was filled earlier, either from FFS or from + * compiled-in defaults. But TI's original code had the following + * error handling clause, so I kept it. + */ + TRACE_EVENT("CL IMEI INFO: return default IMEI-SV number"); + memcpy(imeiBufPtr, C_DEFAULT_IMEISV_DSAMPLE, CL_IMEI_SIZE); } -#endif /* CL_IMEI_CALYPSO_PLUS_PLATFORM */ + return CL_IMEI_OK; +#else + + /* + * Regular FreeCalypso configuration, not MokoFFS. + * We try to get the IMEISV from the following sources, in this order: + * + * /etc/IMEISV (sensible nibble order, not encrypted) + * Pirelli's encrypted IMEI record (Pirelli target only) + * hard-coded fallback and error indication + */ - return CL_IMEI_OK; - -#endif /* FF_PROTECTED_IMEI */ -#endif /* _SIMULATION_ */ + ret = ffs_file_read(CL_IMEI_FFS_PATH, imeiBufPtr, CL_IMEI_SIZE); + if (ret >= EFFS_OK) { + memcpy(stored_imei, imeiBufPtr, CL_IMEI_SIZE); + imei_flag = 1; + return CL_IMEI_OK; + } + ret = CL_IMEI_READ_IMEI_FAILED; +#if CONFIG_TARGET_PIRELLI + /* not yet implemented */ +#endif + TRACE_ERROR("CL IMEI FATAL ERROR: IMEI not available!"); + memcpy(imeiBufPtr, C_DEFAULT_IMEISV_DSAMPLE, CL_IMEI_SIZE); + return ret; +#endif /* CONFIG_MOKOFFS */ } - #endif /* CL_IMEI_C */ diff -r 8f9389e59ca2 -r b34e5351438e gsm-fw/include/condat/cl_imei.h --- a/gsm-fw/include/condat/cl_imei.h Sun Sep 28 05:45:38 2014 +0000 +++ b/gsm-fw/include/condat/cl_imei.h Sun Sep 28 07:27:25 2014 +0000 @@ -60,14 +60,9 @@ #undef FF_PROTECTED_IMEI #endif -#ifdef FF_PROTECTED_IMEI -#ifdef CL_IMEI_CALYPSO_PLATFORM +#if (CHIPSET == 7) || (CHIPSET == 8) || (CHIPSET == 10) || (CHIPSET == 11) #define CL_IMEI_DIE_ID_REG (MEM_DEV_ID0 | 0xF010) //+ 0xFFFEF010 for Calypso #endif -#if !defined (CL_IMEI_CALYPSO_PLUS_PLATFORM) && !defined (CL_IMEI_CALYPSO_PLATFORM) -#define CL_IMEI_OTHER_PLATFORM -#endif -#endif /* FF_PROTECTED_IMEI */ /* DIE ID SIZE is 4 words (16 bits)long */ #define CL_IMEI_SIZE 8