2 * quick tool to set LCD timings for Wiz
4 * code dedicated to public domain.
6 * HTOTAL: X VTOTAL: 341
7 * HSWIDTH: 1 VSWIDTH: 0
8 * HASTART: 37 VASTART: 17
9 * HAEND: 277 VAEND: 337
14 * pcd 10, 357: - 523us
15 * pcd 11, 325: +1153us
17 * 'lcd_timings=397,1,37,277,341,0,17,337;clkdiv0=9'
23 #include "pollux_dpc_set.h"
26 * set LCD timings based on preformated string (see usage() below for params).
27 * returns 0 on success.
29 int pollux_dpc_set(volatile unsigned short *memregs, const char *str)
31 int timings[8], have_timings = 0;
32 int pcd = 0, have_pcd = 0;
42 if (strncmp(p, "lcd_timings=", 12) == 0)
46 ret = sscanf(p, "%d,%d,%d,%d,%d,%d,%d,%d",
47 &timings[0], &timings[1], &timings[2], &timings[3],
48 &timings[4], &timings[5], &timings[6], &timings[7]);
51 /* skip seven commas */
52 for (c = 0; c < 7 && *p != 0; p++)
57 /* skip last number */
58 while ('0' <= *p && *p <= '9')
62 else if (strncmp(p, "clkdiv0=", 8) == 0)
66 pcd = strtoul(p, &ep, 10);
75 while (*p == ';' || *p == ' ')
81 fprintf(stderr, "dpc_set parser: error at '%s'\n", p);
88 for (i = 0; i < 8; i++)
89 if (timings[i] & ~0xffff) {
90 fprintf(stderr, "dpc_set: invalid timing %d: %d\n", i, timings[i]);
97 if ((pcd - 1) & ~0x3f) {
98 fprintf(stderr, "dpc_set: invalid clkdiv0: %d\n", pcd);
106 for (i = 0; i < 8; i++)
107 memregs[(0x307c>>1) + i] = timings[i];
113 pcd = (pcd - 1) & 0x3f;
114 tmp = memregs[0x31c4>>1];
115 memregs[0x31c4>>1] = (tmp & ~0x3f0) | (pcd << 4);
122 #include <sys/types.h>
123 #include <sys/stat.h>
125 #include <sys/mman.h>
128 static void usage(const char *binary)
130 printf("usage:\n%s <set_str[;set_str[;...]]>\n"
132 " lcd_timings=<htotal,hswidth,hastart,haend,vtotal,vswidth,vastart,vaend>\n"
133 " clkdiv0=<divider>\n", binary);
136 int main(int argc, char *argv[])
138 volatile unsigned short *memregs;
146 memdev = open("/dev/mem", O_RDWR);
149 perror("open(/dev/mem) failed");
153 memregs = mmap(0, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, memdev, 0xc0000000);
154 if (memregs == MAP_FAILED)
156 perror("mmap(memregs) failed");
161 ret = pollux_dpc_set(memregs, argv[1]);
163 munmap((void *)memregs, 0x10000);