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