diff options
author | Viktor Mladenovski <viktor.mladenovski@stericsson.com> | 2011-05-20 14:10:59 +0200 |
---|---|---|
committer | Viktor Mladenovski <viktor.mladenovski@stericsson.com> | 2011-05-20 14:10:59 +0200 |
commit | f7e95217e936da34d7124aaced590692eb515923 (patch) | |
tree | 2d9ef4750a67d9d1dd3fe9180a4fef2929fad54b /source/CEH/ProtromRpcInterface.cpp |
Initial contribution of loader_communication
ST-Ericsson ID: 326913
ST-Ericsson FOSS-OUT ID: STETL-FOSS-OUT-10204
Change-Id: I171cfc2ee458a8a0a91a1916137d131f0f7ecee5
Diffstat (limited to 'source/CEH/ProtromRpcInterface.cpp')
-rw-r--r-- | source/CEH/ProtromRpcInterface.cpp | 272 |
1 files changed, 272 insertions, 0 deletions
diff --git a/source/CEH/ProtromRpcInterface.cpp b/source/CEH/ProtromRpcInterface.cpp new file mode 100644 index 0000000..aa75334 --- /dev/null +++ b/source/CEH/ProtromRpcInterface.cpp @@ -0,0 +1,272 @@ +/******************************************************************************* + * Copyright (C) ST-Ericsson SA 2011 + * License terms: 3-clause BSD license + ******************************************************************************/ +#include "ProtromRpcInterface.h" +#include "t_protrom_transport.h" +#include "Serialization.h" + +ProtromRpcInterface::ProtromRpcInterface(CmdResult *CmdResult, LcmInterface *LcmInterface) +{ + PROTROM_Payload = new uint8[0x10000]; + cancelDeviceOnResult_ = false; + cmdResult_ = CmdResult; + lcmInterface_ = LcmInterface; + commDevice_ = NULL; +} + +ProtromRpcInterface::~ProtromRpcInterface() +{ + ProtromQueue.SignalEvent(); + delete[] PROTROM_Payload; +} + +ErrorCode_e ProtromRpcInterface::Do_CEH_Callback(CommandData_t *CmdData_p) +{ + uint8 *Data_p = (uint8 *)CmdData_p->Payload.Data_p; + + TProtromInfo *pInfo = new TProtromInfo; + pInfo->Length = CmdData_p->Payload.Size; + pInfo->DataP = new uint8[pInfo->Length]; + memcpy(pInfo->DataP, Data_p, pInfo->Length); + + int Pdu = *(Data_p + 7); //Get PDU number + + switch (Pdu) { + case PROTROM_PDU_RESULT: { + pInfo->ReceivedPdu = PROTROM_PDU_RESULT; + pInfo->Status = DoneRPC_PROTROM_ResultImpl(*CmdData_p); + } + break; + + case PROTROM_PDU_READY_TO_RECEIVE: { + pInfo->ReceivedPdu = PROTROM_PDU_READY_TO_RECEIVE; + pInfo->Status = DoneRPC_PROTROM_ReadyToReceiveImpl(*CmdData_p); + } + break; + + case PROTROM_PDU_ERROR_DATA: { + pInfo->ReceivedPdu = PROTROM_PDU_ERROR_DATA; + pInfo->Status = DoneRPC_PROTROM_ReadyToReceiveImpl(*CmdData_p); + } + break; + + + case PROTROM_PDU_SECURITY_DATA_RES: { + pInfo->ReceivedPdu = PROTROM_PDU_SECURITY_DATA_RES; + pInfo->Status = DoneRPC_PROTROM_ReadSecurityDataImpl(*CmdData_p); + } + break; + + case PROTROM_PDU_DOMAIN_DATA_REQ: { + pInfo->ReceivedPdu = PROTROM_PDU_DOMAIN_DATA_REQ; + pInfo->Status = DoneRPC_PROTROM_ReadyToReceiveImpl(*CmdData_p); + } + break; + + case PROTROM_PDU_DOMAIN_DATA: { + pInfo->ReceivedPdu = PROTROM_PDU_DOMAIN_DATA; + pInfo->Status = DoneRPC_PROTROM_ReadyToReceiveImpl(*CmdData_p); + } + break; + + case PROTROM_PDU_SECURITY_DATA_REQ: { + pInfo->ReceivedPdu = PROTROM_PDU_SECURITY_DATA_REQ; + pInfo->Status = DoneRPC_PROTROM_ReadyToReceiveImpl(*CmdData_p); + } + break; + + case PROTROM_PDU_ROOT_KEY_REQ: { + pInfo->ReceivedPdu = PROTROM_PDU_ROOT_KEY_REQ; + pInfo->Status = DoneRPC_PROTROM_ReadyToReceiveImpl(*CmdData_p); + } + break; + + case PROTROM_PDU_ROOT_KEY_DATA: { + pInfo->ReceivedPdu = PROTROM_PDU_ROOT_KEY_DATA; + pInfo->Status = DoneRPC_PROTROM_ReadyToReceiveImpl(*CmdData_p); + } + break; + + case PROTROM_PDU_PATCH_REQ: { + pInfo->ReceivedPdu = PROTROM_PDU_PATCH_REQ; + pInfo->Status = DoneRPC_PROTROM_ReadyToReceiveImpl(*CmdData_p); + } + break; + + case PROTROM_PDU_PATCH_DATA: { + pInfo->ReceivedPdu = PROTROM_PDU_PATCH_DATA; + pInfo->Status = DoneRPC_PROTROM_ReadyToReceiveImpl(*CmdData_p); + } + break; + + case PROTROM_PDU_PATCH_DATA_FINAL: { + pInfo->ReceivedPdu = PROTROM_PDU_PATCH_DATA_FINAL; + pInfo->Status = DoneRPC_PROTROM_ReadyToReceiveImpl(*CmdData_p); + } + break; + + case PROTROM_PDU_HEADER_OK_SW_REV: { + pInfo->ReceivedPdu = PROTROM_PDU_HEADER_OK_SW_REV; + pInfo->Status = DoneRPC_PROTROM_ReadyToReceiveImpl(*CmdData_p); + } + break; + + case PROTROM_PDU_SW_REV_DATA: { + pInfo->ReceivedPdu = PROTROM_PDU_SW_REV_DATA; + pInfo->Status = DoneRPC_PROTROM_ReadyToReceiveImpl(*CmdData_p); + } + break; + + case PROTROM_PDU_WDOG_RESET: { + pInfo->ReceivedPdu = PROTROM_PDU_WDOG_RESET; + pInfo->Status = DoneRPC_PROTROM_ReadyToReceiveImpl(*CmdData_p); + } + break; + + case PROTROM_PDU_DATA_NOT_FOUND: { + pInfo->ReceivedPdu = PROTROM_PDU_DATA_NOT_FOUND; + pInfo->Status = DoneRPC_PROTROM_ReadyToReceiveImpl(*CmdData_p); + } + break; + } + + ProtromQueue.AddRequest(static_cast<void *>(pInfo)); + + return E_SUCCESS; +} + +ErrorCode_e ProtromRpcInterface::DoRPC_PROTROM_ResultPdu(int Status) +{ + ErrorCode_e Result = E_SUCCESS; + Protrom_SendData_LP_t Data; + Protrom_Header_t Header; + + Header.PayloadLength = 2; // PDU + Status + Data.Header_p = &Header; // PROTROM header + Data.Payload_p = PROTROM_Payload; // pointer to the payload data + PROTROM_Payload[0] = 0x04; // Result PDU 0x04. + PROTROM_Payload[1] = Status; // Status + + Result = lcmInterface_->CommunicationSend(&Data); + + return Result; +} + +ErrorCode_e ProtromRpcInterface::DoRPC_PROTROM_SendLoaderHeader(unsigned char *pFile, uint32 Size) +{ + ErrorCode_e Result = E_SUCCESS; + Protrom_SendData_LP_t Data; + Protrom_Header_t Header; + + Header.PayloadLength = 1 + (uint16)Size; // PDU + Header payload + padding. + Data.Header_p = &Header; // PROTROM header + Data.Payload_p = PROTROM_Payload; // pointer to the payload data + + //Copy PDU and header data to Payload + PROTROM_Payload[0] = 0x01; //Header PDU 0x01 + + memcpy(PROTROM_Payload + 1, pFile, Size); //Copy header data + + Result = lcmInterface_->CommunicationSend(&Data); + + return Result; +} + +ErrorCode_e ProtromRpcInterface::DoRPC_PROTROM_SendLoaderPayload(unsigned char *pFile, uint32 Size) +{ + ErrorCode_e Result = E_SUCCESS; + Protrom_SendData_LP_t Data; + Protrom_Header_t Header; + + Header.PayloadLength = 1 + (uint16)Size; // PDU + Headeer payload. + Data.Header_p = &Header; // PROTROM header + Data.Payload_p = PROTROM_Payload; // pointer to the payload data + + //Copy PDU and header data to Payload + PROTROM_Payload[0] = 0x02; //Payload PDU 0x02 + + memcpy(PROTROM_Payload + 1, pFile, Size); //Copy payload data + + Result = lcmInterface_->CommunicationSend(&Data); + + return Result; +} + +ErrorCode_e ProtromRpcInterface::DoRPC_PROTROM_SendLoaderFinalPayload(unsigned char *pFile, uint32 Size) +{ + ErrorCode_e Result = E_SUCCESS; + Protrom_SendData_LP_t Data; + Protrom_Header_t Header; + + Header.PayloadLength = 1 + (uint16)Size; // PDU + Payload. + Data.Header_p = &Header; // PROTROM header + Data.Payload_p = PROTROM_Payload; // pointer to the payload data + + //Copy PDU and header data to Payload + PROTROM_Payload[0] = 0x03; //Final payload PDU 0x03 + + memcpy(PROTROM_Payload + 1, pFile, Size); + + Result = lcmInterface_->CommunicationSend(&Data); + + return Result; +} + +ErrorCode_e ProtromRpcInterface::DoRPC_PROTROM_ReadSecurityData(uint8 SecDataId) +{ + ErrorCode_e Result = E_SUCCESS; + Protrom_SendData_LP_t Data; + Protrom_Header_t Header; + + Header.PayloadLength = 2; // PDU + Payload. + Data.Header_p = &Header; // PROTROM header + Data.Payload_p = PROTROM_Payload; // pointer to the payload data + + //Copy PDU and header data to Payload + PROTROM_Payload[0] = 0x08; // Security Data Request PDU 0x08 + PROTROM_Payload[1] = SecDataId; + + Result = lcmInterface_->CommunicationSend(&Data); + + return Result; +} + +ErrorCode_e ProtromRpcInterface::DoneRPC_PROTROM_ResultImpl(CommandData_t CmdData) +{ + uint8 *Payload_p = CmdData.Payload.Data_p + PROTROM_HEADER_LENGTH; + + // skip PDU type + Payload_p++; + + if (cancelDeviceOnResult_) { + commDevice_->Cancel(lcmInterface_->getLCMContext()); + } + + return E_SUCCESS; +} + +ErrorCode_e ProtromRpcInterface::DoneRPC_PROTROM_ReadSecurityDataImpl(CommandData_t CmdData) +{ + uint8 *Payload_p = CmdData.Payload.Data_p + PROTROM_HEADER_LENGTH; + size_t PayloadLength = CmdData.Payload.Size - PROTROM_HEADER_LENGTH - PROTROM_CRC_LENGTH; + + // skip PDU type + Payload_p++; + PayloadLength--; + + cmdResult_->ProtromPayloadData.clear(); + cmdResult_->ProtromPayloadData = vector<uint8>(Payload_p, Payload_p + PayloadLength); + return E_SUCCESS; +} + +ErrorCode_e ProtromRpcInterface::DoneRPC_PROTROM_ReadyToReceiveImpl(CommandData_t CmdData) +{ + return E_SUCCESS; +} + +void ProtromRpcInterface::CancelDeviceOnResult(CommunicationDevice_t *commDevice) +{ + cancelDeviceOnResult_ = true; + commDevice_ = commDevice; +} |