summaryrefslogtreecommitdiff
path: root/recovery
diff options
context:
space:
mode:
authorDale Stimson <dale.b.stimson@intel.com>2014-09-19 09:26:19 -0700
committerPat Tjin <pattjin@google.com>2014-09-20 03:32:42 +0000
commit49c0d752dccf96e95c4766c15765ab3fd35778f9 (patch)
treef711df6b7d48e7d556efb57e48487b60f75c9e02 /recovery
parenta2249402aebf69198187eed52278889be35ca380 (diff)
downloadfugu-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.cpp60
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, &current_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, &current_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, &current_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);