diff options
author | Dale Stimson <dale.b.stimson@intel.com> | 2014-09-19 09:26:19 -0700 |
---|---|---|
committer | Pat Tjin <pattjin@google.com> | 2014-09-20 03:32:42 +0000 |
commit | 49c0d752dccf96e95c4766c15765ab3fd35778f9 (patch) | |
tree | f711df6b7d48e7d556efb57e48487b60f75c9e02 /recovery | |
parent | a2249402aebf69198187eed52278889be35ca380 (diff) | |
download | fugu-49c0d752dccf96e95c4766c15765ab3fd35778f9.tar.gz |
Set device recovery use RGBX_8888 pixel format
Recovery assumes frame buffer pixel format is RGBX.
In case FB format is BGRA a costly transformation was done.
Adds SetDisplayMode to init and calls fb ioctl to set color
format to RGBX.
Author: Jim Bish <jim.bish@intel.com>
Bug: 17292036
BZ: 222298
Change-Id: I6fbc456e8027eade9b83bfbad551465cbe663d32
Signed-off-by: Dale Stimson <dale.b.stimson@intel.com>
Diffstat (limited to 'recovery')
-rw-r--r-- | recovery/recovery_ui.cpp | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/recovery/recovery_ui.cpp b/recovery/recovery_ui.cpp index 78625de..f2de67e 100644 --- a/recovery/recovery_ui.cpp +++ b/recovery/recovery_ui.cpp @@ -47,6 +47,7 @@ static const char* ITEMS[] = {"reboot system now", NULL }; #define kFBDevice "/dev/graphics/fb0" +#define FBIO_PSB_SET_RGBX _IOWR('F', 0x42, struct fb_var_screeninfo) struct led_rgb_vals { uint8_t rgb[3]; @@ -73,6 +74,65 @@ public: memset(last_keys, 0, kKeyBufferSize * sizeof(int)); } + void Init() { + SetupDisplayMode(); + ScreenRecoveryUI::Init(); + } + + void SetupDisplayMode() { + int fb_dev = open(kFBDevice, O_RDWR); + int res; + uint32_t i; + printf("opening fb %s\n", kFBDevice); + if (fb_dev < 0) { + fprintf(stderr, "FAIL: failed to open \"%s\" (errno = %d)\n", kFBDevice, errno); + return; + } + + struct fb_var_screeninfo current_mode; + + res = ioctl(fb_dev, FBIOGET_VSCREENINFO, ¤t_mode); + if (res) { + fprintf(stderr, "FAIL: unable to get mode, err %d\n", res); + return; + } + + res = ioctl(fb_dev, FBIOBLANK, FB_BLANK_POWERDOWN); + if (res) { + fprintf(stderr, "FAIL: unable to blank display, err %d\n", res); + return; + } + + current_mode.bits_per_pixel = 32; + current_mode.red.offset = 0; + current_mode.red.length = 8; + current_mode.green.offset = 8; + current_mode.green.length = 8; + current_mode.blue.offset = 16; + current_mode.blue.length = 8; + + res = ioctl(fb_dev, FBIOPUT_VSCREENINFO, ¤t_mode); + if (res) { + fprintf(stderr, "FAIL: unable to set mode, err %d\n", res); + return; + } + + /* set our display controller for RGBX */ + res = ioctl(fb_dev, FBIO_PSB_SET_RGBX, ¤t_mode); + if (res) { + fprintf(stderr, + "FAIL: unable to set RGBX mode on display controller (errno = %d)\n", + errno); + return; + } + + res = ioctl(fb_dev, FBIOBLANK, FB_BLANK_UNBLANK); + if (res) { + fprintf(stderr, "FAIL: unable to unblank display, err %d\n", res); + return; + } + } + void SetBackground(Icon icon) { ScreenRecoveryUI::SetBackground(icon); |