A simple library to access the DMA functionality.
Fork of SimpleDMA by
Diff: SimpleDMA.h
- Revision:
- 0:d77ea45fa625
- Child:
- 1:0b73b00bcee8
--- /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