Subversion Repositories freemyipod

Rev

Rev 651 | Rev 662 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 651 Rev 660
Line -... Line 1...
-
 
1
//
-
 
2
//
-
 
3
//    Copyright 2011 TheSeven
-
 
4
//
-
 
5
//
-
 
6
//    This file is part of emCORE.
-
 
7
//
-
 
8
//    emCORE is free software: you can redistribute it and/or
-
 
9
//    modify it under the terms of the GNU General Public License as
-
 
10
//    published by the Free Software Foundation, either version 2 of the
-
 
11
//    License, or (at your option) any later version.
-
 
12
//
-
 
13
//    emCORE is distributed in the hope that it will be useful,
-
 
14
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
-
 
15
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
 
16
//    See the GNU General Public License for more details.
-
 
17
//
-
 
18
//    You should have received a copy of the GNU General Public License along
-
 
19
//    with emCORE.  If not, see <http://www.gnu.org/licenses/>.
-
 
20
//
-
 
21
//
-
 
22
 
-
 
23
 
1
#include "emcoreapp.h"
24
#include "emcoreapp.h"
2
#include "libboot.h"
25
#include "libboot.h"
3
#include "libpng.h"
26
#include "libpng.h"
4
#include "libui.h"
27
#include "libui.h"
-
 
28
#include "libmkfat32.h"
5
 
29
 
6
 
-
 
-
 
30
struct libpng_api* png;
-
 
31
struct libboot_api* boot;
-
 
32
struct libui_api* ui;
7
void* framebuf;
33
void* framebuf;
-
 
34
void* bg;
-
 
35
void* icons;
-
 
36
void* rbxlogo;
-
 
37
 
-
 
38
static struct emcorelib_header* loadlib(uint32_t identifier, uint32_t version, char* filename)
-
 
39
{
-
 
40
    struct emcorelib_header* lib = get_library(identifier, version, LIBSOURCE_BOOTFLASH, filename);
-
 
41
    if (!lib) panicf(PANIC_KILLTHREAD, "Could not load %s", filename);
-
 
42
    return lib;
-
 
43
}
-
 
44
 
-
 
45
static void* loadpng(const char* filename, void* (*decoder)(struct png_info* handle))
-
 
46
{
-
 
47
    int size = bootflash_filesize(filename);
-
 
48
    if (size == -1) panicf(PANIC_KILLTHREAD, "Could not load %s", filename);
-
 
49
    void* buf = memalign(0x10, size);
-
 
50
    if (!buf) panicf(PANIC_KILLTHREAD, "Could not allocate buffer for %s", filename);
-
 
51
    bootflash_read(filename, buf, 0, size);
-
 
52
    struct png_info* handle = png->png_open(buf, size);
-
 
53
    if (!handle) panicf(PANIC_KILLTHREAD, "Could not parse %s", filename);
-
 
54
    void* out = decoder(handle);
-
 
55
    if (!out) panicf(PANIC_KILLTHREAD, "Could not decode %s", filename);
-
 
56
    png->png_destroy(handle);
-
 
57
    free(buf);
-
 
58
    return out;
-
 
59
}
-
 
60
 
-
 
61
static void message(int x, const char* line1, const char* line2)
-
 
62
{
-
 
63
    rendertext(framebuf, x, 140, 320, 0xff3333ff, 0xa0000000, line1);
-
 
64
    rendertext(framebuf, x, 148, 320, 0xff3333ff, 0xa0000000, line2);
-
 
65
    displaylcd(0, 0, 320, 240, framebuf, 0, 0, 320);
-
 
66
    sleep(5000000);
-
 
67
}
-
 
68
 
-
 
69
struct chooser_renderer_list_itemdata toolchooser_rparams_mainchooser =
-
 
70
{
-
 
71
    .size = LIBUI_POINT(260, 10),
-
 
72
    .fill_box = LIBUI_BOX(LIBUI_POINT(0, 0), LIBUI_POINT(260, 10)),
-
 
73
    .fill_color = 0xa0000000,
-
 
74
    .fill_color_selected = 0x60ffffff,
-
 
75
    .icon_pos = LIBUI_POINT(0, 0),
-
 
76
    .icon = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 0), LIBUI_POINT(0, 0)),
-
 
77
                          LIBUI_POINT(0, 0)),
-
 
78
    .icon_opacity = 0,
-
 
79
    .icon_selected = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 0), LIBUI_POINT(0, 0)),
-
 
80
                                   LIBUI_POINT(0, 0)),
-
 
81
    .icon_selected_opacity = 0,
-
 
82
    .text = "Return to main menu",
-
 
83
    .text_pos = LIBUI_POINT(1, 1),
-
 
84
    .text_color = 0xffffffff,
-
 
85
    .text_color_selected = 0xff7fffff
-
 
86
};
-
 
87
 
-
 
88
struct chooser_renderer_list_itemdata toolchooser_rparams_umsboot =
-
 
89
{
-
 
90
    .size = LIBUI_POINT(260, 10),
-
 
91
    .fill_box = LIBUI_BOX(LIBUI_POINT(0, 0), LIBUI_POINT(260, 10)),
-
 
92
    .fill_color = 0xa0000000,
-
 
93
    .fill_color_selected = 0x60ffffff,
-
 
94
    .icon_pos = LIBUI_POINT(0, 0),
-
 
95
    .icon = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 0), LIBUI_POINT(0, 0)),
-
 
96
                          LIBUI_POINT(0, 0)),
-
 
97
    .icon_opacity = 0,
-
 
98
    .icon_selected = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 0), LIBUI_POINT(0, 0)),
-
 
99
                                   LIBUI_POINT(0, 0)),
-
 
100
    .icon_selected_opacity = 0,
-
 
101
    .text = "Run UMSboot",
-
 
102
    .text_pos = LIBUI_POINT(1, 1),
-
 
103
    .text_color = 0xffffffff,
-
 
104
    .text_color_selected = 0xff7fffff
-
 
105
};
-
 
106
 
-
 
107
void run_umsboot(void** firmware, void** app, int* size)
-
 
