1 /*---------------------------------------------------------------------------*
2 Project: TwlSDK - CTRDG - libraries - ARM9
3 File: ctrdg_sram.c
4
5 Copyright 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:: 2007-11-15#$
14 $Rev: 2414 $
15 $Author: hatamoto_minoru $
16 *---------------------------------------------------------------------------*/
17
18 #include <nitro.h>
19
20 u32 CTRDGi_ReadAgbSramCore(CTRDGTaskInfo * arg);
21 u32 CTRDGi_WriteAgbSramCore(CTRDGTaskInfo * arg);
22 u32 CTRDGi_VerifyAgbSramCore(CTRDGTaskInfo * arg);
23 u32 CTRDGi_WriteAndVerifyAgbSramCore(CTRDGTaskInfo * arg);
24
25 /*Exclusive control*/
26 u16 ctrdgi_sram_lock_id;
27 // Const data-------------------------------------------
28 static const u8 AgbLibSram_ver[] = "AGBSRAM_V113";
29
30 /*******************************************************
31
32 Function's description
33
34 ********************************************************/
CTRDGi_ReadAgbSramCore(CTRDGTaskInfo * arg)35 u32 CTRDGi_ReadAgbSramCore(CTRDGTaskInfo * arg)
36 {
37 u8 *src_pt, *dst_pt;
38 MICartridgeRamCycle ram_cycle;
39 CTRDGTaskInfo p = *arg;
40 u32 src = p.offset;
41 void *dst = p.dst;
42 u32 size = p.size;
43 static BOOL flag = FALSE;
44
45 /*Exclusive control (lock) */
46 (void)OS_LockCartridge(ctrdgi_sram_lock_id);
47 /*Access cycle settings */
48 ram_cycle = MI_GetCartridgeRamCycle();
49 MI_SetCartridgeRamCycle(MI_CTRDG_RAMCYCLE_18);
50
51 src_pt = (u8 *)src;
52 dst_pt = (u8 *)dst;
53 while (size--)
54 {
55 *dst_pt++ = *src_pt++;
56 }
57
58 /*Access cycle settings */
59 MI_SetCartridgeRamCycle(ram_cycle);
60 /*Exclusive control (unlock) */
61 (void)OS_UnlockCartridge(ctrdgi_sram_lock_id);
62
63 return 0;
64 }
65
CTRDGi_WriteAgbSramCore(CTRDGTaskInfo * arg)66 u32 CTRDGi_WriteAgbSramCore(CTRDGTaskInfo * arg)
67 {
68 u8 *src_pt, *dst_pt;
69 MICartridgeRamCycle ram_cycle;
70 CTRDGTaskInfo p = *arg;
71 u32 dst = p.offset;
72 const void *src = p.data;
73 u32 size = p.size;
74
75 /*Exclusive control (lock) */
76 (void)OS_LockCartridge(ctrdgi_sram_lock_id);
77 /*Access cycle settings */
78 ram_cycle = MI_GetCartridgeRamCycle();
79 MI_SetCartridgeRamCycle(MI_CTRDG_RAMCYCLE_18);
80
81 src_pt = (u8 *)src;
82 dst_pt = (u8 *)dst;
83 while (size--)
84 {
85 *dst_pt++ = *src_pt++;
86 }
87
88 /*Access cycle settings */
89 MI_SetCartridgeRamCycle(ram_cycle);
90 /*Exclusive control (unlock) */
91 (void)OS_UnlockCartridge(ctrdgi_sram_lock_id);
92
93 return 0;
94 }
95
CTRDGi_VerifyAgbSramCore(CTRDGTaskInfo * arg)96 u32 CTRDGi_VerifyAgbSramCore(CTRDGTaskInfo * arg)
97 {
98 u8 *tgt_pt, *src_pt;
99 u32 result;
100 MICartridgeRamCycle ram_cycle;
101 CTRDGTaskInfo p = *arg;
102 u32 tgt = p.offset;
103 const void *src = p.data;
104 u32 size = p.size;
105
106 /*Exclusive control (lock) */
107 (void)OS_LockCartridge(ctrdgi_sram_lock_id);
108 /*Access cycle settings */
109 ram_cycle = MI_GetCartridgeRamCycle();
110 MI_SetCartridgeRamCycle(MI_CTRDG_RAMCYCLE_18);
111
112 result = 0;
113 tgt_pt = (u8 *)tgt;
114 src_pt = (u8 *)src;
115 while (size--)
116 {
117 if (*tgt_pt++ != *src_pt++)
118 {
119 result = (u32)tgt_pt - 1;
120 break;
121 }
122 }
123
124 /*Access cycle settings */
125 MI_SetCartridgeRamCycle(ram_cycle);
126 /*Exclusive control (unlock) */
127 (void)OS_UnlockCartridge(ctrdgi_sram_lock_id);
128
129 return result;
130 }
131
132
CTRDGi_WriteAndVerifyAgbSramCore(CTRDGTaskInfo * arg)133 u32 CTRDGi_WriteAndVerifyAgbSramCore(CTRDGTaskInfo * arg)
134 {
135 u8 retry;
136 u32 result;
137 CTRDGTaskInfo p = *arg;
138 u32 dst = p.offset;
139 const void *src = p.data;
140 u32 size = p.size;
141
142 retry = 0;
143 while (retry < CTRDG_AGB_SRAM_RETRY_MAX)
144 {
145 CTRDG_WriteAgbSram(dst, src, size);
146 result = CTRDG_VerifyAgbSram(dst, src, size);
147 if (result == 0)
148 break;
149 retry++;
150 }
151 return result;
152 }
153
154
CTRDG_ReadAgbSram(u32 src,void * dst,u32 size)155 void CTRDG_ReadAgbSram(u32 src, void *dst, u32 size)
156 {
157 CTRDGTaskInfo p;
158 p.offset = src;
159 p.dst = (u8 *)dst;
160 p.size = size;
161
162 (void)CTRDGi_ReadAgbSramCore(&p);
163 }
164
CTRDG_WriteAgbSram(u32 dst,const void * src,u32 size)165 void CTRDG_WriteAgbSram(u32 dst, const void *src, u32 size)
166 {
167 CTRDGTaskInfo p;
168 p.data = (u8 *)src;
169 p.offset = dst;
170 p.size = size;
171
172 (void)CTRDGi_WriteAgbSramCore(&p);
173 }
174
CTRDG_VerifyAgbSram(u32 tgt,const void * src,u32 size)175 u32 CTRDG_VerifyAgbSram(u32 tgt, const void *src, u32 size)
176 {
177 u32 result;
178 CTRDGTaskInfo p;
179 p.data = (u8 *)src;
180 p.offset = tgt;
181 p.size = size;
182
183 result = CTRDGi_VerifyAgbSramCore(&p);
184
185 return result;
186 }
187
CTRDG_WriteAndVerifyAgbSram(u32 dst,const void * src,u32 size)188 u32 CTRDG_WriteAndVerifyAgbSram(u32 dst, const void *src, u32 size)
189 {
190 u32 result;
191 CTRDGTaskInfo p;
192 p.data = (u8 *)src;
193 p.offset = dst;
194 p.size = size;
195
196 result = CTRDGi_WriteAndVerifyAgbSramCore(&p);
197
198 return result;
199 }
CTRDG_ReadAgbSramAsync(u32 src,void * dst,u32 size,CTRDG_TASK_FUNC callback)200 void CTRDG_ReadAgbSramAsync(u32 src, void *dst, u32 size, CTRDG_TASK_FUNC callback)
201 {
202 CTRDGTaskInfo p;
203 p.offset = src;
204 p.dst = (u8 *)dst;
205 p.size = size;
206
207 CTRDGi_SetTask(&p, CTRDGi_ReadAgbSramCore, callback);
208 }
209
CTRDG_WriteAgbSramAsync(u32 dst,const void * src,u32 size,CTRDG_TASK_FUNC callback)210 void CTRDG_WriteAgbSramAsync(u32 dst, const void *src, u32 size, CTRDG_TASK_FUNC callback)
211 {
212 CTRDGTaskInfo p;
213 p.data = (u8 *)src;
214 p.offset = dst;
215 p.size = size;
216
217 CTRDGi_SetTask(&p, CTRDGi_WriteAgbSramCore, callback);
218 }
219
CTRDG_VerifyAgbSramAsync(u32 tgt,const void * src,u32 size,CTRDG_TASK_FUNC callback)220 void CTRDG_VerifyAgbSramAsync(u32 tgt, const void *src, u32 size, CTRDG_TASK_FUNC callback)
221 {
222 CTRDGTaskInfo p;
223 p.data = (u8 *)src;
224 p.offset = tgt;
225 p.size = size;
226
227 CTRDGi_SetTask(&p, CTRDGi_VerifyAgbSramCore, callback);
228 }
229
CTRDG_WriteAndVerifyAgbSramAsync(u32 dst,const void * src,u32 size,CTRDG_TASK_FUNC callback)230 void CTRDG_WriteAndVerifyAgbSramAsync(u32 dst, const void *src, u32 size, CTRDG_TASK_FUNC callback)
231 {
232 CTRDGTaskInfo p;
233 p.data = (u8 *)src;
234 p.offset = dst;
235 p.size = size;
236
237 CTRDGi_SetTask(&p, CTRDGi_WriteAndVerifyAgbSramCore, callback);
238 }
239