initial commit
This commit is contained in:
commit
df784d49bf
40
.gitignore
vendored
Normal file
40
.gitignore
vendored
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
# Prerequisites
|
||||||
|
*.d
|
||||||
|
|
||||||
|
# Compiled Object files
|
||||||
|
*.slo
|
||||||
|
*.lo
|
||||||
|
*.o
|
||||||
|
*.obj
|
||||||
|
|
||||||
|
# Precompiled Headers
|
||||||
|
*.gch
|
||||||
|
*.pch
|
||||||
|
|
||||||
|
# Compiled Dynamic libraries
|
||||||
|
*.so
|
||||||
|
*.dylib
|
||||||
|
*.dll
|
||||||
|
|
||||||
|
# Fortran module files
|
||||||
|
*.mod
|
||||||
|
*.smod
|
||||||
|
|
||||||
|
# Compiled Static libraries
|
||||||
|
*.lai
|
||||||
|
*.la
|
||||||
|
*.a
|
||||||
|
*.lib
|
||||||
|
|
||||||
|
# Executables
|
||||||
|
*.exe
|
||||||
|
*.out
|
||||||
|
*.app
|
||||||
|
|
||||||
|
# Folder
|
||||||
|
.settings/
|
||||||
|
Debug/
|
||||||
|
.xdchelp
|
||||||
|
.ccsproject
|
||||||
|
.cproject
|
||||||
|
.project
|
100
dss/c674x_linker.cmd
Normal file
100
dss/c674x_linker.cmd
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016, Texas Instruments Incorporated
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* * Neither the name of Texas Instruments Incorporated nor the names of
|
||||||
|
* its contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||||
|
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define L1P_CACHE_SIZE (4*1024)
|
||||||
|
#define L1D_CACHE_SIZE (16*1024)
|
||||||
|
#define MMWAVE_L3RAM_SIZE (MMWAVE_L3RAM_NUM_BANK*MMWAVE_SHMEM_BANK_SIZE - MMWAVE_MSSUSED_L3RAM_SIZE)
|
||||||
|
|
||||||
|
MEMORY
|
||||||
|
{
|
||||||
|
PAGE 0:
|
||||||
|
|
||||||
|
#if (L1P_CACHE_SIZE < 0x8000)
|
||||||
|
L1PSRAM: o = 0x00E00000, l = (0x00008000 - L1P_CACHE_SIZE)
|
||||||
|
#endif
|
||||||
|
#if (L1D_CACHE_SIZE < 0x8000)
|
||||||
|
L1DSRAM: o = 0x00F00000, l = (0x00008000 - L1D_CACHE_SIZE)
|
||||||
|
#endif
|
||||||
|
L2SRAM_UMAP1: o = 0x007E0000, l = 0x00020000
|
||||||
|
L2SRAM_UMAP0: o = 0x00800000, l = 0x00020000
|
||||||
|
L3SRAM: o = (0x20000000+MMWAVE_MSSUSED_L3RAM_SIZE), l = MMWAVE_L3RAM_SIZE
|
||||||
|
L3SRAMOVLY: o = 0x20000000, l = MMWAVE_MSSUSED_L3RAM_SIZE
|
||||||
|
HWA_RAM : o = 0x21030000, l = 0x00010000
|
||||||
|
HSRAM: o = 0x21080000, l = 0x8000
|
||||||
|
|
||||||
|
/* PAGEs 1 and onwards are for overlay purposes for memory optimization.
|
||||||
|
Some examples:
|
||||||
|
1. Overlay one-time only text with uninitialized data.
|
||||||
|
2. Overlay L1PSRAM data path processing fast code and use copy tables
|
||||||
|
to page in (before entering data path) and out of L1PSRAM (when entering
|
||||||
|
sleep/low power).
|
||||||
|
*/
|
||||||
|
PAGE 1:
|
||||||
|
L3SRAM: o = (0x20000000+MMWAVE_MSSUSED_L3RAM_SIZE), l = MMWAVE_L3RAM_SIZE
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set L1D, L1P and L2 Cache Sizes */
|
||||||
|
ti_sysbios_family_c64p_Cache_l1dSize = L1D_CACHE_SIZE;
|
||||||
|
ti_sysbios_family_c64p_Cache_l1pSize = L1P_CACHE_SIZE;
|
||||||
|
ti_sysbios_family_c64p_Cache_l2Size = 0;
|
||||||
|
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
/* hard addresses forces vecs to be allocated there */
|
||||||
|
.vecs: {. = align(32); } > 0x007E0000
|
||||||
|
|
||||||
|
/* Allocate data preferentially in one UMAP and code (.text) in another,
|
||||||
|
this can improve performance due to simultaneous misses from L1P
|
||||||
|
and L1D caches to L2 SRAM, for more information see C674 Megamodule
|
||||||
|
User Guide section "Level 2 Memory Architecture".
|
||||||
|
The linker notation "X >> Y | Z" indicates section X is first allocated in Y
|
||||||
|
and allowed to overflow into Z and can be split from Y to Z.
|
||||||
|
The linker notation "X > Y | Z" indicates section X is first allocated in Y
|
||||||
|
and allowed to overflow into Z and cannot be split from Y to Z. Some sections
|
||||||
|
like bss are not allowed to be split so > notation is used for them */
|
||||||
|
|
||||||
|
.fardata: {} >> L2SRAM_UMAP0 | L2SRAM_UMAP1
|
||||||
|
.const: {} >> L2SRAM_UMAP0 | L2SRAM_UMAP1
|
||||||
|
.switch: {} >> L2SRAM_UMAP0 | L2SRAM_UMAP1
|
||||||
|
.cio: {} >> L2SRAM_UMAP0 | L2SRAM_UMAP1
|
||||||
|
.data: {} >> L2SRAM_UMAP0 | L2SRAM_UMAP1
|
||||||
|
|
||||||
|
.rodata: {} > L2SRAM_UMAP0 | L2SRAM_UMAP1
|
||||||
|
.bss: {} > L2SRAM_UMAP0 | L2SRAM_UMAP1
|
||||||
|
.neardata: {} > L2SRAM_UMAP0 | L2SRAM_UMAP1
|
||||||
|
.stack: {} > L2SRAM_UMAP0 | L2SRAM_UMAP1
|
||||||
|
.cinit: {} > L2SRAM_UMAP0 | L2SRAM_UMAP1
|
||||||
|
.far: {} > L2SRAM_UMAP0 | L2SRAM_UMAP1
|
||||||
|
|
||||||
|
.text: {} >> L2SRAM_UMAP1 | L2SRAM_UMAP0
|
||||||
|
}
|
||||||
|
|
97
dss/copyTranspose.c
Normal file
97
dss/copyTranspose.c
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
/*!
|
||||||
|
* \file copyTranspose.c
|
||||||
|
*
|
||||||
|
* \brief Copy with transpose function.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* Neither the name of Texas Instruments Incorporated nor the names of
|
||||||
|
* its contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common/src/dpu/capon3d/include/copyTranspose.h>
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
uint32_t copyTranspose(uint32_t * src, uint32_t * dest, uint32_t size, int32_t offset, uint32_t stride, uint32_t pairs)
|
||||||
|
{
|
||||||
|
int32_t i, j, k;
|
||||||
|
j = 0;
|
||||||
|
for(i = 0; i < (int32_t)size; i++)
|
||||||
|
{
|
||||||
|
for (k = 0; k < (int32_t)pairs; k++)
|
||||||
|
{
|
||||||
|
dest[j+k+i*offset] = src[pairs * i + k];
|
||||||
|
}
|
||||||
|
j += (int32_t)stride;
|
||||||
|
}
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
|
||||||
|
// for optimization purposes specific for 3D capon people counting, will ignore offset and pair parameter.
|
||||||
|
uint32_t copyTranspose(uint32_t * RESTRICT src, uint32_t * RESTRICT dest, uint32_t size, int32_t offset, uint32_t stride, uint32_t pairs)
|
||||||
|
{
|
||||||
|
int32_t i;
|
||||||
|
int32_t sizeOver4;
|
||||||
|
uint64_t * RESTRICT input, lltemp1;
|
||||||
|
uint32_t * RESTRICT output;
|
||||||
|
uint32_t * RESTRICT input1;
|
||||||
|
|
||||||
|
sizeOver4 = (int32_t) (size >> 2);
|
||||||
|
input = (uint64_t *) src;
|
||||||
|
output = dest;
|
||||||
|
|
||||||
|
for(i = 0; i < sizeOver4; i++)
|
||||||
|
{
|
||||||
|
lltemp1 = _amem8(input++);
|
||||||
|
* output = _loll(lltemp1);
|
||||||
|
output += stride;
|
||||||
|
* output = _hill(lltemp1);
|
||||||
|
output += stride;
|
||||||
|
lltemp1 = _amem8(input++);
|
||||||
|
* output = _loll(lltemp1);
|
||||||
|
output += stride;
|
||||||
|
* output = _hill(lltemp1);
|
||||||
|
output += stride;
|
||||||
|
}
|
||||||
|
|
||||||
|
input1 = (uint32_t *) src;
|
||||||
|
i = i * 4;
|
||||||
|
for(; i < (int32_t)size; i++)
|
||||||
|
{
|
||||||
|
* output = input1[i];
|
||||||
|
output += stride;
|
||||||
|
}
|
||||||
|
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
832
dss/dss_main.c
Normal file
832
dss/dss_main.c
Normal file
@ -0,0 +1,832 @@
|
|||||||
|
/**
|
||||||
|
* @file dss_main.c
|
||||||
|
*
|
||||||
|
* @brief
|
||||||
|
* This is the main file which implements the 3D people counting Demo on DSS.
|
||||||
|
*
|
||||||
|
* \par
|
||||||
|
* NOTE:
|
||||||
|
* (C) Copyright 2019 Texas Instruments, Inc.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* Neither the name of Texas Instruments Incorporated nor the names of
|
||||||
|
* its contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
*************************** Include Files ********************************
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
/* Standard Include Files. */
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
/* BIOS/XDC Include Files. */
|
||||||
|
#include <xdc/std.h>
|
||||||
|
#include <xdc/cfg/global.h>
|
||||||
|
#include <xdc/runtime/IHeap.h>
|
||||||
|
#include <xdc/runtime/System.h>
|
||||||
|
#include <xdc/runtime/Error.h>
|
||||||
|
#include <xdc/runtime/Memory.h>
|
||||||
|
#include <ti/sysbios/BIOS.h>
|
||||||
|
#include <ti/sysbios/knl/Task.h>
|
||||||
|
#include <ti/sysbios/knl/Event.h>
|
||||||
|
#include <ti/sysbios/knl/Semaphore.h>
|
||||||
|
#include <ti/sysbios/knl/Clock.h>
|
||||||
|
#include <ti/sysbios/heaps/HeapBuf.h>
|
||||||
|
#include <ti/sysbios/heaps/HeapMem.h>
|
||||||
|
#include <ti/sysbios/knl/Event.h>
|
||||||
|
#include <ti/sysbios/utils/Load.h>
|
||||||
|
#include <ti/sysbios/family/c64p/Hwi.h>
|
||||||
|
|
||||||
|
/* mmWave SDK Include Files: */
|
||||||
|
#include <ti/common/sys_common.h>
|
||||||
|
#include <ti/control/dpm/dpm.h>
|
||||||
|
#include <ti/drivers/soc/soc.h>
|
||||||
|
#include <ti/drivers/esm/esm.h>
|
||||||
|
#include <ti/drivers/crc/crc.h>
|
||||||
|
#include <ti/drivers/osal/DebugP.h>
|
||||||
|
|
||||||
|
/* Data path Include Files */
|
||||||
|
#include <common/src/dpc/capon3d/objectdetection.h>
|
||||||
|
|
||||||
|
/* Demo Include Files */
|
||||||
|
#include <people_counting/68xx_3D_people_counting/src/common/pcount3D_output.h>
|
||||||
|
#include "pcount3D_dss.h"
|
||||||
|
#include <people_counting/68xx_3D_people_counting/src/common/pcount3D_hwres.h>
|
||||||
|
|
||||||
|
/* Demo Profiling Include Files */
|
||||||
|
#include <ti/utils/cycleprofiler/cycle_profiler.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Task Priority settings:
|
||||||
|
*/
|
||||||
|
#define MMWDEMO_DPC_OBJDET_DPM_TASK_PRIORITY 5
|
||||||
|
|
||||||
|
#define DEBUG(_x) //_x
|
||||||
|
//#define BUILDFORMETHOD2
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef BUILDFORMETHOD2
|
||||||
|
#define L2HEAPSIZE (0x1B000) // for method 2 and full FoV support of ODS
|
||||||
|
#define L3HEAPSIZE (0x2D000) // for method 2 and full FoV support of ODS
|
||||||
|
#else
|
||||||
|
#define L2HEAPSIZE (0x19600) // for method 1 ISK and +/- 20 degree elev FOV of ODS
|
||||||
|
#define L3HEAPSIZE (0x21000) // for method 1 ISK and +/- 20 degree elev FOV of ODS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define L2SCRATCHSIZE (0x900)
|
||||||
|
#define L1SCRATCHSIZE (0x1200)
|
||||||
|
#define L1HEAPSIZE (0x2E00)
|
||||||
|
#pragma DATA_SECTION(memHeapL2, ".dpc_l2Heap")
|
||||||
|
uint8_t memHeapL2[L2HEAPSIZE];
|
||||||
|
#pragma DATA_SECTION(memHeapL3, ".l3data")
|
||||||
|
uint8_t memHeapL3[L3HEAPSIZE];
|
||||||
|
#pragma DATA_SECTION(l2ScratchMem, ".dpc_l2Heap")
|
||||||
|
uint8_t l2ScratchMem[L2SCRATCHSIZE];
|
||||||
|
#pragma DATA_SECTION(l1ScratchMem, ".dpc_l1Heap")
|
||||||
|
uint8_t l1ScratchMem[L1SCRATCHSIZE];
|
||||||
|
#pragma DATA_SECTION(l1HeapMem, ".dpc_l1Heap")
|
||||||
|
uint8_t l1HeapMem[L1HEAPSIZE];
|
||||||
|
|
||||||
|
#define DPC_OBJDET_DSP_INSTANCEID (0xDEEDDEED)
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
*************************** Global Definitions ***************************
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief
|
||||||
|
* Global Variable for tracking information required by the mmw Demo
|
||||||
|
*/
|
||||||
|
Pcount3DDemo_DSS_MCB gPcount3DDssMCB;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief
|
||||||
|
* Global Variable for DPM result buffer
|
||||||
|
*/
|
||||||
|
DPM_Buffer resultBuffer;
|
||||||
|
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
******************* Millimeter Wave Demo Functions Prototype *******************
|
||||||
|
**************************************************************************/
|
||||||
|
static void Pcount3DDemo_dssInitTask(UArg arg0, UArg arg1);
|
||||||
|
static void Pcount3DDemo_DPC_RadarProc_reportFxn
|
||||||
|
(
|
||||||
|
DPM_Report reportType,
|
||||||
|
uint32_t instanceId,
|
||||||
|
int32_t errCode,
|
||||||
|
uint32_t arg0,
|
||||||
|
uint32_t arg1
|
||||||
|
);
|
||||||
|
static void Pcount3DDemo_DPC_processFrameBeginCallBackFxn(uint8_t subFrameIndx);
|
||||||
|
static void Pcount3DDemo_DPC_processInterFrameBeginCallBackFxn(uint8_t subFrameIndx);
|
||||||
|
static void Pcount3DDemo_DPC_RadarProc_dpmTask(UArg arg0, UArg arg1);
|
||||||
|
static void Pcount3DDemo_sensorStopEpilog(void);
|
||||||
|
|
||||||
|
|
||||||
|
/* copy table related */
|
||||||
|
extern far COPY_TABLE _pcount3DDemo_fastCode_L1PSRAM_copy_table;
|
||||||
|
extern far COPY_TABLE _pcount3DDemo_configCode_HSRAM_copy_table;
|
||||||
|
|
||||||
|
static void MmwDemo_copyTable(EDMA_Handle handle, COPY_TABLE *tp);
|
||||||
|
static void MmwDemo_edmaBlockCopy(EDMA_Handle handle, uint32_t loadAddr, uint32_t runAddr, uint16_t size);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* Performs linker generated copy table copy using EDMA. Currently this is
|
||||||
|
* used to page in fast code from L3 to L1PSRAM.
|
||||||
|
* @param[in] handle EDMA handle
|
||||||
|
* @param[in] tp Pointer to copy table
|
||||||
|
*
|
||||||
|
* @retval
|
||||||
|
* Not Applicable.
|
||||||
|
*/
|
||||||
|
static void MmwDemo_copyTable(EDMA_Handle handle, COPY_TABLE *tp)
|
||||||
|
{
|
||||||
|
uint16_t i;
|
||||||
|
COPY_RECORD crp;
|
||||||
|
uint32_t loadAddr;
|
||||||
|
uint32_t runAddr;
|
||||||
|
|
||||||
|
for (i = 0; i < tp->num_recs; i++)
|
||||||
|
{
|
||||||
|
crp = tp->recs[i];
|
||||||
|
loadAddr = (uint32_t)crp.load_addr;
|
||||||
|
runAddr = (uint32_t)crp.run_addr;
|
||||||
|
|
||||||
|
/* currently we use only one count of EDMA which is 16-bit so we cannot
|
||||||
|
handle tables bigger than 64 KB */
|
||||||
|
DebugP_assert(crp.size <= 65536U);
|
||||||
|
|
||||||
|
if (crp.size)
|
||||||
|
{
|
||||||
|
MmwDemo_edmaBlockCopy(handle, loadAddr, runAddr, crp.size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* Performs simple block copy using EDMA. Used for the purpose of copying
|
||||||
|
* linker table for L3 to L1PSRAM copy. memcpy cannot be used because there is
|
||||||
|
* no data bus access to L1PSRAM.
|
||||||
|
*
|
||||||
|
* @param[in] handle EDMA handle
|
||||||
|
* @param[in] loadAddr load address
|
||||||
|
* @param[in] runAddr run address
|
||||||
|
* @param[in] size size in bytes
|
||||||
|
*
|
||||||
|
* @retval
|
||||||
|
* Not Applicable.
|
||||||
|
*/
|
||||||
|
static void MmwDemo_edmaBlockCopy(EDMA_Handle handle, uint32_t loadAddr, uint32_t runAddr, uint16_t size)
|
||||||
|
{
|
||||||
|
EDMA_channelConfig_t config;
|
||||||
|
volatile bool isTransferDone;
|
||||||
|
|
||||||
|
config.channelId = EDMA_TPCC0_REQ_FREE_0;
|
||||||
|
config.channelType = (uint8_t)EDMA3_CHANNEL_TYPE_DMA;
|
||||||
|
config.paramId = (uint16_t)EDMA_TPCC0_REQ_FREE_0;
|
||||||
|
config.eventQueueId = 0;
|
||||||
|
|
||||||
|
config.paramSetConfig.sourceAddress = (uint32_t) SOC_translateAddress((uint32_t)loadAddr,
|
||||||
|
SOC_TranslateAddr_Dir_TO_EDMA, NULL);
|
||||||
|
config.paramSetConfig.destinationAddress = (uint32_t) SOC_translateAddress((uint32_t)runAddr,
|
||||||
|
SOC_TranslateAddr_Dir_TO_EDMA, NULL);
|
||||||
|
|
||||||
|
config.paramSetConfig.aCount = size;
|
||||||
|
config.paramSetConfig.bCount = 1U;
|
||||||
|
config.paramSetConfig.cCount = 1U;
|
||||||
|
config.paramSetConfig.bCountReload = 0U;
|
||||||
|
|
||||||
|
config.paramSetConfig.sourceBindex = 0U;
|
||||||
|
config.paramSetConfig.destinationBindex = 0U;
|
||||||
|
|
||||||
|
config.paramSetConfig.sourceCindex = 0U;
|
||||||
|
config.paramSetConfig.destinationCindex = 0U;
|
||||||
|
|
||||||
|
config.paramSetConfig.linkAddress = EDMA_NULL_LINK_ADDRESS;
|
||||||
|
config.paramSetConfig.transferType = (uint8_t)EDMA3_SYNC_A;
|
||||||
|
config.paramSetConfig.transferCompletionCode = (uint8_t) EDMA_TPCC0_REQ_FREE_0;
|
||||||
|
config.paramSetConfig.sourceAddressingMode = (uint8_t) EDMA3_ADDRESSING_MODE_LINEAR;
|
||||||
|
config.paramSetConfig.destinationAddressingMode = (uint8_t) EDMA3_ADDRESSING_MODE_LINEAR;
|
||||||
|
|
||||||
|
/* don't care because of linear addressing modes above */
|
||||||
|
config.paramSetConfig.fifoWidth = (uint8_t) EDMA3_FIFO_WIDTH_8BIT;
|
||||||
|
|
||||||
|
config.paramSetConfig.isStaticSet = false;
|
||||||
|
config.paramSetConfig.isEarlyCompletion = false;
|
||||||
|
config.paramSetConfig.isFinalTransferInterruptEnabled = true;
|
||||||
|
config.paramSetConfig.isIntermediateTransferInterruptEnabled = false;
|
||||||
|
config.paramSetConfig.isFinalChainingEnabled = false;
|
||||||
|
config.paramSetConfig.isIntermediateChainingEnabled = false;
|
||||||
|
config.transferCompletionCallbackFxn = NULL;
|
||||||
|
config.transferCompletionCallbackFxnArg = NULL;
|
||||||
|
|
||||||
|
if (EDMA_configChannel(handle, &config, false) != EDMA_NO_ERROR)
|
||||||
|
{
|
||||||
|
DebugP_assert(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (EDMA_startDmaTransfer(handle, config.channelId) != EDMA_NO_ERROR)
|
||||||
|
{
|
||||||
|
DebugP_assert(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* wait until transfer done */
|
||||||
|
do {
|
||||||
|
if (EDMA_isTransferComplete(handle,
|
||||||
|
config.paramSetConfig.transferCompletionCode,
|
||||||
|
(bool *)&isTransferDone) != EDMA_NO_ERROR)
|
||||||
|
{
|
||||||
|
DebugP_assert(0);
|
||||||
|
}
|
||||||
|
} while (isTransferDone == false);
|
||||||
|
|
||||||
|
/* make sure to disable channel so it is usable later */
|
||||||
|
EDMA_disableChannel(handle, config.channelId, config.channelType);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* EDMA driver init
|
||||||
|
*
|
||||||
|
* @param[in] obj Pointer to data path object
|
||||||
|
*
|
||||||
|
* @retval
|
||||||
|
* Not Applicable.
|
||||||
|
*/
|
||||||
|
void MmwDemo_edmaInit(Pcount3DDemo_DataPathObj *obj, uint8_t instance)
|
||||||
|
{
|
||||||
|
int32_t errorCode;
|
||||||
|
|
||||||
|
errorCode = EDMA_init(instance);
|
||||||
|
if (errorCode != EDMA_NO_ERROR)
|
||||||
|
{
|
||||||
|
//System_printf ("Debug: EDMA instance %d initialization returned error %d\n", errorCode);
|
||||||
|
Pcount3DDemo_debugAssert (0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&obj->EDMA_errorInfo, 0, sizeof(obj->EDMA_errorInfo));
|
||||||
|
memset(&obj->EDMA_transferControllerErrorInfo, 0, sizeof(obj->EDMA_transferControllerErrorInfo));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* Call back function for EDMA CC (Channel controller) error as per EDMA API.
|
||||||
|
* Declare fatal error if happens, the output errorInfo can be examined if code
|
||||||
|
* gets trapped here.
|
||||||
|
*/
|
||||||
|
void MmwDemo_EDMA_errorCallbackFxn(EDMA_Handle handle, EDMA_errorInfo_t *errorInfo)
|
||||||
|
{
|
||||||
|
gPcount3DDssMCB.dataPathObj.EDMA_errorInfo = *errorInfo;
|
||||||
|
Pcount3DDemo_debugAssert(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* Call back function for EDMA transfer controller error as per EDMA API.
|
||||||
|
* Declare fatal error if happens, the output errorInfo can be examined if code
|
||||||
|
* gets trapped here.
|
||||||
|
*/
|
||||||
|
void MmwDemo_EDMA_transferControllerErrorCallbackFxn(EDMA_Handle handle,
|
||||||
|
EDMA_transferControllerErrorInfo_t *errorInfo)
|
||||||
|
{
|
||||||
|
gPcount3DDssMCB.dataPathObj.EDMA_transferControllerErrorInfo = *errorInfo;
|
||||||
|
Pcount3DDemo_debugAssert(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* Open EDMA driver instance
|
||||||
|
*
|
||||||
|
* @param[in] obj Pointer to data path object
|
||||||
|
* @param[in] instance EDMA instance
|
||||||
|
*
|
||||||
|
* @retval
|
||||||
|
* Not Applicable.
|
||||||
|
*/
|
||||||
|
static void MmwDemo_edmaOpen(Pcount3DDemo_DataPathObj *obj, uint8_t instance)
|
||||||
|
{
|
||||||
|
int32_t errCode;
|
||||||
|
EDMA_instanceInfo_t edmaInstanceInfo;
|
||||||
|
EDMA_errorConfig_t errorConfig;
|
||||||
|
|
||||||
|
obj->edmaHandle = EDMA_open(
|
||||||
|
instance,
|
||||||
|
&errCode,
|
||||||
|
&edmaInstanceInfo);
|
||||||
|
if (obj->edmaHandle == NULL)
|
||||||
|
{
|
||||||
|
Pcount3DDemo_debugAssert (0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
errorConfig.isConfigAllEventQueues = true;
|
||||||
|
errorConfig.isConfigAllTransferControllers = true;
|
||||||
|
errorConfig.isEventQueueThresholdingEnabled = true;
|
||||||
|
errorConfig.eventQueueThreshold = EDMA_EVENT_QUEUE_THRESHOLD_MAX;
|
||||||
|
errorConfig.isEnableAllTransferControllerErrors = true;
|
||||||
|
errorConfig.callbackFxn = MmwDemo_EDMA_errorCallbackFxn;
|
||||||
|
errorConfig.transferControllerCallbackFxn = MmwDemo_EDMA_transferControllerErrorCallbackFxn;
|
||||||
|
if ((errCode = EDMA_configErrorMonitoring(obj->edmaHandle, &errorConfig)) != EDMA_NO_ERROR)
|
||||||
|
{
|
||||||
|
//System_printf("Error: EDMA_configErrorMonitoring() failed with errorCode = %d\n", errCode);
|
||||||
|
Pcount3DDemo_debugAssert (0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* Close EDMA driver instance
|
||||||
|
*
|
||||||
|
* @param[in] obj Pointer to data path object
|
||||||
|
*
|
||||||
|
* @retval
|
||||||
|
* Not Applicable.
|
||||||
|
*/
|
||||||
|
void MmwDemo_edmaClose(Pcount3DDemo_DataPathObj *obj)
|
||||||
|
{
|
||||||
|
EDMA_close(obj->edmaHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* Epilog processing after sensor has stopped
|
||||||
|
*
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
static void Pcount3DDemo_sensorStopEpilog(void)
|
||||||
|
{
|
||||||
|
Hwi_StackInfo stackInfo;
|
||||||
|
Task_Stat stat;
|
||||||
|
bool hwiStackOverflow;
|
||||||
|
|
||||||
|
DEBUG(System_printf("Data Path Stopped (last frame processing done)\n");)
|
||||||
|
|
||||||
|
/* Print DSS task statistics */
|
||||||
|
DEBUG(System_printf("DSS Task Stack Usage (Note: Task Stack Usage) ==========\n");)
|
||||||
|
|
||||||
|
Task_stat(gPcount3DDssMCB.initTaskHandle, &stat);
|
||||||
|
DEBUG(System_printf("%20s %12d %12d %12d\n", "initTask",
|
||||||
|
stat.stackSize,
|
||||||
|
stat.used,
|
||||||
|
stat.stackSize - stat.used);)
|
||||||
|
|
||||||
|
Task_stat(gPcount3DDssMCB.radarProcDpmTaskHandle, &stat);
|
||||||
|
DEBUG(System_printf("%20s %12s %12s %12s\n", "Task Name", "Size", "Used", "Free");)
|
||||||
|
DEBUG(System_printf("%20s %12d %12d %12d\n", "ObjDet DPM",
|
||||||
|
stat.stackSize,
|
||||||
|
stat.used,
|
||||||
|
stat.stackSize - stat.used);)
|
||||||
|
|
||||||
|
DEBUG(System_printf("HWI Stack (same as System Stack) Usage ============\n");)
|
||||||
|
hwiStackOverflow = Hwi_getStackInfo(&stackInfo, TRUE);
|
||||||
|
if (hwiStackOverflow == TRUE)
|
||||||
|
{
|
||||||
|
DEBUG(System_printf("DSS HWI Stack overflowed\n");)
|
||||||
|
Pcount3DDemo_debugAssert(0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DEBUG(System_printf("%20s %12s %12s %12s\n", " ", "Size", "Used", "Free");)
|
||||||
|
DEBUG(System_printf("%20s %12d %12d %12d\n", " ",
|
||||||
|
stackInfo.hwiStackSize,
|
||||||
|
stackInfo.hwiStackPeak,
|
||||||
|
stackInfo.hwiStackSize - stackInfo.hwiStackPeak);)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* DPM Registered Report Handler. The DPM Module uses this registered function to notify
|
||||||
|
* the application about DPM reports.
|
||||||
|
*
|
||||||
|
* @param[in] reportType
|
||||||
|
* Report Type
|
||||||
|
* @param[in] instanceId
|
||||||
|
* Instance Identifier which generated the report
|
||||||
|
* @param[in] errCode
|
||||||
|
* Error code if any.
|
||||||
|
* @param[in] arg0
|
||||||
|
* Argument 0 interpreted with the report type
|
||||||
|
* @param[in] arg1
|
||||||
|
* Argument 1 interpreted with the report type
|
||||||
|
*
|
||||||
|
* @retval
|
||||||
|
* Not Applicable.
|
||||||
|
*/
|
||||||
|
static void Pcount3DDemo_DPC_RadarProc_reportFxn
|
||||||
|
(
|
||||||
|
DPM_Report reportType,
|
||||||
|
uint32_t instanceId,
|
||||||
|
int32_t errCode,
|
||||||
|
uint32_t arg0,
|
||||||
|
uint32_t arg1
|
||||||
|
)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* Only errors are logged on the console: */
|
||||||
|
if (errCode != 0)
|
||||||
|
{
|
||||||
|
/* Error: Detected log on the console and die all errors are FATAL currently. */
|
||||||
|
DEBUG(System_printf ("Error: DPM Report %d received with error:%d arg0:0x%x arg1:0x%x\n",
|
||||||
|
reportType, errCode, arg0, arg1);)
|
||||||
|
DebugP_assert (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Processing further is based on the reports received: This is the control of the profile
|
||||||
|
* state machine: */
|
||||||
|
switch (reportType)
|
||||||
|
{
|
||||||
|
case DPM_Report_IOCTL:
|
||||||
|
{
|
||||||
|
/*****************************************************************
|
||||||
|
* DPC has been configured without an error:
|
||||||
|
* - This is an indication that the profile configuration commands
|
||||||
|
* went through without any issues.
|
||||||
|
*****************************************************************/
|
||||||
|
DebugP_log1("DSSApp: DPM Report IOCTL, command = %d\n", arg0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case DPM_Report_DPC_STARTED:
|
||||||
|
{
|
||||||
|
/*****************************************************************
|
||||||
|
* DPC has been started without an error:
|
||||||
|
* - notify sensor management task that DPC is started.
|
||||||
|
*****************************************************************/
|
||||||
|
DebugP_log0("DSSApp: DPM Report start\n");
|
||||||
|
gPcount3DDssMCB.dpmStartEvents++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case DPM_Report_NOTIFY_DPC_RESULT:
|
||||||
|
{
|
||||||
|
/*****************************************************************
|
||||||
|
* DPC Results have been passed:
|
||||||
|
* - This implies that we have valid profile results which have
|
||||||
|
* been received from the profile.
|
||||||
|
*****************************************************************/
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case DPM_Report_NOTIFY_DPC_RESULT_ACKED:
|
||||||
|
{
|
||||||
|
/*****************************************************************
|
||||||
|
* DPC Results have been acked:
|
||||||
|
* - This implies that MSS received the results.
|
||||||
|
*****************************************************************/
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case DPM_Report_DPC_ASSERT:
|
||||||
|
{
|
||||||
|
DPM_DPCAssert* ptrAssert;
|
||||||
|
|
||||||
|
/*****************************************************************
|
||||||
|
* DPC Fault has been detected:
|
||||||
|
* - This implies that the DPC has crashed.
|
||||||
|
* - The argument0 points to the DPC assertion information
|
||||||
|
*****************************************************************/
|
||||||
|
ptrAssert = (DPM_DPCAssert*)arg0;
|
||||||
|
System_printf ("DSS Exception: %s, line %d.\n", ptrAssert->fileName,
|
||||||
|
ptrAssert->lineNum);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case DPM_Report_DPC_STOPPED:
|
||||||
|
{
|
||||||
|
/*****************************************************************
|
||||||
|
* DPC has been stopped without an error:
|
||||||
|
* - This implies that the DPC can either be reconfigured or
|
||||||
|
* restarted.
|
||||||
|
*****************************************************************/
|
||||||
|
DebugP_log0("DSSApp: DPM Report stop\n");
|
||||||
|
gPcount3DDssMCB.dpmStopEvents++;
|
||||||
|
if (gPcount3DDssMCB.dpmStopEvents % 2 == 1) {
|
||||||
|
Pcount3DDemo_sensorStopEpilog();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case DPM_Report_DPC_INFO:
|
||||||
|
{
|
||||||
|
/* Currently chain does not use this feature. */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
DebugP_assert (0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* Call back function that was registered during config time and is going
|
||||||
|
* to be called in DPC processing at the beginning of frame/sub-frame processing.
|
||||||
|
* Note: In this demo objdetdsp DPC only have inter-frame processing, hence this
|
||||||
|
* callback function won't be called.
|
||||||
|
*
|
||||||
|
* @param[in] subFrameIndx Sub-frame index of the sub-frame during which processing
|
||||||
|
* this function was called.
|
||||||
|
*
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
static void Pcount3DDemo_DPC_processFrameBeginCallBackFxn(uint8_t subFrameIndx)
|
||||||
|
{
|
||||||
|
/* Empty function */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* Call back function that was registered during config time and is going
|
||||||
|
* to be called in DPC processing at the beginning of inter-frame/inter-sub-frame processing,
|
||||||
|
* we use this to issue BIOS calls for computing CPU load during active frame (chirping)
|
||||||
|
*
|
||||||
|
* @param[in] subFrameIndx Sub-frame index of the sub-frame during which processing
|
||||||
|
* this function was called.
|
||||||
|
*
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
static void Pcount3DDemo_DPC_processInterFrameBeginCallBackFxn(uint8_t subFrameIndx)
|
||||||
|
{
|
||||||
|
Load_update();
|
||||||
|
gPcount3DDssMCB.dataPathObj.subFrameStats[subFrameIndx].interFrameCPULoad = Load_getCPULoad();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* DPM Execution Task. DPM execute results are processed here:
|
||||||
|
* a) Update states based on timestamp from DPC.
|
||||||
|
* b) Copy results to shared memory to be shared with MSS.
|
||||||
|
* c) Send Results to MSS by calling DPM_sendResult()
|
||||||
|
*
|
||||||
|
* @retval
|
||||||
|
* Not Applicable.
|
||||||
|
*/
|
||||||
|
static void Pcount3DDemo_DPC_RadarProc_dpmTask(UArg arg0, UArg arg1)
|
||||||
|
{
|
||||||
|
int32_t retVal;
|
||||||
|
//DPC_ObjectDetection_ExecuteResult *result;
|
||||||
|
volatile uint32_t startTime;
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
/* Execute the DPM module: */
|
||||||
|
//DebugP_log0("DSS main: Pcount3DDemo_DPC_RadarProc_dpmTask\n");
|
||||||
|
retVal = DPM_execute (gPcount3DDssMCB.dataPathObj.radarProcDpmHandle, &resultBuffer);
|
||||||
|
if (retVal < 0) {
|
||||||
|
DEBUG(System_printf ("Error: DPM execution failed [Error code %d]\n", retVal);)
|
||||||
|
Pcount3DDemo_debugAssert (0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ((resultBuffer.size[0] == sizeof(DPC_ObjectDetection_ExecuteResult)))
|
||||||
|
{
|
||||||
|
|
||||||
|
retVal = DPM_sendResult (gPcount3DDssMCB.dataPathObj.radarProcDpmHandle, true, &resultBuffer);
|
||||||
|
if (retVal < 0)
|
||||||
|
{
|
||||||
|
DEBUG(System_printf ("Error: Failed to send results [Error: %d] to remote\n", retVal);)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//writeback all the data shared with R4 in L3, and prepare cache for next frames radar cube from R4.
|
||||||
|
cache_wbInvAllL2Wait();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* System Initialization Task which initializes the various
|
||||||
|
* components in the system.
|
||||||
|
*
|
||||||
|
* @retval
|
||||||
|
* Not Applicable.
|
||||||
|
*/
|
||||||
|
static void Pcount3DDemo_dssInitTask(UArg arg0, UArg arg1)
|
||||||
|
{
|
||||||
|
int32_t errCode;
|
||||||
|
Task_Params taskParams;
|
||||||
|
DPM_InitCfg dpmInitCfg;
|
||||||
|
DPC_ObjectDetection_InitParams objDetInitParams;
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Driver Init:
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Driver Open/Configuraiton:
|
||||||
|
*****************************************************************************/
|
||||||
|
/* Initialize EDMA */
|
||||||
|
MmwDemo_edmaInit(&gPcount3DDssMCB.dataPathObj, DPC_OBJDET_DSP_EDMA_INSTANCE);
|
||||||
|
|
||||||
|
/* Use instance 1 on DSS */
|
||||||
|
MmwDemo_edmaOpen(&gPcount3DDssMCB.dataPathObj, DPC_OBJDET_DSP_EDMA_INSTANCE);
|
||||||
|
|
||||||
|
/* Copy code from L3 to L1PSRAM, this code related to data path processing */
|
||||||
|
MmwDemo_copyTable(gPcount3DDssMCB.dataPathObj.edmaHandle, &_pcount3DDemo_fastCode_L1PSRAM_copy_table);
|
||||||
|
MmwDemo_copyTable(gPcount3DDssMCB.dataPathObj.edmaHandle, &_pcount3DDemo_configCode_HSRAM_copy_table);
|
||||||
|
|
||||||
|
/* Initialize the Mailbox */
|
||||||
|
Mailbox_init(MAILBOX_TYPE_DSS);
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Initialization of the DPM Module:
|
||||||
|
*****************************************************************************/
|
||||||
|
DebugP_log0("DSS main: Pcount3DDemo_dssInitTask\n");
|
||||||
|
|
||||||
|
memset ((void *)&objDetInitParams, 0, sizeof(DPC_ObjectDetection_InitParams));
|
||||||
|
/*Set up init params for memory osal*/
|
||||||
|
objDetInitParams.L3HeapCfg.addr = (void *) &memHeapL3[0];
|
||||||
|
objDetInitParams.L3HeapCfg.size = L3HEAPSIZE;
|
||||||
|
objDetInitParams.L3ScratchCfg.addr = (void *) NULL;
|
||||||
|
objDetInitParams.L3ScratchCfg.size = 0;
|
||||||
|
|
||||||
|
objDetInitParams.CoreL2HeapCfg.addr = (void *) &memHeapL2[0];
|
||||||
|
objDetInitParams.CoreL2HeapCfg.size = L2HEAPSIZE;
|
||||||
|
objDetInitParams.CoreL2ScratchCfg.addr = (void *) &l2ScratchMem[0];
|
||||||
|
objDetInitParams.CoreL2ScratchCfg.size = L2SCRATCHSIZE;
|
||||||
|
|
||||||
|
objDetInitParams.CoreL1HeapCfg.addr = (void *) &l1HeapMem[0];
|
||||||
|
objDetInitParams.CoreL1HeapCfg.size = L1HEAPSIZE;
|
||||||
|
objDetInitParams.CoreL1ScratchCfg.addr = (void *) &l1ScratchMem[0];
|
||||||
|
objDetInitParams.CoreL1ScratchCfg.size = L1SCRATCHSIZE;
|
||||||
|
|
||||||
|
/* DPC Call-back config */
|
||||||
|
objDetInitParams.processCallBackCfg.processFrameBeginCallBackFxn =
|
||||||
|
Pcount3DDemo_DPC_processFrameBeginCallBackFxn;
|
||||||
|
objDetInitParams.processCallBackCfg.processInterFrameBeginCallBackFxn =
|
||||||
|
Pcount3DDemo_DPC_processInterFrameBeginCallBackFxn;
|
||||||
|
|
||||||
|
memset ((void *)&dpmInitCfg, 0, sizeof(DPM_InitCfg));
|
||||||
|
|
||||||
|
/* Setup the configuration: */
|
||||||
|
dpmInitCfg.socHandle = gPcount3DDssMCB.socHandle;
|
||||||
|
dpmInitCfg.ptrProcChainCfg = &gDPC_ObjectDetectionCfg;
|
||||||
|
dpmInitCfg.instanceId = DPC_OBJDET_DSP_INSTANCEID;
|
||||||
|
dpmInitCfg.domain = DPM_Domain_DISTRIBUTED;
|
||||||
|
dpmInitCfg.reportFxn = Pcount3DDemo_DPC_RadarProc_reportFxn;
|
||||||
|
dpmInitCfg.arg = &objDetInitParams;
|
||||||
|
dpmInitCfg.argSize = sizeof(DPC_ObjectDetection_InitParams);
|
||||||
|
|
||||||
|
/* Initialize the DPM Module: */
|
||||||
|
gPcount3DDssMCB.dataPathObj.radarProcDpmHandle = DPM_init (&dpmInitCfg, &errCode);
|
||||||
|
if (gPcount3DDssMCB.dataPathObj.radarProcDpmHandle == NULL)
|
||||||
|
{
|
||||||
|
DEBUG(System_printf ("Error: Unable to initialize the DPM Module [Error: %d]\n", errCode);)
|
||||||
|
Pcount3DDemo_debugAssert (0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Synchronization: This will synchronize the execution of the control module
|
||||||
|
* between the domains. This is a prerequiste and always needs to be invoked. */
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
int32_t syncStatus;
|
||||||
|
|
||||||
|
/* Get the synchronization status: */
|
||||||
|
syncStatus = DPM_synch (gPcount3DDssMCB.dataPathObj.radarProcDpmHandle, &errCode);
|
||||||
|
if (syncStatus < 0)
|
||||||
|
{
|
||||||
|
/* Error: Unable to synchronize the framework */
|
||||||
|
DEBUG(System_printf ("Error: DPM Synchronization failed [Error code %d]\n", errCode);)
|
||||||
|
Pcount3DDemo_debugAssert (0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (syncStatus == 1)
|
||||||
|
{
|
||||||
|
/* Synchronization acheived: */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* Sleep and poll again: */
|
||||||
|
Task_sleep(1);
|
||||||
|
}
|
||||||
|
System_printf ("Debug: DPM Module Sync is done\n");
|
||||||
|
|
||||||
|
/* Launch the DPM Task */
|
||||||
|
Task_Params_init(&taskParams);
|
||||||
|
taskParams.priority = MMWDEMO_DPC_OBJDET_DPM_TASK_PRIORITY;
|
||||||
|
taskParams.stackSize = 3*1024;
|
||||||
|
gPcount3DDssMCB.radarProcDpmTaskHandle = Task_create(Pcount3DDemo_DPC_RadarProc_dpmTask, &taskParams, NULL);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* Function to sleep the DSP using IDLE instruction.
|
||||||
|
* When DSP has no work left to do,
|
||||||
|
* the BIOS will be in Idle thread and will call this function.
|
||||||
|
*
|
||||||
|
* @retval
|
||||||
|
* Not Applicable.
|
||||||
|
*/
|
||||||
|
void Pcount3DDemo_sleep(void)
|
||||||
|
{
|
||||||
|
/* issue WFI (Wait For Interrupt) instruction */
|
||||||
|
asm(" IDLE ");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* Entry point into the Millimeter Wave Demo
|
||||||
|
*
|
||||||
|
* @retval
|
||||||
|
* Not Applicable.
|
||||||
|
*/
|
||||||
|
int main (void)
|
||||||
|
{
|
||||||
|
Task_Params taskParams;
|
||||||
|
int32_t errCode;
|
||||||
|
SOC_Handle socHandle;
|
||||||
|
SOC_Cfg socCfg;
|
||||||
|
|
||||||
|
// set cache state for l3 and hsram
|
||||||
|
cache_setMar((unsigned int *)0x20000000, 0xC0000, Cache_PC | Cache_PFX);
|
||||||
|
//cache_setMar((unsigned int *)0x21080000, 0x8000, Cache_PC | Cache_PFX);
|
||||||
|
|
||||||
|
|
||||||
|
/* Initialize and populate the demo MCB */
|
||||||
|
memset ((void*)&gPcount3DDssMCB, 0, sizeof(Pcount3DDemo_DSS_MCB));
|
||||||
|
|
||||||
|
/* Initialize the SOC confiugration: */
|
||||||
|
memset ((void *)&socCfg, 0, sizeof(SOC_Cfg));
|
||||||
|
|
||||||
|
/* Populate the SOC configuration: */
|
||||||
|
socCfg.clockCfg = SOC_SysClock_BYPASS_INIT;
|
||||||
|
|
||||||
|
/* Initialize the SOC Module: This is done as soon as the application is started
|
||||||
|
* to ensure that the MPU is correctly configured. */
|
||||||
|
socHandle = SOC_init (&socCfg, &errCode);
|
||||||
|
if (socHandle == NULL)
|
||||||
|
{
|
||||||
|
DEBUG(System_printf ("Error: SOC Module Initialization failed [Error code %d]\n", errCode);)
|
||||||
|
Pcount3DDemo_debugAssert (0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
gPcount3DDssMCB.socHandle = socHandle;
|
||||||
|
|
||||||
|
/* Initialize the Task Parameters. */
|
||||||
|
Task_Params_init(&taskParams);
|
||||||
|
taskParams.stackSize = 1536;
|
||||||
|
gPcount3DDssMCB.initTaskHandle = Task_create(Pcount3DDemo_dssInitTask, &taskParams, NULL);
|
||||||
|
|
||||||
|
/* Start BIOS */
|
||||||
|
BIOS_start();
|
||||||
|
return 0;
|
||||||
|
}
|
910
dss/objectdetection.c
Normal file
910
dss/objectdetection.c
Normal file
@ -0,0 +1,910 @@
|
|||||||
|
/*
|
||||||
|
* @file objectdetection.c
|
||||||
|
*
|
||||||
|
* @brief
|
||||||
|
* Object Detection DPC implementation using DSP.
|
||||||
|
*
|
||||||
|
* \par
|
||||||
|
* NOTE:
|
||||||
|
* (C) Copyright 2019 Texas Instruments, Inc.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* Neither the name of Texas Instruments Incorporated nor the names of
|
||||||
|
* its contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
*************************** Include Files ********************************
|
||||||
|
**************************************************************************/
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
/* mmWave SDK Include Files: */
|
||||||
|
#include <ti/drivers/soc/soc.h>
|
||||||
|
#include <ti/common/sys_common.h>
|
||||||
|
#include <ti/drivers/osal/DebugP.h>
|
||||||
|
#include <ti/drivers/osal/MemoryP.h>
|
||||||
|
#include <ti/utils/mathutils/mathutils.h>
|
||||||
|
#include <ti/utils/cycleprofiler/cycle_profiler.h>
|
||||||
|
#include <ti/control/dpm/dpm.h>
|
||||||
|
#include <xdc/runtime/System.h>
|
||||||
|
|
||||||
|
/* C674x mathlib */
|
||||||
|
/* Suppress the mathlib.h warnings
|
||||||
|
* #48-D: incompatible redefinition of macro "TRUE"
|
||||||
|
* #48-D: incompatible redefinition of macro "FALSE"
|
||||||
|
*/
|
||||||
|
//#pragma diag_push
|
||||||
|
//#pragma diag_suppress 48
|
||||||
|
//#include <ti/mathlib/mathlib.h>
|
||||||
|
//#pragma diag_pop
|
||||||
|
|
||||||
|
/*! This is supplied at command line when application builds this file. This file
|
||||||
|
* is owned by the application and contains all resource partitioning, an
|
||||||
|
* application may include more than one DPC and also use resources outside of DPCs.
|
||||||
|
* The resource definitions used by this object detection DPC are prefixed by DPC_OBJDET_ */
|
||||||
|
#include APP_RESOURCE_FILE
|
||||||
|
|
||||||
|
#include <ti/control/mmwavelink/mmwavelink.h>
|
||||||
|
|
||||||
|
/* Obj Det instance etc */
|
||||||
|
#include <common/src/dpc/capon3d/include/objectdetectioninternal.h>
|
||||||
|
#include <common/src/dpc/capon3d/objectdetection.h>
|
||||||
|
|
||||||
|
|
||||||
|
//#define DBG_DPC_OBJDET
|
||||||
|
|
||||||
|
#ifdef DBG_DPC_OBJDET
|
||||||
|
ObjDetObj *gObjDetObj;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
************************** Local Definitions **********************************
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
@}
|
||||||
|
*/
|
||||||
|
/*! Maximum Number of objects that can be detected in a frame */
|
||||||
|
#define DPC_OBJDET_MAX_NUM_OBJECTS DOA_OUTPUT_MAXPOINTS
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
************************** Local Functions Prototype **************************
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
static DPM_DPCHandle DPC_ObjectDetection_init
|
||||||
|
(
|
||||||
|
DPM_Handle dpmHandle,
|
||||||
|
DPM_InitCfg* ptrInitCfg,
|
||||||
|
int32_t* errCode
|
||||||
|
);
|
||||||
|
|
||||||
|
static int32_t DPC_ObjectDetection_execute
|
||||||
|
(
|
||||||
|
DPM_DPCHandle handle,
|
||||||
|
DPM_Buffer* ptrResult
|
||||||
|
);
|
||||||
|
|
||||||
|
static int32_t DPC_ObjectDetection_ioctl
|
||||||
|
(
|
||||||
|
DPM_DPCHandle handle,
|
||||||
|
uint32_t cmd,
|
||||||
|
void* arg,
|
||||||
|
uint32_t argLen
|
||||||
|
);
|
||||||
|
|
||||||
|
static int32_t DPC_ObjectDetection_start (DPM_DPCHandle handle);
|
||||||
|
static int32_t DPC_ObjectDetection_stop (DPM_DPCHandle handle);
|
||||||
|
static int32_t DPC_ObjectDetection_deinit (DPM_DPCHandle handle);
|
||||||
|
static void DPC_ObjectDetection_frameStart (DPM_DPCHandle handle);
|
||||||
|
int32_t DPC_ObjectDetection_dataInjection(DPM_DPCHandle handle, DPM_Buffer* ptrBuffer);
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
************************** Local Functions *******************************
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* Sends Assert
|
||||||
|
*
|
||||||
|
* @retval
|
||||||
|
* Not Applicable.
|
||||||
|
*/
|
||||||
|
void _DPC_Objdet_Assert(DPM_Handle handle, int32_t expression,
|
||||||
|
const char *file, int32_t line)
|
||||||
|
{
|
||||||
|
DPM_DPCAssert fault;
|
||||||
|
|
||||||
|
if (!expression)
|
||||||
|
{
|
||||||
|
fault.lineNum = (uint32_t)line;
|
||||||
|
fault.arg0 = 0U;
|
||||||
|
fault.arg1 = 0U;
|
||||||
|
strncpy (fault.fileName, file, (DPM_MAX_FILE_NAME_LEN-1));
|
||||||
|
|
||||||
|
/* Report the fault to the DPM entities */
|
||||||
|
DPM_ioctl (handle,
|
||||||
|
DPM_CMD_DPC_ASSERT,
|
||||||
|
(void*)&fault,
|
||||||
|
sizeof(DPM_DPCAssert));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* DPC data injection function registered with DPM. This is invoked on reception
|
||||||
|
* of the data injection from DPM.
|
||||||
|
*
|
||||||
|
* @param[in] handle DPM's DPC handle
|
||||||
|
* @param[in] ptrBuffer Buffer for data injected
|
||||||
|
*
|
||||||
|
* \ingroup DPC_OBJDET__INTERNAL_FUNCTION
|
||||||
|
*
|
||||||
|
* @retval
|
||||||
|
* Not applicable
|
||||||
|
*/
|
||||||
|
int32_t DPC_ObjectDetection_dataInjection(DPM_DPCHandle handle, DPM_Buffer* ptrBuffer)
|
||||||
|
{
|
||||||
|
ObjDetObj *objDetObj = (ObjDetObj *) handle;
|
||||||
|
|
||||||
|
/* Notify the DPM Module that the DPC is ready for execution */
|
||||||
|
|
||||||
|
//DebugP_log1("ObjDet DPC: DPC_ObjectDetection_dataInjection, handle = 0x%x\n", (uint32_t)handle);
|
||||||
|
DebugP_assert (DPM_notifyExecute (objDetObj->dpmHandle, handle, true) == 0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* Sub-frame reconfiguration, used when switching sub-frames. Invokes the
|
||||||
|
* DPU configuration using the configuration that was stored during the
|
||||||
|
* pre-start configuration so reconstruction time is saved because this will
|
||||||
|
* happen in real-time.
|
||||||
|
* @param[in] objDetObj Pointer to DPC object
|
||||||
|
* @param[in] subFrameIndx Sub-frame index.
|
||||||
|
*
|
||||||
|
* @retval
|
||||||
|
* Success - 0
|
||||||
|
* @retval
|
||||||
|
* Error - <0
|
||||||
|
*
|
||||||
|
* \ingroup DPC_OBJDET__INTERNAL_FUNCTION
|
||||||
|
*/
|
||||||
|
static int32_t DPC_ObjDetDSP_reconfigSubFrame(ObjDetObj *objDetObj, uint8_t subFrameIndx)
|
||||||
|
{
|
||||||
|
int32_t retVal = 0;
|
||||||
|
//SubFrameObj *subFrmObj;
|
||||||
|
|
||||||
|
//subFrmObj = &objDetObj->subFrameObj[subFrameIndx];
|
||||||
|
|
||||||
|
//retVal = DPU_CFARCAProcDSP_config(subFrmObj->dpuCFARCAObj, &subFrmObj->dpuCfg.cfarCfg);
|
||||||
|
if (retVal != 0)
|
||||||
|
{
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
exit:
|
||||||
|
return(retVal);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* Function to initialize all DPUs used in the DPC chain
|
||||||
|
*
|
||||||
|
* @param[in] objDetObj Pointer to sub-frame object
|
||||||
|
* @param[in] numSubFrames Number of sub-frames
|
||||||
|
*
|
||||||
|
* \ingroup DPC_OBJDET__INTERNAL_FUNCTION
|
||||||
|
*
|
||||||
|
* @retval
|
||||||
|
* Success - 0
|
||||||
|
* @retval
|
||||||
|
* Error - <0
|
||||||
|
*/
|
||||||
|
static inline int32_t DPC_ObjDetDSP_initDPU
|
||||||
|
(
|
||||||
|
ObjDetObj *objDetObj,
|
||||||
|
uint8_t numSubFrames
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int32_t retVal = 0;
|
||||||
|
|
||||||
|
return(retVal);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* Function to de-initialize all DPUs used in the DPC chain
|
||||||
|
*
|
||||||
|
* @param[in] objDetObj Pointer to sub-frame object
|
||||||
|
* @param[in] numSubFrames Number of sub-frames
|
||||||
|
*
|
||||||
|
* \ingroup DPC_OBJDET__INTERNAL_FUNCTION
|
||||||
|
*
|
||||||
|
* @retval
|
||||||
|
* Success - 0
|
||||||
|
* @retval
|
||||||
|
* Error - <0
|
||||||
|
*/
|
||||||
|
static inline int32_t DPC_ObjDetDSP_deinitDPU
|
||||||
|
(
|
||||||
|
ObjDetObj *objDetObj,
|
||||||
|
uint8_t numSubFrames
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int32_t retVal = 0;
|
||||||
|
|
||||||
|
radarOsal_memDeInit();
|
||||||
|
|
||||||
|
return(retVal);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* Performs processing related to pre-start configuration, which is per sub-frame,
|
||||||
|
* by configuring each of the DPUs involved in the processing chain.
|
||||||
|
* Memory management notes:
|
||||||
|
* 1. Core Local Memory that needs to be preserved across sub-frames (such as range DPU's calib DC buffer)
|
||||||
|
* will be allocated using MemoryP_alloc.
|
||||||
|
* 2. Core Local Memory that needs to be preserved within a sub-frame across DPU calls
|
||||||
|
* (the DPIF * type memory) or for intermediate private scratch memory for
|
||||||
|
* DPU (i.e no preservation is required from process call to process call of the DPUs
|
||||||
|
* within the sub-frame) will be allocated from the Core Local RAM configuration supplied in
|
||||||
|
* @ref DPC_ObjectDetection_InitParams given to @ref DPC_ObjectDetection_init API
|
||||||
|
* 3. L3 memory will only be allocated from the L3 RAM configuration supplied in
|
||||||
|
* @ref DPC_ObjectDetection_InitParams given to @ref DPC_ObjectDetection_init API
|
||||||
|
* No L3 buffers are presently required that need to be preserved across sub-frames
|
||||||
|
* (type described in #1 above), neither are L3 scratch buffers required for
|
||||||
|
* intermediate processing within DPU process call.
|
||||||
|
*
|
||||||
|
* @param[in] subFrameObj Pointer to sub-frame object
|
||||||
|
* @param[in] commonCfg Pointer to pre-start common configuration
|
||||||
|
* @param[in] preStartCfg Pointer to pre-start configuration of the sub-frame
|
||||||
|
* @param[in] edmaHandle Pointer to array of EDMA handles for the device, this
|
||||||
|
* can be distributed among the DPUs, the actual EDMA handle used
|
||||||
|
* in DPC is determined by definition in application resource file
|
||||||
|
* @param[in] L3ramObj Pointer to L3 RAM memory pool object
|
||||||
|
* @param[in] CoreL2RamObj Pointer to Core Local L2 memory pool object
|
||||||
|
* @param[in] CoreL1RamObj Pointer to Core Local L1 memory pool object
|
||||||
|
* @param[out] L3RamUsage Net L3 RAM memory usage in bytes as a result of allocation
|
||||||
|
* by the DPUs.
|
||||||
|
* @param[out] CoreL2RamUsage Net Local L2 RAM memory usage in bytes
|
||||||
|
* @param[out] CoreL1RamUsage Net Core L1 RAM memory usage in bytes
|
||||||
|
*
|
||||||
|
* @retval
|
||||||
|
* Success - 0
|
||||||
|
* @retval
|
||||||
|
* Error - <0
|
||||||
|
*
|
||||||
|
* \ingroup DPC_OBJDET__INTERNAL_FUNCTION
|
||||||
|
*/
|
||||||
|
static int32_t DPC_ObjDetDSP_preStartConfig
|
||||||
|
(
|
||||||
|
SubFrameObj *subFrameObj,
|
||||||
|
DPC_ObjectDetection_PreStartCfg *preStartCfg
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int32_t retVal = 0;
|
||||||
|
DPC_ObjectDetection_DynCfg *dynCfg;
|
||||||
|
DPIF_RadarCube radarCube;
|
||||||
|
DPU_ProcessErrorCodes procErrorCode;
|
||||||
|
|
||||||
|
dynCfg = &preStartCfg->dynCfg;
|
||||||
|
|
||||||
|
/* Save configs to object. We need to pass this stored config (instead of
|
||||||
|
the input arguments to this function which will be in stack) to
|
||||||
|
the DPU config functions inside of this function because the DPUs
|
||||||
|
have pointers to dynamic configurations which are later going to be
|
||||||
|
reused during re-configuration (intra sub-frame or inter sub-frame)
|
||||||
|
*/
|
||||||
|
subFrameObj->dynCfg = * dynCfg;
|
||||||
|
|
||||||
|
/* L3 allocations */
|
||||||
|
/* L3 - radar cube */
|
||||||
|
radarCube.dataSize = dynCfg->caponChainCfg.numRangeBins * dynCfg->caponChainCfg.numChirpPerFrame *
|
||||||
|
dynCfg->caponChainCfg.numAntenna * sizeof(cplx16_t);
|
||||||
|
DebugP_log1("ObjDet DPC: DPC_ObjDetDSP_preStartConfig, radarCubeFormat = %d\n", dynCfg->radarCubeFormat);
|
||||||
|
if(preStartCfg->shareMemCfg.shareMemEnable == true)
|
||||||
|
{
|
||||||
|
if((preStartCfg->shareMemCfg.radarCubeMem.addr != NULL) &&
|
||||||
|
(preStartCfg->shareMemCfg.radarCubeMem.size == radarCube.dataSize))
|
||||||
|
{
|
||||||
|
/* Use assigned radar cube address */
|
||||||
|
radarCube.data = preStartCfg->shareMemCfg.radarCubeMem.addr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
retVal = DPC_OBJECTDETECTION_EINVAL__COMMAND;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
#ifdef RADARDEMO_AOARADARCUDE_RNGCHIRPANT
|
||||||
|
if (subFrameObj->dynCfg.radarCubeFormat != DPIF_RADARCUBE_FORMAT_2)
|
||||||
|
{
|
||||||
|
retVal = DPC_OBJECTDETECTION_EINVAL_CUBE;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
retVal = DPC_OBJECTDETECTION_EINVAL_CUBE;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Only supported radar Cube format in this DPC */
|
||||||
|
radarCube.datafmt = DPIF_RADARCUBE_FORMAT_3;
|
||||||
|
subFrameObj->dataIn = radarCube.data;
|
||||||
|
|
||||||
|
subFrameObj->dpuCaponObj = DPU_radarProcess_init(&subFrameObj->dynCfg.caponChainCfg, &procErrorCode);
|
||||||
|
if (procErrorCode > PROCESS_OK)
|
||||||
|
{
|
||||||
|
retVal = DPC_OBJECTDETECTION_EINTERNAL;
|
||||||
|
DebugP_log1("DPC config error %d\n", procErrorCode);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
//printf("DPC configuration done!\n");
|
||||||
|
DebugP_log0("DPC config done\n");
|
||||||
|
/* Report RAM usage */
|
||||||
|
radarOsal_printHeapStats();
|
||||||
|
|
||||||
|
exit:
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* DPC frame start function registered with DPM. This is invoked on reception
|
||||||
|
* of the frame start ISR from the RF front-end. This API is also invoked
|
||||||
|
* when application issues @ref DPC_OBJDET_IOCTL__TRIGGER_FRAME to simulate
|
||||||
|
* a frame trigger (e.g for unit testing purpose).
|
||||||
|
*
|
||||||
|
* @param[in] handle DPM's DPC handle
|
||||||
|
*
|
||||||
|
* \ingroup DPC_OBJDET__INTERNAL_FUNCTION
|
||||||
|
*
|
||||||
|
* @retval
|
||||||
|
* Not applicable
|
||||||
|
*/
|
||||||
|
static void DPC_ObjectDetection_frameStart (DPM_DPCHandle handle)
|
||||||
|
{
|
||||||
|
ObjDetObj *objDetObj = (ObjDetObj *) handle;
|
||||||
|
|
||||||
|
objDetObj->stats->frameStartTimeStamp = Cycleprofiler_getTimeStamp();
|
||||||
|
|
||||||
|
//DebugP_log2("ObjDet DPC: Frame Start, frameIndx = %d, subFrameIndx = %d\n",
|
||||||
|
// objDetObj->stats.frameStartIntCounter, objDetObj->subFrameIndx);
|
||||||
|
|
||||||
|
/* Check if previous frame (sub-frame) processing has completed */
|
||||||
|
DPC_Objdet_Assert(objDetObj->dpmHandle, (objDetObj->interSubFrameProcToken == 0));
|
||||||
|
objDetObj->interSubFrameProcToken++;
|
||||||
|
|
||||||
|
/* Increment interrupt counter for debugging purpose */
|
||||||
|
if (objDetObj->subFrameIndx == 0)
|
||||||
|
{
|
||||||
|
objDetObj->stats->frameStartIntCounter++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* DPC's (DPM registered) start function which is invoked by the
|
||||||
|
* application using DPM_start API.
|
||||||
|
*
|
||||||
|
* @param[in] handle DPM's DPC handle
|
||||||
|
*
|
||||||
|
* \ingroup DPC_OBJDET__INTERNAL_FUNCTION
|
||||||
|
*
|
||||||
|
* @retval
|
||||||
|
* Success - 0
|
||||||
|
* @retval
|
||||||
|
* Error - <0
|
||||||
|
*/
|
||||||
|
static int32_t DPC_ObjectDetection_start (DPM_DPCHandle handle)
|
||||||
|
{
|
||||||
|
ObjDetObj *objDetObj;
|
||||||
|
int32_t retVal = 0;
|
||||||
|
|
||||||
|
objDetObj = (ObjDetObj *) handle;
|
||||||
|
DebugP_assert (objDetObj != NULL);
|
||||||
|
|
||||||
|
objDetObj->stats->frameStartIntCounter = 0;
|
||||||
|
|
||||||
|
/* Start marks consumption of all pre-start configs, reset the flag to check
|
||||||
|
* if pre-starts were issued only after common config was issued for the next
|
||||||
|
* time full configuration happens between stop and start */
|
||||||
|
objDetObj->isCommonCfgReceived = false;
|
||||||
|
|
||||||
|
/* App must issue export of last frame after stop which will switch to sub-frame 0,
|
||||||
|
* so start should always see sub-frame indx of 0, check */
|
||||||
|
DebugP_assert(objDetObj->subFrameIndx == 0);
|
||||||
|
|
||||||
|
if(objDetObj->numSubframes > 1U)
|
||||||
|
{
|
||||||
|
/* Pre-start cfgs for sub-frames may have come in any order, so need
|
||||||
|
* to ensure we reconfig for the current (0) sub-frame before starting */
|
||||||
|
DPC_ObjDetDSP_reconfigSubFrame(objDetObj, objDetObj->subFrameIndx);
|
||||||
|
}
|
||||||
|
DebugP_log0("ObjDet DPC: Start done\n");
|
||||||
|
return(retVal);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* DPC's (DPM registered) stop function which is invoked by the
|
||||||
|
* application using DPM_stop API.
|
||||||
|
*
|
||||||
|
* @param[in] handle DPM's DPC handle
|
||||||
|
*
|
||||||
|
* \ingroup DPC_OBJDET__INTERNAL_FUNCTION
|
||||||
|
*
|
||||||
|
* @retval
|
||||||
|
* Success - 0
|
||||||
|
* @retval
|
||||||
|
* Error - <0
|
||||||
|
*/
|
||||||
|
static int32_t DPC_ObjectDetection_stop (DPM_DPCHandle handle)
|
||||||
|
{
|
||||||
|
ObjDetObj *objDetObj;
|
||||||
|
|
||||||
|
objDetObj = (ObjDetObj *) handle;
|
||||||
|
DebugP_assert (objDetObj != NULL);
|
||||||
|
|
||||||
|
/* We can be here only after complete frame processing is done, which means
|
||||||
|
* processing token must be 0 and subFrameIndx also 0 */
|
||||||
|
DebugP_assert((objDetObj->interSubFrameProcToken == 0) && (objDetObj->subFrameIndx == 0));
|
||||||
|
|
||||||
|
DebugP_log0("ObjDet DPC: Stop done\n");
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* DPC's (DPM registered) execute function which is invoked by the application
|
||||||
|
* in the DPM's execute context when the DPC issues DPM_notifyExecute API from
|
||||||
|
* its registered @ref DPC_ObjectDetection_frameStart API that is invoked every
|
||||||
|
* frame interrupt.
|
||||||
|
*
|
||||||
|
* @param[in] handle DPM's DPC handle
|
||||||
|
* @param[out] ptrResult Pointer to the result
|
||||||
|
*
|
||||||
|
* \ingroup DPC_OBJDET__INTERNAL_FUNCTION
|
||||||
|
*
|
||||||
|
* @retval
|
||||||
|
* Success - 0
|
||||||
|
* @retval
|
||||||
|
* Error - <0
|
||||||
|
*/
|
||||||
|
int32_t DPC_ObjectDetection_execute
|
||||||
|
(
|
||||||
|
DPM_DPCHandle handle,
|
||||||
|
DPM_Buffer* ptrResult
|
||||||
|
)
|
||||||
|
{
|
||||||
|
ObjDetObj *objDetObj;
|
||||||
|
SubFrameObj *subFrmObj;
|
||||||
|
DPC_ObjectDetection_ProcessCallBackCfg *processCallBack;
|
||||||
|
int32_t procErrorCode;
|
||||||
|
|
||||||
|
|
||||||
|
radarProcessOutput *result;
|
||||||
|
int32_t retVal = 0;
|
||||||
|
volatile uint32_t startTime;
|
||||||
|
int32_t i;
|
||||||
|
|
||||||
|
objDetObj = (ObjDetObj *) handle;
|
||||||
|
DebugP_assert (objDetObj != NULL);
|
||||||
|
DebugP_assert (ptrResult != NULL);
|
||||||
|
|
||||||
|
DebugP_log1("ObjDet DPC: Processing sub-frame %d\n", objDetObj->subFrameIndx);
|
||||||
|
|
||||||
|
processCallBack = &objDetObj->processCallBackCfg;
|
||||||
|
|
||||||
|
objDetObj->executeResult->subFrameIdx = objDetObj->subFrameIndx;
|
||||||
|
result = &objDetObj->executeResult->objOut;
|
||||||
|
|
||||||
|
subFrmObj = &objDetObj->subFrameObj[objDetObj->subFrameIndx];
|
||||||
|
|
||||||
|
if (processCallBack->processInterFrameBeginCallBackFxn != NULL)
|
||||||
|
{
|
||||||
|
(*processCallBack->processInterFrameBeginCallBackFxn)(objDetObj->subFrameIndx);
|
||||||
|
}
|
||||||
|
|
||||||
|
//DebugP_log0("ObjDet DPC: Range Proc Output Ready\n");
|
||||||
|
|
||||||
|
startTime = Cycleprofiler_getTimeStamp();
|
||||||
|
DPU_radarProcess_process(subFrmObj->dpuCaponObj, subFrmObj->dataIn, result, &procErrorCode);
|
||||||
|
if (procErrorCode > PROCESS_OK)
|
||||||
|
{
|
||||||
|
retVal = -1;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
DebugP_log0("ObjDet DPC: Frame Proc Done\n");
|
||||||
|
|
||||||
|
objDetObj->stats->interFrameEndTimeStamp = Cycleprofiler_getTimeStamp();
|
||||||
|
memcpy(&(objDetObj->stats->subFrbenchmarkDetails), result->benchmarkOut, sizeof(radarProcessBenchmarkElem));
|
||||||
|
objDetObj->stats->interFrameExecTimeInUsec = (uint32_t)((float)(objDetObj->stats->interFrameEndTimeStamp - objDetObj->stats->frameStartTimeStamp) * _rcpsp((float)DSP_CLOCK_MHZ));
|
||||||
|
objDetObj->stats->activeFrameProcTimeInUsec = (uint32_t)((float)(objDetObj->stats->interFrameEndTimeStamp - startTime) * _rcpsp((float)DSP_CLOCK_MHZ));
|
||||||
|
|
||||||
|
|
||||||
|
/* populate DPM_resultBuf - first pointer and size are for results of the processing */
|
||||||
|
ptrResult->ptrBuffer[0] = (uint8_t *)objDetObj->executeResult;
|
||||||
|
ptrResult->size[0] = sizeof(DPC_ObjectDetection_ExecuteResult);
|
||||||
|
|
||||||
|
ptrResult->ptrBuffer[1] = (uint8_t *)objDetObj->stats;
|
||||||
|
ptrResult->size[1] = sizeof(DPC_ObjectDetection_Stats);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* clear rest of the result */
|
||||||
|
for (i = 2; i < DPM_MAX_BUFFER; i++)
|
||||||
|
{
|
||||||
|
ptrResult->ptrBuffer[i] = NULL;
|
||||||
|
ptrResult->size[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
exit:
|
||||||
|
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* DPC IOCTL commands configuration API which will be invoked by the
|
||||||
|
* application using DPM_ioctl API
|
||||||
|
*
|
||||||
|
* @param[in] handle DPM's DPC handle
|
||||||
|
* @param[in] cmd Capture DPC specific commands
|
||||||
|
* @param[in] arg Command specific arguments
|
||||||
|
* @param[in] argLen Length of the arguments which is also command specific
|
||||||
|
*
|
||||||
|
* \ingroup DPC_OBJDET__INTERNAL_FUNCTION
|
||||||
|
*
|
||||||
|
* @retval
|
||||||
|
* Success - 0
|
||||||
|
* @retval
|
||||||
|
* Error - <0
|
||||||
|
*/
|
||||||
|
static int32_t DPC_ObjectDetection_ioctl
|
||||||
|
(
|
||||||
|
DPM_DPCHandle handle,
|
||||||
|
uint32_t cmd,
|
||||||
|
void* arg,
|
||||||
|
uint32_t argLen
|
||||||
|
)
|
||||||
|
{
|
||||||
|
ObjDetObj *objDetObj;
|
||||||
|
SubFrameObj *subFrmObj;
|
||||||
|
int32_t retVal = 0;
|
||||||
|
|
||||||
|
/* Get the DSS MCB: */
|
||||||
|
objDetObj = (ObjDetObj *) handle;
|
||||||
|
DebugP_assert(objDetObj != NULL);
|
||||||
|
|
||||||
|
|
||||||
|
/* Process the commands. Process non sub-frame specific ones first
|
||||||
|
* so the sub-frame specific ones can share some code. */
|
||||||
|
if((cmd < DPC_OBJDET_IOCTL__STATIC_PRE_START_CFG) || (cmd > DPC_OBJDET_IOCTL__MAX))
|
||||||
|
{
|
||||||
|
retVal = DPM_EINVCMD;
|
||||||
|
}
|
||||||
|
else if (cmd == DPC_OBJDET_IOCTL__TRIGGER_FRAME)
|
||||||
|
{
|
||||||
|
DPC_ObjectDetection_frameStart(handle);
|
||||||
|
}
|
||||||
|
else if (cmd == DPC_OBJDET_IOCTL__STATIC_PRE_START_COMMON_CFG)
|
||||||
|
{
|
||||||
|
objDetObj->numSubframes = *(uint8_t *)arg;
|
||||||
|
objDetObj->isCommonCfgReceived = true;
|
||||||
|
//DebugP_log1("ObjDet DPC: Pre-start Config IOCTL processed common config (numSubframes = %d)\n", objDetObj->numSubframes);
|
||||||
|
}
|
||||||
|
else if (cmd == DPC_OBJDET_IOCTL__DYNAMIC_EXECUTE_RESULT_EXPORTED)
|
||||||
|
{
|
||||||
|
DPC_ObjectDetection_ExecuteResultExportedInfo *inp;
|
||||||
|
|
||||||
|
DebugP_assert(argLen == sizeof(DPC_ObjectDetection_ExecuteResultExportedInfo));
|
||||||
|
|
||||||
|
inp = (DPC_ObjectDetection_ExecuteResultExportedInfo *)arg;
|
||||||
|
|
||||||
|
/* input sub-frame index must match current sub-frame index */
|
||||||
|
DebugP_assert(inp->subFrameIdx == objDetObj->subFrameIndx);
|
||||||
|
|
||||||
|
/* Reconfigure all DPUs resources for next sub-frame as EDMA and scrach buffer
|
||||||
|
* resources overlap across sub-frames */
|
||||||
|
if (objDetObj->numSubframes > 1)
|
||||||
|
{
|
||||||
|
/* Next sub-frame */
|
||||||
|
objDetObj->subFrameIndx++;
|
||||||
|
if (objDetObj->subFrameIndx == objDetObj->numSubframes)
|
||||||
|
{
|
||||||
|
objDetObj->subFrameIndx = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
DPC_ObjDetDSP_reconfigSubFrame(objDetObj, objDetObj->subFrameIndx);
|
||||||
|
}
|
||||||
|
DebugP_log0("ObjDet DPC: received ack from MSS for output data\n");
|
||||||
|
|
||||||
|
/* mark end of processing of the frame/sub-frame by the DPC and the app */
|
||||||
|
objDetObj->interSubFrameProcToken--;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
uint8_t subFrameNum;
|
||||||
|
|
||||||
|
/* First argument is sub-frame number */
|
||||||
|
DebugP_assert(arg != NULL);
|
||||||
|
subFrameNum = *(uint8_t *)arg;
|
||||||
|
subFrmObj = &objDetObj->subFrameObj[subFrameNum];
|
||||||
|
|
||||||
|
switch (cmd)
|
||||||
|
{
|
||||||
|
/* Related to pre-start configuration */
|
||||||
|
case DPC_OBJDET_IOCTL__STATIC_PRE_START_CFG:
|
||||||
|
{
|
||||||
|
DPC_ObjectDetection_PreStartCfg *cfg;
|
||||||
|
|
||||||
|
/* Pre-start common config must be received before pre-start configs
|
||||||
|
* are received. */
|
||||||
|
if (objDetObj->isCommonCfgReceived == false)
|
||||||
|
{
|
||||||
|
//DebugP_log0("ObjDet DPC IOCTL: false isCommonCfgReceived\n");
|
||||||
|
retVal = DPC_OBJECTDETECTION_PRE_START_CONFIG_BEFORE_PRE_START_COMMON_CONFIG;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
DebugP_assert(argLen == sizeof(DPC_ObjectDetection_PreStartCfg));
|
||||||
|
|
||||||
|
cfg = (DPC_ObjectDetection_PreStartCfg*)arg;
|
||||||
|
|
||||||
|
|
||||||
|
//DebugP_log4("ObjDet DPC IOCTL: function called with cfg = 0x%x, subFrmObj = 0x%x, cmd = %d, subFrameNum = %d\n", (uint32_t )arg, (uint32_t )subFrmObj, cmd, *(uint8_t *)arg);
|
||||||
|
retVal = DPC_ObjDetDSP_preStartConfig(subFrmObj,
|
||||||
|
cfg);
|
||||||
|
if (retVal != 0)
|
||||||
|
{
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DebugP_log1("ObjDet DPC: Pre-start Config IOCTL processed (subFrameIndx = %d)\n", subFrameNum);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
/* Error: This is an unsupported command */
|
||||||
|
retVal = DPM_EINVCMD;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
exit:
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* DPC's (DPM registered) initialization function which is invoked by the
|
||||||
|
* application using DPM_init API. Among other things, this API allocates DPC instance
|
||||||
|
* and DPU instances (by calling DPU's init APIs) from the MemoryP osal
|
||||||
|
* heap. If this API returns an error of any type, the heap is not guaranteed
|
||||||
|
* to be in the same state as before calling the API (i.e any allocations
|
||||||
|
* from the heap while executing the API are not guaranteed to be deallocated
|
||||||
|
* in case of error), so any error from this API should be considered fatal and
|
||||||
|
* if the error is of _ENOMEM type, the application will
|
||||||
|
* have to be built again with a bigger heap size to address the problem.
|
||||||
|
*
|
||||||
|
* @param[in] dpmHandle DPM's DPC handle
|
||||||
|
* @param[in] ptrInitCfg Handle to the framework semaphore
|
||||||
|
* @param[out] errCode Error code populated on error
|
||||||
|
*
|
||||||
|
* \ingroup DPC_OBJDET__INTERNAL_FUNCTION
|
||||||
|
*
|
||||||
|
* @retval
|
||||||
|
* Success - 0
|
||||||
|
* @retval
|
||||||
|
* Error - <0
|
||||||
|
*/
|
||||||
|
static DPM_DPCHandle DPC_ObjectDetection_init
|
||||||
|
(
|
||||||
|
DPM_Handle dpmHandle,
|
||||||
|
DPM_InitCfg* ptrInitCfg,
|
||||||
|
int32_t* errCode
|
||||||
|
)
|
||||||
|
{
|
||||||
|
ObjDetObj *objDetObj = NULL;
|
||||||
|
DPC_ObjectDetection_InitParams *dpcInitParams;
|
||||||
|
radarOsal_heapConfig heapconfig[3];
|
||||||
|
|
||||||
|
*errCode = 0;
|
||||||
|
|
||||||
|
//DebugP_log0("DPC: DPC_ObjectDetection_init\n");
|
||||||
|
if ((ptrInitCfg == NULL) || (ptrInitCfg->arg == NULL))
|
||||||
|
{
|
||||||
|
*errCode = DPC_OBJECTDETECTION_EINVAL;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ptrInitCfg->argSize != sizeof(DPC_ObjectDetection_InitParams))
|
||||||
|
{
|
||||||
|
*errCode = DPC_OBJECTDETECTION_EINVAL__INIT_CFG_ARGSIZE;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
dpcInitParams = (DPC_ObjectDetection_InitParams *) ptrInitCfg->arg;
|
||||||
|
|
||||||
|
/*Set up heap and mem osal*/
|
||||||
|
{
|
||||||
|
memset(heapconfig, 0, sizeof(heapconfig));
|
||||||
|
heapconfig[RADARMEMOSAL_HEAPTYPE_DDR_CACHED].heapType = RADARMEMOSAL_HEAPTYPE_DDR_CACHED;
|
||||||
|
heapconfig[RADARMEMOSAL_HEAPTYPE_DDR_CACHED].heapAddr = (int8_t *) dpcInitParams->L3HeapCfg.addr;
|
||||||
|
heapconfig[RADARMEMOSAL_HEAPTYPE_DDR_CACHED].heapSize = dpcInitParams->L3HeapCfg.size;
|
||||||
|
heapconfig[RADARMEMOSAL_HEAPTYPE_DDR_CACHED].scratchAddr= (int8_t *) dpcInitParams->L3ScratchCfg.addr;
|
||||||
|
heapconfig[RADARMEMOSAL_HEAPTYPE_DDR_CACHED].scratchSize= dpcInitParams->L3ScratchCfg.size;
|
||||||
|
|
||||||
|
heapconfig[RADARMEMOSAL_HEAPTYPE_LL2].heapType = RADARMEMOSAL_HEAPTYPE_LL2;
|
||||||
|
heapconfig[RADARMEMOSAL_HEAPTYPE_LL2].heapAddr = (int8_t *) dpcInitParams->CoreL2HeapCfg.addr;
|
||||||
|
heapconfig[RADARMEMOSAL_HEAPTYPE_LL2].heapSize = dpcInitParams->CoreL2HeapCfg.size;
|
||||||
|
heapconfig[RADARMEMOSAL_HEAPTYPE_LL2].scratchAddr = (int8_t *) dpcInitParams->CoreL2ScratchCfg.addr;
|
||||||
|
heapconfig[RADARMEMOSAL_HEAPTYPE_LL2].scratchSize = dpcInitParams->CoreL2ScratchCfg.size;
|
||||||
|
|
||||||
|
heapconfig[RADARMEMOSAL_HEAPTYPE_LL1].heapType = RADARMEMOSAL_HEAPTYPE_LL1;
|
||||||
|
heapconfig[RADARMEMOSAL_HEAPTYPE_LL1].heapAddr = (int8_t *) dpcInitParams->CoreL1HeapCfg.addr;
|
||||||
|
heapconfig[RADARMEMOSAL_HEAPTYPE_LL1].heapSize = dpcInitParams->CoreL1HeapCfg.size;
|
||||||
|
heapconfig[RADARMEMOSAL_HEAPTYPE_LL1].scratchAddr = (int8_t *) dpcInitParams->CoreL1ScratchCfg.addr;
|
||||||
|
heapconfig[RADARMEMOSAL_HEAPTYPE_LL1].scratchSize = dpcInitParams->CoreL1ScratchCfg.size;
|
||||||
|
if(radarOsal_memInit(&heapconfig[0], 3) == RADARMEMOSAL_FAIL)
|
||||||
|
{
|
||||||
|
*errCode = DPC_OBJECTDETECTION_MEMINITERR;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
objDetObj = MemoryP_ctrlAlloc(sizeof(ObjDetObj), 0);
|
||||||
|
|
||||||
|
#ifdef DBG_DPC_OBJDET
|
||||||
|
gObjDetObj = objDetObj;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
System_printf("ObjDet DPC: objDetObj address = (ObjDetObj *) 0x%x\n", (uint32_t) objDetObj);
|
||||||
|
|
||||||
|
if(objDetObj == NULL)
|
||||||
|
{
|
||||||
|
*errCode = DPC_OBJECTDETECTION_ENOMEM;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initialize memory */
|
||||||
|
memset((void *)objDetObj, 0, sizeof(ObjDetObj));
|
||||||
|
|
||||||
|
/* Copy over the DPM configuration: */
|
||||||
|
memcpy ((void*)&objDetObj->dpmInitCfg, (void*)ptrInitCfg, sizeof(DPM_InitCfg));
|
||||||
|
|
||||||
|
objDetObj->dpmHandle = dpmHandle;
|
||||||
|
objDetObj->socHandle = ptrInitCfg->socHandle;
|
||||||
|
|
||||||
|
objDetObj->processCallBackCfg = dpcInitParams->processCallBackCfg;
|
||||||
|
|
||||||
|
objDetObj->executeResult = (DPC_ObjectDetection_ExecuteResult *)radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_DDR_CACHED, 0, sizeof(DPC_ObjectDetection_ExecuteResult), 1);
|
||||||
|
objDetObj->stats = (DPC_ObjectDetection_Stats *)radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_DDR_CACHED, 0, sizeof(DPC_ObjectDetection_Stats), 1);
|
||||||
|
|
||||||
|
*errCode = DPC_ObjDetDSP_initDPU(objDetObj, RL_MAX_SUBFRAMES);
|
||||||
|
//printf ("DPC init done!\n");
|
||||||
|
|
||||||
|
exit:
|
||||||
|
if(*errCode != 0)
|
||||||
|
{
|
||||||
|
if(objDetObj != NULL)
|
||||||
|
{
|
||||||
|
MemoryP_ctrlFree(objDetObj, sizeof(ObjDetObj));
|
||||||
|
objDetObj = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ((DPM_DPCHandle)objDetObj);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* DPC's (DPM registered) de-initialization function which is invoked by the
|
||||||
|
* application using DPM_deinit API.
|
||||||
|
*
|
||||||
|
* @param[in] handle DPM's DPC handle
|
||||||
|
*
|
||||||
|
* \ingroup DPC_OBJDET__INTERNAL_FUNCTION
|
||||||
|
*
|
||||||
|
* @retval
|
||||||
|
* Success - 0
|
||||||
|
* @retval
|
||||||
|
* Error - <0
|
||||||
|
*/
|
||||||
|
static int32_t DPC_ObjectDetection_deinit (DPM_DPCHandle handle)
|
||||||
|
{
|
||||||
|
ObjDetObj *objDetObj = (ObjDetObj *) handle;
|
||||||
|
int32_t retVal = 0;
|
||||||
|
|
||||||
|
if (handle == NULL)
|
||||||
|
{
|
||||||
|
retVal = DPC_OBJECTDETECTION_EINVAL;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
retVal = DPC_ObjDetDSP_deinitDPU(objDetObj, RL_MAX_SUBFRAMES);
|
||||||
|
|
||||||
|
MemoryP_ctrlFree(handle, sizeof(ObjDetObj));
|
||||||
|
|
||||||
|
exit:
|
||||||
|
return (retVal);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
************************* Global Declarations ****************************
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
/** @addtogroup DPC_OBJDET__GLOBAL
|
||||||
|
@{ */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Global used to register Object Detection DPC in DPM
|
||||||
|
*/
|
||||||
|
DPM_ProcChainCfg gDPC_ObjectDetectionCfg =
|
||||||
|
{
|
||||||
|
DPC_ObjectDetection_init, /* Initialization Function: */
|
||||||
|
DPC_ObjectDetection_start, /* Start Function: */
|
||||||
|
DPC_ObjectDetection_execute, /* Execute Function: */
|
||||||
|
DPC_ObjectDetection_ioctl, /* Configuration Function: */
|
||||||
|
DPC_ObjectDetection_stop, /* Stop Function: */
|
||||||
|
DPC_ObjectDetection_deinit, /* Deinitialization Function: */
|
||||||
|
DPC_ObjectDetection_dataInjection, /* Inject Data Function: */
|
||||||
|
NULL, /* Chirp Available Function: */
|
||||||
|
DPC_ObjectDetection_frameStart /* Frame Start Function: */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* @} */
|
||||||
|
|
109
dss/pcount3D_dss.cfg
Normal file
109
dss/pcount3D_dss.cfg
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2011 by Texas Instruments Incorporated.
|
||||||
|
*
|
||||||
|
* All rights reserved. Property of Texas Instruments Incorporated.
|
||||||
|
* Restricted rights to use, duplicate or disclose this code are
|
||||||
|
* granted through contract.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
environment['xdc.cfg.check.fatal'] = 'false';
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
************************** BIOS Modules ****************************
|
||||||
|
********************************************************************/
|
||||||
|
var Defaults = xdc.useModule('xdc.runtime.Defaults');
|
||||||
|
var Error = xdc.useModule('xdc.runtime.Error');
|
||||||
|
var System = xdc.useModule('xdc.runtime.System');
|
||||||
|
var Text = xdc.useModule('xdc.runtime.Text');
|
||||||
|
var Memory = xdc.useModule('xdc.runtime.Memory');
|
||||||
|
var SysStd = xdc.useModule('xdc.runtime.SysStd');
|
||||||
|
|
||||||
|
var BIOS = xdc.useModule('ti.sysbios.BIOS');
|
||||||
|
var HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');
|
||||||
|
var HeapBuf = xdc.useModule('ti.sysbios.heaps.HeapBuf');
|
||||||
|
var Task = xdc.useModule('ti.sysbios.knl.Task');
|
||||||
|
var Idle = xdc.useModule('ti.sysbios.knl.Idle');
|
||||||
|
var SEM = xdc.useModule('ti.sysbios.knl.Semaphore');
|
||||||
|
var Event = xdc.useModule('ti.sysbios.knl.Event');
|
||||||
|
var Hwi = xdc.useModule('ti.sysbios.family.c64p.Hwi');
|
||||||
|
var EventCombiner = xdc.useModule('ti.sysbios.family.c64p.EventCombiner');
|
||||||
|
var Load = xdc.useModule('ti.sysbios.utils.Load');
|
||||||
|
|
||||||
|
System.SupportProxy = SysStd;
|
||||||
|
|
||||||
|
/* Default Heap Creation: Local L2 memory */
|
||||||
|
var heapMemParams = new HeapMem.Params();
|
||||||
|
heapMemParams.size = 11*1024;
|
||||||
|
heapMemParams.sectionName = "systemHeap";
|
||||||
|
Program.global.heap0 = HeapMem.create(heapMemParams);
|
||||||
|
Memory.defaultHeapInstance = Program.global.heap0;
|
||||||
|
/*
|
||||||
|
* Enable Event Groups here and registering of ISR for specific GEM INTC is done
|
||||||
|
* using EventCombiner_dispatchPlug() and Hwi_eventMap() APIs
|
||||||
|
*/
|
||||||
|
EventCombiner.eventGroupHwiNum[0] = 7;
|
||||||
|
EventCombiner.eventGroupHwiNum[1] = 8;
|
||||||
|
EventCombiner.eventGroupHwiNum[2] = 9;
|
||||||
|
EventCombiner.eventGroupHwiNum[3] = 10;
|
||||||
|
|
||||||
|
/* Enable BIOS Task Scheduler */
|
||||||
|
BIOS.taskEnabled = true;
|
||||||
|
|
||||||
|
/* System stack size (used by ISRs and Swis) */
|
||||||
|
Program.stack = 0x800;
|
||||||
|
|
||||||
|
Task.idleTaskStackSize = 800;
|
||||||
|
|
||||||
|
/* do not call update for load - Application will call it at inter-frame boundary */
|
||||||
|
Load.updateInIdle = false;
|
||||||
|
|
||||||
|
/* Install idle function to sleep. Note above
|
||||||
|
Load.updateInIdle is false which allows to sleep in idle.
|
||||||
|
Also, no other book-keeping etc functions should be installed in the idle thread */
|
||||||
|
Idle.addFunc('&Pcount3DDemo_sleep');
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Build a custom BIOS library. The custom library will be smaller than the
|
||||||
|
* pre-built "instrumented" (default) and "non-instrumented" libraries.
|
||||||
|
*
|
||||||
|
* The BIOS.logsEnabled parameter specifies whether the Logging is enabled
|
||||||
|
* within BIOS for this custom build. These logs are used by the RTA and
|
||||||
|
* UIA analysis tools.
|
||||||
|
*
|
||||||
|
* The BIOS.assertsEnabled parameter specifies whether BIOS code will
|
||||||
|
* include Assert() checks. Setting this parameter to 'false' will generate
|
||||||
|
* smaller and faster code, but having asserts enabled is recommended for
|
||||||
|
* early development as the Assert() checks will catch lots of programming
|
||||||
|
* errors (invalid parameters, etc.)
|
||||||
|
*/
|
||||||
|
BIOS.libType = BIOS.LibType_Custom;
|
||||||
|
BIOS.logsEnabled = false;
|
||||||
|
BIOS.assertsEnabled = true;
|
||||||
|
|
||||||
|
/* Make sure libraries are built with 32-bit enum types to be compatible with DSP enum types*/
|
||||||
|
BIOS.includeXdcRuntime = true;
|
||||||
|
BIOS.customCCOpts += " --enum_type=int ";
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* Enabling DebugP Log Support
|
||||||
|
********************************************************************/
|
||||||
|
var Log = xdc.useModule('xdc.runtime.Log');
|
||||||
|
var Main = xdc.useModule('xdc.runtime.Main');
|
||||||
|
var Diags = xdc.useModule('xdc.runtime.Diags');
|
||||||
|
var LoggerBuf = xdc.useModule('xdc.runtime.LoggerBuf');
|
||||||
|
|
||||||
|
/* Configure the Logger Buffer: */
|
||||||
|
var loggerBufParams = new LoggerBuf.Params();
|
||||||
|
loggerBufParams.bufType = LoggerBuf.BufType_CIRCULAR;
|
||||||
|
loggerBufParams.exitFlush = false;
|
||||||
|
loggerBufParams.instance.name = "_logInfo";
|
||||||
|
loggerBufParams.numEntries = 200;
|
||||||
|
|
||||||
|
/* Create the Logger and attach this to the application */
|
||||||
|
MyAppLogger = LoggerBuf.create(loggerBufParams);
|
||||||
|
Main.common$.logger = MyAppLogger;
|
||||||
|
Main.common$.diags_USER1 = Diags.RUNTIME_ON;
|
||||||
|
//Task.common$.diags_USER1 = Diags.RUNTIME_ON;
|
||||||
|
Task.common$.diags_USER1 = Diags.ALWAYS_ON;
|
||||||
|
Task.common$.diags_USER2 = Diags.ALWAYS_ON;
|
||||||
|
|
134
dss/pcount3D_dss.h
Normal file
134
dss/pcount3D_dss.h
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
/**
|
||||||
|
* @file pcount3D_dss.h
|
||||||
|
*
|
||||||
|
* @brief
|
||||||
|
* This is the main header file for the 3D people counting Demo on DSS.
|
||||||
|
*
|
||||||
|
* \par
|
||||||
|
* NOTE:
|
||||||
|
* (C) Copyright 2016 Texas Instruments, Inc.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* Neither the name of Texas Instruments Incorporated nor the names of
|
||||||
|
* its contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#ifndef PCOUNT3D_DSS_H
|
||||||
|
#define PCOUNT3D_DSS_H
|
||||||
|
|
||||||
|
#include <ti/drivers/edma/edma.h>
|
||||||
|
#include <cpy_tbl.h>
|
||||||
|
|
||||||
|
#include <ti/sysbios/knl/Task.h>
|
||||||
|
|
||||||
|
#include <ti/common/mmwave_error.h>
|
||||||
|
#include <ti/drivers/soc/soc.h>
|
||||||
|
#include <ti/drivers/soc/soc.h>
|
||||||
|
#include <ti/drivers/mailbox/mailbox.h>
|
||||||
|
#include <ti/drivers/hwa/hwa.h>
|
||||||
|
#include <ti/drivers/osal/DebugP.h>
|
||||||
|
|
||||||
|
#include <people_counting/68xx_3D_people_counting/src/common/pcount3D_output.h>
|
||||||
|
#include <people_counting/68xx_3D_people_counting/src/common/pcount3D_config.h>
|
||||||
|
#include <common/src/dpu/capon3d/radarProcess.h>
|
||||||
|
#include <common/src/dpu/capon3d/modules/utilities/cycle_measure.h>
|
||||||
|
|
||||||
|
/* This is used to resolve RL_MAX_SUBFRAMES, TODO: wired */
|
||||||
|
#include <ti/control/mmwavelink/mmwavelink.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct Pcount3DDemo_DataPathObj_t
|
||||||
|
{
|
||||||
|
/*! @brief dpm Handle */
|
||||||
|
DPM_Handle radarProcDpmHandle;
|
||||||
|
|
||||||
|
/*! @brief Handle of the EDMA driver. */
|
||||||
|
EDMA_Handle edmaHandle;
|
||||||
|
|
||||||
|
/*! @brief EDMA error Information when there are errors like missing events */
|
||||||
|
EDMA_errorInfo_t EDMA_errorInfo;
|
||||||
|
|
||||||
|
/*! @brief EDMA transfer controller error information. */
|
||||||
|
EDMA_transferControllerErrorInfo_t EDMA_transferControllerErrorInfo;
|
||||||
|
|
||||||
|
/*! @brief Processing Stats */
|
||||||
|
Pcount3DDemo_output_message_stats subFrameStats[RL_MAX_SUBFRAMES];
|
||||||
|
} Pcount3DDemo_DataPathObj;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief
|
||||||
|
* Millimeter Wave Demo MCB
|
||||||
|
*
|
||||||
|
* @details
|
||||||
|
* The structure is used to hold all the relevant information for the
|
||||||
|
* Millimeter Wave demo
|
||||||
|
*/
|
||||||
|
typedef struct Pcount3DDemo_DSS_MCB_t
|
||||||
|
{
|
||||||
|
/*! * @brief Handle to the SOC Module */
|
||||||
|
SOC_Handle socHandle;
|
||||||
|
|
||||||
|
/*! @brief DPM Handle */
|
||||||
|
Task_Handle radarProcDpmTaskHandle;
|
||||||
|
|
||||||
|
/*! @brief init Task Handle */
|
||||||
|
Task_Handle initTaskHandle;
|
||||||
|
|
||||||
|
/*! @brief Data Path object */
|
||||||
|
Pcount3DDemo_DataPathObj dataPathObj;
|
||||||
|
|
||||||
|
/*! @brief Counter which tracks the number of dpm stop events received
|
||||||
|
The event is triggered by DPM_Report_DPC_STOPPED from DPM */
|
||||||
|
uint32_t dpmStopEvents;
|
||||||
|
|
||||||
|
/*! @brief Counter which tracks the number of dpm start events received
|
||||||
|
The event is triggered by DPM_Report_DPC_STARTED from DPM */
|
||||||
|
uint32_t dpmStartEvents;
|
||||||
|
} Pcount3DDemo_DSS_MCB;
|
||||||
|
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
*************************** Extern Definitions ***************************
|
||||||
|
**************************************************************************/
|
||||||
|
extern void Pcount3DDemo_dataPathInit(Pcount3DDemo_DataPathObj *obj);
|
||||||
|
extern void Pcount3DDemo_dataPathOpen(Pcount3DDemo_DataPathObj *obj);
|
||||||
|
extern void Pcount3DDemo_dataPathClose(Pcount3DDemo_DataPathObj *obj);
|
||||||
|
|
||||||
|
/* Sensor Management Module Exported API */
|
||||||
|
extern void _Pcount3DDemo_debugAssert(int32_t expression, const char *file, int32_t line);
|
||||||
|
#define Pcount3DDemo_debugAssert(expression) { \
|
||||||
|
DebugP_assert(expression); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* PCOUNT3D_DSS_H */
|
||||||
|
|
169
dss/pcount3D_dss_linker.cmd
Normal file
169
dss/pcount3D_dss_linker.cmd
Normal file
@ -0,0 +1,169 @@
|
|||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
/* Linker Settings */
|
||||||
|
--retain="*(.intvecs)"
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
/* Include Libraries */
|
||||||
|
-llibdpm_xwr68xx.ae674
|
||||||
|
-llibmailbox_xwr68xx.ae674
|
||||||
|
-llibsoc_xwr68xx.ae674
|
||||||
|
-llibosal_xwr68xx.ae674
|
||||||
|
-ldsplib.ae674
|
||||||
|
//-opcount3D_dss_pe674.oe674
|
||||||
|
/* Section Configuration */
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
systemHeap : {} >> L2SRAM_UMAP0 | L2SRAM_UMAP1
|
||||||
|
//.l3ram: {} >> L3SRAM
|
||||||
|
.dpc_l1Heap : { } > L1DSRAM
|
||||||
|
.dpc_l2Heap: { } >> L2SRAM_UMAP0 | L2SRAM_UMAP1
|
||||||
|
.ovly > L2SRAM_UMAP0 | L2SRAM_UMAP1
|
||||||
|
|
||||||
|
/* L3SRAM has code that is overlaid with data, so data must be
|
||||||
|
marked uninitialized. Application can initialize this section
|
||||||
|
using _L3data_* symbols defined below. Code should be written carefully as
|
||||||
|
these are linker symbols (see for example http://e2e.ti.com/support/development_tools/compiler/f/343/t/92002 ):
|
||||||
|
|
||||||
|
extern far uint8_t _L3data_start; // the type here does not matter
|
||||||
|
extern far uint8_t _L3data_size; // the type here does not matter
|
||||||
|
|
||||||
|
memset((void *)_symval(&_L3data_start), 0, (uint32_t) _symval(&_L3data_size));
|
||||||
|
*/
|
||||||
|
.l3data: type=NOINIT, start(_L3data_start), size(_L3data_size), load=L3SRAM PAGE 1
|
||||||
|
|
||||||
|
.fastCode:
|
||||||
|
{
|
||||||
|
RADARDEMO_detectionCFAR_priv.oe674 (.text:RADARDEMO_detectionCFAR_raCAAll)
|
||||||
|
RADARDEMO_aoaEst2DCaponBF_heatmapEst.oe674 (.text:RADARDEMO_aoaEst2DCaponBF_raHeatmap)
|
||||||
|
RADARDEMO_aoaEst2DCaponBF_rnEstInv.oe674 (.text:RADARDEMO_aoaEst2DCaponBF_covInv)
|
||||||
|
MATRIX_cholesky.oe674 (.text:MATRIX_cholesky_flp_inv)
|
||||||
|
RADARDEMO_aoaEst2DCaponBF_staticRemoval.oe674 (.text:RADARDEMO_aoaEst2DCaponBF_clutterRemoval)
|
||||||
|
copyTranspose.oe674 (.text:copyTranspose)
|
||||||
|
//dsplib.ae674<*.obj>(.text)
|
||||||
|
} load=L3SRAM PAGE 0 , run=L1PSRAM PAGE 0, table(_pcount3DDemo_fastCode_L1PSRAM_copy_table, compression=off)
|
||||||
|
|
||||||
|
|
||||||
|
.hsramCode:
|
||||||
|
{
|
||||||
|
libdpm_xwr68xx.ae674 (.text:DPM_deinit)
|
||||||
|
libmailbox_xwr68xx.ae674 (.text:Mailbox_close)
|
||||||
|
libdpm_xwr68xx.ae674 (.text:DPM_pipeDeinit)
|
||||||
|
dss_main.oe674 (.text:Pcount3DDemo_sensorStopEpilog)
|
||||||
|
|
||||||
|
rts*.lib (.text:_outc)
|
||||||
|
rts*.lib (.text:_outs)
|
||||||
|
rts*.lib (.text:printf)
|
||||||
|
rts*.lib (.text:_ltostr)
|
||||||
|
rts*.lib (.text:__c6xabi_isnan)
|
||||||
|
rts*.lib (.text:_ecpy)
|
||||||
|
rts*.lib (.text:_mcpy)
|
||||||
|
rts*.lib (.text:_pconv_g)
|
||||||
|
rts*.lib (.text:fcvt)
|
||||||
|
rts*.lib (.text:_pconv_f)
|
||||||
|
rts*.lib (.text:_pconv_e)
|
||||||
|
rts*.lib (.text:_pconv_a)
|
||||||
|
rts*.lib (.text:__TI_printfi)
|
||||||
|
rts*.lib (.text:fputs)
|
||||||
|
rts*.lib (.text:fputc)
|
||||||
|
rts*.lib (.text:__c6xabi_divul)
|
||||||
|
rts*.lib (.text:__c6xabi_divd)
|
||||||
|
rts*.lib (.text:frexp)
|
||||||
|
rts*.lib (.text:ldexp)
|
||||||
|
|
||||||
|
} load=L3SRAM PAGE 0, run=HSRAM PAGE 0, table(_pcount3DDemo_configCode_HSRAM_copy_table, compression=off)
|
||||||
|
|
||||||
|
.overlaidCode:
|
||||||
|
{
|
||||||
|
RADARDEMO_aoaEst2DCaponBF.oe674 (.text:RADARDEMO_aoaEst2DCaponBF_create)
|
||||||
|
RADARDEMO_detectionCFAR.oe674 (.text:RADARDEMO_detectionCFAR_create)
|
||||||
|
RADARDEMO_aoaEst2DCaponBF_utils.oe674 (.text:tw_gen_float)
|
||||||
|
radarProcess.oe674 (.text:DPU_radarProcess_init)
|
||||||
|
objectdetection.oe674 (.text:DPC_ObjectDetection_deinit)
|
||||||
|
radarOsal_malloc.oe674 (.text:radarOsal_memAlloc)
|
||||||
|
radarOsal_malloc.oe674 (.text:radarOsal_memInit)
|
||||||
|
radarOsal_malloc.oe674 (.text:radarOsal_memDeInit)
|
||||||
|
radarOsal_malloc.oe674 (.text:radarOsal_printHeapStats)
|
||||||
|
objectdetection.oe674 (.text:DPC_ObjectDetection_init)
|
||||||
|
RADARDEMO_aoaEst2DCaponBF_utils.oe674 (.text:cosdp_i)
|
||||||
|
|
||||||
|
|
||||||
|
RADARDEMO_aoaEst2DCaponBF_angleEst.oe674 (.text:RADARDEMO_aoaEst2DCaponBF_aeEstElevAzim)
|
||||||
|
libedma_xwr68xx.ae674<*.oe674>(.text)
|
||||||
|
dss_main.oe674 (.text:MmwDemo_edmaOpen)
|
||||||
|
dss_main.oe674 (.text:MmwDemo_edmaInit)
|
||||||
|
dss_main.oe674 (.text:MmwDemo_edmaBlockCopy)
|
||||||
|
dss_main.oe674 (.text:MmwDemo_copyTable)
|
||||||
|
cycle_measure.oe674 (.text:cache_setMar)
|
||||||
|
dss_main.oe674 (.text:MmwDemo_EDMA_errorCallbackFxn)
|
||||||
|
dss_main.oe674 (.text:MmwDemo_EDMA_transferControllerErrorCallbackFxn)
|
||||||
|
|
||||||
|
libedma_xwr68xx.ae674 (.far:EDMA_object)
|
||||||
|
|
||||||
|
dss_main.oe674 (.text:main)
|
||||||
|
dss_main.oe674 (.text:Pcount3DDemo_dssInitTask)
|
||||||
|
} load=L3SRAM PAGE 0
|
||||||
|
|
||||||
|
.unUsedCode:
|
||||||
|
{
|
||||||
|
RADARDEMO_detectionCFAR_priv.oe674 (.text:RADARDEMO_detectionCFAR_CAAll)
|
||||||
|
RADARDEMO_detectionCFAR_priv.oe674 (.text:RADARDEMO_detectionCFAR_OS)
|
||||||
|
} load=L3SRAM PAGE 0
|
||||||
|
|
||||||
|
.slowCode:
|
||||||
|
{
|
||||||
|
libmailbox_xwr68xx.ae674 (.text:Mailbox_init)
|
||||||
|
libdpm_xwr68xx.ae674 (.text:DPM_init)
|
||||||
|
libmailbox_xwr68xx.ae674 (.text:Mailbox_open)
|
||||||
|
libsoc_xwr68xx.ae674 (.text:SOC_deviceInit)
|
||||||
|
libdpm_xwr68xx.ae674 (.text:DPM_mboxInit)
|
||||||
|
libosal_xwr68xx.ae674 (.text:SemaphoreP_create)
|
||||||
|
libdpm_xwr68xx.ae674 (.text:DPM_pipeInit)
|
||||||
|
libsoc_xwr68xx.ae674 (.text:SOC_init)
|
||||||
|
|
||||||
|
objectdetection.oe674 (.text:DPC_ObjDetDSP_preStartConfig)
|
||||||
|
|
||||||
|
//pcount3D_dss_pe674.oe674 (.text:xdc_runtime_System_printfExtend__I)
|
||||||
|
|
||||||
|
//rts*.lib (.text:__TI_tls_init) //not copied to HSRAM, but moved to L3
|
||||||
|
rts*.lib (.text:__c6xabi_divf)
|
||||||
|
rts*.lib (.text:setvbuf)
|
||||||
|
rts*.lib (.text:HOSTrename)
|
||||||
|
rts*.lib (.text:getdevice)
|
||||||
|
rts*.lib (.text:__TI_closefile)
|
||||||
|
rts*.lib (.text:atoi)
|
||||||
|
rts*.lib (.text:fflush)
|
||||||
|
rts*.lib (.text:fseek)
|
||||||
|
rts*.lib (.text:HOSTlseek)
|
||||||
|
rts*.lib (.text:HOSTopen)
|
||||||
|
rts*.lib (.text:HOSTwrite)
|
||||||
|
rts*.lib (.text:__TI_ltoa)
|
||||||
|
rts*.lib (.text:__TI_wrt_ok)
|
||||||
|
rts*.lib (.text:close)
|
||||||
|
rts*.lib (.text:HOSTread)
|
||||||
|
rts*.lib (.text:HOSTunlink)
|
||||||
|
rts*.lib (.text:__TI_doflush)
|
||||||
|
rts*.lib (.text:__divu)
|
||||||
|
rts*.lib (.text:modf)
|
||||||
|
rts*.lib (.text:HOSTclose)
|
||||||
|
|
||||||
|
rts*.lib (.text:__TI_cleanup)
|
||||||
|
rts*.lib (.text:__c6xabi_fixfu)
|
||||||
|
rts*.lib (.text:__remu)
|
||||||
|
rts*.lib (.text:finddevice)
|
||||||
|
rts*.lib (.text:__TI_readmsg)
|
||||||
|
rts*.lib (.text:__c6xabi_fixdu)
|
||||||
|
rts*.lib (.text:__c6xabi_llshl)
|
||||||
|
rts*.lib (.text:unlink)
|
||||||
|
rts*.lib (.text:__TI_writemsg)
|
||||||
|
rts*.lib (.text:__c6xabi_llshru)
|
||||||
|
rts*.lib (.text:_subcull)
|
||||||
|
rts*.lib (.text:lseek)
|
||||||
|
rts*.lib (.text:write)
|
||||||
|
rts*.lib (.text:__TI_frcmpyd_div)
|
||||||
|
rts*.lib (.text:__c6xabi_isinf)
|
||||||
|
rts*.lib (.text:wcslen)
|
||||||
|
} load=L3SRAM PAGE 0 (HIGH)
|
||||||
|
|
||||||
|
}
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
679
dss/radarProcess.c
Normal file
679
dss/radarProcess.c
Normal file
@ -0,0 +1,679 @@
|
|||||||
|
/*!
|
||||||
|
* \file radarProcess.c
|
||||||
|
*
|
||||||
|
* \brief radar signal processing chain.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
*
|
||||||
|
* Neither the name of Texas Instruments Incorporated nor the names of
|
||||||
|
* its contributors may be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common/src/dpu/capon3d/include/radarProcess_internal.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <common/src/dpu/capon3d/modules/utilities/cycle_measure.h>
|
||||||
|
#include <common/src/dpu/capon3d/modules/utilities/radarOsal_malloc.h>
|
||||||
|
#include <common/src/dpu/capon3d/modules/utilities/radar_c674x.h>
|
||||||
|
|
||||||
|
#if (defined SOC_XWR16XX) || (defined SOC_XWR68XX)
|
||||||
|
#include <xdc/runtime/System.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ONEOVERFACTORIAL3 (1.f/6.f)
|
||||||
|
#define ONEOVERFACTORIAL5 (1.f/230.f)
|
||||||
|
#define ONEOVERFACTORIAL7 (1.f/5040.f)
|
||||||
|
#define MAXANT (12)
|
||||||
|
#define MAXWIN1DSize (128)
|
||||||
|
//user input configuration parameters
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
*************************** External API Functions ************************
|
||||||
|
**************************************************************************/
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* The function is radarProcess DPU init function. It allocates memory to store
|
||||||
|
* its internal data object and returns a handle if it executes successfully.
|
||||||
|
*
|
||||||
|
* @param[in] initParams radarProcess initialization parameters.
|
||||||
|
* @param[in] errCode Pointer to errCode generates from the API
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @retval
|
||||||
|
* Success - valid radarProcess handle
|
||||||
|
* @retval
|
||||||
|
* Error - NULL
|
||||||
|
*/
|
||||||
|
DPU_radarProcess_Handle DPU_radarProcess_init
|
||||||
|
(
|
||||||
|
DPU_radarProcessConfig_t * initParams,
|
||||||
|
DPU_ProcessErrorCodes * errCode
|
||||||
|
)
|
||||||
|
{
|
||||||
|
radarProcessInstance_t * inst;
|
||||||
|
int32_t i;
|
||||||
|
int32_t itemp, perRngbinHeatmapLen;
|
||||||
|
DPU_ProcessErrorCodes errorCode = PROCESS_OK;
|
||||||
|
|
||||||
|
inst = (radarProcessInstance_t *)radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL1, 0, sizeof(radarProcessInstance_t), 8);
|
||||||
|
|
||||||
|
itemp = initParams->numChirpPerFrame;
|
||||||
|
if ((1 << (30 - _norm(itemp))) == itemp)
|
||||||
|
inst->DopplerFFTSize = itemp;
|
||||||
|
else
|
||||||
|
inst->DopplerFFTSize = 1 << (31 - _norm(itemp));
|
||||||
|
|
||||||
|
inst->dopplerOversampleFactor = 1;
|
||||||
|
inst->scaleDopCfarOutCFAR = 1;
|
||||||
|
inst->nRxAnt = initParams->numAntenna;
|
||||||
|
inst->numChirpsPerFrame = initParams->numChirpPerFrame;
|
||||||
|
|
||||||
|
|
||||||
|
itemp = initParams->numAdcSamplePerChirp;
|
||||||
|
if ((1 << (30 - _norm(itemp))) == itemp)
|
||||||
|
inst->numRangeBins = itemp;
|
||||||
|
else
|
||||||
|
inst->numRangeBins = 1 << (31 - _norm(itemp));
|
||||||
|
initParams->numRangeBins = inst->numRangeBins;
|
||||||
|
|
||||||
|
//update the interbin resolution for range and Doppler
|
||||||
|
initParams->dynamicCfarConfig.rangeRes = divsp_i(initParams->dynamicCfarConfig.rangeRes * (float)initParams->numAdcSamplePerChirp, (float)inst->numRangeBins);
|
||||||
|
inst->rangeRes = initParams->dynamicCfarConfig.rangeRes;
|
||||||
|
initParams->dynamicCfarConfig.dopplerRes= divsp_i(initParams->dynamicCfarConfig.dopplerRes * (float)initParams->numChirpPerFrame, (float)inst->DopplerFFTSize);
|
||||||
|
inst->dopplerRes = initParams->dynamicCfarConfig.dopplerRes;
|
||||||
|
|
||||||
|
|
||||||
|
/* rearrange phase compensation coeff from OOB to be able to use in 2D capon chain */
|
||||||
|
{
|
||||||
|
cplxf_t * tempCmpVec;
|
||||||
|
float tempRe, tempIm, tempP, invsqrt, errorLimit;
|
||||||
|
int32_t compFlag;
|
||||||
|
|
||||||
|
tempCmpVec = (cplxf_t *)&(initParams->doaConfig.phaseCompVect[0]);
|
||||||
|
//check whether we need to compensate
|
||||||
|
compFlag = 0;
|
||||||
|
errorLimit = 0.0001f;
|
||||||
|
for (i = 0; i < initParams->numAntenna; i++)
|
||||||
|
{
|
||||||
|
if (((_fabs(tempCmpVec[i].real) - 1.f) > errorLimit) || (_fabs(tempCmpVec[i].imag) > errorLimit))
|
||||||
|
compFlag = 1;
|
||||||
|
}
|
||||||
|
if (compFlag)
|
||||||
|
{
|
||||||
|
for (i = 0; i < initParams->numAntenna; i++)
|
||||||
|
{
|
||||||
|
tempRe = tempCmpVec[i].real;
|
||||||
|
tempIm = tempCmpVec[i].imag;
|
||||||
|
tempP = tempRe * tempRe + tempIm * tempIm;
|
||||||
|
invsqrt = _rsqrsp(tempP);
|
||||||
|
invsqrt = invsqrt * (1.5f - 0.5f * tempP * invsqrt * invsqrt);
|
||||||
|
invsqrt = invsqrt * (1.5f - 0.5f * tempP * invsqrt * invsqrt);
|
||||||
|
tempCmpVec[i].real = tempRe * invsqrt * (float)(initParams->doaConfig.phaseRot[i]);
|
||||||
|
tempCmpVec[i].imag = -tempIm * invsqrt * (float)(initParams->doaConfig.phaseRot[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inst->perRangeBinMax = (float *)radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL1, 0, inst->numRangeBins * sizeof(float), 8);
|
||||||
|
/* 2D Capon DoA init and config */
|
||||||
|
{
|
||||||
|
int32_t heatmapSize, maxNumAngleEst;
|
||||||
|
|
||||||
|
initParams->doaConfig.numInputRangeBins = inst->numRangeBins;
|
||||||
|
initParams->doaConfig.numInputChirps = initParams->numChirpPerFrame;
|
||||||
|
initParams->doaConfig.dopperFFTSize = inst->DopplerFFTSize;
|
||||||
|
initParams->doaConfig.nRxAnt = inst->nRxAnt;
|
||||||
|
|
||||||
|
inst->aoaInstance = (void *) RADARDEMO_aoaEst2DCaponBF_create(&initParams->doaConfig, &inst->aoaBFErrorCode);
|
||||||
|
if (inst->aoaBFErrorCode > RADARDEMO_AOACAPONBF_NO_ERROR)
|
||||||
|
{
|
||||||
|
errorCode = PROCESS_ERROR_DOAPROC_INIT_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
inst->numDynAngleBin = initParams->doaConfig.numRAangleBin;
|
||||||
|
inst->aoaInput = (RADARDEMO_aoaEst2DCaponBF_input *)radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL1, 0, sizeof(RADARDEMO_aoaEst2DCaponBF_input), 1);
|
||||||
|
inst->aoaOutput = (RADARDEMO_aoaEst2DCaponBF_output *)radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL1, 0, sizeof(RADARDEMO_aoaEst2DCaponBF_output), 1);
|
||||||
|
|
||||||
|
heatmapSize = (int32_t)ceil(divsp_i ((float)initParams->doaConfig.numAzimBins, (float)initParams->doaConfig.staticEstCfg.staticAzimStepDeciFactor))
|
||||||
|
* (int32_t)ceil(divsp_i ((float)initParams->doaConfig.numElevBins, (float)initParams->doaConfig.staticEstCfg.staticElevStepDeciFactor))
|
||||||
|
* initParams->doaConfig.numInputRangeBins;
|
||||||
|
if (heatmapSize < initParams->doaConfig.numRAangleBin * initParams->doaConfig.numInputRangeBins)
|
||||||
|
heatmapSize = initParams->doaConfig.numRAangleBin * initParams->doaConfig.numInputRangeBins;
|
||||||
|
if ( heatmapSize < initParams->doaConfig.numAzimBins * initParams->doaConfig.numElevBins)
|
||||||
|
heatmapSize = initParams->doaConfig.numAzimBins * initParams->doaConfig.numElevBins;
|
||||||
|
inst->localHeatmap = (float *)radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_DDR_CACHED, 0, heatmapSize *sizeof(float), 8);
|
||||||
|
initParams->heatMapMemSize = heatmapSize;
|
||||||
|
inst->heatMapMemSize = heatmapSize;
|
||||||
|
|
||||||
|
if (initParams->doaConfig.rangeAngleCfg.detectionMethod <= 1)
|
||||||
|
maxNumAngleEst = initParams->doaConfig.angle2DEst.azimElevAngleEstCfg.maxNpeak2Search * (initParams->doaConfig.angle2DEst.azimElevAngleEstCfg.peakExpSamples * 2 + 1) * (initParams->doaConfig.angle2DEst.azimElevAngleEstCfg.peakExpSamples * 2 + 1);
|
||||||
|
else
|
||||||
|
maxNumAngleEst = (initParams->doaConfig.angle2DEst.azimElevZoominCfg.peakExpSamples * 2 + 1) * (initParams->doaConfig.angle2DEst.azimElevZoominCfg.peakExpSamples * 2 + 1);
|
||||||
|
|
||||||
|
inst->aoaOutput->azimEst = (float *)radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL1, 0, maxNumAngleEst * sizeof(float), 1);
|
||||||
|
inst->aoaOutput->elevEst = (float *)radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL1, 0, maxNumAngleEst * sizeof(float), 1);
|
||||||
|
inst->aoaOutput->peakPow = (float *)radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL1, 0, maxNumAngleEst * sizeof(float), 1);
|
||||||
|
inst->aoaOutput->bwFilter = (cplxf_t *)radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL1, 0, maxNumAngleEst * initParams->doaConfig.nRxAnt * sizeof(cplxf_t), 8);
|
||||||
|
//inst->aoaOutput->malValPerRngBin = (float *)radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL2, 0, initParams->doaConfig.numInputRangeBins * sizeof(float), 1);
|
||||||
|
inst->aoaOutput->static_information = (cplxf_t *)radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_DDR_CACHED, 0, initParams->doaConfig.numInputRangeBins * initParams->doaConfig.nRxAnt * sizeof(cplxf_t), 8);
|
||||||
|
inst->aoaOutput->malValPerRngBin = inst->perRangeBinMax;
|
||||||
|
|
||||||
|
inst->aoaOutput->invRnMatrices = (cplxf_t *)radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL2, 0, initParams->doaConfig.numInputRangeBins * (initParams->doaConfig.nRxAnt >> 1) * (initParams->doaConfig.nRxAnt + 1) * sizeof(cplxf_t), 8);
|
||||||
|
if (initParams->doaConfig.rangeAngleCfg.dopplerEstMethod == 1)
|
||||||
|
{
|
||||||
|
inst->aoaOutput->dopplerIdx = (uint16_t *)radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL1, 0, maxNumAngleEst * MAX_DOPCFAR_DET * sizeof(uint16_t), 1);
|
||||||
|
inst->aoaOutput->dopplerDetSNR = (float *)radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL1, 0, maxNumAngleEst * MAX_DOPCFAR_DET * sizeof(float), 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
inst->aoaOutput->dopplerIdx = (uint16_t *)radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL1, 0, maxNumAngleEst * sizeof(uint16_t), 1);
|
||||||
|
}
|
||||||
|
#ifdef CAPON2DMODULEDEBUG
|
||||||
|
inst->aoaOutput->cyclesLog = (RADARDEMO_aoaEst2DCaponBF_moduleCycles *)radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_DDR_CACHED, 0, sizeof(RADARDEMO_aoaEst2DCaponBF_moduleCycles), 8);
|
||||||
|
memset(inst->aoaOutput->cyclesLog, 0, sizeof(RADARDEMO_aoaEst2DCaponBF_moduleCycles));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ((inst->aoaOutput == NULL) || (inst->aoaInput == NULL))
|
||||||
|
{
|
||||||
|
errorCode = PROCESS_ERROR_DOAPROC_INOUTALLOC_FAILED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* dynamic Detection CFAR init and config */
|
||||||
|
{
|
||||||
|
inst->cfarRangeSkipLeft = initParams->dynamicCfarConfig.leftSkipSize;
|
||||||
|
inst->cfarRangeSkipRight = initParams->dynamicCfarConfig.rightSkipSize;
|
||||||
|
initParams->dynamicCfarConfig.fft2DSize = initParams->doaConfig.numRAangleBin;
|
||||||
|
initParams->dynamicCfarConfig.fft1DSize = inst->numRangeBins;
|
||||||
|
initParams->dynamicCfarConfig.maxNumDetObj = MAX_DYNAMIC_CFAR_PNTS;
|
||||||
|
initParams->dynamicCfarConfig.angleDim1 = initParams->doaConfig.numAzimBins; // not used, hardcoded to 0
|
||||||
|
initParams->dynamicCfarConfig.angleDim2 = initParams->doaConfig.numElevBins; // not used, hardcoded to 0
|
||||||
|
|
||||||
|
inst->dynamicCFARInstance = (void *) RADARDEMO_detectionCFAR_create(&initParams->dynamicCfarConfig, &inst->cfarErrorCode);
|
||||||
|
if (inst->cfarErrorCode > RADARDEMO_DETECTIONCFAR_NO_ERROR)
|
||||||
|
{
|
||||||
|
errorCode = PROCESS_ERROR_CFARPROC_INIT_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
inst->maxNumDetObj = initParams->maxNumDetObj;
|
||||||
|
inst->detectionCFAROutput = (RADARDEMO_detectionCFAR_output *) radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL1, 0, sizeof(RADARDEMO_detectionCFAR_output), 1);
|
||||||
|
inst->detectionCFAROutput->rangeInd = (uint16_t *) radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL1, 0, initParams->dynamicCfarConfig.maxNumDetObj * sizeof(uint16_t), 1);
|
||||||
|
inst->detectionCFAROutput->dopplerInd = (uint16_t *) radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL1, 0, initParams->dynamicCfarConfig.maxNumDetObj * sizeof(uint16_t), 1);
|
||||||
|
inst->detectionCFAROutput->snrEst = (float *) radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL1, 0, initParams->dynamicCfarConfig.maxNumDetObj * sizeof(float), 1);
|
||||||
|
inst->detectionCFAROutput->noise = (float *) radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL1, 0, initParams->dynamicCfarConfig.maxNumDetObj * sizeof(float), 1);
|
||||||
|
|
||||||
|
inst->detectionCFARInput = (RADARDEMO_detectionCFAR_input *) radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL1, 0, sizeof(RADARDEMO_detectionCFAR_input), 1);
|
||||||
|
inst->dynamicHeatmapPtr = (float **) radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL2, 0, initParams->dynamicCfarConfig.fft2DSize * sizeof(float *), 1);
|
||||||
|
inst->dynamicSideLobeThr = initParams->dynamicSideLobeThr;
|
||||||
|
inst->dynamicSideLobeThr = initParams->dynamicSideLobeThr;
|
||||||
|
for (i = 0; i < (int32_t)initParams->dynamicCfarConfig.fft2DSize; i++ )
|
||||||
|
{
|
||||||
|
inst->dynamicHeatmapPtr[i] = (float *) &inst->localHeatmap[i * initParams->dynamicCfarConfig.fft1DSize];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( (inst->detectionCFAROutput == NULL)
|
||||||
|
|| (inst->detectionCFAROutput->rangeInd == NULL)
|
||||||
|
|| (inst->detectionCFAROutput->dopplerInd == NULL)
|
||||||
|
|| (inst->detectionCFAROutput->snrEst == NULL)
|
||||||
|
|| (inst->detectionCFAROutput->noise == NULL))
|
||||||
|
{
|
||||||
|
errorCode = PROCESS_ERROR_CFARPROC_INOUTALLOC_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
inst->staticProcEnabled = initParams->doaConfig.staticEstCfg.staticProcEnabled;
|
||||||
|
perRngbinHeatmapLen = inst->numDynAngleBin;
|
||||||
|
/* static Detection CFAR init and config */
|
||||||
|
if (inst->staticProcEnabled)
|
||||||
|
{
|
||||||
|
|
||||||
|
inst->numStaticAngleBin = (int32_t)(ceil(divsp_i ((float)initParams->doaConfig.numAzimBins, (float)initParams->doaConfig.staticEstCfg.staticAzimStepDeciFactor))
|
||||||
|
* ceil(divsp_i ((float)initParams->doaConfig.numElevBins, (float)initParams->doaConfig.staticEstCfg.staticElevStepDeciFactor)));
|
||||||
|
|
||||||
|
perRngbinHeatmapLen = inst->numStaticAngleBin;
|
||||||
|
if ( perRngbinHeatmapLen < inst->numStaticAngleBin )
|
||||||
|
perRngbinHeatmapLen = inst->numStaticAngleBin;
|
||||||
|
|
||||||
|
initParams->staticCfarConfig.fft2DSize = inst->numStaticAngleBin;
|
||||||
|
initParams->staticCfarConfig.fft1DSize = inst->numRangeBins;
|
||||||
|
initParams->staticCfarConfig.maxNumDetObj = MAX_STATIC_CFAR_PNTS;
|
||||||
|
initParams->staticCfarConfig.angleDim2 = (uint32_t)ceil(divsp_i ((float)initParams->doaConfig.numAzimBins, (float)initParams->doaConfig.staticEstCfg.staticAzimStepDeciFactor));
|
||||||
|
initParams->staticCfarConfig.angleDim1 = (uint32_t)ceil(divsp_i ((float)initParams->doaConfig.numElevBins, (float)initParams->doaConfig.staticEstCfg.staticElevStepDeciFactor));
|
||||||
|
initParams->staticCfarConfig.leftSkipSize = inst->cfarRangeSkipLeft; //set the skip range bins the same as the dynamic scene
|
||||||
|
initParams->staticCfarConfig.rightSkipSize = inst->cfarRangeSkipRight; //set the skip range bins the same as the dynamic scene
|
||||||
|
|
||||||
|
inst->staticCFARInstance = (void *) RADARDEMO_detectionCFAR_create(&initParams->staticCfarConfig, &inst->cfarErrorCode);
|
||||||
|
if (inst->cfarErrorCode > RADARDEMO_DETECTIONCFAR_NO_ERROR)
|
||||||
|
{
|
||||||
|
errorCode = PROCESS_ERROR_CFARPROC_INIT_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
inst->staticSideLobeThr = initParams->staticSideLobeThr;
|
||||||
|
inst->staticHeatmapPtr = (float **) radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL1, 0, initParams->dynamicCfarConfig.fft2DSize * sizeof(float *), 1);
|
||||||
|
for (i = 0; i < (int32_t)initParams->staticCfarConfig.fft2DSize; i++ )
|
||||||
|
{
|
||||||
|
inst->staticHeatmapPtr[i] = (float *) &inst->localHeatmap[i * initParams->staticCfarConfig.fft1DSize];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
inst->tempHeatMapOut = (float *) radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL2, 0, perRngbinHeatmapLen * sizeof(float), 8);
|
||||||
|
|
||||||
|
inst->framePeriod = initParams->framePeriod;
|
||||||
|
|
||||||
|
inst->mimoModeFlag = (uint8_t)initParams->mimoModeFlag;
|
||||||
|
initParams->heatMapMem = inst->localHeatmap;
|
||||||
|
|
||||||
|
inst->benchmarkPtr = (radarProcessBenchmarkObj *)radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_DDR_CACHED, 0, sizeof(radarProcessBenchmarkObj), 1);
|
||||||
|
inst->benchmarkPtr->bufferLen = 20;
|
||||||
|
inst->benchmarkPtr->bufferIdx = 0;
|
||||||
|
inst->benchmarkPtr->buffer = (radarProcessBenchmarkElem *)radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_DDR_CACHED, 0, inst->benchmarkPtr->bufferLen * sizeof(radarProcessBenchmarkElem), 1);
|
||||||
|
#ifdef CAPON2DMODULEDEBUG
|
||||||
|
inst->benchmarkPtr->aoaCyclesLog = inst->aoaOutput->cyclesLog;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
memset(inst->benchmarkPtr->buffer, 0, inst->benchmarkPtr->bufferLen * sizeof(radarProcessBenchmarkElem));
|
||||||
|
|
||||||
|
if ((inst->localHeatmap == NULL) ||(inst->benchmarkPtr == NULL) || (inst->benchmarkPtr->buffer == NULL))
|
||||||
|
errorCode = PROCESS_ERROR_INIT_MEMALLOC_FAILED;
|
||||||
|
|
||||||
|
|
||||||
|
initParams->benchmarkPtr = inst->benchmarkPtr;
|
||||||
|
|
||||||
|
*errCode = errorCode;
|
||||||
|
|
||||||
|
#ifndef CCS
|
||||||
|
System_printf("DPU_radarProcess_init - process handle: (radarProcessInstance_t *)0x%x\n", (uint32_t)inst);
|
||||||
|
System_printf("DPU_radarProcess_init - dynamic CFAR handle: (RADARDEMO_detectionCFAR_handle *)0x%x\n", (uint32_t)(inst->dynamicCFARInstance));
|
||||||
|
System_printf("DPU_radarProcess_init - staic CFAR handle: (RADARDEMO_detectionCFAR_handle *)0x%x\n", (uint32_t)(inst->staticCFARInstance));
|
||||||
|
System_printf("DPU_radarProcess_init - 2D capon handle: (RADARDEMO_aoaEst2DCaponBF_handle *)0x%x\n", (uint32_t)(inst->aoaInstance));
|
||||||
|
System_printf("DPU_radarProcess_init - benchmark obj: (radarProcessBenchmarkObj *)0x%x\n", (uint32_t)(inst->benchmarkPtr));
|
||||||
|
System_printf("DPU_radarProcess_init - heatmap: (float *)0x%x\n", (uint32_t)(inst->localHeatmap));
|
||||||
|
#else
|
||||||
|
printf("DPU_radarProcess_init - process handle: (radarProcessInstance_t *)0x%x\n", (uint32_t)inst);
|
||||||
|
printf("DPU_radarProcess_init - dynamic CFAR handle: (RADARDEMO_detectionCFAR_handle *)0x%x\n", (uint32_t)(inst->dynamicCFARInstance));
|
||||||
|
printf("DPU_radarProcess_init - staic CFAR handle: (RADARDEMO_detectionCFAR_handle *)0x%x\n", (uint32_t)(inst->staticCFARInstance));
|
||||||
|
printf("DPU_radarProcess_init - 2D capon handle: (RADARDEMO_aoaEst2DCaponBF_handle *)0x%x\n", (uint32_t)(inst->aoaInstance));
|
||||||
|
printf("DPU_radarProcess_init - benchmark obj: (radarProcessBenchmarkObj *)0x%x\n", (uint32_t)(inst->benchmarkPtr));
|
||||||
|
printf("DPU_radarProcess_init - heatmap: (float *)0x%x\n", (uint32_t)(inst->localHeatmap));
|
||||||
|
#endif
|
||||||
|
return (void *) inst;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* The function is radarProcess DPU config function. Currently not used.
|
||||||
|
*
|
||||||
|
* @param[in] handle radarProcess handle.
|
||||||
|
* @param[in] sampleProcCfg radarProcess configurations.
|
||||||
|
* @param[in] errCode Pointer to errCode generates from the API
|
||||||
|
*
|
||||||
|
* \ingroup DPU_SAMPLEPROC_EXTERNAL_FUNCTION
|
||||||
|
*
|
||||||
|
* @retval
|
||||||
|
* Success =0
|
||||||
|
* @retval
|
||||||
|
* Error <0
|
||||||
|
*/
|
||||||
|
|
||||||
|
int32_t DPU_radarProcess_config
|
||||||
|
(
|
||||||
|
DPU_radarProcess_Handle hndle,
|
||||||
|
DPU_radarProcessConfig_t * initParams,
|
||||||
|
DPU_ProcessErrorCodes * errCode
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int32_t retVal = 0;
|
||||||
|
|
||||||
|
return (retVal);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* The function is radarProcess DPU process function. It runs from the data path
|
||||||
|
* processing chain, with configuration and buffers assiged at config time.
|
||||||
|
*
|
||||||
|
* @param[in] handle radarProcess handle.
|
||||||
|
* @param[in] pDataIn Input buffer for the processing -- range FFT output in radar cube
|
||||||
|
* @param[out] pDataOut 3D point cloud data
|
||||||
|
* @param[out] errCode Pointer to errCode generates from the API
|
||||||
|
*
|
||||||
|
* @retval
|
||||||
|
* Success =0
|
||||||
|
* @retval
|
||||||
|
* Error <0
|
||||||
|
*/
|
||||||
|
|
||||||
|
int32_t DPU_radarProcess_process (void *handle, cplx16_t * pDataIn, void * pDataOut, int32_t *errCode)
|
||||||
|
{
|
||||||
|
radarProcessInstance_t * processInst = (radarProcessInstance_t *)handle;
|
||||||
|
#ifdef _TMS320C6X
|
||||||
|
int32_t t1;
|
||||||
|
#endif
|
||||||
|
int32_t i, cOutNumDectected, numDynamicPnts;
|
||||||
|
//RADARDEMO_aoaEst2DCaponBF_errorCode aoaBFErrorCode;
|
||||||
|
radarProcessOutput *resultsPtr = (radarProcessOutput *) pDataOut;
|
||||||
|
radarProcessOutputToTracker * output = &resultsPtr->pointCloudOut;
|
||||||
|
DPIF_DetMatrix * heatmap = &resultsPtr->heatMapOut;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/////////////////// Calling modules -- Dynamic processing ////////////////////////
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
{ //range-angle heatmap generation for dynamic scene processing
|
||||||
|
processInst->aoaInput->fallBackToConvBFFlag = 0; //capon only
|
||||||
|
processInst->aoaInput->processingStepSelector = 0; //BF part
|
||||||
|
processInst->aoaInput->clutterRemovalFlag = 1; //clutter removal always on
|
||||||
|
processInst->aoaInput->nChirps = processInst->numChirpsPerFrame;
|
||||||
|
processInst->aoaInput->lastRB2Process = 0;
|
||||||
|
#ifdef _TMS320C6X
|
||||||
|
t1 = TSCL;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CAPON2DMODULEDEBUG
|
||||||
|
processInst->aoaOutput->cyclesLog->uniqueRngCnt = 0;
|
||||||
|
processInst->aoaOutput->cyclesLog->dopDetCnt = 0;
|
||||||
|
processInst->aoaOutput->cyclesLog->raDetCnt = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for ( i = processInst->cfarRangeSkipLeft; i < processInst->numRangeBins - processInst->cfarRangeSkipRight; i++)
|
||||||
|
{
|
||||||
|
processInst->aoaInput->rangeIndx = i;
|
||||||
|
processInst->aoaInput->inputRangeProcOutSamples = &pDataIn[i * processInst->nRxAnt * processInst->aoaInput->nChirps];
|
||||||
|
processInst->aoaOutput->rangeAzimuthHeatMap = processInst->tempHeatMapOut;
|
||||||
|
//has to be set to indicate the last rb to process, so that buffer init will be done correctly inside module, only needed for dynamic processing.
|
||||||
|
if ( i == (processInst->numRangeBins - processInst->cfarRangeSkipRight - 1))
|
||||||
|
processInst->aoaInput->lastRB2Process = 1;
|
||||||
|
processInst->aoaBFErrorCode = RADARDEMO_aoaEst2DCaponBF_run(
|
||||||
|
processInst->aoaInstance,
|
||||||
|
processInst->aoaInput,
|
||||||
|
processInst->aoaOutput);
|
||||||
|
|
||||||
|
//transpose and store
|
||||||
|
copyTranspose((uint32_t *)&processInst->tempHeatMapOut[0], (uint32_t *)&processInst->localHeatmap[i], processInst->numDynAngleBin, 0, processInst->numRangeBins, 1);
|
||||||
|
}
|
||||||
|
#ifdef _TMS320C6X
|
||||||
|
processInst->benchmarkPtr->bufferIdx++;
|
||||||
|
if (processInst->benchmarkPtr->bufferIdx >= processInst->benchmarkPtr->bufferLen)
|
||||||
|
processInst->benchmarkPtr->bufferIdx = 0;
|
||||||
|
processInst->benchmarkPtr->buffer[processInst->benchmarkPtr->bufferIdx].dynHeatmpGenCycles = TSCL - t1;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
{ //Dynamic CFAR
|
||||||
|
|
||||||
|
#ifdef _TMS320C6X
|
||||||
|
t1 = TSCL;
|
||||||
|
#endif
|
||||||
|
processInst->detectionCFARInput->azMaxPerRangeBin = processInst->perRangeBinMax;
|
||||||
|
processInst->detectionCFARInput->sidelobeThr = processInst->dynamicSideLobeThr;
|
||||||
|
processInst->detectionCFARInput->enableSecondPass = 1;
|
||||||
|
processInst->detectionCFARInput->enable_neighbour_check = 1;
|
||||||
|
processInst->detectionCFARInput->heatmapInput = processInst->dynamicHeatmapPtr;
|
||||||
|
// Detection
|
||||||
|
processInst->cfarErrorCode = RADARDEMO_detectionCFAR_run(
|
||||||
|
processInst->dynamicCFARInstance,
|
||||||
|
processInst->detectionCFARInput,
|
||||||
|
processInst->detectionCFAROutput);
|
||||||
|
|
||||||
|
#ifdef _TMS320C6X
|
||||||
|
processInst->benchmarkPtr->buffer[processInst->benchmarkPtr->bufferIdx].dynCfarDetectionCycles = TSCL - t1;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#ifdef CCS
|
||||||
|
printf("CFAR pnt: %d\t", processInst->detectionCFAROutput->numObjDetected);
|
||||||
|
#endif
|
||||||
|
cOutNumDectected = 0;
|
||||||
|
{ // angle and doppler estimation, per detected range-angle points -- for dynamic scene processing
|
||||||
|
int32_t angleCount, dopplerCount, detIdx;
|
||||||
|
int32_t dopplerIdx;
|
||||||
|
|
||||||
|
processInst->aoaInput->processingStepSelector = 1;
|
||||||
|
#ifdef _TMS320C6X
|
||||||
|
t1 = TSCL;
|
||||||
|
#endif
|
||||||
|
processInst->aoaInput->nChirps = processInst->numChirpsPerFrame;
|
||||||
|
processInst->aoaOutput->rangeAzimuthHeatMap = processInst->localHeatmap;
|
||||||
|
for (detIdx = 0; detIdx < (int32_t)processInst->detectionCFAROutput->numObjDetected; detIdx++)
|
||||||
|
{
|
||||||
|
if (cOutNumDectected > DOA_OUTPUT_MAXPOINTS) break;
|
||||||
|
processInst->aoaInput->rangeIndx = processInst->detectionCFAROutput->rangeInd[detIdx];
|
||||||
|
processInst->aoaInput->angleIndx = processInst->detectionCFAROutput->dopplerInd[detIdx];
|
||||||
|
processInst->aoaInput->inputRangeProcOutSamples = &pDataIn[processInst->aoaInput->rangeIndx * processInst->nRxAnt * processInst->aoaInput->nChirps];
|
||||||
|
processInst->aoaInput->noise = processInst->detectionCFAROutput->noise[detIdx];
|
||||||
|
|
||||||
|
processInst->aoaBFErrorCode = RADARDEMO_aoaEst2DCaponBF_run(
|
||||||
|
processInst->aoaInstance,
|
||||||
|
processInst->aoaInput,
|
||||||
|
processInst->aoaOutput);
|
||||||
|
|
||||||
|
dopplerCount = 0;
|
||||||
|
for ( angleCount = 0; angleCount < processInst->aoaOutput->numAngleEst; angleCount++ )
|
||||||
|
{
|
||||||
|
if (cOutNumDectected > DOA_OUTPUT_MAXPOINTS) break;
|
||||||
|
for ( i = 0; i < processInst->aoaOutput->numDopplerIdx; i++ )
|
||||||
|
{
|
||||||
|
output->pointCloud[cOutNumDectected].range = (float)processInst->aoaInput->rangeIndx * processInst->rangeRes;
|
||||||
|
output->pointCloud[cOutNumDectected].azimuthAngle = processInst->aoaOutput->azimEst[angleCount];
|
||||||
|
output->pointCloud[cOutNumDectected].elevAngle = processInst->aoaOutput->elevEst[angleCount];
|
||||||
|
dopplerIdx = (int32_t)processInst->aoaOutput->dopplerIdx[dopplerCount++];
|
||||||
|
if ( dopplerIdx > (processInst->DopplerFFTSize >> 1))
|
||||||
|
dopplerIdx -= processInst->DopplerFFTSize;
|
||||||
|
output->pointCloud[cOutNumDectected].velocity = (float)dopplerIdx * processInst->dopplerRes;
|
||||||
|
if (processInst->aoaOutput->numAngleEst == 1)
|
||||||
|
output->snr[cOutNumDectected].snr = (int16_t)((float)processInst->detectionCFAROutput->snrEst[detIdx] * 8.f);
|
||||||
|
else
|
||||||
|
output->snr[cOutNumDectected].snr = (int16_t)(divsp_i ((float)processInst->aoaOutput->peakPow[angleCount], processInst->aoaInput->noise) * 8.f);
|
||||||
|
cOutNumDectected++;
|
||||||
|
if (cOutNumDectected > DOA_OUTPUT_MAXPOINTS) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
numDynamicPnts = cOutNumDectected;
|
||||||
|
#ifdef _TMS320C6X
|
||||||
|
processInst->benchmarkPtr->buffer[processInst->benchmarkPtr->bufferIdx].dynAngleDopEstCycles = TSCL - t1;
|
||||||
|
processInst->benchmarkPtr->buffer[processInst->benchmarkPtr->bufferIdx].dynNumDetPnts = numDynamicPnts;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
#ifdef CCS
|
||||||
|
printf("dyn pnt: %d\t", numDynamicPnts);
|
||||||
|
#endif
|
||||||
|
/////////////////// end of Dynamic processing ////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/////////////////// Calling modules -- Static processing ////////////////////////
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
if ((processInst->staticProcEnabled) && (cOutNumDectected < DOA_OUTPUT_MAXPOINTS))
|
||||||
|
{ //range-angle heatmap generation for Static scene processing
|
||||||
|
|
||||||
|
processInst->aoaInput->processingStepSelector = 0; //BF part
|
||||||
|
#ifdef _TMS320C6X
|
||||||
|
t1 = TSCL;
|
||||||
|
#endif
|
||||||
|
for ( i = 0; i < processInst->numRangeBins; i++)
|
||||||
|
{
|
||||||
|
processInst->aoaInput->rangeIndx = i;
|
||||||
|
processInst->aoaOutput->rangeAzimuthHeatMap = processInst->tempHeatMapOut;
|
||||||
|
processInst->aoaBFErrorCode = RADARDEMO_aoaEst2DCaponBF_static_run(
|
||||||
|
processInst->aoaInstance,
|
||||||
|
processInst->aoaInput,
|
||||||
|
processInst->aoaOutput);
|
||||||
|
copyTranspose((uint32_t *)&processInst->tempHeatMapOut[0], (uint32_t *)&processInst->localHeatmap[i], processInst->numStaticAngleBin, 0, processInst->numRangeBins, 1);
|
||||||
|
}
|
||||||
|
#ifdef _TMS320C6X
|
||||||
|
processInst->benchmarkPtr->buffer[processInst->benchmarkPtr->bufferIdx].staticHeatmpGenCycles = TSCL - t1;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
if (processInst->staticProcEnabled)
|
||||||
|
{ // test CFAR -- for Static scene processing
|
||||||
|
|
||||||
|
#ifdef _TMS320C6X
|
||||||
|
t1 = TSCL;
|
||||||
|
#endif
|
||||||
|
processInst->detectionCFARInput->azMaxPerRangeBin = processInst->perRangeBinMax;
|
||||||
|
processInst->detectionCFARInput->sidelobeThr = processInst->staticSideLobeThr;
|
||||||
|
processInst->detectionCFARInput->enableSecondPass = 0;
|
||||||
|
processInst->detectionCFARInput->enable_neighbour_check = 1;
|
||||||
|
processInst->detectionCFARInput->heatmapInput = processInst->staticHeatmapPtr;
|
||||||
|
// Detection
|
||||||
|
processInst->cfarErrorCode = RADARDEMO_detectionCFAR_run(
|
||||||
|
processInst->staticCFARInstance,
|
||||||
|
processInst->detectionCFARInput,
|
||||||
|
processInst->detectionCFAROutput);
|
||||||
|
|
||||||
|
#ifdef _TMS320C6X
|
||||||
|
processInst->benchmarkPtr->buffer[processInst->benchmarkPtr->bufferIdx].staticCfarDetectionCycles = TSCL - t1;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
if (processInst->staticProcEnabled)
|
||||||
|
{ // angle interpolation per detected range-angle points -- for Static scene processing
|
||||||
|
int32_t detIdx, angleIdx;
|
||||||
|
|
||||||
|
#ifdef _TMS320C6X
|
||||||
|
t1 = TSCL;
|
||||||
|
#endif
|
||||||
|
processInst->aoaInput->processingStepSelector = 1;
|
||||||
|
processInst->aoaOutput->rangeAzimuthHeatMap = &processInst->localHeatmap[0];
|
||||||
|
processInst->aoaInput->nChirps = processInst->numChirpsPerFrame;
|
||||||
|
processInst->aoaOutput->rangeAzimuthHeatMap = processInst->localHeatmap;
|
||||||
|
for (detIdx = 0; detIdx < (int32_t)processInst->detectionCFAROutput->numObjDetected; detIdx++)
|
||||||
|
{
|
||||||
|
if (cOutNumDectected > DOA_OUTPUT_MAXPOINTS) break;
|
||||||
|
processInst->aoaInput->rangeIndx = processInst->detectionCFAROutput->rangeInd[detIdx];
|
||||||
|
processInst->aoaInput->angleIndx = processInst->detectionCFAROutput->dopplerInd[detIdx];
|
||||||
|
processInst->aoaInput->inputRangeProcOutSamples = &pDataIn[processInst->aoaInput->rangeIndx * processInst->nRxAnt * processInst->aoaInput->nChirps];
|
||||||
|
processInst->aoaInput->noise = processInst->detectionCFAROutput->noise[detIdx];
|
||||||
|
|
||||||
|
processInst->aoaBFErrorCode = RADARDEMO_aoaEst2DCaponBF_static_run(
|
||||||
|
processInst->aoaInstance,
|
||||||
|
processInst->aoaInput,
|
||||||
|
processInst->aoaOutput);
|
||||||
|
|
||||||
|
for ( angleIdx = 0; angleIdx < processInst->aoaOutput->numAngleEst; angleIdx++ )
|
||||||
|
{
|
||||||
|
output->pointCloud[cOutNumDectected].range = (float)processInst->aoaInput->rangeIndx * processInst->rangeRes;
|
||||||
|
output->pointCloud[cOutNumDectected].azimuthAngle = -processInst->aoaOutput->azimEst[angleIdx];
|
||||||
|
output->pointCloud[cOutNumDectected].elevAngle = processInst->aoaOutput->elevEst[angleIdx];
|
||||||
|
output->pointCloud[cOutNumDectected].velocity = 0.f;
|
||||||
|
output->snr[cOutNumDectected].snr = (int16_t)(divsp_i ((float)processInst->aoaOutput->peakPow[angleIdx], processInst->aoaInput->noise) * 8.f);
|
||||||
|
cOutNumDectected++;
|
||||||
|
if (cOutNumDectected > DOA_OUTPUT_MAXPOINTS) break;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#ifdef _TMS320C6X
|
||||||
|
processInst->benchmarkPtr->buffer[processInst->benchmarkPtr->bufferIdx].staticAngleEstCycles = TSCL - t1;
|
||||||
|
processInst->benchmarkPtr->buffer[processInst->benchmarkPtr->bufferIdx].staticNumDetPnts = cOutNumDectected - numDynamicPnts;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#ifdef CCS
|
||||||
|
printf("static pnt: %d\t", cOutNumDectected - numDynamicPnts);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _TMS320C6X
|
||||||
|
resultsPtr->benchmarkOut = &processInst->benchmarkPtr->buffer[processInst->benchmarkPtr->bufferIdx];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
heatmap->datafmt = 0;
|
||||||
|
heatmap->dataSize = processInst->heatMapMemSize;
|
||||||
|
heatmap->data = (void *)processInst->localHeatmap;
|
||||||
|
|
||||||
|
output->object_count = cOutNumDectected;
|
||||||
|
|
||||||
|
*errCode = (int32_t)processInst->aoaBFErrorCode;
|
||||||
|
|
||||||
|
return(-processInst->aoaBFErrorCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* The function is radarProcess DPU control function. Currently not used.
|
||||||
|
*
|
||||||
|
* @param[in] handle radarProcess handle.
|
||||||
|
*
|
||||||
|
* @retval
|
||||||
|
* Success =0
|
||||||
|
* @retval
|
||||||
|
* Error <0
|
||||||
|
*/
|
||||||
|
int32_t DPU_radarProcess_control
|
||||||
|
(
|
||||||
|
DPU_radarProcess_Handle handle
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int32_t retVal = 0;
|
||||||
|
|
||||||
|
return (retVal);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @b Description
|
||||||
|
* @n
|
||||||
|
* The function is radarProcess DPU deinit function. It release resources used for the DPU.
|
||||||
|
*
|
||||||
|
* @param[in] handle radarProcess handle.
|
||||||
|
* @param[in] errCode Pointer to errCode generates from the API
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @retval
|
||||||
|
* Success =0
|
||||||
|
* @retval
|
||||||
|
* Error <0
|
||||||
|
*/
|
||||||
|
int32_t DPU_radarProcess_deinit
|
||||||
|
(
|
||||||
|
DPU_radarProcess_Handle handle,
|
||||||
|
int32_t *errCode
|
||||||
|
)
|
||||||
|
{
|
||||||
|
radarProcessInstance_t * processInst = (radarProcessInstance_t *)handle;
|
||||||
|
|
||||||
|
RADARDEMO_aoaEst2DCaponBF_delete(processInst->aoaInstance);
|
||||||
|
RADARDEMO_detectionCFAR_delete(processInst->dynamicCFARInstance);
|
||||||
|
if (processInst->staticProcEnabled)
|
||||||
|
RADARDEMO_detectionCFAR_delete(processInst->staticCFARInstance);
|
||||||
|
|
||||||
|
//
|
||||||
|
radarOsal_memFree(processInst, sizeof(radarProcessInstance_t));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
1
dss/src/.exclude
Normal file
1
dss/src/.exclude
Normal file
@ -0,0 +1 @@
|
|||||||
|
This file exists to prevent Eclipse/CDT from adding the C sources contained in this directory (or below) to any enclosing project.
|
62
dss/src/makefile.libs
Normal file
62
dss/src/makefile.libs
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
#
|
||||||
|
# This file was generated based on the configuration script:
|
||||||
|
# C:\Users\Daunair\workspace_v10\3D_people_count_68xx_dss\dss\pcount3D_dss.cfg
|
||||||
|
#
|
||||||
|
# This makefile may be included in other makefiles that need to build
|
||||||
|
# the libraries containing the compiled source files generated as
|
||||||
|
# part of the configuration step.
|
||||||
|
|
||||||
|
#
|
||||||
|
# ======== GEN_SRC_DIR =========
|
||||||
|
# The path to the sources generated during configuration
|
||||||
|
#
|
||||||
|
# This path must be either absolute or relative to the build directory.
|
||||||
|
#
|
||||||
|
# The absolute path to the generated source directory (at the time the
|
||||||
|
# sources were generated) is:
|
||||||
|
# C:\Users\Daunair\workspace_v10\3D_people_count_68xx_dss\dss\src
|
||||||
|
#
|
||||||
|
GEN_SRC_DIR ?= ../dss/src
|
||||||
|
|
||||||
|
ifeq (,$(wildcard $(GEN_SRC_DIR)))
|
||||||
|
$(error "ERROR: GEN_SRC_DIR must be set to the directory containing the generated sources")
|
||||||
|
endif
|
||||||
|
|
||||||
|
#
|
||||||
|
# ======== .force ========
|
||||||
|
# The .force goal is used to force the build of any goal that names it as
|
||||||
|
# a prerequisite
|
||||||
|
#
|
||||||
|
.PHONY: .force
|
||||||
|
|
||||||
|
#
|
||||||
|
# ======== library macros ========
|
||||||
|
#
|
||||||
|
sysbios_SRC = $(GEN_SRC_DIR)/sysbios
|
||||||
|
sysbios_LIB = $(GEN_SRC_DIR)/sysbios/sysbios.ae674
|
||||||
|
|
||||||
|
#
|
||||||
|
# ======== dependencies ========
|
||||||
|
#
|
||||||
|
all: $(sysbios_LIB)
|
||||||
|
clean: .sysbios_clean
|
||||||
|
|
||||||
|
|
||||||
|
# ======== convenient build goals ========
|
||||||
|
.PHONY: sysbios
|
||||||
|
sysbios: $(GEN_SRC_DIR)/sysbios/sysbios.ae674
|
||||||
|
|
||||||
|
# CDT managed make executables depend on $(OBJS)
|
||||||
|
OBJS += $(sysbios_LIB)
|
||||||
|
|
||||||
|
#
|
||||||
|
# ======== rules ========
|
||||||
|
#
|
||||||
|
$(sysbios_LIB): .force
|
||||||
|
@echo making $@ ...
|
||||||
|
@$(MAKE) -C $(sysbios_SRC)
|
||||||
|
|
||||||
|
.sysbios_clean:
|
||||||
|
@echo cleaning $(sysbios_SRC) ...
|
||||||
|
-@$(MAKE) --no-print-directory -C $(sysbios_SRC) clean
|
||||||
|
|
78
dss/src/sysbios/makefile
Normal file
78
dss/src/sysbios/makefile
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
# This is a generated file.
|
||||||
|
#
|
||||||
|
# Do not edit this file. Any modifications to this file
|
||||||
|
# will be overwritten whenever makefiles are re-generated.
|
||||||
|
#
|
||||||
|
# template: ti.sysbios/makefile.xdt
|
||||||
|
# target: ti.targets.elf.C674
|
||||||
|
|
||||||
|
vpath % C:/ti/bios_6_73_01_01/packages/ti/sysbios/
|
||||||
|
vpath %.c C:/ti/xdctools_3_50_08_24_core/packages/
|
||||||
|
|
||||||
|
XOPTS = -I"C:/ti/xdctools_3_50_08_24_core/packages/" -Dxdc_target_types__=C:/ti/bios_6_73_01_01/packages/ti/targets/elf/std.h -Dxdc_target_name__=C674
|
||||||
|
|
||||||
|
BIOS_DEFS = -Dti_sysbios_BIOS_swiEnabled__D=TRUE -Dti_sysbios_BIOS_taskEnabled__D=TRUE -Dti_sysbios_BIOS_clockEnabled__D=TRUE -Dti_sysbios_BIOS_runtimeCreatesEnabled__D=TRUE -Dti_sysbios_knl_Task_moduleStateCheckFlag__D=FALSE -Dti_sysbios_knl_Task_objectCheckFlag__D=FALSE -Dti_sysbios_hal_Hwi_DISABLE_ALL_HOOKS -Dti_sysbios_knl_Swi_DISABLE_ALL_HOOKS -Dti_sysbios_BIOS_smpEnabled__D=FALSE -Dti_sysbios_BIOS_mpeEnabled__D=FALSE -Dti_sysbios_Build_useHwiMacros -Dti_sysbios_knl_Swi_numPriorities__D=16 -Dti_sysbios_knl_Task_deleteTerminatedTasks__D=FALSE -Dti_sysbios_knl_Task_numPriorities__D=16 -Dti_sysbios_knl_Task_checkStackFlag__D=TRUE -Dti_sysbios_knl_Task_initStackFlag__D=TRUE -Dti_sysbios_knl_Clock_TICK_SOURCE=ti_sysbios_knl_Clock_TickSource_TIMER -Dti_sysbios_knl_Clock_TICK_MODE=ti_sysbios_knl_Clock_TickMode_PERIODIC -Dti_sysbios_hal_Core_delegate_getId=ti_sysbios_hal_CoreNull_getId__E -Dti_sysbios_hal_Core_delegate_interruptCore=ti_sysbios_hal_CoreNull_interruptCore__E -Dti_sysbios_hal_Core_delegate_lock=ti_sysbios_hal_CoreNull_lock__E -Dti_sysbios_hal_Core_delegate_unlock=ti_sysbios_hal_CoreNull_unlock__E -Dti_sysbios_hal_Core_numCores__D=1 -Dti_sysbios_hal_CoreNull_numCores__D=1 -Dti_sysbios_utils_Load_taskEnabled__D=TRUE -Dti_sysbios_utils_Load_swiEnabled__D=FALSE -Dti_sysbios_utils_Load_hwiEnabled__D=FALSE -Dti_sysbios_family_c64p_Hwi_dispatcherSwiSupport__D=TRUE -Dti_sysbios_family_c64p_Hwi_dispatcherTaskSupport__D=TRUE -Dti_sysbios_family_c64p_Hwi_dispatcherAutoNestingSupport__D=TRUE -Dti_sysbios_family_c64p_Hwi_dispatcherIrpTrackingSupport__D=TRUE -Dti_sysbios_knl_Semaphore_supportsEvents__D=FALSE -Dti_sysbios_knl_Semaphore_supportsPriority__D=TRUE -Dxdc_runtime_Log_DISABLE_ALL
|
||||||
|
|
||||||
|
CCOPTS = -mv6740 --abi=eabi -q -mi10 -mo -pdr -pden -pds=238 -pds=880 -pds1110 --program_level_compile -o3 -g --enum_type=int -Dti_sysbios_family_c64p_Exception_enableExternalMPC__D=FALSE -Dti_sysbios_family_c64p_Exception_enablePrint__D=TRUE -Dti_sysbios_knl_Clock_stopCheckNext__D=FALSE -Dti_sysbios_knl_Task_ENABLE_SWITCH_HOOKS -Dti_sysbios_knl_Task_minimizeLatency__D=FALSE
|
||||||
|
|
||||||
|
BIOS_INC = -I"C:/ti/bios_6_73_01_01/packages/"
|
||||||
|
ANNEX_INCS =
|
||||||
|
INCS = $(BIOS_INC) $(ANNEX_INCS) -I"C:/ti/bios_6_73_01_01/packages/" -I"C:/ti/xdctools_3_50_08_24_core/packages/" -I"../" -I"/packages//" -IC:/ti/ti-cgt-c6000_8.3.3/include
|
||||||
|
|
||||||
|
CC = C:/ti/ti-cgt-c6000_8.3.3/bin/cl6x -c $(CCOPTS)
|
||||||
|
ASM = C:/ti/ti-cgt-c6000_8.3.3/bin/cl6x -c $(CCOPTS)
|
||||||
|
AR = C:/ti/ti-cgt-c6000_8.3.3/bin/ar6x rq
|
||||||
|
|
||||||
|
DEL = C:/ti/xdctools_3_50_08_24_core/packages/../bin/rm -f
|
||||||
|
CP = C:/ti/xdctools_3_50_08_24_core/packages/../bin/cp -f
|
||||||
|
|
||||||
|
define RM
|
||||||
|
$(if $(wildcard $1),$(DEL) $1,:)
|
||||||
|
endef
|
||||||
|
|
||||||
|
define ASSEMBLE
|
||||||
|
@echo asme674 $< ...
|
||||||
|
@$(ASM) $(BIOS_DEFS) $(XOPTS) $(INCS) $<
|
||||||
|
endef
|
||||||
|
|
||||||
|
all: sysbios.ae674
|
||||||
|
|
||||||
|
c64p_Exception_asm.obj: family/c64p/Exception_asm.s64P makefile
|
||||||
|
@-$(call RM, $@)
|
||||||
|
$(ASSEMBLE) --output_file=c64p_Exception_asm.obj
|
||||||
|
|
||||||
|
c64p_Hwi_asm.obj: family/c64p/Hwi_asm.s62 makefile
|
||||||
|
@-$(call RM, $@)
|
||||||
|
$(ASSEMBLE) --output_file=c64p_Hwi_asm.obj
|
||||||
|
|
||||||
|
c64p_Hwi_asm_switch.obj: family/c64p/Hwi_asm_switch.s62 makefile
|
||||||
|
@-$(call RM, $@)
|
||||||
|
$(ASSEMBLE) --output_file=c64p_Hwi_asm_switch.obj
|
||||||
|
|
||||||
|
c64p_Hwi_disp_always.obj: family/c64p/Hwi_disp_always.s64P makefile
|
||||||
|
@-$(call RM, $@)
|
||||||
|
$(ASSEMBLE) --output_file=c64p_Hwi_disp_always.obj
|
||||||
|
|
||||||
|
ti_tls_get_tp.obj: rts/ti/tls_get_tp.asm makefile
|
||||||
|
@-$(call RM, $@)
|
||||||
|
$(ASSEMBLE) --output_file=ti_tls_get_tp.obj
|
||||||
|
|
||||||
|
c62_TaskSupport_asm.obj: family/c62/TaskSupport_asm.s62 makefile
|
||||||
|
@-$(call RM, $@)
|
||||||
|
$(ASSEMBLE) --output_file=c62_TaskSupport_asm.obj
|
||||||
|
|
||||||
|
|
||||||
|
BIOS.obj: BIOS.c family/c64p/EventCombiner.c family/c64p/Exception.c family/c64p/Hwi.c family/c64p/Hwi_startup.c family/c64p/TimestampProvider.c family/c64p/Cache.c knl/Clock.c knl/Idle.c knl/Intrinsics.c knl/Event.c knl/Queue.c knl/Semaphore.c knl/Swi.c knl/Task.c heaps/HeapBuf.c heaps/HeapMem.c utils/Load.c utils/Load_CPU.c rts/ti/ThreadLocalStorage.c hal/Hwi.c hal/Hwi_stack.c hal/Hwi_startup.c family/c62/TaskSupport.c family/c62/IntrinsicsSupport.c gates/GateHwi.c gates/GateMutex.c timers/rti/Timer.c xdc/runtime/xdc_noinit.c xdc/runtime/Assert.c xdc/runtime/Core-mem.c xdc/runtime/Core-smem.c xdc/runtime/Core-label.c xdc/runtime/Core-params.c xdc/runtime/Diags.c xdc/runtime/Error.c xdc/runtime/Gate.c xdc/runtime/Log.c xdc/runtime/LoggerBuf.c xdc/runtime/Memory.c xdc/runtime/Registry.c xdc/runtime/Startup.c xdc/runtime/System.c xdc/runtime/SysStd.c xdc/runtime/Text.c xdc/runtime/Timestamp.c xdc/runtime/TimestampNull.c makefile
|
||||||
|
@-$(call RM, $@)
|
||||||
|
@echo cle674 $< ...
|
||||||
|
@$(CC) $(BIOS_DEFS) $(XOPTS) $(INCS) $(subst makefile,,$^)
|
||||||
|
|
||||||
|
sysbios.ae674: BIOS.obj c64p_Exception_asm.obj c64p_Hwi_asm.obj c64p_Hwi_asm_switch.obj c64p_Hwi_disp_always.obj ti_tls_get_tp.obj c62_TaskSupport_asm.obj
|
||||||
|
@-$(call RM, $@)
|
||||||
|
@echo are674 $^ ...
|
||||||
|
@$(AR) $@ $^
|
||||||
|
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@$(DEL) ..\makefile.libs
|
||||||
|
@-$(call RM, *)
|
BIN
dss/src/sysbios/sysbios.ae674
Normal file
BIN
dss/src/sysbios/sysbios.ae674
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user