diff options
Diffstat (limited to 'fbset.c')
-rw-r--r-- | fbset.c | 360 |
1 files changed, 195 insertions, 165 deletions
@@ -1,3 +1,4 @@ +/* vi: set sw=4 ts=4: */ /* * Mini fbset implementation for busybox * @@ -48,7 +49,7 @@ #define OPT_READMODE (1 << 2) #define CMD_HELP 0 -#define CMD_FB 1 +#define CMD_FB 1 #define CMD_DB 2 #define CMD_GEOMETRY 3 #define CMD_TIMING 4 @@ -87,213 +88,242 @@ static unsigned int g_options = 0; struct cmdoptions_t { - char *name; - unsigned char param_count; - unsigned char code; + char *name; + unsigned char param_count; + unsigned char code; } g_cmdoptions[] = { - { "-h", 0, CMD_HELP }, - { "-fb", 1, CMD_FB }, - { "-db", 1, CMD_DB }, - { "-a", 0, CMD_ALL }, - { "-i", 0, CMD_INFO }, - { "-g", 5, CMD_GEOMETRY }, - { "-t", 7, CMD_TIMING }, - { "-accel", 1, CMD_ACCEL }, - { "-hsync", 1, CMD_HSYNC }, - { "-vsync", 1, CMD_VSYNC }, - { "-laced", 1, CMD_LACED }, - { "-double", 1, CMD_DOUBLE }, - + { + "-h", 0, CMD_HELP}, { + "-fb", 1, CMD_FB}, { + "-db", 1, CMD_DB}, { + "-a", 0, CMD_ALL}, { + "-i", 0, CMD_INFO}, { + "-g", 5, CMD_GEOMETRY}, { + "-t", 7, CMD_TIMING}, { + "-accel", 1, CMD_ACCEL}, { + "-hsync", 1, CMD_HSYNC}, { + "-vsync", 1, CMD_VSYNC}, { + "-laced", 1, CMD_LACED}, { + "-double", 1, CMD_DOUBLE}, #ifdef BB_FBSET_FANCY - { "--help", 0, CMD_HELP }, - { "-all", 0, CMD_ALL }, - { "-xres", 1, CMD_XRES }, - { "-yres", 1, CMD_YRES }, - { "-vxres", 1, CMD_VXRES }, - { "-vyres", 1, CMD_VYRES }, - { "-depth", 1, CMD_DEPTH }, - { "-match", 0, CMD_MATCH }, - { "--geometry", 5, CMD_GEOMETRY }, - - { "-pixclock", 1, CMD_PIXCLOCK }, - { "-left", 1, CMD_LEFT }, - { "-right", 1, CMD_RIGHT }, - { "-upper", 1, CMD_UPPER }, - { "-lower", 1, CMD_LOWER }, - { "-hslen", 1, CMD_HSLEN }, - { "-vslen", 1, CMD_VSLEN }, - { "--timings", 7, CMD_TIMING }, - - { "-csync", 1, CMD_CSYNC }, - { "-gsync", 1, CMD_GSYNC }, - { "-extsync", 1, CMD_EXTSYNC }, - { "-bcast", 1, CMD_BCAST }, - { "-rgba", 1, CMD_RGBA }, - { "-step", 1, CMD_STEP }, - { "-move", 1, CMD_MOVE }, + { + "--help", 0, CMD_HELP}, { + "-all", 0, CMD_ALL}, { + "-xres", 1, CMD_XRES}, { + "-yres", 1, CMD_YRES}, { + "-vxres", 1, CMD_VXRES}, { + "-vyres", 1, CMD_VYRES}, { + "-depth", 1, CMD_DEPTH}, { + "-match", 0, CMD_MATCH}, { + "--geometry", 5, CMD_GEOMETRY}, { + "-pixclock", 1, CMD_PIXCLOCK}, { + "-left", 1, CMD_LEFT}, { + "-right", 1, CMD_RIGHT}, { + "-upper", 1, CMD_UPPER}, { + "-lower", 1, CMD_LOWER}, { + "-hslen", 1, CMD_HSLEN}, { + "-vslen", 1, CMD_VSLEN}, { + "--timings", 7, CMD_TIMING}, { + "-csync", 1, CMD_CSYNC}, { + "-gsync", 1, CMD_GSYNC}, { + "-extsync", 1, CMD_EXTSYNC}, { + "-bcast", 1, CMD_BCAST}, { + "-rgba", 1, CMD_RGBA}, { + "-step", 1, CMD_STEP}, { + "-move", 1, CMD_MOVE}, #endif - { 0, 0, 0 } + { + 0, 0, 0} }; static int readmode(struct fb_var_screeninfo *base, const char *fn, - const char *mode) + const char *mode) { #ifdef BB_FBSET_READMODE - FILE *f; - char buf[256]; - char *p = buf; - - if ((f = fopen(fn, "r")) == NULL) PERROR("readmode(fopen)"); - while (!feof(f)) { - fgets(buf, sizeof(buf), f); - if ((p = strstr(buf, "mode ")) || (p = strstr(buf, "mode\t"))) { - p += 5; - if ((p = strstr(buf, mode))) { - p += strlen(mode); - if (!isspace(*p) && (*p != 0) && (*p != '"') && (*p != '\r') - && (*p != '\n')) continue; /* almost, but not quite */ - while (!feof(f)) { - fgets(buf, sizeof(buf), f); - if (!strstr(buf, "endmode")) return 1; + FILE *f; + char buf[256]; + char *p = buf; + + if ((f = fopen(fn, "r")) == NULL) + PERROR("readmode(fopen)"); + while (!feof(f)) { + fgets(buf, sizeof(buf), f); + if ((p = strstr(buf, "mode ")) || (p = strstr(buf, "mode\t"))) { + p += 5; + if ((p = strstr(buf, mode))) { + p += strlen(mode); + if (!isspace(*p) && (*p != 0) && (*p != '"') + && (*p != '\r') && (*p != '\n')) + continue; /* almost, but not quite */ + while (!feof(f)) { + fgets(buf, sizeof(buf), f); + if (!strstr(buf, "endmode")) + return 1; + } + } } - } } - } #else - fprintf(stderr, "W: mode reading was disabled on this copy of fbset; ignoring request\n"); + fprintf(stderr, + "W: mode reading was disabled on this copy of fbset; ignoring request\n"); #endif - return 0; + return 0; } -static void setmode(struct fb_var_screeninfo *base, - struct fb_var_screeninfo *set) +static void setmode(struct fb_var_screeninfo *base, + struct fb_var_screeninfo *set) { - if ((int)set->xres > 0) base->xres = set->xres; - if ((int)set->yres > 0) base->yres = set->yres; - if ((int)set->xres_virtual > 0) base->xres_virtual = set->xres_virtual; - if ((int)set->yres_virtual > 0) base->yres_virtual = set->yres_virtual; - if ((int)set->bits_per_pixel > 0) base->bits_per_pixel = set->bits_per_pixel; + if ((int) set->xres > 0) + base->xres = set->xres; + if ((int) set->yres > 0) + base->yres = set->yres; + if ((int) set->xres_virtual > 0) + base->xres_virtual = set->xres_virtual; + if ((int) set->yres_virtual > 0) + base->yres_virtual = set->yres_virtual; + if ((int) set->bits_per_pixel > 0) + base->bits_per_pixel = set->bits_per_pixel; } static void showmode(struct fb_var_screeninfo *v) { - double drate = 0, hrate = 0, vrate = 0; - if (v->pixclock) { - drate = 1e12 / v->pixclock; - hrate = drate / (v->left_margin+v->xres+v->right_margin+v->hsync_len); - vrate = hrate / (v->upper_margin+v->yres+v->lower_margin+v->vsync_len); - } - printf("\nmode \"%ux%u-%u\"\n", v->xres, v->yres, (int)(vrate+0.5)); + double drate = 0, hrate = 0, vrate = 0; + + if (v->pixclock) { + drate = 1e12 / v->pixclock; + hrate = + drate / (v->left_margin + v->xres + v->right_margin + + v->hsync_len); + vrate = + hrate / (v->upper_margin + v->yres + v->lower_margin + + v->vsync_len); + } + printf("\nmode \"%ux%u-%u\"\n", v->xres, v->yres, (int) (vrate + 0.5)); #ifdef BB_FBSET_FANCY - printf("\t# D: %.3f MHz, H: %.3f kHz, V: %.3f Hz\n", drate/1e6, hrate/1e3, - vrate); + printf("\t# D: %.3f MHz, H: %.3f kHz, V: %.3f Hz\n", drate / 1e6, + hrate / 1e3, vrate); #endif - printf("\tgeometry %u %u %u %u %u\n", v->xres, v->yres, - v->xres_virtual, v->yres_virtual, v->bits_per_pixel); + printf("\tgeometry %u %u %u %u %u\n", v->xres, v->yres, + v->xres_virtual, v->yres_virtual, v->bits_per_pixel); #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0) - printf("\ttimings %u %u %u %u %u %u %u\n", v->pixclock, v->left_margin, - v->right_margin, v->upper_margin, v->lower_margin, v->hsync_len, - v->vsync_len); - printf("\taccel %s\n", (v->accel_flags > 0 ? "true" : "false")); + printf("\ttimings %u %u %u %u %u %u %u\n", v->pixclock, v->left_margin, + v->right_margin, v->upper_margin, v->lower_margin, v->hsync_len, + v->vsync_len); + printf("\taccel %s\n", (v->accel_flags > 0 ? "true" : "false")); #else - printf("\ttimings %lu %lu %lu %lu %lu %lu %lu\n", v->pixclock, v->left_margin, - v->right_margin, v->upper_margin, v->lower_margin, v->hsync_len, - v->vsync_len); + printf("\ttimings %lu %lu %lu %lu %lu %lu %lu\n", v->pixclock, + v->left_margin, v->right_margin, v->upper_margin, + v->lower_margin, v->hsync_len, v->vsync_len); #endif - printf("\trgba %u/%u,%u/%u,%u/%u,%u/%u\n", v->red.length, v->red.offset, - v->green.length, v->green.offset, v->blue.length, v->blue.offset, - v->transp.length, v->transp.offset); - printf("endmode\n"); + printf("\trgba %u/%u,%u/%u,%u/%u,%u/%u\n", v->red.length, + v->red.offset, v->green.length, v->green.offset, v->blue.length, + v->blue.offset, v->transp.length, v->transp.offset); + printf("endmode\n"); } static void fbset_usage(void) { - int i; + int i; + #ifndef STANDALONE - fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n", BB_VER, BB_BT); + fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n", + BB_VER, BB_BT); #endif - fprintf(stderr, "Usage: fbset [options] [mode]\n"); - fprintf(stderr, "\tThe following options are recognized:\n"); - for (i = 0; g_cmdoptions[i].name; i++) - fprintf(stderr, "\t\t%s\n", g_cmdoptions[i].name); - exit(-1); + fprintf(stderr, "Usage: fbset [options] [mode]\n"); + fprintf(stderr, "\tThe following options are recognized:\n"); + for (i = 0; g_cmdoptions[i].name; i++) + fprintf(stderr, "\t\t%s\n", g_cmdoptions[i].name); + exit(-1); } #ifdef STANDALONE int main(int argc, char **argv) -#else +#else extern int fbset_main(int argc, char **argv) #endif { - struct fb_var_screeninfo var, varset; - int fh, i; - char *fbdev = DEFAULTFBDEV; - char *modefile = DEFAULTFBMODE; - char *thisarg, *mode = NULL; + struct fb_var_screeninfo var, varset; + int fh, i; + char *fbdev = DEFAULTFBDEV; + char *modefile = DEFAULTFBMODE; + char *thisarg, *mode = NULL; + + memset(&varset, 0xFF, sizeof(varset)); - memset(&varset, 0xFF, sizeof(varset)); - - /* parse cmd args.... why do they have to make things so difficult? */ - argv++; argc--; - for (; argc > 0 && (thisarg = *argv); argc--, argv++) { - for (i = 0; g_cmdoptions[i].name; i++) { - if (!strcmp(thisarg, g_cmdoptions[i].name)) { - if (argc - 1 < g_cmdoptions[i].param_count) fbset_usage(); - switch (g_cmdoptions[i].code) { - case CMD_HELP: fbset_usage(); - case CMD_FB: fbdev = argv[1]; break; - case CMD_DB: modefile = argv[1]; break; - case CMD_GEOMETRY: - varset.xres = strtoul(argv[1],0,0); - varset.yres = strtoul(argv[2],0,0); - varset.xres_virtual = strtoul(argv[3],0,0); - varset.yres_virtual = strtoul(argv[4],0,0); - varset.bits_per_pixel = strtoul(argv[5],0,0); - break; - case CMD_TIMING: - varset.pixclock = strtoul(argv[1],0,0); - varset.left_margin = strtoul(argv[2],0,0); - varset.right_margin = strtoul(argv[3],0,0); - varset.upper_margin = strtoul(argv[4],0,0); - varset.lower_margin = strtoul(argv[5],0,0); - varset.hsync_len = strtoul(argv[6],0,0); - varset.vsync_len = strtoul(argv[7],0,0); - break; + /* parse cmd args.... why do they have to make things so difficult? */ + argv++; + argc--; + for (; argc > 0 && (thisarg = *argv); argc--, argv++) { + for (i = 0; g_cmdoptions[i].name; i++) { + if (!strcmp(thisarg, g_cmdoptions[i].name)) { + if (argc - 1 < g_cmdoptions[i].param_count) + fbset_usage(); + switch (g_cmdoptions[i].code) { + case CMD_HELP: + fbset_usage(); + case CMD_FB: + fbdev = argv[1]; + break; + case CMD_DB: + modefile = argv[1]; + break; + case CMD_GEOMETRY: + varset.xres = strtoul(argv[1], 0, 0); + varset.yres = strtoul(argv[2], 0, 0); + varset.xres_virtual = strtoul(argv[3], 0, 0); + varset.yres_virtual = strtoul(argv[4], 0, 0); + varset.bits_per_pixel = strtoul(argv[5], 0, 0); + break; + case CMD_TIMING: + varset.pixclock = strtoul(argv[1], 0, 0); + varset.left_margin = strtoul(argv[2], 0, 0); + varset.right_margin = strtoul(argv[3], 0, 0); + varset.upper_margin = strtoul(argv[4], 0, 0); + varset.lower_margin = strtoul(argv[5], 0, 0); + varset.hsync_len = strtoul(argv[6], 0, 0); + varset.vsync_len = strtoul(argv[7], 0, 0); + break; #ifdef BB_FBSET_FANCY - case CMD_XRES: varset.xres = strtoul(argv[1],0,0); break; - case CMD_YRES: varset.yres = strtoul(argv[1],0,0); break; + case CMD_XRES: + varset.xres = strtoul(argv[1], 0, 0); + break; + case CMD_YRES: + varset.yres = strtoul(argv[1], 0, 0); + break; #endif + } + argc -= g_cmdoptions[i].param_count; + argv += g_cmdoptions[i].param_count; + break; + } + } + if (!g_cmdoptions[i].name) { + if (argc == 1) { + mode = *argv; + g_options |= OPT_READMODE; + } else { + fbset_usage(); + } } - argc -= g_cmdoptions[i].param_count; - argv += g_cmdoptions[i].param_count; - break; - } - } - if (!g_cmdoptions[i].name) { - if (argc == 1) { - mode = *argv; - g_options |= OPT_READMODE; - } else { - fbset_usage(); - } } - } - if ((fh = open(fbdev, O_RDONLY)) < 0) PERROR("fbset(open)"); - if (ioctl(fh, FBIOGET_VSCREENINFO, &var)) PERROR("fbset(ioctl)"); - if (g_options & OPT_READMODE) { - if (!readmode(&var, modefile, mode)) { - fprintf(stderr, "Unknown video mode `%s'\n", mode); - exit(1); + if ((fh = open(fbdev, O_RDONLY)) < 0) + PERROR("fbset(open)"); + if (ioctl(fh, FBIOGET_VSCREENINFO, &var)) + PERROR("fbset(ioctl)"); + if (g_options & OPT_READMODE) { + if (!readmode(&var, modefile, mode)) { + fprintf(stderr, "Unknown video mode `%s'\n", mode); + exit(1); + } } - } - setmode(&var, &varset); - if (g_options & OPT_CHANGE) - if (ioctl(fh, FBIOPUT_VSCREENINFO, &var)) PERROR("fbset(ioctl)"); - showmode(&var); - close(fh); - - return(TRUE); -} + setmode(&var, &varset); + if (g_options & OPT_CHANGE) + if (ioctl(fh, FBIOPUT_VSCREENINFO, &var)) + PERROR("fbset(ioctl)"); + showmode(&var); + close(fh); + return (TRUE); +} |