platforms/os/Symbian/wlanhwinit_stub/src/wlanhwinitmain.cpp
changeset 0 10c42ec6c05f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/platforms/os/Symbian/wlanhwinit_stub/src/wlanhwinitmain.cpp	Tue Jun 29 12:34:26 2010 +0100
@@ -0,0 +1,765 @@
+/*
+ * wlanhwinitmain.cpp
+ *
+ * Copyright(c) 1998 - 2010 Texas Instruments. All rights reserved.      
+ * All rights reserved.      
+ * 
+ * This program and the accompanying materials are made available under the 
+ * terms of the Eclipse Public License v1.0 or BSD License which accompanies
+ * this distribution. The Eclipse Public License is available at
+ * http://www.eclipse.org/legal/epl-v10.html and the BSD License is as below.                                   
+ *                                                                       
+ * Redistribution and use in source and binary forms, with or without    
+ * modification, are permitted provided that the following conditions    
+ * are met:                                                              
+ *                                                                       
+ *  * Redistributions of source code must retain the above copyright     
+ *    notice, this list of conditions and the following disclaimer.      
+ *  * Redistributions in binary form must reproduce the above copyright  
+ *    notice, this list of conditions and the following disclaimer in    
+ *    the documentation and/or other materials provided with the         
+ *    distribution.                                                      
+ *  * Neither the name Texas Instruments nor the names of its            
+ *    contributors may be used to endorse or promote products derived    
+ *    from this software without specific prior written permission.      
+ *                                                                       
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+/**********************************************************************************************************************
+
+  FILENAME:       wlanhwinitmain.cpp
+*/
+
+
+#include "WiLink6_nvs.h"
+#ifdef _FW_FROMFILE
+#include "wilink6_firmware.h"
+#endif
+#include "radio_ini.h"
+#include "gendebug.h"
+
+#include <e32base.h>
+#include <d32dbms.h> // RDbStoreDatabase
+#include <f32file.h> // RFs
+#include <s32file.h> // CFileStore
+
+#include "wlanhwinitmain.h"
+#define __FILE_ID__								FILE_ID_136
+
+#define NVS_LEN     468
+#define RADIO_LEN   208
+
+/****************************************************************************
+ *                      CWlanHwInitMain::CWlanHwInitMain()
+ ****************************************************************************
+ * DESCRIPTION: class constructor
+ * 
+ * INPUTS:  None    
+ * 
+ * OUTPUT:  None
+ * 
+ * RETURNS: 
+ ****************************************************************************/
+
+CWlanHwInitMain::CWlanHwInitMain() :
+	ipaData ( 0 )
+{
+//	TraceDump( INFO_LEVEL, ( _L( "CWlanHwInitMain:CWlanHwInitMain()" ) ) );
+}
+
+/****************************************************************************
+ *                      CWlanHwInitMain::ConstructL()
+ ****************************************************************************
+ * DESCRIPTION: class constructor
+ * 
+ * INPUTS:  None    
+ * 
+ * OUTPUT:  None
+ * 
+ * RETURNS: 
+ ****************************************************************************/
+void CWlanHwInitMain::ConstructL()
+{
+
+}
+
+/****************************************************************************
+ *                      CWlanHwInitMain::NewL()
+ ****************************************************************************
+ * DESCRIPTION: create CWlanHwInitMain 
+ * 
+ * INPUTS:  None    
+ * 
+ * OUTPUT:  None
+ * 
+ * RETURNS: 
+ ****************************************************************************/
+CWlanHwInitMain* CWlanHwInitMain::NewL()
+{
+	CWlanHwInitMain* self = new( ELeave ) CWlanHwInitMain;
+	CleanupStack::PushL( self );
+	self->ConstructL();
+	CleanupStack::Pop( self );
+	return self;
+
+}
+    
+/****************************************************************************
+ *                      ~CWlanHwInitMain()
+ ****************************************************************************
+ * DESCRIPTION: class deconstructor
+ * 
+ * INPUTS:  None    
+ * 
+ * OUTPUT:  None
+ * 
+ * RETURNS: 
+ ****************************************************************************/
+CWlanHwInitMain::~CWlanHwInitMain()
+{
+//	TraceDump( INFO_LEVEL, ( _L( "CWlanHwInitMain:~CWlanHwInitMain()" ) ) );
+	delete ipaData; 
+}
+
+/****************************************************************************
+ *                   GetHwTestInitData
+ ****************************************************************************
+ * DESCRIPTION: 
+ * 
+ * INPUTS:  
+ * 
+ * OUTPUT:  None
+ * 
+ * RETURNS: 
+ ****************************************************************************/   
+void CWlanHwInitMain::GetHwTestInitData(const TUint8** aInitData, TUint& aInitLength, const TUint8** aFwData, TUint& aFwLength)
+{
+	//TraceDump( INFO_LEVEL, ( _L( "CWlanHwInitMain:GetMacAddressL()" ) ) );   
+	
+    /* Update the pointer to the whole FW data (NVS + FW file) */
+   /* *aFwData = ipNvsData;
+    aFwLength = sizeof(WiLink6m_nvs);*/
+	
+	//TraceDump( INFO_LEVEL, ( _L( "CWlanHwInitMain:GetHwTestInitData()" ) ) );
+}
+
+
+
+/****************************************************************************
+ *                    GetHwTestData
+ ****************************************************************************
+ * DESCRIPTION: 
+ * 
+ * INPUTS:  
+ * 
+ * OUTPUT:  None
+ * 
+ * RETURNS: 
+ ****************************************************************************/
+TInt CWlanHwInitMain::GetHwTestData(TUint aId, TDes8& aData)
+{
+//	TraceDump( INFO_LEVEL, ( _L( "CWlanHwInitMain:GetHwTestData()" ) ) );
+	
+	return KErrNone;
+}
+
+/****************************************************************************
+ *                     SetHwTestData
+ ****************************************************************************
+ * DESCRIPTION: 
+ * 
+ * INPUTS:   
+ * 
+ * OUTPUT:  None
+ * 
+ * RETURNS: 
+ ****************************************************************************/
+
+TInt CWlanHwInitMain::SetHwTestData(TUint aId, TDesC8& aData)
+{
+
+	return KErrNone;
+}
+
+/** 
+ * \fn     IsMMCFirmwareFound() 
+ * \brief  Checks if a firmware file can be found from
+* the memory card.
+ * 
+ * To success read the FW file from a card the FW bin file should be
+ * in firmware directory in the root of the card
+ * 
+ * \param  None
+ * \return alse if not found or error occured, True if 
+ * the firmware was successfully read.
+ * The firmware is loaded only once.
+ * \sa     IsMMCFirmwareFound
+ */ 
+TBool CWlanHwInitMain::IsMMCFirmwareFound()
+{
+#ifdef LOAD_FW_FROM_MMC
+   TraceDump( INFO_LEVEL, ( _L( "CWlanHwInitMain::IsMMCFirmwareFound()" ) ) );
+   
+   _LIT(KSearchPath,"E:\\firmware\\*.*");
+   _LIT(KFilePath,"E:\\firmware\\");
+   
+   // Check if the firmware is already loaded,
+   // free the memory and continue
+   
+   if (iFirmwareMC)
+   {
+    TraceDump( INFO_LEVEL, ( _L( "Memory for MMC Firmware already reserved" ) ) );
+    return ETrue;
+   }
+   
+   // Init store
+   /* Define file only if FW is not loaded */
+   RFs fs;
+   RFile file;
+   CDir* dirList;
+   TInt fileSize = -1;
+   TBuf<60> fileName;
+   fileName = KFilePath;
+   
+    
+   // Connect to the file system 
+   if ( fs.Connect() != KErrNone)
+   {
+	TraceDump( CRIT_LEVEL, ( _L( "IsMMCFirmwareFound() fs.Connect()" ) ) );
+    return EFalse;
+   }
+   
+   // If returns an error, the folder is not found
+   // -> return false;
+   if (fs.GetDir(KSearchPath,
+                 KEntryAttMaskSupported,
+                 ESortByName,
+                  dirList) != KErrNone )
+	{
+		TraceDump( CRIT_LEVEL, ( _L( "IsMMCFirmwareFound() fs.GetDir" ) ) );  	
+		fs.Close();
+		delete dirList;
+		return EFalse;
+	}
+                
+    // If no file is not found, return false.
+   if (dirList->Count() == 0)
+	{
+		TraceDump( CRIT_LEVEL, ( _L( "IsMMCFirmwareFound() No file found" ) ) );  	
+		fs.Close();
+		delete dirList;
+		return EFalse;
+	}         
+      
+      // Take the first file in the list, further files
+      // are not handled
+   fileName.Append ((*dirList)[0].iName);  // Assume there is enough space, otherwise panics...
+   
+   // Try to open the firmware file
+   if ( file.Open(fs, fileName, EFileStream) != KErrNone)
+   {
+		TraceDump( CRIT_LEVEL, ( _L( "IsMMCFirmwareFound() can't open file" ) ) );  	
+		fs.Close();
+		delete dirList;
+		return EFalse;
+   }
+    
+   // Get the size of the file 
+   if (file.Size(fileSize) != KErrNone)
+   {
+       TraceDump( CRIT_LEVEL, ( _L( "IsMMCFirmwareFound() can't Get File size" ) ) ); 
+    file.Close();
+    fs.Close();
+       delete dirList;
+    return EFalse;
+   }
+    
+    // Reserve memory from heap for it
+    TRAPD(err, iFirmwareMC = HBufC8::NewL(fileSize));
+    if (err != KErrNone)
+    {
+		TraceDump( CRIT_LEVEL, ( _L( "IsMMCFirmwareFound() can't reserve heap memory" ) ) );  	
+     file.Close();
+      fs.Close();
+        delete dirList;
+     return EFalse;
+    }
+ 
+    // Get a pointer and read the contents
+    // of the file.
+   TPtr8 pBuf = iFirmwareMC->Des();
+   if (file.Read(pBuf) != KErrNone)
+   {
+	   TraceDump( CRIT_LEVEL, ( _L( "IsMMCFirmwareFound() can't read file" ) ) );  	
+     file.Close();
+      fs.Close();
+       delete dirList;
+     return EFalse;
+   }
+   
+   // Successful
+   TraceDump( CRIT_LEVEL, ( _L( "IsMMCFirmwareFound() Success" ) ) );  	
+   
+   file.Close();
+    fs.Close();
+    delete dirList;
+   return ETrue; 
+#else
+ /* In case we are not supporting read file from card */
+ return EFalse;
+#endif // LOAD_FW_FROM_MMC
+}
+
+
+
+/** 
+ * \fn     IsMMCNvsFound() 
+ * \brief  Checks if a NVS file can be found from the memory card.
+ * 
+ * To success read the NVS file from a card the NVS bin file should be
+ * in nvs directory in the root of the card
+ * 
+ * In case that the NVS is taken from MMC card it will contain
+ * only the NVS parameters without the Radio parameters
+ * therefor the Radio parmeters will be taken from the extend NVS array
+ * that include from the WiLink_nvs.h file
+ * 
+ * \param  None
+ * \return false if not found or error occured, True if 
+ * the nvs was successfully read.
+ * The nvs is loaded only once.
+ * \sa     IsMMCNvsFound
+ */ 
+TBool CWlanHwInitMain::IsMMCNvsFound()
+{
+#ifdef LOAD_NVS_FROM_MMC
+   TraceDump( INFO_LEVEL, ( _L( "CWlanHwInitMain::IsMMCNvsFound()" ) ) );
+   
+   _LIT(KSearchPath,"E:\\nvs\\*.*");
+   _LIT(KFilePath,"E:\\nvs\\");
+   
+   /* 
+    * Check if the nvs is already loaded,
+    * free the memory and continue 
+    */
+   if (pNvsMC)
+   {
+    TraceDump( INFO_LEVEL, ( _L( "Memory for MMC NVS already reserved" ) ) );
+    return ETrue;
+   }
+   
+   /* Init store */
+   /* Define file only if NVS is not loaded */
+   RFs cFs;
+   RFile cFile;
+   CDir* pDirList;
+   TInt iFileSize = -1;
+   TBuf<60> aFileName;
+   aFileName = KFilePath;
+   
+   /* Connect to the file system */
+   if ( cFs.Connect() != KErrNone)
+   {
+	TraceDump( CRIT_LEVEL, ( _L( "IsMMCNvsFound() cFs.Connect()" ) ) );
+    return EFalse;
+   }
+   
+   /* If returns an error, the folder is not found */
+   /* -> return false; */
+   if (cFs.GetDir(KSearchPath,
+                 KEntryAttMaskSupported,
+                 ESortByName,
+                  pDirList) != KErrNone )
+	{
+		TraceDump( CRIT_LEVEL, ( _L( "IsMMCNvsFound() cFs.GetDir" ) ) );  	
+		cFs.Close();
+		delete pDirList;
+		return EFalse;
+	}
+                
+    /* If no file is not found, return false. */
+   if (pDirList->Count() == 0)
+	{
+		TraceDump( CRIT_LEVEL, ( _L( "IsMMCNvsFound() No file found" ) ) );  	
+		cFs.Close();
+		delete pDirList;
+		return EFalse;
+	}         
+      
+   /* Take the first file in the list, further files are not handled */
+   aFileName.Append ((*pDirList)[0].iName);  /* Assume there is enough space, otherwise panics... */
+   
+   /* Try to open the NVS file */
+   if ( cFile.Open(cFs, aFileName, EFileStream) != KErrNone)
+   {
+		TraceDump( CRIT_LEVEL, ( _L( "IsMMCNvsFound() can't open file" ) ) );  	
+		cFs.Close();
+		delete pDirList;
+		return EFalse;
+   }
+    
+   /* Get the size of the file */
+   if (cFile.Size(iFileSize) != KErrNone)
+   {
+       TraceDump( CRIT_LEVEL, ( _L( "IsMMCNvsFound() can't Get File size" ) ) ); 
+       cFile.Close();
+       cFs.Close();
+       delete pDirList;
+       return EFalse;
+   }
+    
+    /* Reserve memory from heap for it */
+    TRAPD(err, pNvsMC = HBufC8::NewL(iFileSize));
+    if (err != KErrNone)
+    {
+        TraceDump( CRIT_LEVEL, ( _L( "IsMMCNvsFound() can't reserve heap memory" ) ) );  	
+        cFile.Close();
+        cFs.Close();
+        delete pDirList;
+        return EFalse;
+    }
+ 
+    /* Get a pointer and read the contents */
+    /* of the file. */
+   TPtr8 pBuf = pNvsMC->Des();
+   if (cFile.Read(pBuf) != KErrNone)
+   {
+	   TraceDump( CRIT_LEVEL, ( _L( "IsMMCNvsFound() can't read file" ) ) );  	
+       cFile.Close();
+       cFs.Close();
+       delete pDirList;
+       return EFalse;
+   }
+   
+   /* Successful */
+   TraceDump( CRIT_LEVEL, ( _L( "IsMMCNvsFound() Success" ) ) );  	
+   
+   cFile.Close();
+   cFs.Close();
+   delete pDirList;
+   return ETrue; 
+#else
+ /* In case we are not supporting read file from card */
+ return EFalse;
+#endif /* LOAD_FW_FROM_MMC */
+}
+
+
+
+/****************************************************************************
+ *                     GetHwInitData()
+ ****************************************************************************
+ * DESCRIPTION: init data NVS, Radio , FW file pointer
+ * 
+ * INPUTS:  data pointer    
+ * 
+ * OUTPUT:  None
+ * 
+ * RETURNS: 
+ ****************************************************************************/
+void CWlanHwInitMain::GetHwInitData(const TUint8** ppConfigData, TUint& configLength, const TUint8** ppNvsData, TUint& nvsLength )
+{
+	/*TraceDump( INFO_LEVEL, ( _L( "CWlanHwInitMain:GetHwInitData()" ) ) );*/
+
+	/* Update Config data pointer */
+	*ppConfigData = NULL;
+	configLength = 0;
+
+	/* Temporary pointer for firmware */
+	const TUint8*   pWiLink6fw;
+	TUint32		WiLink6fwSize = 0;
+	const TUint8*   pWiLink6nvs;
+	TUint32		WiLink6nvsSize = 0 ;
+    TUint8*         pWiLink6radio;
+    TUint32		WiLink6radioSize = 0 ;
+    TUint8*         pWiLink6NvsRadio;
+
+    #ifdef _FW_FROMFILE
+	if (IsMMCFirmwareFound())
+	{
+		TraceDump( CRIT_LEVEL, ( _L( "CWlanHwInitMain::GetHwInitData(): Firmware loaded from MMC card !!!" ) ) ); 
+		pWiLink6fw = reinterpret_cast<const TUint8*>( iFirmwareMC->Ptr() );
+		WiLink6fwSize = iFirmwareMC->Length(); 
+	}
+	else
+	{
+	    /* Init FW pointer & FW size */
+		pWiLink6fw = reinterpret_cast<const TUint8*>( wilink6_firmware);
+        WiLink6fwSize = sizeof( wilink6_firmware );
+	} 
+    #else
+        WiLink6fwSize = 0;
+    #endif
+  
+
+    if (IsMMCNvsFound()) {
+		TraceDump( CRIT_LEVEL, ( _L( "CWlanHwInitMain::GetHwInitData(): NVS loaded from MMC card !!!" ) ) ); 
+        pWiLink6nvs = reinterpret_cast<const TUint8*>( pNvsMC->Ptr() );
+        WiLink6nvsSize = pNvsMC->Length(); 
+    }
+    else
+    {
+        /* Init NVS pointer & size */
+        pWiLink6nvs = reinterpret_cast<const TUint8*>( WiLink6_nvs );
+        /* Chaged from: sizeof(WiLink6_nvs) */
+        WiLink6nvsSize = NVS_LEN;
+    }
+    pWiLink6NvsRadio = (TUint8*)reinterpret_cast<const TUint8*>( WiLink6_nvs ) + NVS_LEN;
+
+    /* Init Radio pointer & size */
+    /* Chaged from: sizeof(TAutoRadioIniParams) */
+    WiLink6radioSize = RADIO_LEN;
+
+    /* 
+    aData structue :
+    ____________________________________________________________________________________________
+    |         |               |            |              |          |                          |
+    |NVS Len  | NVS File      |  Radio Len | Radio File   | FW Len   |  FW File                 |
+    |4 Bytes  | WiLink6_nvs.h | 4 Bytes    | radio_ini.h  | 4 Bytes  |  wilink6_firmware.h      |
+    |_________|_______________|____________|______________|__________|__________________________|
+
+    */
+    
+    /* Alloc lenght for the whole FW Data that is composed of 1 DWORD for NVS len + 1 DWORD for FW Len  + NVS array + FW Array + Radio len + Radio params*/
+	nvsLength  = sizeof(TUint32) + WiLink6nvsSize + sizeof(TUint32) + WiLink6radioSize + sizeof(TUint32) + WiLink6fwSize;
+	
+	/* Reserve memory if it has not yet already been reserved */	
+	if (ipaData == NULL)
+	{
+		ipaData = (TUint8*)User::Alloc(nvsLength); 
+
+		if (!ipaData)
+		{
+			/* Out of memory*/
+			ASSERT(0);
+		}	
+	}	
+    /* Length of NVS*/
+    TUint8   *TempPtr = ipaData + 4;
+	
+    /*Write Nvs Length*/    
+    *(TUint32*)ipaData = WiLink6nvsSize;
+
+    /* Copy NVS data to correct position*/
+    Mem::Copy(ipaData + sizeof(TUint32), pWiLink6nvs, WiLink6nvsSize);
+  	
+    TempPtr +=  WiLink6nvsSize;
+
+    /*Write Radio length*/
+    *(TUint32*)TempPtr = WiLink6radioSize;
+    TempPtr+= 4;
+    /* Get Radio position pointer*/
+    pWiLink6radio = ipaData + 2*sizeof(TUint32)+ WiLink6nvsSize;
+    /*This values need to be impoerted from  Radio module team*/
+    /* Changed from: FillRadioData(pWiLink6radio); */
+    Mem::Copy(pWiLink6radio, pWiLink6NvsRadio, WiLink6radioSize);
+
+    TempPtr += WiLink6radioSize;
+
+    /*Write FW length*/
+    *(TUint32*)TempPtr = WiLink6fwSize;
+    TempPtr+= 4;
+       
+	/* Copy Firmware to correct position*/
+    if (WiLink6fwSize != 0)
+    {
+    Mem::Copy(ipaData + 3*sizeof(TUint32) + WiLink6nvsSize + WiLink6radioSize, pWiLink6fw, WiLink6fwSize);
+    }
+    
+    /* Updated given pointer to just built pointer */
+	*ppNvsData = ipaData;
+}
+
+
+/****************************************************************************
+ *                     GetMacAddress
+ ****************************************************************************
+ * DESCRIPTION: get MAC address from NVS 
+ * 
+ * INPUTS:   
+ * 
+ * OUTPUT:  MacAddress
+ * 
+ * RETURNS: OK
+ ****************************************************************************/
+TInt CWlanHwInitMain::GetMacAddress(TMacAddr& aMacAddress)
+{
+    const TUint8*   pWiLink6nvs;
+
+     if (IsMMCNvsFound()) 
+     {
+         pWiLink6nvs = reinterpret_cast<const TUint8*>( pNvsMC->Ptr() );    
+     }
+     else
+     {  
+         pWiLink6nvs = WiLink6_nvs;
+     }
+
+    aMacAddress.iMacAddress[0] = pWiLink6nvs[11];
+    aMacAddress.iMacAddress[1] = pWiLink6nvs[10];
+    aMacAddress.iMacAddress[2] = pWiLink6nvs[6];
+    aMacAddress.iMacAddress[3] = pWiLink6nvs[5];
+    aMacAddress.iMacAddress[4] = pWiLink6nvs[4];
+    aMacAddress.iMacAddress[5] = pWiLink6nvs[3];
+
+	return KErrNone;
+}
+
+
+/****************************************************************************
+ *                     FillRadioData
+ ****************************************************************************
+ * DESCRIPTION: fill Radio params , in future will be done by Radio scope
+ * 
+ * INPUTS:   
+ * 
+ * OUTPUT:  radio params
+ * 
+ * RETURNS: OK
+ ****************************************************************************/
+void CWlanHwInitMain::FillRadioData(TUint8 *WiLink6radio)
+{
+TAutoRadioIniParams *pRadioParams;
+
+   pRadioParams = (TAutoRadioIniParams*)(WiLink6radio);
+
+   pRadioParams->tGeneralParams.TXBiPFEMAutoDetect = FEM_AUTO_DETECT_MODE_E;
+   pRadioParams->tGeneralParams.TXBiPFEMManufacturer = FEM_TRIQUINT_TYPE_E;   
+
+   pRadioParams->tGeneralParams.RefClk = REF_CLK_38_4_E;                                 
+   pRadioParams->tGeneralParams.SettlingTime = 5;                                                                 
+   pRadioParams->tGeneralParams.ClockValidOnWakeup = REF_CLK_NOT_VALID_E;                      
+   pRadioParams->tGeneralParams.DC2DCMode = BT_SPI_IS_NOT_USED_E;                               
+   pRadioParams->tGeneralParams.Single_Dual_Band_Solution = SINGLE_BAND_SOLUTION_E;  
+   
+   pRadioParams->tStatRadioParams.RxTraceInsertionLoss_2_4G = 0;
+   pRadioParams->tStatRadioParams.TXTraceLoss_2_4G  = 0;
+   pRadioParams->tStatRadioParams.RxRssiAndProcessCompensation_2_4G[0] = 0xEC;
+   pRadioParams->tStatRadioParams.RxRssiAndProcessCompensation_2_4G[1] = 0xF6;
+   pRadioParams->tStatRadioParams.RxRssiAndProcessCompensation_2_4G[2] = 0x00;
+   pRadioParams->tStatRadioParams.RxRssiAndProcessCompensation_2_4G[3] = 0x0C;
+   pRadioParams->tStatRadioParams.RxRssiAndProcessCompensation_2_4G[4] = 0x18;
+   pRadioParams->tStatRadioParams.RxRssiAndProcessCompensation_2_4G[5] = 0xF8;
+   pRadioParams->tStatRadioParams.RxRssiAndProcessCompensation_2_4G[6] = 0xFC;
+   pRadioParams->tStatRadioParams.RxRssiAndProcessCompensation_2_4G[7] = 0x00;
+   pRadioParams->tStatRadioParams.RxRssiAndProcessCompensation_2_4G[8] = 0x08;
+   pRadioParams->tStatRadioParams.RxRssiAndProcessCompensation_2_4G[9] = 0x10;
+   pRadioParams->tStatRadioParams.RxRssiAndProcessCompensation_2_4G[10] = 0xF0;
+   pRadioParams->tStatRadioParams.RxRssiAndProcessCompensation_2_4G[11] = 0xF8;
+   pRadioParams->tStatRadioParams.RxRssiAndProcessCompensation_2_4G[12] = 0x00;
+   pRadioParams->tStatRadioParams.RxRssiAndProcessCompensation_2_4G[13] = 0x0A;
+   pRadioParams->tStatRadioParams.RxRssiAndProcessCompensation_2_4G[14] = 0x14;
+   
+/* RMFD deafult value */
+   if (pRadioParams->tGeneralParams.Single_Dual_Band_Solution == DUAL_BAND_SOLUTION_E)
+   {   
+        pRadioParams->tDynRadioParams[0].TXBiPReferencePDvoltage_2_4G = 0 ;									
+        pRadioParams->tDynRadioParams[0].TxBiPReferencePower_2_4G = 0;																				
+        pRadioParams->tDynRadioParams[0].TxBiPOffsetdB_2_4G = 0;																							
+        pRadioParams->tDynRadioParams[0].TxPerRatePowerLimits_2_4G_Normal[0] = 0x1E;
+        pRadioParams->tDynRadioParams[0].TxPerRatePowerLimits_2_4G_Normal[1] = 0x1F;
+        pRadioParams->tDynRadioParams[0].TxPerRatePowerLimits_2_4G_Normal[2] = 0x22;
+        pRadioParams->tDynRadioParams[0].TxPerRatePowerLimits_2_4G_Normal[3] = 0x24;
+        pRadioParams->tDynRadioParams[0].TxPerRatePowerLimits_2_4G_Normal[4] = 0x28;
+        pRadioParams->tDynRadioParams[0].TxPerRatePowerLimits_2_4G_Normal[5] = 0x29;							
+        pRadioParams->tDynRadioParams[0].TxPerRatePowerLimits_2_4G_Degraded[0] = 0x1B;
+        pRadioParams->tDynRadioParams[0].TxPerRatePowerLimits_2_4G_Degraded[1] = 0x1C;
+        pRadioParams->tDynRadioParams[0].TxPerRatePowerLimits_2_4G_Degraded[2] = 0x1E;
+        pRadioParams->tDynRadioParams[0].TxPerRatePowerLimits_2_4G_Degraded[3] = 0x20;
+        pRadioParams->tDynRadioParams[0].TxPerRatePowerLimits_2_4G_Degraded[4] = 0x24;
+        pRadioParams->tDynRadioParams[0].TxPerRatePowerLimits_2_4G_Degraded[5] = 0x25;							
+        for (int i=0; i<NUMBER_OF_2_4_G_CHANNELS;i++)
+        {
+            pRadioParams->tDynRadioParams[0].TxPerChannelPowerLimits_2_4G_11b[i] = 0x50;
+            pRadioParams->tDynRadioParams[0].TxPerChannelPowerLimits_2_4G_OFDM[i] = 0x50;
+        }
+           
+        pRadioParams->tDynRadioParams[0].TxPerChannelPowerLimits_2_4G_OFDM[0] = 0x20;
+        pRadioParams->tDynRadioParams[0].TxPerChannelPowerLimits_2_4G_OFDM[10] = 0x20;
+        memset(&pRadioParams->tDynRadioParams[0].TxPDVsRateOffsets_2_4G[0],0,NUMBER_OF_RATE_GROUPS_E);												
+        for (int i=0; i<NUMBER_OF_RATE_GROUPS_E;i++)
+        {
+            pRadioParams->tDynRadioParams[0].TxIbiasTable_2_4G[i] = 0x0E;
+        }
+        pRadioParams->tDynRadioParams[0].TxIbiasTable_2_4G[5] = 0x17;
+        pRadioParams->tDynRadioParams[0].RxFemInsertionLoss_2_4G = 0x0D;    								
+   }
+   else
+   {
+        pRadioParams->tDynRadioParams[0].TXBiPReferencePDvoltage_2_4G =0x24E ;									
+        pRadioParams->tDynRadioParams[0].TxBiPReferencePower_2_4G = 0x78;																				
+        pRadioParams->tDynRadioParams[0].TxBiPOffsetdB_2_4G = 0;																							
+        pRadioParams->tDynRadioParams[0].TxPerRatePowerLimits_2_4G_Normal[0] = 0x1E;
+        pRadioParams->tDynRadioParams[0].TxPerRatePowerLimits_2_4G_Normal[1] = 0x1F;
+        pRadioParams->tDynRadioParams[0].TxPerRatePowerLimits_2_4G_Normal[2] = 0x22;
+        pRadioParams->tDynRadioParams[0].TxPerRatePowerLimits_2_4G_Normal[3] = 0x24;
+        pRadioParams->tDynRadioParams[0].TxPerRatePowerLimits_2_4G_Normal[4] = 0x28;
+        pRadioParams->tDynRadioParams[0].TxPerRatePowerLimits_2_4G_Normal[5] = 0x29;							
+        pRadioParams->tDynRadioParams[0].TxPerRatePowerLimits_2_4G_Degraded[0] = 0x1B;
+        pRadioParams->tDynRadioParams[0].TxPerRatePowerLimits_2_4G_Degraded[1] = 0x1C;
+        pRadioParams->tDynRadioParams[0].TxPerRatePowerLimits_2_4G_Degraded[2] = 0x1E;
+        pRadioParams->tDynRadioParams[0].TxPerRatePowerLimits_2_4G_Degraded[3] = 0x20;
+        pRadioParams->tDynRadioParams[0].TxPerRatePowerLimits_2_4G_Degraded[4] = 0x24;
+        pRadioParams->tDynRadioParams[0].TxPerRatePowerLimits_2_4G_Degraded[5] = 0x25;							
+        for (int i =0;i<NUMBER_OF_2_4_G_CHANNELS;i++)
+        {
+            pRadioParams->tDynRadioParams[0].TxPerChannelPowerLimits_2_4G_11b[i] = 0x50;
+            pRadioParams->tDynRadioParams[0].TxPerChannelPowerLimits_2_4G_OFDM[i] = 0x50;
+        }
+        pRadioParams->tDynRadioParams[0].TxPerChannelPowerLimits_2_4G_OFDM[0] = 0x20;
+        pRadioParams->tDynRadioParams[0].TxPerChannelPowerLimits_2_4G_OFDM[10] = 0x20;   
+        memset(&pRadioParams->tDynRadioParams[0].TxPDVsRateOffsets_2_4G[0],0,NUMBER_OF_RATE_GROUPS_E);	
+        for (int i = 0 ;i <NUMBER_OF_RATE_GROUPS_E;i++) 
+        {
+            pRadioParams->tDynRadioParams[0].TxIbiasTable_2_4G[i] = 0x1A;
+        }
+       
+        pRadioParams->tDynRadioParams[0].TxIbiasTable_2_4G[5] = 0x2F;
+        pRadioParams->tDynRadioParams[0].RxFemInsertionLoss_2_4G = 0;	
+    
+        /* TriQuint default value */
+        pRadioParams->tDynRadioParams[1].TXBiPReferencePDvoltage_2_4G= 0x168;									
+        pRadioParams->tDynRadioParams[1].TxBiPReferencePower_2_4G= 0x83;																				
+        pRadioParams->tDynRadioParams[1].TxBiPOffsetdB_2_4G=0;																							
+        pRadioParams->tDynRadioParams[1].TxPerRatePowerLimits_2_4G_Normal[0] = 0x1E;
+        pRadioParams->tDynRadioParams[1].TxPerRatePowerLimits_2_4G_Normal[1] = 0x1F;
+        pRadioParams->tDynRadioParams[1].TxPerRatePowerLimits_2_4G_Normal[2] = 0x22;
+        pRadioParams->tDynRadioParams[1].TxPerRatePowerLimits_2_4G_Normal[3] = 0x24;
+        pRadioParams->tDynRadioParams[1].TxPerRatePowerLimits_2_4G_Normal[4] = 0x28;
+        pRadioParams->tDynRadioParams[1].TxPerRatePowerLimits_2_4G_Normal[5] = 0x29;							
+        pRadioParams->tDynRadioParams[1].TxPerRatePowerLimits_2_4G_Degraded[0] = 0x1B;
+        pRadioParams->tDynRadioParams[1].TxPerRatePowerLimits_2_4G_Degraded[1] = 0x1C;
+        pRadioParams->tDynRadioParams[1].TxPerRatePowerLimits_2_4G_Degraded[2] = 0x1E;
+        pRadioParams->tDynRadioParams[1].TxPerRatePowerLimits_2_4G_Degraded[3] = 0x20;
+        pRadioParams->tDynRadioParams[1].TxPerRatePowerLimits_2_4G_Degraded[4] = 0x24;
+        pRadioParams->tDynRadioParams[1].TxPerRatePowerLimits_2_4G_Degraded[5] = 0x25;	
+        for (int i =0;i<NUMBER_OF_2_4_G_CHANNELS;i++)
+        {
+            pRadioParams->tDynRadioParams[1].TxPerChannelPowerLimits_2_4G_11b[i] = 0x50;
+            pRadioParams->tDynRadioParams[1].TxPerChannelPowerLimits_2_4G_OFDM[i] = 0x50;
+        }
+        pRadioParams->tDynRadioParams[1].TxPerChannelPowerLimits_2_4G_OFDM[0] = 0x20;
+        pRadioParams->tDynRadioParams[1].TxPerChannelPowerLimits_2_4G_OFDM[10] = 0x20;  
+        memset(&pRadioParams->tDynRadioParams[1].TxPDVsRateOffsets_2_4G[0],0,NUMBER_OF_RATE_GROUPS_E); 
+         for (int i = 0 ;i <NUMBER_OF_RATE_GROUPS_E;i++) 
+        {
+            pRadioParams->tDynRadioParams[1].TxIbiasTable_2_4G[i] = 0x11;
+        }
+      
+        pRadioParams->tDynRadioParams[1].TxIbiasTable_2_4G[5] = 0x12; 													
+        pRadioParams->tDynRadioParams[1].RxFemInsertionLoss_2_4G = 0x12;  
+   }
+}
+