Skip to content

Commit

Permalink
staging: udlfb: fbdev character read and write support
Browse files Browse the repository at this point in the history
Restore fbdev character read and write support

Enables access to the framebuffer from simple reads and writes
to /dev/fb0 (or fb1, ...). Low performance, because of extra copy
and because udlfb must scan every pixel for changes. But very
useful for testing and simple image display, etc.

Signed-off-by: Bernie Thompson <bernie@plugable.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Bernie Thompson authored and Greg Kroah-Hartman committed Sep 5, 2010
1 parent df9be30 commit d46ecb9
Showing 1 changed file with 44 additions and 0 deletions.
44 changes: 44 additions & 0 deletions drivers/staging/udlfb/udlfb.c
Original file line number Diff line number Diff line change
Expand Up @@ -602,6 +602,48 @@ int dlfb_handle_damage(struct dlfb_data *dev, int x, int y,
return 0;
}

static ssize_t dlfb_ops_read(struct fb_info *info, char __user *buf,
size_t count, loff_t *ppos)
{
ssize_t result = -ENOSYS;

#if defined CONFIG_FB_SYS_FOPS || defined CONFIG_FB_SYS_FOPS_MODULE
result = fb_sys_read(info, buf, count, ppos);
#endif

return result;
}

/*
* Path triggered by usermode clients who write to filesystem
* e.g. cat filename > /dev/fb1
* Not used by X Windows or text-mode console. But useful for testing.
* Slow because of extra copy and we must assume all pixels dirty.
*/
static ssize_t dlfb_ops_write(struct fb_info *info, const char __user *buf,
size_t count, loff_t *ppos)
{
ssize_t result = -ENOSYS;
struct dlfb_data *dev = info->par;
u32 offset = (u32) *ppos;

#if defined CONFIG_FB_SYS_FOPS || defined CONFIG_FB_SYS_FOPS_MODULE

result = fb_sys_write(info, buf, count, ppos);

if (result > 0) {
int start = max((int)(offset / info->fix.line_length) - 1, 0);
int lines = min((u32)((result / info->fix.line_length) + 1),
(u32)info->var.yres);

dlfb_handle_damage(dev, 0, start, info->var.xres,
lines, info->screen_base);
}
#endif

return result;
}

/* hardware has native COPY command (see libdlo), but not worth it for fbcon */
static void dlfb_ops_copyarea(struct fb_info *info,
const struct fb_copyarea *area)
Expand Down Expand Up @@ -924,6 +966,8 @@ static int dlfb_ops_blank(int blank_mode, struct fb_info *info)

static struct fb_ops dlfb_ops = {
.owner = THIS_MODULE,
.fb_read = dlfb_ops_read,
.fb_write = dlfb_ops_write,
.fb_setcolreg = dlfb_ops_setcolreg,
.fb_fillrect = dlfb_ops_fillrect,
.fb_copyarea = dlfb_ops_copyarea,
Expand Down

0 comments on commit d46ecb9

Please sign in to comment.