--- drivers/video/Kconfig | 14 ++++++ drivers/video/Makefile | 1 + drivers/video/vsfb.c | 117 ++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/vsfb.h | 23 +++++++++ 4 files changed, 155 insertions(+), 0 deletions(-) create mode 100644 drivers/video/vsfb.c create mode 100644 include/linux/vsfb.h diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig index 7d86e9e..302fb8d 100644 --- a/drivers/video/Kconfig +++ b/drivers/video/Kconfig @@ -1892,6 +1892,20 @@ config FB_VIRTUAL If unsure, say N. +config FB_VSFB + tristate "Very Simple FrameBuffer (vsfb) driver" + depends on FB + select FB_CFB_FILLRECT + select FB_CFB_COPYAREA + select FB_CFB_IMAGEBLIT + ---help--- + This is a very simple framebuffer device intended for either + testing devices for which no proper video driver exists or for + use on very simple framebuffers that have been set up by 'bios like' + bootloaders that reserve a block of linear memory for a framebuffer. + + If unsure, say N. + source "drivers/video/omap/Kconfig" source "drivers/video/backlight/Kconfig" diff --git a/drivers/video/Makefile b/drivers/video/Makefile index 59d6c45..80f9d2a 100644 --- a/drivers/video/Makefile +++ b/drivers/video/Makefile @@ -124,6 +124,7 @@ obj-$(CONFIG_FB_BF54X_LQ043) += bf54x-lq043fb.o # the test framebuffer is last obj-$(CONFIG_FB_VIRTUAL) += vfb.o +obj-$(CONFIG_FB_VSFB) += vsfb.o #video output switch sysfs driver obj-$(CONFIG_VIDEO_OUTPUT_CONTROL) += output.o diff --git a/drivers/video/vsfb.c b/drivers/video/vsfb.c new file mode 100644 index 0000000..973441d --- /dev/null +++ b/drivers/video/vsfb.c @@ -0,0 +1,117 @@ +/* + * linux/drivers/video/vsfb.c + * + * Copyright (C) 2003 Ian Molton + * + * Based on acornfb by Russell King + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Frame buffer code for Simple platforms + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +static struct fb_info fb_info; +static u32 colreg[17]; + + +static int +vsfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, + u_int trans, struct fb_info *info) +{ + if (regno > 16) + return 1; + + ((u32 *)(info->pseudo_palette))[regno] = (red & 0xf800) | ((green & 0xfc00) >> 5) | ((blue & 0xf800) >> 11); + + return 0; +} + +static struct fb_ops vsfb_ops = { + .owner = THIS_MODULE, + .fb_setcolreg = vsfb_setcolreg, + .fb_fillrect = cfb_fillrect, + .fb_copyarea = cfb_copyarea, + .fb_imageblit = cfb_imageblit, +}; + +static int vsfb_probe(struct platform_device *pdev) { + struct vsfb_deviceinfo *vsfb; + + vsfb = pdev->dev.platform_data; + if(!vsfb) + return -ENODEV; + + memcpy (&fb_info.fix, vsfb->fix, sizeof(struct fb_fix_screeninfo)); + memcpy (&fb_info.var, vsfb->var, sizeof(struct fb_var_screeninfo)); + + fb_info.fbops = &vsfb_ops; + fb_info.flags = FBINFO_FLAG_DEFAULT; + fb_info.pseudo_palette = colreg; + fb_alloc_cmap(&fb_info.cmap, 16, 0); + + /* Try to grab our phys memory space... */ + if (!(request_mem_region(fb_info.fix.smem_start, fb_info.fix.smem_len, "vsfb"))){ + return -ENOMEM; + } + + /* Try to map this so we can access it */ + fb_info.screen_base = ioremap(fb_info.fix.smem_start, fb_info.fix.smem_len); + if (!fb_info.screen_base) { + release_mem_region(fb_info.fix.smem_start, fb_info.fix.smem_len); + return -EIO; + } + + printk(KERN_INFO "vsfb: framebuffer at 0x%lx, mapped to 0x%p, size %dk \n", fb_info.fix.smem_start, fb_info.screen_base, fb_info.fix.smem_len/1024); + + if (register_framebuffer(&fb_info) < 0){ + iounmap(fb_info.screen_base); + release_mem_region(fb_info.fix.smem_start, fb_info.fix.smem_len); + + return -EINVAL; + } + + return 0; +} + +struct platform_driver vsfb_driver = { + .driver = { + .name = "vsfb", + }, + .probe = vsfb_probe, +}; + +static int __init vsfb_init(void) +{ + return platform_driver_register (&vsfb_driver); + return 0; +} + +module_init(vsfb_init); + +MODULE_AUTHOR("Ian Molton f2s.com>"); +MODULE_DESCRIPTION("Very Simple framebuffer driver"); +MODULE_LICENSE("GPL"); diff --git a/include/linux/vsfb.h b/include/linux/vsfb.h new file mode 100644 index 0000000..1d4a872 --- /dev/null +++ b/include/linux/vsfb.h @@ -0,0 +1,23 @@ +/* + * vsfb.h + * + * (c) 2006 Ian Molton f2s.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#ifndef _VSFB_H_INCLUDED +#define _VSFB_H_INCLUDED + +#include + +struct vsfb_deviceinfo +{ + struct fb_var_screeninfo *var; + struct fb_fix_screeninfo *fix; +}; + +#endif -- 1.5.3.5.737.gdee1b