// so C-only code can reserve DMA channels | // so C-only code can reserve DMA channels | ||||
uint16_t dma_channel_allocated_mask = 0; | uint16_t dma_channel_allocated_mask = 0; | ||||
void DMAChannel::init(void) | |||||
void DMAChannel::begin(void) | |||||
{ | { | ||||
uint32_t ch = 0; | uint32_t ch = 0; | ||||
__disable_irq(); | __disable_irq(); | ||||
if (TCD && ch < DMA_NUM_CHANNELS | |||||
&& (dma_channel_allocated_mask & (1 << ch)) | |||||
&& (uint32_t)TCD == (0x40009000 + ch * 32)) { | |||||
// DMA channel already allocated | |||||
__enable_irq(); | |||||
return; | |||||
} | |||||
while (1) { | while (1) { | ||||
if (!(dma_channel_allocated_mask & (1 << ch))) { | if (!(dma_channel_allocated_mask & (1 << ch))) { | ||||
dma_channel_allocated_mask |= (1 << ch); | dma_channel_allocated_mask |= (1 << ch); |
// https://github.com/pixelmatix/SmartMatrix | // https://github.com/pixelmatix/SmartMatrix | ||||
// https://github.com/crteensy/DmaSpi | // https://github.com/crteensy/DmaSpi | ||||
#ifdef __cplusplus | #ifdef __cplusplus | ||||
#define DMACHANNEL_HAS_BEGIN | |||||
class DMABaseClass { | class DMABaseClass { | ||||
public: | public: | ||||
/*************************************************/ | /*************************************************/ | ||||
DMAChannel() { | DMAChannel() { | ||||
init(); | |||||
begin(); | |||||
} | } | ||||
DMAChannel(const DMAChannel &c) { | DMAChannel(const DMAChannel &c) { | ||||
TCD = c.TCD; | TCD = c.TCD; | ||||
channel = c.channel; | channel = c.channel; | ||||
} | } | ||||
DMAChannel(const DMASetting &c) { | DMAChannel(const DMASetting &c) { | ||||
init(); | |||||
begin(); | |||||
copy_tcd(TCD, c.TCD); | copy_tcd(TCD, c.TCD); | ||||
} | } | ||||
DMAChannel & operator = (const DMAChannel &rhs) { | DMAChannel & operator = (const DMAChannel &rhs) { | ||||
~DMAChannel() { | ~DMAChannel() { | ||||
release(); | release(); | ||||
} | } | ||||
void begin(void); | |||||
private: | private: | ||||
void init(void); | |||||
void release(void); | void release(void); | ||||
public: | public: |