12 #define FBDEV_PATH "/dev/fb0"
13 #define BPP sizeof(fbval_t)
16 static unsigned char *fb
;
17 static struct fb_var_screeninfo vinfo
;
18 static struct fb_fix_screeninfo finfo
;
22 return vinfo
.xres_virtual
* vinfo
.yres_virtual
* BPP
;
25 #define NLEVELS 1 << 8
28 unsigned short red
[NLEVELS
], green
[NLEVELS
], blue
[NLEVELS
];
30 int mr
= 1 << vinfo
.red
.length
;
31 int mg
= 1 << vinfo
.green
.length
;
32 int mb
= 1 << vinfo
.blue
.length
;
34 if (finfo
.visual
== FB_VISUAL_TRUECOLOR
)
37 for (i
= 0; i
< mr
; i
++)
38 red
[i
] = (i
<< 16) / (mr
- 1);
39 for (i
= 0; i
< mg
; i
++)
40 green
[i
] = (i
<< 16) / (mg
- 1);
41 for (i
= 0; i
< mb
; i
++)
42 blue
[i
] = (i
<< 16) / (mb
- 1);
45 cmap
.len
= MAX(mr
, MAX(mg
, mb
));
51 ioctl(fd
, FBIOPUTCMAP
, &cmap
);
56 fd
= open(FBDEV_PATH
, O_RDWR
);
58 xerror("can't open " FBDEV_PATH
);
59 if (ioctl(fd
, FBIOGET_VSCREENINFO
, &vinfo
) == -1)
60 xerror("ioctl failed");
61 if (ioctl(fd
, FBIOGET_FSCREENINFO
, &finfo
) == -1)
62 xerror("ioctl failed");
63 fb
= mmap(NULL
, fb_len(), PROT_READ
| PROT_WRITE
, MAP_SHARED
, fd
, 0);
65 xerror("can't map the framebuffer");
69 void fb_put(int r
, int c
, fbval_t val
)
71 long loc
= (c
+ vinfo
.xoffset
) * BPP
+
72 (r
+ vinfo
.yoffset
) * finfo
.line_length
;
73 memcpy(fb
+ loc
, &val
, BPP
);
82 static fbval_t
color_bits(struct fb_bitfield
*bf
, fbval_t v
)
84 fbval_t moved
= v
>> (8 - bf
->length
);
85 return moved
<< bf
->offset
;
88 fbval_t
fb_color(unsigned char r
, unsigned char g
, unsigned char b
)
90 return color_bits(&vinfo
.red
, r
) |
91 color_bits(&vinfo
.green
, g
) |
92 color_bits(&vinfo
.blue
, b
);
97 return vinfo
.yres_virtual
;
102 return vinfo
.xres_virtual
;
105 void fb_box(int sr
, int sc
, int er
, int ec
, fbval_t val
)
108 for (r
= sr
; r
< er
; r
++)
109 for (c
= sc
; c
< ec
; c
++)
113 static unsigned char *rowaddr(int r
)
115 return fb
+ (r
+ vinfo
.yoffset
) * finfo
.line_length
;
118 void fb_scroll(int sr
, int nr
, int n
, fbval_t val
)
120 memmove(rowaddr(sr
+ n
), rowaddr(sr
), nr
* finfo
.line_length
);
122 fb_box(sr
, 0, n
, sr
+ n
, val
);
124 fb_box(sr
+ nr
+ n
, 0, sr
+ nr
, fb_cols(), val
);