TI-radar AWR1843 C674x DSP core  1
dss_config_edma_util.c
Go to the documentation of this file.
1 
40 #include <xdc/runtime/System.h>
41 #include <ti/drivers/edma/edma.h>
42 #include "dss_config_edma_util.h"
43 
44 #define MAX(x,y) ((x) > (y) ? (x) : (y))
45 
46 static int32_t EDMA_setup_shadow_link (EDMA_Handle handle, uint8_t chId,
47  uint16_t shadowParamId, EDMA_paramSetConfig_t *config,
48  EDMA_transferCompletionCallbackFxn_t transferCompletionCallbackFxn,
49  uintptr_t transferCompletionCallbackFxnArg);
50 
51 static int32_t EDMA_setup_shadow_link (EDMA_Handle handle, uint8_t chId,
52  uint16_t shadowParamId, EDMA_paramSetConfig_t *config,
53  EDMA_transferCompletionCallbackFxn_t transferCompletionCallbackFxn,
54  uintptr_t transferCompletionCallbackFxnArg)
55 {
56  EDMA_paramConfig_t paramConfig;
57  int32_t errorCode = EDMA_NO_ERROR;
58  paramConfig.paramSetConfig = *config; //this will copy the entire param set config
59  paramConfig.transferCompletionCallbackFxn = transferCompletionCallbackFxn;
60  paramConfig.transferCompletionCallbackFxnArg = transferCompletionCallbackFxnArg;
61  if ((errorCode = EDMA_configParamSet(handle,
62  shadowParamId, &paramConfig)) != EDMA_NO_ERROR)
63  {
64  //System_printf("Error: EDMA_configParamSet() failed with error code = %d\n", errorCode);
65  goto exit;
66  }
67 
68  if ((errorCode = EDMA_linkParamSets(handle,
69  (uint16_t) chId, shadowParamId)) != EDMA_NO_ERROR)
70  {
71  //System_printf("Error: EDMA_linkParamSets() failed with error code = %d\n", errorCode);
72  goto exit;
73  }
74 
75  if ((errorCode = EDMA_linkParamSets(handle,
76  shadowParamId, shadowParamId)) != EDMA_NO_ERROR)
77  {
78  //System_printf("Error: EDMA_linkParamSets() failed with error code = %d\n", errorCode);
79  goto exit;
80  }
81 
82 exit:
83  return(errorCode);
84 }
85 
86 int32_t EDMAutil_configType1(EDMA_Handle handle,
87  uint8_t *srcBuff,
88  uint8_t *dstBuff,
89  uint8_t chId,
90  bool isEventTriggered,
91  uint16_t shadowParamId,
92  uint16_t aCount,
93  uint16_t bCount,
94  int16_t srcBIdx,
95  int16_t dstBIdx,
96  uint8_t eventQueueId,
97  EDMA_transferCompletionCallbackFxn_t transferCompletionCallbackFxn,
98  uintptr_t transferCompletionCallbackFxnArg)
99 {
100  EDMA_channelConfig_t config;
101  int32_t errorCode = EDMA_NO_ERROR;
102 
103  config.channelId = chId;
104  config.channelType = (uint8_t)EDMA3_CHANNEL_TYPE_DMA;
105  config.paramId = chId;
106  config.eventQueueId = eventQueueId;
107 
108  config.paramSetConfig.sourceAddress = (uint32_t) srcBuff;
109  config.paramSetConfig.destinationAddress = (uint32_t) dstBuff;
110 
111  config.paramSetConfig.aCount = aCount;
112  config.paramSetConfig.bCount = bCount;
113  config.paramSetConfig.cCount = 1U;
114  config.paramSetConfig.bCountReload = 0U;
115 
116  config.paramSetConfig.sourceBindex = srcBIdx;
117  config.paramSetConfig.destinationBindex = dstBIdx;
118 
119  config.paramSetConfig.sourceCindex = 0U;
120  config.paramSetConfig.destinationCindex = 0U;
121 
122  config.paramSetConfig.linkAddress = EDMA_NULL_LINK_ADDRESS;
123  config.paramSetConfig.transferType = (uint8_t)EDMA3_SYNC_A;
124  config.paramSetConfig.transferCompletionCode = chId;
125  config.paramSetConfig.sourceAddressingMode = (uint8_t) EDMA3_ADDRESSING_MODE_LINEAR;
126  config.paramSetConfig.destinationAddressingMode = (uint8_t) EDMA3_ADDRESSING_MODE_LINEAR;
127 
128  /* don't care because of linear addressing modes above */
129  config.paramSetConfig.fifoWidth = (uint8_t) EDMA3_FIFO_WIDTH_8BIT;
130 
131  config.paramSetConfig.isStaticSet = false;
132  config.paramSetConfig.isEarlyCompletion = false;
133  config.paramSetConfig.isFinalTransferInterruptEnabled = true;
134  config.paramSetConfig.isIntermediateTransferInterruptEnabled = true;
135  config.paramSetConfig.isFinalChainingEnabled = false;
136  config.paramSetConfig.isIntermediateChainingEnabled = false;
137  config.transferCompletionCallbackFxn = transferCompletionCallbackFxn;
138  config.transferCompletionCallbackFxnArg = transferCompletionCallbackFxnArg;
139 
140  if ((errorCode = EDMA_configChannel(handle, &config, isEventTriggered)) != EDMA_NO_ERROR)
141  {
142  //System_printf("Error: EDMA_configChannel() failed with error code = %d\n", errorCode);
143  goto exit;
144  }
145 
146  errorCode = EDMA_setup_shadow_link(handle, chId, shadowParamId,
147  &config.paramSetConfig, config.transferCompletionCallbackFxn, transferCompletionCallbackFxnArg);
148 
149 exit:
150  return(errorCode);
151 }
152 
153 int32_t EDMAutil_configType2a(EDMA_Handle handle,
154  uint8_t *srcBuff,
155  uint8_t *dstBuff,
156  uint8_t chId,
157  bool isEventTriggered,
158  uint16_t shadowParamId,
159  uint16_t sampleLenInBytes,
160  uint16_t numRangeBins,
161  uint8_t numTxAnt,
162  uint8_t numRxAnt,
163  uint16_t numDopplerBins,
164  uint8_t eventQueueId,
165  EDMA_transferCompletionCallbackFxn_t transferCompletionCallbackFxn,
166  uintptr_t transferCompletionCallbackFxnArg)
167 {
168  EDMA_channelConfig_t config;
169  int32_t errorCode = EDMA_NO_ERROR;
170 
171  config.channelId = chId;
172  config.channelType = (uint8_t)EDMA3_CHANNEL_TYPE_DMA;
173  config.paramId = chId;
174  config.eventQueueId = eventQueueId;
175 
176  config.paramSetConfig.sourceAddress = (uint32_t) srcBuff;
177  config.paramSetConfig.destinationAddress = (uint32_t) dstBuff;
178 
179  config.paramSetConfig.aCount = sampleLenInBytes;
180  config.paramSetConfig.bCount = numRangeBins;
181  config.paramSetConfig.cCount = (uint16_t) numRxAnt;
182  config.paramSetConfig.bCountReload = 0U;
183 
184  config.paramSetConfig.sourceBindex = (int16_t) sampleLenInBytes;
185  config.paramSetConfig.destinationBindex = (int16_t)(numDopplerBins * numTxAnt * numRxAnt * sampleLenInBytes);
186 
187  config.paramSetConfig.sourceCindex = (int16_t)(numRangeBins * sampleLenInBytes);
188  config.paramSetConfig.destinationCindex = (int16_t)(numDopplerBins * sampleLenInBytes);
189 
190  config.paramSetConfig.linkAddress = EDMA_NULL_LINK_ADDRESS;
191  config.paramSetConfig.transferType = (uint8_t)EDMA3_SYNC_AB;
192  config.paramSetConfig.transferCompletionCode = chId;
193  config.paramSetConfig.sourceAddressingMode = (uint8_t) EDMA3_ADDRESSING_MODE_LINEAR;
194  config.paramSetConfig.destinationAddressingMode = (uint8_t) EDMA3_ADDRESSING_MODE_LINEAR;
195 
196  /* don't care because of linear addressing modes above */
197  config.paramSetConfig.fifoWidth = (uint8_t) EDMA3_FIFO_WIDTH_8BIT;
198  config.paramSetConfig.isStaticSet = false;
199  config.paramSetConfig.isEarlyCompletion = false;
200  config.paramSetConfig.isFinalTransferInterruptEnabled = true;
201  config.paramSetConfig.isIntermediateTransferInterruptEnabled = false;
202  config.paramSetConfig.isFinalChainingEnabled = false;
203  config.paramSetConfig.isIntermediateChainingEnabled = true;
204  config.transferCompletionCallbackFxn = transferCompletionCallbackFxn;
205  config.transferCompletionCallbackFxnArg = transferCompletionCallbackFxnArg;
206 
207  if ((errorCode = EDMA_configChannel(handle, &config, isEventTriggered)) != EDMA_NO_ERROR)
208  {
209  //System_printf("Error: EDMA_configChannel() failed with error code = %d\n", errorCode);
210  goto exit;
211  }
212 
213  errorCode = EDMA_setup_shadow_link(handle, chId, shadowParamId,
214  &config.paramSetConfig, config.transferCompletionCallbackFxn, transferCompletionCallbackFxnArg);
215 
216 exit:
217  return(errorCode);
218 }
219 
220 int32_t EDMAutil_configType2b(EDMA_Handle handle,
221  uint8_t *srcBuff,
222  uint8_t *dstBuff,
223  uint8_t chId,
224  bool isEventTriggered,
225  uint16_t shadowParamId,
226  uint16_t sampleLenInBytes,
227  uint16_t numRangeBins,
228  uint8_t numTxAnt,
229  uint8_t numRxAnt,
230  uint16_t numDopplerBins,
231  uint8_t eventQueueId,
232  EDMA_transferCompletionCallbackFxn_t transferCompletionCallbackFxn,
233  uintptr_t transferCompletionCallbackFxnArg)
234 {
235  EDMA_channelConfig_t config;
236  int32_t errorCode = EDMA_NO_ERROR;
237 
238  config.channelId = chId;
239  config.channelType = (uint8_t)EDMA3_CHANNEL_TYPE_DMA;
240  config.paramId = chId;
241  config.eventQueueId = eventQueueId;
242 
243  config.paramSetConfig.sourceAddress = (uint32_t) srcBuff;
244  config.paramSetConfig.destinationAddress = (uint32_t) dstBuff;
245 
246  config.paramSetConfig.aCount = sampleLenInBytes;
247  config.paramSetConfig.bCount = numDopplerBins;
248  config.paramSetConfig.cCount = (uint16_t) MAX((numTxAnt * numRxAnt / 2),1);
249  config.paramSetConfig.bCountReload = 0U;
250 
251  config.paramSetConfig.sourceBindex = (int16_t) (numRxAnt * numRangeBins *
252  sampleLenInBytes);
253  config.paramSetConfig.destinationBindex = (int16_t)sampleLenInBytes;
254 
255  if (numTxAnt == 2)
256  {
257  config.paramSetConfig.sourceCindex = (int16_t)(numRangeBins * sampleLenInBytes);
258  }
259  else
260  {
261  config.paramSetConfig.sourceCindex = (int16_t)(numRangeBins * sampleLenInBytes * 2);
262  }
263 
264  config.paramSetConfig.destinationCindex = 0;
265 
266  config.paramSetConfig.linkAddress = EDMA_NULL_LINK_ADDRESS;
267  config.paramSetConfig.transferType = (uint8_t)EDMA3_SYNC_AB;
268  config.paramSetConfig.transferCompletionCode = chId;
269  config.paramSetConfig.sourceAddressingMode = (uint8_t) EDMA3_ADDRESSING_MODE_LINEAR;
270  config.paramSetConfig.destinationAddressingMode = (uint8_t) EDMA3_ADDRESSING_MODE_LINEAR;
271 
272  /* don't care because of linear addressing modes above */
273  config.paramSetConfig.fifoWidth = (uint8_t) EDMA3_FIFO_WIDTH_8BIT;
274  config.paramSetConfig.isStaticSet = false;
275  config.paramSetConfig.isEarlyCompletion = false;
276  config.paramSetConfig.isFinalTransferInterruptEnabled = true;
277  config.paramSetConfig.isIntermediateTransferInterruptEnabled = true;
278  config.paramSetConfig.isFinalChainingEnabled = false;
279  config.paramSetConfig.isIntermediateChainingEnabled = false;
280  config.transferCompletionCallbackFxn = transferCompletionCallbackFxn;
281  config.transferCompletionCallbackFxnArg = transferCompletionCallbackFxnArg;
282 
283  if ((errorCode = EDMA_configChannel(handle, &config, isEventTriggered)) != EDMA_NO_ERROR)
284  {
285  //System_printf("Error: EDMA_configChannel() failed with error code = %d\n", errorCode);
286  goto exit;
287  }
288 
289  errorCode = EDMA_setup_shadow_link(handle, chId, shadowParamId,
290  &config.paramSetConfig, config.transferCompletionCallbackFxn, transferCompletionCallbackFxnArg);
291 
292 exit:
293  return(errorCode);
294 }
295 
296 
297 int32_t EDMAutil_configType3(EDMA_Handle handle,
298  uint8_t *srcBuff,
299  uint8_t *dstBuff,
300  uint8_t chId,
301  bool isEventTriggered,
302  uint16_t shadowParamId,
303  uint16_t aCount,
304  uint16_t bCount,
305  int16_t srcBIdx,
306  int16_t destBIdx,
307  uint8_t eventQueueId,
308  EDMA_transferCompletionCallbackFxn_t transferCompletionCallbackFxn,
309  uintptr_t transferCompletionCallbackFxnArg)
310 {
311  EDMA_channelConfig_t config;
312  int32_t errorCode = EDMA_NO_ERROR;
313 
314  config.channelId = chId;
315  config.channelType = (uint8_t)EDMA3_CHANNEL_TYPE_DMA;
316  config.paramId = chId;
317  config.eventQueueId = eventQueueId;
318 
319  config.paramSetConfig.sourceAddress = (uint32_t) srcBuff;
320  config.paramSetConfig.destinationAddress = (uint32_t) dstBuff;
321 
322  config.paramSetConfig.aCount = aCount;
323  config.paramSetConfig.bCount = bCount;
324  config.paramSetConfig.cCount = 1U;
325  config.paramSetConfig.bCountReload = 0U;
326 
327  config.paramSetConfig.sourceBindex = srcBIdx;
328  config.paramSetConfig.destinationBindex = destBIdx;
329 
330  config.paramSetConfig.sourceCindex = 0U;
331  config.paramSetConfig.destinationCindex = 0U;
332 
333  config.paramSetConfig.linkAddress = EDMA_NULL_LINK_ADDRESS;
334  config.paramSetConfig.transferType = (uint8_t)EDMA3_SYNC_AB;
335  config.paramSetConfig.transferCompletionCode = chId;
336  config.paramSetConfig.sourceAddressingMode = (uint8_t) EDMA3_ADDRESSING_MODE_LINEAR;
337  config.paramSetConfig.destinationAddressingMode = (uint8_t) EDMA3_ADDRESSING_MODE_LINEAR;
338 
339  /* don't care because of linear addressing modes above */
340  config.paramSetConfig.fifoWidth = (uint8_t) EDMA3_FIFO_WIDTH_8BIT;
341 
342  config.paramSetConfig.isStaticSet = false;
343  config.paramSetConfig.isEarlyCompletion = false;
344  config.paramSetConfig.isFinalTransferInterruptEnabled = true;
345  config.paramSetConfig.isIntermediateTransferInterruptEnabled = false;
346  config.paramSetConfig.isFinalChainingEnabled = false;
347  config.paramSetConfig.isIntermediateChainingEnabled = false;
348  config.transferCompletionCallbackFxn = transferCompletionCallbackFxn;
349  config.transferCompletionCallbackFxnArg = transferCompletionCallbackFxnArg;
350 
351  if ((errorCode = EDMA_configChannel(handle, &config, isEventTriggered)) != EDMA_NO_ERROR)
352  {
353  //System_printf("Error: EDMA_configChannel() failed with error code = %d\n", errorCode);
354  goto exit;
355  }
356 
357  errorCode = EDMA_setup_shadow_link(handle, chId, shadowParamId,
358  &config.paramSetConfig, config.transferCompletionCallbackFxn, transferCompletionCallbackFxnArg);
359 
360 exit:
361  return(errorCode);
362 }
363 
364 int32_t EDMAutil_triggerType3(EDMA_Handle handle,
365  uint8_t *srcBuff,
366  uint8_t *dstBuff,
367  uint8_t chId,
368  uint8_t triggerEnabled)
369 {
370  int32_t errorCode = EDMA_NO_ERROR;
371 
372  if(srcBuff != NULL)
373  {
374  if ((errorCode = EDMA_setSourceAddress(handle, (uint16_t) chId,
375  (uint32_t) srcBuff)) != EDMA_NO_ERROR)
376  {
377  //System_printf("Error: EDMA_setSourceAddress() failed with error code = %d\n", errorCode);
378  goto exit;
379  }
380  }
381 
382  if(dstBuff != NULL)
383  {
384  if ((errorCode = EDMA_setDestinationAddress(handle, (uint16_t) chId,
385  (uint32_t) dstBuff)) != EDMA_NO_ERROR)
386  {
387  //System_printf("Error: EDMA_setDestinationAddress() failed with error code = %d\n", errorCode);
388  goto exit;
389  }
390  }
391 
392  if(triggerEnabled)
393  {
394  if ((errorCode = EDMA_startDmaTransfer(handle, chId)) != EDMA_NO_ERROR)
395  {
396  //System_printf("Error: EDMA_startTransfer() failed with error code = %d\n", errorCode);
397  goto exit;
398  }
399  }
400 
401 exit:
402  return(errorCode);
403 }
EDMAutil_configType2a
int32_t EDMAutil_configType2a(EDMA_Handle handle, uint8_t *srcBuff, uint8_t *dstBuff, uint8_t chId, bool isEventTriggered, uint16_t shadowParamId, uint16_t sampleLenInBytes, uint16_t numRangeBins, uint8_t numTxAnt, uint8_t numRxAnt, uint16_t numDopplerBins, uint8_t eventQueueId, EDMA_transferCompletionCallbackFxn_t transferCompletionCallbackFxn, uintptr_t transferCompletionCallbackFxnArg)
Definition: dss_config_edma_util.c:153
EDMAutil_triggerType3
int32_t EDMAutil_triggerType3(EDMA_Handle handle, uint8_t *srcBuff, uint8_t *dstBuff, uint8_t chId, uint8_t triggerEnabled)
Definition: dss_config_edma_util.c:364
EDMAutil_configType3
int32_t EDMAutil_configType3(EDMA_Handle handle, uint8_t *srcBuff, uint8_t *dstBuff, uint8_t chId, bool isEventTriggered, uint16_t shadowParamId, uint16_t aCount, uint16_t bCount, int16_t srcBIdx, int16_t destBIdx, uint8_t eventQueueId, EDMA_transferCompletionCallbackFxn_t transferCompletionCallbackFxn, uintptr_t transferCompletionCallbackFxnArg)
Definition: dss_config_edma_util.c:297
EDMA_setup_shadow_link
static int32_t EDMA_setup_shadow_link(EDMA_Handle handle, uint8_t chId, uint16_t shadowParamId, EDMA_paramSetConfig_t *config, EDMA_transferCompletionCallbackFxn_t transferCompletionCallbackFxn, uintptr_t transferCompletionCallbackFxnArg)
Definition: dss_config_edma_util.c:51
EDMAutil_configType2b
int32_t EDMAutil_configType2b(EDMA_Handle handle, uint8_t *srcBuff, uint8_t *dstBuff, uint8_t chId, bool isEventTriggered, uint16_t shadowParamId, uint16_t sampleLenInBytes, uint16_t numRangeBins, uint8_t numTxAnt, uint8_t numRxAnt, uint16_t numDopplerBins, uint8_t eventQueueId, EDMA_transferCompletionCallbackFxn_t transferCompletionCallbackFxn, uintptr_t transferCompletionCallbackFxnArg)
Definition: dss_config_edma_util.c:220
dss_config_edma_util.h
EDMA Configuration Utility API definitions.
MAX
#define MAX(x, y)
Definition: dss_config_edma_util.c:44
EDMAutil_configType1
int32_t EDMAutil_configType1(EDMA_Handle handle, uint8_t *srcBuff, uint8_t *dstBuff, uint8_t chId, bool isEventTriggered, uint16_t shadowParamId, uint16_t aCount, uint16_t bCount, int16_t srcBIdx, int16_t dstBIdx, uint8_t eventQueueId, EDMA_transferCompletionCallbackFxn_t transferCompletionCallbackFxn, uintptr_t transferCompletionCallbackFxnArg)
Definition: dss_config_edma_util.c:86