From 8e4bff4cab0ddac6060645b0715210484d02ff40 Mon Sep 17 00:00:00 2001 From: Yuval Adam <_@yuv.al> Date: Wed, 30 Aug 2017 08:25:59 +0000 Subject: Initial file dump from open source release --- drivers/misc/gpsip/cgdriver/CgCpu.c | 180 ++++++++++++++++++++++++++++++++++++ 1 file changed, 180 insertions(+) create mode 100644 drivers/misc/gpsip/cgdriver/CgCpu.c (limited to 'drivers/misc/gpsip/cgdriver/CgCpu.c') diff --git a/drivers/misc/gpsip/cgdriver/CgCpu.c b/drivers/misc/gpsip/cgdriver/CgCpu.c new file mode 100644 index 00000000..955ba980 --- /dev/null +++ b/drivers/misc/gpsip/cgdriver/CgCpu.c @@ -0,0 +1,180 @@ +/****************************************************************************** + * LEGAL NOTICE * + * * + * USE OF THIS SOFTWARE (including any copy or compiled version thereof) AND * + * DOCUMENTATION IS SUBJECT TO THE SOFTWARE LICENSE AND RESTRICTIONS AND THE * + * WARRANTY DISLCAIMER SET FORTH IN LEGAL_NOTICE.TXT FILE. IF YOU DO NOT * + * FULLY ACCEPT THE TERMS, YOU MAY NOT INSTALL OR OTHERWISE USE THE SOFTWARE * + * OR DOCUMENTATION. * + * NOTWITHSTANDING ANYTHING TO THE CONTRARY IN THIS NOTICE, INSTALLING OR * + * OTHERISE USING THE SOFTWARE OR DOCUMENTATION INDICATES YOUR ACCEPTANCE OF * + * THE LICENSE TERMS AS STATED. * + * * + ******************************************************************************/ +/* Version: 1.8.9\3686 */ +/* Build : 13 */ +/* Date : 12/08/2012 */ + +/** + \file + \brief CellGuide Common code + \attention This file should not be modified. + If you think something is wrong here, please contact CellGuide + +*/ + +#include +#include +#include "CgxDriverCore.h" +#include "CgCpu.h" +// Swap helper functions +TCgByteSwapType CgGetByteSwapTypeU32(TCgByteOrder aFrom, TCgByteOrder aTo); +void * CgGetSwapFunctionU32(TCgByteSwapType type); + + +static const U32 fullMask[32] = { + 0x00000001, 0x00000003, 0x00000007, 0x0000000F, + 0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF, + 0x000001FF, 0x000003FF, 0x000007FF, 0x00000FFF, + 0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF, + 0x0001FFFF, 0x0003FFFF, 0x0007FFFF, 0x000FFFFF, + 0x001FFFFF, 0x003FFFFF, 0x007FFFFF, 0x00FFFFFF, + 0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF, 0x0FFFFFFF, + 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF }; + +U32 CgGetU32Mask(U32 bitsInU32) +{ + return fullMask[bitsInU32]; +} + +TCgReturnCode CgSetRegisterBits(volatile U32 *aReg, TCgBitField aBitFieldDef, U32 aValue) +{ + + U32 value = aValue & fullMask[aBitFieldDef.length-1]; + U32 mask = (fullMask[aBitFieldDef.length-1]) & ~value; + + // clear + *aReg &= ~(mask << aBitFieldDef.start); + // set + *aReg |= (value << aBitFieldDef.start); + return ECgOk; +} + + +TCgReturnCode CgGetRegisterBits(volatile U32 aReg, TCgBitField aBitFieldDef, U32 *apValue) +{ + + *apValue = ((aReg) >> aBitFieldDef.start) & fullMask[aBitFieldDef.length-1]; + + return ECgOk; +} + + +TCgByteSwapType CgGetByteSwapTypeU32(TCgByteOrder aFrom, TCgByteOrder aTo) +{ + switch (aFrom){ + case ECG_BYTE_ORDER_1234 : + switch( aTo ){ + case ECG_BYTE_ORDER_1234 : return ECG_SWAP_NONE; + case ECG_BYTE_ORDER_2143 : return ECG_SWAP_BYTES; + case ECG_BYTE_ORDER_3412 : return ECG_SWAP_WORDS; + case ECG_BYTE_ORDER_4321 : return ECG_SWAP_BYTES_AND_WORDS; + } + break; + case ECG_BYTE_ORDER_2143 : + switch( aTo ){ + case ECG_BYTE_ORDER_1234 : return ECG_SWAP_BYTES; + case ECG_BYTE_ORDER_2143 : return ECG_SWAP_NONE; + case ECG_BYTE_ORDER_3412 : return ECG_SWAP_BYTES_AND_WORDS; + case ECG_BYTE_ORDER_4321 : return ECG_SWAP_WORDS; + } + break; + case ECG_BYTE_ORDER_3412 : + switch( aTo ) { + case ECG_BYTE_ORDER_1234 : return ECG_SWAP_WORDS; + case ECG_BYTE_ORDER_2143 : return ECG_SWAP_BYTES_AND_WORDS; + case ECG_BYTE_ORDER_3412 : return ECG_SWAP_NONE; + case ECG_BYTE_ORDER_4321 : return ECG_SWAP_BYTES; + } + break; + case ECG_BYTE_ORDER_4321 : + switch( aTo ) { + case ECG_BYTE_ORDER_1234 : return ECG_SWAP_BYTES_AND_WORDS; + case ECG_BYTE_ORDER_2143 : return ECG_SWAP_WORDS; + case ECG_BYTE_ORDER_3412 : return ECG_SWAP_BYTES; + case ECG_BYTE_ORDER_4321 : return ECG_SWAP_NONE; + } + break; + default : + return ECG_SWAP_NONE; + break; + } + + return ECG_SWAP_NONE; +} + + + +TCgReturnCode CgSwapBytesInBlock(void * aSource,void * aDest, long aSizeInBytes, TCgByteOrder aFrom, TCgByteOrder aTo) +{ + TCgReturnCode rc = ECgOk; + + long index = 0, sizeInDword = 0; + u32* source = NULL, * dest = NULL; + TCgByteSwapType swapType = CgGetByteSwapTypeU32(aFrom, aTo); + + sizeInDword = aSizeInBytes / 4; + source = (u32*)aSource; + dest = (u32*)aDest; + + switch (swapType) { + case ECG_SWAP_NONE : + break; + + case ECG_SWAP_BYTES : + for ( ; index < sizeInDword; index ++ ) + dest[index] = CgSwapBytesU32(source[index]); + break; + + case ECG_SWAP_WORDS : + for ( ; index < sizeInDword; index ++ ) + dest[index] = CgSwapWordsU32(source[index]); + break; + + case ECG_SWAP_BYTES_AND_WORDS : + for ( ; index < sizeInDword; index ++ ) + dest[index] = CgSwapBytesAndWordsU32(source[index]); + break; + } + + + return rc; +} + +TCgReturnCode CgCpuDelay(unsigned long aCount) +{ + volatile unsigned long cnt = 0; + volatile unsigned long z =2 ; + for(cnt = 0; cnt