108
{
-
 
109
    boot->load_from_flash(firmware, size, true, "umsboot ", 0x10000);
-
 
110
    if (!*firmware)
-
 
111
    {
-
 
112
        memcpy(framebuf, bg, 320 * 240 * 3);
-
 
113
        message(91, "Loading UMSboot failed!", "Returning to main menu.");
-
 
114
    }
-
 
115
}
-
 
116
 
-
 
117
struct chooser_renderer_list_itemdata toolchooser_rparams_rockbox_fallback =
-
 
118
{
-
 
119
    .size = LIBUI_POINT(260, 10),
-
 
120
    .fill_box = LIBUI_BOX(LIBUI_POINT(0, 0), LIBUI_POINT(260, 10)),
-
 
121
    .fill_color = 0xa0000000,
-
 
122
    .fill_color_selected = 0x60ffffff,
-
 
123
    .icon_pos = LIBUI_POINT(0, 0),
-
 
124
    .icon = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 0), LIBUI_POINT(0, 0)),
-
 
125
                          LIBUI_POINT(0, 0)),
-
 
126
    .icon_opacity = 0,
-
 
127
    .icon_selected = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 0), LIBUI_POINT(0, 0)),
-
 
128
                                   LIBUI_POINT(0, 0)),
-
 
129
    .icon_selected_opacity = 0,
-
 
130
    .text = "Run Rockbox fallback image",
-
 
131
    .text_pos = LIBUI_POINT(1, 1),
-
 
132
    .text_color = 0xffffffff,
-
 
133
    .text_color_selected = 0xff7fffff
-
 
134
};
-
 
135
 
-
 
136
void run_rockbox_fallback(void** firmware, void** app, int* size)
-
 
137
{
-
 
138
    boot->load_from_flash(firmware, size, true, "rockbox ", 0x100000);
-
 
139
    if (!*firmware)
8
    
140
    {
-
 
141
        memcpy(framebuf, bg, 320 * 240 * 3);
-
 
142
        message(91, "Loading Rockbox failed!", "Returning to main menu.");
9
    
143
    }
-
 
144
}
-
 
145
 
-
 
146
struct chooser_renderer_list_itemdata toolchooser_rparams_clearcfg =
-
 
147
{
-
 
148
    .size = LIBUI_POINT(260, 10),
-
 
149
    .fill_box = LIBUI_BOX(LIBUI_POINT(0, 0), LIBUI_POINT(260, 10)),
-
 
150
    .fill_color = 0xa0000000,
-
 
151
    .fill_color_selected = 0x60ffffff,
-
 
152
    .icon_pos = LIBUI_POINT(0, 0),
-
 
153
    .icon = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 0), LIBUI_POINT(0, 0)),
-
 
154
                          LIBUI_POINT(0, 0)),
-
 
155
    .icon_opacity = 0,
-
 
156
    .icon_selected = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 0), LIBUI_POINT(0, 0)),
-
 
157
                                   LIBUI_POINT(0, 0)),
-
 
158
    .icon_selected_opacity = 0,
-
 
159
    .text = "Clear Rockbox configuration",
-
 
160
    .text_pos = LIBUI_POINT(1, 1),
-
 
161
    .text_color = 0xffffffff,
-
 
162
    .text_color_selected = 0xff7fffff
-
 
163
};
-
 
164
 
-
 
165
void run_clearcfg(void** firmware, void** app, int* size)
-
 
166
{
-
 
167
    remove("/.rockbox/config.cfg");
-
 
168
    memcpy(framebuf, bg, 320 * 240 * 3);
-
 
169
    message(97, "Rockbox configuration", "  has been cleared.  ");
-
 
170
}
-
 
171
 
-
 
172
struct chooser_renderer_list_itemdata toolchooser_rparams_cleardb =
-
 
173
{
-
 
174
    .size = LIBUI_POINT(260, 10),
-
 
175
    .fill_box = LIBUI_BOX(LIBUI_POINT(0, 0), LIBUI_POINT(260, 10)),
-
 
176
    .fill_color = 0xa0000000,
-
 
177
    .fill_color_selected = 0x60ffffff,
-
 
178
    .icon_pos = LIBUI_POINT(0, 0),
-
 
179
    .icon = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 0), LIBUI_POINT(0, 0)),
-
 
180
                          LIBUI_POINT(0, 0)),
-
 
181
    .icon_opacity = 0,
-
 
182
    .icon_selected = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 0), LIBUI_POINT(0, 0)),
-
 
183
                                   LIBUI_POINT(0, 0)),
-
 
184
    .icon_selected_opacity = 0,
-
 
185
    .text = "Clear Rockbox database",
-
 
186
    .text_pos = LIBUI_POINT(1, 1),
-
 
187
    .text_color = 0xffffffff,
-
 
188
    .text_color_selected = 0xff7fffff
-
 
189
};
-
 
190
 
-
 
191
void run_cleardb(void** firmware, void** app, int* size)
-
 
192
{
-
 
193
    remove("/.rockbox/database_0.tcd");
-
 
194
    remove("/.rockbox/database_1.tcd");
-
 
195
    remove("/.rockbox/database_2.tcd");
-
 
196
    remove("/.rockbox/database_3.tcd");
-
 
197
    remove("/.rockbox/database_4.tcd");
-
 
198
    remove("/.rockbox/database_5.tcd");
-
 
199
    remove("/.rockbox/database_6.tcd");
-
 
200
    remove("/.rockbox/database_7.tcd");
-
 
201
    remove("/.rockbox/database_8.tcd");
-
 
202
    remove("/.rockbox/database_9.tcd");
-
 
203
    remove("/.rockbox/database_idx.tcd");
-
 
204
    remove("/.rockbox/database_tmp.tcd");
-
 
205
    remove("/.rockbox/database_state.tcd");
-
 
206
    remove("/.rockbox/database_changelog.txt");
-
 
207
    memcpy(framebuf, bg, 320 * 240 * 3);
-
 
208
    message(109, "Rockbox  database", "has been cleared.");
-
 
209
}
-
 
210
 
-
 
