summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Daniel <cd@maintech.de>2013-02-07 19:39:50 +0100
committerChristian Daniel <cd@maintech.de>2013-02-07 19:39:50 +0100
commit08ac2f7e4c2f4473c426fdf42635d737d8320b08 (patch)
treea1e907cb534bff7daf74c70338ebb486776c15ac
parentb4c4d46fb178e58b164068ecb62ead256180874e (diff)
DMA: half the size of the buffers, double the number
-rw-r--r--firmware/osmosdr-radioapp/src/driver/sdrmci.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/firmware/osmosdr-radioapp/src/driver/sdrmci.c b/firmware/osmosdr-radioapp/src/driver/sdrmci.c
index 92077a0..0af3aee 100644
--- a/firmware/osmosdr-radioapp/src/driver/sdrmci.c
+++ b/firmware/osmosdr-radioapp/src/driver/sdrmci.c
@@ -30,7 +30,7 @@
#include "../usb/usbdevice.h"
#include "../at91sam3u4/core_cm3.h"
-#define DMA_CTRLA (AT91C_HDMA_SRC_WIDTH_WORD | AT91C_HDMA_DST_WIDTH_WORD | AT91C_HDMA_SCSIZE_4 |AT91C_HDMA_DCSIZE_4)
+#define DMA_CTRLA (AT91C_HDMA_SRC_WIDTH_WORD | AT91C_HDMA_DST_WIDTH_WORD | AT91C_HDMA_SCSIZE_4 | AT91C_HDMA_DCSIZE_4 )
#define DMA_CTRLB (AT91C_HDMA_DST_DSCR_FETCH_FROM_MEM | \
AT91C_HDMA_DST_ADDRESS_MODE_INCR | \
AT91C_HDMA_SRC_DSCR_FETCH_DISABLE | \
@@ -41,11 +41,12 @@
#define CBTC(n) (1 << (8 + n))
#define ERR(n) (1 << (16 + n))
-__attribute__((section(".buffer"))) static u8 g_bufferSpace[8][2048];
+#define NUM_BUFFERS 16
+__attribute__((section(".buffer"))) static u8 g_bufferSpace[NUM_BUFFERS][1024];
typedef struct {
Bool running;
- DMABuffer dmaBuffer[8];
+ DMABuffer dmaBuffer[NUM_BUFFERS];
DMABufferQueue emptyQueue;
DMABufferQueue runningQueue;
uint overruns;
@@ -94,9 +95,12 @@ static void submitBuffer(DMABuffer* buffer)
void mci0_irqHandler(void)
{
- if(AT91C_BASE_MCI0->MCI_SR & AT91C_MCI_BLKOVRE) {
+ u32 sr = AT91C_BASE_MCI0->MCI_SR;
+ if(sr & AT91C_MCI_BLKOVRE) {
g_mciState.overruns++;
}
+ //AT91C_BASE_MCI0->MCI_SR = sr;
+ //dprintf("-%08x-\n", sr);
}
void hdma_irqHandler(void)
@@ -125,10 +129,10 @@ void sdrmci_configure(void)
g_mciState.running = False;
dmaBuffer_init(&g_mciState.emptyQueue);
dmaBuffer_init(&g_mciState.runningQueue);
- for(int i = 0; i < 8; i++) {
+ for(int i = 0; i < NUM_BUFFERS; i++) {
for(int j = 0; j < sizeof(g_bufferSpace[i]); j++)
g_bufferSpace[i][j] = 0x00;
- dmaBuffer_initBuffer(&g_mciState.dmaBuffer[i], g_bufferSpace[i], sizeof(g_bufferSpace[i]));
+ dmaBuffer_initBuffer(&g_mciState.dmaBuffer[i], g_bufferSpace[i], sizeof(g_bufferSpace[i]), i);
dmaBuffer_enqueue(&g_mciState.emptyQueue, &g_mciState.dmaBuffer[i]);
}
g_mciState.overruns = 0;
@@ -139,7 +143,8 @@ void sdrmci_configure(void)
pio_configure(mciPins, 6);
mci_configure(AT91C_BASE_MCI0, AT91C_ID_MCI0);
- mci_enableInterrupts(AT91C_BASE_MCI0, /*(1 << 21) | (1 << 22) |*/ (1 << 24) /*| (1 < 30)*/); // RCOE DTOE BLKOVRE OVRE
+ //mci_enableInterrupts(AT91C_BASE_MCI0, /*(1 << 21) | (1 << 22) |*/ (1 << 24) /*| (1 < 30)*/); // RCOE DTOE BLKOVRE OVRE
+ mci_enableInterrupts(AT91C_BASE_MCI0, AT91C_MCI_BLKOVRE|AT91C_MCI_BLKE);
irq_configure(AT91C_ID_MCI0, 0);
irq_enable(AT91C_ID_MCI0);