X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=payloads%2Fcoreinfo%2Fcoreinfo.c;h=846cf77c1852aca008fbc69024b7b2eac8a3369a;hb=cd913bdf5c995fb3768aaaaeec364e7f5527e4e9;hp=09a405d83b06d6757a0f891d1a6948170e371552;hpb=a0c0093a09f0a7115ce73abe00b8b75afab4a08c;p=coreboot.git diff --git a/payloads/coreinfo/coreinfo.c b/payloads/coreinfo/coreinfo.c index 09a405d83..846cf77c1 100644 --- a/payloads/coreinfo/coreinfo.c +++ b/payloads/coreinfo/coreinfo.c @@ -19,20 +19,73 @@ #include "coreinfo.h" -#define SCREEN_Y 24 +#define SCREEN_Y 25 #define SCREEN_X 80 +#define KEY_ESC 27 + extern struct coreinfo_module cpuinfo_module; extern struct coreinfo_module pci_module; extern struct coreinfo_module coreboot_module; - -struct coreinfo_module *modules[] = { +extern struct coreinfo_module multiboot_module; +extern struct coreinfo_module nvram_module; +extern struct coreinfo_module bootlog_module; +extern struct coreinfo_module ramdump_module; +extern struct coreinfo_module lar_module; +extern struct coreinfo_module cbfs_module; + +struct coreinfo_module *system_modules[] = { +#ifdef CONFIG_MODULE_CPUINFO &cpuinfo_module, +#endif +#ifdef CONFIG_MODULE_PCI &pci_module, +#endif +#ifdef CONFIG_MODULE_NVRAM + &nvram_module, +#endif +#ifdef CONFIG_MODULE_RAMDUMP + &ramdump_module, +#endif +}; + +struct coreinfo_module *firmware_modules[] = { +#ifdef CONFIG_MODULE_COREBOOT &coreboot_module, +#endif +#ifdef CONFIG_MODULE_MULTIBOOT + &multiboot_module, +#endif +#ifdef CONFIG_MODULE_BOOTLOG + &bootlog_module, +#endif +#ifdef CONFIG_MODULE_LAR + &lar_module, +#endif +#ifdef CONFIG_MODULE_CBFS + &cbfs_module, +#endif }; -static WINDOW *modwin; +struct coreinfo_cat { + char name[15]; + int cur; + int count; + struct coreinfo_module **modules; +} categories[] = { + { + .name = "System", + .modules = system_modules, + .count = ARRAY_SIZE(system_modules), + }, + { + .name = "Firmware", + .modules = firmware_modules, + .count = ARRAY_SIZE(firmware_modules), + } +}; + +static WINDOW *modwin, *menuwin; static int curwin; void print_module_title(WINDOW *win, const char *title) @@ -43,35 +96,76 @@ void print_module_title(WINDOW *win, const char *title) mvwprintw(win, 0, 1, title); wmove(win, 1, 1); - for (i = 0; i < 78; i++) - waddch(win, '\304'); + waddch(win, ACS_HLINE); } -static void print_menu(void) +static void print_submenu(struct coreinfo_cat *cat) { int i, j; char menu[80]; char *ptr = menu; - wmove(stdscr, 23, 0); + wmove(menuwin, 0, 0); for (j = 0; j < SCREEN_X; j++) - waddch(stdscr, ' '); + waddch(menuwin, ' '); + + if (!cat->count) + return; + + for (i = 0; i < cat->count; i++) + ptr += sprintf(ptr, "[%c: %s] ", 'A' + i, + cat->modules[i]->name); + + mvwprintw(menuwin, 0, 0, menu); +} + +#ifdef CONFIG_SHOW_DATE_TIME +static void print_time_and_date(void) +{ + struct tm tm; - for (i = 0; i < ARRAY_SIZE(modules); i++) - ptr += sprintf(ptr, "F%d: %s ", i + 1, modules[i]->name); + while (nvram_updating()) + mdelay(10); - mvprintw(23, 0, menu); + rtc_read_clock(&tm); + + mvwprintw(menuwin, 0, 57, "%02d/%02d/%04d - %02d:%02d:%02d", + tm.tm_mon, tm.tm_mday, 1900 + tm.tm_year, tm.tm_hour, + tm.tm_min, tm.tm_sec); +} +#endif + +static void print_menu(void) +{ + int i, j; + char menu[80]; + char *ptr = menu; + + wmove(menuwin, 1, 0); + for (j = 0; j < SCREEN_X; j++) + waddch(menuwin, ' '); + + for (i = 0; i < ARRAY_SIZE(categories); i++) { + if (categories[i].count == 0) + continue; + + ptr += sprintf(ptr, "F%d: %s ", i + 1, categories[i].name); + } + + mvwprintw(menuwin, 1, 0, menu); + +#ifdef CONFIG_SHOW_DATE_TIME + print_time_and_date(); +#endif } static void center(int row, const char *str) { - int len = strlen(str); - int j; + int j, len = strlen(str); wmove(stdscr, row, 0); - for (j = 0; j < SCREEN_X; j++) waddch(stdscr, ' '); @@ -99,24 +193,52 @@ static void header(int row, const char *str) } #endif -static void redraw_module(void) +static void redraw_module(struct coreinfo_cat *cat) { + if (cat->count == 0) + return; + wclear(modwin); - modules[curwin]->redraw(modwin); - refresh(); + cat->modules[cat->cur]->redraw(modwin); + wrefresh(modwin); +} + +static void handle_category_key(struct coreinfo_cat *cat, int key) +{ + if (key >= 'a' && key <= 'z') { + int index = key - 'a'; + if (index < cat->count) { + cat->cur = index; + redraw_module(cat); + return; + } + } + + if (cat->count && cat->modules[cat->cur]->handle) { + if (cat->modules[cat->cur]->handle(key)) + redraw_module(cat); + } } static void loop(void) { int key; - center(0, "coreinfo v0.1"); + center(0, CONFIG_PAYLOAD_INFO_NAME " " CONFIG_PAYLOAD_INFO_VERSION); + refresh(); print_menu(); - modules[curwin]->redraw(modwin); - refresh(); + print_submenu(&categories[curwin]); + redraw_module(&categories[curwin]); + + halfdelay(10); while (1) { +#ifdef CONFIG_SHOW_DATE_TIME + print_time_and_date(); + wrefresh(menuwin); +#endif + key = getch(); if (key == ERR) @@ -125,16 +247,23 @@ static void loop(void) if (key >= KEY_F(1) && key <= KEY_F(9)) { unsigned char ch = key - KEY_F(1); - if (ch < ARRAY_SIZE(modules)) { + if (ch <= ARRAY_SIZE(categories)) { + if (ch == ARRAY_SIZE(categories)) + continue; + if (categories[ch].count == 0) + continue; + curwin = ch; - redraw_module(); + print_submenu(&categories[curwin]); + redraw_module(&categories[curwin]); continue; } } - if (modules[curwin]->handle) - if (modules[curwin]->handle(key)) - redraw_module(); + if (key == KEY_ESC) + return; + + handle_category_key(&categories[curwin], key); } } @@ -142,33 +271,31 @@ int main(void) { int i, j; - curses_enable_serial(0); - curses_enable_vga(1); - initscr(); init_pair(1, COLOR_WHITE, COLOR_GREEN); init_pair(2, COLOR_BLACK, COLOR_WHITE); init_pair(3, COLOR_WHITE, COLOR_WHITE); - modwin = newwin(23, 80, 1, 0); + modwin = newwin(SCREEN_Y - 3, SCREEN_X, 1, 0); + menuwin = newwin(2, SCREEN_X, SCREEN_Y - 2, 0); wattrset(stdscr, COLOR_PAIR(1) | A_BOLD); wattrset(modwin, COLOR_PAIR(2)); + wattrset(menuwin, COLOR_PAIR(1) | A_BOLD); - for (i = 0; i < 23; i++) { - wmove(modwin, i - 1, 0); + werase(modwin); - for (j = 0; j < SCREEN_X; j++) - waddch(modwin, ' '); + for (i = 0; i < ARRAY_SIZE(categories); i++) { + for (j = 0; j < categories[i].count; j++) + categories[i].modules[j]->init(); } - refresh(); - - for (i = 0; i < ARRAY_SIZE(modules); i++) - modules[i]->init(); - loop(); return 0; } + +PAYLOAD_INFO(name, CONFIG_PAYLOAD_INFO_NAME); +PAYLOAD_INFO(listname, CONFIG_PAYLOAD_INFO_LISTNAME); +PAYLOAD_INFO(desc, CONFIG_PAYLOAD_INFO_DESC);