211
struct chooser_renderer_list_itemdata toolchooser_rparams_reformat =
-
 
212
{
-
 
213
    .size = LIBUI_POINT(260, 10),
-
 
214
    .fill_box = LIBUI_BOX(LIBUI_POINT(0, 0), LIBUI_POINT(260, 10)),
-
 
215
    .fill_color = 0xa0000000,
-
 
216
    .fill_color_selected = 0x60ffffff,
-
 
217
    .icon_pos = LIBUI_POINT(0, 0),
-
 
218
    .icon = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 0), LIBUI_POINT(0, 0)),
-
 
219
                          LIBUI_POINT(0, 0)),
-
 
220
    .icon_opacity = 0,
-
 
221
    .icon_selected = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 0), LIBUI_POINT(0, 0)),
-
 
222
                                   LIBUI_POINT(0, 0)),
-
 
223
    .icon_selected_opacity = 0,
-
 
224
    .text = "Reformat data partition",
-
 
225
    .text_pos = LIBUI_POINT(1, 1),
-
 
226
    .text_color = 0xffffffff,
-
 
227
    .text_color_selected = 0xff7fffff
-
 
228
};
-
 
229
 
-
 
230
void fat32_progressbar_init(void* user, int max)
-
 
231
{
-
 
232
    progressbar_init((struct progressbar_state*)user,
-
 
233
                     15, 304, 135, 159, 0x77ff, 0xe8, 0x125f, 0, max);
-
 
234
}
-
 
235
 
-
 
236
void fat32_progressbar_update(void* user, int current)
-
 
237
{
-
 
238
    progressbar_setpos((struct progressbar_state*)user, current, false);
-
 
239
}
-
 
240
 
-
 
241
void run_reformat(void** firmware, void** app, int* size)
-
 
242
{
-
 
243
    memcpy(framebuf, bg, 320 * 240 * 3);
-
 
244
    rendertext(framebuf, 70, 125, 320, 0xff7fffff, 0, "Reformatting data partition...");
-
 
245
    displaylcd(0, 0, 320, 240, framebuf, 0, 0, 320);
-
 
246
    struct emcorelib_header* libmkfat32 = loadlib(LIBMKFAT32_IDENTIFIER,
-
 
247
                                                  LIBMKFAT32_API_VERSION, "libmkf32");
-
 
248
    struct libmkfat32_api* mf32 = (struct libmkfat32_api*)libmkfat32->api;
-
 
249
    struct storage_info storageinfo;
-
 
250
    storage_get_info(0, &storageinfo);
-
 
251
    struct progressbar_state progressbar;
-
 
252
    int rc = mf32->mkfat32(0, 0, storageinfo.num_sectors, 4096, 1, "iPodClassic",
-
 
253
                           &progressbar, fat32_progressbar_init, fat32_progressbar_update);
-
 
254
    if (rc < 0) panicf(PANIC_KILLTHREAD, "Error formatting hard drive: %08X", rc);
-
 
255
    release_library(libmkfat32);
-
 
256
    library_unload(libmkfat32);
-
 
257
    memcpy(framebuf, bg, 320 * 240 * 3);
-
 
258
    message(106, "Data partition has", "been  reformatted.");
-
 
259
}
-
 
260
 
-
 
261
struct chooser_renderer_list_params toolchooser_rparams =
-
 
262
{
-
 
263
    .version = CHOOSER_RENDERER_LIST_PARAMS_VERSION,
-
 
264
    .copy_dest = LIBUI_LOCATION(LIBUI_BUFFER(NULL, 320), LIBUI_POINT(0, 0)),
-
 
265
    .copy_src = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 320), LIBUI_POINT(0, 0)),
-
 
266
                              LIBUI_POINT(320, 240)),
-
 
267
    .bg_dest = LIBUI_LOCATION(LIBUI_BUFFER(NULL, 0), LIBUI_POINT(0, 0)),
-
 
268
    .bg_src = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 0), LIBUI_POINT(0, 0)),
-
 
269
                            LIBUI_POINT(0, 0)),
-
 
270
    .bg_opacity = 0,
-
 
271
    .fill_dest = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 0), LIBUI_POINT(0, 0)),
-
 
272
                               LIBUI_POINT(0, 0)),
-
 
273
    .fill_color = 0,
-
 
274
    .viewport = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 320), LIBUI_POINT(30, 50)),
-
 
275
                              LIBUI_POINT(260, 160)),
-
 
276
    .blit_dest = LIBUI_POINT(0, 0),
-
 
277
    .blit_src = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 320), LIBUI_POINT(0, 0)),
-
 
278
                              LIBUI_POINT(320, 240)),
-
 
279
    .preblit = NULL,
-
 
280
    .postblit = NULL
-
 
281
};
-
 
282
 
-
 
283
struct chooser_action_handler_wheel_params toolchooser_aparams =
-
 
284
{
-
 
285
    .version = CHOOSER_ACTION_HANDLER_WHEEL_PARAMS_VERSION,
-
 
286
    .stepsperitem = 128,
-
 
287
    .eventfilter = NULL,
-
 
288
    .timeout_initial = TIMEOUT_BLOCK,
-
 
289
    .timeout_idle = TIMEOUT_BLOCK,
-
 
290
    .timeout_item = 0,
-
 
291
    .tick_force_redraw = false,
-
 
292
    .buttoncount = 5,
-
 
293
    .buttonmap =
-
 
294
    {
-
 
295
        CHOOSER_ACTION_HANDLER_WHEEL_ACTION_SELECT,
-
 
296
        CHOOSER_ACTION_HANDLER_WHEEL_ACTION_NEXT,
-
 
297
        CHOOSER_ACTION_HANDLER_WHEEL_ACTION_PREV,
-
 
298
        CHOOSER_ACTION_HANDLER_WHEEL_ACTION_NEXT,
-
 
299
        CHOOSER_ACTION_HANDLER_WHEEL_ACTION_PREV
-
 
300
    }
-
 
301
};
-
 
302
 
-
 
303
struct chooser_info toolchooser =
-
 
