summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--firmware/target/hosted/backlight-unix.c16
-rw-r--r--firmware/target/hosted/lcd-linuxfb.c21
2 files changed, 27 insertions, 10 deletions
diff --git a/firmware/target/hosted/backlight-unix.c b/firmware/target/hosted/backlight-unix.c
index 28bda52b20..06da05e487 100644
--- a/firmware/target/hosted/backlight-unix.c
+++ b/firmware/target/hosted/backlight-unix.c
@@ -44,20 +44,28 @@ bool backlight_hw_init(void)
return true;
}
+static int last_bl = -1;
+
void backlight_hw_on(void)
{
+ if (last_bl != 1) {
#ifdef HAVE_LCD_ENABLE
- lcd_enable(true);
+ lcd_enable(true);
#endif
- sysfs_set_int(sysfs_bl_power, 0);
+ sysfs_set_int(sysfs_bl_power, 0);
+ last_bl = 1;
+ }
}
void backlight_hw_off(void)
{
- sysfs_set_int(sysfs_bl_power, 1);
+ if (last_bl != 0) {
+ sysfs_set_int(sysfs_bl_power, 1);
#ifdef HAVE_LCD_ENABLE
- lcd_enable(false);
+ lcd_enable(false);
#endif
+ last_bl = 0;
+ }
}
void backlight_hw_brightness(int brightness)
diff --git a/firmware/target/hosted/lcd-linuxfb.c b/firmware/target/hosted/lcd-linuxfb.c
index 6a57be9e40..8edb82757f 100644
--- a/firmware/target/hosted/lcd-linuxfb.c
+++ b/firmware/target/hosted/lcd-linuxfb.c
@@ -53,15 +53,15 @@ void lcd_init_device(void)
panicf("Cannot open framebuffer: %s\n", fb_dev);
}
- /* get fixed and variable information */
- if(ioctl(fd, FBIOGET_FSCREENINFO, &finfo) < 0)
+ if (fcntl( fd, F_SETFD, FD_CLOEXEC ) < 0)
{
- panicf("Cannot read framebuffer fixed information");
+ panicf("Can't set CLOEXEC");
}
- if(ioctl(fd, FBIOGET_VSCREENINFO, &vinfo) < 0)
+ /* get fixed and variable information */
+ if(ioctl(fd, FBIOGET_FSCREENINFO, &finfo) < 0)
{
- panicf("Cannot read framebuffer variable information");
+ panicf("Cannot read framebuffer fixed information");
}
#if 0
@@ -76,12 +76,17 @@ void lcd_init_device(void)
* values returned by the driver for line_length */
/* map framebuffer */
- framebuffer = mmap(0, FRAMEBUFFER_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ framebuffer = mmap(NULL, FRAMEBUFFER_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if((void *)framebuffer == MAP_FAILED)
{
panicf("Cannot map framebuffer");
}
+ if(ioctl(fd, FBIOGET_VSCREENINFO, &vinfo) < 0)
+ {
+ panicf("Cannot read framebuffer variable information");
+ }
+
memset(framebuffer, 0, finfo.smem_len);
#ifdef HAVE_LCD_ENABLE
@@ -104,7 +109,11 @@ void lcd_enable(bool on)
{
if (fd < 0) return;
+ if (lcd_active() == on)
+ return;
+
lcd_set_active(on);
+
if (on)
{
send_event(LCD_EVENT_ACTIVATION, NULL);