X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=petitboot.c;h=ea7dc57619d1df9f540f6a8642182f3a621f5777;hp=478b294e7ec0f8d07dd9f643e2a5e299027b1678;hb=d353f6e823d5b8cb949e20ae1139a5b7fbb0478b;hpb=51fa27b3bfe5f11067e2b301c42451c2838575a8;ds=sidebyside diff --git a/petitboot.c b/petitboot.c index 478b294..ea7dc57 100644 --- a/petitboot.c +++ b/petitboot.c @@ -5,6 +5,8 @@ #include #include #include +#include +#include #include @@ -28,7 +30,8 @@ static twin_fbdev_t *pboot_fbdev; static twin_screen_t *pboot_screen; -#define PBOOT_INITIAL_MESSAGE "Petitboot v0.0.1" +#define PBOOT_INITIAL_MESSAGE \ + "video hack: 0=default 1=720p 2=1080i 3=1080p" #define PBOOT_LEFT_PANE_SIZE 160 #define PBOOT_LEFT_PANE_COLOR 0x80000000 @@ -138,6 +141,8 @@ static pboot_lpane_t *pboot_lpane; static pboot_rpane_t *pboot_rpane; static pboot_spane_t *pboot_spane; +static int pboot_vmode_change = -1; + /* XXX move to twin */ static inline twin_bool_t twin_rect_intersect(twin_rect_t r1, twin_rect_t r2) @@ -686,6 +691,11 @@ static twin_bool_t pboot_lpane_event (twin_window_t *window, return TWIN_FALSE; } +static void pboot_quit(void) +{ + kill(0, SIGINT); +} + twin_bool_t pboot_event_filter(twin_screen_t *screen, twin_event_t *event) { @@ -701,6 +711,25 @@ twin_bool_t pboot_event_filter(twin_screen_t *screen, pboot_cursor_hy); break; case TwinEventKeyDown: + /* Gross hack for video modes, need something better ! */ + switch(event->u.key.key) { + case KEY_0: + pboot_vmode_change = 0; /* auto */ + pboot_quit(); + return TWIN_TRUE; + case KEY_1: + pboot_vmode_change = 3; /* 720p */ + pboot_quit(); + return TWIN_TRUE; + case KEY_2: + pboot_vmode_change = 4; /* 1080i */ + pboot_quit(); + return TWIN_TRUE; + case KEY_3: + pboot_vmode_change = 5; /* 1080p */ + pboot_quit(); + return TWIN_TRUE; + } case TwinEventKeyUp: twin_screen_set_cursor(pboot_screen, NULL, 0, 0); break; @@ -827,6 +856,18 @@ static void pboot_spane_draw(twin_window_t *window) twin_path_destroy(path); } +void pboot_message(const char *message) +{ + if (pboot_spane->text) + free(pboot_spane->text); + pboot_spane->text = strdup(message); + twin_window_damage(pboot_spane->window, + 0, 0, + pboot_spane->window->pixmap->width, + pboot_spane->window->pixmap->height); + twin_window_queue_paint(pboot_spane->window); +} + static void pboot_create_spane(void) { pboot_spane = calloc(1, sizeof(pboot_spane_t)); @@ -846,7 +887,7 @@ static void pboot_create_spane(void) pboot_spane->window->draw = pboot_spane_draw; pboot_spane->window->client_data = pboot_spane; - pboot_spane->text = PBOOT_INITIAL_MESSAGE; + pboot_spane->text = strdup(PBOOT_INITIAL_MESSAGE); twin_window_show(pboot_spane->window); twin_window_queue_paint(pboot_spane->window); } @@ -966,12 +1007,22 @@ static void pboot_make_background(void) twin_screen_set_background(pboot_screen, scaledpic); } +#define PS3FB_IOCTL_SETMODE _IOW('r', 1, int) +#define PS3FB_IOCTL_GETMODE _IOR('r', 2, int) + static void exitfunc(void) { #ifndef _USE_X11 if (pboot_fbdev) twin_fbdev_destroy(pboot_fbdev); pboot_fbdev = NULL; + if (pboot_vmode_change != -1) { + int fd = open("/dev/fb0", O_RDWR); + if (fd >= 0) + ioctl(fd, PS3FB_IOCTL_SETMODE, + (unsigned long)&pboot_vmode_change); + close(fd); + } #endif } @@ -981,8 +1032,35 @@ static void sigint(int sig) syscall(__NR_exit); } +static void usage(const char *progname) +{ + fprintf(stderr, "Usage: %s [-u] [-h]\n", progname); +} + int main(int argc, char **argv) { + int c; + int udev_trigger = 0; + + for (;;) { + c = getopt(argc, argv, "u::h"); + if (c == -1) + break; + + switch (c) { + case 'u': + udev_trigger = 1; + break; + case 'h': + usage(argv[0]); + return EXIT_SUCCESS; + default: + fprintf(stderr, "Unknown option '%c'\n", c); + usage(argv[0]); + return EXIT_FAILURE; + } + } + atexit(exitfunc); signal(SIGINT, sigint); @@ -1004,7 +1082,7 @@ int main(int argc, char **argv) twin_linux_mouse_create(NULL, pboot_screen); if (pboot_fbdev != NULL) { - char *cursor_path = artwork_pathname("cursor"); + char *cursor_path = artwork_pathname("cursor.gz"); pboot_cursor = twin_load_X_cursor(cursor_path, 2, &pboot_cursor_hx, &pboot_cursor_hy); @@ -1023,7 +1101,7 @@ int main(int argc, char **argv) pboot_create_rpane(); pboot_create_spane(); - if (!pboot_start_device_discovery()) { + if (!pboot_start_device_discovery(udev_trigger)) { LOG("Couldn't start device discovery!\n"); return 1; }