304
{
-
 
305
    .version = CHOOSER_INFO_VERSION,
-
 
306
    .actionhandler = NULL,
-
 
307
    .actionhandlerparams = &toolchooser_aparams,
-
 
308
    .renderer = NULL,
-
 
309
    .rendererparams = &toolchooser_rparams,
-
 
310
    .userparams = NULL,
-
 
311
    .tickinterval = 10000000,
-
 
312
    .itemcount = 6,
-
 
313
    .defaultitem = 0,
-
 
314
    .items =
-
 
315
    {
-
 
316
        {
-
 
317
            .user = NULL,
-
 
318
            .actionparams = NULL,
-
 
319
            .renderparams = &toolchooser_rparams_mainchooser
-
 
320
        },
-
 
321
        {
-
 
322
            .user = run_umsboot,
-
 
323
            .actionparams = NULL,
-
 
324
            .renderparams = &toolchooser_rparams_umsboot
-
 
325
        },
-
 
326
        {
-
 
327
            .user = run_rockbox_fallback,
-
 
328
            .actionparams = NULL,
-
 
329
            .renderparams = &toolchooser_rparams_rockbox_fallback
-
 
330
        },
-
 
331
        {
-
 
332
            .user = run_clearcfg,
-
 
333
            .actionparams = NULL,
-
 
334
            .renderparams = &toolchooser_rparams_clearcfg
-
 
335
        },
-
 
336
        {
-
 
337
            .user = run_cleardb,
-
 
338
            .actionparams = NULL,
-
 
339
            .renderparams = &toolchooser_rparams_cleardb
-
 
340
        },
-
 
341
        {
-
 
342
            .user = run_reformat,
-
 
343
            .actionparams = NULL,
-
 
344
            .renderparams = &toolchooser_rparams_reformat
-
 
345
        }
-
 
346
    }
-
 
347
};
-
 
348
 
10
bool mychooser_preblit(struct chooser_data* data)
349
bool mainchooser_preblit(struct chooser_data* data)
11
{
350
{
12
    char buf[4];
351
    char buf[4];
13
    struct chooser_action_handler_wheel_data* adata;
352
    struct chooser_action_handler_wheel_data* adata;
14
    adata = (struct chooser_action_handler_wheel_data*)(data->actionhandlerdata);
353
    adata = (struct chooser_action_handler_wheel_data*)(data->actionhandlerdata);
15
    snprintf(buf, sizeof(buf), "%3d", adata->timeout_remaining / 1000000);
354
    snprintf(buf, sizeof(buf), "%3d", adata->timeout_remaining / 1000000);
16
    rendertext(framebuf, 302, 232, 320, 0xffffcccc, 0, buf);
355
    rendertext(framebuf, 302, 232, 320, 0xffffcccc, 0, buf);
17
    return false;
356
    return false;
18
}
357
}
19
 
358
 
20
 
-
 
21
struct chooser_renderer_iconflow_itemdata mychooser_rparams_0 =
359
struct chooser_renderer_iconflow_itemdata mainchooser_rparams_powerdown =
22
{
360
{
23
    .icon = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 80), LIBUI_POINT(0, 56)),
361
    .icon = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 80), LIBUI_POINT(0, 56)),
24
                          LIBUI_POINT(80, 72)),
362
                          LIBUI_POINT(80, 79)),
25
    .icon_selected = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 80), LIBUI_POINT(0, 56)),
363
    .icon_selected = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 80), LIBUI_POINT(0, 56)),
26
                                   LIBUI_POINT(80, 72)),
364
                                   LIBUI_POINT(80, 79)),
27
    .text = "Power off",
365
    .text = "Power off",
28
    .text_color = 0xffffcccc,
366
    .text_color = 0xffffcccc,
29
};
367
};
30
 
368
 
-
 
369
void run_powerdown(void** firmware, void** app, int* size)
-
 
370
{
-
 
371
    shutdown(true);
-
 
372
    power_off();
-
 
373
}
-
 
374
 
31
struct chooser_renderer_iconflow_itemdata mychooser_rparams_1 =
375
struct chooser_renderer_iconflow_itemdata mainchooser_rparams_rockbox =
32
{
376
{
33
    .icon = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 80), LIBUI_POINT(0, 0)),
377
    .icon = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 80), LIBUI_POINT(0, 0)),
34
                          LIBUI_POINT(80, 25)),
378
                          LIBUI_POINT(80, 25)),
35
    .icon_selected = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 80), LIBUI_POINT(0, 0)),
379
    .icon_selected = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 80), LIBUI_POINT(0, 0)),
36
                                   LIBUI_POINT(80, 25)),
380
                                   LIBUI_POINT(80, 25)),
37
    .text = "Rockbox",
381
    .text = "Rockbox",
38
    .text_color = 0xffffcccc,
382
    .text_color = 0xffffcccc,
39
};
383
};
40
 
384
 
-
 
385
void run_rockbox(void** firmware, void** app, int* size)
-
 
386
{
-
 
387
    int i;
-
 
388
    for (i = 1; i <= 96; i += 19)
-
 
389
    {
-
 
390
        if (i < 96)
-
 
391
            ui->blend(320, 240, 50, framebuf, 0, 0, 320,
-
 
392
                        framebuf, 0, 0, 320, bg, 0, 0, 320);
-
 
393
        else memcpy(framebuf, bg, 320 * 240 * 3);
-
 
394
        ui->blit(280, MIN(86, i), 3, framebuf, 20, MAX(0, i - 86), 320,
-
 
395
                    rbxlogo, 0, MAX(0, 86 - i), 280);
-
 
396
        displaylcd(0, 0, 320, 240, framebuf, 0, 0, 320);
-
 
397
    }
-
 
398
    boot->load_from_file(firmware, size, true, "/.rockbox/rockbox.ipod", 0);
-
 
399
    if (!*firmware)
-
 
400
    {
-
 
401
        message(76, "Loading rockbox.ipod failed!", "  Trying fallback image...  ");
-
 
402
        boot->load_from_flash(firmware, size, true, "rockbox ", 0x100000);
-
 
403
    }
-
 
404
    if (!*firmware)
-
 
405
    {
-
 
406
        memcpy(framebuf, bg, 320 * 240 * 3);
-
 
407
        message(91, "Loading Rockbox failed!", "Returning to main menu.");
-
 
408
    }
-
 
409
}
-
 
