First Version

Dependencies:   EthernetInterface mbed-rtos mbed

Drivers/dma.c

Committer:
rebonatto
Date:
2016-03-07
Revision:
3:94a128e0f316
Parent:
0:9df41090ba33

File content as of revision 3:94a128e0f316:

/*
 * dma.c
 *
 *  Created on: 03/07/2011
 *      Author: francisco
 */
#include <LPC17xx.h>
#include "dma.h"

#define LPC_GPDMACH          ((LPC_GPDMACH_TypeDef   **) LPC_GPDMACH0_BASE )

void init_dma()
{
    LPC_SC->PCONP |= 1<<29;     //Power GPDMA module

    LPC_GPDMA->DMACConfig = 1;  //Enable GPDMA

    //Clear any previous interrupts
    LPC_GPDMA->DMACIntTCClear = 0xFF;
    LPC_GPDMA->DMACIntErrClr = 0xFF;

    NVIC_SetPriority(DMA_IRQn,(1<<__NVIC_PRIO_BITS) - 1);
    NVIC_EnableIRQ(DMA_IRQn);
}

void setup_channel(dmaLinkedListNode* pList,int ch,int src,int dst)
{
    //Initialize the channel with previously configured LL;
    LPC_GPDMACH0->DMACCSrcAddr = pList->sourceAddr;
    LPC_GPDMACH0->DMACCDestAddr = pList->destAddr;
    LPC_GPDMACH0->DMACCControl = pList->dmaControl;
    LPC_GPDMACH0->DMACCLLI = (unsigned long int) pList & 0xFFFFFFFC; //Lower bits must be 0

    int transfer_type;
    if(src == DMA_MEMORY && dst != DMA_MEMORY)
    {
        transfer_type = DMA_MEMORY_TO_PERIPHERAL;
        src = 0;
    }
    else if(src != DMA_MEMORY && dst == DMA_MEMORY)
    {
        transfer_type = DMA_PERIPHERAL_TO_MEMORY;
        dst = 0;
    }
    else if(src == DMA_MEMORY && dst == DMA_MEMORY)
    {
        transfer_type = DMA_MEMORY_TO_MEMORY;
        src=dst = 0;
    }
    else if(src != DMA_MEMORY && dst != DMA_MEMORY)
        transfer_type = DMA_PERIPHERAL_TO_PERIPHERAL;

    //Set up all relevant bits
    LPC_GPDMACH0->DMACCConfig = (src<<1) | (dst<<5) | (transfer_type<<11) | (1<<15);

    //Finally, enable the channel -
    LPC_GPDMACH0->DMACCConfig |= 1<<0;
}

void stop_channel()
{
    LPC_GPDMACH0->DMACCConfig &= ~(1<<0);
}