Changeset 1770 in MondoRescue for branches/stable/mindi-busybox/util-linux/fbset.c
- Timestamp:
- Nov 6, 2007, 11:01:53 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/stable/mindi-busybox/util-linux/fbset.c
r821 r1770 13 13 */ 14 14 15 #include <stdio.h> 16 #include <stdlib.h> 17 #include <unistd.h> 18 #include <fcntl.h> 19 #include <errno.h> 20 #include <ctype.h> 21 #include <string.h> 22 #include <stdint.h> 23 #include <sys/ioctl.h> 24 #include "busybox.h" 15 #include "libbb.h" 25 16 26 17 #define DEFAULTFBDEV FB_0 … … 31 22 OPT_INFO = (1 << 1), 32 23 OPT_READMODE = (1 << 2), 24 OPT_ALL = (1 << 9), 33 25 34 26 CMD_FB = 1, … … 46 38 CMD_CHANGE = 13, 47 39 48 #if def CONFIG_FEATURE_FBSET_FANCY40 #if ENABLE_FEATURE_FBSET_FANCY 49 41 CMD_XRES = 100, 50 42 CMD_YRES = 101, … … 70 62 }; 71 63 72 static unsigned int g_options = 0;64 static unsigned g_options; 73 65 74 66 /* Stuff stolen from the kernel's fb.h */ 67 #define FB_ACTIVATE_ALL 64 75 68 enum { 76 69 FBIOGET_VSCREENINFO = 0x4600, … … 78 71 }; 79 72 struct fb_bitfield { 80 uint32_t offset; /* beginning of bitfield */ 81 uint32_t length; /* length of bitfield */ 82 uint32_t msb_right; /* != 0 : Most significant bit is */ 83 /* right */ 73 uint32_t offset; /* beginning of bitfield */ 74 uint32_t length; /* length of bitfield */ 75 uint32_t msb_right; /* !=0: Most significant bit is right */ 84 76 }; 85 77 struct fb_var_screeninfo { 86 uint32_t xres; /* visible resolution*/78 uint32_t xres; /* visible resolution */ 87 79 uint32_t yres; 88 uint32_t xres_virtual; /* virtual resolution*/80 uint32_t xres_virtual; /* virtual resolution */ 89 81 uint32_t yres_virtual; 90 uint32_t xoffset; 91 uint32_t yoffset; /* resolution*/92 93 uint32_t bits_per_pixel; /* guess what */94 uint32_t grayscale; /* !=0 Graylevels instead of colors */95 96 struct fb_bitfield red; 97 struct fb_bitfield green; 82 uint32_t xoffset; /* offset from virtual to visible */ 83 uint32_t yoffset; /* resolution */ 84 85 uint32_t bits_per_pixel; 86 uint32_t grayscale; /* !=0 Graylevels instead of colors */ 87 88 struct fb_bitfield red; /* bitfield in fb mem if true color, */ 89 struct fb_bitfield green; /* else only length is significant */ 98 90 struct fb_bitfield blue; 99 struct fb_bitfield transp; /* transparency*/100 101 uint32_t nonstd; /* !=0 Non standard pixel format */102 103 uint32_t activate; /* see FB_ACTIVATE_**/104 105 uint32_t height; /* height of picture in mm*/106 uint32_t width; /* width of picture in mm*/91 struct fb_bitfield transp; /* transparency */ 92 93 uint32_t nonstd; /* !=0 Non standard pixel format */ 94 95 uint32_t activate; /* see FB_ACTIVATE_x */ 96 97 uint32_t height; /* height of picture in mm */ 98 uint32_t width; /* width of picture in mm */ 107 99 108 100 uint32_t accel_flags; /* acceleration flags (hints) */ 109 101 110 102 /* Timing: All values in pixclocks, except pixclock (of course) */ 111 uint32_t pixclock; 112 uint32_t left_margin; /* time from sync to picture*/113 uint32_t right_margin; /* time from picture to sync*/114 uint32_t upper_margin; /* time from sync to picture*/103 uint32_t pixclock; /* pixel clock in ps (pico seconds) */ 104 uint32_t left_margin; /* time from sync to picture */ 105 uint32_t right_margin; /* time from picture to sync */ 106 uint32_t upper_margin; /* time from sync to picture */ 115 107 uint32_t lower_margin; 116 uint32_t hsync_len; /* length of horizontal sync*/117 uint32_t vsync_len; /* length of vertical sync*/118 uint32_t sync; /* see FB_SYNC_**/119 uint32_t vmode; /* see FB_VMODE_**/120 uint32_t reserved[6]; 108 uint32_t hsync_len; /* length of horizontal sync */ 109 uint32_t vsync_len; /* length of vertical sync */ 110 uint32_t sync; /* see FB_SYNC_x */ 111 uint32_t vmode; /* see FB_VMODE_x */ 112 uint32_t reserved[6]; /* Reserved for future compatibility */ 121 113 }; 122 114 123 115 124 116 static const struct cmdoptions_t { 125 const char *name;117 const char name[10]; 126 118 const unsigned char param_count; 127 119 const unsigned char code; 128 120 } g_cmdoptions[] = { 129 { 130 "-fb", 1, CMD_FB}, { 131 "-db", 1, CMD_DB}, { 132 "-a", 0, CMD_ALL}, { 133 "-i", 0, CMD_INFO}, { 134 "-g", 5, CMD_GEOMETRY}, { 135 "-t", 7, CMD_TIMING}, { 136 "-accel", 1, CMD_ACCEL}, { 137 "-hsync", 1, CMD_HSYNC}, { 138 "-vsync", 1, CMD_VSYNC}, { 139 "-laced", 1, CMD_LACED}, { 140 "-double", 1, CMD_DOUBLE}, { 141 "-n", 0, CMD_CHANGE}, { 142 #ifdef CONFIG_FEATURE_FBSET_FANCY 143 "-all", 0, CMD_ALL}, { 144 "-xres", 1, CMD_XRES}, { 145 "-yres", 1, CMD_YRES}, { 146 "-vxres", 1, CMD_VXRES}, { 147 "-vyres", 1, CMD_VYRES}, { 148 "-depth", 1, CMD_DEPTH}, { 149 "-match", 0, CMD_MATCH}, { 150 "-geometry", 5, CMD_GEOMETRY}, { 151 "-pixclock", 1, CMD_PIXCLOCK}, { 152 "-left", 1, CMD_LEFT}, { 153 "-right", 1, CMD_RIGHT}, { 154 "-upper", 1, CMD_UPPER}, { 155 "-lower", 1, CMD_LOWER}, { 156 "-hslen", 1, CMD_HSLEN}, { 157 "-vslen", 1, CMD_VSLEN}, { 158 "-timings", 7, CMD_TIMING}, { 159 "-csync", 1, CMD_CSYNC}, { 160 "-gsync", 1, CMD_GSYNC}, { 161 "-extsync", 1, CMD_EXTSYNC}, { 162 "-bcast", 1, CMD_BCAST}, { 163 "-rgba", 1, CMD_RGBA}, { 164 "-step", 1, CMD_STEP}, { 165 "-move", 1, CMD_MOVE}, { 166 #endif 167 0, 0, 0} 168 }; 169 170 #ifdef CONFIG_FEATURE_FBSET_READMODE 121 { "-fb", 1, CMD_FB }, 122 { "-db", 1, CMD_DB }, 123 { "-a", 0, CMD_ALL }, 124 { "-i", 0, CMD_INFO }, 125 { "-g", 5, CMD_GEOMETRY }, 126 { "-t", 7, CMD_TIMING }, 127 { "-accel", 1, CMD_ACCEL }, 128 { "-hsync", 1, CMD_HSYNC }, 129 { "-vsync", 1, CMD_VSYNC }, 130 { "-laced", 1, CMD_LACED }, 131 { "-double", 1, CMD_DOUBLE }, 132 { "-n", 0, CMD_CHANGE }, 133 #if ENABLE_FEATURE_FBSET_FANCY 134 { "-all", 0, CMD_ALL }, 135 { "-xres", 1, CMD_XRES }, 136 { "-yres", 1, CMD_YRES }, 137 { "-vxres", 1, CMD_VXRES }, 138 { "-vyres", 1, CMD_VYRES }, 139 { "-depth", 1, CMD_DEPTH }, 140 { "-match", 0, CMD_MATCH }, 141 { "-geometry", 5, CMD_GEOMETRY }, 142 { "-pixclock", 1, CMD_PIXCLOCK }, 143 { "-left", 1, CMD_LEFT }, 144 { "-right", 1, CMD_RIGHT }, 145 { "-upper", 1, CMD_UPPER }, 146 { "-lower", 1, CMD_LOWER }, 147 { "-hslen", 1, CMD_HSLEN }, 148 { "-vslen", 1, CMD_VSLEN }, 149 { "-timings", 7, CMD_TIMING }, 150 { "-csync", 1, CMD_CSYNC }, 151 { "-gsync", 1, CMD_GSYNC }, 152 { "-extsync", 1, CMD_EXTSYNC }, 153 { "-bcast", 1, CMD_BCAST }, 154 { "-rgba", 1, CMD_RGBA }, 155 { "-step", 1, CMD_STEP }, 156 { "-move", 1, CMD_MOVE }, 157 #endif 158 { "", 0, 0 } 159 }; 160 161 #if ENABLE_FEATURE_FBSET_READMODE 171 162 /* taken from linux/fb.h */ 172 163 enum { … … 179 170 }; 180 171 #endif 172 181 173 static int readmode(struct fb_var_screeninfo *base, const char *fn, 182 174 const char *mode) 183 175 { 184 #if def CONFIG_FEATURE_FBSET_READMODE176 #if ENABLE_FEATURE_FBSET_READMODE 185 177 FILE *f; 186 178 char buf[256]; 187 179 char *p = buf; 188 180 189 f = bb_xfopen(fn, "r");181 f = xfopen(fn, "r"); 190 182 while (!feof(f)) { 191 183 fgets(buf, sizeof(buf), f); 192 if ((p = strstr(buf, "mode ")) || (p = strstr(buf, "mode\t"))) { 193 p += 5; 194 if ((p = strstr(buf, mode))) { 195 p += strlen(mode); 196 if (!isspace(*p) && (*p != 0) && (*p != '"') 197 && (*p != '\r') && (*p != '\n')) 198 continue; /* almost, but not quite */ 199 while (!feof(f)) { 200 fgets(buf, sizeof(buf), f); 201 202 if ((p = strstr(buf, "geometry "))) { 203 p += 9; 204 205 sscanf(p, "%d %d %d %d %d", 206 &(base->xres), &(base->yres), 207 &(base->xres_virtual), &(base->yres_virtual), 208 &(base->bits_per_pixel)); 209 } else if ((p = strstr(buf, "timings "))) { 210 p += 8; 211 212 sscanf(p, "%d %d %d %d %d %d %d", 213 &(base->pixclock), 214 &(base->left_margin), &(base->right_margin), 215 &(base->upper_margin), &(base->lower_margin), 216 &(base->hsync_len), &(base->vsync_len)); 217 } else if ((p = strstr(buf, "laced "))) { 218 p += 6; 219 220 if (strstr(buf, "false")) { 221 base->vmode &= ~FB_VMODE_INTERLACED; 222 } else { 223 base->vmode |= FB_VMODE_INTERLACED; 184 if (!(p = strstr(buf, "mode ")) && !(p = strstr(buf, "mode\t"))) 185 continue; 186 p += 5; 187 if (!(p = strstr(buf, mode))) 188 continue; 189 p += strlen(mode); 190 if (!isspace(*p) && (*p != 0) && (*p != '"') 191 && (*p != '\r') && (*p != '\n')) 192 continue; /* almost, but not quite */ 193 194 while (!feof(f)) { 195 fgets(buf, sizeof(buf), f); 196 if ((p = strstr(buf, "geometry "))) { 197 p += 9; 198 /* FIXME: catastrophic on arches with 64bit ints */ 199 sscanf(p, "%d %d %d %d %d", 200 &(base->xres), &(base->yres), 201 &(base->xres_virtual), &(base->yres_virtual), 202 &(base->bits_per_pixel)); 203 } else if ((p = strstr(buf, "timings "))) { 204 p += 8; 205 sscanf(p, "%d %d %d %d %d %d %d", 206 &(base->pixclock), 207 &(base->left_margin), &(base->right_margin), 208 &(base->upper_margin), &(base->lower_margin), 209 &(base->hsync_len), &(base->vsync_len)); 210 } else if ((p = strstr(buf, "laced "))) { 211 //p += 6; 212 if (strstr(buf, "false")) { 213 base->vmode &= ~FB_VMODE_INTERLACED; 214 } else { 215 base->vmode |= FB_VMODE_INTERLACED; 216 } 217 } else if ((p = strstr(buf, "double "))) { 218 //p += 7; 219 if (strstr(buf, "false")) { 220 base->vmode &= ~FB_VMODE_DOUBLE; 221 } else { 222 base->vmode |= FB_VMODE_DOUBLE; 223 } 224 } else if ((p = strstr(buf, "vsync "))) { 225 //p += 6; 226 if (strstr(buf, "low")) { 227 base->sync &= ~FB_SYNC_VERT_HIGH_ACT; 228 } else { 229 base->sync |= FB_SYNC_VERT_HIGH_ACT; 230 } 231 } else if ((p = strstr(buf, "hsync "))) { 232 //p += 6; 233 if (strstr(buf, "low")) { 234 base->sync &= ~FB_SYNC_HOR_HIGH_ACT; 235 } else { 236 base->sync |= FB_SYNC_HOR_HIGH_ACT; 237 } 238 } else if ((p = strstr(buf, "csync "))) { 239 //p += 6; 240 if (strstr(buf, "low")) { 241 base->sync &= ~FB_SYNC_COMP_HIGH_ACT; 242 } else { 243 base->sync |= FB_SYNC_COMP_HIGH_ACT; 244 } 245 } else if ((p = strstr(buf, "extsync "))) { 246 //p += 8; 247 if (strstr(buf, "false")) { 248 base->sync &= ~FB_SYNC_EXT; 249 } else { 250 base->sync |= FB_SYNC_EXT; 251 } 224 252 } 225 } else if ((p = strstr(buf, "double "))) { 226 p += 7; 227 228 if (strstr(buf, "false")) { 229 base->vmode &= ~FB_VMODE_DOUBLE; 230 } else { 231 base->vmode |= FB_VMODE_DOUBLE; 232 } 233 } else if ((p = strstr(buf, "vsync "))) { 234 p += 6; 235 236 if (strstr(buf, "low")) { 237 base->sync &= ~FB_SYNC_VERT_HIGH_ACT; 238 } else { 239 base->sync |= FB_SYNC_VERT_HIGH_ACT; 240 } 241 } else if ((p = strstr(buf, "hsync "))) { 242 p += 6; 243 244 if (strstr(buf, "low")) { 245 base->sync &= ~FB_SYNC_HOR_HIGH_ACT; 246 } else { 247 base->sync |= FB_SYNC_HOR_HIGH_ACT; 248 } 249 } else if ((p = strstr(buf, "csync "))) { 250 p += 6; 251 252 if (strstr(buf, "low")) { 253 base->sync &= ~FB_SYNC_COMP_HIGH_ACT; 254 } else { 255 base->sync |= FB_SYNC_COMP_HIGH_ACT; 256 } 257 } else if ((p = strstr(buf, "extsync "))) { 258 p += 8; 259 260 if (strstr(buf, "false")) { 261 base->sync &= ~FB_SYNC_EXT; 262 } else { 263 base->sync |= FB_SYNC_EXT; 264 } 265 } 266 267 if (strstr(buf, "endmode")) 268 return 1; 269 } 270 } 253 254 if (strstr(buf, "endmode")) 255 return 1; 271 256 } 272 257 } 273 258 #else 274 bb_error_msg( 259 bb_error_msg("mode reading not compiled in"); 275 260 #endif 276 261 return 0; … … 298 283 if (v->pixclock) { 299 284 drate = 1e12 / v->pixclock; 300 hrate = 301 drate / (v->left_margin + v->xres + v->right_margin + 302 v->hsync_len); 303 vrate = 304 hrate / (v->upper_margin + v->yres + v->lower_margin + 305 v->vsync_len); 285 hrate = drate / (v->left_margin + v->xres + v->right_margin + v->hsync_len); 286 vrate = hrate / (v->upper_margin + v->yres + v->lower_margin + v->vsync_len); 306 287 } 307 288 printf("\nmode \"%ux%u-%u\"\n" 308 #if def CONFIG_FEATURE_FBSET_FANCY289 #if ENABLE_FEATURE_FBSET_FANCY 309 290 "\t# D: %.3f MHz, H: %.3f kHz, V: %.3f Hz\n" 310 291 #endif 311 "\tgeometry %u %u %u %u %u\n\ttimings %u %u %u %u %u %u %u\n\taccel %s\n\trgba %u/%u,%u/%u,%u/%u,%u/%u\nendmode\n\n", 312 v->xres, v->yres, (int) (vrate + 0.5), 313 #ifdef CONFIG_FEATURE_FBSET_FANCY 314 drate / 1e6, hrate / 1e3, vrate, 315 #endif 316 v->xres, v->yres, v->xres_virtual, v->yres_virtual, 317 v->bits_per_pixel, v->pixclock, v->left_margin, 318 v->right_margin, v->upper_margin, v->lower_margin, v->hsync_len, 319 v->vsync_len, (v->accel_flags > 0 ? "true" : "false"), v->red.length, 320 v->red.offset, v->green.length, v->green.offset, v->blue.length, 321 v->blue.offset, v->transp.length, v->transp.offset); 292 "\tgeometry %u %u %u %u %u\n" 293 "\ttimings %u %u %u %u %u %u %u\n" 294 "\taccel %s\n" 295 "\trgba %u/%u,%u/%u,%u/%u,%u/%u\n" 296 "endmode\n\n", 297 v->xres, v->yres, (int) (vrate + 0.5), 298 #if ENABLE_FEATURE_FBSET_FANCY 299 drate / 1e6, hrate / 1e3, vrate, 300 #endif 301 v->xres, v->yres, v->xres_virtual, v->yres_virtual, v->bits_per_pixel, 302 v->pixclock, v->left_margin, v->right_margin, v->upper_margin, v->lower_margin, 303 v->hsync_len, v->vsync_len, 304 (v->accel_flags > 0 ? "true" : "false"), 305 v->red.length, v->red.offset, v->green.length, v->green.offset, 306 v->blue.length, v->blue.offset, v->transp.length, v->transp.offset); 322 307 } 323 308 … … 325 310 int main(int argc, char **argv) 326 311 #else 312 int fbset_main(int argc, char **argv); 327 313 int fbset_main(int argc, char **argv) 328 314 #endif … … 330 316 struct fb_var_screeninfo var, varset; 331 317 int fh, i; 332 c har *fbdev = DEFAULTFBDEV;333 c har *modefile = DEFAULTFBMODE;318 const char *fbdev = DEFAULTFBDEV; 319 const char *modefile = DEFAULTFBMODE; 334 320 char *thisarg, *mode = NULL; 335 321 … … 340 326 argc--; 341 327 for (; argc > 0 && (thisarg = *argv); argc--, argv++) { 342 for (i = 0; g_cmdoptions[i].name; i++) { 343 if (!strcmp(thisarg, g_cmdoptions[i].name)) { 344 if (argc - 1 < g_cmdoptions[i].param_count) 345 bb_show_usage(); 346 switch (g_cmdoptions[i].code) { 347 case CMD_FB: 348 fbdev = argv[1]; 349 break; 350 case CMD_DB: 351 modefile = argv[1]; 352 break; 353 case CMD_GEOMETRY: 354 varset.xres = strtoul(argv[1], 0, 0); 355 varset.yres = strtoul(argv[2], 0, 0); 356 varset.xres_virtual = strtoul(argv[3], 0, 0); 357 varset.yres_virtual = strtoul(argv[4], 0, 0); 358 varset.bits_per_pixel = strtoul(argv[5], 0, 0); 359 break; 360 case CMD_TIMING: 361 varset.pixclock = strtoul(argv[1], 0, 0); 362 varset.left_margin = strtoul(argv[2], 0, 0); 363 varset.right_margin = strtoul(argv[3], 0, 0); 364 varset.upper_margin = strtoul(argv[4], 0, 0); 365 varset.lower_margin = strtoul(argv[5], 0, 0); 366 varset.hsync_len = strtoul(argv[6], 0, 0); 367 varset.vsync_len = strtoul(argv[7], 0, 0); 368 break; 369 case CMD_CHANGE: 370 g_options |= OPT_CHANGE; 371 break; 372 #ifdef CONFIG_FEATURE_FBSET_FANCY 373 case CMD_XRES: 374 varset.xres = strtoul(argv[1], 0, 0); 375 break; 376 case CMD_YRES: 377 varset.yres = strtoul(argv[1], 0, 0); 378 break; 379 case CMD_DEPTH: 380 varset.bits_per_pixel = strtoul(argv[1], 0, 0); 381 break; 382 #endif 383 } 384 argc -= g_cmdoptions[i].param_count; 385 argv += g_cmdoptions[i].param_count; 386 break; 328 for (i = 0; g_cmdoptions[i].name[0]; i++) { 329 if (strcmp(thisarg, g_cmdoptions[i].name)) 330 continue; 331 if (argc-1 < g_cmdoptions[i].param_count) 332 bb_show_usage(); 333 334 switch (g_cmdoptions[i].code) { 335 case CMD_FB: 336 fbdev = argv[1]; 337 break; 338 case CMD_DB: 339 modefile = argv[1]; 340 break; 341 case CMD_GEOMETRY: 342 varset.xres = xatou32(argv[1]); 343 varset.yres = xatou32(argv[2]); 344 varset.xres_virtual = xatou32(argv[3]); 345 varset.yres_virtual = xatou32(argv[4]); 346 varset.bits_per_pixel = xatou32(argv[5]); 347 break; 348 case CMD_TIMING: 349 varset.pixclock = xatou32(argv[1]); 350 varset.left_margin = xatou32(argv[2]); 351 varset.right_margin = xatou32(argv[3]); 352 varset.upper_margin = xatou32(argv[4]); 353 varset.lower_margin = xatou32(argv[5]); 354 varset.hsync_len = xatou32(argv[6]); 355 varset.vsync_len = xatou32(argv[7]); 356 break; 357 case CMD_ALL: 358 g_options |= OPT_ALL; 359 break; 360 case CMD_CHANGE: 361 g_options |= OPT_CHANGE; 362 break; 363 #if ENABLE_FEATURE_FBSET_FANCY 364 case CMD_XRES: 365 varset.xres = xatou32(argv[1]); 366 break; 367 case CMD_YRES: 368 varset.yres = xatou32(argv[1]); 369 break; 370 case CMD_DEPTH: 371 varset.bits_per_pixel = xatou32(argv[1]); 372 break; 373 #endif 387 374 } 375 argc -= g_cmdoptions[i].param_count; 376 argv += g_cmdoptions[i].param_count; 377 break; 388 378 } 389 if (!g_cmdoptions[i].name) { 390 if (argc == 1) { 391 mode = *argv; 392 g_options |= OPT_READMODE; 393 } else { 379 if (!g_cmdoptions[i].name[0]) { 380 if (argc != 1) 394 381 bb_show_usage(); 395 } 382 mode = *argv; 383 g_options |= OPT_READMODE; 396 384 } 397 385 } 398 386 399 fh = bb_xopen(fbdev, O_RDONLY); 400 if (ioctl(fh, FBIOGET_VSCREENINFO, &var)) 401 bb_perror_msg_and_die("fbset(ioctl)"); 387 fh = xopen(fbdev, O_RDONLY); 388 xioctl(fh, FBIOGET_VSCREENINFO, &var); 402 389 if (g_options & OPT_READMODE) { 403 390 if (!readmode(&var, modefile, mode)) { 404 bb_error_msg("Unknown video mode `%s'", mode); 405 return EXIT_FAILURE; 391 bb_error_msg_and_die("unknown video mode '%s'", mode); 406 392 } 407 393 } 408 394 409 395 setmode(&var, &varset); 410 if (g_options & OPT_CHANGE) 411 if (ioctl(fh, FBIOPUT_VSCREENINFO, &var)) 412 bb_perror_msg_and_die("fbset(ioctl)"); 396 if (g_options & OPT_CHANGE) { 397 if (g_options & OPT_ALL) 398 var.activate = FB_ACTIVATE_ALL; 399 xioctl(fh, FBIOPUT_VSCREENINFO, &var); 400 } 413 401 showmode(&var); 414 402 /* Don't close the file, as exiting will take care of that */
Note:
See TracChangeset
for help on using the changeset viewer.