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