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 /lib | |
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 'lib')
-rw-r--r-- | lib/vbexport/display.c | 57 |
1 files changed, 56 insertions, 1 deletions
diff --git a/lib/vbexport/display.c b/lib/vbexport/display.c index b1c7b3a6a17..4a300882753 100644 --- a/lib/vbexport/display.c +++ b/lib/vbexport/display.c @@ -10,12 +10,19 @@ #include <common.h> #include <fdt_decode.h> +#include <lcd.h> +#include <lzma/LzmaTypes.h> +#include <lzma/LzmaDec.h> +#include <lzma/LzmaTools.h> /* Import the header files from vboot_reference */ #include <vboot_api.h> DECLARE_GLOBAL_DATA_PTR; +/* Defined in common/lcd.c */ +extern int lcd_display_bitmap (ulong, int, int); + VbError_t VbExDisplayInit(uint32_t *width, uint32_t *height) { struct fdt_lcd config; @@ -92,10 +99,58 @@ VbError_t VbExDisplayScreen(uint32_t screen_type) return VBERROR_SUCCESS; } +static uint8_t *uncompress_lzma(uint8_t *in_addr, SizeT in_size, + SizeT out_size) +{ + uint8_t *out_addr = VbExMalloc(out_size); + SizeT lzma_len = out_size; + int ret; + + ret = lzmaBuffToBuffDecompress(out_addr, &lzma_len, in_addr, in_size); + if (ret != SZ_OK) { + VbExFree(out_addr); + out_addr = NULL; + } + return out_addr; +} + VbError_t VbExDisplayImage(uint32_t x, uint32_t y, const ImageInfo *info, const void *buffer) { - /* TODO(waihong@chromium.org) Implement it later. */ + int ret; + uint8_t *raw_data; + + switch (info->compression) { + case COMPRESS_NONE: + raw_data = (uint8_t *)buffer; + break; + + case COMPRESS_LZMA1: + raw_data = uncompress_lzma((uint8_t *)buffer, + (SizeT)info->compressed_size, + (SizeT)info->original_size); + if (!raw_data) { + VbExDebug("LZMA decompress failed.\n"); + return 1; + } + break; + + default: + VbExDebug("Unsupported compression format: %lu\n", + info->compression); + return 1; + } + + ret = lcd_display_bitmap((ulong)raw_data, x, y); + + if (info->compression == COMPRESS_LZMA1) + VbExFree(raw_data); + + if (ret) { + VbExDebug("LCD display error.\n"); + return 1; + } + return VBERROR_SUCCESS; } |