altos: Initialize DMA config address at boot time
authorKeith Packard <keithp@keithp.com>
Sun, 13 Nov 2011 02:31:46 +0000 (18:31 -0800)
committerKeith Packard <keithp@keithp.com>
Sun, 13 Nov 2011 02:31:46 +0000 (18:31 -0800)
Instead of resetting these each time a transfer is started, just set
them once at boot time.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/cc1111/ao_dma.c

index 6052964a5fb7e323445195488033da1216bb4b7c..ca33facb5e1807a85edd09f1f134cc627cf7b6de 100644 (file)
@@ -46,6 +46,10 @@ ao_dma_alloc(__xdata uint8_t *done)
                DMAIRQ = 0;
                DMAIF = 0;
                IEN1 |= IEN1_DMAIE;
+               DMA0CFGH = ((uint16_t) (&ao_dma_config[0])) >> 8;
+               DMA0CFGL = ((uint16_t) (&ao_dma_config[0]));
+               DMA1CFGH = ((uint16_t) (&ao_dma_config[1])) >> 8;
+               DMA1CFGL = ((uint16_t) (&ao_dma_config[1]));
        }
 
        return id;
@@ -69,13 +73,6 @@ ao_dma_set_transfer(uint8_t id,
        ao_dma_config[id].len_low = count;
        ao_dma_config[id].cfg0 = cfg0;
        ao_dma_config[id].cfg1 = cfg1 | DMA_CFG1_IRQMASK;
-       if (id == 0) {
-               DMA0CFGH = ((uint16_t) (&ao_dma_config[0])) >> 8;
-               DMA0CFGL = ((uint16_t) (&ao_dma_config[0]));
-       } else {
-               DMA1CFGH = ((uint16_t) (&ao_dma_config[1])) >> 8;
-               DMA1CFGL = ((uint16_t) (&ao_dma_config[1]));
-       }
 }
 
 #define nop()  _asm nop _endasm;
@@ -85,9 +82,11 @@ ao_dma_start(uint8_t id)
 {
        uint8_t mask = (1 << id);
        DMAIRQ &= ~mask;
-       DMAARM = 0x80 | mask;
-       nop(); nop(); nop(); nop();
-       nop(); nop(); nop(); nop();
+       if (DMAARM & mask) {
+               DMAARM = 0x80 | mask;
+               nop(); nop(); nop(); nop();
+               nop(); nop(); nop(); nop();
+       }
        *(ao_dma_done[id]) = 0;
        DMAARM = mask;
        nop(); nop(); nop(); nop();