1 /*---------------------------------------------------------------------------*
2   Project:  TwlSDK - MI
3   File:     mi_dma_vblank.c
4 
5   Copyright 2003-2008 Nintendo.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Date:: 2008-10-16#$
14   $Rev: 8957 $
15   $Author: yada $
16  *---------------------------------------------------------------------------*/
17 
18 #include <nitro.h>
19 #include "../include/mi_dma.h"
20 
21 /*---------------------------------------------------------------------------*
22   Name:         MI_VBlankDmaCopy32
23 
24   Description:  VBlank DMA copy.
25                 32bit, sync version.
26 
27   Arguments:    dmaNo   : DMA channel No.
28                 src     : source address
29                 dest    : destination address
30                 size    : transfer size (byte)
31 
32   Returns:      None
33  *---------------------------------------------------------------------------*/
MI_VBlankDmaCopy32(u32 dmaNo,const void * src,void * dest,u32 size)34 void MI_VBlankDmaCopy32(u32 dmaNo, const void *src, void *dest, u32 size)
35 {
36     vu32   *dmaCntp;
37 
38     MIi_ASSERT_DMANO(dmaNo);
39     MIi_ASSERT_SRC_ALIGN4(src);
40     MIi_ASSERT_DEST_ALIGN4(dest);
41     MIi_WARNING_ADDRINTCM(src, size);
42     MIi_WARNING_ADDRINTCM(dest, size);
43 
44 #ifdef SDK_ARM9
45     MIi_CheckAnotherAutoDMA(dmaNo, MI_DMA_TIMING_V_BLANK);
46 #endif
47     //---- check DMA0 source address
48     MIi_CheckDma0SourceAddress(dmaNo, (u32)src, size, MI_DMA_SRC_INC);
49 
50     if (size == 0)
51     {
52         return;
53     }
54 
55     MIi_Wait_BeforeDMA(dmaCntp, dmaNo);
56 	MIi_DmaSetParameters(dmaNo, (u32)src, (u32)dest, MI_CNT_VBCOPY32(size), 0);
57     MIi_Wait_AfterDMA(dmaCntp);
58 }
59 
60 /*---------------------------------------------------------------------------*
61   Name:         MI_VBlankDmaCopy16
62 
63   Description:  VBlank DMA copy.
64                 16bit, sync version.
65 
66   Arguments:    dmaNo   : DMA channel No.
67                 src     : source address
68                 dest    : destination address
69                 size    : transfer size (byte)
70 
71   Returns:      None
72  *---------------------------------------------------------------------------*/
MI_VBlankDmaCopy16(u32 dmaNo,const void * src,void * dest,u32 size)73 void MI_VBlankDmaCopy16(u32 dmaNo, const void *src, void *dest, u32 size)
74 {
75     vu32   *dmaCntp;
76 
77     MIi_ASSERT_DMANO(dmaNo);
78     MIi_ASSERT_SRC_ALIGN2(src);
79     MIi_ASSERT_DEST_ALIGN2(dest);
80     MIi_WARNING_ADDRINTCM(src, size);
81     MIi_WARNING_ADDRINTCM(dest, size);
82 
83 #ifdef SDK_ARM9
84     MIi_CheckAnotherAutoDMA(dmaNo, MI_DMA_TIMING_V_BLANK);
85 #endif
86     //---- check DMA0 source address
87     MIi_CheckDma0SourceAddress(dmaNo, (u32)src, size, MI_DMA_SRC_INC);
88 
89     if (size == 0)
90     {
91         return;
92     }
93 
94     MIi_Wait_BeforeDMA(dmaCntp, dmaNo);
95 	MIi_DmaSetParameters(dmaNo, (u32)src, (u32)dest, MI_CNT_VBCOPY16(size), MIi_DMA_MODE_WAIT);
96     MIi_Wait_AfterDMA(dmaCntp);
97 }
98 
99 /*---------------------------------------------------------------------------*
100   Name:         MI_VBlankDmaCopy32Async
101 
102   Description:  VBlank DMA copy.
103                 32bit, async version
104 
105   Arguments:    dmaNo   : DMA channel No.
106                 src     : source address
107                 dest    : destination address
108                 size    : transfer size (byte)
109 
110   Returns:      None
111  *---------------------------------------------------------------------------*/
MI_VBlankDmaCopy32Async(u32 dmaNo,const void * src,void * dest,u32 size,MIDmaCallback callback,void * arg)112 void MI_VBlankDmaCopy32Async(u32 dmaNo, const void *src, void *dest, u32 size,
113                              MIDmaCallback callback, void *arg)
114 {
115     MIi_ASSERT_DMANO(dmaNo);
116     MIi_ASSERT_SRC_ALIGN4(src);
117     MIi_ASSERT_DEST_ALIGN4(dest);
118     MIi_WARNING_ADDRINTCM(src, size);
119     MIi_WARNING_ADDRINTCM(dest, size);
120 
121 #ifdef SDK_ARM9
122     MIi_CheckAnotherAutoDMA(dmaNo, MI_DMA_TIMING_V_BLANK);
123 #endif
124     //---- check DMA0 source address
125     MIi_CheckDma0SourceAddress(dmaNo, (u32)src, size, MI_DMA_SRC_INC);
126 
127     if (size == 0)
128     {
129         MIi_CallCallback(callback, arg);
130     }
131     else
132     {
133         MI_WaitDma(dmaNo);
134         if (callback)
135         {
136             OSi_EnterDmaCallback(dmaNo, callback, arg);
137 			MIi_DmaSetParameters(dmaNo, (u32)src, (u32)dest, MI_CNT_VBCOPY32_IF(size), 0 );
138         }
139         else
140         {
141 			MIi_DmaSetParameters(dmaNo, (u32)src, (u32)dest, MI_CNT_VBCOPY32(size), 0 );
142         }
143     }
144 }
145 
146 /*---------------------------------------------------------------------------*
147   Name:         MI_VBlankDmaCopy16Async
148 
149   Description:  VBlank DMA copy.
150                 16bit, async version
151 
152   Arguments:    dmaNo   : DMA channel No.
153                 src     : source address
154                 dest    : destination address
155                 size    : transfer size (byte)
156 
157   Returns:      None
158  *---------------------------------------------------------------------------*/
MI_VBlankDmaCopy16Async(u32 dmaNo,const void * src,void * dest,u32 size,MIDmaCallback callback,void * arg)159 void MI_VBlankDmaCopy16Async(u32 dmaNo, const void *src, void *dest, u32 size,
160                              MIDmaCallback callback, void *arg)
161 {
162     MIi_ASSERT_DMANO(dmaNo);
163     MIi_ASSERT_SRC_ALIGN2(src);
164     MIi_ASSERT_DEST_ALIGN2(dest);
165     MIi_WARNING_ADDRINTCM(src, size);
166     MIi_WARNING_ADDRINTCM(dest, size);
167 
168 #ifdef SDK_ARM9
169     MIi_CheckAnotherAutoDMA(dmaNo, MI_DMA_TIMING_V_BLANK);
170 #endif
171     //---- check DMA0 source address
172     MIi_CheckDma0SourceAddress(dmaNo, (u32)src, size, MI_DMA_SRC_INC);
173 
174     if (size == 0)
175     {
176         MIi_CallCallback(callback, arg);
177     }
178     else
179     {
180         MI_WaitDma(dmaNo);
181         if (callback)
182         {
183             OSi_EnterDmaCallback(dmaNo, callback, arg);
184 			MIi_DmaSetParameters(dmaNo, (u32)src, (u32)dest, MI_CNT_VBCOPY16_IF(size), 0);
185         }
186         else
187         {
188 			MIi_DmaSetParameters(dmaNo, (u32)src, (u32)dest, MI_CNT_VBCOPY16(size), 0 );
189         }
190     }
191 }
192