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)
31 #include <linux/input.h>
35 #include "talloc/talloc.h"
36 #include "waiter/waiter.h"
37 #include "ui/common/timer.h"
38 #include "ui/common/ps3.h"
40 #include "pbt-client.h"
43 /* control to keyboard mappings for the sixaxis controller */
45 static const uint8_t ps3_sixaxis_map[] = {
50 KEY_UP, /* 4 Dpad Up */
51 KEY_RIGHT, /* 5 Dpad Right */
52 KEY_DOWN, /* 6 Dpad Down */
53 KEY_LEFT, /* 7 Dpad Left */
59 KEY_ENTER, /* 13 Circle */
61 KEY_DELETE, /* 15 Square */
67 static struct pbt_item *ps3_setup_system_item(struct pbt_menu *menu,
68 const struct pbt_menu_layout *layout)
72 struct pbt_item *main_item;
73 struct pbt_item *sub_item;
76 icon = pbt_icon_load(NULL);
80 pbt_view_get_item_rect(menu->main, layout, icon, 0, &r);
81 main_item = pbt_item_create(menu->main, menu->main, &r);
86 main_item->image = icon;
88 list_add_tail(menu->main->items_list, &main_item->list);
92 main_item->sub_items_list = talloc(main_item, struct list);
93 list_init(main_item->sub_items_list);
95 pbt_view_get_item_rect(menu->sub, layout, icon, 0, &r);
96 sub_item = pbt_item_create(main_item, menu->sub, &r);
101 sub_item->image = pbt_item_create_text_image(layout, pbt_rect_width(&r),
102 pbt_rect_height(&r), icon, "Boot GameOS",
103 "Reboot the PS3 into the GameOS");
105 list_add_tail(main_item->sub_items_list, &sub_item->list);
107 pbt_view_get_item_rect(menu->sub, layout, icon, 1, &r);
108 sub_item = pbt_item_create(main_item, menu->sub, &r);
113 sub_item->image = pbt_item_create_text_image(layout, pbt_rect_width(&r),
114 pbt_rect_height(&r), icon, "Set Video Mode",
115 "Set the current video mode");
117 list_add_tail(main_item->sub_items_list, &sub_item->list);
119 pbt_view_get_item_rect(menu->sub, layout, icon, 2, &r);
120 sub_item = pbt_item_create(main_item, menu->sub, &r);
125 sub_item->image = pbt_item_create_text_image(layout, pbt_rect_width(&r),
126 pbt_rect_height(&r), icon, "Exit to Shell",
127 "Exit to a system shell prompt");
129 list_add_tail(main_item->sub_items_list, &sub_item->list);
131 menu->sub->selected = sub_item;
132 menu->sub->items_list = main_item->sub_items_list;
137 // FIXME: need cleanup
142 static int ps3_setup_test_item(struct pbt_menu *menu,
143 const struct pbt_menu_layout *layout)
147 struct pbt_item *main_item;
148 struct pbt_item *sub_item;
151 icon = pbt_icon_load(PB_ARTWORK_PATH "/drive-harddisk.png");
155 pbt_view_get_item_rect(menu->main, layout, icon, 1, &r);
156 main_item = pbt_item_create(menu->main, menu->main, &r);
161 main_item->image = icon;
163 list_add_tail(menu->main->items_list, &main_item->list);
167 main_item->sub_items_list = talloc(main_item, struct list);
168 list_init(main_item->sub_items_list);
170 pbt_view_get_item_rect(menu->sub, layout, icon, 0, &r);
171 sub_item = pbt_item_create(main_item, menu->sub, &r);
176 sub_item->active = 0;
177 sub_item->image = pbt_item_create_text_image(layout, pbt_rect_width(&r),
178 pbt_rect_height(&r), icon, "test 1",
181 list_add_tail(main_item->sub_items_list, &sub_item->list);
183 pbt_view_get_item_rect(menu->sub, layout, icon, 1, &r);
184 sub_item = pbt_item_create(main_item, menu->sub, &r);
189 sub_item->active = 0;
190 sub_item->image = pbt_item_create_text_image(layout, pbt_rect_width(&r),
191 pbt_rect_height(&r), icon, "test 2",
194 list_add_tail(main_item->sub_items_list, &sub_item->list);
196 menu->sub->selected = sub_item;
197 menu->sub->items_list = main_item->sub_items_list;
203 // FIXME: need cleanup
208 static struct pbt_menu *ps3_menu_create(void *ctx, struct pbt_scr *scr)
211 struct pbt_menu *menu;
214 const struct pbt_border *border;
215 static const struct pbt_menu_layout layout = {
218 .title_font_size = 30,
219 .title_font_color = 0xff000000,
220 .text_font_size = 18,
221 .text_font_color = 0xff400000,
224 assert(scr && scr->sig == pbt_scr_sig);
226 menu = talloc_zero(ctx, struct pbt_menu);
231 menu->sig = pbt_menu_sig;
234 icon = pbt_icon_load(NULL);
239 /* Setup main view */
241 border = &pbt_right_border;
244 r.right = icon->width + 2 * layout.item_space + 2 * layout.icon_space
245 + border->left + border->right;
246 r.bottom = menu->scr->tscreen->height;
248 menu->main = pbt_view_create(menu, &r);
253 menu->main->background_color = 0x80000000;
254 menu->main->border = *border;
255 menu->main->items_list = talloc(menu->main, struct list);
256 list_init(menu->main->items_list);
262 r.right = menu->scr->tscreen->width;
263 r.bottom = menu->scr->tscreen->height;
265 menu->sub = pbt_view_create(menu, &r);
270 menu->sub->background_color = 0x40000000;
272 /* Setup system item */
274 menu->main->selected = ps3_setup_system_item(menu, &layout);
276 if (!menu->main->selected)
279 //ps3_setup_test_item(menu, &layout);
284 // FIXME: need cleanup
286 // FIXME: need cleanup
295 * struct ps3_gui - Main gui program instance.
300 struct ui_timer timer;
301 struct ps3_flash_values values;
305 struct pbt_frame frame;
306 struct pbt_menu *menu;
309 static struct ps3_gui ps3;
311 static struct pbt_scr *ps3_scr_from_tscreen(twin_screen_t *tscreen)
313 assert(ps3.scr.tscreen == tscreen);
317 static twin_bool_t ps3_scr_event_cb(twin_screen_t *tscreen, twin_event_t *event)
319 struct pbt_scr *scr = ps3_scr_from_tscreen(tscreen);
321 pbt_dump_event("scr", NULL, event);
323 switch(event->kind) {
324 case TwinEventJoyButton:
325 /* convert joystick events to key events */
326 // FIXME: need to test
327 if (event->u.js.control < sizeof(ps3_sixaxis_map)) {
328 event->u.key.key = ps3_sixaxis_map[event->u.js.control];
329 event->kind = event->u.js.value ? TwinEventKeyUp
339 static void sig_handler(int signum)
341 DBGS("%d\n", signum);
345 ui_timer_sigalrm(&ps3.timer);
349 // gui_resize(ps3.gui);
352 assert(0 && "unknown sig");
359 // gui_abort(ps3.gui);
365 * main - twin bootloader main routine.
368 int main(int argc, char *argv[])
370 static struct sigaction sa;
371 static struct pbt_opts opts;
376 result = pbt_opts_parse(&opts, argc, argv);
383 if (opts.show_help == pbt_opt_yes) {
388 if (opts.show_version == pbt_opt_yes) {
393 if (strcmp(opts.log_file, "-")) {
394 FILE *log = fopen(opts.log_file, "a");
397 pb_log_set_stream(log);
399 pb_log_set_stream(stderr);
402 pb_log_always_flush(1);
405 pb_log("--- pb-twin ---\n");
407 sa.sa_handler = sig_handler;
408 result = sigaction(SIGALRM, &sa, NULL);
409 result += sigaction(SIGHUP, &sa, NULL);
410 result += sigaction(SIGINT, &sa, NULL);
411 result += sigaction(SIGTERM, &sa, NULL);
412 result += sigaction(SIGWINCH, &sa, NULL);
415 pb_log("%s sigaction failed.\n", __func__);
419 ps3.values = ps3_flash_defaults;
421 if (opts.reset_defaults != pbt_opt_yes)
422 ps3.dirty_values = ps3_flash_get_values(&ps3.values);
425 twin_feature_init(); // need it???
429 #if defined(HAVE_LIBTWIN_TWIN_X11_H)
430 # if defined(USE_X11)
435 //ps3.scr.x11 = twin_x11_create(XOpenDisplay(0), 1024, 768);
436 ps3.scr.x11 = twin_x11_create(XOpenDisplay(0), 512, 384);
439 perror("failed to create x11 screen !\n");
443 ps3.scr.tscreen = ps3.scr.x11->screen;
448 result = ps3_get_video_mode(&mode);
450 /* Current becomes default if ps3_flash_get_values() failed. */
452 if (ps3.dirty_values && !result)
453 ps3.values.video_mode = mode;
455 /* Set mode if not at default. */
457 if (!result && (ps3.values.video_mode != (uint16_t)mode))
458 ps3_set_video_mode(ps3.values.video_mode);
460 ps3.scr.fbdev = twin_fbdev_create(-1, SIGUSR1);
462 if (!ps3.scr.fbdev) {
463 perror("failed to create fbdev screen !\n");
467 ps3.scr.tscreen = ps3.scr.fbdev->screen;
470 ps3.scr.tscreen->event_filter = pbt_scr_event;
472 twin_screen_set_background(ps3.scr.tscreen,
473 pbt_background_load(ps3.scr.tscreen, NULL));
477 ps3.menu = ps3_menu_create(NULL, &ps3.scr);
485 twin_fbdev_activate(ps3.scr.fbdev);
489 // need to hookup pb waiters to twin...
494 pb_log("--- end ---\n");
496 return ui_result ? EXIT_FAILURE : EXIT_SUCCESS;