|
@@ -14,20 +14,19 @@
|
|
////////////////////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
#define _dword_offset(m) (offsetof(GFA_APP_IMG_HEADER, m) / sizeof(uint32_t) - 2)
|
|
#define _dword_offset(m) (offsetof(GFA_APP_IMG_HEADER, m) / sizeof(uint32_t) - 2)
|
|
-#define _EXEC_CALLBACK(pfn, ...) if(pfn) (*pfn)(__FILE__, __LINE__, __VA_ARGS__)
|
|
|
|
|
|
+#define _EXEC_PROGRESS_CALLBACK(pfn, ...) if(pfn) (*pfn)(__FILE__, __LINE__, __VA_ARGS__)
|
|
|
|
|
|
-#define _BOOTLOADER_EXEC_WAIT_TIME 250
|
|
|
|
#define _GFA_MAX_DUMP_DWORDS 16
|
|
#define _GFA_MAX_DUMP_DWORDS 16
|
|
-#define _MAX_SEND_DATA_BLOCK_SIZE 76
|
|
|
|
-#define _DEF_SEND_DATA_BLOCK_SIZE 64
|
|
|
|
|
|
+#define _BOOTLOADER_DEF_BAUDRATE 19200
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
typedef struct _GFA_BLM
|
|
typedef struct _GFA_BLM
|
|
{
|
|
{
|
|
HGFAMINEMST hMst;
|
|
HGFAMINEMST hMst;
|
|
- PFN_BU_CMD_DOWNLOAD_STATUS pfnBuCmdDownloadStatus;
|
|
|
|
- PFN_BU_CMD_SEND_DATA_STATUS pfnBuCmdSendDataStatus;
|
|
|
|
|
|
+ GFA_BLM_DL_PROGRESS_PARAMS dlpp;
|
|
|
|
+ PFN_GFA_BLM_DL_PROGRESS pfnDlProgress;
|
|
|
|
+ void *pUserParam;
|
|
int nVerbosity;
|
|
int nVerbosity;
|
|
}GFA_BLM, *LPGFA_BLM;
|
|
}GFA_BLM, *LPGFA_BLM;
|
|
typedef const GFA_BLM *LPCGFA_BLM;
|
|
typedef const GFA_BLM *LPCGFA_BLM;
|
|
@@ -45,8 +44,8 @@ HGFABLM GfaBlmOpen(LPCGFA_BLM_CFG_PARAMS pblmcfg)
|
|
LPGFA_BLM pBlm = malloc(sizeof(GFA_BLM));
|
|
LPGFA_BLM pBlm = malloc(sizeof(GFA_BLM));
|
|
memset(pBlm, 0, sizeof(GFA_BLM));
|
|
memset(pBlm, 0, sizeof(GFA_BLM));
|
|
pBlm->hMst = hMst;
|
|
pBlm->hMst = hMst;
|
|
- pBlm->pfnBuCmdDownloadStatus = pblmcfg->pfnBuCmdDownloadStatus;
|
|
|
|
- pBlm->pfnBuCmdSendDataStatus = pblmcfg->pfnBuCmdSendDataStatus;
|
|
|
|
|
|
+ pBlm->pfnDlProgress = pblmcfg->pfnDlProgress;
|
|
|
|
+ pBlm->pUserParam = pblmcfg->pUserParam;
|
|
return (HGFABLM)pBlm;
|
|
return (HGFABLM)pBlm;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -90,18 +89,21 @@ ssize_t GfaBlmBUCmdPollData(HGFABLM hBlm, uint8_t nNodeAddr, void *pData, size_t
|
|
if(hBlm && pData && nCbData && !NODE_IS_MULTICAST(nNodeAddr))
|
|
if(hBlm && pData && nCbData && !NODE_IS_MULTICAST(nNodeAddr))
|
|
{
|
|
{
|
|
size_t s, nReceived = 0;
|
|
size_t s, nReceived = 0;
|
|
- struct timeval tvRX;
|
|
|
|
ssize_t nLen, nRet = -1;
|
|
ssize_t nLen, nRet = -1;
|
|
uint8_t cmd[32];
|
|
uint8_t cmd[32];
|
|
uint8_t txb[32];
|
|
uint8_t txb[32];
|
|
uint8_t rxb[512];
|
|
uint8_t rxb[512];
|
|
LPGFA_BLM pBlm = (LPGFA_BLM)hBlm;
|
|
LPGFA_BLM pBlm = (LPGFA_BLM)hBlm;
|
|
uint8_t *pszData = (uint8_t*)pData;
|
|
uint8_t *pszData = (uint8_t*)pData;
|
|
- tvRX.tv_sec = nTimeoutMS / 1000;
|
|
|
|
- tvRX.tv_usec = (nTimeoutMS % 1000) * 1000;
|
|
|
|
|
|
|
|
- GfaMininetMasterSaveTimeouts(pBlm->hMst);
|
|
|
|
- GfaMininetMasterSetTimeouts(pBlm->hMst, &tvRX, NULL);
|
|
|
|
|
|
+ if(nTimeoutMS > 0)
|
|
|
|
+ {
|
|
|
|
+ struct timeval tvRX;
|
|
|
|
+ tvRX.tv_sec = nTimeoutMS / 1000;
|
|
|
|
+ tvRX.tv_usec = (nTimeoutMS % 1000) * 1000;
|
|
|
|
+ GfaMininetMasterSaveTimeouts(pBlm->hMst);
|
|
|
|
+ GfaMininetMasterSetTimeouts(pBlm->hMst, &tvRX, NULL);
|
|
|
|
+ }
|
|
|
|
|
|
while(nReceived < nCbData)
|
|
while(nReceived < nCbData)
|
|
{
|
|
{
|
|
@@ -135,13 +137,11 @@ ssize_t GfaBlmBUCmdPollData(HGFABLM hBlm, uint8_t nNodeAddr, void *pData, size_t
|
|
{
|
|
{
|
|
usleep(100000);
|
|
usleep(100000);
|
|
nTimeoutMS -= 100;
|
|
nTimeoutMS -= 100;
|
|
-// TRACE("\nACK ...\n");
|
|
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
usleep(nTimeoutMS * 1000);
|
|
usleep(nTimeoutMS * 1000);
|
|
nTimeoutMS = 0;
|
|
nTimeoutMS = 0;
|
|
-// TRACE("\nACK ...\n");
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
else
|
|
@@ -171,7 +171,8 @@ ssize_t GfaBlmBUCmdPollData(HGFABLM hBlm, uint8_t nNodeAddr, void *pData, size_t
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- GfaMininetMasterRestoreTimeouts(pBlm->hMst);
|
|
|
|
|
|
+ if(nTimeoutMS > 0)
|
|
|
|
+ GfaMininetMasterRestoreTimeouts(pBlm->hMst);
|
|
return nReceived;
|
|
return nReceived;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -181,7 +182,7 @@ ssize_t GfaBlmBUCmdPollData(HGFABLM hBlm, uint8_t nNodeAddr, void *pData, size_t
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
-int GfaBlmBUCmdReset(HGFABLM hBlm, uint8_t nNodeAddr, uint32_t nTimeoutMS)
|
|
|
|
|
|
+int GfaBlmBUCmdReset(HGFABLM hBlm, uint8_t nNodeAddr, uint32_t nInitialBaudrate)
|
|
{
|
|
{
|
|
if(hBlm)
|
|
if(hBlm)
|
|
{
|
|
{
|
|
@@ -192,8 +193,8 @@ int GfaBlmBUCmdReset(HGFABLM hBlm, uint8_t nNodeAddr, uint32_t nTimeoutMS)
|
|
uint8_t cmd = COMMAND_RESET;
|
|
uint8_t cmd = COMMAND_RESET;
|
|
uint8_t cmddata[16];
|
|
uint8_t cmddata[16];
|
|
char txb[32], rxb[256], ack[2];
|
|
char txb[32], rxb[256], ack[2];
|
|
-
|
|
|
|
- if((nRet = GfaBlmBootloaderSetBaudrate(hBlm, nNodeAddr, 19200)) != 0)
|
|
|
|
|
|
+
|
|
|
|
+ if((nRet = GfaBlmBootloaderSetBaudrate(hBlm, nNodeAddr, nInitialBaudrate)) != 0)
|
|
return -1;
|
|
return -1;
|
|
|
|
|
|
s = GfaBlmBuildCmdDataPacket("BU", 0, &cmd, 1, cmddata, sizeof(cmddata), true);
|
|
s = GfaBlmBuildCmdDataPacket("BU", 0, &cmd, 1, cmddata, sizeof(cmddata), true);
|
|
@@ -201,12 +202,12 @@ int GfaBlmBUCmdReset(HGFABLM hBlm, uint8_t nNodeAddr, uint32_t nTimeoutMS)
|
|
|
|
|
|
if((nRet = GfaMininetMasterTransmitFrame(pBlm->hMst, txb, nLen)) != nLen)
|
|
if((nRet = GfaMininetMasterTransmitFrame(pBlm->hMst, txb, nLen)) != nLen)
|
|
return nRet;
|
|
return nRet;
|
|
-
|
|
|
|
|
|
+
|
|
if(NODE_IS_MULTICAST(nNodeAddr))
|
|
if(NODE_IS_MULTICAST(nNodeAddr))
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
- if((nLen = GfaMininetMasterReceiveFrame(pBlm->hMst, rxb, sizeof(rxb), true)) < 0)
|
|
|
|
- return nLen;
|
|
|
|
|
|
+ if((nLen = GfaMininetMasterReceiveFrame(pBlm->hMst, rxb, sizeof(rxb), true)) <= 0)
|
|
|
|
+ return -1;
|
|
|
|
|
|
nRet = GfaMininetMasterEvaluateSlaveResponse(pBlm->hMst, nNodeAddr, rxb, nLen, true, &nIndex);
|
|
nRet = GfaMininetMasterEvaluateSlaveResponse(pBlm->hMst, nNodeAddr, rxb, nLen, true, &nIndex);
|
|
|
|
|
|
@@ -227,13 +228,13 @@ int GfaBlmBUCmdReset(HGFABLM hBlm, uint8_t nNodeAddr, uint32_t nTimeoutMS)
|
|
if( (ack[0] == 0) &&
|
|
if( (ack[0] == 0) &&
|
|
(ack[1] == COMMAND_ACK))
|
|
(ack[1] == COMMAND_ACK))
|
|
{
|
|
{
|
|
-
|
|
|
|
|
|
+#if 0
|
|
do
|
|
do
|
|
{
|
|
{
|
|
- if(nTimeoutMS > _BOOTLOADER_EXEC_WAIT_TIME)
|
|
|
|
|
|
+ if(nTimeoutMS > GFA_BOOTLOADER_EXEC_WAIT_TIME)
|
|
{
|
|
{
|
|
- usleep(_BOOTLOADER_EXEC_WAIT_TIME * 1000);
|
|
|
|
- nTimeoutMS -= _BOOTLOADER_EXEC_WAIT_TIME;
|
|
|
|
|
|
+ usleep(GFA_BOOTLOADER_EXEC_WAIT_TIME * 1000);
|
|
|
|
+ nTimeoutMS -= GFA_BOOTLOADER_EXEC_WAIT_TIME;
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
@@ -246,8 +247,9 @@ int GfaBlmBUCmdReset(HGFABLM hBlm, uint8_t nNodeAddr, uint32_t nTimeoutMS)
|
|
GfaMininetMasterPurgeDeviceRXBuffer(pBlm->hMst);
|
|
GfaMininetMasterPurgeDeviceRXBuffer(pBlm->hMst);
|
|
}
|
|
}
|
|
while(nTimeoutMS > 0);
|
|
while(nTimeoutMS > 0);
|
|
-
|
|
|
|
- return nRet;
|
|
|
|
|
|
+#endif
|
|
|
|
+ GfaMininetMasterPurgeDeviceRXBuffer(pBlm->hMst);
|
|
|
|
+ return GfaMininetMasterResetLocalIndex(pBlm->hMst, nNodeAddr);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if(nRet == MINET_SLAVE_RESPONSE_INDEX_IS_STATUS_CODE)
|
|
else if(nRet == MINET_SLAVE_RESPONSE_INDEX_IS_STATUS_CODE)
|
|
@@ -265,6 +267,20 @@ int GfaBlmBUCmdReset(HGFABLM hBlm, uint8_t nNodeAddr, uint32_t nTimeoutMS)
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
+int GfaBlmMininetPing(HGFABLM hBlm, uint8_t nNodeAddr)
|
|
|
|
+{
|
|
|
|
+ if(hBlm && !NODE_IS_MULTICAST(nNodeAddr))
|
|
|
|
+ {
|
|
|
|
+ LPGFA_BLM pBlm = (LPGFA_BLM)hBlm;
|
|
|
|
+ return GfaMininetMasterPingSlave(pBlm->hMst, nNodeAddr);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ errno = EINVAL;
|
|
|
|
+ return -1;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
|
+
|
|
int GfaBlmBUCmdPing(HGFABLM hBlm, uint8_t nNodeAddr)
|
|
int GfaBlmBUCmdPing(HGFABLM hBlm, uint8_t nNodeAddr)
|
|
{
|
|
{
|
|
if(hBlm && !NODE_IS_MULTICAST(nNodeAddr))
|
|
if(hBlm && !NODE_IS_MULTICAST(nNodeAddr))
|
|
@@ -281,8 +297,8 @@ int GfaBlmBUCmdPing(HGFABLM hBlm, uint8_t nNodeAddr)
|
|
if((nRet = GfaMininetMasterTransmitFrame(pBlm->hMst, txb, nLen)) < nLen)
|
|
if((nRet = GfaMininetMasterTransmitFrame(pBlm->hMst, txb, nLen)) < nLen)
|
|
return nRet;
|
|
return nRet;
|
|
|
|
|
|
- if((nLen = GfaMininetMasterReceiveFrame(pBlm->hMst, rxb, sizeof(rxb), true)) < 0)
|
|
|
|
- return nLen;
|
|
|
|
|
|
+ if((nLen = GfaMininetMasterReceiveFrame(pBlm->hMst, rxb, sizeof(rxb), true)) <= 0)
|
|
|
|
+ return -1;
|
|
|
|
|
|
nRet = GfaMininetMasterEvaluateSlaveResponse(pBlm->hMst, nNodeAddr, rxb, nLen, true, &nIndex);
|
|
nRet = GfaMininetMasterEvaluateSlaveResponse(pBlm->hMst, nNodeAddr, rxb, nLen, true, &nIndex);
|
|
|
|
|
|
@@ -302,7 +318,7 @@ int GfaBlmBUCmdPing(HGFABLM hBlm, uint8_t nNodeAddr)
|
|
|
|
|
|
if(ack[0] == 0)
|
|
if(ack[0] == 0)
|
|
{
|
|
{
|
|
- return (ack[1] == COMMAND_ACK);
|
|
|
|
|
|
+ return (ack[1] == COMMAND_ACK) ? 0 : -1;
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
@@ -341,8 +357,8 @@ int GfaBlmBUCmdGetStatus(HGFABLM hBlm, uint8_t nNodeAddr, uint8_t *pbStatus)
|
|
if((nRet = GfaMininetMasterTransmitFrame(pBlm->hMst, txb, nLen)) < nLen)
|
|
if((nRet = GfaMininetMasterTransmitFrame(pBlm->hMst, txb, nLen)) < nLen)
|
|
return nRet;
|
|
return nRet;
|
|
|
|
|
|
- if((nLen = GfaMininetMasterReceiveFrame(pBlm->hMst, rxb, sizeof(rxb), true)) < 0)
|
|
|
|
- return nLen;
|
|
|
|
|
|
+ if((nLen = GfaMininetMasterReceiveFrame(pBlm->hMst, rxb, sizeof(rxb), true)) <= 0)
|
|
|
|
+ return -1;
|
|
|
|
|
|
nRet = GfaMininetMasterEvaluateSlaveResponse(pBlm->hMst, nNodeAddr, rxb, nLen, true, &nIndex);
|
|
nRet = GfaMininetMasterEvaluateSlaveResponse(pBlm->hMst, nNodeAddr, rxb, nLen, true, &nIndex);
|
|
|
|
|
|
@@ -356,7 +372,7 @@ int GfaBlmBUCmdGetStatus(HGFABLM hBlm, uint8_t nNodeAddr, uint8_t *pbStatus)
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
- if((nRet = GfaBlmBUCmdPollData(hBlm, nNodeAddr, ack, 2, 200)) != 2)
|
|
|
|
|
|
+ if((nRet = GfaBlmBUCmdPollData(hBlm, nNodeAddr, ack, 2, 500)) != 2)
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -364,7 +380,7 @@ int GfaBlmBUCmdGetStatus(HGFABLM hBlm, uint8_t nNodeAddr, uint8_t *pbStatus)
|
|
{
|
|
{
|
|
if(ack[1] == COMMAND_ACK)
|
|
if(ack[1] == COMMAND_ACK)
|
|
{
|
|
{
|
|
- if((nRet = GfaBlmBUCmdPollData(hBlm, nNodeAddr, stat, 3, 200)) != 3)
|
|
|
|
|
|
+ if((nRet = GfaBlmBUCmdPollData(hBlm, nNodeAddr, stat, 3, 500)) != 3)
|
|
return -1;
|
|
return -1;
|
|
|
|
|
|
if((stat[0] == 3) && (stat[1] == stat[2]))
|
|
if((stat[0] == 3) && (stat[1] == stat[2]))
|
|
@@ -377,10 +393,18 @@ int GfaBlmBUCmdGetStatus(HGFABLM hBlm, uint8_t nNodeAddr, uint8_t *pbStatus)
|
|
return nRet;
|
|
return nRet;
|
|
|
|
|
|
if((nRet = GfaMininetMasterReceiveFrame(pBlm->hMst, rxb, sizeof(rxb), true)) <= 0)
|
|
if((nRet = GfaMininetMasterReceiveFrame(pBlm->hMst, rxb, sizeof(rxb), true)) <= 0)
|
|
- return nRet;
|
|
|
|
|
|
+ return -1;
|
|
|
|
|
|
nRet = GfaMininetMasterEvaluateSlaveResponse(pBlm->hMst, nNodeAddr, rxb, nRet, true, &nIndex);
|
|
nRet = GfaMininetMasterEvaluateSlaveResponse(pBlm->hMst, nNodeAddr, rxb, nRet, true, &nIndex);
|
|
- return 0;
|
|
|
|
|
|
+
|
|
|
|
+ if(nRet == MINET_SLAVE_RESPONSE_ACK)
|
|
|
|
+ return 0;
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+// TRACE("");
|
|
|
|
+ errno = EPROTO;
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
@@ -437,24 +461,34 @@ int GfaBlmBUCmdDownload(HGFABLM hBlm, uint8_t nNodeAddr, uint32_t nFlashStartAdd
|
|
|
|
|
|
GfaMininetMasterSaveTimeouts(pBlm->hMst);
|
|
GfaMininetMasterSaveTimeouts(pBlm->hMst);
|
|
GfaMininetMasterSetTimeouts(pBlm->hMst, &tv, NULL);
|
|
GfaMininetMasterSetTimeouts(pBlm->hMst, &tv, NULL);
|
|
-
|
|
|
|
- _EXEC_CALLBACK(pBlm->pfnBuCmdDownloadStatus, nNodeAddr, nFlashStartAddr, nCbData, 1, 0);
|
|
|
|
|
|
+
|
|
|
|
+ memset(&pBlm->dlpp, 0, sizeof(GFA_BLM_DL_PROGRESS_PARAMS));
|
|
|
|
+ pBlm->dlpp.nCbTotal = nCbData;
|
|
|
|
+ pBlm->dlpp.nFlashStartAddr = nFlashStartAddr;
|
|
|
|
+ pBlm->dlpp.nCntFlashPages = (nCbData + GFA_BOOTLOADER_FLASH_PAGE_SIZE - 1) / GFA_BOOTLOADER_FLASH_PAGE_SIZE;
|
|
|
|
+ pBlm->dlpp.nNodeAddr = nNodeAddr;
|
|
|
|
+ pBlm->dlpp.pParam = pBlm->pUserParam;
|
|
|
|
+ pBlm->dlpp.nCtx = GBDPS_StartEraseFlash;
|
|
|
|
+ _EXEC_PROGRESS_CALLBACK(pBlm->pfnDlProgress, &pBlm->dlpp);
|
|
|
|
|
|
if((nRet = GfaMininetMasterTransmitFrame(pBlm->hMst, txb, nLen)) != nLen)
|
|
if((nRet = GfaMininetMasterTransmitFrame(pBlm->hMst, txb, nLen)) != nLen)
|
|
{
|
|
{
|
|
- _EXEC_CALLBACK(pBlm->pfnBuCmdDownloadStatus, nNodeAddr, nFlashStartAddr, nCbData, 0, errno);
|
|
|
|
|
|
+ pBlm->dlpp.nCtx = GBDPS_Error;
|
|
|
|
+ pBlm->dlpp.nErrorCode = errno;
|
|
|
|
+ _EXEC_PROGRESS_CALLBACK(pBlm->pfnDlProgress, &pBlm->dlpp);
|
|
GfaMininetMasterRestoreTimeouts(pBlm->hMst);
|
|
GfaMininetMasterRestoreTimeouts(pBlm->hMst);
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
if((nRet = GfaMininetMasterReceiveFrame(pBlm->hMst, rxb, sizeof(rxb), true)) <= 0)
|
|
if((nRet = GfaMininetMasterReceiveFrame(pBlm->hMst, rxb, sizeof(rxb), true)) <= 0)
|
|
{
|
|
{
|
|
- _EXEC_CALLBACK(pBlm->pfnBuCmdDownloadStatus, nNodeAddr, nFlashStartAddr, nCbData, 0, errno);
|
|
|
|
|
|
+ pBlm->dlpp.nCtx = GBDPS_Error;
|
|
|
|
+ pBlm->dlpp.nErrorCode = errno;
|
|
|
|
+ _EXEC_PROGRESS_CALLBACK(pBlm->pfnDlProgress, &pBlm->dlpp);
|
|
GfaMininetMasterRestoreTimeouts(pBlm->hMst);
|
|
GfaMininetMasterRestoreTimeouts(pBlm->hMst);
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
-
|
|
|
|
- _EXEC_CALLBACK(pBlm->pfnBuCmdDownloadStatus, nNodeAddr, nFlashStartAddr, nCbData, 2, 0);
|
|
|
|
|
|
+
|
|
GfaMininetMasterRestoreTimeouts(pBlm->hMst);
|
|
GfaMininetMasterRestoreTimeouts(pBlm->hMst);
|
|
nRet = GfaMininetMasterEvaluateSlaveResponse(pBlm->hMst, nNodeAddr, rxb, nRet, true, &nIndex);
|
|
nRet = GfaMininetMasterEvaluateSlaveResponse(pBlm->hMst, nNodeAddr, rxb, nRet, true, &nIndex);
|
|
|
|
|
|
@@ -462,7 +496,9 @@ int GfaBlmBUCmdDownload(HGFABLM hBlm, uint8_t nNodeAddr, uint32_t nFlashStartAdd
|
|
{
|
|
{
|
|
if((nRet = GfaMininetMasterGetDataFromSlaveFrame(rxb, nLen, ack, 2)) != 2)
|
|
if((nRet = GfaMininetMasterGetDataFromSlaveFrame(rxb, nLen, ack, 2)) != 2)
|
|
{
|
|
{
|
|
- _EXEC_CALLBACK(pBlm->pfnBuCmdDownloadStatus, nNodeAddr, nFlashStartAddr, nCbData, 0, errno);
|
|
|
|
|
|
+ pBlm->dlpp.nCtx = GBDPS_Error;
|
|
|
|
+ pBlm->dlpp.nErrorCode = errno;
|
|
|
|
+ _EXEC_PROGRESS_CALLBACK(pBlm->pfnDlProgress, &pBlm->dlpp);
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -470,12 +506,15 @@ int GfaBlmBUCmdDownload(HGFABLM hBlm, uint8_t nNodeAddr, uint32_t nFlashStartAdd
|
|
{
|
|
{
|
|
if((nRet = GfaBlmBUCmdGetStatus(hBlm, nNodeAddr, &nStatus)))
|
|
if((nRet = GfaBlmBUCmdGetStatus(hBlm, nNodeAddr, &nStatus)))
|
|
{
|
|
{
|
|
- _EXEC_CALLBACK(pBlm->pfnBuCmdDownloadStatus, nNodeAddr, nFlashStartAddr, nCbData, 0, errno);
|
|
|
|
|
|
+ pBlm->dlpp.nCtx = GBDPS_Error;
|
|
|
|
+ pBlm->dlpp.nErrorCode = errno;
|
|
|
|
+ _EXEC_PROGRESS_CALLBACK(pBlm->pfnDlProgress, &pBlm->dlpp);
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
if(nStatus == COMMAND_RET_SUCCESS)
|
|
if(nStatus == COMMAND_RET_SUCCESS)
|
|
{
|
|
{
|
|
- _EXEC_CALLBACK(pBlm->pfnBuCmdDownloadStatus, nNodeAddr, nFlashStartAddr, nCbData, 3, 0);
|
|
|
|
|
|
+ pBlm->dlpp.nCtx = GBDPS_EndEraseFlash;
|
|
|
|
+ _EXEC_PROGRESS_CALLBACK(pBlm->pfnDlProgress, &pBlm->dlpp);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -487,7 +526,9 @@ int GfaBlmBUCmdDownload(HGFABLM hBlm, uint8_t nNodeAddr, uint32_t nFlashStartAdd
|
|
{
|
|
{
|
|
if((nRet = GfaBlmBUCmdPollData(hBlm, nNodeAddr, ack, 2, nTimeoutMS)) != 2)
|
|
if((nRet = GfaBlmBUCmdPollData(hBlm, nNodeAddr, ack, 2, nTimeoutMS)) != 2)
|
|
{
|
|
{
|
|
- _EXEC_CALLBACK(pBlm->pfnBuCmdDownloadStatus, nNodeAddr, nFlashStartAddr, nCbData, 0, errno);
|
|
|
|
|
|
+ pBlm->dlpp.nCtx = GBDPS_Error;
|
|
|
|
+ pBlm->dlpp.nErrorCode = errno;
|
|
|
|
+ _EXEC_PROGRESS_CALLBACK(pBlm->pfnDlProgress, &pBlm->dlpp);
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -495,30 +536,39 @@ int GfaBlmBUCmdDownload(HGFABLM hBlm, uint8_t nNodeAddr, uint32_t nFlashStartAdd
|
|
{
|
|
{
|
|
if((nRet = GfaBlmBUCmdGetStatus(hBlm, nNodeAddr, &nStatus)))
|
|
if((nRet = GfaBlmBUCmdGetStatus(hBlm, nNodeAddr, &nStatus)))
|
|
{
|
|
{
|
|
- _EXEC_CALLBACK(pBlm->pfnBuCmdDownloadStatus, nNodeAddr, nFlashStartAddr, nCbData, 0, errno);
|
|
|
|
|
|
+ pBlm->dlpp.nCtx = GBDPS_Error;
|
|
|
|
+ pBlm->dlpp.nErrorCode = errno;
|
|
|
|
+ _EXEC_PROGRESS_CALLBACK(pBlm->pfnDlProgress, &pBlm->dlpp);
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
if(nStatus == COMMAND_RET_SUCCESS)
|
|
if(nStatus == COMMAND_RET_SUCCESS)
|
|
{
|
|
{
|
|
- _EXEC_CALLBACK(pBlm->pfnBuCmdDownloadStatus, nNodeAddr, nFlashStartAddr, nCbData, 3, 0);
|
|
|
|
|
|
+ pBlm->dlpp.nCtx = GBDPS_EndEraseFlash;
|
|
|
|
+ _EXEC_PROGRESS_CALLBACK(pBlm->pfnDlProgress, &pBlm->dlpp);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
errno = EPROTO;
|
|
errno = EPROTO;
|
|
- _EXEC_CALLBACK(pBlm->pfnBuCmdDownloadStatus, nNodeAddr, nFlashStartAddr, nCbData, 0, errno);
|
|
|
|
|
|
+ pBlm->dlpp.nCtx = GBDPS_Error;
|
|
|
|
+ pBlm->dlpp.nErrorCode = errno;
|
|
|
|
+ _EXEC_PROGRESS_CALLBACK(pBlm->pfnDlProgress, &pBlm->dlpp);
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
else if(nRet == MINET_SLAVE_RESPONSE_INDEX_IS_STATUS_CODE)
|
|
else if(nRet == MINET_SLAVE_RESPONSE_INDEX_IS_STATUS_CODE)
|
|
{
|
|
{
|
|
errno = -(int)nIndex;
|
|
errno = -(int)nIndex;
|
|
- _EXEC_CALLBACK(pBlm->pfnBuCmdDownloadStatus, nNodeAddr, nFlashStartAddr, nCbData, 0, errno);
|
|
|
|
|
|
+ pBlm->dlpp.nCtx = GBDPS_Error;
|
|
|
|
+ pBlm->dlpp.nErrorCode = errno;
|
|
|
|
+ _EXEC_PROGRESS_CALLBACK(pBlm->pfnDlProgress, &pBlm->dlpp);
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
errno = EPROTO;
|
|
errno = EPROTO;
|
|
- _EXEC_CALLBACK(pBlm->pfnBuCmdDownloadStatus, nNodeAddr, nFlashStartAddr, nCbData, 0, errno);
|
|
|
|
|
|
+ pBlm->dlpp.nCtx = GBDPS_Error;
|
|
|
|
+ pBlm->dlpp.nErrorCode = errno;
|
|
|
|
+ _EXEC_PROGRESS_CALLBACK(pBlm->pfnDlProgress, &pBlm->dlpp);
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -540,7 +590,7 @@ int GfaBlmBUCmdSendDataBlock(HGFABLM hBlm, uint8_t nNodeAddr, const void *pDataB
|
|
tv.tv_usec = 500000;
|
|
tv.tv_usec = 500000;
|
|
GfaMininetMasterSaveTimeouts(pBlm->hMst);
|
|
GfaMininetMasterSaveTimeouts(pBlm->hMst);
|
|
GfaMininetMasterSetTimeouts(pBlm->hMst, &tv, NULL);
|
|
GfaMininetMasterSetTimeouts(pBlm->hMst, &tv, NULL);
|
|
-
|
|
|
|
|
|
+
|
|
do
|
|
do
|
|
{
|
|
{
|
|
size_t s;
|
|
size_t s;
|
|
@@ -633,7 +683,7 @@ int GfaBlmBUCmdSendDataBlock(HGFABLM hBlm, uint8_t nNodeAddr, const void *pDataB
|
|
}
|
|
}
|
|
}
|
|
}
|
|
while(false);
|
|
while(false);
|
|
-
|
|
|
|
|
|
+
|
|
GfaMininetMasterRestoreTimeouts(pBlm->hMst);
|
|
GfaMininetMasterRestoreTimeouts(pBlm->hMst);
|
|
return nRet;
|
|
return nRet;
|
|
}
|
|
}
|
|
@@ -652,42 +702,61 @@ int GfaBlmBUCmdSendData(HGFABLM hBlm, uint8_t nNodeAddr, const void *pData, size
|
|
LPGFA_BLM pBlm = (LPGFA_BLM)hBlm;
|
|
LPGFA_BLM pBlm = (LPGFA_BLM)hBlm;
|
|
const uint8_t *pbData = (const uint8_t*)pData;
|
|
const uint8_t *pbData = (const uint8_t*)pData;
|
|
uint32_t nSent = 0;
|
|
uint32_t nSent = 0;
|
|
|
|
+
|
|
|
|
+ if(pBlm->dlpp.nNodeAddr != nNodeAddr)
|
|
|
|
+ {
|
|
|
|
+ errno = EINVAL;
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
|
|
- if(!nCbBlock || nCbBlock < 4 || nCbBlock > _MAX_SEND_DATA_BLOCK_SIZE)
|
|
|
|
- nCbBlock = _DEF_SEND_DATA_BLOCK_SIZE;
|
|
|
|
|
|
+ if(!nCbBlock || nCbBlock < 4 || nCbBlock > GFA_BOOTLOADER_MAX_SEND_DATA_BLOCK_SIZE)
|
|
|
|
+ nCbBlock = GFA_BOOTLOADER_MAX_SEND_DATA_BLOCK_SIZE;
|
|
else
|
|
else
|
|
nCbBlock &= ~0x03;
|
|
nCbBlock &= ~0x03;
|
|
|
|
|
|
- _EXEC_CALLBACK(pBlm->pfnBuCmdSendDataStatus, nNodeAddr, nCbBlock, nSent, 1, 0);
|
|
|
|
-
|
|
|
|
|
|
+ pBlm->dlpp.nCtx = GBDPS_StartUploadBlocks;
|
|
|
|
+ pBlm->dlpp.nCbBlock = nCbBlock;
|
|
|
|
+ pBlm->dlpp.nCbSent = nSent;
|
|
|
|
+ _EXEC_PROGRESS_CALLBACK(pBlm->pfnDlProgress, &pBlm->dlpp);
|
|
|
|
+
|
|
while(nCbData >= nCbBlock)
|
|
while(nCbData >= nCbBlock)
|
|
{
|
|
{
|
|
if((nRet = GfaBlmBUCmdSendDataBlock(hBlm, nNodeAddr, pbData, nCbBlock)) != 0)
|
|
if((nRet = GfaBlmBUCmdSendDataBlock(hBlm, nNodeAddr, pbData, nCbBlock)) != 0)
|
|
{
|
|
{
|
|
- _EXEC_CALLBACK(pBlm->pfnBuCmdSendDataStatus, nNodeAddr, nCbBlock, nSent, 0, errno);
|
|
|
|
|
|
+ pBlm->dlpp.nCtx = GBDPS_Error;
|
|
|
|
+ pBlm->dlpp.nErrorCode = errno;
|
|
|
|
+ _EXEC_PROGRESS_CALLBACK(pBlm->pfnDlProgress, &pBlm->dlpp);
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
nCbData -= nCbBlock;
|
|
nCbData -= nCbBlock;
|
|
pbData += nCbBlock;
|
|
pbData += nCbBlock;
|
|
nSent += nCbBlock;
|
|
nSent += nCbBlock;
|
|
|
|
|
|
- _EXEC_CALLBACK(pBlm->pfnBuCmdSendDataStatus, nNodeAddr, nCbBlock, nSent, 2, 0);
|
|
|
|
|
|
+ pBlm->dlpp.nCtx = GBDPS_UploadBlock;
|
|
|
|
+ pBlm->dlpp.nCbSent = nSent;
|
|
|
|
+ _EXEC_PROGRESS_CALLBACK(pBlm->pfnDlProgress, &pBlm->dlpp);
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
if(nCbData)
|
|
if(nCbData)
|
|
{
|
|
{
|
|
if((nRet = GfaBlmBUCmdSendDataBlock(hBlm, nNodeAddr, pbData, nCbData)) != 0)
|
|
if((nRet = GfaBlmBUCmdSendDataBlock(hBlm, nNodeAddr, pbData, nCbData)) != 0)
|
|
{
|
|
{
|
|
- _EXEC_CALLBACK(pBlm->pfnBuCmdSendDataStatus, nNodeAddr, nCbBlock, nSent, 0, errno);
|
|
|
|
|
|
+ pBlm->dlpp.nCtx = GBDPS_Error;
|
|
|
|
+ pBlm->dlpp.nErrorCode = errno;
|
|
|
|
+ _EXEC_PROGRESS_CALLBACK(pBlm->pfnDlProgress, &pBlm->dlpp);
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
nSent += nCbData;
|
|
nSent += nCbData;
|
|
nCbData = 0;
|
|
nCbData = 0;
|
|
|
|
|
|
- _EXEC_CALLBACK(pBlm->pfnBuCmdSendDataStatus, nNodeAddr, nCbBlock, nSent, 2, 0);
|
|
|
|
|
|
+ pBlm->dlpp.nCtx = GBDPS_UploadBlock;
|
|
|
|
+ pBlm->dlpp.nCbSent = nSent;
|
|
|
|
+ _EXEC_PROGRESS_CALLBACK(pBlm->pfnDlProgress, &pBlm->dlpp);
|
|
}
|
|
}
|
|
|
|
|
|
- _EXEC_CALLBACK(pBlm->pfnBuCmdSendDataStatus, nNodeAddr, nCbBlock, nSent, 3, 0);
|
|
|
|
|
|
+ pBlm->dlpp.nCtx = GBDPS_EndUploadBlocks;
|
|
|
|
+ pBlm->dlpp.nCbSent = nSent;
|
|
|
|
+ _EXEC_PROGRESS_CALLBACK(pBlm->pfnDlProgress, &pBlm->dlpp);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -705,7 +774,7 @@ int GfaBlmBUCmdSendDataFile(HGFABLM hBlm, uint8_t nNodeAddr, const char *pszFile
|
|
ssize_t nFileLen;
|
|
ssize_t nFileLen;
|
|
FILE *pf = NULL;
|
|
FILE *pf = NULL;
|
|
uint8_t *pBuf = NULL;
|
|
uint8_t *pBuf = NULL;
|
|
-
|
|
|
|
|
|
+
|
|
do
|
|
do
|
|
{
|
|
{
|
|
if(!(pf = fopen(pszFilename, "rb")))
|
|
if(!(pf = fopen(pszFilename, "rb")))
|
|
@@ -725,7 +794,7 @@ int GfaBlmBUCmdSendDataFile(HGFABLM hBlm, uint8_t nNodeAddr, const char *pszFile
|
|
}
|
|
}
|
|
}
|
|
}
|
|
while(false);
|
|
while(false);
|
|
-
|
|
|
|
|
|
+
|
|
if(pBuf)
|
|
if(pBuf)
|
|
free(pBuf);
|
|
free(pBuf);
|
|
if(pf)
|
|
if(pf)
|
|
@@ -744,24 +813,29 @@ GFA_BLM_EXEC_CONTEXT GfaBlmGetExecutionContext(HGFABLM hBlm, uint8_t nNodeAddr)
|
|
{
|
|
{
|
|
if(hBlm && !NODE_IS_MULTICAST(nNodeAddr))
|
|
if(hBlm && !NODE_IS_MULTICAST(nNodeAddr))
|
|
{
|
|
{
|
|
|
|
+ uint32_t nLoops = 0;
|
|
uint8_t nIndex;
|
|
uint8_t nIndex;
|
|
ssize_t nRet, nLen;
|
|
ssize_t nRet, nLen;
|
|
LPGFA_BLM pBlm = (LPGFA_BLM)hBlm;
|
|
LPGFA_BLM pBlm = (LPGFA_BLM)hBlm;
|
|
- char txb[32], rxb[32];
|
|
|
|
|
|
+ char txb[32], rxb[256];
|
|
|
|
|
|
- nLen = GfaMininetMasterBuildFrame(pBlm->hMst, nNodeAddr, 0, "BU", 2, txb, sizeof(txb));
|
|
|
|
|
|
+ do
|
|
|
|
+ {
|
|
|
|
+ nLen = GfaMininetMasterBuildFrame(pBlm->hMst, nNodeAddr, 0, "BU", 2, txb, sizeof(txb));
|
|
|
|
|
|
- if((nRet = GfaMininetMasterTransmitFrame(pBlm->hMst, txb, nLen)) != nLen)
|
|
|
|
- return GfaBlmCtx_Err;
|
|
|
|
|
|
+ if((nRet = GfaMininetMasterTransmitFrame(pBlm->hMst, txb, nLen)) != nLen)
|
|
|
|
+ return GfaBlmCtx_Err;
|
|
|
|
|
|
- if((nLen = GfaMininetMasterReceiveFrame(pBlm->hMst, rxb, sizeof(rxb), true)) <= 0)
|
|
|
|
- return GfaBlmCtx_Err;
|
|
|
|
|
|
+ if((nLen = GfaMininetMasterReceiveFrame(pBlm->hMst, rxb, sizeof(rxb), true)) <= 0)
|
|
|
|
+ return GfaBlmCtx_Err;
|
|
|
|
|
|
- nRet = GfaMininetMasterEvaluateSlaveResponse(pBlm->hMst, nNodeAddr, rxb, nLen, true, &nIndex);
|
|
|
|
|
|
+ nRet = GfaMininetMasterEvaluateSlaveResponse(pBlm->hMst, nNodeAddr, rxb, nLen, true, &nIndex);
|
|
|
|
+ }
|
|
|
|
+ while((nRet == MINET_SLAVE_RESPONSE_SUCCESS) && (nLoops++ < 10));
|
|
|
|
|
|
if(nRet == MINET_SLAVE_RESPONSE_SUCCESS)
|
|
if(nRet == MINET_SLAVE_RESPONSE_SUCCESS)
|
|
return GfaBlmCtx_Err;
|
|
return GfaBlmCtx_Err;
|
|
- else if(nRet == MINET_SLAVE_RESPONSE_ACK)
|
|
|
|
|
|
+ if(nRet == MINET_SLAVE_RESPONSE_ACK)
|
|
return GfaBlmCtx_Boot;
|
|
return GfaBlmCtx_Boot;
|
|
else if(nRet == MINET_SLAVE_RESPONSE_INDEX_IS_STATUS_CODE)
|
|
else if(nRet == MINET_SLAVE_RESPONSE_INDEX_IS_STATUS_CODE)
|
|
return GfaBlmCtx_App;
|
|
return GfaBlmCtx_App;
|
|
@@ -790,8 +864,8 @@ int GfaBlmBootloaderExecute(HGFABLM hBlm, uint8_t nNodeAddr, uint32_t *pnImgCRC3
|
|
if((nRet = GfaMininetMasterTransmitFrame(pBlm->hMst, txb, nLen)) != nLen)
|
|
if((nRet = GfaMininetMasterTransmitFrame(pBlm->hMst, txb, nLen)) != nLen)
|
|
return -1;
|
|
return -1;
|
|
|
|
|
|
- if((nLen = GfaMininetMasterReceiveFrame(pBlm->hMst, rxb, sizeof(rxb), true)) < 0)
|
|
|
|
- return nLen;
|
|
|
|
|
|
+ if((nLen = GfaMininetMasterReceiveFrame(pBlm->hMst, rxb, sizeof(rxb), true)) <= 0)
|
|
|
|
+ return -1;
|
|
|
|
|
|
nRet = GfaMininetMasterEvaluateSlaveResponse(pBlm->hMst, nNodeAddr, rxb, nLen, true, &nIndex);
|
|
nRet = GfaMininetMasterEvaluateSlaveResponse(pBlm->hMst, nNodeAddr, rxb, nLen, true, &nIndex);
|
|
|
|
|
|
@@ -802,12 +876,14 @@ int GfaBlmBootloaderExecute(HGFABLM hBlm, uint8_t nNodeAddr, uint32_t *pnImgCRC3
|
|
if(pnImgCRC32)
|
|
if(pnImgCRC32)
|
|
*pnImgCRC32 = bswap_32(nImgCRC32);
|
|
*pnImgCRC32 = bswap_32(nImgCRC32);
|
|
|
|
|
|
|
|
+ GfaBlmSetDeviceBaudrate(hBlm, _BOOTLOADER_DEF_BAUDRATE);
|
|
|
|
+
|
|
do
|
|
do
|
|
{
|
|
{
|
|
- if(nTimeoutMS > _BOOTLOADER_EXEC_WAIT_TIME)
|
|
|
|
|
|
+ if(nTimeoutMS > GFA_BOOTLOADER_EXEC_WAIT_TIME)
|
|
{
|
|
{
|
|
- usleep(_BOOTLOADER_EXEC_WAIT_TIME * 1000);
|
|
|
|
- nTimeoutMS -= _BOOTLOADER_EXEC_WAIT_TIME;
|
|
|
|
|
|
+ usleep(GFA_BOOTLOADER_EXEC_WAIT_TIME * 1000);
|
|
|
|
+ nTimeoutMS -= GFA_BOOTLOADER_EXEC_WAIT_TIME;
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
@@ -843,6 +919,34 @@ int GfaBlmBootloaderExecute(HGFABLM hBlm, uint8_t nNodeAddr, uint32_t *pnImgCRC3
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
+int GfaBlmGetDeviceBaudrate(HGFABLM hBlm, uint32_t *pnBaudrate)
|
|
|
|
+{
|
|
|
|
+ if(hBlm)
|
|
|
|
+ {
|
|
|
|
+ LPGFA_BLM pBlm = (LPGFA_BLM)hBlm;
|
|
|
|
+ return GfaMininetMasterGetBaudrate(pBlm->hMst, pnBaudrate);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ errno = EINVAL;
|
|
|
|
+ return -1;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
|
+
|
|
|
|
+int GfaBlmSetDeviceBaudrate(HGFABLM hBlm, uint32_t nBaudrate)
|
|
|
|
+{
|
|
|
|
+ if(hBlm)
|
|
|
|
+ {
|
|
|
|
+ LPGFA_BLM pBlm = (LPGFA_BLM)hBlm;
|
|
|
|
+ return GfaMininetMasterSetBaudrate(pBlm->hMst, nBaudrate);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ errno = EINVAL;
|
|
|
|
+ return -1;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/////////////////////////////////////////////////////////////////////////////
|
|
|
|
+
|
|
int GfaBlmBootloaderSetBaudrate(HGFABLM hBlm, uint8_t nNodeAddr, uint32_t nBaudrate)
|
|
int GfaBlmBootloaderSetBaudrate(HGFABLM hBlm, uint8_t nNodeAddr, uint32_t nBaudrate)
|
|
{
|
|
{
|
|
if(hBlm)
|
|
if(hBlm)
|
|
@@ -851,7 +955,7 @@ int GfaBlmBootloaderSetBaudrate(HGFABLM hBlm, uint8_t nNodeAddr, uint32_t nBaudr
|
|
size_t s;
|
|
size_t s;
|
|
ssize_t nRet, nLen;
|
|
ssize_t nRet, nLen;
|
|
LPGFA_BLM pBlm = (LPGFA_BLM)hBlm;
|
|
LPGFA_BLM pBlm = (LPGFA_BLM)hBlm;
|
|
-
|
|
|
|
|
|
+
|
|
if(GfaMininetMasterIsValidBaudrate(pBlm->hMst, nBaudrate))
|
|
if(GfaMininetMasterIsValidBaudrate(pBlm->hMst, nBaudrate))
|
|
{
|
|
{
|
|
char txb[32], rxb[32], cmd[8];
|
|
char txb[32], rxb[32], cmd[8];
|
|
@@ -862,12 +966,12 @@ int GfaBlmBootloaderSetBaudrate(HGFABLM hBlm, uint8_t nNodeAddr, uint32_t nBaudr
|
|
|
|
|
|
if((nRet = GfaMininetMasterTransmitFrame(pBlm->hMst, txb, nLen)) != nLen)
|
|
if((nRet = GfaMininetMasterTransmitFrame(pBlm->hMst, txb, nLen)) != nLen)
|
|
return nRet;
|
|
return nRet;
|
|
-
|
|
|
|
|
|
+
|
|
if(NODE_IS_MULTICAST(nNodeAddr))
|
|
if(NODE_IS_MULTICAST(nNodeAddr))
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
- if((nLen = GfaMininetMasterReceiveFrame(pBlm->hMst, rxb, sizeof(rxb), true)) < 0)
|
|
|
|
- return nLen;
|
|
|
|
|
|
+ if((nLen = GfaMininetMasterReceiveFrame(pBlm->hMst, rxb, sizeof(rxb), true)) <= 0)
|
|
|
|
+ return -1;
|
|
|
|
|
|
nRet = GfaMininetMasterEvaluateSlaveResponse(pBlm->hMst, nNodeAddr, rxb, nLen, true, &nIndex);
|
|
nRet = GfaMininetMasterEvaluateSlaveResponse(pBlm->hMst, nNodeAddr, rxb, nLen, true, &nIndex);
|
|
|
|
|
|
@@ -923,8 +1027,8 @@ int GfaBlmBootloaderDump(HGFABLM hBlm, uint8_t nNodeAddr, uint32_t nAddress, uin
|
|
if((nRet = GfaMininetMasterTransmitFrame(pBlm->hMst, txb, nLen)) != nLen)
|
|
if((nRet = GfaMininetMasterTransmitFrame(pBlm->hMst, txb, nLen)) != nLen)
|
|
return nRet;
|
|
return nRet;
|
|
|
|
|
|
- if((nLen = GfaMininetMasterReceiveFrame(pBlm->hMst, rxb, sizeof(rxb), true)) < 0)
|
|
|
|
- return nLen;
|
|
|
|
|
|
+ if((nLen = GfaMininetMasterReceiveFrame(pBlm->hMst, rxb, sizeof(rxb), true)) <= 0)
|
|
|
|
+ return -1;
|
|
|
|
|
|
nRet = GfaMininetMasterEvaluateSlaveResponse(pBlm->hMst, nNodeAddr, rxb, nLen, true, &nIndex);
|
|
nRet = GfaMininetMasterEvaluateSlaveResponse(pBlm->hMst, nNodeAddr, rxb, nLen, true, &nIndex);
|
|
|
|
|
|
@@ -1161,7 +1265,7 @@ int GfaBlmGetImgInfo(HGFABLM hBlm, uint8_t nNodeAddr, uint32_t nDumpAddr, bool b
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
-int GfaBlmGetInfoBD(HGFABLM hBlm, uint8_t nNodeAddr, LPGFA_BL_APP_IMG_INFO paii)
|
|
|
|
|
|
+int GfaBlmGetInfoBD(HGFABLM hBlm, uint8_t nNodeAddr, uint32_t nAppBaseAddr, LPGFA_BL_APP_IMG_INFO paii)
|
|
{
|
|
{
|
|
if(hBlm && paii && !NODE_IS_MULTICAST(nNodeAddr))
|
|
if(hBlm && paii && !NODE_IS_MULTICAST(nNodeAddr))
|
|
{
|
|
{
|
|
@@ -1173,7 +1277,7 @@ int GfaBlmGetInfoBD(HGFABLM hBlm, uint8_t nNodeAddr, LPGFA_BL_APP_IMG_INFO paii)
|
|
paii->bl.nImgLength = paii->bl.nImgCRC32 = 0xFFFFFFFF;
|
|
paii->bl.nImgLength = paii->bl.nImgCRC32 = 0xFFFFFFFF;
|
|
}
|
|
}
|
|
|
|
|
|
- if((nRet2 = GfaBlmGetImgInfo(hBlm, nNodeAddr, GFA_APP_APPLICATION_START_ADDRESS, true, &paii->app)) < 0)
|
|
|
|
|
|
+ if((nRet2 = GfaBlmGetImgInfo(hBlm, nNodeAddr, nAppBaseAddr, true, &paii->app)) < 0)
|
|
{
|
|
{
|
|
memset(&paii->app, 0, sizeof(paii->app));
|
|
memset(&paii->app, 0, sizeof(paii->app));
|
|
paii->app.nImgLength = paii->app.nImgCRC32 = 0xFFFFFFFF;
|
|
paii->app.nImgLength = paii->app.nImgCRC32 = 0xFFFFFFFF;
|
|
@@ -1202,8 +1306,8 @@ int GfaBlmGetInfoBI(HGFABLM hBlm, uint8_t nNodeAddr, LPGFA_BL_APP_IMG_INFO paii)
|
|
if((nRet = GfaMininetMasterTransmitFrame(pBlm->hMst, txb, nLen)) != nLen)
|
|
if((nRet = GfaMininetMasterTransmitFrame(pBlm->hMst, txb, nLen)) != nLen)
|
|
return nRet;
|
|
return nRet;
|
|
|
|
|
|
- if((nLen = GfaMininetMasterReceiveFrame(pBlm->hMst, rxb, sizeof(rxb), true)) < 0)
|
|
|
|
- return nLen;
|
|
|
|
|
|
+ if((nLen = GfaMininetMasterReceiveFrame(pBlm->hMst, rxb, sizeof(rxb), true)) <= 0)
|
|
|
|
+ return -1;
|
|
|
|
|
|
nRet = GfaMininetMasterEvaluateSlaveResponse(pBlm->hMst, nNodeAddr, rxb, nLen, true, &nIndex);
|
|
nRet = GfaMininetMasterEvaluateSlaveResponse(pBlm->hMst, nNodeAddr, rxb, nLen, true, &nIndex);
|
|
|
|
|
|
@@ -1256,8 +1360,8 @@ int GfaBlmReadMaterialAndSerialID(HGFABLM hBlm, uint8_t nNodeAddr, char *pszMate
|
|
if((nRet = GfaMininetMasterTransmitFrame(pBlm->hMst, txb, nLen)) != nLen)
|
|
if((nRet = GfaMininetMasterTransmitFrame(pBlm->hMst, txb, nLen)) != nLen)
|
|
return nRet;
|
|
return nRet;
|
|
|
|
|
|
- if((nLen = GfaMininetMasterReceiveFrame(pBlm->hMst, rxb, sizeof(rxb), true)) < 0)
|
|
|
|
- return nLen;
|
|
|
|
|
|
+ if((nLen = GfaMininetMasterReceiveFrame(pBlm->hMst, rxb, sizeof(rxb), true)) <= 0)
|
|
|
|
+ return -1;
|
|
|
|
|
|
nRet = GfaMininetMasterEvaluateSlaveResponse(pBlm->hMst, nNodeAddr, rxb, nLen, true, &nIndex);
|
|
nRet = GfaMininetMasterEvaluateSlaveResponse(pBlm->hMst, nNodeAddr, rxb, nLen, true, &nIndex);
|
|
|
|
|
|
@@ -1317,7 +1421,10 @@ int GfaBlmWriteMaterialAndSerialID(HGFABLM hBlm, uint8_t nNodeAddr, const char *
|
|
nLenSerial = strlen(pszSerial);
|
|
nLenSerial = strlen(pszSerial);
|
|
|
|
|
|
if((nLenMaterial > 15) || (nLenSerial > 15))
|
|
if((nLenMaterial > 15) || (nLenSerial > 15))
|
|
|
|
+ {
|
|
|
|
+ errno = EINVAL;
|
|
return -1;
|
|
return -1;
|
|
|
|
+ }
|
|
|
|
|
|
memcpy(ts.szMaterial, pszMaterial, nLenMaterial);
|
|
memcpy(ts.szMaterial, pszMaterial, nLenMaterial);
|
|
if(nLenMaterial < 15)
|
|
if(nLenMaterial < 15)
|
|
@@ -1335,8 +1442,8 @@ int GfaBlmWriteMaterialAndSerialID(HGFABLM hBlm, uint8_t nNodeAddr, const char *
|
|
if((nRet = GfaMininetMasterTransmitFrame(pBlm->hMst, txb, nLen)) != nLen)
|
|
if((nRet = GfaMininetMasterTransmitFrame(pBlm->hMst, txb, nLen)) != nLen)
|
|
return nRet;
|
|
return nRet;
|
|
|
|
|
|
- if((nRet = GfaMininetMasterReceiveFrame(pBlm->hMst, rxb, sizeof(rxb), true)) < 0)
|
|
|
|
- return nRet;
|
|
|
|
|
|
+ if((nRet = GfaMininetMasterReceiveFrame(pBlm->hMst, rxb, sizeof(rxb), true)) <= 0)
|
|
|
|
+ return -1;
|
|
|
|
|
|
nRet = GfaMininetMasterEvaluateSlaveResponse(pBlm->hMst, nNodeAddr, rxb, nRet, true, &nIndex);
|
|
nRet = GfaMininetMasterEvaluateSlaveResponse(pBlm->hMst, nNodeAddr, rxb, nRet, true, &nIndex);
|
|
|
|
|