202 lines
3.9 KiB
C
202 lines
3.9 KiB
C
/*
|
|
* This file is part of the coreinfo project.
|
|
*
|
|
* Copyright (C) 2008 Advanced Micro Devices, Inc.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; version 2 of the License.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
#include "coreinfo.h"
|
|
|
|
#define SCREEN_Y 24
|
|
#define SCREEN_X 80
|
|
|
|
extern struct coreinfo_module cpuinfo_module;
|
|
extern struct coreinfo_module pci_module;
|
|
extern struct coreinfo_module coreboot_module;
|
|
extern struct coreinfo_module nvram_module;
|
|
|
|
struct coreinfo_module *modules[] = {
|
|
#ifdef CONFIG_MODULE_CPUINFO
|
|
&cpuinfo_module,
|
|
#endif
|
|
#ifdef CONFIG_MODULE_PCI
|
|
&pci_module,
|
|
#endif
|
|
#ifdef CONFIG_MODULE_COREBOOT
|
|
&coreboot_module,
|
|
#endif
|
|
#ifdef CONFIG_MODULE_NVRAM
|
|
&nvram_module,
|
|
#endif
|
|
};
|
|
|
|
static WINDOW *modwin;
|
|
static int curwin;
|
|
|
|
void print_module_title(WINDOW *win, const char *title)
|
|
{
|
|
int i;
|
|
|
|
wattrset(win, COLOR_PAIR(2));
|
|
mvwprintw(win, 0, 1, title);
|
|
|
|
wmove(win, 1, 1);
|
|
|
|
for (i = 0; i < 78; i++)
|
|
waddch(win, '\304');
|
|
}
|
|
|
|
static void print_menu(void)
|
|
{
|
|
int i, j;
|
|
char menu[80];
|
|
char *ptr = menu;
|
|
|
|
wmove(stdscr, 23, 0);
|
|
|
|
for (j = 0; j < SCREEN_X; j++)
|
|
waddch(stdscr, ' ');
|
|
|
|
for (i = 0; i < ARRAY_SIZE(modules); i++)
|
|
ptr += sprintf(ptr, "F%d: %s ", i + 1, modules[i]->name);
|
|
|
|
if (ARRAY_SIZE(modules) != 0)
|
|
mvprintw(23, 0, menu);
|
|
|
|
#ifdef CONFIG_SHOW_DATE_TIME
|
|
mvprintw(23, 59, "%02d/%02d/20%02d - %02d:%02d:%02d",
|
|
bcd2dec(nvram_read(NVRAM_RTC_MONTH)),
|
|
bcd2dec(nvram_read(NVRAM_RTC_DAY)),
|
|
bcd2dec(nvram_read(NVRAM_RTC_YEAR)),
|
|
bcd2dec(nvram_read(NVRAM_RTC_HOURS)),
|
|
bcd2dec(nvram_read(NVRAM_RTC_MINUTES)),
|
|
bcd2dec(nvram_read(NVRAM_RTC_SECONDS)));
|
|
#endif
|
|
}
|
|
|
|
static void center(int row, const char *str)
|
|
{
|
|
int len = strlen(str);
|
|
int j;
|
|
|
|
wmove(stdscr, row, 0);
|
|
|
|
for (j = 0; j < SCREEN_X; j++)
|
|
waddch(stdscr, ' ');
|
|
|
|
mvprintw(row, (SCREEN_X - len) / 2, str);
|
|
}
|
|
|
|
/* FIXME: Currently unused. */
|
|
#if 0
|
|
static void header(int row, const char *str)
|
|
{
|
|
char buf[SCREEN_X];
|
|
char *ptr = buf;
|
|
int i;
|
|
int len = strlen(str) + 4;
|
|
|
|
for (i = 0; i < (SCREEN_X - len) / 2; i++)
|
|
ptr += sprintf(ptr, "=");
|
|
|
|
ptr += sprintf(ptr, "[ %s ]", str);
|
|
|
|
for (i = ((SCREEN_X - len) / 2) + len; i < SCREEN_X; i++)
|
|
ptr += sprintf(ptr, "=");
|
|
|
|
mvprintw(row, 0, buf);
|
|
}
|
|
#endif
|
|
|
|
static void redraw_module(void)
|
|
{
|
|
if (ARRAY_SIZE(modules) == 0)
|
|
return;
|
|
|
|
wclear(modwin);
|
|
modules[curwin]->redraw(modwin);
|
|
refresh();
|
|
}
|
|
|
|
static void loop(void)
|
|
{
|
|
int key;
|
|
|
|
center(0, "coreinfo v0.1");
|
|
|
|
print_menu();
|
|
if (ARRAY_SIZE(modules) != 0)
|
|
modules[curwin]->redraw(modwin);
|
|
refresh();
|
|
|
|
while (1) {
|
|
key = getch();
|
|
|
|
if (key == ERR)
|
|
continue;
|
|
|
|
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(modules))
|
|
continue;
|
|
curwin = ch;
|
|
redraw_module();
|
|
continue;
|
|
}
|
|
}
|
|
|
|
if (ARRAY_SIZE(modules) != 0 && modules[curwin]->handle)
|
|
if (modules[curwin]->handle(key))
|
|
redraw_module();
|
|
}
|
|
}
|
|
|
|
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);
|
|
|
|
wattrset(stdscr, COLOR_PAIR(1) | A_BOLD);
|
|
wattrset(modwin, COLOR_PAIR(2));
|
|
|
|
for (i = 0; i < 23; i++) {
|
|
wmove(modwin, i - 1, 0);
|
|
|
|
for (j = 0; j < SCREEN_X; j++)
|
|
waddch(modwin, ' ');
|
|
}
|
|
|
|
refresh();
|
|
|
|
for (i = 0; i < ARRAY_SIZE(modules); i++)
|
|
modules[i]->init();
|
|
|
|
loop();
|
|
|
|
return 0;
|
|
}
|