summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorVadim Bendebury <vbendeb@chromium.org>2011-07-27 16:38:15 -0700
committerSimon Glass <sjg@chromium.org>2011-08-29 10:59:17 -0700
commitfd00e682c0ccd38ced77a91af4442d38d8cb2e09 (patch)
tree514d5a09acccd0be6a4389dec35f38280b6b4f3b /lib
parent1eb652f3abce5058406161829af3ba0260f10443 (diff)
Implement shared display support.
This change fills up the stubs in lib/vbexport/display.c to provide support on both ARM (where LCD driver is used) and X86 (where the CFB driver is used) platforms. BUG=chrome-os-partner:4552 TEST=manual On X86 (alex with a Dediprog programmer connected to it), run the following commands: . emerge-x86-alex vboot_reference-firmware chromeos-u-boot chromeos-coreboot dd if=/build/x86-alex/coreboot/coreboot.rom of=/tmp/coreboot seek=3584 bs=1K sudo flashrom -p dediprog -w /tmp/coreboot . Reboot the machine, observe it come up to boot> prompt, start ChromeOS (using the `boot' cli command). On ARM (tegra2_kaen) . emerge-tegra2_kaen vboot_reference-firmware chromeos-u-boot chromeos-bootimage . program the resulting image into Kaen, restart it, observe the machine come up. . install the new OS image on the machine, restart it, observe the machine come up. . request recovery reboot using crossystem, restart the machine, observe it come up in recovery request mode. This test case actually failed: the system did show the recovery request screen, but then proceeded to boot from the plugged in USB stick (it was supposed to wait for the stick to be removed/reinserted) Change-Id: I75310de3f93464645cc9e61237f65d7d19b71873 Signed-off-by: Vadim Bendebury <vbendeb@chromium.org> Reviewed-on: http://gerrit.chromium.org/gerrit/4886 Reviewed-by: Stefan Reinauer <reinauer@google.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/vbexport/display.c134
1 files changed, 64 insertions, 70 deletions
diff --git a/lib/vbexport/display.c b/lib/vbexport/display.c
index 4f72cedf82..cdf8862783 100644
--- a/lib/vbexport/display.c
+++ b/lib/vbexport/display.c
@@ -9,42 +9,59 @@
*/
#include <common.h>
-#include <fdt_decode.h>
+#ifdef CONFIG_LCD
#include <lcd.h>
+#endif
+#ifdef CONFIG_CFB_CONSOLE
+#include <video.h>
+#endif
#include <chromeos/common.h>
#include <lzma/LzmaTypes.h>
#include <lzma/LzmaDec.h>
#include <lzma/LzmaTools.h>
-/* Import the header files from vboot_reference */
-#include <vboot_api.h>
-
#define PRINT_MAX_ROW 20
#define PRINT_MAX_COL 80
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)
-{
-#ifdef CONFIG_OF_CONTROL
- struct fdt_lcd config;
-
- /* Get LCD details from FDT */
- if (fdt_decode_lcd(gd->blob, &config)) {
- VBDEBUG("No LCD information in device tree.\n");
- return 1;
- }
+struct display_callbacks {
+ int (*dc_get_pixel_width) (void);
+ int (*dc_get_pixel_height) (void);
+ int (*dc_get_screen_columns) (void);
+ int (*dc_get_screen_rows) (void);
+ void (*dc_position_cursor) (unsigned col, unsigned row);
+ void (*dc_puts) (const char *s);
+ int (*dc_display_bitmap) (ulong, int, int);
+ int (*dc_display_clear) (void);
+};
+
+static struct display_callbacks display_callbacks_ = {
+#ifdef CONFIG_LCD
+ .dc_get_pixel_width = lcd_get_pixel_width,
+ .dc_get_pixel_height = lcd_get_pixel_height,
+ .dc_get_screen_columns = lcd_get_screen_columns,
+ .dc_get_screen_rows = lcd_get_screen_rows,
+ .dc_position_cursor = lcd_position_cursor,
+ .dc_puts = lcd_puts,
+ .dc_display_bitmap = lcd_display_bitmap,
+ .dc_display_clear = lcd_clear,
- *width = config.width;
- *height = config.height;
#else
- *width = CONFIG_LCD_vl_col;
- *height = CONFIG_LCD_vl_row;
+ .dc_get_pixel_width = video_get_pixel_width,
+ .dc_get_pixel_height = video_get_pixel_height,
+ .dc_get_screen_columns = video_get_screen_columns,
+ .dc_get_screen_rows = video_get_screen_rows,
+ .dc_position_cursor = video_position_cursor,
+ .dc_puts = video_puts,
+ .dc_display_bitmap = video_display_bitmap,
#endif
+};
+VbError_t VbExDisplayInit(uint32_t *width, uint32_t *height)
+{
+ *width = display_callbacks_.dc_get_pixel_width();
+ *height = display_callbacks_.dc_get_pixel_height();
return VBERROR_SUCCESS;
}
@@ -54,50 +71,37 @@ VbError_t VbExDisplayBacklight(uint8_t enable)
return VBERROR_SUCCESS;
}
-#ifdef CONFIG_LCD
/* Print the message on the center of LCD. */
static void print_on_center(const char *message)
{
- char result[PRINT_MAX_ROW * (PRINT_MAX_COL + 1) + 1] = "\0";
- int i, j, left_space, right_space;
+ int i, room_before_text;
+ int screen_size = display_callbacks_.dc_get_screen_columns() *
+ display_callbacks_.dc_get_screen_rows();
+ int text_length = strlen(message);
- for (i = 0; i < PRINT_MAX_ROW / 2 - 1; i++) {
- for (j = 0; j < PRINT_MAX_COL; j++)
- strcat(result, ".");
- strcat(result, "\n");
- }
+ room_before_text = (screen_size - text_length) / 2;
- left_space = (PRINT_MAX_COL - strlen(message)) / 2;
- for (i = 0; i < left_space; i++)
- strcat(result, ".");
- strcat(result, message);
+ display_callbacks_.dc_position_cursor(0, 0);
- right_space = PRINT_MAX_COL - strlen(message) - left_space;
- for (i = 0; i < right_space; i++)
- strcat(result, ".");
- strcat(result, "\n");
+ for (i = 0; i < room_before_text; i++)
+ display_callbacks_.dc_puts(".");
- for (i = 0; i < PRINT_MAX_ROW - PRINT_MAX_ROW / 2; i++) {
- for (j = 0; j < PRINT_MAX_COL; j++)
- strcat(result, ".");
- strcat(result, "\n");
- }
+ display_callbacks_.dc_puts(message);
- VbExDisplayDebugInfo(result);
+ for (i = i + text_length; i < screen_size; i++)
+ display_callbacks_.dc_puts(".");
}
-#endif
VbError_t VbExDisplayScreen(uint32_t screen_type)
{
-#ifdef CONFIG_LCD
/*
* Show the debug messages for development. It is a backup method
* when GBB does not contain a full set of bitmaps.
*/
switch (screen_type) {
case VB_SCREEN_BLANK:
- /* clear the lcd screen */
- lcd_clear();
+ /* clear the screen */
+ display_clear();
break;
case VB_SCREEN_DEVELOPER_WARNING:
print_on_center("developer mode warning");
@@ -120,13 +124,8 @@ VbError_t VbExDisplayScreen(uint32_t screen_type)
return 1;
}
return VBERROR_SUCCESS;
-#else
- printf("VbExDisplayScreen needs lcd support which isn't configured.\n");
- return 1;
-#endif
}
-#ifdef CONFIG_LCD
static uint8_t *uncompress_lzma(uint8_t *in_addr, SizeT in_size,
SizeT out_size)
{
@@ -141,12 +140,10 @@ static uint8_t *uncompress_lzma(uint8_t *in_addr, SizeT in_size,
}
return out_addr;
}
-#endif
VbError_t VbExDisplayImage(uint32_t x, uint32_t y, const ImageInfo *info,
const void *buffer)
{
-#ifdef CONFIG_LCD
int ret;
uint8_t *raw_data;
@@ -171,7 +168,7 @@ VbError_t VbExDisplayImage(uint32_t x, uint32_t y, const ImageInfo *info,
return 1;
}
- ret = lcd_display_bitmap((ulong)raw_data, x, y);
+ ret = display_callbacks_.dc_display_bitmap((ulong)raw_data, x, y);
if (info->compression == COMPRESS_LZMA1)
VbExFree(raw_data);
@@ -182,24 +179,21 @@ VbError_t VbExDisplayImage(uint32_t x, uint32_t y, const ImageInfo *info,
}
return VBERROR_SUCCESS;
-#else
- printf("VbExDisplayImage needs lcd support which isn't configured.\n");
- return 1;
-#endif
}
VbError_t VbExDisplayDebugInfo(const char *info_str)
{
-#ifdef CONFIG_LCD
- /* Show the debug message on the upper left corner */
- console_col = 0;
- console_row = 0;
- lcd_puts(info_str);
-
+ display_callbacks_.dc_position_cursor(0, 0);
+ display_callbacks_.dc_puts(info_str);
return VBERROR_SUCCESS;
-#else
- printf("VbExDisplayDebugInfo needs lcd support which isn't "
- "configured.\n");
- return 1;
-#endif
+}
+
+/* this function is not technically part of the vboot interface */
+int display_clear(void)
+{
+ if (display_callbacks_.dc_display_clear)
+ return display_callbacks_.dc_display_clear();
+
+ printf ("%s: not implemented!\n", __FUNCTION__);
+ return -1;
}