410
 
41
struct chooser_renderer_iconflow_itemdata mychooser_rparams_2 =
411
struct chooser_renderer_iconflow_itemdata mainchooser_rparams_console =
42
{
412
{
43
    .icon = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 80), LIBUI_POINT(0, 25)),
413
    .icon = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 80), LIBUI_POINT(0, 25)),
44
                          LIBUI_POINT(80, 31)),
414
                          LIBUI_POINT(80, 31)),
45
    .icon_selected = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 80), LIBUI_POINT(0, 25)),
415
    .icon_selected = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 80), LIBUI_POINT(0, 25)),
46
                                   LIBUI_POINT(80, 31)),
416
                                   LIBUI_POINT(80, 31)),
47
    .text = "emCORE console",
417
    .text = "emCORE console",
48
    .text_color = 0xffffcccc,
418
    .text_color = 0xffffcccc,
49
};
419
};
50
 
420
 
51
struct chooser_renderer_iconflow_itemdata mychooser_rparams_3 =
421
struct chooser_renderer_iconflow_itemdata mainchooser_rparams_toolchooser =
52
{
422
{
53
    .icon = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 80), LIBUI_POINT(0, 130)),
423
    .icon = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 80), LIBUI_POINT(0, 135)),
54
                          LIBUI_POINT(80, 55)),
424
                          LIBUI_POINT(80, 85)),
55
    .icon_selected = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 80), LIBUI_POINT(0, 130)),
425
    .icon_selected = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 80), LIBUI_POINT(0, 135)),
56
                                   LIBUI_POINT(80, 55)),
426
                                   LIBUI_POINT(80, 85)),
57
    .text = "UMSboot",
427
    .text = "Tools",
58
    .text_color = 0xffffcccc,
428
    .text_color = 0xffffcccc,
59
};
429
};
60
 
430
 
61
struct chooser_renderer_iconflow_params mychooser_rparams =
431
static void run_toolchooser(void** firmware, void** app, int* size)
62
{
432
{
-
 
433
    const struct chooser_item* result = ui->chooser_run(&toolchooser);
-
 
434
    if (!result->user) return;
-
 
435
    void (*selected_function)(void** firmware, void** app, int* size);
-
 
436
    selected_function = (void(*)(void** firmware, void** app, int* size))(result->user);
-
 
437
    selected_function(firmware, app, size);
-
 
438
}
-
 
439
 
-
 
440
struct chooser_renderer_iconflow_params mainchooser_rparams =
-
 
441
{
63
    .version = CHOOSER_RENDERER_LIST_PARAMS_VERSION,
442
    .version = CHOOSER_RENDERER_ICONFLOW_PARAMS_VERSION,
64
    .copy_dest = LIBUI_LOCATION(LIBUI_BUFFER(NULL, 320), LIBUI_POINT(0, 0)),
443
    .copy_dest = LIBUI_LOCATION(LIBUI_BUFFER(NULL, 320), LIBUI_POINT(0, 0)),
65
    .copy_src = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 320), LIBUI_POINT(0, 0)),
444
    .copy_src = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 320), LIBUI_POINT(0, 0)),
66
                              LIBUI_POINT(320, 240)),
445
                              LIBUI_POINT(320, 240)),
67
    .bg_dest = LIBUI_LOCATION(LIBUI_BUFFER(NULL, 0), LIBUI_POINT(0, 0)),
446
    .bg_dest = LIBUI_LOCATION(LIBUI_BUFFER(NULL, 0), LIBUI_POINT(0, 0)),
68
    .bg_src = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 0), LIBUI_POINT(0, 0)),
447
    .bg_src = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 0), LIBUI_POINT(0, 0)),
Line 78... Line 457...
78
    .blit_src = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 320), LIBUI_POINT(0, 0)),
457
    .blit_src = LIBUI_SURFACE(LIBUI_LOCATION(LIBUI_BUFFER(NULL, 320), LIBUI_POINT(0, 0)),
79
                              LIBUI_POINT(320, 240)),
458
                              LIBUI_POINT(320, 240)),
80
    .smoothness = 500000,
459
    .smoothness = 500000,
81
    .startposition = -3,
460
    .startposition = -3,
82
    .iconsinview = 4,
461
    .iconsinview = 4,
83
    .preblit = mychooser_preblit,
462
    .preblit = mainchooser_preblit,
84
    .postblit = NULL
463
    .postblit = NULL
85
};
464
};
86
 
465
 
87
struct chooser_action_handler_wheel_params mychooser_aparams =
466
struct chooser_action_handler_wheel_params mainchooser_aparams =
88
{
467
{
89
    .version = CHOOSER_ACTION_HANDLER_WHEEL_PARAMS_VERSION,
468
    .version = CHOOSER_ACTION_HANDLER_WHEEL_PARAMS_VERSION,
90
    .stepsperitem = 512,
469
    .stepsperitem = 512,
91
    .eventfilter = NULL,
470
    .eventfilter = NULL,
92
    .timeout_initial = 30500000,
471
    .timeout_initial = 30500000,
Line 100... Line 479...
100
        CHOOSER_ACTION_HANDLER_WHEEL_ACTION_NEXT,
479
        CHOOSER_ACTION_HANDLER_WHEEL_ACTION_NEXT,
101
        CHOOSER_ACTION_HANDLER_WHEEL_ACTION_PREV
480
        CHOOSER_ACTION_HANDLER_WHEEL_ACTION_PREV
102
    }
481
    }
103
};
482
};
104
 
483
 
