Skip to content

File syn_dma.h

File List > drivers > syn_dma.h

Go to the documentation of this file

#ifndef SYN_DMA_H
#define SYN_DMA_H

#include "../common/syn_defs.h"
#include "../port/syn_port_dma.h"

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef enum {
    SYN_DMA_STATE_IDLE = 0,     
    SYN_DMA_STATE_BUSY = 1,     
    SYN_DMA_STATE_COMPLETE = 2, 
    SYN_DMA_STATE_ERROR = 3     
} SYN_DMA_State;

typedef enum {
    SYN_DMA_EVENT_HALF_COMPLETE = 0x01, 
    SYN_DMA_EVENT_COMPLETE = 0x02,      
    SYN_DMA_EVENT_ERROR = 0x04          
} SYN_DMA_Event;

struct SYN_DMA;

typedef void (*SYN_DMA_Callback)(struct SYN_DMA *dma, SYN_DMA_Event event, void *user_ctx);

typedef struct {
    uint8_t channel_id;        
    SYN_DMA_Direction dir;     
    SYN_DMA_Size data_size;    
    bool src_inc;              
    bool dst_inc;              
    SYN_DMA_Callback callback; 
    void *user_ctx;            
} SYN_DMA_Config;

typedef struct SYN_DMA {
    SYN_DMA_Config cfg;      
    SYN_DMA_State state;     
    const void *current_src; 
    void *current_dst;       
    size_t current_len;      
    uint32_t transfers_cnt;  
    uint32_t errors_cnt;     
} SYN_DMA;

SYN_Status syn_dma_init(SYN_DMA *dma, const SYN_DMA_Config *cfg);

SYN_Status syn_dma_start(SYN_DMA *dma, const void *src, void *dst, size_t count);

SYN_Status syn_dma_stop(SYN_DMA *dma);

SYN_DMA_State syn_dma_get_state(const SYN_DMA *dma);

void syn_dma_isr_handler(SYN_DMA *dma, SYN_DMA_Event event);

/* ── Circular DMA Ring Buffer Stream Receiver ────────────────────────────── */

typedef struct {
    SYN_DMA *dma;         
    uint8_t *buf;         
    size_t capacity;      
    volatile size_t tail; 
} SYN_DMA_RingBuf;

SYN_Status syn_dma_ringbuf_init(SYN_DMA_RingBuf *r, SYN_DMA *dma, uint8_t *buf, size_t capacity);

SYN_Status syn_dma_ringbuf_start(SYN_DMA_RingBuf *r, const void *periph_src);

size_t syn_dma_ringbuf_bytes_available(const SYN_DMA_RingBuf *r);

size_t syn_dma_ringbuf_read(SYN_DMA_RingBuf *r, uint8_t *dest, size_t len);

#ifdef __cplusplus
}
#endif

#endif /* SYN_DMA_H */