66 #include <ti/control/mmwavelink/mmwavelink.h> 67 #include <ti/control/mmwavelink/include/rl_driver.h> 68 #include <ti/control/mmwavelink/include/rl_messages.h> 69 #include <ti/control/mmwavelink/include/rl_controller.h> 70 #include <ti/control/mmwavelink/include/rl_protocol.h> 71 #include <ti/control/mmwavelink/include/rl_trace.h> 78 #define RL_PENDING_RX_MSG(driverData, index) \ 79 (((driverData)->rxIrqCnt[(index)]) != ((driverData)->rxDoneCnt[(index)])) 82 #define RL_IF_WRITE(fd,pBuff,len) \ 83 rl_driverData.clientCtx.comIfCb.rlComIfWrite((fd),(pBuff),(len)) 84 #define RL_IF_READ(fd,pBuff,len) \ 85 rl_driverData.clientCtx.comIfCb.rlComIfRead((fd),(pBuff),(len)) 89 #define RL_IF_WRITE_CHECK(fd,pBuff,len) \ 91 if (((rlInt32_t)(len)) != RL_IF_WRITE((fd), (pBuff), (len)))\ 93 return RL_RET_CODE_RADAR_IF_ERROR;\ 96 #define RL_IF_READ_CHECK(fd,pBuff,len) \ 98 if (((rlInt32_t)(len)) != RL_IF_READ((fd), (pBuff), (len)))\ 100 return RL_RET_CODE_RADAR_IF_ERROR;\ 105 #define RL_SYNC_SCAN_THRESHOLD (1000U) 108 #define RL_RHCP_HDR_OPCODE_CLASS(ptr) \ 109 (rlUInt8_t) (((rlProtHeader_t *)(ptr))->opcode.b2MsgType) 112 #define RL_RHCP_HDR_PL_LENGTH(ptr) (((rlProtHeader_t *)(ptr))->len) 114 #define PATTERN_NOT_MATCHED ((rlInt32_t)0x0) 115 #define SYNC_PATTERN_MATCHED ((rlInt32_t)0x1) 116 #define CNYS_PATTERN_MATCHED ((rlInt32_t)0x2) 119 #define D2H_SYNC_PATTERN_1 (0xDCBAU) 120 #define D2H_SYNC_PATTERN_2 (0xABCDU) 121 #define H2D_SYNC_PATTERN_1 (0x1234U) 122 #define H2D_SYNC_PATTERN_2 (0x4321U) 123 #define H2D_CNYS_PATTERN_1 (0x5678U) 124 #define H2D_CNYS_PATTERN_2 (0x8765U) 133 #pragma DATA_ALIGN(rl_driverData, 4); 139 #pragma DATA_ALIGN(rl_txMsg, 8); 143 #pragma DATA_ALIGN(rl_rxMsg, 8); 151 static rlReturnVal_t rlDriverOriginDirCheck(rlUInt8_t deviceRunId, rlUInt16_t dataDir);
152 static rlUInt8_t rlDriverReceiveSync(rlComIfHdl_t comIfHdl, rlUInt8_t syncBuf[],
153 rlInt32_t *syncType);
154 static rlReturnVal_t rlDriverClientCbCheck(
rlClientCbs_t clientCb);
155 static rlReturnVal_t rlDriverOsiCbCheck(
rlClientCbs_t clientCb);
156 static rlReturnVal_t rlDriverCmdWriter(rlUInt8_t devIndex,
rlDriverMsg_t* outMsg);
179 for (shiftIdx = 0U; shiftIdx < 7U; shiftIdx++)
182 buf[shiftIdx] = buf[shiftIdx + 1U];
205 rlUInt8_t crcType, rlUInt8_t crc[RL_CRC_LEN_MAX])
207 rlReturnVal_t retVal;
209 RL_LOGV_ARG0(
"rlDriverCalCRC starts...\n");
220 retVal = RL_RET_CODE_INTERFACE_CB_NULL;
222 RL_LOGV_ARG0(
"rlDriverCalCRC ends...\n");
244 rlUInt8_t crcType, rlUInt8_t crc[RL_CRC_LEN_MAX])
247 rlUInt8_t crcByte[RL_CRC_LEN_MAX];
248 rlReturnVal_t retVal = RL_RET_CODE_OK;
250 RL_LOGV_ARG0(
"rlDriverVerifyCRC starts...\n");
254 crcType, &crcByte[0U]))
257 retVal += RL_RET_CODE_RADAR_IF_ERROR;
262 for (indx = 0U; indx < (2U << crcType); indx++)
264 if (crcByte[indx] != crc[indx])
267 retVal += RL_RET_CODE_CRC_FAILED;
272 RL_LOGV_ARG0(
"rlDriverVerifyCRC ends...\n");
291 rlReturnVal_t rlDriverCalChkSum(
rlProtHeader_t* hdrData, rlUInt8_t len,
292 rlUInt16_t* checksum)
295 rlUInt32_t checkSumVal = 0U;
296 rlUInt8_t *localGenHdr = (rlUInt8_t *)hdrData;
297 rlReturnVal_t retVal;
299 RL_LOGV_ARG0(
"rlDriverCalChkSum starts...\n");
302 if (localGenHdr != RL_NULL_PTR)
312 checkSumVal += *((rlUInt16_t*) localGenHdr);
316 if ((checkSumVal & 0x80000000U) != 0U)
318 checkSumVal = (checkSumVal & 0xFFFFU) + (checkSumVal >> 16U);
326 checkSumVal += (rlUInt32_t) (*((rlUInt8_t *)localGenHdr));
329 while ((checkSumVal >> 16U) != 0U)
331 checkSumVal = (checkSumVal & 0xFFFFU) + (checkSumVal >> 16U);
333 RL_LOGV_ARG1(
"Final checksum 0x%X\n", *checksum);
336 *(checksum) = (rlUInt16_t)~checkSumVal;
337 retVal = RL_RET_CODE_OK;
341 retVal = RL_RET_CODE_FATAL_ERROR;
344 RL_LOGV_ARG0(
"rlDriverCalChkSum ends...\n");
363 rlReturnVal_t retVal;
364 rlUInt16_t checkSum = 0U;
369 if (RL_RET_CODE_OK != rlDriverCalChkSum(&protHdr, ((rlUInt8_t)(RHCP_HEADER_LEN - 2U)),
373 retVal = RL_RET_CODE_RADAR_IF_ERROR;
378 if (protHdr.chksum != checkSum)
381 retVal = RL_RET_CODE_CHKSUM_FAILED;
382 RL_LOGE_ARG0(
"Checksum validation failed for header\n");
387 RL_LOGD_ARG0(
"Checksum validation is successful\n");
388 retVal= RL_RET_CODE_OK;
411 RL_LOGV_ARG0(
"rlDeviceIdentifyCmdDir starts...\n");
414 if ((RL_RF_RESP_ERROR_MSG < msgId) && (RL_RF_ASYNC_EVENT_MSG > msgId))
417 if (RL_PLATFORM_MSS == platform)
419 cmdDir = RL_API_DIR_MSS_TO_BSS;
422 else if (RL_PLATFORM_HOST == platform)
424 cmdDir = RL_API_DIR_HOST_TO_BSS;
429 cmdDir = RL_API_DIR_DSS_TO_BSS;
431 RL_LOGV_ARG1(
"cmdDir for radarSS = %d (1:host2Bss, 10:dss2Bss, 8:mss2bss)\n",\
435 else if ((RL_DEV_POWERUP_MSG <= msgId) && (RL_DEV_ASYNC_EVENT_MSG > msgId))
438 if (RL_PLATFORM_HOST == platform)
441 cmdDir = RL_API_DIR_HOST_TO_MSS;
446 cmdDir = RL_API_DIR_MSS_TO_DSS;
448 RL_LOGV_ARG1(
"cmdDir for MSS = %d (5:host2Mss, 12:dss2Mss)\n", cmdDir);
451 else if ((RL_DSP_RESERVED0_MSG <= msgId) && (RL_DSP_ASYNC_EVENT_MSG > msgId))
456 if (RL_PLATFORM_MSS == platform)
459 cmdDir = RL_API_DIR_MSS_TO_DSS;
465 cmdDir = RL_API_DIR_HOST_TO_DSS;
467 RL_LOGV_ARG1(
"cmdDir for DSS = %d (11:Mss2Dss, 3:hostDss)\n", cmdDir);
472 cmdDir = RL_API_DIR_INVALID;
473 RL_LOGE_ARG1(
"rlDeviceIdentifyCmdDir: Invalid cmd, platform: [%d]\n", platform);
475 RL_LOGV_ARG0(
"rlDeviceIdentifyCmdDir ends...\n");
496 rlUInt16_t nsbc, rlUInt8_t *payload,
497 rlUInt16_t payloadLen)
500 rlUInt16_t sbLen = 0U;
501 rlUInt16_t sbcId = 0U;
502 rlUInt16_t recSbsLen = 0U;
503 rlReturnVal_t retVal = RL_RET_CODE_OK;
504 rlUInt8_t *payldAddr = payload;
506 RL_LOGV_ARG0(
"rlDriverAsyncEventHandler starts...\n");
509 for (indx = 0U; indx < nsbc; indx++)
512 if ((payldAddr == RL_NULL_PTR) || (recSbsLen > payloadLen))
516 retVal = RL_RET_CODE_FATAL_ERROR;
520 rlGetSubBlockId(payldAddr, &sbcId);
523 rlGetSubBlockLen(payldAddr, &sbLen);
533 ((rlUInt16_t)(sbLen - RL_MIN_SBC_LEN)),\
534 (payldAddr + RL_SBC_PL_INDEX));
536 recSbsLen += (sbLen);
542 RL_LOGV_ARG0(
"rlDriverAsyncEventHandler ends...\n");
566 RL_LOGV_ARG0(
"rlDriverHostIrqHandler starts...\n");
569 if (pValue == RL_NULL_PTR)
572 RL_LOGD_ARG0(
"rlDriverHostIrqHandler Input arg is NULL\n");
585 RL_LOGD_ARG0(
"rlDriverHostIrqHandler Mask the Interrupt\n");
597 rlDrvData->isRespWriteWaited[deviceIndex]);
599 if (RL_TRUE == tempVar)
604 RL_LOGD_ARG0(
"rlDriverHostIrqHandler Release command response \n");
611 (RL_P_OSI_SPAWN_ENTRY)rlDriverMsgReadSpawnCtx,
613 RL_LOGD_ARG0(
"rlDriverHostIrqHandler No response is expected \n");
616 RL_LOGV_ARG0(
"rlDriverHostIrqHandler ends...\n");
635 rlReturnVal_t retVal;
648 case RL_API_CLASS_ASYNC:
650 if (inVal == RL_RET_CODE_OK)
655 rlDrvData->
funcParams.asyncEvt.evtMsg.hdr.nsbc,\
656 (rlUInt8_t *)&rlDrvData->
funcParams.asyncEvt.evtMsg.payload[0],\
657 (rlUInt16_t)(rlDrvData->
funcParams.asyncEvt.evtMsg.hdr.len - \
662 retVal = RL_RET_CODE_OK;
665 case RL_API_CLASS_NACK:
667 retVal = RL_RET_CODE_OK;
669 case RL_API_CLASS_RSP:
671 retVal = RL_RET_CODE_OK;
674 case RL_API_CLASS_CMD:
675 case RL_API_CLASS_BYPASS:
688 retVal = RL_RET_CODE_OK;
691 case RL_API_CLASS_MAX:
693 retVal = RL_RET_CODE_OK;
697 retVal = RL_RET_CODE_PROTOCOL_ERROR;
698 RL_LOGE_ARG0(
"rlDriverProcRdMsg, Rl protocol error\n");
716 rlReturnVal_t rlDriverMsgReadSpawnCtx(
const void *pValue)
718 rlReturnVal_t retVal, msgRdRetVal;
719 rlUInt8_t deviceIndex;
720 rlUInt8_t lclRxIrqCnt, lclRxDoneCnt;
724 RL_LOGV_ARG0(
"rlDriverMsgReadSpawnCtx starts...\n");
727 if (pValue == RL_NULL_PTR)
731 RL_LOGE_ARG0(
"rlDriverMsgReadSpawnCtx Input arg is NULL\n");
736 deviceIndex = *(
const rlUInt8_t*)pValue;
746 (&rlDrvData->
globalMutex, (rlOsiTime_t)RL_OSI_WAIT_FOREVER);
750 lclRxIrqCnt = rlDrvData->
rxIrqCnt[deviceIndex];
751 lclRxDoneCnt = rlDrvData->
rxDoneCnt[deviceIndex];
754 if (lclRxIrqCnt == lclRxDoneCnt)
758 RL_LOGD_ARG0(
"rlDriverMsgReadSpawnCtx, RxIrqCnt is equal to RxDoneCnt\n");
759 retVal = RL_RET_CODE_OK;
774 RL_LOGV_ARG0(
"rlDriverMsgReadSpawnCtx ends...\n");
793 rlReturnVal_t retVal, retStatus;
794 rlUInt8_t tempRxDoneCnt, tempVar;
796 RL_LOGV_ARG0(
"rlDriverMsgCmdReply starts...\n");
801 if (RL_RET_CODE_OK != (rlInt32_t)retStatus)
804 tempRxDoneCnt = rlDrvData->
rxDoneCnt[devIndex];
805 rlDrvData->
rxDoneCnt[devIndex] = (tempRxDoneCnt + 1U);
808 RL_LOGE_ARG0(
"Error in received data\n");
816 if (RL_API_CLASS_RSP == rlDrvData->
funcParams.rxMsgClass)
826 retVal = RL_RET_CODE_MSGID_MISMATCHED;
827 RL_LOGE_ARG0(
"Msg id is mis-matched\n");
832 retVal = RL_RET_CODE_OK;
839 (&(rlDrvData->
cmdSem), (rlOsiTime_t)RL_OSI_NO_WAIT);
841 else if (RL_API_CLASS_ASYNC == rlDrvData->
funcParams.rxMsgClass)
850 rlDrvData->
funcParams.asyncEvt.evtMsg.hdr.nsbc,
851 (rlUInt8_t *)&rlDrvData->
funcParams.asyncEvt.evtMsg.payload[0],
852 rlDrvData->
funcParams.asyncEvt.evtMsg.hdr.len);
854 retVal = RL_RET_CODE_OK;
858 else if (RL_API_CLASS_NACK == rlDrvData->
funcParams.rxMsgClass)
864 retVal = RL_RET_CODE_CRC_FAILED;
865 RL_LOGE_ARG0(
"CRC check fails, the Async Event is Ignored\n");
870 retVal = RL_RET_CODE_INVALID_STATE_ERROR;
871 RL_LOGE_ARG0(
"Invalid Class\n");
874 RL_LOGV_ARG0(
"rlDriverMsgCmdReply ends...\n");
894 rlReturnVal_t retVal;
897 RL_LOGV_ARG0(
"rlDriverMsgReadCmdCtx starts...\n");
899 if (RL_NULL_PTR == rlDrvData)
901 retVal = RL_RET_CODE_FATAL_ERROR;
909 retVal = RL_RET_CODE_OK;
918 while ((RL_TRUE == rlDrvData->
isCmdRespWaited[devIndex]) && (RL_RET_CODE_OK == retVal))
920 if (RL_PENDING_RX_MSG(rlDrvData, devIndex))
924 rlDrvData->
funcParams.rxMsgClass = RL_API_CLASS_MAX;
943 RL_LOGE_ARG0(
"CmdSem should be signaled by IRQ but respTimeout\n");
944 retVal += RL_RET_CODE_RESP_TIMEOUT;
951 if (RL_PENDING_RX_MSG(rlDrvData, devIndex) && (retVal != RL_RET_CODE_FATAL_ERROR) \
956 ((RL_P_OSI_SPAWN_ENTRY)rlDriverMsgReadSpawnCtx, \
959 retVal = RL_RET_CODE_RADAR_OSIF_ERROR;
963 RL_LOGV_ARG0(
"rlDriverMsgReadCmdCtx ends...\n");
983 static rlReturnVal_t rlDriverOriginDirCheck(rlUInt8_t deviceRunId,
986 rlReturnVal_t retVal;
988 RL_LOGV_ARG0(
"rlDriverOriginDirCheck starts...\n");
993 case RL_PLATFORM_HOST:
994 if ((RL_API_DIR_BSS_TO_HOST == dataDir) ||
995 (RL_API_DIR_MSS_TO_HOST == dataDir) ||
996 (RL_API_DIR_DSS_TO_HOST == dataDir))
1000 retVal = RL_RET_CODE_OK;
1005 retVal = RL_RET_CODE_INVALID_INPUT;
1009 case RL_PLATFORM_MSS:
1010 if ((RL_API_DIR_BSS_TO_MSS == dataDir) ||
1011 (RL_API_DIR_DSS_TO_MSS == dataDir) ||
1012 (RL_API_DIR_HOST_TO_MSS == dataDir))
1016 retVal = RL_RET_CODE_OK;
1021 retVal = RL_RET_CODE_INVALID_INPUT;
1025 case RL_PLATFORM_DSS:
1027 if ((RL_API_DIR_BSS_TO_DSS == dataDir) ||
1028 (RL_API_DIR_MSS_TO_DSS == dataDir) ||
1029 (RL_API_DIR_HOST_TO_DSS == dataDir))
1033 retVal = RL_RET_CODE_OK;
1038 retVal = RL_RET_CODE_INVALID_INPUT;
1043 retVal = RL_RET_CODE_INVALID_INPUT;
1044 RL_LOGE_ARG2(
"Unknown platform %d, retVal = %d\n", \
1048 RL_LOGV_ARG0(
"rlDriverOriginDirCheck ends...\n");
1053 rlReturnVal_t rlDriverRdVerifyMsg(
rlReadBuf_t readBuf, rlUInt8_t devIndex)
1055 rlUInt16_t rxLengthRecv;
1056 rlReturnVal_t retVal, readRetVal;
1057 rlUInt16_t payloadLen, msgCrcLen, msgCrcType;
1058 rlUInt8_t isCrcPresent;
1061 rxLengthRecv = RL_RHCP_HDR_PL_LENGTH(&(readBuf.syncHeader.protHdr));
1064 if (rxLengthRecv >= (RL_MAX_SIZE_MSG - SYNC_PATTERN_LEN))
1066 retVal = RL_RET_CODE_PROTOCOL_ERROR;
1075 RL_RHCP_HDR_OPCODE_CLASS(&(readBuf.syncHeader.protHdr));
1078 payloadLen = rxLengthRecv - (rlUInt16_t)RHCP_HEADER_LEN;
1080 if (RL_API_CLASS_ASYNC == rl_driverData.
funcParams.rxMsgClass)
1086 rhcpMsg = &rl_driverData.
funcParams.asyncEvt.evtMsg;
1091 rhcpMsg = &rl_rxMsg;
1095 rhcpMsg->hdr = readBuf.syncHeader.protHdr;
1097 rhcpMsg->syncPattern = readBuf.syncHeader.syncPattern;
1100 if (rhcpMsg->hdr.flags.
b2Crc != 0U)
1103 isCrcPresent = RL_FALSE;
1109 isCrcPresent = RL_TRUE;
1111 msgCrcType = rhcpMsg->hdr.flags.
b2CrcLen;
1113 msgCrcLen = (2U << (msgCrcType & 0x3U));
1116 payloadLen = ((isCrcPresent == RL_TRUE) ? (payloadLen - msgCrcLen) : payloadLen);
1119 if (payloadLen > 0U)
1122 &rhcpMsg->payload[0U], payloadLen) != (rlInt32_t)payloadLen)
1125 readRetVal = RL_RET_CODE_RADAR_IF_ERROR;
1129 readRetVal = RL_RET_CODE_OK;
1134 readRetVal = RL_RET_CODE_OK;
1138 if ((isCrcPresent == RL_TRUE) && (readRetVal == RL_RET_CODE_OK))
1143 msgCrcLen) != (rlInt32_t)msgCrcLen)
1146 retVal = RL_RET_CODE_RADAR_IF_ERROR;
1150 (void)memcpy(&rhcpMsg->payload[payloadLen], &rl_driverData.
funcParams.msgCRC[0U], \
1154 if ((rl_driverData.
clientCtx.
crcType != (rlUInt8_t)RL_CRC_TYPE_NO_CRC) && \
1162 msgCrcLen), (rlUInt8_t)(msgCrcType), \
1167 retVal = RL_RET_CODE_OK;
1173 retVal = RL_RET_CODE_OK;
1195 rlReturnVal_t retVal, hdrRetVal;
1197 rlUInt16_t payloadLen;
1199 RL_LOGV_ARG0(
"rlDriverMsgRead starts...\n");
1201 if (RL_NULL_PTR == rlDrvData)
1204 retVal = RL_RET_CODE_FATAL_ERROR;
1208 rlReturnVal_t hdrType;
1213 RL_LOGV_ARG1(
"rlDriverRxHdrRead return val = %d\n", hdrType);
1217 if (SYNC_PATTERN_MATCHED == (rlInt32_t)(hdrType))
1225 if ((RL_RET_CODE_OK == hdrRetVal) && (RL_RET_CODE_OK == \
1227 readBuf.syncHeader.protHdr.opcode.b4Direction)))
1229 retVal = rlDriverRdVerifyMsg(readBuf, devIndex);
1231 else if (RL_RET_CODE_OK == hdrRetVal)
1233 rlDrvData->
funcParams.rxMsgClass = RL_API_CLASS_BYPASS;
1238 rl_rxMsg.syncPattern = readBuf.syncHeader.syncPattern;
1239 rl_rxMsg.hdr = readBuf.syncHeader.protHdr;
1242 payloadLen = readBuf.syncHeader.protHdr.len - (rlUInt16_t)RHCP_HEADER_LEN;
1246 &rl_rxMsg.payload[0], payloadLen) != (rlInt32_t)payloadLen)
1249 retVal = RL_RET_CODE_RADAR_IF_ERROR;
1254 retVal = RL_RET_CODE_OK;
1265 else if (CNYS_PATTERN_MATCHED == (rlInt32_t)(hdrType))
1276 retVal = RL_RET_CODE_INTERFACE_CB_NULL;
1283 rlDrvData->
funcParams.rxMsgClass = RL_API_CLASS_MAX;
1288 (retVal != RL_RET_CODE_FATAL_ERROR))
1293 RL_LOGD_ARG0(
"rlDriverMsgRead Unmask Interrupt call\n");
1297 RL_LOGV_ARG0(
"rlDriverMsgRead ends...\n");
1316 rlReturnVal_t retVal;
1318 RL_LOGV_ARG0(
"rlDriverMsgWrite starts...\n");
1321 if (((rlComIfHdl_t)RL_NULL != comIfHdl) && (rlDrvData != RL_NULL_PTR))
1323 rlUInt16_t checkSum = 0U, msgCrcLen;
1324 rlUInt16_t payloadLen;
1329 (void)rlDriverCalChkSum(&rl_txMsg.hdr, ((rlUInt8_t)(RHCP_HEADER_LEN - 2U)), &checkSum);
1330 rl_txMsg.hdr.chksum = checkSum;
1333 payloadLen = rl_txMsg.hdr.len - (rlUInt16_t)RHCP_HEADER_LEN;
1342 rl_txMsg.syncPattern.sync1 = D2H_SYNC_PATTERN_1;
1343 rl_txMsg.syncPattern.sync2 = D2H_SYNC_PATTERN_2;
1348 rl_txMsg.syncPattern.sync1 = H2D_SYNC_PATTERN_1;
1349 rl_txMsg.syncPattern.sync2 = H2D_SYNC_PATTERN_2;
1353 if (rl_txMsg.hdr.flags.
b2Crc == RL_HDR_FLAG_CRC)
1359 rl_txMsg.hdr.len - msgCrcLen),
1363 (void)memcpy((rlUInt8_t*)(&rl_txMsg.payload[payloadLen - msgCrcLen]),
1364 (rlUInt8_t*)&(rlDrvData->
funcParams.msgCRC[0]), msgCrcLen);
1366 tempLen = ((rlUInt16_t)(SYNC_PATTERN_LEN + RHCP_HEADER_LEN) + payloadLen);
1370 if (RL_IF_WRITE(comIfHdl, ((rlUInt8_t *)&rl_txMsg), \
1371 tempLen) != (rlInt32_t)tempLen)
1374 retVal = RL_RET_CODE_RADAR_IF_ERROR;
1379 retVal = RL_RET_CODE_OK;
1385 retVal = RL_RET_CODE_FATAL_ERROR;
1387 RL_LOGV_ARG0(
"rlDriverMsgWrite ends...\n");
1407 static rlUInt8_t rlDriverReceiveSync(rlComIfHdl_t comIfHdl, rlUInt8_t syncBuf[],
1408 rlInt32_t *syncType)
1410 rlUInt16_t count = 0;
1413 rlReturnVal_t errVal;
1415 RL_LOGV_ARG0(
"rlDriverReceiveSync starts...\n");
1418 if (syncType != (rlInt32_t*)RL_NULL)
1421 if (RL_IF_READ(comIfHdl, &syncBuf[0U], (rlUInt16_t)SYNC_PATTERN_LEN) != \
1422 (rlInt32_t)SYNC_PATTERN_LEN)
1425 errVal = RL_RET_CODE_RADAR_IF_ERROR;
1430 (void)memcpy(&recSyncPattern, &syncBuf[0U], SYNC_PATTERN_LEN);
1431 errVal = RL_RET_CODE_OK;
1433 retVal = PATTERN_NOT_MATCHED;
1436 while (((retVal) == (rlInt32_t)PATTERN_NOT_MATCHED) && (errVal == RL_RET_CODE_OK))
1439 if (((recSyncPattern.sync1 == H2D_SYNC_PATTERN_1) &&
1440 (recSyncPattern.sync2 == H2D_SYNC_PATTERN_2) ) || \
1441 ((recSyncPattern.sync1 == D2H_SYNC_PATTERN_1) &&
1442 (recSyncPattern.sync2 == D2H_SYNC_PATTERN_2)))
1446 retVal = SYNC_PATTERN_MATCHED;
1452 if ((recSyncPattern.sync1 == H2D_CNYS_PATTERN_1) &&
1453 (recSyncPattern.sync2 == H2D_CNYS_PATTERN_2))
1457 retVal = CNYS_PATTERN_MATCHED;
1460 else if (count >= (rlUInt16_t)RL_SYNC_SCAN_THRESHOLD)
1463 errVal += RL_RET_CODE_PROTOCOL_ERROR;
1468 if (0 == (count % SYNC_PATTERN_LEN))
1471 if (RL_IF_READ(comIfHdl, &syncBuf[SYNC_PATTERN_LEN],\
1472 (rlUInt16_t)SYNC_PATTERN_LEN) != \
1473 (rlInt32_t)SYNC_PATTERN_LEN)
1476 errVal += RL_RET_CODE_RADAR_IF_ERROR;
1483 (void)memcpy(&recSyncPattern, &syncBuf[0U], SYNC_PATTERN_LEN);
1490 if (errVal == RL_RET_CODE_OK)
1492 *(syncType) = retVal;
1496 *(syncType) = errVal;
1499 count %= SYNC_PATTERN_LEN;
1500 RL_LOGV_ARG1(
"rlDriverReceiveSync, count = %d\n", count);
1501 RL_LOGV_ARG0(
"rlDriverReceiveSync ends...\n");
1503 return (rlUInt8_t)count;
1527 rlUInt8_t syncBuf[SYNC_PATTERN_LEN * 2] = {0U};
1533 rlUInt16_t cnysBuf[8U] = {H2D_CNYS_PATTERN_1, H2D_CNYS_PATTERN_2,
1534 0xFFFFU, 0xFFFFU, 0xFFFFU, 0xFFFFU, 0xFFFFU, 0xFFFFU};
1535 rlInt32_t syncType = PATTERN_NOT_MATCHED;
1539 RL_LOGV_ARG0(
"rlDriverRxHdrRead starts...\n");
1542 if ((rlComIfHdl_t)RL_NULL == comIfHdl)
1544 errVal = RL_RET_CODE_FATAL_ERROR;
1553 if (RL_IF_WRITE(comIfHdl,
1554 (rlUInt8_t*)&cnysBuf[0U], (rlUInt16_t)(SYNC_PATTERN_LEN+ RHCP_HEADER_LEN)) !=\
1555 (rlInt32_t)(SYNC_PATTERN_LEN + RHCP_HEADER_LEN))
1558 errVal = RL_RET_CODE_RADAR_IF_ERROR;
1562 errVal = RL_RET_CODE_OK;
1565 RL_LOGV_ARG2(
"Platform = %d, delay = %d \n",\
1572 0) != RL_RET_CODE_OK))
1584 errVal = RL_RET_CODE_OK;
1587 if (errVal == RL_RET_CODE_OK)
1592 syncCnt = rlDriverReceiveSync(comIfHdl, &syncBuf[0U], &syncType);
1593 RL_LOGV_ARG1(
"syncType = %d \n", syncType);
1595 if ((CNYS_PATTERN_MATCHED == syncType) || (SYNC_PATTERN_MATCHED == syncType))
1599 (void)memcpy(&hdrBuf[0], &syncBuf[0U], (SYNC_PATTERN_LEN + syncCnt));
1601 tempLen = RHCP_HEADER_LEN - (0x00FFU & syncCnt);
1603 if (RL_IF_READ(comIfHdl, (&hdrBuf[(SYNC_PATTERN_LEN + syncCnt)]), \
1604 tempLen) != (rlInt32_t)tempLen)
1606 syncType += RL_RET_CODE_RADAR_IF_ERROR;
1612 RL_LOGD_ARG0(
"do nothing ");
1622 RL_LOGV_ARG0(
"rlDriverRxHdrRead ends...\n");
1639 rlReturnVal_t retVal;
1640 rlInt32_t funcRetVal;
1648 &rl_driverData.
cmdSem,
"CmdSem");
1651 if (funcRetVal != RL_RET_CODE_OK)
1654 retVal = RL_RET_CODE_RADAR_OSIF_ERROR;
1658 retVal = RL_RET_CODE_OK;
1664 static rlReturnVal_t rlDriverOsiCbCheck(
rlClientCbs_t clientCb)
1666 rlReturnVal_t retVal;
1674 retVal = RL_RET_CODE_INTERFACE_CB_NULL;
1682 retVal = RL_RET_CODE_INTERFACE_CB_NULL;
1690 retVal = RL_RET_CODE_INTERFACE_CB_NULL;
1695 retVal = RL_RET_CODE_OK;
1710 static rlReturnVal_t rlDriverClientCbCheck(
rlClientCbs_t clientCb)
1712 rlReturnVal_t retVal;
1714 if (RL_RET_CODE_OK != rlDriverOsiCbCheck(clientCb))
1716 retVal = RL_RET_CODE_INTERFACE_CB_NULL;
1724 retVal = RL_RET_CODE_INTERFACE_CB_NULL;
1727 else if (((clientCb.
platform == RL_PLATFORM_HOST) &&
1729 (RL_NULL_PTR == clientCb.
timerCb.rlDelay)))) ||
1732 retVal = RL_RET_CODE_INTERFACE_CB_NULL;
1737 ((RL_CRC_TYPE_NO_CRC != clientCb.
crcType) &&
1740 retVal = RL_RET_CODE_INTERFACE_CB_NULL;
1744 retVal = RL_RET_CODE_OK;
1763 rlReturnVal_t rlDriverInit(rlUInt8_t deviceMap,
rlClientCbs_t clientCb)
1765 rlReturnVal_t retVal, cbCheck;
1766 rlUInt8_t index = 0U;
1769 cbCheck = rlDriverClientCbCheck(clientCb);
1771 if (RL_RET_CODE_OK != cbCheck)
1776 else if (deviceMap <= ((1U << RL_DEVICE_CONNECTED_MAX) - 0x1U))
1779 for (; index < RL_DEVICE_CONNECTED_MAX; index++)
1784 rl_driverData.
rxIrqCnt[index] = 0U;
1794 rl_driverData.txMsgPtr = &rl_txMsg;
1795 rl_driverData.rxMsgPtr = &rl_rxMsg;
1796 #if !(RL_DISABLE_LOGGING) 1797 if (RL_RET_CODE_OK == retVal)
1800 retVal += rlLogInit();
1801 RL_LOGV_ARG0(
"Logging is enabled \n");
1809 if (((deviceMap & (1U << index)) != 0U) && (retVal == RL_RET_CODE_OK))
1822 retVal += RL_RET_CODE_RADAR_IF_ERROR;
1829 (
void*)RL_NULL) != RL_RET_CODE_OK)
1831 retVal +=RL_RET_CODE_RADAR_IF_ERROR;
1835 deviceMap &= ~(1U << index);
1838 if (retVal != RL_RET_CODE_OK)
1847 while ((deviceMap != 0U) && (index < RL_DEVICE_CONNECTED_MAX));
1851 retVal = RL_RET_CODE_INVALID_INPUT;
1852 RL_LOGE_ARG0(
"Invaid input argument\n");
1856 if (retVal == RL_RET_CODE_OK)
1859 RL_LOGD_ARG0(
"Driver init flag is set\n");
1863 RL_LOGE_ARG0(
"rlDriverInit, Init failed\n");
1882 rlReturnVal_t retVal;
1883 rlUInt8_t index = 0U;
1885 RL_LOGV_ARG0(
"rlDeviceAddDevices starts\n");
1888 (deviceMap <= ((1U << RL_DEVICE_CONNECTED_MAX) - 0x1U)))
1896 if ((deviceMap & (1U << index)) != 0U)
1904 rl_driverData.clientCtx.comIfCb.rlComIfOpen(index, 0U);
1911 (
void*)RL_NULL) != RL_RET_CODE_OK) ||
1915 retVal = RL_RET_CODE_RADAR_IF_ERROR;
1919 retVal = RL_RET_CODE_OK;
1924 retVal =RL_RET_CODE_RADAR_IF_ERROR;
1926 deviceMap &= ~(1U << index);
1930 retVal = RL_RET_CODE_OK;
1934 if (RL_RET_CODE_OK != retVal)
1941 while ((deviceMap != 0U) && (index < RL_DEVICE_CONNECTED_MAX));
1945 if (deviceMap > ((1U << RL_DEVICE_CONNECTED_MAX) - 0x1U))
1947 retVal = RL_RET_CODE_INVALID_INPUT;
1948 RL_LOGE_ARG0(
"Invaid input argument\n");
1952 retVal = RL_RET_CODE_INVALID_STATE_ERROR;
1953 RL_LOGE_ARG0(
"rlDriverAddDevice, Invalid state \n");
1956 RL_LOGV_ARG0(
"rlDeviceAddDevices completes\n");
1976 rlReturnVal_t retVal = RL_RET_CODE_OK;
1978 RL_LOGV_ARG0(
"rlDriverRemoveDevices starts...\n");
1983 for (index = 0U; ((deviceMap != 0U) && (index < RL_DEVICE_CONNECTED_MAX));\
1986 if ((deviceMap & (1U << index)) != 0U)
1998 index, RL_NULL, RL_NULL);
2000 deviceMap &= ~(1U << index);
2003 RL_LOGV_ARG0(
"rlDriverRemoveDevices completes\n");
2021 rlUInt8_t deviceMap = rl_driverData.
deviceMap;
2022 rlReturnVal_t retVal = RL_RET_CODE_OK;
2024 RL_LOGV_ARG0(
"rlDriverDeInit starts...\n");
2026 for (index = 0U; ((deviceMap != 0U) && (index < RL_DEVICE_CONNECTED_MAX));\
2029 if ((deviceMap & (1U << index)) != 0U)
2041 index, RL_NULL, RL_NULL);
2043 deviceMap &= ~(1U << index);
2052 RL_LOGD_ARG0(
"Destroy Global Mutex\n");
2056 if (rl_driverData.
cmdSem != RL_NULL_PTR)
2060 rl_driverData.
cmdSem = RL_NULL_PTR;
2061 RL_LOGD_ARG0(
"Destroy Command Semaphore\n");
2066 RL_LOGV_ARG0(
"rlDriverDeInit ends...\n");
2084 return (&rl_driverData);
2099 RL_LOGV_ARG0(
"rlDriverGetPlatformId is called \n");
2117 RL_LOGV_ARG0(
"rlDriverGetArDeviceType is called \n");
2136 rlUInt8_t storedDevMap;
2137 rlReturnVal_t retVal;
2139 RL_LOGV_ARG0(
"rlDriverIsDeviceMapValid starts \n");
2144 if ((storedDevMap & deviceMap) != 0U)
2153 RL_LOGE_ARG0(
"Device map is In-valid \n");
2155 RL_LOGV_ARG0(
"rlDriverIsDeviceMapValid ends \n");
2180 rlUInt16_t rspChunks;
2182 rlReturnVal_t retVal, retVal1;
2184 rlUInt8_t payloadLen = 0U;
2186 RL_LOGV_ARG0(
"rlDriverWaitForResponse starts... \n");
2192 if (RL_RET_CODE_OK == retVal1)
2195 rspChunks = rl_rxMsg.hdr.remChunks;
2198 if (outMsg->opcode.
nsbc >= rl_rxMsg.hdr.nsbc)
2200 outMsg->opcode.
nsbc = rl_rxMsg.hdr.nsbc;
2202 for (indx = 0U; indx < (outMsg->opcode.
nsbc); indx++)
2207 (void)rlGetSubBlock(rl_rxMsg.payload + payloadLen,
2208 &(outMsg->subblocks[indx].sbid),
2209 &(outMsg->subblocks[indx].len),
2210 outMsg->subblocks[indx].pSblkData);
2211 payloadLen += (rlUInt8_t)(outMsg->subblocks[indx].len);
2217 else if (RL_RET_CODE_MSGID_MISMATCHED == retVal1)
2223 rlErrorResp_t errMsgSbData = {(rlSysNRespType_t)0U, (rlUInt16_t)0U};
2225 errorSB.pSblkData = (rlUInt8_t* )&errMsgSbData;
2230 (void)rlGetSubBlock(rl_rxMsg.payload + payloadLen,
2231 &(errorSB.sbid), &(errorSB.len),
2235 retVal = (rlReturnVal_t)(errMsgSbData.
errorType);
2238 RL_LOGE_ARG0(
"msg id mis-match, command failure\n");
2246 RL_LOGE_ARG0(
"Timeout in receiving response\n");
2249 while (rspChunks > 0U);
2251 RL_LOGV_ARG0(
"rlDriverWaitForResponse ends... \n");
2256 static rlReturnVal_t rlDriverCmdWriter(rlUInt8_t devIndex,
rlDriverMsg_t* outMsg)
2258 rlReturnVal_t retVal;
2259 rlUInt8_t retryCount = 0U;
2261 rlUInt8_t isPayloadValid = RL_FALSE;
2265 if (retryCount != 0U)
2287 if (RL_RET_CODE_OK == retVal)
2294 RL_LOGD_ARG0(
"rlDriverCmdWriter, wait for respond\n");
2298 if ((RL_RET_CODE_OK == retVal) || \
2299 ((RL_RET_CODE_CRC_FAILED != retVal) && \
2300 (RL_RET_CODE_RESP_TIMEOUT != retVal)))
2304 isPayloadValid = RL_TRUE;
2321 RL_LOGE_ARG0(
"rlDriverCmdWriter, Error in cmd msg write\n");
2325 while ((retryCount < RL_API_CMD_RETRY_COUNT) && (isPayloadValid == RL_FALSE));
2346 rlReturnVal_t retVal;
2347 rlUInt8_t devIndex = 0U;
2350 if ((rlDrvData == RL_NULL) || (rlDrvData->
funcParams.cmd == RL_NULL))
2352 retVal = RL_RET_CODE_FATAL_ERROR;
2356 retVal = RL_RET_CODE_OK;
2363 while ((deviceMap != 0U) && (RL_RET_CODE_OK == retVal))
2365 if ((deviceMap & (1U << devIndex)) != 0U)
2375 retVal += rlDriverCmdWriter(devIndex, outMsg);
2377 deviceMap &= ~(1U << devIndex);
2409 rlReturnVal_t retVal;
2410 rlUInt8_t protAlignSize;
2411 rlUInt16_t indx, msgCrcLen;
2412 rlUInt16_t payloadLen = 0U;
2414 RL_LOGV_ARG0(
"rlDriverCmdInvoke starts... \n");
2418 rlReturnVal_t retVal1 = RL_RET_CODE_OK;
2420 (&(rl_driverData.
globalMutex), (rlOsiTime_t)RL_OSI_WAIT_FOREVER);
2429 rl_txMsg.hdr.remChunks = inMsg.remChunks;
2430 rl_txMsg.hdr.nsbc = inMsg.opcode.
nsbc;
2432 rl_txMsg.hdr.flags.
b2Crc = 0U;
2439 for (indx = 0U; indx < inMsg.opcode.
nsbc; indx++)
2442 retVal1 += rlAppendSubBlock(&rl_txMsg.payload[payloadLen],
2443 inMsg.subblocks[indx].sbid,
2444 inMsg.subblocks[indx].len,
2445 inMsg.subblocks[indx].pSblkData);
2447 payloadLen += inMsg.subblocks[indx].len + \
2448 (rlUInt16_t)(RL_SBC_ID_SIZE + RL_SBC_LEN_SIZE);
2449 if (RL_RET_CODE_OK != retVal1)
2456 if (indx == inMsg.opcode.
nsbc)
2458 rl_txMsg.hdr.len = RHCP_HEADER_LEN + payloadLen;
2468 rl_txMsg.hdr.flags.
b2AckFlag = RL_HDR_FLAG_NO_ACK;
2475 rl_txMsg.hdr.flags.
b2Crc = RL_HDR_FLAG_NO_CRC;
2486 protAlignSize = (rl_driverData.
clientCtx.
crcType < RL_CRC_TYPE_64BIT_ISO) ? \
2487 RL_PAYLOAD_MSG_4BYTE_MULT : RL_PAYLOAD_MSG_8BYTE_MULT;
2490 if ((rl_driverData.
funcParams.cmd->hdr.len % protAlignSize) != 0U)
2498 (void)rlAppendDummy((rlUInt8_t*)((rlUInt8_t*)rl_driverData.
funcParams.cmd + \
2499 rl_driverData.
funcParams.cmd->hdr.len + SYNC_PATTERN_LEN), \
2500 (rlUInt8_t)(protAlignSize - \
2501 (rlUInt8_t)(rl_driverData.
funcParams.cmd->hdr.len % protAlignSize)));
2502 rl_driverData.
funcParams.cmd->hdr.len += (rlUInt16_t)(protAlignSize - \
2503 (rlUInt16_t)(rl_driverData.
funcParams.cmd->hdr.len % protAlignSize));
2505 rl_driverData.
funcParams.cmd->hdr.len += msgCrcLen;
2520 retVal = RL_RET_CODE_INVALID_STATE_ERROR;
2521 RL_LOGE_ARG0(
"rlDriverCmdInvoke, Invalid input \n");
2524 RL_LOGV_ARG0(
"rlDriverCmdInvoke ends... \n");
2540 rlReturnVal_t retVal;
2542 RL_LOGV_ARG0(
"rlDriverConfigureCrc starts... \n");
2548 RL_LOGD_ARG0(
"rlDriverConfigureCrc is success\n");
2549 retVal = RL_RET_CODE_OK;
2554 retVal = RL_RET_CODE_INVALID_STATE_ERROR;
2556 RL_LOGV_ARG0(
"rlDriverConfigureCrc ends... \n");
2574 rlReturnVal_t retVal;
2576 RL_LOGV_ARG0(
"rlDriverConfigureAckTimeout starts... \n");
2582 RL_LOGD_ARG0(
"rlDriverConfigureAckTimeout is success\n");
2583 retVal = RL_RET_CODE_OK;
2588 retVal = RL_RET_CODE_INVALID_STATE_ERROR;
2590 RL_LOGV_ARG0(
"rlDriverConfigureAckTimeout ends... \n");
2607 rlPrintFptr rlGetLogFptr(rlUInt8_t dbgLevel)
2609 rlPrintFptr retFuncPtr;
2613 retFuncPtr = rl_driverData.
logObj.rlPrintAr[dbgLevel - (rlUInt8_t)1U];
2618 retFuncPtr = RL_NULL_PTR;
2635 rlReturnVal_t rlLogInit(
void)
2637 rlReturnVal_t retVal;
2640 rlUInt8_t level, idx;
2647 if (fPtr != RL_NULL_PTR)
2651 case RL_DBG_LEVEL_VERBOSE :
2652 case RL_DBG_LEVEL_DEBUG :
2653 case RL_DBG_LEVEL_INFO :
2654 case RL_DBG_LEVEL_WARNING :
2655 case RL_DBG_LEVEL_ERROR :
2656 for (idx = level; idx > RL_DBG_LEVEL_NONE; idx--)
2658 rlDrvData->
logObj.rlPrintAr[idx - 1U] = fPtr;
2661 case RL_DBG_LEVEL_NONE :
2663 (void)fPtr(
"INFO: MMWAVELINK Logging is disabled\n");
2670 (void)fPtr(
"INFO: Invalid MMWAVELINK Logging, hence disbled\n");
2679 retVal = RL_RET_CODE_OK;
2685 retVal = RL_RET_CODE_INTERFACE_CB_NULL;
2710 inMsg->opcode.
nsbc = 1U;
2711 inMsg->opcode.
msgType = RL_API_CLASS_CMD;
2712 inMsg->opcode.
msgId = msgId;
2713 inMsg->remChunks = 0U;
2716 inMsg->opcode.
dir = cmdDir;
2717 inMsg->subblocks = payloadPtr;
2722 RL_LOGV_ARG0(
"rlDriverConstructInMsg construct InMsg failed!!!\n");
2745 outMsg->opcode.
nsbc = numSblk;
2747 outMsg->subblocks = payloadPtr;
2752 RL_LOGV_ARG0(
"rlDriverConstructOutMsg construct OutMsg failed!!!\n");
2770 rlUInt8_t* data, rlUInt16_t inLen)
2773 if (payloadPtr != NULL)
2776 payloadPtr->sbid = (rlUInt16_t)RL_GET_UNIQUE_SBID(msgId, sbcID);
2779 payloadPtr->len = inLen;
2781 payloadPtr->pSblkData = data;
2785 RL_LOGV_ARG0(
"rlDriverFillPayload data fill failed!!!\n");
2802 rlReturnVal_t rlDriverExecuteGetApi(rlUInt8_t deviceMap, rlUInt16_t msgId,
2803 rlUInt16_t sbcID, rlUInt8_t *msgData, rlUInt16_t inLen)
2806 rlReturnVal_t retVal;
2858 rlReturnVal_t rlDriverExecuteSetApi(rlUInt8_t deviceMap, rlUInt16_t msgId,
2859 rlUInt16_t sbcID, rlUInt8_t *msgData, rlUInt16_t inLen)
2862 rlReturnVal_t retVal;
rlInt32_t(* rlOsiSemWait)(rlOsiSemHdl_t *semHdl, rlOsiTime_t timeout)
Wait for Semaphore.
rlReturnVal_t rlDriverMsgReadCmdCtx(rlUInt8_t devIndex)
Wait and handle command response.
rlUInt16_t b2MsgType
Msg Type.
rlUInt16_t b2Crc
00 - CRC present, 11 - CRC not Present
rlOsiCbs_t osiCb
Operating System Callback.
mmWaveLink client callback structure
volatile rlUInt8_t isCmdRespWaited[RL_DEVICE_CONNECTED_MAX]
Driver Command Wait Flag.
rlUInt8_t dir
Message Direction.
rlInt32_t(* rlDeviceEnable)(rlUInt8_t deviceIndex)
Bring mmWave radar device out of Reset.
rlReturnVal_t rlDriverMsgCmdReply(rlDriverData_t *rlDrvData, rlUInt8_t devIndex)
Wait and handle command response.
rlUInt8_t rlDeviceIdentifyCmdDir(rlUInt16_t msgId, rlUInt8_t platform)
Get the direction of command packet based on MsgID and platform.
rlReturnVal_t rlDriverConfigureCrc(rlCrcType_t crcType)
Configures the CRC Type in mmwavelink Driver.
rlInt32_t(* rlOsiSemCreate)(rlOsiSemHdl_t *semHdl, rlInt8_t *name)
Create Semaphore Object.
rlUInt8_t platform
0x0: mmWaveLink runs on Ext Host, 0x1: mmWaveLink runs on MSS, 0x2: mmWaveLink runs on DSS ...
volatile rlUInt8_t rxIrqCnt[RL_DEVICE_CONNECTED_MAX]
Driver Host Interrupt count.
rlUInt8_t msgType
Message Class.
void rlDriverConstructOutMsg(rlUInt16_t numSblk, rlDriverMsg_t *outMsg, rlPayloadSb_t *payloadPtr)
: Construct command packet based on given message-ID and payload
rlInt32_t(* rlOsiMutexUnLock)(rlOsiMutexHdl_t *mutexHdl)
Unlock Mutex Object.
rlUInt8_t rlDevIndex[RL_DEVICE_CONNECTED_MAX]
stores device Index
rlUInt32_t ackTimeout
ACK wait timeout in Milliseconds, 0 - No ACK Configuration of the timeout should consider interrupt l...
rlUInt16_t msgId
Message Id.
rlUInt16_t cmdSeqNum[RL_DEVICE_CONNECTED_MAX]
Driver command sequnce number.
rlOsiMsgQCbs_t queue
OS message queue/Spawn callback functions.
rlUInt8_t rlDriverGetPlatformId(void)
Returns RL Platform ID (i.e. where mmWaveLink is executing)
volatile rlUInt8_t rxDoneCnt[RL_DEVICE_CONNECTED_MAX]
Driver serviced Host Interrupt count.
rlUInt16_t b2CrcLen
Length of CRC appended to the message 00 16-bit CRC 01 32-bit CRC 10 64-bit CRC 11 Reserved...
rlInt32_t(* rlComputeCRC)(rlUInt8_t *data, rlUInt32_t dataLen, rlUInt8_t crcType, rlUInt8_t *crc)
Compute CRC on the input message.
rlLogCtx_t logObj
As per debug level callback functions will be assinged.
rlUInt8_t isRespWriteWaited[RL_DEVICE_CONNECTED_MAX]
if writing a data waits for Host IRQ
rlReturnVal_t rlDriverCalCRC(rlUInt8_t *data, rlUInt16_t dataLen, rlUInt8_t crcType, rlUInt8_t crc[RL_CRC_LEN_MAX])
Calculates 16bit/32bit/64bit CRC.
rlComIfCbs_t comIfCb
Comunication Interface Callback.
rlPrintFptr rlPrint
Print input message as per the format in the input arguments.
rlInt32_t(* rlOsiMutexCreate)(rlOsiMutexHdl_t *mutexHdl, rlInt8_t *name)
Create Mutex Object.
rlOsiSemCbs_t sem
Semaphore callback functions.
rlReturnVal_t rlDriverValidateHdr(rlProtHeader_t protHdr)
Validates the header by comparing Checksum.
rlOsiMutexCbs_t mutex
Mutex callback functions.
rlDbgCb_t dbgCb
Debug Callback, required to receive Debug information.
rlUInt16_t b4SeqNum
Sequence Number.
rlUInt8_t arDevType
xWR1243 + HOST = 0x0, xWR1443 MSS = 0x1, xWR1642 MSS/DSS = 0x2, xWR1843 MSS/DSS = 0x3...
rlUInt16_t b2AckFlag
00- ACK requested, 11 - No ACK Requested
rlInt32_t(* rlComIfRead)(rlComIfHdl_t fd, rlUInt8_t *pBuff, rlUInt16_t len)
Read Data from Communication interface.
void rlDriverConstructInMsg(rlUInt16_t msgId, rlDriverMsg_t *inMsg, rlPayloadSb_t *payloadPtr)
: Construct command packet (inMsg) based on given message-ID and payload
mmwave radar Driver Global Structure
rlComIfHdl_t comIfHdl[RL_DEVICE_CONNECTED_MAX]
Communication Interface Handles.
rlUInt8_t isDriverInitialized
Driver Status.
rlReturnVal_t rlDriverMsgRead(rlDriverData_t *rlDrvData, rlUInt8_t devIndex)
Receive and validate protocol header and payload.
rlUInt16_t nsbc
Number of Sub Blocks in Payload.
rlInt32_t(* rlComIfClose)(rlComIfHdl_t fd)
Close the Communication interface.
rlUInt16_t b4Direction
Direction.
rlEventCbs_t eventCb
Event Callback, required to receive notification.
rlComIfHdl_t(* rlComIfOpen)(rlUInt8_t deviceIndex, rlUInt32_t flags)
Open Communication interface.
rlFunctionParams_t funcParams
Current API parameters.
rlUInt8_t dbgLevel
User needs to set debug level such as error, warning, debug, verbose.
rlReturnVal_t rlDriverRxHdrRead(rlUInt8_t hdrBuf[RHCP_HEADER_LEN], rlComIfHdl_t comIfHdl)
Read SYNC and Header from communication channel.
rlUInt8_t rlDriverGetArDeviceType(void)
Returns AR device type which mmWavelink is communicating.
mmwave radar Driver Protocol header read buffer
rlInt32_t(* rlRegisterInterruptHandler)(rlUInt8_t deviceIndex, RL_P_EVENT_HANDLER pHandler, void *pValue)
Register Host Interrupt Handler.
rlReturnVal_t rlDriverDeInit(void)
De Initializes the mmwave radar Driver.
void(* rlDeviceMaskHostIrq)(rlComIfHdl_t fd)
Masks Host Interrupt.
rlDriverData_t * rlDriverGetHandle(void)
Returns mmwave radar Driver Global Structure.
void rlDriverHostIrqHandler(rlUInt8_t deviceIndex, void *pValue)
Interrupt Service Routine to handle host interrupt from mmwave radar device.
rlReturnVal_t rlDriverAsyncEventHandler(rlUInt8_t devIndex, rlUInt16_t nsbc, rlUInt8_t *payload, rlUInt16_t payloadLen)
Handles asynchronous response/error from mmwave radar device.
rlReturnVal_t rlDriverCmdSendRetry(rlUInt8_t deviceMap, rlDriverMsg_t *outMsg)
: Send command and wait for response
rlReturnVal_t rlDriverCmdInvoke(rlUInt8_t deviceMap, rlDriverMsg_t inMsg, rlDriverMsg_t *outMsg)
Invokes a command to mmwave radar Device. Implements mmwave radar Host Communication Protocol(RHCP) ...
mmwave radar Driver Payload
rlTimerCbs_t timerCb
Timer Callback, required when ACK is enabled.
rlCrcCbs_t crcCb
CRC Callback, required when CRC is enabled.
void rlDriverFillPayload(rlUInt16_t msgId, rlUInt16_t sbcID, rlPayloadSb_t *payloadPtr, rlUInt8_t *data, rlUInt16_t inLen)
: Fill payload based on given message-ID, sub-block ID and data.
rlUInt16_t b2RetryFlag
00- No Retry, 11 - Retry
rlReturnVal_t rlDriverConfigureAckTimeout(rlUInt32_t ackTimeout)
Configures the Acknowledgement timeout in mmwavelink Driver.
rlInt32_t(* rlOsiSpawn)(RL_P_OSI_SPAWN_ENTRY pEntry, const void *pValue, rlUInt32_t flags)
Calls a function in a different context.
void(* rlAsyncEvent)(rlUInt8_t devIndex, rlUInt16_t subId, rlUInt16_t subLen, rlUInt8_t *payload)
Reports Asynchronous events from mmwave radar device such as device status, exceptions etc...
rlReturnVal_t rlDriverOsiInit(void)
Initializes the OSI layer abstraction for mmwavelink.
rlUInt16_t b10MsgId
Message ID.
rlReturnVal_t rlDriverVerifyCRC(rlUInt8_t *data, rlUInt16_t dataLen, rlUInt8_t crcType, rlUInt8_t crc[RL_CRC_LEN_MAX])
Compares received CRC with Calculated CRC.
rlInt32_t(* rlOsiMutexLock)(rlOsiMutexHdl_t *mutexHdl, rlOsiTime_t timeout)
Lock Mutex Object.
rlReturnVal_t rlDriverRemoveDevices(rlUInt8_t deviceMap)
Disconnects the mmwave radar devices.
rlInt32_t(* rlOsiSemSignal)(rlOsiSemHdl_t *semHdl)
Release Semaphore.
rlInt32_t(* rlOsiSemDelete)(rlOsiSemHdl_t *semHdl)
Destroy Semaphore Object.
rlInt32_t(* rlComIfWrite)(rlComIfHdl_t fd, rlUInt8_t *pBuff, rlUInt16_t len)
Write Data over Communication interface.
rlInt32_t(* rlDeviceDisable)(rlUInt8_t deviceIndex)
Power off mmWave radar device.
void(* rlDeviceUnMaskHostIrq)(rlComIfHdl_t fd)
Unmask Host Interrupt.
rlSysNRespType_t errorType
rlClientCbs_t clientCtx
Client context.
rlDeviceCtrlCbs_t devCtrlCb
Device Control Callback.
rlReturnVal_t rlDriverAddDevice(rlUInt8_t deviceMap)
Adds mmwave radar device.
rlOsiSemHdl_t cmdSem
Driver Command Wait Semaphore.
mmWaveLink API Error Sub block structure
rlCrcType_t crcType
CRC Types rlCrcType_t 16/32/64.
rlReturnVal_t rlDriverWaitForResponse(rlUInt8_t devIndex, rlDriverMsg_t *outMsg)
: Wait for Device's response
rlReturnVal_t rlDriverMsgWrite(rlDriverData_t *rlDrvData, rlComIfHdl_t comIfHdl)
Write command header and payload data over communication channel.
rlUInt8_t deviceMap
Bitmap of devices connected radarSS/DSS Mailbox in case of 16xx autonomous.
rlUInt16_t b4Version
0000 - Invalid, 0001 - 1111 - Valid Range
rlReturnVal_t rlDriverProcRdMsg(rlUInt8_t devIdx, rlReturnVal_t inVal)
Process received message for Async event message.
RHCP SYNC Pattern Structure.
rlInt32_t(* rlOsiMutexDelete)(rlOsiMutexHdl_t *mutexHdl)
Destroy Mutex Object.
rlComDevInx_t commDevIdx
Communication handle and device-index for deifferent devices connected to Host.
void rlDriverShiftDWord(rlUInt8_t buf[])
Shifts one byte in the byte array.
rlOsiMutexHdl_t globalMutex
Driver Global Lock Mutex.
rlCmdParserCbs_t cmdParserCb
Call back for parsing the Command received at MSS from the Host TI Internal Use only.
rlReturnVal_t rlDriverIsDeviceMapValid(rlUInt8_t deviceMap)
Checks if given deviecMap is valid wrt to global DeviceMap set to mmWaveLink.
rlInt32_t(* rlDeviceWaitIrqStatus)(rlComIfHdl_t fd, rlUInt8_t highLow)
Polls Host Interrupt Status.