Skip to content

Commit 58122d7

Browse files
feat(Other, PeriphDrivers): Add ADC support for Zephyr stream (#1404)
Signed-off-by: Dimitrije Lilic <dimitrije.lilic@orioninc.com>
1 parent 7826365 commit 58122d7

5 files changed

Lines changed: 77 additions & 0 deletions

File tree

Libraries/PeriphDrivers/Include/MAX32690/adc.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,20 @@ int MXC_ADC_StartConversion(void);
336336
*/
337337
int MXC_ADC_StartConversionAsync(mxc_adc_complete_cb_t callback);
338338

339+
/**
340+
* @brief Perform a stream conversion on a specific channel
341+
* @note The channel must be configured separately
342+
* The ADC interrupt must be enabled and MXC_ADC_Handler() called in the ISR
343+
* places data in the error parameter of the callback function
344+
* Has different flags but behaves same as MXC_ADC_StartConversionAsync.
345+
* Enables interrupts for FIFO level only and starts ADC in continuous mode.
346+
*
347+
* @param callback the function to call when the conversion is complete
348+
*
349+
* @return Success/Fail, see \ref MXC_Error_Codes for a list of return codes.
350+
*/
351+
int MXC_ADC_StartConversionAsyncStream(mxc_adc_complete_cb_t callback);
352+
339353
/**
340354
* @brief Perform a conversion on a specific channel using a DMA transfer.
341355
* DMA channel must be acquired using \ref MXC_DMA_AcquireChannel and should
@@ -361,6 +375,15 @@ int MXC_ADC_StartConversionDMA(mxc_adc_conversion_req_t *req, int *data,
361375

362376
int MXC_ADC_Handler(void);
363377

378+
/**
379+
* @brief Free the continous conversion resources.
380+
* @note Free the callback without need to change current
381+
* Revb Handler to keep backward compatibility.
382+
*
383+
* @param None
384+
*/
385+
void MXC_ADC_Free(void);
386+
364387
/**
365388
* @brief Selects the analog input divider.
366389
*

Libraries/PeriphDrivers/Source/ADC/adc_me18.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,11 @@ int MXC_ADC_StartConversionAsync(mxc_adc_complete_cb_t callback)
176176
return MXC_ADC_RevB_StartConversionAsync((mxc_adc_revb_regs_t *)MXC_ADC, callback);
177177
}
178178

179+
int MXC_ADC_StartConversionAsyncStream(mxc_adc_complete_cb_t callback)
180+
{
181+
return MXC_ADC_RevB_StartConversionAsyncStream((mxc_adc_revb_regs_t *)MXC_ADC, callback);
182+
}
183+
179184
int MXC_ADC_StartConversionDMA(mxc_adc_conversion_req_t *req, int *data, void (*callback)(int, int))
180185
{
181186
return MXC_ADC_RevB_StartConversionDMA((mxc_adc_revb_regs_t *)MXC_ADC, req, data, callback);
@@ -186,6 +191,11 @@ int MXC_ADC_Handler(void)
186191
return MXC_ADC_RevB_Handler((mxc_adc_revb_regs_t *)MXC_ADC);
187192
}
188193

194+
void MXC_ADC_Free(void)
195+
{
196+
MXC_ADC_RevB_Free((mxc_adc_revb_regs_t *)MXC_ADC);
197+
}
198+
189199
int MXC_ADC_GetData(int *outdata)
190200
{
191201
return MXC_ADC_RevB_GetData((mxc_adc_revb_regs_t *)MXC_ADC, outdata);

Libraries/PeriphDrivers/Source/ADC/adc_revb.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,26 @@ int MXC_ADC_RevB_StartConversionAsync(mxc_adc_revb_regs_t *adc, mxc_adc_complete
208208
return E_NO_ERROR;
209209
}
210210

211+
int MXC_ADC_RevB_StartConversionAsyncStream(mxc_adc_revb_regs_t *adc,
212+
mxc_adc_complete_cb_t callback)
213+
{
214+
if (callback == NULL) {
215+
return E_BAD_PARAM;
216+
}
217+
218+
adc->fifodmactrl |= MXC_F_ADC_REVB_FIFODMACTRL_FLUSH; //Flush data FIFO
219+
220+
MXC_ADC_RevB_ClearFlags(adc, ADC_IF_MASK);
221+
222+
while (MXC_GetLock((uint32_t *)&async_callback, (uint32_t)callback) != E_NO_ERROR) {}
223+
224+
MXC_ADC_RevB_EnableInt(adc, MXC_F_ADC_REVB_INTEN_FIFO_LVL);
225+
226+
adc->ctrl1 |= MXC_F_ADC_REVB_CTRL1_START | MXC_F_ADC_REVB_CTRL1_CNV_MODE;
227+
228+
return E_NO_ERROR;
229+
}
230+
211231
int MXC_ADC_RevB_StartConversionDMA(mxc_adc_revb_regs_t *adc, mxc_adc_conversion_req_t *req,
212232
int *data, void (*callback)(int, int))
213233
{
@@ -304,6 +324,17 @@ int MXC_ADC_RevB_Handler(mxc_adc_revb_regs_t *adc)
304324
return E_NO_ERROR;
305325
}
306326

327+
void MXC_ADC_RevB_Free(mxc_adc_revb_regs_t *adc)
328+
{
329+
if ((adc->ctrl1 & MXC_F_ADC_REVB_CTRL1_CNV_MODE)) {
330+
MXC_ADC_RevB_DisableInt(adc,
331+
(MXC_F_ADC_REVB_INTFL_SEQ_DONE | MXC_F_ADC_REVB_INTFL_CONV_DONE |
332+
MXC_F_ADC_REVB_INTEN_FIFO_LVL));
333+
334+
MXC_FreeLock((uint32_t *)&async_callback);
335+
}
336+
}
337+
307338
int MXC_ADC_RevB_GetData(mxc_adc_revb_regs_t *adc, int *outdata)
308339
{
309340
uint32_t loop_counter, length;

Libraries/PeriphDrivers/Source/ADC/adc_revb.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ int MXC_ADC_RevB_StartConversion(mxc_adc_revb_regs_t *adcq);
5959

6060
int MXC_ADC_RevB_StartConversionAsync(mxc_adc_revb_regs_t *adc, mxc_adc_complete_cb_t callback);
6161

62+
int MXC_ADC_RevB_StartConversionAsyncStream(mxc_adc_revb_regs_t *adc,
63+
mxc_adc_complete_cb_t callback);
64+
6265
int MXC_ADC_RevB_StartConversionDMA(mxc_adc_revb_regs_t *adc, mxc_adc_conversion_req_t *req,
6366
int *data, void (*callback)(int, int));
6467

@@ -74,6 +77,8 @@ void MXC_ADC_RevB_TS_SelectDisable(mxc_adc_revb_regs_t *adc);
7477

7578
int MXC_ADC_RevB_GetData(mxc_adc_revb_regs_t *adc, int *outdata);
7679

80+
void MXC_ADC_RevB_Free(mxc_adc_revb_regs_t *adc);
81+
7782
uint16_t MXC_ADC_RevB_FIFO_Level(mxc_adc_revb_regs_t *adc);
7883

7984
int MXC_ADC_RevB_FIFO_Threshold_Config(mxc_adc_revb_regs_t *adc, uint32_t fifo_threshold);

Libraries/zephyr/MAX/Include/wrap_max32_adc.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,14 @@ static inline int Wrap_MXC_ADC_StartConversionAsync(uint32_t *sample_channels,
284284
return MXC_ADC_StartConversionAsync(callback);
285285
}
286286

287+
static inline int Wrap_MXC_ADC_StartConversionAsyncStream(uint32_t *sample_channels,
288+
mxc_adc_complete_cb_t callback)
289+
{
290+
MXC_ADC_FIFO_Threshold_Config(MAX_ADC_FIFO_LEN >> 1);
291+
Wrap_MXC_ADC_ChannelSelect(sample_channels);
292+
return MXC_ADC_StartConversionAsyncStream(callback);
293+
}
294+
287295
static inline void Wrap_MXC_ADC_GetData(uint16_t **outdata)
288296
{
289297
mxc_adc_regs_t *adc = MXC_ADC;

0 commit comments

Comments
 (0)