fb: use timeout instead of microdelay for restart logo
Change-Id: I1cb192aae502ed917e757cf17f67a9a355d0059a
This commit is contained in:
parent
2b793e4945
commit
67434e545b
1 changed files with 35 additions and 2 deletions
|
@ -2,6 +2,7 @@
|
|||
#include <minix/chardriver.h>
|
||||
#include <minix/drivers.h>
|
||||
#include <minix/ds.h>
|
||||
#include <minix/sysutil.h>
|
||||
#include <minix/type.h>
|
||||
#include <minix/vm.h>
|
||||
#include <sys/ioc_fb.h>
|
||||
|
@ -35,6 +36,7 @@ static int do_get_varscreeninfo(int minor, endpoint_t ep, cp_grant_id_t gid);
|
|||
static int do_put_varscreeninfo(int minor, endpoint_t ep, cp_grant_id_t gid);
|
||||
static int do_get_fixscreeninfo(int minor, endpoint_t ep, cp_grant_id_t gid);
|
||||
static int do_pan_display(int minor, endpoint_t ep, cp_grant_id_t gid);
|
||||
static int keep_displaying_restarted(void);
|
||||
|
||||
/* SEF functions and variables. */
|
||||
static void sef_local_startup(void);
|
||||
|
@ -60,6 +62,7 @@ static struct chardriver fb_tab =
|
|||
/** Represents the /dev/fb device. */
|
||||
static struct device fb_device[FB_DEV_NR];
|
||||
static int fb_minor, has_restarted = 0;
|
||||
static u64_t has_restarted_t1, has_restarted_t2;
|
||||
|
||||
static int open_counter[FB_DEV_NR]; /* Open count */
|
||||
|
||||
|
@ -74,8 +77,8 @@ fb_open(message *m)
|
|||
open_counter[m->DEVICE]++;
|
||||
if (!initialized) {
|
||||
if (has_restarted) {
|
||||
read_frclock_64(&has_restarted_t1);
|
||||
paint_restartlogo(m->DEVICE);
|
||||
has_restarted = 0;
|
||||
} else {
|
||||
paint_bootlogo(m->DEVICE);
|
||||
}
|
||||
|
@ -211,6 +214,10 @@ do_put_varscreeninfo(int minor, endpoint_t ep, cp_grant_id_t gid)
|
|||
int r;
|
||||
struct fb_var_screeninfo fbvs_copy;
|
||||
|
||||
if (has_restarted && keep_displaying_restarted()) {
|
||||
return EAGAIN;
|
||||
}
|
||||
|
||||
if ((r = sys_safecopyfrom(ep, gid, 0, (vir_bytes) &fbvs_copy,
|
||||
sizeof(fbvs_copy))) != OK) {
|
||||
return r;
|
||||
|
@ -225,6 +232,10 @@ do_pan_display(int minor, endpoint_t ep, cp_grant_id_t gid)
|
|||
int r;
|
||||
struct fb_var_screeninfo fbvs_copy;
|
||||
|
||||
if (has_restarted && keep_displaying_restarted()) {
|
||||
return EAGAIN;
|
||||
}
|
||||
|
||||
if ((r = sys_safecopyfrom(ep, gid, 0, (vir_bytes) &fbvs_copy,
|
||||
sizeof(fbvs_copy))) != OK) {
|
||||
return r;
|
||||
|
@ -267,6 +278,10 @@ fb_do_write(endpoint_t ep, iovec_t *iov, int minor, u64_t pos, size_t *io_bytes)
|
|||
return OK;
|
||||
}
|
||||
|
||||
if (has_restarted && keep_displaying_restarted()) {
|
||||
return EAGAIN;
|
||||
}
|
||||
|
||||
return sys_safecopyfrom(ep, (cp_grant_id_t) iov->iov_addr, 0,
|
||||
(vir_bytes) (dev.dv_base + ex64lo(pos)),
|
||||
*io_bytes);
|
||||
|
@ -355,6 +370,25 @@ main(void)
|
|||
return OK;
|
||||
}
|
||||
|
||||
static int
|
||||
keep_displaying_restarted()
|
||||
{
|
||||
u64_t delta;
|
||||
u32_t micro_delta;
|
||||
|
||||
read_frclock_64(&has_restarted_t2);
|
||||
delta = delta_frclock_64(has_restarted_t1, has_restarted_t2);
|
||||
micro_delta = frclock_64_to_micros(delta);
|
||||
|
||||
#define DISPLAY_1SEC 1000000 /* 1 second in microseconds */
|
||||
if (micro_delta < DISPLAY_1SEC) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
has_restarted = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
paint_bootlogo(int minor)
|
||||
{
|
||||
|
@ -366,7 +400,6 @@ paint_restartlogo(int minor)
|
|||
{
|
||||
paint_centered(minor, restartlogo_data, restartlogo_width,
|
||||
restartlogo_height);
|
||||
micro_delay(1 * 1000000); /* 1 second */
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
Loading…
Reference in a new issue