summaryrefslogtreecommitdiff
path: root/source/LCDriverMethods.h
diff options
context:
space:
mode:
Diffstat (limited to 'source/LCDriverMethods.h')
-rw-r--r--source/LCDriverMethods.h265
1 files changed, 265 insertions, 0 deletions
diff --git a/source/LCDriverMethods.h b/source/LCDriverMethods.h
new file mode 100644
index 0000000..7e048be
--- /dev/null
+++ b/source/LCDriverMethods.h
@@ -0,0 +1,265 @@
+/*******************************************************************************
+*
+* File name: LCDriverMethods.h
+* Project: LCDriver
+* Language: Visual C++
+* Description: Implementation of all exported methods.
+*
+*
+* Copyright (C) ST-Ericsson SA 2011
+* License terms: 3-clause BSD license
+*
+*******************************************************************************/
+
+#ifndef _LCDRIVERMETHODS_H_
+#define _LCDRIVERMETHODS_H_
+
+#include "Buffers.h"
+#include "Queue.h"
+#include "Timer.h"
+#include "Hash.h"
+#include "Serialization.h"
+#include "Logger.h"
+#include "CmdResult.h"
+#include "LCDriverThread.h"
+#include "BulkHandler.h"
+#include "Event.h"
+
+class LcmInterface;
+class ZRpcInterface;
+class ProtromRpcInterface;
+class LoaderRpcInterfaceImpl;
+class A2LoaderRpcInterfaceImpl;
+
+typedef void (*ProgressBarCallback_t)(void *Communication_p, uint64 TotalLength, uint64 TransferredLength);
+
+/// <summary>
+/// Implementation class.
+/// </summary>
+class CLCDriverMethods
+{
+ friend class CLCDriverThread;
+public:
+ CLCDriverMethods(const char *pchInterfaceId);
+ virtual ~CLCDriverMethods();
+
+ int Do_Initialize(void **ppInstance);
+
+ int SetInitialProtocolFamily(TFamily family);
+ void ConfigureCommunicationDevice(void *Read_fn, void *Write_fn, void *Cancel_fn);
+ void SetMessageCallback(void *Callback_fn);
+ void SetProgressCallback(void *Callback_fn);
+
+ int SetPcTimeouts(TR15Timeouts *R15_TOs, TLCDriverTimeouts *LCD_TOs);
+ int GetPcTimeouts(TR15Timeouts *R15_TOs, TLCDriverTimeouts *LCD_TOs);
+
+ void CancelCurrentLoaderCommand();
+
+ // Loader methods
+ int Done_System_LoaderStartupStatus(char *pchVersion, int *piVersionSize, char *pchProtocol, int *piProtocolSize);
+ int Do_System_Reboot(int iMode);
+ int Do_System_Shutdown();
+ int Do_System_SupportedCommands(TSupportedCmd *pCmdList, int *piCmdListSize);
+ int Do_System_CollectData(int iType, int *piSize, char *pData);
+ int Do_System_ExecuteSoftware(const uint32 ExecuteMode,const char *pchDevicePath, int iUseBulk);
+ int Do_System_Authenticate(int iType, int *piSize, unsigned char *puchdata);
+ int Done_System_GetControlKeys(TSIMLockKeys *pSIMLockKeys);
+ int Done_System_GetControlKeysData(int iDataSize, unsigned char *pSIMLockKeysData);
+ int Done_System_AuthenticationChallenge(int iDataSize, unsigned char *puchChallengeData);
+ int Do_System_SetSystemTime(uint32 EpochTime);
+ int Do_System_SwitchCommunicationDevice(uint32 Device, uint32 DeviceParam);
+
+ int Do_Flash_ProcessFile(const char *pchPath, const char *pchType, int iUseBulk, int iDeleteBuffers);
+ int Do_Flash_ListDevices(TDevices *pDevices, int *piDeviceSize);
+ int Do_Flash_DumpArea(const char *pchPathToDump, uint64 uiStart, uint64 uiLength, const char *pchFilePath, uint32 RedundantArea, int iUseBulk);
+ int Do_Flash_EraseArea(const char *pchPath, uint64 uiStart, uint64 uiLength);
+ int Do_Flash_FlashRaw(const char *pchPath, uint64 uiStart, uint64 uiLength, uint32 uiDevice, int iUseBulk, int iDeleteBuffers);
+
+ int Do_FileSystem_VolumeProperties(const char *pchDevicePath, char *pchFSType, int *piFSTypeSize, uint64 *puiSize, uint64 *puiFree);
+ int Do_FileSystem_FormatVolume(const char *pchDevicePath);
+ int Do_FileSystem_ListDirectory(const char *pchPath, TEntries *pEntries, int *DeviceSize);
+ int Do_FileSystem_MoveFile(const char *pchSourcePath, const char *pchDestinationPath);
+ int Do_FileSystem_DeleteFile(const char *pchTargetPath);
+ int Do_FileSystem_CopyFile(const char *pchSourcePath, int iSourceUseBulk, const char *pchDestinationPath, int iDestinationUseBulk);
+ int Do_FileSystem_CreateDirectory(const char *pchTargetPath);
+ int Do_FileSystem_Properties(const char *pchTargetPath, uint32 *puiMode, uint64 *puiSize, int *piMTime, int *piATime, int *piCTime);
+ int Do_FileSystem_ChangeAccess(const char *pchTargetPath, int iAccess);
+ int Do_FileSystem_ReadLoadModuleManifests(const char *pchTargetPath, const char *pchSourcePath);
+
+ int Do_OTP_ReadBits(int iOtpId, int iBitStart, int iBitLength, unsigned char *puchDataBuffer, int *piDataBufferSize , unsigned char *puchStatusBuffer, int *piStatusBufferSize);
+ int Do_OTP_SetBits(int iOtpId, int iBitStart, int iBitLength, unsigned char *puchDataBuffer);
+ int Do_OTP_WriteAndLock(int iOtpId, int iForceWrite);
+ int Do_OTP_StoreSecureObject(const char *pchSourcePath, int iDestination, int iUseBulk);
+
+ int Do_ParameterStorage_ReadGlobalDataUnit(const char *pchGdfsId, int iUnit, unsigned char *puchDataBuffer, int *piSize);
+ int Do_ParameterStorage_WriteGlobalDataUnit(const char *pchGdfsId, int iUnit, const unsigned char *puchDataBuffer, int iSize);
+ int Do_ParameterStorage_ReadGlobalDataSet(const char *pchGdfsId, const char *pchPath, int iUseBulk);
+ int Do_ParameterStorage_WriteGlobalDataSet(const char *pchGdfsId, const char *pchPath, int iUseBulk);
+ int Do_ParameterStorage_EraseGlobalDataSet(const char *pchGdfsId);
+
+ int Do_Security_SetDomain(int iDomain);
+ int Do_Security_GetDomain(int *piWrittenDomain);
+ int Do_Security_GetProperties(int iUnitId, int *piSize, unsigned char *puchDataBuffer);
+ int Do_Security_SetProperties(int iUnitId, int iSize, const unsigned char *puchDataBuffer);
+ int Do_Security_BindProperties();
+
+ // A2 Protocol Methods
+ int Do_A2_System_Shutdown();
+ int Do_A2_System_LoaderVersion(char *pchLoaderVersion, int *piSize, int iTargetCPU);
+ int Do_A2_System_LoaderOnLoader(const char *pchPath, int iPLOffset, int iHLOffset, int iTargetCPU);
+ int Do_A2_System_Reset(int iTimeout);
+
+ int Do_A2_Flash_ProgramFlash(const char *pchPath, int iUseSpeedFlash);
+ int Do_A2_Flash_EraseFlash();
+
+ int Done_A2_Control_LoaderStarted();
+
+ // Z Protocol Methods
+ int Do_Z_SetInServiceMode(unsigned int *puiChipId);
+ int Do_Z_SetBaudrate(int iBaudrate);
+ int Do_Z_Exit_Z_Protocol();
+
+ // PROTROM Protocol Methods
+ int Do_PROTROM_DownloadLoader(const char *pchPath, int iPLOffset, int iHLOffset, int iContinueProtRom);
+ int Do_PROTROM_ReadSecurityData(uint8 uiSecDataId, unsigned char *puchDataBuffer, int *piDataLength);
+
+ int Do_SwitchProtocolFamily(TFamily family);
+
+private:
+ // Members
+ Buffers *m_pBuffers;
+ Queue *m_pQueue;
+ Timer *m_pTimer;
+ Hash *m_pHash;
+ Serialization *m_pSerialization;
+ Logger *m_pLogger;
+ BulkHandler *m_pBulkHandler;
+
+
+ HashDevice_t *m_pHashDevice;
+ CommunicationDevice_t *m_pCommunicationDevice;
+
+ // Utility setup methods
+ ErrorCode_e SetupTimers(TimersInterface_t *pTimerFunctions);
+ ErrorCode_e SetupBuffers(BuffersInterface_t *pBufferFunctions);
+ ErrorCode_e SetupQueues(QueueInterface_t *pQueueFunctions);
+ ErrorCode_e SetupHash();
+
+ CmdResult *m_pCmdResult;
+ LcmInterface *m_pLcmInterface;
+ ZRpcInterface *m_pZRpcFunctions;
+ ProtromRpcInterface *m_pProtromRpcFunctions;
+ LoaderRpcInterfaceImpl *m_pLoaderRpcFunctions;
+ A2LoaderRpcInterfaceImpl *m_pA2LoaderRpcFunctions;
+ CLCDriverThread *m_pMainThread;
+
+ //------------------------------------------
+ // Static methods for support modules: timers, hash, buffers and queue
+ //------------------------------------------
+public:
+ static ErrorCode_e TimerInit(void *pObject, uint32 uiTimers);
+ static uint32 TimerGet(void *pObject, Timer_t *pTimer);
+ static ErrorCode_e TimerRelease(void *pObject, uint32 uiTimerKey);
+ static uint32 TimerReadTime(void *pObject, uint32 uiTimerKey);
+ static uint32 TimerGetSystemTime(void *pObject);
+
+ static void HashCancel(void *pObject, void **ppHashDevice);
+ static void HashCalculate(void *pObject, HashType_e Type, void *pData, const uint32 uiLength, uint8 *pHash, HashCallback_fn fnCallback, void *pParam);
+ static uint32 HashGetLength(void *pObject, HashType_e Type);
+
+ static ErrorCode_e BuffersInit(void *pObject);
+ static void *BufferAllocate(void *pObject, int iBufferSize);
+ static ErrorCode_e BufferRelease(void *pObject, void *pBuffer, int iBufferSize);
+ static uint32 BuffersAvailable(void *pObject, int iBufferSize);
+ static void BuffersDeinit(void *pObject);
+
+ static void QueueCreate(void *pObject, void **const ppQueue, const uint32 uiMaxLength, void (*pDestroyElement)(void *pElement));
+ static void QueueDestroy(void *pObject, void **const ppQueue);
+ static ErrorCode_e QueueEnqueue(void *pObject, void *const ppQueue, void *const pValue);
+ static void *QueueDequeue(void *pObject, void *const ppQueue);
+ static QueueCallback_fn QueueSetCallback(void *pObject, void *const pQueue, const QueueCallbackType_e Type, const QueueCallback_fn fnCallback, void *const pParam);
+ static boolean QueueIsEmpty(void *pObject, const void *const pQueue);
+ static boolean QueueIsMember(void *pObject, const void *const pQueue, void *pValue, boolean(*Match)(void *pValue1, void *pValue2));
+ static int QueueGetNrOfElements(void *pObject, const void *const pQueue);
+ static void RQueueCreate(void *pObject, void **const ppQueue, const uint32 uiMaxLength, void (*pDestroyElement)(void *pElement));
+ static void RQueueDestroy(void *pObject, void **const ppQueue);
+ static ErrorCode_e RQueueEnqueue(void *pObject, void *const pQueue, void *const pValue);
+ static void *RQueueDequeue(void *pObject, void *const pQueue);
+ static QueueCallback_fn RQueueSetCallback(void *pObject, void *const pQueue, const QueueCallbackType_e Type, const QueueCallback_fn fnCallback, void *const pParam);
+ static boolean RQueueIsEmpty(void *pObject, const void *const pQueue);
+ static boolean RQueueIsMember(void *pObject, const void *const pQueue, void *pValue, boolean(*Match)(void *pValue1, void *pValue2));
+ static int RQueueGetNrOfElements(void *pObject, const void *const pQueue);
+
+ //-----------------------------------------
+ // Command Execution Handler callbacks
+ //-----------------------------------------
+ static ErrorCode_e CEHCallbackFunction(void *pObject, CommandData_t *pCmdData);
+ static ErrorCode_e CEH_PROTROM_CallbackFunction(void *pObject, CommandData_t *pCmdData);
+ static ErrorCode_e CEH_Z_CallbackFunction(void *pObject, CommandData_t *pCmdData);
+ static ErrorCode_e CEH_A2_CallbackFunction(void *pObject, CommandData_t *pCmdData);
+
+ //-----------------------------------------
+ // Bulk Transfer Protocol callbacks
+ //-----------------------------------------
+ static void BulkCommandReqCallback(void *pObject, uint16 *puiSession, uint32 *puiChunkSize, uint64 *puiOffset, uint32 *puiLength, boolean bAckRead);
+ void Do_BulkCommandReqCallback(uint16 *puiSession, uint32 *puiChunkSize, uint64 *puiOffset, uint32 *puiLength);
+
+ static void BulkDataReqCallback(void *pObject, uint16 *puiSession, uint32 *puiChunkSize, uint64 *puiOffset, uint32 *puiLength, uint64 *puiTotalLength, uint32 *puiTransferedLength);
+ void Do_BulkDataReqCallback(uint16 *puiSession, uint32 *puiChunkSize, uint64 *puiOffset, uint32 *puiLength, uint64 *puiTotalLength, uint32 *puiTransferedLength);
+
+ static void BulkDataEndOfDumpCallback(void *pObject);
+ void Do_BulkDataEndOfDumpCallback();
+
+ int MapLcmError(int error);
+
+ void SignalError(int error);
+ void AddEvent(Event *event);
+
+ //-----------------------------------------
+ // Other callbacks
+ //-----------------------------------------
+ ProgressBarCallback_t m_ProgressBarUpdate;
+ void UpdateBulkProgress();
+ //-----------------------------------------
+
+private:
+ char *m_pchId;
+
+ static const char *const BULK_PATH;
+ uint64 m_uiBulkLength;
+ uint64 m_uiBulkTransferred;
+
+ CSemaphoreQueue m_EventQueue;
+ CCriticalSectionObject m_GetNextCodeCS;
+
+ CCriticalSectionObject m_SetTimeoutCS;
+ TLCDriverTimeouts m_Timeouts;
+
+ //-----------------------------------------
+ // String and vector copy functions.
+ //-----------------------------------------
+ template<class T, class U>
+ void CopyVectorToArray(const std::vector<T>& Source, U *pDestination, int *piSize);
+
+ void CopyStringToArray(std::string &Source, char *pDestination, int *piSize);
+
+ //-----------------------------------------
+ // Wait functions
+ //-----------------------------------------
+ int WaitForEvent(uint32 event, int Group = 0, int Command = 0);
+ int WaitForPROTROMResponseOrCancelOrTimeout(int iReceivePdu);
+
+ //-----------------------------------------
+ // State variables
+ //-----------------------------------------
+ Family_t m_CurrentProtocolFamily;
+ Do_CEH_Call_t m_CurrentCEHCallback;
+ int m_iBulkProtocolMode;
+
+ //-----------------------------------------
+ // General functions
+ //-----------------------------------------
+ int IsMainThreadAlive();
+};
+
+#endif // _LCDRIVERMETHODS_H_