A simple library to access the DMA functionality.

Fork of SimpleDMA by Erik -

Revision:
0:d77ea45fa625
Child:
1:0b73b00bcee8
diff -r 000000000000 -r d77ea45fa625 SimpleDMA.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SimpleDMA.h	Fri Oct 18 07:44:42 2013 +0000
@@ -0,0 +1,106 @@
+#ifndef SIMPLEDMA_H
+#define SIMPLEDMA_H
+
+#include "mbed.h"
+#include "SimpleDMA_KL25.h"
+
+
+/**
+* SimpleDMA, DMA made simple! (Okay that was bad)
+*
+* A class to easily make basic DMA operations happen. Not all features
+* of the DMA peripherals are used, but the main ones are: From and to memory
+* and peripherals, either continiously or triggered
+*/
+class SimpleDMA {
+public:
+SimpleDMA(int channel = 0);
+
+/**
+* Set the source of the DMA transfer
+*
+* Autoincrement increments the pointer after each transfer. If the source
+* is an array this should be true, if it is a peripheral or a single memory
+* location it should be false.
+*
+* The source can be any pointer to any memory location. Automatically
+* the wordsize is calculated depending on the type, if required you can
+* also override this.
+*
+* @param pointer - pointer to the memory location
+* @param autoinc - should the pointer be incremented by the DMA module
+* @param size - size of the transfer (optional, generally can be omitted)
+* @return - 0 on success
+*/
+template<typename Type>
+int source(Type* pointer, bool autoinc, int size = sizeof(Type*)) {
+    return setMemory((uint32_t)pointer, size, true, autoinc);
+}
+
+/**
+* Set the destination of the DMA transfer
+*
+* Autoincrement increments the pointer after each transfer. If the source
+* is an array this should be true, if it is a peripheral or a single memory
+* location it should be false.
+*
+* The destination can be any pointer to any memory location. Automatically
+* the wordsize is calculated depending on the type, if required you can
+* also override this.
+*
+* @param pointer - pointer to the memory location
+* @param autoinc - should the pointer be incremented by the DMA module
+* @param size - size of the transfer (optional, generally can be omitted)
+* @return - 0 on success
+*/
+template<typename Type>
+int destination(Type* pointer, bool autoinc, int size = sizeof(Type*)) {
+    return setMemory((uint32_t)pointer, size, false, autoinc);
+}
+
+/**
+* Set the trigger for the DMA operation
+*
+* In SimpleDMA_[yourdevice].h you can find the names of the different triggers.
+* Trigger_ALWAYS is defined for all devices, it will simply move the data
+* as fast as possible. Used for memory-memory transfers. If nothing else is set
+* that will be used by default.
+*
+* @param trig - trigger to use
+* @param return - 0 on success
+*/
+int trigger(SimpleDMA_Trigger trig);
+
+/**
+* Start the transfer
+*
+* @param length - number of BYTES to be moved by the DMA
+*/
+int start(int length);
+
+/**
+* Set the DMA channel
+*
+* @param chan - DMA channel to use
+*/
+void channel(int chan);
+
+/**
+* Is the DMA channel busy
+*
+* @return - true if it is busy
+*/
+bool isBusy( void );
+
+
+
+
+
+protected:
+int setMemory(uint32_t address, int wordsize, bool source, bool autoinc);
+int _channel;
+
+
+
+};
+#endif
\ No newline at end of file