1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
#include <fcntl.h>
#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>
#include <linux/fb.h>
#include <sys/ioctl.h>
#include "fb.h"
#include "gpio.h"
struct imx_epdc_fb_mode {
struct fb_videomode *vmode;
int vscan_holdoff;
int sdoed_width;
int sdoed_delay;
int sdoez_width;
int sdoez_delay;
int gdclk_hp_offs;
int gdsp_offs;
int gdoe_offs;
int gdclk_offs;
int num_ce;
};
static char *fbaddr;
void dumpsi(const char *ctl, int io, struct fb_var_screeninfo *si)
{
printf("- %s\n", ctl);
printf("\tioctl returned %d\n", io);
printf("\txres: %d\n", si->xres);
printf("\tyres: %d\n", si->yres);
printf("\txres_virtual: %d\n", si->xres_virtual);
printf("\tyres_virtual: %d\n", si->yres_virtual);
printf("\txoffset: %d\n", si->xoffset);
printf("\tyoffset: %d\n", si->yoffset);
printf("\tbits_per_pixel: %d\n", si->bits_per_pixel);
printf("\tgrayscale: %d\n", si->grayscale);
}
void dumpfsi(const char *ctl, int io, struct fb_fix_screeninfo *fsi)
{
printf("- %s\n", ctl);
printf("\tioctl returned %d\n", io);
printf("\tid: %16s\n", fsi->id);
printf("\tsmem_len: %d\n", fsi->smem_len);
printf("\ttype: %d\n", fsi->type);
printf("\ttype_aux: %d\n", fsi->type_aux);
printf("\tvisual: %d\n", fsi->visual);
printf("\txpanstep: %d\n", fsi->xpanstep);
printf("\typanstep: %d\n", fsi->ypanstep);
printf("\tywrapstep: %d\n", fsi->ywrapstep);
printf("\tline_length: %d\n", fsi->line_length);
printf("\tmmio_start: %lu\n", fsi->mmio_start);
printf("\tmmio_len: %d\n", fsi->mmio_len);
printf("\taccel: %d\n", fsi->accel);
printf("\tcapabilities: %d\n", fsi->capabilities);
}
void fb_init(void)
{
printf("enabling left display\n");
gpio_set(ENABLE_LEFT_DISPLAY);
printf("enabling right display\n");
gpio_set(ENABLE_RIGHT_DISPLAY);
printf("mapping framebuffer...\n");
struct fb_var_screeninfo si = { 0 };
int fbfd = open("/dev/fb0", O_RDWR);
struct fb_fix_screeninfo fsi;
int io = ioctl(fbfd, FBIOGET_FSCREENINFO, &fsi);
dumpfsi("FBIOGET_FSCREENINFO", io, &fsi);
io = ioctl(fbfd, FBIOGET_VSCREENINFO, &si);
dumpsi("FBIOEGET_VSCREENINFO", io, &si);
si.bits_per_pixel = 8;
si.grayscale = 1;
si.activate = FB_ACTIVATE_FORCE;
io = ioctl(fbfd, FBIOPUT_VSCREENINFO, &si);
dumpsi("FBIOPUT_VSCREENINFO", io, &si);
fbaddr = mmap(NULL, fsi.smem_len, PROT_READ | PROT_WRITE, MAP_PRIVATE, fbfd, 0);
for (unsigned int i = 0; i < fsi.smem_len; i++) {
fbaddr[i] = i % 2 == 0 ? '\0' : '\xff';
}
close(fbfd);
printf("at %p\n", fbaddr);
}
|