13 #include <linux/module.h>
14 #include <linux/kernel.h>
15 #include <linux/errno.h>
16 #include <linux/string.h>
33 #define VIDEOMEMSIZE (1*1024*1024)
35 static void *videomemory;
44 static void *rvmalloc(
unsigned long size)
55 adr = (
unsigned long) mem;
65 static void rvfree(
void *mem,
unsigned long size)
72 adr = (
unsigned long) mem;
73 while ((
long) size > 0) {
126 static struct fb_ops vfb_ops = {
129 .fb_check_var = vfb_check_var,
130 .fb_set_par = vfb_set_par,
131 .fb_setcolreg = vfb_setcolreg,
132 .fb_pan_display = vfb_pan_display,
143 static u_long get_line_length(
int xres_virtual,
int bpp)
147 length = xres_virtual *
bpp;
148 length = (length + 31) & ~31;
224 var->
green.offset = 0;
225 var->
green.length = 8;
226 var->
blue.offset = 0;
227 var->
blue.length = 8;
235 var->
green.offset = 5;
236 var->
green.length = 5;
237 var->
blue.offset = 10;
238 var->
blue.length = 5;
244 var->
green.offset = 5;
245 var->
green.length = 6;
246 var->
blue.offset = 11;
247 var->
blue.length = 5;
255 var->
green.offset = 8;
256 var->
green.length = 8;
257 var->
blue.offset = 16;
258 var->
blue.length = 8;
265 var->
green.offset = 8;
266 var->
green.length = 8;
267 var->
blue.offset = 16;
268 var->
blue.length = 8;
273 var->
red.msb_right = 0;
274 var->
green.msb_right = 0;
275 var->
blue.msb_right = 0;
276 var->
transp.msb_right = 0;
285 static int vfb_set_par(
struct fb_info *info)
287 info->
fix.line_length = get_line_length(info->
var.xres_virtual,
288 info->
var.bits_per_pixel);
308 if (info->
var.grayscale) {
311 (red * 77 + green * 151 + blue * 28) >> 8;
338 #define CNVT_TOHW(val,width) ((((val)<<(width))+0x7FFF-(val))>>16)
339 switch (info->
fix.visual) {
363 v = (red << info->
var.red.offset) |
364 (green << info->
var.green.offset) |
365 (blue << info->
var.blue.offset) |
366 (transp << info->
var.transp.offset);
367 switch (info->
var.bits_per_pixel) {
398 if (var->
xoffset + info->
var.xres > info->
var.xres_virtual ||
415 static int vfb_mmap(
struct fb_info *info,
423 if (offset + size > info->
fix.smem_len) {
427 pos = (
unsigned long)info->
fix.smem_start + offset;
465 while ((this_opt =
strsep(&options,
",")) !=
NULL) {
469 if (!
strcmp(this_opt,
"disable"))
488 if (!(videomemory = rvmalloc(videomemorysize)))
497 memset(videomemory, 0, videomemorysize);
504 info->
fbops = &vfb_ops;
509 if (!retval || (retval == 4))
510 info->
var = vfb_default;
511 vfb_fix.smem_start = (
unsigned long) videomemory;
512 vfb_fix.smem_len = videomemorysize;
525 platform_set_drvdata(dev, info);
528 "fb%d: Virtual frame buffer device, using %ldK of video memory\n",
529 info->
node, videomemorysize >> 10);
536 rvfree(videomemory, videomemorysize);
542 struct fb_info *info = platform_get_drvdata(dev);
546 rvfree(videomemory, videomemorysize);
555 .remove = vfb_remove,
563 static int __init vfb_init(
void)
600 static void __exit vfb_exit(
void)