1
|
1 #include <stdio.h>
|
|
2 #include <sys/types.h>
|
|
3 #include <unistd.h>
|
|
4 #include <sys/ioctl.h>
|
|
5 #include <errno.h>
|
|
6 #include <string.h>
|
|
7 #include <stdlib.h>
|
|
8 #include <fcntl.h>
|
|
9 #include "fb.h"
|
|
10 #include "matroxfb.h"
|
|
11
|
|
12 static int help(void) {
|
|
13 fprintf(stderr, "usage: matroxset [-f fbdev] [-o output] [-m] [value]\n"
|
|
14 "\n"
|
|
15 "where -f fbdev is fbdev device (default /dev/fb1)\n"
|
|
16 " -o output is output number to investigate (0=primary, 1=secondary=default)\n"
|
|
17 " -m says that CRTC->output mapping should be changed/retrieved\n"
|
|
18 " -p print information about blanking\n"
|
|
19 " value if present, value is set, if missing, value is retrieved\n"
|
|
20 "\n"
|
|
21 "For output mode, 128 means monitor, 1 = PAL TV, 2 = NTSC TV\n");
|
|
22 return 98;
|
|
23 }
|
|
24
|
|
25 int main(int argc, char* argv[]) {
|
|
26 char* fb = "/dev/fb1";
|
|
27 int fd;
|
|
28 struct matroxioc_output_mode mom;
|
|
29 struct fb_vblank vbl;
|
|
30 int rtn;
|
|
31 int output = MATROXFB_OUTPUT_SECONDARY;
|
|
32 int o_present = 0;
|
|
33 int m_present = 0;
|
|
34 int p_present = 0;
|
|
35 int act;
|
|
36 u_int32_t conns;
|
|
37
|
|
38 while ((rtn = getopt(argc, argv, "o:f:mhp")) != -1) {
|
|
39 switch (rtn) {
|
|
40 case 'o':
|
|
41 output = strtoul(optarg, NULL, 0);
|
|
42 o_present = 1;
|
|
43 break;
|
|
44 case 'm':
|
|
45 m_present = 1;
|
|
46 break;
|
|
47 case 'f':
|
|
48 fb = optarg;
|
|
49 break;
|
|
50 case 'p':
|
|
51 p_present = 1;
|
|
52 break;
|
|
53 case 'h':
|
|
54 return help();
|
|
55 default:
|
|
56 fprintf(stderr, "Bad commandline\n");
|
|
57 return 99;
|
|
58 }
|
|
59 }
|
|
60 act = 0;
|
|
61 if (p_present) {
|
|
62 if (m_present || o_present) {
|
|
63 fprintf(stderr, "You cannot use -p together with -m or -o\n");
|
|
64 return 95;
|
|
65 }
|
|
66 act = 4;
|
|
67 } else if (optind >= argc) {
|
|
68 if (m_present) {
|
|
69 if (o_present) {
|
|
70 fprintf(stderr, "You cannot use -m and -o together\n");
|
|
71 return 96;
|
|
72 }
|
|
73 act = 2;
|
|
74 } else {
|
|
75 mom.output = output;
|
|
76 mom.mode = 0;
|
|
77 }
|
|
78 } else {
|
|
79 if (m_present) {
|
|
80 conns = strtoul(argv[optind], NULL, 0);
|
|
81 act = 3;
|
|
82 } else {
|
|
83 mom.output = output;
|
|
84 mom.mode = strtoul(argv[optind], NULL, 0);
|
|
85 act = 1;
|
|
86 }
|
|
87 }
|
|
88 fd = open(fb, O_RDWR);
|
|
89 if (fd == -1) {
|
|
90 fprintf(stderr, "Cannot open %s: %s\n", fb, strerror(errno));
|
|
91 return 122;
|
|
92 }
|
|
93 switch (act) {
|
|
94 case 0:
|
|
95 rtn = ioctl(fd, MATROXFB_GET_OUTPUT_MODE, &mom);
|
|
96 if (rtn)
|
|
97 break;
|
|
98 printf("Output mode is %u\n", mom.mode);
|
|
99 break;
|
|
100 case 1:
|
|
101 rtn = ioctl(fd, MATROXFB_SET_OUTPUT_MODE, &mom);
|
|
102 break;
|
|
103 case 2:
|
|
104 rtn = ioctl(fd, MATROXFB_GET_OUTPUT_CONNECTION, &conns);
|
|
105 if (rtn)
|
|
106 break;
|
|
107 printf("This framebuffer is connected to outputs %08X\n", conns);
|
|
108 break;
|
|
109 case 3:
|
|
110 rtn = ioctl(fd, MATROXFB_SET_OUTPUT_CONNECTION, &conns);
|
|
111 break;
|
|
112 case 4:
|
|
113 #if 0
|
|
114 { int i; for (i = 0; i < 1000000; i++) {
|
|
115 rtn = ioctl(fd, FBIOGET_VBLANK, &vbl);
|
|
116 if (rtn)
|
|
117 break;
|
|
118 }}
|
|
119 #else
|
|
120 rtn = ioctl(fd, FBIOGET_VBLANK, &vbl);
|
|
121 if (rtn)
|
|
122 break;
|
|
123 #endif
|
|
124 printf("VBlank flags: %08X\n", vbl.flags);
|
|
125 printf(" Symbolic: ");
|
|
126 {
|
|
127 static const struct { u_int32_t mask; const char* msg; } *ptr, vals[] = {
|
|
128 { FB_VBLANK_HAVE_VBLANK, "vblank" },
|
|
129 { FB_VBLANK_HAVE_HBLANK, "hblank" },
|
|
130 { FB_VBLANK_HAVE_COUNT, "field no." },
|
|
131 { FB_VBLANK_HAVE_VCOUNT, "line no." },
|
|
132 { FB_VBLANK_HAVE_HCOUNT, "column no." },
|
|
133 { FB_VBLANK_VBLANKING, "vblanking" },
|
|
134 { FB_VBLANK_HBLANKING, "hblanking" },
|
|
135 { 0, NULL }};
|
|
136 int ap = 0;
|
|
137 for (ptr = vals; ptr->msg; ptr++) {
|
|
138 if (vbl.flags & ptr->mask) {
|
|
139 if (ap) printf(", ");
|
|
140 printf(ptr->msg);
|
|
141 ap = 1;
|
|
142 }
|
|
143 }
|
|
144 if (!ap)
|
|
145 printf("none");
|
|
146 printf("\n");
|
|
147 }
|
|
148 printf("Field count: %12u\n", vbl.count);
|
|
149 printf("Vertical line: %12u\n", vbl.vcount);
|
|
150 printf("Horizontal column: %12u\n", vbl.hcount);
|
|
151 break;
|
|
152 default:
|
|
153 rtn = -1; errno = EINVAL;
|
|
154 break;
|
|
155 }
|
|
156 if (rtn) {
|
|
157 fprintf(stderr, "ioctl failed: %s\n", strerror(errno));
|
|
158 }
|
|
159 close(fd);
|
|
160 return 0;
|
|
161 }
|
|
162
|