65 lines
2.2 KiB
C
65 lines
2.2 KiB
C
/** @file dma_cbuf.h
|
|
* Module handling Direct Memory Access controller's circular system
|
|
*
|
|
* The module provides a convenient tool to receive data from a peripheral in a
|
|
* buffered, low-latency, low-cpu usage, non-blocking way
|
|
*/
|
|
|
|
#ifndef _DMA_CBUF_H_
|
|
#define _DMA_CBUF_H_
|
|
|
|
//--includes--------------------------------------------------------------------
|
|
|
|
#include "../drv/dma.h"
|
|
|
|
|
|
//--type definitions------------------------------------------------------------
|
|
|
|
/**
|
|
* Struct used by the circular buffer system. This system allows bufferized
|
|
* reads to a peripheral with no latency, minimal cpu usage and customisable
|
|
* buffer sizes
|
|
*/
|
|
struct DmaCircBuffer {
|
|
volatile void* buffer; //the buffer to use as a circular buffer
|
|
|
|
uint16_t size; //the size of the buffer
|
|
uint16_t begin; //pointer to the current begin of the buffer
|
|
|
|
enum DmaPeriph dma; //DMA peripheral used for transfers
|
|
enum DmaChannel channel; //DMA channel used for transfers
|
|
|
|
bool dma_looped; //whether the DMA looped or not (buffer overflow)
|
|
};
|
|
|
|
|
|
//--functions-------------------------------------------------------------------
|
|
|
|
/**
|
|
* Configure a DMA circular buffer for a single DMA channel. A standard buffer
|
|
* is used a base to construct a circular buffer, supplied in data by DMA
|
|
* tranfers from a peripheral.
|
|
* The peripheral's specific configuration must be handled separately.
|
|
* Each peripheral's driver is responsible for providing the DMA configuration
|
|
* for said peripheral, though it can be manually given too. Please note that
|
|
* multiple peripherals may share the same DMA channel, which will cause issue
|
|
* when used with this buffer.
|
|
*
|
|
* Once this function is called, the system will start running right away and
|
|
* will stay running until manually stopped
|
|
*/
|
|
void dma_cbuf_configure(volatile struct DmaCircBuffer* buffer,
|
|
const struct DmaParam* param, enum DmaConfig priority,
|
|
volatile void* raw_buffer, uint16_t buffer_size);
|
|
|
|
/**
|
|
* Reads a bytes from the buffer, returning if the read operation was
|
|
* successfull, 1 otherwise. This function is non-blocking.
|
|
*/
|
|
uint32_t dma_cbuf_read_byte(volatile struct DmaCircBuffer* buffer,
|
|
uint8_t* byte);
|
|
|
|
|
|
#endif //_DMA_CBUF_H_
|
|
|