|
@@ -11,80 +11,130 @@
|
|
|
#include <unicore-mx/stm32/gpio.h>
|
|
|
#include <unicore-mx/stm32/rcc.h>
|
|
|
#include <unicore-mx/stm32/timer.h>
|
|
|
+#include <stdlib.h>
|
|
|
#include "pot.h"
|
|
|
+#include "timer.h"
|
|
|
+#include "system.h"
|
|
|
|
|
|
-#define DAC_BUFSIZ 512
|
|
|
+#define DAC_BUFSIZ (512)
|
|
|
+#define DAC_MEMSIZ (4 * DAC_BUFSIZ)
|
|
|
extern const unsigned char raw_au[];
|
|
|
+extern volatile uint32_t jiffies;
|
|
|
const unsigned int raw_au_len;
|
|
|
|
|
|
-static volatile int dac_written;
|
|
|
static int dac_transfer_size;
|
|
|
-static int dac_chunk_size;
|
|
|
-static uint8_t dac_outb[DAC_BUFSIZ];
|
|
|
+
|
|
|
+static uint8_t dac_memory[DAC_MEMSIZ];
|
|
|
+static volatile uint32_t dac_written;
|
|
|
+
|
|
|
+
|
|
|
+static volatile int direct = 0;
|
|
|
+static volatile int dac_busy = 0;
|
|
|
+
|
|
|
+int dac_is_busy(void)
|
|
|
+{
|
|
|
+ return dac_busy;
|
|
|
+}
|
|
|
|
|
|
static void dac_xmit(void)
|
|
|
{
|
|
|
uint32_t size = DAC_BUFSIZ;
|
|
|
- if ((dac_transfer_size - dac_written ) < size)
|
|
|
- size = dac_transfer_size - dac_written;
|
|
|
- dac_chunk_size = size;
|
|
|
+ if ((dac_transfer_size == 0) || (dac_written >= dac_transfer_size)) {
|
|
|
+ dac_written = 0;
|
|
|
+ dac_transfer_size = 0;
|
|
|
+ memset(dac_memory, 0, DAC_MEMSIZ);
|
|
|
+ } else {
|
|
|
+ if ((dac_transfer_size - dac_written) < size)
|
|
|
+ size = dac_transfer_size - dac_written;
|
|
|
+ if (size == 0) {
|
|
|
+ dac_transfer_size = 0;
|
|
|
+ dac_written = 0;
|
|
|
+ memset(dac_memory, 0, DAC_MEMSIZ);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (dac_transfer_size == 0) {
|
|
|
+ dma_disable_stream(DMA1, DMA_STREAM5);
|
|
|
+ dac_trigger_disable(CHANNEL_1);
|
|
|
+ dac_dma_disable(CHANNEL_1);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ dma_set_number_of_data(DMA1, DMA_STREAM5, size);
|
|
|
+ dma_set_memory_address(DMA1, DMA_STREAM5, (uint32_t)(dac_memory + dac_written));
|
|
|
+ direct = 0;
|
|
|
|
|
|
/* Start DMA transfer of waveform */
|
|
|
dac_trigger_enable(CHANNEL_1);
|
|
|
dac_set_trigger_source(DAC_CR_TSEL1_T2);
|
|
|
dac_dma_enable(CHANNEL_1);
|
|
|
- dma_set_memory_address(DMA1, DMA_STREAM5, (uint32_t) (dac_outb + dac_written));
|
|
|
- dma_set_number_of_data(DMA1, DMA_STREAM5, size);
|
|
|
dma_enable_transfer_complete_interrupt(DMA1, DMA_STREAM5);
|
|
|
dma_channel_select(DMA1, DMA_STREAM5, DMA_SxCR_CHSEL_7);
|
|
|
dma_enable_stream(DMA1, DMA_STREAM5);
|
|
|
}
|
|
|
|
|
|
-int dac_write(const void *buf, unsigned int len)
|
|
|
-{
|
|
|
- if (dac_written < dac_transfer_size) {
|
|
|
- if ((len + dac_transfer_size) > DAC_BUFSIZ)
|
|
|
- return 0;
|
|
|
- }
|
|
|
- if (dac_written >= dac_transfer_size) {
|
|
|
- dac_written = 0;
|
|
|
- dac_transfer_size = 0;
|
|
|
- }
|
|
|
- memcpy(dac_outb + dac_transfer_size, buf, len);
|
|
|
- dac_transfer_size += len;
|
|
|
- dac_xmit();
|
|
|
- return dac_written;
|
|
|
-}
|
|
|
+
|
|
|
|
|
|
int dac_space(void)
|
|
|
{
|
|
|
- if (dac_written >= dac_transfer_size) {
|
|
|
- dac_written = 0;
|
|
|
- dac_transfer_size = 0;
|
|
|
- }
|
|
|
- return DAC_BUFSIZ - dac_transfer_size;
|
|
|
+ return DAC_MEMSIZ - dac_transfer_size;
|
|
|
}
|
|
|
|
|
|
|
|
|
+
|
|
|
+
|
|
|
/* IRQ Handler */
|
|
|
void dma1_stream5_isr(void)
|
|
|
{
|
|
|
if (dma_get_interrupt_flag(DMA1, DMA_STREAM5, DMA_TCIF)) {
|
|
|
- if (dac_written < dac_transfer_size)
|
|
|
- dac_written += dac_chunk_size;
|
|
|
-
|
|
|
dma_clear_interrupt_flags(DMA1, DMA_STREAM5, DMA_TCIF);
|
|
|
dma_disable_stream(DMA1, DMA_STREAM5);
|
|
|
dac_trigger_disable(CHANNEL_1);
|
|
|
dac_dma_disable(CHANNEL_1);
|
|
|
- if (dac_written >= dac_transfer_size) {
|
|
|
- return;
|
|
|
- } else {
|
|
|
+ dac_busy = 0;
|
|
|
+ if (!direct) {
|
|
|
+ if (dac_written < dac_transfer_size) {
|
|
|
+ dac_written += DAC_BUFSIZ;
|
|
|
+ } else {
|
|
|
+ dac_written = 0;
|
|
|
+ dac_transfer_size = 0;
|
|
|
+ return;
|
|
|
+ }
|
|
|
dac_xmit();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void dac_stop(void)
|
|
|
+{
|
|
|
+ dma_clear_interrupt_flags(DMA1, DMA_STREAM5, DMA_TCIF);
|
|
|
+ dma_disable_stream(DMA1, DMA_STREAM5);
|
|
|
+ dac_trigger_disable(CHANNEL_1);
|
|
|
+ dac_dma_disable(CHANNEL_1);
|
|
|
+ dac_busy = 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+void dac_play_direct(uint8_t *mem, uint32_t size)
|
|
|
+{
|
|
|
+ dma_clear_interrupt_flags(DMA1, DMA_STREAM5, DMA_TCIF);
|
|
|
+ dma_disable_stream(DMA1, DMA_STREAM5);
|
|
|
+ dac_trigger_disable(CHANNEL_1);
|
|
|
+ dac_dma_disable(CHANNEL_1);
|
|
|
+ dma_set_number_of_data(DMA1, DMA_STREAM5, size);
|
|
|
+ dma_set_memory_address(DMA1, DMA_STREAM5, (uint32_t)mem);
|
|
|
+
|
|
|
+ direct = 1;
|
|
|
+ dac_busy = 1;
|
|
|
+
|
|
|
+ /* Start DMA transfer of waveform */
|
|
|
+ dac_trigger_enable(CHANNEL_1);
|
|
|
+ dac_set_trigger_source(DAC_CR_TSEL1_T2);
|
|
|
+ dac_dma_enable(CHANNEL_1);
|
|
|
+ dma_enable_transfer_complete_interrupt(DMA1, DMA_STREAM5);
|
|
|
+ dma_channel_select(DMA1, DMA_STREAM5, DMA_SxCR_CHSEL_7);
|
|
|
+ dma_enable_stream(DMA1, DMA_STREAM5);
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
/* Initialization functions */
|
|
|
|
|
@@ -147,28 +197,57 @@ static void dac_hw_init(data_channel c)
|
|
|
dac_enable(c);
|
|
|
}
|
|
|
|
|
|
+void dac_reset(void)
|
|
|
+{
|
|
|
+ dac_written = 0;
|
|
|
+ dac_transfer_size = 0;
|
|
|
+}
|
|
|
+
|
|
|
void dac_play(const uint8_t *buf, int len)
|
|
|
{
|
|
|
int i = 0;
|
|
|
int space;
|
|
|
- while(i < len) {
|
|
|
- space = dac_space();
|
|
|
- if (space > 0) {
|
|
|
- if (space > (len - i))
|
|
|
- space = len - i;
|
|
|
- dac_write(buf + i, space);
|
|
|
- i += space;
|
|
|
+ int w = 0;
|
|
|
+ dac_written = 0;
|
|
|
+ dac_transfer_size = 0;
|
|
|
+ while (len > 0) {
|
|
|
+ space = DAC_MEMSIZ;
|
|
|
+ if (space > len) {
|
|
|
+ space = len;
|
|
|
+ }
|
|
|
+ if (dac_space() == 0) {
|
|
|
+ WFI();
|
|
|
+ continue;
|
|
|
}
|
|
|
+ memcpy(dac_memory, buf + w, space);
|
|
|
+ dac_transfer_size = space;
|
|
|
+ dac_xmit();
|
|
|
+ len -= space;
|
|
|
+ w += space;
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|
|
|
+extern unsigned char drumkit_0_au[];
|
|
|
+extern unsigned char drumkit_1_au[];
|
|
|
+extern unsigned char drumkit_2_au[];
|
|
|
+extern unsigned int drumkit_0_au_len;
|
|
|
+extern unsigned int drumkit_1_au_len;
|
|
|
+extern unsigned int drumkit_2_au_len;
|
|
|
+
|
|
|
+
|
|
|
int dac_init(void)
|
|
|
{
|
|
|
int i;
|
|
|
+ uint32_t now;
|
|
|
dac_hw_init(CHANNEL_1);
|
|
|
dac_dma_setup();
|
|
|
- pot_set_master(200);
|
|
|
- dac_play(raw_au, raw_au_len);
|
|
|
+ pot_set_master(100);
|
|
|
+
|
|
|
+// dac_play(drumkit_0_au, drumkit_0_au_len);
|
|
|
+// dac_play(raw_au, raw_au_len);
|
|
|
+ dac_play_direct(drumkit_2_au, drumkit_2_au_len);
|
|
|
+ while(dac_is_busy())
|
|
|
+ WFI();
|
|
|
+
|
|
|
return 0;
|
|
|
}
|