1 /*---------------------------------------------------------------------------*
2   Project:  TwlSDK - CTRDG - libraries - ARM9
3   File:     ctrdg_flash_MX29L512.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 
21 // Extern data----------------------------------
22 extern u16 CTRDGi_PollingSR512kCOMMON(u16 phase, u8 *adr, u16 lastData);
23 extern u16 CTRDGi_EraseFlashChipLE(void);
24 extern u16 CTRDGi_EraseFlashSectorLE(u16 secNo);
25 extern u16 CTRDGi_ProgramFlashByteLE(u8 *src, u8 *dst);
26 extern void CTRDGi_EraseFlashChipAsyncLE(CTRDG_TASK_FUNC callback);
27 extern void CTRDGi_EraseFlashSectorAsyncLE(u16 secNo, CTRDG_TASK_FUNC callback);
28 extern void CTRDGi_WriteFlashSectorAsyncLE(u16 secNo, u8 *src, CTRDG_TASK_FUNC callback);
29 /*Exclusive control*/
30 extern u16 ctrdgi_flash_lock_id;
31 
32 // Function's prototype declaration-------------
33 u16     CTRDGi_WriteFlashSectorMX5(u16 secNo, u8 *src);
34 u32     CTRDGi_WriteFlashSectorCoreMX5(CTRDGTaskInfo * arg);
35 void    CTRDGi_WriteFlashSectorAsyncMX5(u16 secNo, u8 *src, CTRDG_TASK_FUNC callback);
36 
37 // Const data-----------------------------------
38 static const u16 PaMaxTime[] = {
39     10,                                // Common       10ms
40     10,                                // Program      10ms(exactly:50usec)    (15.256us*66)*1=1ms
41     500,                               // Sector erase 100ms
42     500,                               // Chip   erase 100ms
43 };
44 
45 const CTRDGiFlashTypePlus MN63F805MNP = {
46     CTRDGi_WriteFlashSectorMX5,
47     CTRDGi_EraseFlashChipLE,
48     CTRDGi_EraseFlashSectorLE,
49     CTRDGi_WriteFlashSectorAsyncMX5,
50     CTRDGi_EraseFlashChipAsyncLE,
51     CTRDGi_EraseFlashSectorAsyncLE,
52     CTRDGi_PollingSR512kCOMMON,
53     PaMaxTime,
54     {
55 /* For debugging */
56 //#ifndef   __FLASH_DEBUG
57         0x00010000,                       // ROM size
58         {0x00001000, 12, 16, 0},          // Sector size, shift, count, top
59 //#else
60 //      0x00002000,
61 //      {0x00000200,  9, 16,  0},
62 //#endif
63         {MI_CTRDG_RAMCYCLE_10, MI_CTRDG_RAMCYCLE_6},       // agb read cycle=4, write cycle=2
64         0x32,                             // Maker ID
65         0x1b,                             // Device ID
66     },
67 };
68 
69 // Program description**************************
CTRDGi_WriteFlashSectorCoreMX5(CTRDGTaskInfo * arg)70 u32 CTRDGi_WriteFlashSectorCoreMX5(CTRDGTaskInfo * arg)
71 {
72     u8     *tgt;
73     MICartridgeRamCycle ram_cycle;
74     u32     result;
75     CTRDGTaskInfo p = *arg;
76     u16     secNo = p.sec_num;
77     u8     *src = p.data;
78 
79     if (secNo >= AgbFlash->sector.count)
80         return CTRDG_BACKUP_RESULT_ERROR | CTRDG_BACKUP_PHASE_PARAMETER_CHECK;
81 
82     // Erase
83     result = CTRDGi_EraseFlashSectorLE(secNo);
84     if (result)
85     {
86         return result;
87     }
88 
89     /*Exclusive control (lock) */
90     (void)OS_LockCartridge(ctrdgi_flash_lock_id);
91     /*Access cycle settings */
92     ram_cycle = MI_GetCartridgeRamCycle();
93     MI_SetCartridgeRamCycle(AgbFlash->agbWait[0]);
94     //*(vu16 *)REG_EXMEMCNT_ADDR=(*(vu16 *)REG_EXMEMCNT_ADDR & 0xfffc)|AgbFlash->agbWait[0]; // read 3cycles wait
95 
96     ctrdg_flash_remainder = (u16)AgbFlash->sector.size;
97     tgt = (u8 *)(CTRDG_AGB_FLASH_ADR + (secNo << AgbFlash->sector.shift));
98     while (ctrdg_flash_remainder)
99     {
100         result = CTRDGi_ProgramFlashByteLE(src, tgt);
101         if (result)
102             break;
103         ctrdg_flash_remainder--;
104         src++;
105         tgt++;
106     }
107 
108     /*Access cycle settings */
109     MI_SetCartridgeRamCycle(ram_cycle);
110     /*Exclusive control (unlock) */
111     (void)OS_UnlockCartridge(ctrdgi_flash_lock_id);
112 
113     return result;
114 }
115 
CTRDGi_WriteFlashSectorMX5(u16 secNo,u8 * src)116 u16 CTRDGi_WriteFlashSectorMX5(u16 secNo, u8 *src)
117 {
118     u16     result;
119     CTRDGTaskInfo p;
120     p.sec_num = secNo;
121     p.data = src;
122     result = (u16)CTRDGi_WriteFlashSectorCoreMX5(&p);
123 
124     return result;
125 }
126 
CTRDGi_WriteFlashSectorAsyncMX5(u16 secNo,u8 * src,CTRDG_TASK_FUNC callback)127 void CTRDGi_WriteFlashSectorAsyncMX5(u16 secNo, u8 *src, CTRDG_TASK_FUNC callback)
128 {
129     CTRDGTaskInfo p;
130 
131     p.sec_num = secNo;
132     p.data = src;
133     CTRDGi_SetTask(&p, CTRDGi_WriteFlashSectorCoreMX5, callback);
134 }
135