projects
/
fw
/
altos
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
altosui: Fix the 'Graph' button on the landed tab
[fw/altos]
/
src
/
stm
/
ao_dma_stm.c
diff --git
a/src/stm/ao_dma_stm.c
b/src/stm/ao_dma_stm.c
index 785235a8023cfe94512ce35c5a34ef46c7201182..8379a1a533ca0ec5e19321910b1a9975a952f744 100644
(file)
--- a/
src/stm/ao_dma_stm.c
+++ b/
src/stm/ao_dma_stm.c
@@
-20,12
+20,13
@@
#define NUM_DMA 7
struct ao_dma_config {
#define NUM_DMA 7
struct ao_dma_config {
- void (*isr)(
void
);
+ void (*isr)(
int index
);
};
uint8_t ao_dma_done[NUM_DMA];
static struct ao_dma_config ao_dma_config[NUM_DMA];
};
uint8_t ao_dma_done[NUM_DMA];
static struct ao_dma_config ao_dma_config[NUM_DMA];
+static uint8_t ao_dma_allocated[NUM_DMA];
static uint8_t ao_dma_mutex[NUM_DMA];
static uint8_t ao_dma_active;
static uint8_t ao_dma_mutex[NUM_DMA];
static uint8_t ao_dma_active;
@@
-38,7
+39,7
@@
ao_dma_isr(uint8_t index) {
/* Ack them */
stm_dma.ifcr = isr;
if (ao_dma_config[index].isr)
/* Ack them */
stm_dma.ifcr = isr;
if (ao_dma_config[index].isr)
- (*ao_dma_config[index].isr)();
+ (*ao_dma_config[index].isr)(
index
);
else {
ao_dma_done[index] = 1;
ao_wakeup(&ao_dma_done[index]);
else {
ao_dma_done[index] = 1;
ao_wakeup(&ao_dma_done[index]);
@@
-60,7
+61,12
@@
ao_dma_set_transfer(uint8_t index,
uint16_t count,
uint32_t ccr)
{
uint16_t count,
uint32_t ccr)
{
- ao_mutex_get(&ao_dma_mutex[index]);
+ if (ao_dma_allocated[index]) {
+ if (ao_dma_mutex[index])
+ ao_panic(AO_PANIC_DMA);
+ ao_dma_mutex[index] = 1;
+ } else
+ ao_mutex_get(&ao_dma_mutex[index]);
ao_arch_critical(
if (ao_dma_active++ == 0)
stm_rcc.ahbenr |= (1 << STM_RCC_AHBENR_DMA1EN);
ao_arch_critical(
if (ao_dma_active++ == 0)
stm_rcc.ahbenr |= (1 << STM_RCC_AHBENR_DMA1EN);
@@
-73,7
+79,7
@@
ao_dma_set_transfer(uint8_t index,
}
void
}
void
-ao_dma_set_isr(uint8_t index, void (*isr)(
void
))
+ao_dma_set_isr(uint8_t index, void (*isr)(
int
))
{
ao_dma_config[index].isr = isr;
}
{
ao_dma_config[index].isr = isr;
}
@@
-93,13
+99,25
@@
ao_dma_done_transfer(uint8_t index)
if (--ao_dma_active == 0)
stm_rcc.ahbenr &= ~(1 << STM_RCC_AHBENR_DMA1EN);
);
if (--ao_dma_active == 0)
stm_rcc.ahbenr &= ~(1 << STM_RCC_AHBENR_DMA1EN);
);
- ao_mutex_put(&ao_dma_mutex[index]);
+ if (ao_dma_allocated[index])
+ ao_dma_mutex[index] = 0;
+ else
+ ao_mutex_put(&ao_dma_mutex[index]);
}
void
ao_dma_abort(uint8_t index)
{
stm_dma.channel[index].ccr &= ~(1 << STM_DMA_CCR_EN);
}
void
ao_dma_abort(uint8_t index)
{
stm_dma.channel[index].ccr &= ~(1 << STM_DMA_CCR_EN);
+ ao_wakeup(&ao_dma_done[index]);
+}
+
+void
+ao_dma_alloc(uint8_t index)
+{
+ if (ao_dma_allocated[index])
+ ao_panic(AO_PANIC_DMA);
+ ao_dma_allocated[index] = 1;
}
void
}
void
@@
-110,6
+128,8
@@
ao_dma_init(void)
for (index = 0; index < STM_NUM_DMA; index++) {
stm_nvic_set_enable(STM_ISR_DMA1_CHANNEL1_POS + index);
stm_nvic_set_priority(STM_ISR_DMA1_CHANNEL1_POS + index, 4);
for (index = 0; index < STM_NUM_DMA; index++) {
stm_nvic_set_enable(STM_ISR_DMA1_CHANNEL1_POS + index);
stm_nvic_set_priority(STM_ISR_DMA1_CHANNEL1_POS + index, 4);
+ ao_dma_allocated[index] = 0;
+ ao_dma_mutex[index] = 0;
}
}
}
}