blob: 71c36e4869c8389592d85744ce80f6148888acce [file] [edit]
/*
* Commands for testing graphics drawing
*
* Copyright (C) 2015 Chromium OS Authors
*/
#include <libpayload.h>
#include <cbfs.h>
#include <coreboot_tables.h>
#include <vboot/screens.h>
#include "common.h"
#include "drivers/video/display.h"
#include "drivers/video/coreboot_fb.h"
static int initialized = 0;
static int init_display(void)
{
if (initialized)
return 0;
if (display_init())
return -1;
if (backlight_update(1))
return -1;
/* initialize video console */
video_init();
video_console_clear();
video_console_cursor_enable(0);
initialized = 1;
return 0;
}
static int do_draw_image(int argc, char * const argv[])
{
const struct scale *dim_rel = NULL;
const void *bitmap;
size_t size;
int rv;
bitmap = cbfs_get_file_content(CBFS_DEFAULT_MEDIA, argv[2],
CBFS_TYPE_RAW, &size);
if (!bitmap) {
printf("File '%s' not found\n", argv[2]);
return -1;
}
const struct scale pos_rel = {
.x = { .n = strtoul(argv[3], NULL, 0), .d = 100, },
.y = { .n = strtoul(argv[4], NULL, 0), .d = 100, },
};
if (argc == 7) {
const struct scale s = {
.x = { .n = strtoul(argv[5], NULL, 0), .d = 100, },
.y = { .n = strtoul(argv[6], NULL, 0), .d = 100, },
};
dim_rel = &s;
}
rv = draw_bitmap(bitmap, size, &pos_rel,
PIVOT_H_LEFT|PIVOT_V_TOP, dim_rel);
if (rv)
printf("draw_bitmap returned error: %d\n", rv);
return rv;
}
static int do_print_info(void)
{
struct cb_framebuffer *fbinfo = lib_sysinfo.framebuffer;
if (!fbinfo) {
printf("Invalid address for framebuffer info\n");
return -1;
}
unsigned char *fbaddr =
(unsigned char *)(uintptr_t)(fbinfo->physical_address);
printf("physical_address=0x%p\n", fbaddr);
printf("x_resolution=%d\n", fbinfo->x_resolution);
printf("y_resolution=%d\n", fbinfo->y_resolution);
printf("bytes_per_line=%d\n", fbinfo->bytes_per_line);
printf("bits_per_pixel=%d\n", fbinfo->bits_per_pixel);
printf("red_mask_pos=%d\n", fbinfo->red_mask_pos);
printf("red_mask_size=%d\n", fbinfo->red_mask_size);
printf("green_mask_pos=%d\n", fbinfo->green_mask_pos);
printf("green_mask_size=%d\n", fbinfo->green_mask_size);
printf("blue_mask_pos=%d\n", fbinfo->blue_mask_pos);
printf("blue_mask_size=%d\n", fbinfo->blue_mask_size);
return 0;
}
static int do_draw_box(char * const argv[])
{
const struct rect box = {
.offset = {
.x = strtoul(argv[2], NULL, 0),
.y = strtoul(argv[3], NULL, 0),
},
.size = {
.width = strtoul(argv[4], NULL, 0),
.height = strtoul(argv[5], NULL, 0),
},
};
const struct rgb_color rgb = {
.red = strtoul(argv[6], NULL, 0),
.green = strtoul(argv[7], NULL, 0),
.blue = strtoul(argv[8], NULL, 0),
};
return draw_box(&box, &rgb);
}
static int do_draw_screen(int argc, char * const argv[])
{
uint32_t locale = 0;
if (argc == 4)
locale = strtoul(argv[3], NULL, 0);
return vboot_draw_screen(strtoul(argv[2], NULL, 0), locale);
}
static int do_draw(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
int rv = CMD_RET_SUCCESS;
if (init_display()) {
printf("Failed to initialize display\n");
return CMD_RET_FAILURE;
}
if ((argc == 3 || argc == 7) && !strcmp("image", argv[1])) {
if (do_draw_image(argc, argv))
rv = CMD_RET_FAILURE;
} else if (argc == 2 && !strcmp("info", argv[1])) {
if (do_print_info())
rv = CMD_RET_FAILURE;
} else if (argc == 9 && !strcmp("box", argv[1])) {
if (do_draw_box(argv))
rv = CMD_RET_FAILURE;
} else if ((argc == 3 || argc == 4) && !strcmp("screen", argv[1])) {
if (do_draw_screen(argc, argv))
rv = CMD_RET_FAILURE;
} else {
printf("Syntax error\n");
rv = CMD_RET_USAGE;
}
return rv;
}
U_BOOT_CMD(
draw, 7, 1,
"draw image on screen, print screen info, etc.",
"image <name> <x> <y> [<width> <height>] - draw image in cbfs at (x, y)\n"
"info - print framebuffer information\n"
"box <x> <y> <width> <height> <red> <green> <blue> - draw a box\n"
"screen <id> [<locale>] - draw a preprogrammed screen of ID <id>"
);