1 /*---------------------------------------------------------------------------*
2 Project: TwlSDK - EL - demos - simple-1
3 File: main.c
4
5 Copyright 2007-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-12-08#$
14 $Rev: 9570 $
15 $Author: kitase_hirotake $
16 *---------------------------------------------------------------------------*/
17
18 #include <twl.h>
19 #include <twl/el.h>
20
21
22 #include "dllA.h"
23
24 /*---------------------------------------------------------------------------*
25 Static variables
26 *---------------------------------------------------------------------------*/
27 static u32 lib_buf[8192];
28 int fd;
29
30 typedef void (*global_func_p)( void);
31 global_func_p global_func;
32
33 /*---------------------------------------------------------------------------*
34 Name: MY_Alloc
35
36 Description: The user's memory allocation function passed to the EL library.
37
38 Arguments: None.
39
40 Returns: None.
41 *---------------------------------------------------------------------------*/
MY_Alloc(size_t size)42 static void *MY_Alloc(size_t size)
43 {
44 void* heap;
45 heap = OS_Alloc( size);
46 if( heap == NULL) { OS_TPanic( "OS_Alloc failed.\n");}
47 return( heap);
48 }
49
50 /*---------------------------------------------------------------------------*
51 Name: MY_Free
52
53 Description: The user's memory deallocation function passed to the EL library.
54
55 Arguments: None.
56
57 Returns: None.
58 *---------------------------------------------------------------------------*/
MY_Free(void * ptr)59 static void MY_Free(void *ptr)
60 {
61 OS_Free( ptr);
62 }
63
64 /*---------------------------------------------------------------------------*
65 Name: VBlankIntr
66
67 Description: VBlank interrupt handler
68
69 Arguments: None.
70
71 Returns: None.
72 *---------------------------------------------------------------------------*/
VBlankIntr(void)73 static void VBlankIntr(void)
74 {
75 //---- check interrupt flag
76 OS_SetIrqCheckFlag(OS_IE_V_BLANK);
77 }
78
79 /*---------------------------------------------------------------------------*
80 Name: TwlMain
81
82 Description: Main
83
84 Arguments: None.
85
86 Returns: None.
87 *---------------------------------------------------------------------------*/
TwlMain(void)88 void TwlMain(void)
89 {
90 ELDlld my_dlld;
91
92 /* OS initialization */
93 OS_Init();
94 OS_SetIrqFunction(OS_IE_V_BLANK, VBlankIntr);
95 (void)OS_EnableIrqMask(OS_IE_V_BLANK);
96 (void)OS_EnableIrq();
97 (void)GX_VBlankIntr(TRUE);
98
99 {
100 void *tempLo;
101 OSHeapHandle hh;
102
103 // Based on the premise that OS_Init has been already called
104 tempLo = OS_InitAlloc(OS_ARENA_MAIN, OS_GetMainArenaLo(), OS_GetMainArenaHi(), 1);
105 OS_SetArenaLo(OS_ARENA_MAIN, tempLo);
106 hh = OS_CreateHeap(OS_ARENA_MAIN, OS_GetMainArenaLo(), OS_GetMainArenaHi());
107 if (hh < 0)
108 {
109 OS_Panic("ARM9: Fail to create heap...\n");
110 }
111 hh = OS_SetCurrentHeap(OS_ARENA_MAIN, hh);
112 }
113
114
115 OS_TPrintf("\n");
116 OS_TPrintf("===================================\n");
117 OS_TPrintf("EL Library test\n");
118 OS_TPrintf("===================================\n");
119
120 /* Start testing the EL library*/
121 {
122 FS_Init( FS_DMA_NOT_USE );
123
124 if( EL_Init( MY_Alloc, MY_Free) < 0)
125 {
126 OS_TPanic( "EL_Init failed.\n");
127 }
128 else
129 {
130 OS_TPrintf( "EL_Init success.\n");
131 }
132
133 // Dynamic modules are in the ROM
134 my_dlld = EL_LinkFile( "rom:/data/dllA.a", lib_buf);
135
136 OS_TPrintf( "dll loaded 0x%x - 0x%x\n", (u32)lib_buf, (u32)lib_buf + EL_GetLibSize( my_dlld));
137
138 OS_TPrintf( "object resolved flag = %d\n", EL_IsResolved( my_dlld));
139
140 /* Export the static-side symbols*/
141 EL_AddStaticSym();
142
143 /* Resolve the DLL symbols*/
144 (void)EL_ResolveAll();
145
146 OS_TPrintf( "object resolved flag = %d\n", EL_IsResolved( my_dlld));
147
148 OS_TPrintf( "LINK : dynamic\n");
149 global_func = (global_func_p)EL_GetGlobalAdr( my_dlld, "global_func_A\0");
150 OS_TPrintf( "global_func : 0x%x\n", global_func);
151
152 OS_TPrintf( "----- dll-func1 execution -----\n");
153 (*global_func)();
154
155 OS_TPrintf( "----- dll execution end -----\n");
156
157 /* Unlink*/
158 (void)EL_Unlink( my_dlld);
159 OS_TPrintf( "EL_Unlink success.\n");
160
161 OS_TPrintf( "object resolved flag = %d\n", EL_IsResolved( my_dlld));
162
163 }
164
165 OS_TPrintf("\n");
166 OS_TPrintf("===================================\n");
167 OS_TPrintf("Finish\n");
168 OS_TPrintf("===================================\n");
169 OS_Terminate();
170 }
171
172 /*====== End of main.c ======*/
173