summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorTom Wai-Hong Tam <waihong@chromium.org>2011-06-29 11:10:17 +0800
committerSimon Glass <sjg@chromium.org>2011-08-29 10:39:40 -0700
commit44d0efbe49f694560a25a6a008190a880507b21a (patch)
tree4499b0e807102d56ce140943de92209049d8b068 /lib
parentfd2bb1babd1938f4713bc5dd5a9f2ea72de08832 (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.c57
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;
}