#include "dma.h"



void dma_events_disable_all()
{
    /* Event enable clear registers */
    EECRH = 0xFFFFFFFF;
    EECRL = 0xFFFFFFFF;
    QEECR = 0xFF;
}


void dma_events_clear_all()
{
    /* Event clear registers */
    ECRH = 0xFFFFFFFF;
    ECRL = 0xFFFFFFFF;
}


void dma_completions_clear_all()
{
    /* Pending interrupt clear register */
    CICRH = 0xFFFFFFFF;
    CICRL = 0xFFFFFFFF;
}


void dma_reset()
{
    dma_events_disable_all();
    dma_events_clear_all();
    dma_completions_clear_all();
}

void dma_channel_init(const dma_params_t *params)
{
    pEDMA chan = &((pEDMA)params->channels)[params->channel];

    uint32_t options = 0;

    options |= params->static_params ? EDMA3_OPT_STATIC : 0;
    options |= params->sync_AB ? EDMA3_OPT_SYNC_AB : 0;
    options |= params->chain_on_complete ? EDMA3_OPT_TCCHEN : 0;
    options |= params->chain_intermediate ? EDMA3_OPT_ITCCHEN : 0;
    options |= params->interrupt_on_complete ? EDMA3_OPT_INTCHEN : 0;
    options |= EDMA3_TCC(params->completion_code);

    chan->OPT = options;
    chan->SRC = params->src;
    chan->BACNT = (params->b_count << 16) | params->a_count;
    chan->DST = params->dst;
    chan->BIDX = ((uint16_t)params->bidx_dst << 16) |
                  (uint16_t)params->bidx_src;
    chan->RLDLNK = params->b_count_reload << 16 |
                   (params->link != EDMA3_NO_LINK ?
                        EDMA3_LINK_CHANNEL(params->link) :
                        EDMA3_NO_LINK);
    chan->CIDX = ((uint16_t)params->cidx_dst << 16) |
                  (uint16_t)params->cidx_src;
    chan->CCNT = params->c_count;
}
