You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

objdetrangehwa.c 43KB

3 years ago
3 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209
  1. /*
  2. * @file objdetrangehwa.c
  3. *
  4. * @brief
  5. * Object Detection DPC implementation with range HWA DPU only
  6. *
  7. * \par
  8. * NOTE:
  9. * (C) Copyright 2019 Texas Instruments, Inc.
  10. *
  11. * Redistribution and use in source and binary forms, with or without
  12. * modification, are permitted provided that the following conditions
  13. * are met:
  14. *
  15. * Redistributions of source code must retain the above copyright
  16. * notice, this list of conditions and the following disclaimer.
  17. *
  18. * Redistributions in binary form must reproduce the above copyright
  19. * notice, this list of conditions and the following disclaimer in the
  20. * documentation and/or other materials provided with the
  21. * distribution.
  22. *
  23. * Neither the name of Texas Instruments Incorporated nor the names of
  24. * its contributors may be used to endorse or promote products derived
  25. * from this software without specific prior written permission.
  26. *
  27. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  28. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  29. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  30. * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  31. * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  32. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  33. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  34. * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  35. * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  36. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  37. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  38. */
  39. /**************************************************************************
  40. *************************** Include Files ********************************
  41. **************************************************************************/
  42. #include <stdint.h>
  43. #include <string.h>
  44. #include <stdio.h>
  45. #define DBG_DPC_OBJDETRANGEHWA
  46. /* mmWave SDK Include Files: */
  47. #include <ti/drivers/soc/soc.h>
  48. #include <ti/common/sys_common.h>
  49. #include <ti/drivers/osal/DebugP.h>
  50. #include <ti/drivers/osal/MemoryP.h>
  51. #include <ti/drivers/edma/edma.h>
  52. #include <ti/utils/mathutils/mathutils.h>
  53. #include <ti/utils/cycleprofiler/cycle_profiler.h>
  54. #include <ti/control/dpm/dpm.h>
  55. /* DPUs */
  56. #include <ti/datapath/dpu/rangeproc/rangeprochwa.h>
  57. /** @addtogroup DPC_OBJDETRANGEHWA_IOCTL__INTERNAL_DEFINITIONS
  58. @{ */
  59. /*! This is supplied at command line when application builds this file. This file
  60. * is owned by the application and contains all resource partitioning, an
  61. * application may include more than one DPC and also use resources outside of DPCs.
  62. * The resource definitions used by this object detection DPC are prefixed by DPC_OBJDETRANGEHWA */
  63. #include APP_RESOURCE_FILE
  64. /* Obj Det instance etc */
  65. #include <common/src/dpc/objdetrangehwa/include/objdetrangehwainternal.h>
  66. #include <common/src/dpc/objdetrangehwa/objdetrangehwa.h>
  67. #ifdef DBG_DPC_OBJDETRANGEHWA
  68. ObjDetObj *gObjDetObj;
  69. #endif
  70. /*! Radar cube data buffer alignment in bytes. No DPU module specifying alignment
  71. * need (through a \#define) implies that no alignment is needed i.e 1 byte alignment.
  72. * But we do the natural data type alignment which is 2 bytes (as radar cube is complex16-bit type)
  73. * because radar cube is exported out of DPC in processing result so assume CPU may access
  74. * it for post-DPC processing.
  75. */
  76. #define DPC_OBJDETRANGEHWA_RADAR_CUBE_DATABUF_BYTE_ALIGNMENT (sizeof(int16_t))
  77. /**
  78. @}
  79. */
  80. #define DPC_OBJDETRANGEHWA_HWA_MAX_WINDOW_RAM_SIZE_IN_SAMPLES SOC_HWA_WINDOW_RAM_SIZE_IN_SAMPLES
  81. /******************************************************************************/
  82. /* Local definitions */
  83. #define DPC_USE_SYMMETRIC_WINDOW_RANGE_DPU
  84. #define DPC_DPU_RANGEPROC_FFT_WINDOW_TYPE MATHUTILS_WIN_BLACKMAN
  85. #define DPC_OBJDET_QFORMAT_RANGE_FFT 17
  86. /**************************************************************************
  87. ************************** Local Functions *******************************
  88. **************************************************************************/
  89. static DPM_DPCHandle DPC_ObjectDetection_init
  90. (
  91. DPM_Handle dpmHandle,
  92. DPM_InitCfg* ptrInitCfg,
  93. int32_t* errCode
  94. );
  95. static int32_t DPC_ObjectDetection_execute
  96. (
  97. DPM_DPCHandle handle,
  98. DPM_Buffer* ptrResult
  99. );
  100. static int32_t DPC_ObjectDetection_ioctl
  101. (
  102. DPM_DPCHandle handle,
  103. uint32_t cmd,
  104. void* arg,
  105. uint32_t argLen
  106. );
  107. static int32_t DPC_ObjectDetection_start (DPM_DPCHandle handle);
  108. static int32_t DPC_ObjectDetection_stop (DPM_DPCHandle handle);
  109. static int32_t DPC_ObjectDetection_deinit (DPM_DPCHandle handle);
  110. static void DPC_ObjectDetection_frameStart (DPM_DPCHandle handle);
  111. /**************************************************************************
  112. ************************* Global Declarations ****************************
  113. **************************************************************************/
  114. /** @addtogroup DPC_OBJDETRANGEHWA__GLOBAL
  115. @{ */
  116. /**
  117. * @brief Global used to register Object Detection DPC in DPM
  118. */
  119. DPM_ProcChainCfg gDPC_ObjDetRangeHWACfg =
  120. {
  121. DPC_ObjectDetection_init, /* Initialization Function: */
  122. DPC_ObjectDetection_start, /* Start Function: */
  123. DPC_ObjectDetection_execute, /* Execute Function: */
  124. DPC_ObjectDetection_ioctl, /* Configuration Function: */
  125. DPC_ObjectDetection_stop, /* Stop Function: */
  126. DPC_ObjectDetection_deinit, /* Deinitialization Function: */
  127. NULL, /* Inject Data Function: */
  128. NULL, /* Chirp Available Function: */
  129. DPC_ObjectDetection_frameStart /* Frame Start Function: */
  130. };
  131. /* @} */
  132. /**
  133. * @b Description
  134. * @n
  135. * Utility function for reseting memory pool.
  136. *
  137. * @param[in] pool Handle to pool object.
  138. *
  139. * \ingroup DPC_OBJDETRANGEHWA_INTERNAL_FUNCTION
  140. *
  141. * @retval
  142. * none.
  143. */
  144. static void DPC_ObjDetRangeHwa_MemPoolReset(MemPoolObj *pool)
  145. {
  146. pool->currAddr = (uintptr_t)pool->cfg.addr;
  147. pool->maxCurrAddr = pool->currAddr;
  148. }
  149. /**
  150. * @b Description
  151. * @n
  152. * Utility function for getting maximum memory pool usage.
  153. *
  154. * @param[in] pool Handle to pool object.
  155. *
  156. * \ingroup DPC_OBJDETRANGEHWA_INTERNAL_FUNCTION
  157. *
  158. * @retval
  159. * Amount of pool used in bytes.
  160. */
  161. static uint32_t DPC_ObjDetRangeHwa_MemPoolGetMaxUsage(MemPoolObj *pool)
  162. {
  163. return((uint32_t)(pool->maxCurrAddr - (uintptr_t)pool->cfg.addr));
  164. }
  165. /**
  166. * @b Description
  167. * @n
  168. * Utility function for allocating from a static memory pool.
  169. *
  170. * @param[in] pool Handle to pool object.
  171. * @param[in] size Size in bytes to be allocated.
  172. * @param[in] align Alignment in bytes
  173. *
  174. * \ingroup DPC_OBJDETRANGEHWA_INTERNAL_FUNCTION
  175. *
  176. * @retval
  177. * pointer to beginning of allocated block. NULL indicates could not
  178. * allocate.
  179. */
  180. static void *DPC_ObjDetRangeHwa_MemPoolAlloc(MemPoolObj *pool,
  181. uint32_t size,
  182. uint8_t align)
  183. {
  184. void *retAddr = NULL;
  185. uintptr_t addr;
  186. addr = MEM_ALIGN(pool->currAddr, align);
  187. if ((addr + size) <= ((uintptr_t)pool->cfg.addr + pool->cfg.size))
  188. {
  189. retAddr = (void *)addr;
  190. pool->currAddr = addr + size;
  191. pool->maxCurrAddr = MAX(pool->currAddr, pool->maxCurrAddr);
  192. }
  193. return(retAddr);
  194. }
  195. /**
  196. * @b Description
  197. * @n
  198. * Sends Assert
  199. *
  200. * @retval
  201. * Not Applicable.
  202. */
  203. void _DPC_Objdet_Assert(DPM_Handle handle, int32_t expression,
  204. const char *file, int32_t line)
  205. {
  206. DPM_DPCAssert fault;
  207. if (!expression)
  208. {
  209. fault.lineNum = (uint32_t)line;
  210. fault.arg0 = 0U;
  211. fault.arg1 = 0U;
  212. strncpy (fault.fileName, file, (DPM_MAX_FILE_NAME_LEN-1));
  213. /* Report the fault to the DPM entities */
  214. DPM_ioctl (handle,
  215. DPM_CMD_DPC_ASSERT,
  216. (void*)&fault,
  217. sizeof(DPM_DPCAssert));
  218. }
  219. }
  220. /**
  221. * @b Description
  222. * @n
  223. * Computes the length of window to generate for range DPU.
  224. *
  225. * @param[in] numAdcSamples Number of ADC samples
  226. *
  227. * @retval Length of window to generate
  228. *
  229. * \ingroup DPC_OBJDETRANGEHWA__INTERNAL_FUNCTION
  230. */
  231. static uint32_t DPC_ObjDetRangeHwa_GetRangeWinGenLen(uint16_t numAdcSamples)
  232. {
  233. uint32_t winGenLen;
  234. #ifdef DPC_USE_SYMMETRIC_WINDOW_RANGE_DPU
  235. winGenLen = (numAdcSamples + 1)/2;
  236. #else
  237. winGenLen = numAdcSamples;
  238. #endif
  239. return(winGenLen);
  240. }
  241. /**
  242. * @b Description
  243. * @n
  244. * Generate the range DPU window using mathutils API.
  245. *
  246. * @param[in] cfg Range DPU configuration, output window is generated in window
  247. * pointer in the staticCfg of this.
  248. *
  249. * @retval None
  250. *
  251. * \ingroup DPC_OBJDETRANGEHWA__INTERNAL_FUNCTION
  252. */
  253. static void DPC_ObjDetRangeHwa_GenRangeWindow(DPU_RangeProcHWA_Config *cfg)
  254. {
  255. mathUtils_genWindow((uint32_t *)cfg->staticCfg.window,
  256. cfg->staticCfg.ADCBufData.dataProperty.numAdcSamples,
  257. DPC_ObjDetRangeHwa_GetRangeWinGenLen(cfg->staticCfg.ADCBufData.dataProperty.numAdcSamples),
  258. DPC_DPU_RANGEPROC_FFT_WINDOW_TYPE,
  259. DPC_OBJDET_QFORMAT_RANGE_FFT);
  260. }
  261. /**
  262. * @b Description
  263. * @n
  264. * Sub-frame reconfiguration, used when switching sub-frames. Invokes the
  265. * DPU configuration using the configuration that was stored during the
  266. * pre-start configuration so reconstruction time is saved because this will
  267. * happen in real-time.
  268. * @param[in] objDetObj Pointer to DPC object
  269. * @param[in] subFrameIndx Sub-frame index.
  270. *
  271. * @retval
  272. * Success - 0
  273. * @retval
  274. * Error - <0
  275. *
  276. * \ingroup DPC_OBJDETRANGEHWA__INTERNAL_FUNCTION
  277. */
  278. static int32_t DPC_ObjDetRangeHwa_reconfigSubFrame(ObjDetObj *objDetObj, uint8_t subFrameIndx)
  279. {
  280. int32_t retVal = 0;
  281. SubFrameObj *subFrmObj;
  282. subFrmObj = &objDetObj->subFrameObj[subFrameIndx];
  283. if(objDetObj->commonCfg.numSubFrames > 1)
  284. {
  285. DPC_ObjDetRangeHwa_GenRangeWindow(&subFrmObj->rangeCfg);
  286. retVal = DPU_RangeProcHWA_config(subFrmObj->dpuRangeObj, &subFrmObj->rangeCfg);
  287. if (retVal != 0)
  288. {
  289. goto exit;
  290. }
  291. }
  292. exit:
  293. return(retVal);
  294. }
  295. /**
  296. * @b Description
  297. * @n
  298. * Configure range DPU.
  299. *
  300. * @param[in] dpuHandle Handle to DPU
  301. * @param[in] staticCfg Pointer to static configuration of the sub-frame
  302. * @param[in] dynCfg Pointer to dynamic configuration of the sub-frame
  303. * @param[in] edmaHandle Handle to edma driver to be used for the DPU
  304. * @param[in] radarCube Pointer to DPIF radar cube, which is output of range
  305. * processing.
  306. * @param[in] CoreLocalRamObj Pointer to core local RAM object to allocate local memory
  307. * for the DPU, only for scratch purposes
  308. * @param[out] cfgSave Configuration that is built in local
  309. * (stack) variable is saved here. This is for facilitating
  310. * quick reconfiguration later without having to go through
  311. * the construction of the configuration.
  312. *
  313. * @retval
  314. * Success - 0
  315. * @retval
  316. * Error - <0
  317. *
  318. * \ingroup DPC_OBJDETRANGEHWA__INTERNAL_FUNCTION
  319. */
  320. static int32_t DPC_ObjDetRangeHwa_rangeConfig
  321. (
  322. DPU_RangeProcHWA_Handle dpuHandle,
  323. DPC_ObjectDetectionRangeHWA_StaticCfg *staticCfg,
  324. DPC_ObjectDetectionRangeHWA_DynCfg *dynCfg,
  325. EDMA_Handle edmaHandle,
  326. DPIF_RadarCube *radarCube,
  327. MemPoolObj *CoreLocalRamObj,
  328. DPU_RangeProcHWA_Config *cfgSave
  329. )
  330. {
  331. int32_t retVal = 0;
  332. DPU_RangeProcHWA_Config rangeCfg;
  333. DPU_RangeProcHWA_HW_Resources *hwRes = &rangeCfg.hwRes;
  334. DPU_RangeProcHWA_EDMAInputConfig *edmaIn = &hwRes->edmaInCfg;
  335. DPU_RangeProcHWA_EDMAOutputConfig *edmaOut = &hwRes->edmaOutCfg;
  336. DPU_RangeProcHWA_HwaConfig *hwaCfg = &hwRes->hwaCfg;
  337. uint32_t numRxAntennas, winGenLen;
  338. memset(&rangeCfg, 0, sizeof(rangeCfg));
  339. numRxAntennas = staticCfg->ADCBufData.dataProperty.numRxAntennas;
  340. /* Even though Range DPU supports both modes,
  341. * object detection DPC only supports non-interleaved at present */
  342. DebugP_assert(staticCfg->ADCBufData.dataProperty.interleave == DPIF_RXCHAN_NON_INTERLEAVE_MODE);
  343. /* dynamic configuration */
  344. rangeCfg.dynCfg.calibDcRangeSigCfg = &dynCfg->calibDcRangeSigCfg;
  345. /* static configuration */
  346. rangeCfg.staticCfg.ADCBufData = staticCfg->ADCBufData;
  347. rangeCfg.staticCfg.numChirpsPerFrame = staticCfg->numChirpsPerFrame;
  348. rangeCfg.staticCfg.numRangeBins = staticCfg->numRangeBins;
  349. rangeCfg.staticCfg.numTxAntennas = staticCfg->numTxAntennas;
  350. rangeCfg.staticCfg.numVirtualAntennas = staticCfg->numVirtualAntennas;
  351. rangeCfg.staticCfg.resetDcRangeSigMeanBuffer = 1;
  352. rangeCfg.staticCfg.rangeFFTtuning.fftOutputDivShift = staticCfg->rangeFFTtuning.fftOutputDivShift;
  353. rangeCfg.staticCfg.rangeFFTtuning.numLastButterflyStagesToScale = staticCfg->rangeFFTtuning.numLastButterflyStagesToScale;
  354. /* radarCube */
  355. rangeCfg.hwRes.radarCube = *radarCube;
  356. /* static configuration - window */
  357. /* Generating 1D window, allocate first */
  358. winGenLen = DPC_ObjDetRangeHwa_GetRangeWinGenLen(rangeCfg.staticCfg.ADCBufData.dataProperty.numAdcSamples);
  359. rangeCfg.staticCfg.windowSize = winGenLen * sizeof(uint32_t);
  360. rangeCfg.staticCfg.window = (int32_t *)DPC_ObjDetRangeHwa_MemPoolAlloc(CoreLocalRamObj, rangeCfg.staticCfg.windowSize, sizeof(uint32_t));
  361. if (rangeCfg.staticCfg.window == NULL)
  362. {
  363. retVal = DPC_OBJDETRANGEHWA_ENOMEM__CORE_LOCAL_RAM_RANGE_HWA_WINDOW;
  364. goto exit;
  365. }
  366. DPC_ObjDetRangeHwa_GenRangeWindow(&rangeCfg);
  367. /* hwres - dcRangeSig, allocate from heap, this needs to persist within sub-frame/frame
  368. * processing and across sub-frames */
  369. hwRes->dcRangeSigMeanSize = DPU_RANGEPROC_SIGNATURE_COMP_MAX_BIN_SIZE *
  370. staticCfg->numTxAntennas * numRxAntennas * sizeof(cmplx32ImRe_t);
  371. hwRes->dcRangeSigMean = (cmplx32ImRe_t *) MemoryP_ctrlAlloc (hwRes->dcRangeSigMeanSize,
  372. (uint8_t) 0 /*sizeof(cmplx32ImRe_t)*/);
  373. DebugP_assert(rangeCfg.hwRes.dcRangeSigMeanSize == hwRes->dcRangeSigMeanSize);
  374. /* hwres - edma */
  375. hwRes->edmaHandle = edmaHandle;
  376. /* We have choosen ISOLATE mode, so we have to fill in dataIn */
  377. edmaIn->dataIn.channel = DPC_OBJDET_DPU_RANGEPROC_EDMAIN_CH;
  378. edmaIn->dataIn.channelShadow = DPC_OBJDET_DPU_RANGEPROC_EDMAIN_SHADOW;
  379. edmaIn->dataIn.eventQueue = DPC_OBJDET_DPU_RANGEPROC_EDMAIN_EVENT_QUE;
  380. edmaIn->dataInSignature.channel = DPC_OBJDET_DPU_RANGEPROC_EDMAIN_SIG_CH;
  381. edmaIn->dataInSignature.channelShadow = DPC_OBJDET_DPU_RANGEPROC_EDMAIN_SIG_SHADOW;
  382. edmaIn->dataInSignature.eventQueue = DPC_OBJDET_DPU_RANGEPROC_EDMAIN_SIG_EVENT_QUE;
  383. /* We are radar Cube FORMAT1 and non-interleaved ADC, so for 3 tx antenna case, we have to
  384. * fill format2, otherwise format1
  385. */
  386. if ((staticCfg->numTxAntennas == 3) && (radarCube->datafmt == DPIF_RADARCUBE_FORMAT_1))
  387. {
  388. /* Ping */
  389. /* Ping - dataOutPing */
  390. edmaOut->u.fmt2.dataOutPing.channel = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PING_CH;
  391. edmaOut->u.fmt2.dataOutPing.channelShadow[0] = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PING_SHADOW_0;
  392. edmaOut->u.fmt2.dataOutPing.channelShadow[1] = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PING_SHADOW_1;
  393. edmaOut->u.fmt2.dataOutPing.channelShadow[2] = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PING_SHADOW_2;
  394. edmaOut->u.fmt2.dataOutPing.eventQueue = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PING_EVENT_QUE;
  395. /* Ping - dataOutPingData */
  396. edmaOut->u.fmt2.dataOutPingData[0].channel = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PINGDATA_0_CH;
  397. edmaOut->u.fmt2.dataOutPingData[0].channelShadow = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PINGDATA_0_SHADOW;
  398. edmaOut->u.fmt2.dataOutPingData[0].eventQueue = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PINGDATA_0_EVENT_QUE;
  399. edmaOut->u.fmt2.dataOutPingData[1].channel = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PINGDATA_1_CH;
  400. edmaOut->u.fmt2.dataOutPingData[1].channelShadow = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PINGDATA_1_SHADOW;
  401. edmaOut->u.fmt2.dataOutPingData[1].eventQueue = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PINGDATA_1_EVENT_QUE;
  402. edmaOut->u.fmt2.dataOutPingData[2].channel = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PINGDATA_2_CH;
  403. edmaOut->u.fmt2.dataOutPingData[2].channelShadow = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PINGDATA_2_SHADOW;
  404. edmaOut->u.fmt2.dataOutPingData[2].eventQueue = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PINGDATA_2_EVENT_QUE;
  405. /* Pong */
  406. /* Pong - dataOutPong */
  407. edmaOut->u.fmt2.dataOutPong.channel = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PONG_CH;
  408. edmaOut->u.fmt2.dataOutPong.channelShadow[0] = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PONG_SHADOW_0;
  409. edmaOut->u.fmt2.dataOutPong.channelShadow[1] = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PONG_SHADOW_1;
  410. edmaOut->u.fmt2.dataOutPong.channelShadow[2] = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PONG_SHADOW_2;
  411. edmaOut->u.fmt2.dataOutPong.eventQueue = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PONG_EVENT_QUE;
  412. /* Pong - dataOutPongData */
  413. edmaOut->u.fmt2.dataOutPongData[0].channel = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PONGDATA_0_CH;
  414. edmaOut->u.fmt2.dataOutPongData[0].channelShadow = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PONGDATA_0_SHADOW;
  415. edmaOut->u.fmt2.dataOutPongData[0].eventQueue = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PONGDATA_0_EVENT_QUE;
  416. edmaOut->u.fmt2.dataOutPongData[1].channel = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PONGDATA_1_CH;
  417. edmaOut->u.fmt2.dataOutPongData[1].channelShadow = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PONGDATA_1_SHADOW;
  418. edmaOut->u.fmt2.dataOutPongData[1].eventQueue = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PONGDATA_1_EVENT_QUE;
  419. edmaOut->u.fmt2.dataOutPongData[2].channel = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PONGDATA_2_CH;
  420. edmaOut->u.fmt2.dataOutPongData[2].channelShadow = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PONGDATA_2_SHADOW;
  421. edmaOut->u.fmt2.dataOutPongData[2].eventQueue = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT2_PONGDATA_2_EVENT_QUE;
  422. }
  423. else
  424. {
  425. /* Ping */
  426. edmaOut->u.fmt1.dataOutPing.channel = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT1_PING_CH;
  427. edmaOut->u.fmt1.dataOutPing.channelShadow = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT1_PING_SHADOW;
  428. edmaOut->u.fmt1.dataOutPing.eventQueue = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT1_PING_EVENT_QUE;
  429. /* Pong */
  430. edmaOut->u.fmt1.dataOutPong.channel = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT1_PONG_CH;
  431. edmaOut->u.fmt1.dataOutPong.channelShadow = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT1_PONG_SHADOW;
  432. edmaOut->u.fmt1.dataOutPong.eventQueue = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_FMT1_PONG_EVENT_QUE;
  433. }
  434. edmaOut->dataOutSignature.channel = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_SIG_CH;
  435. edmaOut->dataOutSignature.channelShadow = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_SIG_SHADOW;
  436. edmaOut->dataOutSignature.eventQueue = DPC_OBJDET_DPU_RANGEPROC_EDMAOUT_SIG_EVENT_QUE;
  437. /* hwres - hwa */
  438. /* Use ISOLATED mode to support CBUFF in future */
  439. hwaCfg->dataInputMode = DPU_RangeProcHWA_InputMode_ISOLATED;
  440. #ifdef DPC_USE_SYMMETRIC_WINDOW_RANGE_DPU
  441. hwaCfg->hwaWinSym = HWA_FFT_WINDOW_SYMMETRIC;
  442. #else
  443. hwaCfg->hwaWinSym = HWA_FFT_WINDOW_NONSYMMETRIC;
  444. #endif
  445. hwaCfg->hwaWinRamOffset = (uint16_t) DPC_OBJDET_HWA_WINDOW_RAM_OFFSET;
  446. if ((hwaCfg->hwaWinRamOffset + winGenLen) > DPC_OBJDETRANGEHWA_HWA_MAX_WINDOW_RAM_SIZE_IN_SAMPLES)
  447. {
  448. retVal = DPC_OBJDETRANGEHWA_ENOMEM_HWA_WINDOW_RAM;
  449. goto exit;
  450. }
  451. hwaCfg->numParamSet = DPU_RANGEPROCHWA_NUM_HWA_PARAM_SETS;
  452. hwaCfg->paramSetStartIdx = DPC_OBJDET_DPU_RANGEPROC_PARAMSET_START_IDX;
  453. *cfgSave = rangeCfg;
  454. retVal = DPU_RangeProcHWA_config(dpuHandle, &rangeCfg);
  455. if (retVal != 0)
  456. {
  457. goto exit;
  458. }
  459. /* store configuration for use in intra-sub-frame processing and
  460. * inter-sub-frame switching, although window will need to be regenerated and
  461. * dc range sig should not be reset. */
  462. rangeCfg.staticCfg.resetDcRangeSigMeanBuffer = 0;
  463. *cfgSave = rangeCfg;
  464. exit:
  465. return retVal;
  466. }
  467. /**
  468. * @b Description
  469. * @n
  470. * Performs processing related to pre-start configuration, which is per sub-frame,
  471. * by configuring each of the DPUs involved in the processing chain.
  472. * Memory management notes:
  473. * 1. Core Local Memory that needs to be preserved across sub-frames (such as range DPU's calib DC buffer)
  474. * will be allocated using MemoryP_alloc.
  475. * 2. Core Local Memory that needs to be preserved within a sub-frame across DPU calls
  476. * (the DPIF * type memory) or for intermediate private scratch memory for
  477. * DPU (i.e no preservation is required from process call to process call of the DPUs
  478. * within the sub-frame) will be allocated from the Core Local RAM configuration supplied in
  479. * @ref DPC_ObjectDetectionRangeHWA_InitParams given to @ref DPC_ObjectDetection_init API
  480. * 3. L3 memory will only be allocated from the L3 RAM configuration supplied in
  481. * @ref DPC_ObjectDetectionRangeHWA_InitParams given to @ref DPC_ObjectDetection_init API
  482. * No L3 buffers are presently required that need to be preserved across sub-frames
  483. * (type described in #1 above), neither are L3 scratch buffers required for
  484. * intermediate processing within DPU process call.
  485. *
  486. * @param[in] subFrmObj Pointer to sub-frame object
  487. * @param[in] objDetObj Pointer to objDetObj
  488. * @param[in] staticCfg Pointer to static configuration of the sub-frame
  489. * @param[in] dynCfg Pointer to dynamic configuration of the sub-frame
  490. * @param[out] memUsage Pointer to memory usage structure to report mmemory
  491. usage in this DPC
  492. *
  493. * @retval
  494. * Success - 0
  495. * @retval
  496. * Error - <0
  497. *
  498. * \ingroup DPC_OBJDETRANGEHWA__INTERNAL_FUNCTION
  499. */
  500. static int32_t DPC_ObjDetRangeHwa_preStartConfig
  501. (
  502. SubFrameObj *subFrmObj,
  503. ObjDetObj *objDetObj,
  504. DPC_ObjectDetectionRangeHWA_StaticCfg *staticCfg,
  505. DPC_ObjectDetectionRangeHWA_DynCfg *dynCfg,
  506. DPC_ObjectDetectionRangeHWA_preStartCfg_memUsage *memUsage
  507. )
  508. {
  509. int32_t retVal = 0;
  510. DPIF_RadarCube radarCube;
  511. MemPoolObj *L3RamObj;
  512. MemPoolObj *CoreLocalRamObj;
  513. L3RamObj = &objDetObj->L3RamObj;
  514. CoreLocalRamObj = &objDetObj->CoreLocalRamObj;
  515. DPC_ObjDetRangeHwa_MemPoolReset(L3RamObj);
  516. DPC_ObjDetRangeHwa_MemPoolReset(CoreLocalRamObj);
  517. /* L3 allocations */
  518. /* L3 - radar cube -- This has be synced with the DSP chain */
  519. radarCube.dataSize = staticCfg->numRangeBins * staticCfg->numDopplerChirps *
  520. staticCfg->numVirtualAntennas * sizeof(cmplx16ReIm_t);
  521. radarCube.data = DPC_ObjDetRangeHwa_MemPoolAlloc(L3RamObj, radarCube.dataSize,
  522. DPC_OBJDETRANGEHWA_RADAR_CUBE_DATABUF_BYTE_ALIGNMENT);
  523. if (radarCube.data == NULL)
  524. {
  525. retVal = DPC_OBJDETRANGEHWA_ENOMEM__L3_RAM_RADAR_CUBE;
  526. goto exit;
  527. }
  528. radarCube.datafmt = staticCfg->radarCubeFormat;
  529. retVal = DPC_ObjDetRangeHwa_rangeConfig(subFrmObj->dpuRangeObj,
  530. staticCfg,
  531. dynCfg,
  532. objDetObj->edmaHandle,
  533. &radarCube, CoreLocalRamObj,
  534. &subFrmObj->rangeCfg);
  535. if (retVal != 0)
  536. {
  537. goto exit;
  538. }
  539. /* Report RAM usage */
  540. memUsage->CoreLocalRamUsage = DPC_ObjDetRangeHwa_MemPoolGetMaxUsage(CoreLocalRamObj);
  541. memUsage->L3RamUsage = DPC_ObjDetRangeHwa_MemPoolGetMaxUsage(L3RamObj);
  542. exit:
  543. return retVal;
  544. }
  545. /**
  546. * @b Description
  547. * @n
  548. * DPC frame start function registered with DPM. This is invoked on reception
  549. * of the frame start ISR from the RF front-end.
  550. *
  551. * @param[in] handle DPM's DPC handle
  552. *
  553. * \ingroup DPC_OBJDETRANGEHWA__INTERNAL_FUNCTION
  554. *
  555. * @retval
  556. * Not applicable
  557. */
  558. static void DPC_ObjectDetection_frameStart (DPM_DPCHandle handle)
  559. {
  560. ObjDetObj *objDetObj = (ObjDetObj *) handle;
  561. objDetObj->stats.frameStartTimeStamp = Cycleprofiler_getTimeStamp();
  562. DebugP_log2("ObjDet DPC: Frame Start, frameIndx = %d, subFrameIndx = %d\n",
  563. objDetObj->stats.frameStartIntCounter, objDetObj->subFrameIndx);
  564. /* Check if previous frame (sub-frame) processing has completed */
  565. DPC_Objdet_Assert(objDetObj->dpmHandle, (objDetObj->interSubFrameProcToken == 0));
  566. objDetObj->interSubFrameProcToken++;
  567. /* Increment interrupt counter for debugging purpose */
  568. if (objDetObj->subFrameIndx == 0)
  569. {
  570. objDetObj->stats.frameStartIntCounter++;
  571. }
  572. /* Notify the DPM Module that the DPC is ready for execution */
  573. DebugP_assert (DPM_notifyExecute (objDetObj->dpmHandle, handle, true) == 0);
  574. return;
  575. }
  576. /**
  577. * @b Description
  578. * @n
  579. * DPC's (DPM registered) execute function which is invoked by the application
  580. * in the DPM's execute context when the DPC issues DPM_notifyExecute API from
  581. * its registered @ref DPC_ObjectDetection_frameStart API that is invoked every
  582. * frame interrupt.
  583. *
  584. * @param[in] handle DPM's DPC handle
  585. * @param[out] ptrResult Pointer to the result
  586. *
  587. * \ingroup DPC_OBJDETRANGEHWA__INTERNAL_FUNCTION
  588. *
  589. * @retval
  590. * Success - 0
  591. * @retval
  592. * Error - <0
  593. */
  594. int32_t DPC_ObjectDetection_execute
  595. (
  596. DPM_DPCHandle handle,
  597. DPM_Buffer* ptrResult
  598. )
  599. {
  600. ObjDetObj *objDetObj;
  601. SubFrameObj *subFrmObj;
  602. DPU_RangeProcHWA_OutParams outRangeProc;
  603. int32_t retVal;
  604. DPM_Buffer rangeProcResult;
  605. objDetObj = (ObjDetObj *) handle;
  606. DebugP_assert (objDetObj != NULL);
  607. DebugP_assert (ptrResult != NULL);
  608. DebugP_log1("ObjDet DPC: Processing sub-frame %d\n", objDetObj->subFrameIndx);
  609. subFrmObj = &objDetObj->subFrameObj[objDetObj->subFrameIndx];
  610. if (objDetObj->processCallBackFxn.processFrameBeginCallBackFxn != NULL)
  611. {
  612. (*objDetObj->processCallBackFxn.processFrameBeginCallBackFxn)(objDetObj->subFrameIndx);
  613. }
  614. retVal = DPU_RangeProcHWA_process(subFrmObj->dpuRangeObj, &outRangeProc);
  615. if (retVal != 0)
  616. {
  617. goto exit;
  618. }
  619. DebugP_assert(outRangeProc.endOfChirp == true);
  620. subFrmObj = &objDetObj->subFrameObj[objDetObj->subFrameIndx];
  621. if (objDetObj->processCallBackFxn.processInterFrameBeginCallBackFxn != NULL)
  622. {
  623. (*objDetObj->processCallBackFxn.processInterFrameBeginCallBackFxn)(objDetObj->subFrameIndx);
  624. }
  625. /********************************************************************************
  626. * Range Processing is finished, now it can send data to inter frame processing DPC.
  627. ********************************************************************************/
  628. rangeProcResult.ptrBuffer[0] = objDetObj->subFrameObj[objDetObj->subFrameIndx].rangeCfg.hwRes.radarCube.data;
  629. rangeProcResult.size[0] = objDetObj->subFrameObj[objDetObj->subFrameIndx].rangeCfg.hwRes.radarCube.dataSize;
  630. /* Relay the results: */
  631. retVal = DPM_relayResult(objDetObj->dpmHandle, handle, &rangeProcResult);
  632. DebugP_assert (retVal == 0);
  633. /********************************************************************************
  634. * This DPC does not report results to the application so for the
  635. * sake of clarity reset the result buffer
  636. ********************************************************************************/
  637. memset ((void *)ptrResult, 0, sizeof(DPM_Buffer));
  638. objDetObj->interSubFrameProcToken--;
  639. /********************************************************************************
  640. * Prepare for next Frame
  641. ********************************************************************************/
  642. /* Update subFrame index */
  643. objDetObj->subFrameIndx++;
  644. objDetObj->subFrameIndx = objDetObj->subFrameIndx % objDetObj->commonCfg.numSubFrames;
  645. if(objDetObj->commonCfg.numSubFrames > 1U)
  646. {
  647. /* Re-configure Range DPU for next subFrame */
  648. retVal = DPC_ObjDetRangeHwa_reconfigSubFrame(objDetObj, objDetObj->subFrameIndx);
  649. DebugP_assert (retVal == 0);
  650. }
  651. /* Trigger Range DPU for next frame */
  652. retVal = DPU_RangeProcHWA_control(objDetObj->subFrameObj[objDetObj->subFrameIndx].dpuRangeObj,
  653. DPU_RangeProcHWA_Cmd_triggerProc, NULL, 0);
  654. DPC_Objdet_Assert(objDetObj->dpmHandle, (retVal == 0));
  655. /* For rangeProcHwa, interChirpProcessingMargin is not available */
  656. objDetObj->stats.interChirpProcessingMargin = 0;
  657. objDetObj->stats.interFrameStartTimeStamp = Cycleprofiler_getTimeStamp();
  658. DebugP_log0("ObjDet DPC: Range Proc Done\n");
  659. exit:
  660. return retVal;
  661. }
  662. /**
  663. * @b Description
  664. * @n
  665. * DPC's (DPM registered) start function which is invoked by the
  666. * application using DPM_start API.
  667. *
  668. * @param[in] handle DPM's DPC handle
  669. *
  670. * \ingroup DPC_OBJDETRANGEHWA__INTERNAL_FUNCTION
  671. *
  672. * @retval
  673. * Success - 0
  674. * @retval
  675. * Error - <0
  676. */
  677. static int32_t DPC_ObjectDetection_start (DPM_DPCHandle handle)
  678. {
  679. ObjDetObj *objDetObj;
  680. SubFrameObj *subFrmObj;
  681. int32_t retVal = 0;
  682. objDetObj = (ObjDetObj *) handle;
  683. DebugP_assert (objDetObj != NULL);
  684. objDetObj->stats.frameStartIntCounter = 0;
  685. /* Start marks consumption of all pre-start configs, reset the flag to check
  686. * if pre-starts were issued only after common config was issued for the next
  687. * time full configuration happens between stop and start */
  688. objDetObj->isCommonCfgReceived = false;
  689. /* App must issue export of last frame after stop which will switch to sub-frame 0,
  690. * so start should always see sub-frame indx of 0, check */
  691. DebugP_assert(objDetObj->subFrameIndx == 0);
  692. if(objDetObj->commonCfg.numSubFrames > 1U)
  693. {
  694. /* Pre-start cfgs for sub-frames may have come in any order, so need
  695. * to ensure we reconfig for the current (0) sub-frame before starting */
  696. DPC_ObjDetRangeHwa_reconfigSubFrame(objDetObj, objDetObj->subFrameIndx);
  697. }
  698. /* Trigger Range DPU, related to reconfig above */
  699. subFrmObj = &objDetObj->subFrameObj[objDetObj->subFrameIndx];
  700. retVal = DPU_RangeProcHWA_control(subFrmObj->dpuRangeObj,
  701. DPU_RangeProcHWA_Cmd_triggerProc, NULL, 0);
  702. if(retVal < 0)
  703. {
  704. goto exit;
  705. }
  706. DebugP_log0("ObjDet DPC: Start done\n");
  707. exit:
  708. return(retVal);
  709. }
  710. /**
  711. * @b Description
  712. * @n
  713. * DPC's (DPM registered) stop function which is invoked by the
  714. * application using DPM_stop API.
  715. *
  716. * @param[in] handle DPM's DPC handle
  717. *
  718. * \ingroup DPC_OBJDETRANGEHWA__INTERNAL_FUNCTION
  719. *
  720. * @retval
  721. * Success - 0
  722. * @retval
  723. * Error - <0
  724. */
  725. static int32_t DPC_ObjectDetection_stop (DPM_DPCHandle handle)
  726. {
  727. ObjDetObj *objDetObj;
  728. objDetObj = (ObjDetObj *) handle;
  729. DebugP_assert (objDetObj != NULL);
  730. /* We can be here only after complete frame processing is done, which means
  731. * processing token must be 0 and subFrameIndx also 0 */
  732. DebugP_assert(objDetObj->subFrameIndx == 0);
  733. DebugP_log0("ObjDet DPC: Stop done\n");
  734. return(0);
  735. }
  736. /**
  737. * @b Description
  738. * @n
  739. * DPC IOCTL commands configuration API which will be invoked by the
  740. * application using DPM_ioctl API
  741. *
  742. * @param[in] handle DPM's DPC handle
  743. * @param[in] cmd Capture DPC specific commands
  744. * @param[in] arg Command specific arguments
  745. * @param[in] argLen Length of the arguments which is also command specific
  746. *
  747. * \ingroup DPC_OBJDETRANGEHWA__INTERNAL_FUNCTION
  748. *
  749. * @retval
  750. * Success - 0
  751. * @retval
  752. * Error - <0
  753. */
  754. static int32_t DPC_ObjectDetection_ioctl
  755. (
  756. DPM_DPCHandle handle,
  757. uint32_t cmd,
  758. void* arg,
  759. uint32_t argLen
  760. )
  761. {
  762. ObjDetObj *objDetObj;
  763. SubFrameObj *subFrmObj;
  764. int32_t retVal = 0;
  765. /* Get the DSS MCB: */
  766. objDetObj = (ObjDetObj *) handle;
  767. DebugP_assert(objDetObj != NULL);
  768. DebugP_assert(arg != NULL);
  769. /* Process the commands. Process non sub-frame specific ones first
  770. * so the sub-frame specific ones can share some code. */
  771. if((cmd < DPC_OBJDETRANGEHWA_IOCTL__STATIC_PRE_START_CFG) ||
  772. (cmd > DPC_OBJDETRANGEHWA_IOCTL__STATIC_TRACKER_CFG))
  773. {
  774. retVal = DPM_EINVCMD;
  775. }
  776. else if (cmd == DPC_OBJDETRANGEHWA_IOCTL__STATIC_PRE_START_COMMON_CFG)
  777. {
  778. uint8_t index;
  779. DPC_ObjectDetectionRangeHWA_PreStartCommonCfg *cfg;
  780. DebugP_assert(argLen == sizeof(DPC_ObjectDetectionRangeHWA_PreStartCommonCfg));
  781. cfg = (DPC_ObjectDetectionRangeHWA_PreStartCommonCfg*)arg;
  782. /* Release DPU DC range Signal mean memory */
  783. for(index = 0; index < objDetObj->commonCfg.numSubFrames; index ++)
  784. {
  785. subFrmObj = &objDetObj->subFrameObj[index];
  786. if (subFrmObj->rangeCfg.hwRes.dcRangeSigMean)
  787. {
  788. MemoryP_ctrlFree(subFrmObj->rangeCfg.hwRes.dcRangeSigMean,
  789. subFrmObj->rangeCfg.hwRes.dcRangeSigMeanSize);
  790. }
  791. }
  792. objDetObj->commonCfg = *cfg;
  793. objDetObj->isCommonCfgReceived = true;
  794. DebugP_log0("ObjDet DPC: Pre-start Common Config IOCTL processed\n");
  795. }
  796. #ifdef TRACKERPROC_EN
  797. else if (cmd == DPC_OBJDETRANGEHWA_IOCTL__STATIC_TRACKER_CFG)
  798. {
  799. //System_printf("Entering Tracker Config");
  800. DPC_ObjectDetection_TrackerConfig *cfg;
  801. DebugP_assert(argLen == sizeof(DPC_ObjectDetection_TrackerConfig));
  802. cfg = (DPC_ObjectDetection_TrackerConfig*)arg;
  803. retVal = DPU_TrackerProc_config(objDetObj->dpuTrackerObj, &(cfg->trackerDpuCfg));
  804. if (retVal != 0)
  805. {
  806. goto exit;
  807. }
  808. }
  809. #endif
  810. else
  811. {
  812. uint8_t subFrameNum;
  813. subFrameNum = *(uint8_t *)arg;
  814. switch (cmd)
  815. {
  816. /* Range DPU related */
  817. case DPC_OBJDETRANGEHWA_IOCTL__DYNAMIC_CALIB_DC_RANGE_SIG_CFG:
  818. {
  819. DPC_ObjectDetectionRangeHWA_CalibDcRangeSigCfg *cfg;
  820. DebugP_assert(argLen == sizeof(DPC_ObjectDetectionRangeHWA_CalibDcRangeSigCfg));
  821. cfg = (DPC_ObjectDetectionRangeHWA_CalibDcRangeSigCfg*)arg;
  822. subFrmObj = &objDetObj->subFrameObj[subFrameNum];
  823. retVal = DPU_RangeProcHWA_control(subFrmObj->dpuRangeObj,
  824. DPU_RangeProcHWA_Cmd_dcRangeCfg,
  825. &cfg->cfg,
  826. sizeof(DPU_RangeProc_CalibDcRangeSigCfg));
  827. if (retVal != 0)
  828. {
  829. goto exit;
  830. }
  831. /* save into object */
  832. subFrmObj->dynCfg.calibDcRangeSigCfg = cfg->cfg;
  833. break;
  834. }
  835. /* Related to pre-start configuration */
  836. case DPC_OBJDETRANGEHWA_IOCTL__STATIC_PRE_START_CFG:
  837. {
  838. DPC_ObjectDetectionRangeHWA_PreStartCfg *cfg;
  839. DPC_ObjectDetectionRangeHWA_preStartCfg_memUsage *memUsage;
  840. MemoryP_Stats statsStart;
  841. MemoryP_Stats statsEnd;
  842. /* Pre-start common config must be received before pre-start configs are received. */
  843. if (objDetObj->isCommonCfgReceived == false)
  844. {
  845. retVal = DPC_OBJDETRANGEHWA_PRE_START_CONFIG_BEFORE_PRE_START_COMMON_CONFIG;
  846. goto exit;
  847. }
  848. DebugP_assert(argLen == sizeof(DPC_ObjectDetectionRangeHWA_PreStartCfg));
  849. /* Get system heap size before preStart configuration */
  850. MemoryP_getStats(&statsStart);
  851. cfg = (DPC_ObjectDetectionRangeHWA_PreStartCfg*)arg;
  852. subFrmObj = &objDetObj->subFrameObj[subFrameNum];
  853. memUsage = &cfg->memUsage;
  854. memUsage->L3RamTotal = objDetObj->L3RamObj.cfg.size;
  855. memUsage->CoreLocalRamTotal = objDetObj->CoreLocalRamObj.cfg.size;
  856. retVal = DPC_ObjDetRangeHwa_preStartConfig(subFrmObj,
  857. objDetObj,
  858. &cfg->staticCfg,
  859. &cfg->dynCfg,
  860. memUsage);
  861. if (retVal != 0)
  862. {
  863. goto exit;
  864. }
  865. /* Populate radarCube memory information */
  866. cfg->radarCubeMem.addr = subFrmObj->rangeCfg.hwRes.radarCube.data;
  867. cfg->radarCubeMem.size = subFrmObj->rangeCfg.hwRes.radarCube.dataSize;
  868. /* Get system heap size after preStart configuration */
  869. MemoryP_getStats(&statsEnd);
  870. /* Populate system heap usage */
  871. memUsage->SystemHeapTotal = statsEnd.totalSize;
  872. memUsage->SystemHeapUsed = statsEnd.totalSize -statsEnd.totalFreeSize;
  873. memUsage->SystemHeapDPCUsed = statsStart.totalFreeSize - statsEnd.totalFreeSize;
  874. DebugP_log1("ObjDet DPC: Pre-start Config IOCTL processed (subFrameIndx = %d)\n", cfg->subFrameNum);
  875. break;
  876. }
  877. default:
  878. {
  879. /* Error: This is an unsupported command */
  880. retVal = DPM_EINVCMD;
  881. break;
  882. }
  883. }
  884. }
  885. exit:
  886. return retVal;
  887. }
  888. /**
  889. * @b Description
  890. * @n
  891. * DPC's (DPM registered) initialization function which is invoked by the
  892. * application using DPM_init API. Among other things, this API allocates DPC instance
  893. * and DPU instances (by calling DPU's init APIs) from the MemoryP osal
  894. * heap. If this API returns an error of any type, the heap is not guaranteed
  895. * to be in the same state as before calling the API (i.e any allocations
  896. * from the heap while executing the API are not guaranteed to be deallocated
  897. * in case of error), so any error from this API should be considered fatal and
  898. * if the error is of _ENOMEM type, the application will
  899. * have to be built again with a bigger heap size to address the problem.
  900. *
  901. * @param[in] dpmHandle DPM's DPC handle
  902. * @param[in] ptrInitCfg Handle to the framework semaphore
  903. * @param[out] errCode Error code populated on error
  904. *
  905. * \ingroup DPC_OBJDETRANGEHWA__INTERNAL_FUNCTION
  906. *
  907. * @retval
  908. * Success - 0
  909. * @retval
  910. * Error - <0
  911. */
  912. static DPM_DPCHandle DPC_ObjectDetection_init
  913. (
  914. DPM_Handle dpmHandle,
  915. DPM_InitCfg* ptrInitCfg,
  916. int32_t* errCode
  917. )
  918. {
  919. int32_t i;
  920. ObjDetObj *objDetObj = NULL;
  921. DPC_ObjectDetectionRangeHWA_InitParams *dpcInitParams;
  922. HWA_MemInfo hwaMemInfo;
  923. uint8_t index;
  924. *errCode = 0;
  925. if ((ptrInitCfg == NULL) || (ptrInitCfg->arg == NULL))
  926. {
  927. *errCode = DPC_OBJDETRANGEHWA_EINVAL;
  928. goto exit;
  929. }
  930. if (ptrInitCfg->argSize != sizeof(DPC_ObjectDetectionRangeHWA_InitParams))
  931. {
  932. *errCode = DPC_OBJDETRANGEHWA_EINVAL__INIT_CFG_ARGSIZE;
  933. goto exit;
  934. }
  935. dpcInitParams = (DPC_ObjectDetectionRangeHWA_InitParams *) ptrInitCfg->arg;
  936. objDetObj = MemoryP_ctrlAlloc(sizeof(ObjDetObj), 0);
  937. #ifdef DBG_DPC_OBJDETRANGEHWA
  938. gObjDetObj = objDetObj;
  939. #endif
  940. DebugP_log1("ObjDet DPC: objDetObj address = %d\n", (uint32_t) objDetObj);
  941. if(objDetObj == NULL)
  942. {
  943. *errCode = DPC_OBJDETRANGEHWA_ENOMEM;
  944. goto exit;
  945. }
  946. /* Initialize memory */
  947. memset((void *)objDetObj, 0, sizeof(ObjDetObj));
  948. /* Copy over the DPM configuration: */
  949. memcpy ((void*)&objDetObj->dpmInitCfg, (void*)ptrInitCfg, sizeof(DPM_InitCfg));
  950. objDetObj->dpmHandle = dpmHandle;
  951. objDetObj->socHandle = ptrInitCfg->socHandle;
  952. objDetObj->L3RamObj.cfg = dpcInitParams->L3ramCfg;
  953. objDetObj->CoreLocalRamObj.cfg = dpcInitParams->CoreLocalRamCfg;
  954. /* Validate EDMA handle */
  955. DebugP_assert(dpcInitParams->edmaHandle!= NULL);
  956. objDetObj->edmaHandle = dpcInitParams->edmaHandle;
  957. /* Validate HWA handle */
  958. DebugP_assert(dpcInitParams->hwaHandle!= NULL);
  959. objDetObj->hwaHandle = dpcInitParams->hwaHandle;
  960. objDetObj->processCallBackFxn = dpcInitParams->processCallBackFxn;
  961. /* Set HWA bank memory address */
  962. *errCode = HWA_getHWAMemInfo(dpcInitParams->hwaHandle, &hwaMemInfo);
  963. if (*errCode != 0)
  964. {
  965. goto exit;
  966. }
  967. objDetObj->hwaMemBankSize = hwaMemInfo.bankSize;
  968. for (i = 0; i < hwaMemInfo.numBanks; i++)
  969. {
  970. objDetObj->hwaMemBankAddr[i] = hwaMemInfo.baseAddress +
  971. i * hwaMemInfo.bankSize;
  972. }
  973. for(index = 0; index < RL_MAX_SUBFRAMES; index++)
  974. {
  975. DPU_RangeProcHWA_InitParams rangeInitParams;
  976. rangeInitParams.hwaHandle = objDetObj->hwaHandle;
  977. objDetObj->subFrameObj[index].dpuRangeObj = DPU_RangeProcHWA_init(&rangeInitParams, errCode);
  978. }
  979. #ifdef TRACKERPROC_EN
  980. if (*errCode != 0)
  981. {
  982. goto exit;
  983. }
  984. /* Initialize the tracker DPU - this is not subframe based */
  985. objDetObj->dpuTrackerObj = DPU_TrackerProc_init(errCode);
  986. if (*errCode != 0)
  987. {
  988. goto exit;
  989. }
  990. #endif
  991. exit:
  992. if(*errCode != 0)
  993. {
  994. if(objDetObj != NULL)
  995. {
  996. MemoryP_ctrlFree(objDetObj, sizeof(ObjDetObj));
  997. objDetObj = NULL;
  998. }
  999. }
  1000. return ((DPM_DPCHandle)objDetObj);
  1001. }
  1002. /**
  1003. * @b Description
  1004. * @n
  1005. * DPC's (DPM registered) de-initialization function which is invoked by the
  1006. * application using DPM_deinit API.
  1007. *
  1008. * @param[in] handle DPM's DPC handle
  1009. *
  1010. * \ingroup DPC_OBJDETRANGEHWA__INTERNAL_FUNCTION
  1011. *
  1012. * @retval
  1013. * Success - 0
  1014. * @retval
  1015. * Error - <0
  1016. */
  1017. static int32_t DPC_ObjectDetection_deinit (DPM_DPCHandle handle)
  1018. {
  1019. int32_t retVal = 0;
  1020. ObjDetObj *objDetObj = NULL;
  1021. uint8_t index;
  1022. if (handle == NULL)
  1023. {
  1024. retVal = DPC_OBJDETRANGEHWA_EINVAL;
  1025. goto exit;
  1026. }
  1027. objDetObj = handle;
  1028. for(index = 0; index < RL_MAX_SUBFRAMES; index++)
  1029. {
  1030. if(objDetObj->subFrameObj[index].dpuRangeObj != NULL)
  1031. {
  1032. retVal = DPU_RangeProcHWA_deinit(objDetObj->subFrameObj[index].dpuRangeObj);
  1033. if (retVal != 0)
  1034. {
  1035. goto exit;
  1036. }
  1037. }
  1038. }
  1039. /* Free DPC memory */
  1040. MemoryP_ctrlFree(handle, sizeof(ObjDetObj));
  1041. exit:
  1042. return (retVal);
  1043. }