Forwarding for archive :-
Thanks Vasiliev - glad working ok now.
Cheers,
~roger

-----Original Message-----
From: Alexander Vasiliev [mailto:[EMAIL PROTECTED] 
Sent: 24 January 2008 15:10
To: Monk, Roger
Subject: Re: DMA transfer from ARM RAM

Thank you, Roger.
Now it works well.


2008/1/24, Monk, Roger <[EMAIL PROTECTED]>:
> Hi Vasiliev,
>
> Can you try enabling the TCM memories (via ARM CP15) and let me know
> please?
>
> /* Set CP15 to enable the DTCM and ITCM */
> static void enable_tcm_cp15 (void)
> {
>         asm ("mov R0, #0x8\n"
>            "mov R0, R0, lsl #12 \n"
>            "orr R0, R0, #0x15\n"
>            "mcr p15, 0, R0, c9, c1, 0 \n"
>            "mov R0, #0x0000\n"
>            "orr R0, R0, #0x1\n"
>            "mcr p15, 0, R0, c9, c1, 1" : : );
>       return;
> }
>
> ~roger
>
> -----Original Message-----
> From: [EMAIL PROTECTED]
> [mailto:[EMAIL PROTECTED] On
> Behalf Of Alexander Vasiliev
> Sent: 24 January 2008 13:54
> To: davinci-linux-open-source@linux.davincidsp.com
> Subject: DMA transfer from ARM RAM
>
> Hello,
>
> I want to use EDMA during booting. So i am testing data transfer from
> ARM RAM to DRR2. Copying from DRR to arm goes fine. But during copying
> from arm to ddr2, every (29-31)th bytes are broken. Any ideas?
>
> As the base application i use spraai0-application. Here is the patch
for
> it:
>
> diff -uNr uartapp/dm644x.h Quartapp/dm644x.h
> --- uartapp/dm644x.h    2006-11-15 13:39:28.000000000 +0300
> +++ Quartapp/dm644x.h   2008-01-24 15:33:09.000000000 +0300
> @@ -180,6 +180,72 @@
>  #define DDR_TEST_PATTERN 0xA55AA55Au
>  #define DDR_RAM_SIZE 0x10000000u
>
>
+/*---------------------------------------------------------------------
> -------
> +DMA register structure
>
+-----------------------------------------------------------------------
> -------*/
> +
> +#define DMA_REG_BASE           0x01C00000
> /*base for dma registers*/
> +
> +#define PARAM_SET_BASE         (DMA_REG_BASE + 0x4000)
> /*base for PaRAM sets*/
> +#define PARAM_SET_OFFSET       0x20
> /*offset between PaRAM stes*/
> +#define PARAM_SET(n)           (PARAM_SET_BASE + n *
PARAM_SET_OFFSET)
> /*PaRAM set n*/
> +
> +#define DMA_DRAE                       (0x0340 + DMA_REG_BASE)
> /*Region access
> enable. low part*/
> +#define DMA_DRAE_H                     (0x0344 + DMA_REG_BASE)
> /*Region access
> enable*. high part*/
> +
> +#define DMA_IPR                                (0x1068 +
DMA_REG_BASE)
> /*Interrupt pending
> register. low part*/
> +#define DMA_IPR_H                      (0x106C + DMA_REG_BASE)
> /*Interrupt pending
> register. high part*/
> +
> +#define DMA_EMR                                (0x0300 +
DMA_REG_BASE)
> /*Event missed. low part*/
> +#define DMA_EMR_H                      (0x0304 + DMA_REG_BASE)
> /*Event missed. high part*/
> +
> +#define DMA_CCERR                      (0x0318 + DMA_REG_BASE)
> /*Error*/
> +
> +#define DMA_SER                                (0x1038 +
DMA_REG_BASE)
> /*Secondary event. low part*/
> +#define DMA_SER_H                      (0x103C + DMA_REG_BASE)
> /*Secondary event. high part*/
> +
> +#define DMA_SECR                       (0x1040 + DMA_REG_BASE)
> /*Secondary event
> clear. low part*/
> +#define DMA_SECR_H                     (0x1044 + DMA_REG_BASE)
> /*Secondary event
> clear. high part*/
> +
> +#define DMA_ICR                                (0x1070 +
DMA_REG_BASE)
> /*Interrupt clear
> register. low pert*/
> +#define DMA_ICR_H                      (0x1074 + DMA_REG_BASE)
> /*Interrupt clear
> register. high part*/
> +
> +#define DMA_IESR                       (0x1060 + DMA_REG_BASE)
> /*Interrupt set
> enable. low part*/
> +#define DMA_IESR_H                     (0x1064 + DMA_REG_BASE)
> /*Interrupt set
> enable. high part*/
> +
> +#define DMA_ESR                                (0x1010 +
DMA_REG_BASE)
> /*Event set. low part*/
> +#define DMA_ESR_H                      (0x1014 + DMA_REG_BASE)
> /*Event set. high part*/
> +
> +#define DMA_IPR_0                      (0x2068 + DMA_REG_BASE)
> /*Interrupt pending
> register. low part. region 0*/
> +#define DMA_IPR_H_0                    (0x206C + DMA_REG_BASE)
> /*Interrupt pending
> register. high part. region 0*/
> +
> +#define DMA_ICR_0                      (0x2070 + DMA_REG_BASE)
> /*Interrupt clear
> register. low pert. region 0*/
> +#define DMA_ICR_H_0                    (0x2074 + DMA_REG_BASE)
> /*Interrupt clear
> register. high part. region 0*/
> +
> +#define DMA_IER_0                      (0x2050 + DMA_REG_BASE)
> /*Interrupt enable.
> low part. region 0*/
> +#define DMA_IER_H_0                    (0x2054 + DMA_REG_BASE)
> /*Interrupt enable.
> high part. region 0*/
> +
> +#define DMA_IESR_0                     (0x2060 + DMA_REG_BASE)
> /*Interrupt set
> enable. low part. region 0*/
> +#define DMA_IESR_H_0           (0x2064 + DMA_REG_BASE)
> /*Interrupt set
> enable. high part. region 0*/
> +
> +#define DMA_ESR_0                      (0x2010 + DMA_REG_BASE)
> /*Event set. low
> part. region 0*/
> +#define DMA_ESR_H_0                    (0x2014 + DMA_REG_BASE)
> /*Event set. high
> part. region 0*/
> +
> +typedef struct _dma_regs_
> +{
> +       volatile unsigned int   OPT;
> +       volatile unsigned int   SRC;
> +       volatile unsigned int   BCNT_ACNT;
> +       volatile unsigned int   DST;
> +       volatile unsigned int   DSTBIDX_SRCBIDX;
> +       volatile unsigned int   BCTNRDL_LINK;
> +       volatile unsigned int   DSTCIDX_SRCCIDX;
> +       volatile unsigned int   CCNT_Rsvd;
> +} dmaRegs;
> +
> +#define DMA_PARAM_SET_N(n)     ((dmaRegs*)PARAM_SET(n))
> +
> +#define DDR_MEM_BASE   0x80000000u
>
>  /*
>
------------------------------------------------------------------------
> -- *
>   *    AEMIF Register structure - See sprue20a.pdf for more details.
> *
> diff -uNr uartapp/uartapp.c Quartapp/uartapp.c
> --- uartapp/uartapp.c   2006-11-15 15:41:08.000000000 +0300
> +++ Quartapp/uartapp.c  2008-01-24 15:58:56.000000000 +0300
> @@ -66,6 +66,129 @@
>       return E_PASS;
>  }
>
> +#define DMA_TO_ARM
> +/*#define DMA_FROM_ARM*/
> +
> +#define SET_REGISTER(rg, vl) (*(unsigned int*)rg) = vl;
> +
> +unsigned int DMATest(void)
> +{
> +       const unsigned int value = 0x55AA55AA;
> +       const unsigned int startPoint = 0;
> +       const unsigned int  startPoint2 = 1024;
> +       const int size = 512;
> +       const int set = 0;      /*Number of PaRAM set*/
> +
> +       unsigned int res = E_PASS;
> +       int i = 0, j = 0;
> +       volatile unsigned int array[size];
> +       volatile unsigned int array2[size];
> +
> +#ifdef DMA_FROM_ARM
> +       for(i = 0; i < size; i++)
> +               array[i] = value;
> +#else
> +       for(i = startPoint2; i < size + startPoint2; i++)
> +               DDRMem[i] = value;
> +#endif
> +#ifdef DMA_TO_ARM
> +       for(i = 0; i < size; i++)
> +               array2[i] = 0;
> +#else
> +       for(i = startPoint; i < size + startPoint; i++)
> +               DDRMem[i] = 0;
> +#endif
> +
> +       UARTSendData("\r\nStarting DMA test. ");
> +#ifdef DMA_TO_ARM
> +       UARTSendData("To ARM ");
> +#else
> +       UARTSendData("To DDR2 ");
> +#endif
> +#ifdef DMA_FROM_ARM
> +       UARTSendData("from ARM");
> +#else
> +       UARTSendData("from DDR2");
> +#endif
> +
> +       // Enable interrupt
> +       SET_REGISTER(DMA_IESR, 1 << set)
> +
> +       i = 10; while(i > 0){asm (" NOP");i--;}
> +
> +       // Set PaRAM
> +       DMA_PARAM_SET_N(set)->OPT = 0x00100008u;
> // Non static,
> completion interrupt enabled
> +       DMA_PARAM_SET_N(set)->BCNT_ACNT = 0x00010000u | size * 4;
> // BCNT =
> 1; ACNT = size * 4
> +       DMA_PARAM_SET_N(set)->BCTNRDL_LINK = 0xFFFFu;
> // No link
> +       DMA_PARAM_SET_N(set)->CCNT_Rsvd = 0x1u;
> // CCNT = 1
> +#ifdef DMA_FROM_ARM
> +       DMA_PARAM_SET_N(set)->SRC = (unsigned int)array;
> // Source
> +#else
> +       DMA_PARAM_SET_N(set)->SRC = DDR_MEM_BASE + startPoint2 * 4;
> // Source
> +#endif
> +#ifdef DMA_TO_ARM
> +       DMA_PARAM_SET_N(set)->DST = (unsigned int)array2;
> // Destination
> +#else
> +       DMA_PARAM_SET_N(set)->DST = DDR_MEM_BASE + startPoint * 4;
> // Destination
> +#endif
> +
> +       i = 10; while(i > 0){asm (" NOP");i--;} /*without this it
> hangs*/
> +
> +       /* Start transfer*/
> +       SET_REGISTER(DMA_ESR, 1 << set)
> +
> +       UARTSendData("\r\nEnter loop.");
> +       while(!(*(unsigned int*)DMA_IPR))
> +       {
> +               asm (" NOP");
> +       }
> +
> +       UARTSendData("\r\nError status = ");
> +       UARTSendInt((*(unsigned int*)DMA_CCERR));
> +       UARTSendData("\r\nMissed events = ");
> +       UARTSendInt((*(unsigned int*)DMA_EMR));
> +       UARTSendData("\r\nMissed events (H) = ");
> +       UARTSendInt((*(unsigned int*)DMA_EMR_H));
> +
> +       UARTSendData("\r\nChecking...");
> +#ifdef DMA_TO_ARM
> +       for(i = 0; i < size; i++)
> +       {
> +               if(array2[i] != value)
> +               {
> +                       UARTSendData("\r\nTest failed at ");
> +                       UARTSendInt((unsigned int)i);
> +                       UARTSendData(" value = ");
> +                       UARTSendInt(array2[i]);
> +                       res = E_FAIL;
> +                       if(array2[i] == 0)
> +                       {
> +                               UARTSendData("\r\nZero");
> +                               break;
> +                       }
> +               }
> +       }
> +#else
> +       for(i = startPoint, j = 0; i < size + startPoint; i++, j++)
> +       {
> +               if(DDRMem[i] != value)
> +               {
> +                       UARTSendData("\r\nTest failed at ");
> +                       UARTSendInt((unsigned int)j);
> +                       UARTSendData(" value = ");
> +                       UARTSendInt(DDRMem[i]);
> +                       res = E_FAIL;
> +                       if(DDRMem[i] == 0)
> +                       {
> +                               UARTSendData("\r\nZero");
> +                               break;
> +                       }
> +               }
> +       }
> +#endif
> +       return res;
> +}
> +
>  void aemif_start()
>  {
>         asm (" NOP");   //needed to prevent compiler optimizing away
> @@ -89,6 +212,7 @@
>         UARTSendData("\t1) Print Hello World!.\r\n");
>         UARTSendData("\t2) Initialize and test DDR RAM.\r\n");
>         UARTSendData("\t3) Boot out of NOR flash.\r\n");
> +       UARTSendData("\t4) Test DMA.\r\n");
>
>         UARTSendData("\n\tEnter selection followed by <Enter>: ");
>         while (UARTRecvData(2,inData) != E_PASS);
> @@ -107,6 +231,12 @@
>            case (3):
>                 aemif_start();
>                 break;
> +                 case (4):
> +                         if(DMATest() == E_PASS)
> +                                 UARTSendData("\r\nDMA Test Passed");
> +                         else
> +                                 UARTSendData("\r\nDMA Test Failed");
> +                         break;
>            default:
>                 UARTSendData("\r\nInvalid Selection!\r\n");
>                 break;
> diff -uNr uartapp/uartapp.h Quartapp/uartapp.h
> --- uartapp/uartapp.h   2006-11-15 15:41:10.000000000 +0300
> +++ Quartapp/uartapp.h  2008-01-24 15:31:59.000000000 +0300
> @@ -13,6 +13,7 @@
>  void aemif_start( void ) __attribute__((naked,section(".aemif")));
>
>  unsigned int DDRTest(void);
> +unsigned int DMATest(void);
>
>  int uartapp_main( void );
> _______________________________________________
> Davinci-linux-open-source mailing list
> Davinci-linux-open-source@linux.davincidsp.com
> http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source
>
_______________________________________________
Davinci-linux-open-source mailing list
Davinci-linux-open-source@linux.davincidsp.com
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to