105
struct chooser_info mychooser =
484
struct chooser_info mainchooser =
106
{
485
{
107
    .version = CHOOSER_INFO_VERSION,
486
    .version = CHOOSER_INFO_VERSION,
108
    .actionhandler = NULL,
487
    .actionhandler = NULL,
109
    .actionhandlerparams = &mychooser_aparams,
488
    .actionhandlerparams = &mainchooser_aparams,
110
    .renderer = NULL,
489
    .renderer = NULL,
111
    .rendererparams = &mychooser_rparams,
490
    .rendererparams = &mainchooser_rparams,
112
    .userparams = NULL,
491
    .userparams = NULL,
113
    .tickinterval = 990000,
492
    .tickinterval = 990000,
114
    .itemcount = 4,
493
    .itemcount = 4,
115
    .defaultitem = 1,
494
    .defaultitem = 1,
116
    .items =
495
    .items =
117
    {
496
    {
118
        {
497
        {
119
            .user = (void*)0,
498
            .user = (void*)run_powerdown,
120
            .actionparams = NULL,
499
            .actionparams = NULL,
121
            .renderparams = &mychooser_rparams_0
500
            .renderparams = &mainchooser_rparams_powerdown
122
        },
501
        },
123
        {
502
        {
124
            .user = (void*)1,
503
            .user = (void*)run_rockbox,
125
            .actionparams = NULL,
504
            .actionparams = NULL,
126
            .renderparams = &mychooser_rparams_1
505
            .renderparams = &mainchooser_rparams_rockbox
127
        },
506
        },
128
        {
507
        {
129
            .user = (void*)2,
508
            .user = NULL,
130
            .actionparams = NULL,
509
            .actionparams = NULL,
131
            .renderparams = &mychooser_rparams_2
510
            .renderparams = &mainchooser_rparams_console
132
        },
511
        },
133
        {
512
        {
134
            .user = (void*)3,
513
            .user = run_toolchooser,
135
            .actionparams = NULL,
514
            .actionparams = NULL,
136
            .renderparams = &mychooser_rparams_3
515
            .renderparams = &mainchooser_rparams_toolchooser
137
        }
516
        }
138
    }
517
    }
139
};
518
};
140
 
519
 
-
 
520
static void run_mainchooser(void** firmware, void** app, int* size)
-
 
521
{
-
 
522
    while (!*firmware && !*app)
-
 
523
    {
-
 
524
        const struct chooser_item* result = ui->chooser_run(&mainchooser);
-
 
525
        if (!result->user) return;
-
 
526
        void (*selected_function)(void** firmware, void** app, int* size);
-
 
527
        selected_function = (void(*)(void** firmware, void** app, int* size))(result->user);
-
 
528
        selected_function(firmware, app, size);
-
 
529
    }
-
 
530
}
141
 
531
 
