From 1f60ac234b20b2eb7bc2b4b2cee8519aea6297ec Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Wed, 17 Aug 2011 17:07:23 +0200 Subject: Update fixed screen info after changing format or resolution The line length field can change after changing the format or the resolution. Re-read fixed screen info from the device. Signed-off-by: Laurent Pinchart --- fbdev.c | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/fbdev.c b/fbdev.c index 205ab3c..578e67a 100644 --- a/fbdev.c +++ b/fbdev.c @@ -316,6 +316,25 @@ static void fb_unmap_memory(struct device *dev) * Open/close */ +static int fb_update_info(struct device *dev) +{ + int ret; + + ret = ioctl(dev->fd, FBIOGET_FSCREENINFO, &dev->fix_info); + if (ret < 0) { + printf("Error updating fixed screen info.\n"); + return ret; + } + + ret = ioctl(dev->fd, FBIOGET_VSCREENINFO, &dev->var_info); + if (ret < 0) { + printf("Error updating variable screen info.\n"); + return ret; + } + + return 0; +} + /* * fb_open - Open a frame buffer device * @dev: FB device @@ -338,18 +357,10 @@ static int fb_open(struct device *dev, const char *devname) return dev->fd; } - ret = ioctl(dev->fd, FBIOGET_FSCREENINFO, &dev->fix_info); - if (ret < 0) { - printf("Error opening device %s: unable to get fixed screen " - "info.\n", devname); - close(dev->fd); - return ret; - } - - ret = ioctl(dev->fd, FBIOGET_VSCREENINFO, &dev->var_info); + ret = fb_update_info(dev); if (ret < 0) { - printf("Error opening device %s: unable to get variable screen " - "info.\n", devname); + printf("Error opening device %s: unable to get screen info.\n", + devname); close(dev->fd); return ret; } @@ -497,6 +508,9 @@ static int fb_set_format(struct device *dev, unsigned int bpp) fb_print_var(dev, &var_info); + /* Fixed screen information might have changed, re-read it. */ + fb_update_info(dev); + return 0; } @@ -552,6 +566,9 @@ static int fb_set_resolution(struct device *dev, int xres, int yres, fb_print_var(dev, &var_info); + /* Fixed screen information might have changed, re-read it. */ + fb_update_info(dev); + return 0; } -- cgit v1.2.3