123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531 |
- #include "hal_types.h"
- #include "ota_common.h"
- #ifdef _WIN32
- #include <string.h>
- #define osal_memcpy memcpy
- #define osal_strlen strlen
- #else
- #include "osal.h"
- #endif
- #define UINT16_BREAK_HEX(a, b) (((a) >> (12-(4*(b)))) & 0xF)
- #define UINT32_BREAK_HEX(a, b) (((a) >> (28-(4*(b)))) & 0xF)
- static char HEX_char[] = "0123456789ABCDEF";
- static uint8 char2uint(char c);
- static uint8 char2uint(char c)
- {
- if (c >= '0' && c <= '9')
- {
- return c - '0';
- }
- if (c >= 'a' && c <= 'f')
- {
- return 0xA + c - 'a';
- }
- if (c >= 'A' && c <= 'F')
- {
- return 0xA + c - 'A';
- }
- return 0;
- }
- uint8 *OTA_ParseHeader(OTA_ImageHeader_t *pHdr, uint8 *pBuf)
- {
- uint8 i;
-
- pHdr->magicNumber = BUILD_UINT32(pBuf[0], pBuf[1], pBuf[2], pBuf[3]);
- pBuf += 4;
-
- pHdr->headerVersion = BUILD_UINT16(pBuf[0], pBuf[1]);
- pBuf += 2;
-
- pHdr->headerLength = BUILD_UINT16(pBuf[0], pBuf[1]);
- pBuf += 2;
-
- pHdr->fieldControl = BUILD_UINT16(pBuf[0], pBuf[1]);
- pBuf += 2;
-
- pHdr->fileId.manufacturer = BUILD_UINT16(pBuf[0], pBuf[1]);
- pBuf += 2;
-
- pHdr->fileId.type = BUILD_UINT16(pBuf[0], pBuf[1]);
- pBuf += 2;
-
- pHdr->fileId.version = BUILD_UINT32(pBuf[0], pBuf[1], pBuf[2], pBuf[3]);
- pBuf += 4;
-
- pHdr->stackVersion = BUILD_UINT16(pBuf[0], pBuf[1]);
- pBuf += 2;
-
- for (i=0; i<OTA_HEADER_STR_LEN; i++)
- {
- pHdr->headerString[i] = *pBuf++;
- }
-
- pHdr->imageSize = BUILD_UINT32(pBuf[0], pBuf[1], pBuf[2], pBuf[3]);
- pBuf += 4;
-
- if (pHdr->fieldControl & OTA_FC_SCV_PRESENT)
- {
- pHdr->secCredentialVer = *pBuf++;
- }
-
- if (pHdr->fieldControl & OTA_FC_DSF_PRESENT)
- {
- for (i=0; i<Z_EXTADDR_LEN; i++)
- {
- pHdr->destIEEE[i] = *pBuf++;
- }
- }
-
- if (pHdr->fieldControl & OTA_FC_HWV_PRESENT)
- {
- pHdr->minHwVer = BUILD_UINT16(pBuf[0], pBuf[1]);
- pBuf += 2;
- pHdr->maxHwVer = BUILD_UINT16(pBuf[0], pBuf[1]);
- pBuf += 2;
- }
- return pBuf;
- }
- uint8 *OTA_WriteHeader(OTA_ImageHeader_t *pHdr, uint8 *pBuf)
- {
- uint8 i;
-
-
-
- *pBuf++ = BREAK_UINT32(pHdr->magicNumber, 0);
- *pBuf++ = BREAK_UINT32(pHdr->magicNumber, 1);
- *pBuf++ = BREAK_UINT32(pHdr->magicNumber, 2);
- *pBuf++ = BREAK_UINT32(pHdr->magicNumber, 3);
-
- *pBuf++ = LO_UINT16(pHdr->headerVersion);
- *pBuf++ = HI_UINT16(pHdr->headerVersion);
-
- *pBuf++ = LO_UINT16(pHdr->headerLength);
- *pBuf++ = HI_UINT16(pHdr->headerLength);
-
- *pBuf++ = LO_UINT16(pHdr->fieldControl);
- *pBuf++ = HI_UINT16(pHdr->fieldControl);
-
- *pBuf++ = LO_UINT16(pHdr->fileId.manufacturer);
- *pBuf++ = HI_UINT16(pHdr->fileId.manufacturer);
-
- *pBuf++ = LO_UINT16(pHdr->fileId.type);
- *pBuf++ = HI_UINT16(pHdr->fileId.type);
-
-
-
- *pBuf++ = BREAK_UINT32(pHdr->fileId.version, 0);
- *pBuf++ = BREAK_UINT32(pHdr->fileId.version, 1);
- *pBuf++ = BREAK_UINT32(pHdr->fileId.version, 2);
- *pBuf++ = BREAK_UINT32(pHdr->fileId.version, 3);
-
- *pBuf++ = LO_UINT16(pHdr->stackVersion);
- *pBuf++ = HI_UINT16(pHdr->stackVersion);
-
- for (i=0; i<OTA_HEADER_STR_LEN; i++)
- {
- *pBuf++ = pHdr->headerString[i];
- }
-
-
-
- *pBuf++ = BREAK_UINT32(pHdr->imageSize, 0);
- *pBuf++ = BREAK_UINT32(pHdr->imageSize, 1);
- *pBuf++ = BREAK_UINT32(pHdr->imageSize, 2);
- *pBuf++ = BREAK_UINT32(pHdr->imageSize, 3);
-
- if (pHdr->fieldControl & OTA_FC_SCV_PRESENT)
- {
- *pBuf++ = pHdr->secCredentialVer;
- }
-
- if (pHdr->fieldControl & OTA_FC_DSF_PRESENT)
- {
- for (i=0; i<Z_EXTADDR_LEN; i++)
- {
- *pBuf++ = pHdr->destIEEE[i];
- }
- }
-
- if (pHdr->fieldControl & OTA_FC_HWV_PRESENT)
- {
- *pBuf++ = LO_UINT16(pHdr->minHwVer);
- *pBuf++ = HI_UINT16(pHdr->minHwVer);
- *pBuf++ = LO_UINT16(pHdr->maxHwVer);
- *pBuf++ = HI_UINT16(pHdr->maxHwVer);
- }
- return pBuf;
- }
- void OTA_GetFileName(char *pName, zclOTA_FileID_t *pFileId, char *text)
- {
- int8 i, len;
-
- if (pFileId->manufacturer == 0xFFFF)
- {
- *pName++ = '*';
- }
- else
- {
- for (i=0; i<4; i++)
- {
- *pName++ = HEX_char[UINT16_BREAK_HEX(pFileId->manufacturer, i)];
- }
- }
- *pName++ = '-';
-
- if (pFileId->type == 0xFFFF)
- {
- *pName++ = '*';
- }
- else
- {
- for (i=0; i<4; i++)
- {
- *pName++ = HEX_char[UINT16_BREAK_HEX(pFileId->type, i)];
- }
- }
- *pName++ = '-';
-
- if (pFileId->version == 0xFFFFFFFF)
- {
- *pName++ = '*';
- }
- else
- {
- for (i=0; i<8; i++)
- {
- *pName++ = HEX_char[UINT32_BREAK_HEX(pFileId->version, i)];
- }
- }
- if (text)
- {
- len = (uint8) osal_strlen(text);
- if (len)
- {
- *pName++ = '-';
- osal_memcpy (pName, text, len);
- pName += len;
- }
- }
- osal_memcpy (pName, ".zigbee", 8);
- }
- void OTA_SplitFileName(char *pName, zclOTA_FileID_t *pFileId)
- {
-
-
-
-
-
-
-
-
- if (pName && pFileId)
- {
- uint8 len = (uint8) osal_strlen(pName);
- if (len >= 19)
- {
- uint8 i;
- pFileId->manufacturer = 0;
- for (i=0; i<4; i++)
- {
- pFileId->manufacturer |= ((uint16) char2uint(*pName++)) << (12 - (4*i));
- }
- pName++;
- pFileId->type = 0;
- for (i=0; i<4; i++)
- {
- pFileId->type |= ((uint16) char2uint(*pName++)) << (12 - (4*i));
- }
- pName++;
- pFileId->version = 0;
- for (i=0; i<8; i++)
- {
- pFileId->version |= ((uint32) char2uint(*pName++)) << (28 - (4*i));
- }
- }
- }
- }
- uint8 *OTA_FileIdToStream(zclOTA_FileID_t *pFileId, uint8 *pStream)
- {
- if (pStream)
- {
- *pStream++ = LO_UINT16(pFileId->manufacturer);
- *pStream++ = HI_UINT16(pFileId->manufacturer);
- *pStream++ = LO_UINT16(pFileId->type);
- *pStream++ = HI_UINT16(pFileId->type);
-
-
- *pStream++ = BREAK_UINT32(pFileId->version, 0);
- *pStream++ = BREAK_UINT32(pFileId->version, 1);
- *pStream++ = BREAK_UINT32(pFileId->version, 2);
- *pStream++ = BREAK_UINT32(pFileId->version, 3);
- }
- return pStream;
- }
- uint8 *OTA_StreamToFileId(zclOTA_FileID_t *pFileId, uint8 *pStream)
- {
- if (pStream)
- {
- pFileId->manufacturer = BUILD_UINT16(pStream[0], pStream[1]);
- pStream += 2;
- pFileId->type = BUILD_UINT16(pStream[0], pStream[1]);
- pStream += 2;
- pFileId->version = BUILD_UINT32(pStream[0], pStream[1], pStream[2], pStream[3]);
- pStream += 4;
- }
- return pStream;
- }
- uint8 *OTA_AfAddrToStream(afAddrType_t *pAddr, uint8 *pStream)
- {
- if (pAddr && pStream)
- {
- *pStream++ = pAddr->addrMode;
- if (pAddr->addrMode == afAddr16Bit)
- {
- *pStream++ = LO_UINT16(pAddr->addr.shortAddr);
- *pStream++ = HI_UINT16(pAddr->addr.shortAddr);
- }
- else if (pAddr->addrMode == afAddr64Bit)
- {
- osal_memcpy(pStream, pAddr->addr.extAddr, Z_EXTADDR_LEN);
- pStream += Z_EXTADDR_LEN;
- }
- *pStream++ = pAddr->endPoint;
- *pStream++ = LO_UINT16(pAddr->panId);
- *pStream++ = HI_UINT16(pAddr->panId);
- }
- return pStream;
- }
- uint8 *OTA_StreamToAfAddr(afAddrType_t *pAddr, uint8 *pStream)
- {
- if (pAddr && pStream)
- {
- pAddr->addrMode = (afAddrMode_t) *pStream++;
- if (pAddr->addrMode == afAddr16Bit)
- {
- pAddr->addr.shortAddr = BUILD_UINT16(pStream[0], pStream[1]);
- pStream+= 2;
- }
- else if (pAddr->addrMode == afAddr64Bit)
- {
- osal_memcpy(pAddr->addr.extAddr, pStream, Z_EXTADDR_LEN);
- pStream += Z_EXTADDR_LEN;
- }
- pAddr->endPoint = *pStream++;
- pAddr->panId = BUILD_UINT16(pStream[0], pStream[1]);
- pStream+= 2;
- }
- return pStream;
- }
|