1 | /**************************************************************************
|
2 | * Includes
|
3 | *************************************************************************/
|
4 | #include "lpc2478.h" /* LPC23xx/24xx definitions */
|
5 | #include "dma.h"
|
6 | #include "irq.h"
|
7 |
|
8 | volatile U32 DMATCCount = 0;
|
9 | volatile U32 DMAErrCount = 0;
|
10 |
|
11 | volatile U32 llist[37][4];
|
12 |
|
13 |
|
14 | /**************************************************************************
|
15 | ** Function name: DMAHandler
|
16 | **
|
17 | ** Descriptions: DMA interrupt handler
|
18 | **
|
19 | ** parameters: None
|
20 | ** Returned value: None
|
21 | **************************************************************************/
|
22 | void DMAHandler (void) __irq
|
23 | {
|
24 | U32 regVal;
|
25 |
|
26 | regVal = GPDMA_INT_TCSTAT;
|
27 | if ( regVal )
|
28 | {
|
29 | DMATCCount++;
|
30 | GPDMA_INT_TCCLR |= regVal;
|
31 | }
|
32 |
|
33 | regVal = GPDMA_INT_ERR_STAT;
|
34 | if ( regVal )
|
35 | {
|
36 | DMAErrCount++;
|
37 | GPDMA_INT_ERR_CLR |= regVal;
|
38 | }
|
39 |
|
40 | VICVectAddr = 0; /* Acknowledge Interrupt */
|
41 | }
|
42 |
|
43 | /**************************************************************************
|
44 | ** Function name: DMA_Init
|
45 | **
|
46 | ** Descriptions:
|
47 | **
|
48 | ** parameters:
|
49 | ** Returned value:
|
50 | **************************************************************************/
|
51 | U8 DMA_Init( U8 DMAMode )
|
52 | {
|
53 |
|
54 | U8 i;
|
55 | PCONP |= (1 << 29); /* Enable GPDMA clock */
|
56 |
|
57 | /* clear all interrupts on channel 0 */
|
58 | GPDMA_INT_TCCLR = 0x01;
|
59 | GPDMA_INT_ERR_CLR = 0x01;
|
60 |
|
61 | if ( DMAMode == M2M )
|
62 | {
|
63 | GPDMA_CH0_SRC = DMA_SRC;
|
64 | GPDMA_CH0_DEST = DMA_DST;
|
65 |
|
66 | for (i = 0; i<=35;i++)
|
67 | {
|
68 | llist[i][0]=0xA0000000+(DMA_SIZE/4) + ((DMA_SIZE/4)*i); // SRC
|
69 | llist[i][1]=0xA0025800+(DMA_SIZE/4) + ((DMA_SIZE/4)*i); // DST
|
70 | llist[i][2]=(U32)llist[i+1]; // NEXT LL
|
71 | llist[i][3]=0x0c4a4040; // COMAND
|
72 | }
|
73 |
|
74 | llist[36][0] = 0xA0000000+(DMA_SIZE/4) + ((DMA_SIZE/4)*35);
|
75 | llist[36][1] = 0xA0025800+(DMA_SIZE/4) + ((DMA_SIZE/4)*35);
|
76 | llist[36][2] = 0;
|
77 | llist[36][3] = 0x0c4a4040;
|
78 |
|
79 | /* Terminal Count Int enable */
|
80 | GPDMA_CH0_CTRL = ((DMA_SIZE/4) & 0x0FFF) // Transver Size
|
81 | | (0x04 << 12) // Source burst size
|
82 | | (0x04 << 15) // Destination burst Size
|
83 | | (0x02 << 18) // Source width
|
84 | | (0x02 << 21) // destination width
|
85 | | (1 << 26) // Source increment
|
86 | | (1 << 27) // Destination increment
|
87 | | 0x80000000;
|
88 |
|
89 | GPDMA_CH0_LLI = (U32)llist[0] & 0xFFFFFFFC;
|
90 | }
|
91 | else
|
92 | {
|
93 | return ( FALSE );
|
94 | }
|
95 |
|
96 | GPDMA_CONFIG = 0x01; /* Enable DMA channels, little endian */
|
97 |
|
98 | while ( !(GPDMA_CONFIG & 0x01) );
|
99 |
|
100 | if ( install_irq( GPDMA_INT, (void *)DMAHandler, HIGHEST_PRIORITY ) == FALSE )
|
101 | {
|
102 | return ( FALSE );
|
103 | }
|
104 | return (TRUE);
|
105 | }
|