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