2 * Petitboot twin bootloader for the PS3 game console
4 * Copyright Geoff Levand <geoff@infradead.org>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 #if defined(HAVE_CONFIG_H)
30 #include <linux/input.h>
34 #include "talloc/talloc.h"
35 #include "waiter/waiter.h"
36 #include "ui/common/timer.h"
37 #include "ui/common/ps3.h"
39 #include "pbt-client.h"
42 /* control to keyboard mappings for the sixaxis controller */
44 static const uint8_t ps3_sixaxis_map[] = {
49 KEY_UP, /* 4 Dpad Up */
50 KEY_RIGHT, /* 5 Dpad Right */
51 KEY_DOWN, /* 6 Dpad Down */
52 KEY_LEFT, /* 7 Dpad Left */
58 KEY_ENTER, /* 13 Circle */
60 KEY_DELETE, /* 15 Square */
66 static struct pbt_item *ps3_setup_system_item(struct pbt_menu *menu,
67 const struct pbt_menu_layout *layout)
71 struct pbt_item *main_item;
72 struct pbt_item *sub_item;
75 icon = pbt_icon_load(NULL);
79 pbt_view_get_item_rect(menu->main, layout, icon, 0, &r);
80 main_item = pbt_item_create(menu->main, menu->main, &r);
85 main_item->image = icon;
87 list_add_tail(menu->main->items_list, &main_item->list);
91 main_item->sub_items_list = talloc(main_item, struct list);
92 list_init(main_item->sub_items_list);
94 pbt_view_get_item_rect(menu->sub, layout, icon, 0, &r);
95 sub_item = pbt_item_create(main_item, menu->sub, &r);
100 sub_item->image = pbt_item_create_text_image(layout, pbt_rect_width(&r),
101 pbt_rect_height(&r), icon, "Boot GameOS",
102 "Reboot the PS3 into the GameOS");
104 list_add_tail(main_item->sub_items_list, &sub_item->list);
106 pbt_view_get_item_rect(menu->sub, layout, icon, 1, &r);
107 sub_item = pbt_item_create(main_item, menu->sub, &r);
112 sub_item->image = pbt_item_create_text_image(layout, pbt_rect_width(&r),
113 pbt_rect_height(&r), icon, "Set Video Mode",
114 "Set the current video mode");
116 list_add_tail(main_item->sub_items_list, &sub_item->list);
118 pbt_view_get_item_rect(menu->sub, layout, icon, 2, &r);
119 sub_item = pbt_item_create(main_item, menu->sub, &r);
124 sub_item->image = pbt_item_create_text_image(layout, pbt_rect_width(&r),
125 pbt_rect_height(&r), icon, "Exit to Shell",
126 "Exit to a system shell prompt");
128 list_add_tail(main_item->sub_items_list, &sub_item->list);
130 menu->sub->selected = sub_item;
131 menu->sub->items_list = main_item->sub_items_list;
136 // FIXME: need cleanup
141 static int ps3_setup_test_item(struct pbt_menu *menu,
142 const struct pbt_menu_layout *layout)
146 struct pbt_item *main_item;
147 struct pbt_item *sub_item;
150 icon = pbt_icon_load(PB_ARTWORK_PATH "/drive-harddisk.png");
154 pbt_view_get_item_rect(menu->main, layout, icon, 1, &r);
155 main_item = pbt_item_create(menu->main, menu->main, &r);
160 main_item->image = icon;
162 list_add_tail(menu->main->items_list, &main_item->list);
166 main_item->sub_items_list = talloc(main_item, struct list);
167 list_init(main_item->sub_items_list);
169 pbt_view_get_item_rect(menu->sub, layout, icon, 0, &r);
170 sub_item = pbt_item_create(main_item, menu->sub, &r);
175 sub_item->active = 0;
176 sub_item->image = pbt_item_create_text_image(layout, pbt_rect_width(&r),
177 pbt_rect_height(&r), icon, "test 1",
180 list_add_tail(main_item->sub_items_list, &sub_item->list);
182 pbt_view_get_item_rect(menu->sub, layout, icon, 1, &r);
183 sub_item = pbt_item_create(main_item, menu->sub, &r);
188 sub_item->active = 0;
189 sub_item->image = pbt_item_create_text_image(layout, pbt_rect_width(&r),
190 pbt_rect_height(&r), icon, "test 2",
193 list_add_tail(main_item->sub_items_list, &sub_item->list);
195 menu->sub->selected = sub_item;
196 menu->sub->items_list = main_item->sub_items_list;
202 // FIXME: need cleanup
207 static struct pbt_menu *ps3_menu_create(void *ctx, struct pbt_scr *scr)
210 struct pbt_menu *menu;
213 const struct pbt_border *border;
214 static const struct pbt_menu_layout layout = {
217 .title_font_size = 30,
218 .title_font_color = 0xff000000,
219 .text_font_size = 18,
220 .text_font_color = 0xff400000,
223 assert(scr && scr->sig == pbt_scr_sig);
225 menu = talloc_zero(ctx, struct pbt_menu);
230 menu->sig = pbt_menu_sig;
233 icon = pbt_icon_load(NULL);
238 /* Setup main view */
240 border = &pbt_right_border;
243 r.right = icon->width + 2 * layout.item_space + 2 * layout.icon_space
244 + border->left + border->right;
245 r.bottom = menu->scr->tscreen->height;
247 menu->main = pbt_view_create(menu, &r);
252 menu->main->background_color = 0x80000000;
253 menu->main->border = *border;
254 menu->main->items_list = talloc(menu->main, struct list);
255 list_init(menu->main->items_list);
261 r.right = menu->scr->tscreen->width;
262 r.bottom = menu->scr->tscreen->height;
264 menu->sub = pbt_view_create(menu, &r);
269 menu->sub->background_color = 0x40000000;
271 /* Setup system item */
273 menu->main->selected = ps3_setup_system_item(menu, &layout);
275 if (!menu->main->selected)
278 //ps3_setup_test_item(menu, &layout);
283 // FIXME: need cleanup
285 // FIXME: need cleanup
294 * struct ps3_gui - Main gui program instance.
299 struct ui_timer timer;
300 struct ps3_flash_values values;
304 struct pbt_frame frame;
305 struct pbt_menu *menu;
308 static struct ps3_gui ps3;
310 static struct pbt_scr *ps3_scr_from_tscreen(twin_screen_t *tscreen)
312 assert(ps3.scr.tscreen == tscreen);
316 static twin_bool_t ps3_scr_event_cb(twin_screen_t *tscreen, twin_event_t *event)
318 struct pbt_scr *scr = ps3_scr_from_tscreen(tscreen);
320 pbt_dump_event("scr", NULL, event);
322 switch(event->kind) {
323 case TwinEventJoyButton:
324 /* convert joystick events to key events */
325 // FIXME: need to test
326 if (event->u.js.control < sizeof(ps3_sixaxis_map)) {
327 event->u.key.key = ps3_sixaxis_map[event->u.js.control];
328 event->kind = event->u.js.value ? TwinEventKeyUp
338 static void sig_handler(int signum)
340 DBGS("%d\n", signum);
344 ui_timer_sigalrm(&ps3.timer);
348 // gui_resize(ps3.gui);
351 assert(0 && "unknown sig");
358 // gui_abort(ps3.gui);
364 * main - twin bootloader main routine.
367 int main(int argc, char *argv[])
369 static struct sigaction sa;
370 static struct pbt_opts opts;
375 result = pbt_opts_parse(&opts, argc, argv);
382 if (opts.show_help == pbt_opt_yes) {
387 if (opts.show_version == pbt_opt_yes) {
392 if (strcmp(opts.log_file, "-")) {
393 FILE *log = fopen(opts.log_file, "a");
396 pb_log_set_stream(log);
398 pb_log_set_stream(stderr);
401 pb_log_always_flush(1);
404 pb_log("--- pb-twin ---\n");
406 sa.sa_handler = sig_handler;
407 result = sigaction(SIGALRM, &sa, NULL);
408 result += sigaction(SIGHUP, &sa, NULL);
409 result += sigaction(SIGINT, &sa, NULL);
410 result += sigaction(SIGTERM, &sa, NULL);
411 result += sigaction(SIGWINCH, &sa, NULL);
414 pb_log("%s sigaction failed.\n", __func__);
418 ps3.values = ps3_flash_defaults;
420 if (opts.reset_defaults != pbt_opt_yes)
421 ps3.dirty_values = ps3_flash_get_values(&ps3.values);
424 twin_feature_init(); // need it???
428 #if defined(HAVE_LIBTWIN_TWIN_X11_H)
429 # if defined(USE_X11)
434 //ps3.scr.x11 = twin_x11_create(XOpenDisplay(0), 1024, 768);
435 ps3.scr.x11 = twin_x11_create(XOpenDisplay(0), 512, 384);
438 perror("failed to create x11 screen !\n");
442 ps3.scr.tscreen = ps3.scr.x11->screen;
447 result = ps3_get_video_mode(&mode);
449 /* Current becomes default if ps3_flash_get_values() failed. */
451 if (ps3.dirty_values && !result)
452 ps3.values.video_mode = mode;
454 /* Set mode if not at default. */
456 if (!result && (ps3.values.video_mode != (uint16_t)mode))
457 ps3_set_video_mode(ps3.values.video_mode);
459 ps3.scr.fbdev = twin_fbdev_create(-1, SIGUSR1);
461 if (!ps3.scr.fbdev) {
462 perror("failed to create fbdev screen !\n");
466 ps3.scr.tscreen = ps3.scr.fbdev->screen;
469 ps3.scr.tscreen->event_filter = pbt_scr_event;
471 twin_screen_set_background(ps3.scr.tscreen,
472 pbt_background_load(ps3.scr.tscreen, NULL));
476 ps3.menu = ps3_menu_create(NULL, &ps3.scr);
484 twin_fbdev_activate(ps3.scr.fbdev);
488 // need to hookup pb waiters to twin...
493 pb_log("--- end ---\n");
495 return ui_result ? EXIT_FAILURE : EXIT_SUCCESS;