142
static void main()
532
static void main()
143
{
533
{
144
    struct emcorelib_header* libboot = get_library(LIBBOOT_IDENTIFIER, LIBBOOT_API_VERSION, LIBSOURCE_BOOTFLASH, "libboot ");
-
 
145
    if (!libboot) panicf(PANIC_KILLTHREAD, "Could not load booting library!");
-
 
146
    struct libboot_api* boot = (struct libboot_api*)libboot->api;
-
 
147
    struct emcorelib_header* libpng = get_library(LIBPNG_IDENTIFIER, LIBPNG_API_VERSION, LIBSOURCE_BOOTFLASH, "libpng  ");
534
    struct emcorelib_header* libpng = loadlib(LIBPNG_IDENTIFIER, LIBPNG_API_VERSION, "libpng  ");
148
    if (!libpng) panicf(PANIC_KILLTHREAD, "Could not load PNG decoder library!");
-
 
149
    struct libpng_api* png = (struct libpng_api*)libpng->api;
535
    png = (struct libpng_api*)libpng->api;
150
    struct emcorelib_header* libui = get_library(LIBUI_IDENTIFIER, LIBUI_API_VERSION, LIBSOURCE_BOOTFLASH, "libui   ");
-
 
151
    if (!libui) panicf(PANIC_KILLTHREAD, "Could not load user interface library!");
536
    bg = loadpng("backgrnd", (void* (*)(struct png_info*))(png->png_decode_rgb));
152
    struct libui_api* ui = (struct libui_api*)libui->api;
-
 
153
    int size = bootflash_filesize("backgrnd");
-
 
154
    if (size == -1) panicf(PANIC_KILLTHREAD, "Could not find background image!");
537
    icons = loadpng("iconset ", (void* (*)(struct png_info*))(png->png_decode_rgba));
155
    void* buf = memalign(0x10, size);
-
 
156
    if (!buf) panicf(PANIC_KILLTHREAD, "Could not allocate buffer for background image!");
-
 
157
    bootflash_read("backgrnd", buf, 0, size);
-
 
158
    struct png_info* handle = png->png_open(buf, size);
-
 
159
    if (!handle) panicf(PANIC_KILLTHREAD, "Could not parse background image!");
-
 
160
    struct png_rgb* bg = png->png_decode_rgb(handle);
538
    rbxlogo = loadpng("rbxlogo ", (void* (*)(struct png_info*))(png->png_decode_rgb));
161
    if (!bg) panicf(PANIC_KILLTHREAD, "Could not decode background image!");
-
 
162
    png->png_destroy(handle);
539
    release_library(libpng);
163
    free(buf);
-
 
164
    size = bootflash_filesize("iconset ");
-
 
165
    if (size == -1) panicf(PANIC_KILLTHREAD, "Could not find icon set!");
-
 
166
    buf = memalign(0x10, size);
540
    library_unload(libpng);
167
    if (!buf) panicf(PANIC_KILLTHREAD, "Could not allocate buffer for icon set!");
-
 
168
    bootflash_read("iconset ", buf, 0, size);
-
 
169
    handle = png->png_open(buf, size);
-
 
170
    if (!handle) panicf(PANIC_KILLTHREAD, "Could not parse icon set!");
-
 
171
    struct png_rgba* icons = png->png_decode_rgba(handle);
541
    struct emcorelib_header* libboot = loadlib(LIBBOOT_IDENTIFIER,
172
    if (!icons) panicf(PANIC_KILLTHREAD, "Could not decode icon set!");
542
                                               LIBBOOT_API_VERSION, "libboot ");
173
    png->png_destroy(handle);
-
 
174
    free(buf);
-
 
175
    size = bootflash_filesize("rbxlogo ");
543
    boot = (struct libboot_api*)libboot->api;
176
    if (size == -1) panicf(PANIC_KILLTHREAD, "Could not find Rockbox logo!");
544
    struct emcorelib_header* libui = loadlib(LIBUI_IDENTIFIER, LIBUI_API_VERSION, "libui   ");
177
    buf = memalign(0x10, size);
545
    ui = (struct libui_api*)libui->api;
178
    if (!buf) panicf(PANIC_KILLTHREAD, "Could not allocate buffer for Rockbox logo!");
-
 
179
    bootflash_read("rbxlogo ", buf, 0, size);
-
 
180
    handle = png->png_open(buf, size);
-
 
181
    if (!handle) panicf(PANIC_KILLTHREAD, "Could not parse Rockbox logo!");
-
 
182
    struct png_rgb* rbxlogo = png->png_decode_rgb(handle);
-
 
183
    if (!rbxlogo) panicf(PANIC_KILLTHREAD, "Could not decode Rockbox logo!");
-
 
184
    png->png_destroy(handle);
-
 
185
    free(buf);
-
 
186
    framebuf = malloc(320 * 240 * 3);
546
    framebuf = malloc(320 * 240 * 3);
187
    if (!framebuf) panicf(PANIC_KILLTHREAD, "Could not allocate framebuffer!");
547
    if (!framebuf) panicf(PANIC_KILLTHREAD, "Could not allocate framebuffer!");
-
 
548
 
188
    mychooser.actionhandler = ui->chooser_action_handler_wheel;
549
    mainchooser.actionhandler = ui->chooser_action_handler_wheel;
189
    mychooser.renderer = ui->chooser_renderer_iconflow;
550
    mainchooser.renderer = ui->chooser_renderer_iconflow;
190
    mychooser_rparams.copy_dest.buf.addr = framebuf;
551
    mainchooser_rparams.copy_dest.buf.addr = framebuf;
191
    mychooser_rparams.copy_src.loc.buf.addr = bg;
552
    mainchooser_rparams.copy_src.loc.buf.addr = bg;
192
    mychooser_rparams.viewport.loc.buf.addr = framebuf;
553
    mainchooser_rparams.viewport.loc.buf.addr = framebuf;
193
    mychooser_rparams.blit_src.loc.buf.addr = framebuf;
554
    mainchooser_rparams.blit_src.loc.buf.addr = framebuf;
194
    mychooser_rparams_0.icon.loc.buf.addr = icons;
555
    mainchooser_rparams_powerdown.icon.loc.buf.addr = icons;
195
    mychooser_rparams_0.icon_selected.loc.buf.addr = icons;
556
    mainchooser_rparams_powerdown.icon_selected.loc.buf.addr = icons;
196
    mychooser_rparams_1.icon.loc.buf.addr = icons;
557
    mainchooser_rparams_rockbox.icon.loc.buf.addr = icons;
197
    mychooser_rparams_1.icon_selected.loc.buf.addr = icons;
558
    mainchooser_rparams_rockbox.icon_selected.loc.buf.addr = icons;
198
    mychooser_rparams_2.icon.loc.buf.addr = icons;
559
    mainchooser_rparams_console.icon.loc.buf.addr = icons;
199
    mychooser_rparams_2.icon_selected.loc.buf.addr = icons;
560
    mainchooser_rparams_console.icon_selected.loc.buf.addr = icons;
200
    mychooser_rparams_3.icon.loc.buf.addr = icons;
561
    mainchooser_rparams_toolchooser.icon.loc.buf.addr = icons;
201
    mychooser_rparams_3.icon_selected.loc.buf.addr = icons;
562
    mainchooser_rparams_toolchooser.icon_selected.loc.buf.addr = icons;
-
 
563
 
-
 
564
    toolchooser.actionhandler = ui->chooser_action_handler_wheel;
-
 
565
    toolchooser.renderer = ui->chooser_renderer_list;
-
 
566
    toolchooser_rparams.copy_dest.buf.addr = framebuf;
-
 
567
    toolchooser_rparams.copy_src.loc.buf.addr = bg;
-
 
568
    toolchooser_rparams.viewport.loc.buf.addr = framebuf;
-
 
569
    toolchooser_rparams.blit_src.loc.buf.addr = framebuf;
-
 
570
 
202
    void* firmware = NULL;
571
    void* firmware = NULL;
203
    while (!firmware)
-
 
204
    {
-
 
205
        const struct chooser_item* result = ui->chooser_run(&mychooser);
-
 
206
        switch ((int)(result->user))
-
 
207
        {
-
 
208
        case 0:
-
 
209
            shutdown(true);
-
 
210
            power_off();
-
 
211
            break;
-
 
212
        case 1:
-
 
213
        {
-
 
214
            int i;
-
 
215
            for (i = 1; i <= 96; i += 19)
-
 
216
            {
-
 
217
                if (i < 96)
-
 
218
                    ui->blend(320, 240, 50, framebuf, 0, 0, 320,
-
 
219
                              framebuf, 0, 0, 320, bg, 0, 0, 320);
-
 
220
                else memcpy(framebuf, bg, 320 * 240 * 3);
-
 
221
                ui->blit(280, MIN(86, i), 3, framebuf, 20, MAX(0, i - 86), 320,
-
 
222
                         rbxlogo, 0, MAX(0, 86 - i), 280);
-
 
223
                displaylcd(0, 0, 320, 240, framebuf, 0, 0, 320);
-
 
224
            }
-
 
225
            int fd = file_open("/.rockbox/rockbox.ipod", O_RDONLY);
-
 
226
            if (fd > 0)
-
 
227
            {
-
 
228
                size = filesize(fd);
-
 
229
                if (size > 0)
-
 
230
                {
-
 
231
                    void* buf = memalign(0x10, size);
-
 
232
                    if (buf)
-
 
233
                    {
-
 
234
                        if (read(fd, buf, size) == size)
-
 
235
                            if (!boot->verify_rockbox_checksum(buf, size))
-
 
236
                                firmware = buf;
-
 
237
                        if (!firmware) free(buf);
-
 
238
                    }
-
 
239
                }
-
 
240
                close(fd);
-
 
241
            }
-
 
242
            if (!firmware)
-
 
243
            {
-
 
244
                rendertext(framebuf, 76, 140, 320, 0xff3333ff, 0xa0000000, "Loading rockbox.ipod failed!");
-
 
245
                rendertext(framebuf, 76, 148, 320, 0xff3333ff, 0xa0000000, "  Trying fallback image...  ");
-
 
246
                displaylcd(0, 0, 320, 240, framebuf, 0, 0, 320);
-
 
247
                sleep(5000000);
-
 
248
                size = bootflash_filesize("rockbox ");
-
 
249
                if (size > 0)
-
 
250
                {
-
 
251
                    void* buf = memalign(0x10, size);
-
 
252
                    if (buf)
-
 
253
                    {
-
 
254
                        bootflash_read("rockbox ", buf, 0, size);
-
 
255
                        if (bootflash_attributes("rockbox ") & 0x800)
-
 
256
                        {
-
 
257
                            void* buf2 = malloc(0x100000);
-
 
258
                            if (buf2)
-
 
259
                            {
-
 
260
                                if (!ucl_decompress(buf, size, buf2, (uint32_t*)&size))
-
 
261
                                {
-
 
262
                                    free(buf);
-
 
263
                                    buf = realloc(buf2, size);
-
 
264
                                    if (!buf) buf = buf2;
-
 
265
                                    if (!boot->verify_rockbox_checksum(buf, size))
-
 
266
                                        firmware = buf;
-
 
267
                                    else free(buf);
-
 
268
                                }
-
 
269
                                else
-
 
270
                                {
-
 
271
                                    free(buf2);
-
 
272
                                    free(buf);
-
 
273
                                }
-
 
274
                            }
-
 
275
                            else free(buf);
-
 
276
                        }
-
 
277
                        else
-
 
278
                        {
-
 
279
                            if (!boot->verify_rockbox_checksum(buf, size)) firmware = buf;
-
 
280
                            else free(buf);
-
 
281
                        }
-
 
282
                    }
572
    void* app = NULL;
283
                }
-
 
284
            }
-
 
285
            if (!firmware)
-
 
286
            {
-
 
287
                memcpy(framebuf, bg, 320 * 240 * 3);
-
 
288
                rendertext(framebuf, 91, 140, 320, 0xff3333ff, 0xa0000000, "Loading Rockbox failed!");
-
 
289
                rendertext(framebuf, 91, 148, 320, 0xff3333ff, 0xa0000000, "Returning to main menu.");
-
 
290
                displaylcd(0, 0, 320, 240, framebuf, 0, 0, 320);
-
 
291
                sleep(5000000);
-
 
292
            }
-
 
293
            break;
-
 
294
        }
-
 
295
        case 2:
-
 
296
            goto leave;
-
 
297
        case 3:
-
 
298
            size = bootflash_filesize("umsboot ");
-
 
299
            if (size > 0)
-
 
300
            {
573
    int size;
301
                void* buf = memalign(0x10, size);
574
    run_mainchooser(&firmware, &app, &size);
302
                if (buf)
-
 
303
                {
-
 
304
                    bootflash_read("umsboot ", buf, 0, size);
-
 
305
                    if (bootflash_attributes("umsboot ") & 0x800)
-
 
306
                    {
-
 
307
                        void* buf2 = malloc(0x10000);
-
 
308
                        if (buf2)
-
 
309
                        {
-
 
310
                            if (!ucl_decompress(buf, size, buf2, (uint32_t*)&size))
-
 
311
                            {
-
 
312
                                free(buf);
-
 
313
                                buf = realloc(buf2, size);
-
 
314
                                if (!buf) buf = buf2;
-
 
315
                                firmware = buf;
-
 
316
                            }
-
 
317
                            else
-
 
318
                            {
-
 
319
                                free(buf2);
-
 
320
                                free(buf);
-
 
321
                            }
-
 
322
                        }
-
 
323
                        else free(buf);
-
 
324
                    }
-
 
325
                    else firmware = buf;
-
 
326
                }
-
 
327
            }
-
 
328
            if (!firmware)
-
 
329
            {
-
 
330
                memcpy(framebuf, bg, 320 * 240 * 3);
-
 
331
                rendertext(framebuf, 91, 140, 320, 0xff3333ff, 0xa0000000, "Loading UMSboot failed!");
-
 
332
                rendertext(framebuf, 91, 148, 320, 0xff3333ff, 0xa0000000, "Returning to main menu.");
-
 
333
                displaylcd(0, 0, 320, 240, framebuf, 0, 0, 320);
-
 
334
                sleep(5000000);
-
 
335
            }
-
 
336
            break;
-
 
337
        }
-
 
338
    }
575
 
339
leave:
-
 
340
    free(framebuf);
576
    free(framebuf);
341
    free(rbxlogo);
577
    free(rbxlogo);
342
    free(icons);
578
    free(icons);
343
    free(bg);
579
    free(bg);
344
    release_library(libui);
580
    release_library(libui);
345
    release_library(libpng);
-
 
346
    release_library(libboot);
581
    release_library(libboot);
347
    library_unload(libui);
582
    library_unload(libui);
348
    library_unload(libpng);
-
 
349
    library_unload(libboot);
583
    library_unload(libboot);
-
 
584
 
350
    if (firmware)
585
    if (firmware)
351
    {
586
    {
352
        shutdown(false);
587
        shutdown(false);
353
        execfirmware((void*)0x08000000, firmware, size);
588
        execfirmware((void*)0x08000000, firmware, size);
354
    }
589
    }
-
 
590
    else if (app) execimage(app, false);
355
    else cputs(3, "Dropped into emCORE console.\n");
591
    else cputs(3, "Dropped into emCORE console.\n");
356
}
592
}
357
 
593
 
358
 
-
 
359
EMCORE_APP_HEADER("Boot menu", main, 127)
594
EMCORE_APP_HEADER("Boot menu", main, 127)