rev |
line source |
nuclear@0
|
1 #include <stdio.h>
|
nuclear@0
|
2 #include <stdlib.h>
|
nuclear@0
|
3 #include "vbe.h"
|
nuclear@0
|
4
|
nuclear@0
|
5 #define REALPTR(s, o) (void*)(((uint32_t)(s) << 4) + (uint32_t)(o))
|
nuclear@0
|
6 #define VBEPTR(x) REALPTR(((x) & 0xffff0000) >> 16, (x) & 0xffff)
|
nuclear@0
|
7 #define VBEPTR_SEG(x) (((x) & 0xffff0000) >> 16)
|
nuclear@0
|
8 #define VBEPTR_OFF(x) ((x) & 0xffff)
|
nuclear@0
|
9
|
nuclear@0
|
10 struct video_mode {
|
nuclear@0
|
11 int xres, yres, bpp;
|
nuclear@4
|
12 unsigned long addr;
|
nuclear@0
|
13 };
|
nuclear@0
|
14
|
nuclear@0
|
15 void sort_modes(struct video_mode *arr, int sz, int field);
|
nuclear@0
|
16
|
nuclear@0
|
17 int main(int argc, char **argv)
|
nuclear@0
|
18 {
|
nuclear@0
|
19 int i, nmodes;
|
nuclear@0
|
20 struct vbe_info *vbe;
|
nuclear@0
|
21 struct vbe_mode_info *mode;
|
nuclear@0
|
22 uint16_t *modes;
|
nuclear@0
|
23 struct video_mode *vmodes;
|
nuclear@1
|
24 char *vendor, *product, *prod_rev;
|
nuclear@4
|
25 unsigned long prev_addr = 0;
|
nuclear@0
|
26
|
nuclear@0
|
27 if(!(vbe = vbe_get_info())) {
|
nuclear@0
|
28 fprintf(stderr, "VBE not found\n");
|
nuclear@0
|
29 return 1;
|
nuclear@0
|
30 }
|
nuclear@1
|
31
|
nuclear@1
|
32 if(!(vendor = VBEPTR(vbe->oem_vendor_name_ptr)) || !*vendor) {
|
nuclear@1
|
33 vendor = "unknown";
|
nuclear@1
|
34 }
|
nuclear@1
|
35 if(!(product = VBEPTR(vbe->oem_product_name_ptr)) || !*product) {
|
nuclear@1
|
36 product = "unknown";
|
nuclear@1
|
37 }
|
nuclear@1
|
38 if(!(prod_rev = VBEPTR(vbe->oem_product_rev_ptr)) || !*prod_rev) {
|
nuclear@1
|
39 prod_rev = "unknown";
|
nuclear@1
|
40 }
|
nuclear@1
|
41
|
nuclear@0
|
42 printf("VBE version: %x.%x\n", vbe->version >> 8, vbe->version & 0xff);
|
nuclear@1
|
43 printf("Graphics adapter: %s, %s (%s)\n", vendor, product, prod_rev);
|
nuclear@1
|
44 printf("Video memory: %dkb\n", vbe->total_mem << 6);
|
nuclear@0
|
45
|
nuclear@0
|
46 modes = VBEPTR(vbe->vid_mode_ptr);
|
nuclear@0
|
47 nmodes = 0;
|
nuclear@0
|
48 for(i=0; i<1024; i++) {
|
nuclear@0
|
49 if(modes[i] == 0xffff) break;
|
nuclear@0
|
50 nmodes++;
|
nuclear@0
|
51 }
|
nuclear@0
|
52 printf("%d video modes found:\n", nmodes);
|
nuclear@0
|
53
|
nuclear@0
|
54 if(!(vmodes = malloc(nmodes * sizeof *vmodes))) {
|
nuclear@0
|
55 fprintf(stderr, "failed to allocate video modes array\n");
|
nuclear@0
|
56 return 1;
|
nuclear@0
|
57 }
|
nuclear@0
|
58
|
nuclear@0
|
59 for(i=0; i<nmodes; i++) {
|
nuclear@0
|
60 if(!(mode = vbe_get_mode_info(modes[i]))) {
|
nuclear@0
|
61 fprintf(stderr, "failed to get mode %d info\n", i);
|
nuclear@0
|
62 }
|
nuclear@0
|
63 vmodes[i].xres = mode->xres;
|
nuclear@0
|
64 vmodes[i].yres = mode->yres;
|
nuclear@0
|
65 vmodes[i].bpp = mode->bpp;
|
nuclear@4
|
66 vmodes[i].addr = mode->fb_addr;
|
nuclear@0
|
67 }
|
nuclear@0
|
68
|
nuclear@0
|
69 sort_modes(vmodes, nmodes, 2);
|
nuclear@0
|
70 sort_modes(vmodes, nmodes, 1);
|
nuclear@0
|
71
|
nuclear@0
|
72 for(i=0; i<nmodes; i++) {
|
nuclear@0
|
73 if(i == 0 || vmodes[i].xres != vmodes[i - 1].xres ||
|
nuclear@0
|
74 vmodes[i].yres != vmodes[i - 1].yres) {
|
nuclear@0
|
75 printf("\n%4dx%d - depth:", vmodes[i].xres, vmodes[i].yres);
|
nuclear@0
|
76 }
|
nuclear@0
|
77 printf(" %d", vmodes[i].bpp);
|
nuclear@0
|
78 }
|
nuclear@0
|
79 putchar('\n');
|
nuclear@0
|
80
|
nuclear@4
|
81 printf("fb addr:");
|
nuclear@4
|
82 for(i=0; i<nmodes; i++) {
|
nuclear@4
|
83 if(vmodes[i].addr && vmodes[i].addr != prev_addr) {
|
nuclear@4
|
84 printf(" %lx", vmodes[i].addr);
|
nuclear@4
|
85 prev_addr = vmodes[i].addr;
|
nuclear@4
|
86 }
|
nuclear@4
|
87 }
|
nuclear@4
|
88 putchar('\n');
|
nuclear@4
|
89
|
nuclear@0
|
90 free(vmodes);
|
nuclear@0
|
91 return 0;
|
nuclear@0
|
92 }
|
nuclear@0
|
93
|
nuclear@0
|
94 void sort_modes(struct video_mode *arr, int sz, int field)
|
nuclear@0
|
95 {
|
nuclear@0
|
96 int i, j;
|
nuclear@0
|
97 struct video_mode tmp;
|
nuclear@0
|
98
|
nuclear@0
|
99 for(i=0; i<sz; i++) {
|
nuclear@0
|
100 for(j=i+1; j<sz; j++) {
|
nuclear@0
|
101 if(((int*)(arr + i))[field] >= ((int*)(arr + j))[field]) {
|
nuclear@0
|
102 tmp = arr[i];
|
nuclear@0
|
103 arr[i] = arr[j];
|
nuclear@0
|
104 arr[j] = tmp;
|
nuclear@0
|
105 }
|
nuclear@0
|
106 }
|
nuclear@0
|
107 }
|
nuclear@0
|
108 }
|