diff options
author | Tom Wai-Hong Tam <waihong@chromium.org> | 2011-06-29 11:10:17 +0800 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2011-08-29 10:39:40 -0700 |
commit | 44d0efbe49f694560a25a6a008190a880507b21a (patch) | |
tree | 4499b0e807102d56ce140943de92209049d8b068 /common/cmd_vbexport_test.c | |
parent | fd2bb1babd1938f4713bc5dd5a9f2ea72de08832 (diff) |
CHROMIUM: Implement VbExDisplayImage function to show an image on LCD.
An unit test is implemented to show all the screens on GBB.
BUG=chromium-os:16543
TEST=Build chromeos_seaboard_vboot and put it on seaboard and run:
Tegra2 # vbexport_test display
The screen dimensions is 1366x768.
Showing screens...
...
SF: Detected W25Q16 with page size 256, total 2 MiB
firmware_storage: read
Showing images...
/* Several screens show on LCD */
Change-Id: Ica05ed58a536b376359eef7e63757c1431d04061
Reviewed-on: http://gerrit.chromium.org/gerrit/3363
Reviewed-by: Tom Wai-Hong Tam <waihong@chromium.org>
Tested-by: Tom Wai-Hong Tam <waihong@chromium.org>
Diffstat (limited to 'common/cmd_vbexport_test.c')
-rw-r--r-- | common/cmd_vbexport_test.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/common/cmd_vbexport_test.c b/common/cmd_vbexport_test.c index e2a170c8d2d..449871a7dbd 100644 --- a/common/cmd_vbexport_test.c +++ b/common/cmd_vbexport_test.c @@ -16,6 +16,8 @@ #include <common.h> #include <command.h> +#include <gbb_header.h> +#include <vboot/firmware_storage.h> #include <vboot_api.h> #define TEST_LBA_START 0 @@ -330,15 +332,68 @@ static int show_screen_and_delay(uint32_t screen_type) VbExDebug("Failed to show a screen.\n"); return 1; } + VbExSleepMs(500); return 0; } +static uint8_t *read_gbb_from_firmware(void) +{ + firmware_storage_t file; + uint8_t *gbb_buf; + + /* Open firmware storage device. */ + if (firmware_storage_open_spi(&file)) { + VbExDebug("Failed to open firmware device!\n"); + return NULL; + } + + gbb_buf = VbExMalloc(CONFIG_LENGTH_GBB); + if (firmware_storage_read(&file, CONFIG_OFFSET_GBB, CONFIG_LENGTH_GBB, + gbb_buf)) { + VbExDebug("Failed to read firmware!\n"); + VbExFree(gbb_buf); + gbb_buf = NULL; + } + + return gbb_buf; +} + +static int show_images_and_delay(BmpBlockHeader *bmph, int index) +{ + int i; + ScreenLayout *screen; + ImageInfo *info; + + screen = (ScreenLayout *)(bmph + 1); + screen += index; + + for (i = 0; + i < MAX_IMAGE_IN_LAYOUT && screen->images[i].image_info_offset; + i++) { + info = (ImageInfo *)((uint8_t *)bmph + + screen->images[i].image_info_offset); + if (VbExDisplayImage(screen->images[i].x, + screen->images[i].y, + info, + info + 1)) { + VbExDebug("Failed to display image, screen=%lu, " + "image=%d!\n", index, i); + return 1; + } + } + + VbExSleepMs(1000); + return 0; +} + static int do_vbexport_test_display( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { int ret = 0; uint32_t width, height; + GoogleBinaryBlockHeader *gbbh; + BmpBlockHeader *bmph; if (VbExDisplayInit(&width, &height)) { VbExDebug("Failed to init display.\n"); @@ -355,6 +410,20 @@ static int do_vbexport_test_display( ret |= show_screen_and_delay(VB_SCREEN_RECOVERY_INSERT); ret |= show_screen_and_delay(VB_SCREEN_RECOVERY_NO_GOOD); + gbbh = (GoogleBinaryBlockHeader *)read_gbb_from_firmware(); + if (gbbh) { + bmph = (BmpBlockHeader *)((uint8_t *)gbbh + gbbh->bmpfv_offset); + + VbExDebug("Showing images...\n"); + ret |= show_images_and_delay(bmph, SCREEN_DEVELOPER_MODE); + ret |= show_images_and_delay(bmph, SCREEN_RECOVERY_MODE); + ret |= show_images_and_delay(bmph, SCREEN_RECOVERY_NO_OS); + ret |= show_images_and_delay(bmph, SCREEN_RECOVERY_MISSING_OS); + } else { + ret = 1; + } + + VbExFree(gbbh); return ret; } |