diff options
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 e2a170c8d2..449871a7db 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; } |