Fix fuctions to configure lli dmac.
authorasterix <asterix@38d2e660-2303-0410-9eaa-f027e97ec537>
Fri, 16 Sep 2011 12:34:31 +0000 (12:34 +0000)
committerasterix <asterix@38d2e660-2303-0410-9eaa-f027e97ec537>
Fri, 16 Sep 2011 12:34:31 +0000 (12:34 +0000)
git-svn-id: https://src.develer.com/svnoss/bertos/trunk@5056 38d2e660-2303-0410-9eaa-f027e97ec537

bertos/cpu/cortex-m3/drv/dmac_sam3.c
bertos/cpu/cortex-m3/drv/dmac_sam3.h

index d0b8128c0bc6e2b3c02953a113811a7e9e208c5f..621dc8487142c33376f26a3c8dad0e4a06740309 100644 (file)
@@ -115,23 +115,22 @@ static Event data_ready;
 static Dmac dmac[DMAC_CHANNEL_CNT];
 static uint8_t dmac_ch_enabled;
 
-void dmac_setSourcesLLI(int ch, DmacDesc *lli, uint32_t src, uint32_t dst, uint32_t desc)
+void dmac_configureDmacLLI(int ch, DmacDesc *lli, size_t transfer_size, uint32_t cfg, uint32_t ctrla, uint32_t ctrlb)
 {
-       ASSERT(lli);
        DMAC_CHDR = BV(ch);
 
-       lli->src_addr = src;
-       lli->dst_addr = dst;
-       lli->dsc_addr = desc;
+       *dmac_ch[ch].cfg = cfg | DMAC_CFG_FIFOCFG_ALAP_CFG | (0x1 << DMAC_CFG_AHB_PROT_SHIFT);
+       lli->ctrla = ctrla | (transfer_size & DMAC_CTRLA_BTSIZE_MASK);
+       lli->ctrlb = ctrlb;// & ~BV(DMAC_CTRLB_IEN);
+       *dmac_ch[ch].desc = (uint32_t)lli;
 }
 
-void dmac_configureDmacLLI(int ch, DmacDesc *lli, size_t transfer_size, uint32_t cfg, uint32_t ctrla, uint32_t ctrlb)
+
+void dmac_configureDmaCfgLLI(int ch, DmacDesc *lli, uint32_t cfg)
 {
        DMAC_CHDR = BV(ch);
 
        *dmac_ch[ch].cfg = cfg | DMAC_CFG_FIFOCFG_ALAP_CFG | (0x1 << DMAC_CFG_AHB_PROT_SHIFT);
-       lli->ctrla = ctrla | (transfer_size & DMAC_CTRLA_BTSIZE_MASK);
-       lli->ctrlb = ctrlb & ~BV(DMAC_CTRLB_IEN);
        *dmac_ch[ch].desc = (uint32_t)lli;
 }
 
@@ -207,27 +206,16 @@ int dmac_error(int ch)
 static DECLARE_ISR(dmac_irq)
 {
        uint32_t status = DMAC_EBCISR;
-       uint32_t irq_ch = (status & dmac_ch_enabled) & 0xFF;
-       //kprintf(" %08lx %08lx\n", status, irq_ch);
+       uint32_t irq_ch = (status & (((dmac_ch_enabled |
+                                                               (dmac_ch_enabled << DMAC_EBCIDR_ERR0) >> DMAC_EBCIDR_ERR0) |
+                                                               (dmac_ch_enabled << DMAC_EBCIDR_CBTC0) >> DMAC_EBCIDR_CBTC0) & 0xFF));
        if (irq_ch)
-               for(int i = 0; i < 8; i++)
+               for(int i = 0; i < 6; i++)
                {
                        if (BV(i) & irq_ch)
                                if(dmac[i].handler)
-                                       dmac[i].handler();
+                                       dmac[i].handler(status);
                }
-/*
-       irq_ch = (status & (dmac_ch_enabled << DMAC_EBCIDR_CBTC0)) >> DMAC_EBCIDR_CBTC0;
-       //kprintf("c %08lx %08lx\n", status, irq_ch);
-       if (irq_ch)
-               for(int i = 0; i < 8; i++)
-               {
-                       if (BV(i) & irq_ch)
-                               if(dmac[i].handler)
-                                       dmac[i].handler();
-               }
-*/
-
 }
 
 bool dmac_enableCh(int ch, dmac_handler_t handler)
@@ -238,7 +226,7 @@ bool dmac_enableCh(int ch, dmac_handler_t handler)
        if (handler)
        {
                dmac[ch].handler = handler;
-               DMAC_EBCIER |= (BV(ch) << DMAC_EBCIER_BTC0) | (BV(ch) << DMAC_EBCIDR_CBTC0);
+               DMAC_EBCIER |= (BV(ch) << DMAC_EBCIER_BTC0) | (BV(ch) << DMAC_EBCIDR_CBTC0) | (BV(ch) << DMAC_EBCIDR_ERR0);
                kprintf("Init dmac ch[%08lx]\n", DMAC_EBCIMR);
        }
 
index 2fb192df0952d5b601e6474f72273a01cd2d6bd0..0f7a08aeead6fdac98bda72ab51cb760f79280a6 100644 (file)
@@ -43,7 +43,7 @@
 #include <cpu/types.h>
 #include <drv/irq_cm3.h>
 
-typedef void (*dmac_handler_t)(void);
+typedef void (*dmac_handler_t)(uint32_t status);
 
 /**
  * DMA Transfer Descriptor as well as Linked List Item
@@ -67,6 +67,17 @@ typedef struct Dmac
 
 #define DMAC_ERR_CH_ALREDY_ON    BV(0)
 
+INLINE void dmac_setSourcesLLI(int ch, DmacDesc *lli, uint32_t src, uint32_t dst, uint32_t desc)
+{
+       ASSERT(lli);
+       DMAC_CHDR = BV(ch);
+
+       lli->src_addr = src;
+       lli->dst_addr = dst;
+       lli->dsc_addr = desc;
+}
+
+void dmac_configureDmaCfgLLI(int ch, DmacDesc *lli, uint32_t cfg);
 void dmac_setSourcesLLI(int ch, DmacDesc *lli, uint32_t src, uint32_t dst, uint32_t desc);
 void dmac_configureDmacLLI(int ch, DmacDesc *lli, size_t transfer_size, uint32_t cfg, uint32_t ctrla, uint32_t ctrlb);
 bool dmac_isLLIDone(int ch);