- various fixes to the sandbox display support

- support for showing a logo without splash screen config
 - support for BMP drawing to depths other than 16bpp
 - tests for the different types of supported BMP images
 - support showing a logo when running coreboot via qemu
 -----BEGIN PGP SIGNATURE-----
 
 iGwEABECACwWIQSC4hxrSoIUVfFO0kRM6ATMmsalXAUCYcsdCQ4cYWd1c3RAZGVu
 eC5kZQAKCRBM6ATMmsalXCLhAJ9pLJE3SpQRzpm+Nu4EMbCDzZKr+wCfbxnAZ9LC
 zS1XZ6u9Se4ysDb+PYs=
 =Hf5j
 -----END PGP SIGNATURE-----

Merge tag 'video-next-20211228' of https://source.denx.de/u-boot/custodians/u-boot-video into next

- various fixes to the sandbox display support
- support for showing a logo without splash screen config
- support for BMP drawing to depths other than 16bpp
- tests for the different types of supported BMP images
- support showing a logo when running coreboot via qemu
This commit is contained in:
Tom Rini 2021-12-28 11:28:31 -05:00
commit 87a9aa604d
106 changed files with 687 additions and 547 deletions

1
.gitattributes vendored
View file

@ -3,3 +3,4 @@
# Denote all files that are truly binary and should not be modified
*.bmp binary
*.ttf binary
*.gz binary

1
README
View file

@ -1017,7 +1017,6 @@ The following options need to be configured:
CONFIG_CFB_CONSOLE
CONFIG_VIDEO_SW_CURSOR
CONFIG_VGA_AS_SINGLE_DEVICE
CONFIG_VIDEO_LOGO
CONFIG_VIDEO_BMP_LOGO
The DIU driver will look for the 'video-mode' environment

View file

@ -44,6 +44,9 @@ struct buf_info {
* @stopping: true if audio will stop once it runs out of data
* @texture: SDL texture to use for U-Boot display contents
* @renderer: SDL renderer to use
* @screen: SDL window to use
* @src_depth: Number of bits per pixel in the source frame buffer (that we read
* from and render to SDL)
*/
static struct sdl_info {
int width;
@ -61,6 +64,8 @@ static struct sdl_info {
bool stopping;
SDL_Texture *texture;
SDL_Renderer *renderer;
SDL_Window *screen;
int src_depth;
} sdl;
static void sandbox_sdl_poll_events(void)
@ -98,6 +103,23 @@ static int sandbox_sdl_ensure_init(void)
return 0;
}
int sandbox_sdl_remove_display(void)
{
if (!sdl.renderer) {
printf("SDL renderer does not exist\n");
return -ENOENT;
}
SDL_DestroyTexture(sdl.texture);
SDL_DestroyRenderer(sdl.renderer);
SDL_DestroyWindow(sdl.screen);
sdl.texture = NULL;
sdl.renderer = NULL;
sdl.screen = NULL;
return 0;
}
int sandbox_sdl_init_display(int width, int height, int log2_bpp,
bool double_size)
{
@ -109,6 +131,9 @@ int sandbox_sdl_init_display(int width, int height, int log2_bpp,
err = sandbox_sdl_ensure_init();
if (err)
return err;
if (sdl.renderer)
sandbox_sdl_remove_display();
if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) {
printf("Unable to initialise SDL LCD: %s\n", SDL_GetError());
return -EPERM;
@ -126,22 +151,20 @@ int sandbox_sdl_init_display(int width, int height, int log2_bpp,
if (!SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "1"))
printf("Unable to init hinting: %s", SDL_GetError());
sdl.src_depth = 1 << log2_bpp;
if (log2_bpp != 4 && log2_bpp != 5)
log2_bpp = 5;
sdl.depth = 1 << log2_bpp;
sdl.pitch = sdl.width * sdl.depth / 8;
SDL_Window *screen = SDL_CreateWindow("U-Boot", SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
sdl.vis_width, sdl.vis_height,
SDL_WINDOW_RESIZABLE);
if (!screen) {
sdl.screen = SDL_CreateWindow("U-Boot", SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED, sdl.vis_width,
sdl.vis_height, SDL_WINDOW_RESIZABLE);
if (!sdl.screen) {
printf("Unable to initialise SDL screen: %s\n",
SDL_GetError());
return -EIO;
}
if (log2_bpp != 4 && log2_bpp != 5) {
printf("U-Boot SDL does not support depth %d\n", log2_bpp);
return -EINVAL;
}
sdl.renderer = SDL_CreateRenderer(screen, -1,
sdl.renderer = SDL_CreateRenderer(sdl.screen, -1,
SDL_RENDERER_ACCELERATED |
SDL_RENDERER_PRESENTVSYNC);
if (!sdl.renderer) {
@ -165,6 +188,55 @@ int sandbox_sdl_init_display(int width, int height, int log2_bpp,
return 0;
}
static int copy_to_texture(void *lcd_base)
{
char *dest;
int pitch, x, y;
int src_pitch;
void *pixels;
char *src;
int ret;
if (sdl.src_depth == sdl.depth) {
SDL_UpdateTexture(sdl.texture, NULL, lcd_base, sdl.pitch);
return 0;
}
/*
* We only support copying from an 8bpp to a 32bpp texture since the
* other cases are supported directly by the texture.
*/
if (sdl.depth != 32 && sdl.src_depth != 8) {
printf("Need depth 32bpp for copy\n");
return -EINVAL;
}
ret = SDL_LockTexture(sdl.texture, NULL, &pixels, &pitch);
if (ret) {
printf("SDL lock %d: %s\n", ret, SDL_GetError());
return ret;
}
/* Copy the pixels one by one */
src_pitch = sdl.width * sdl.src_depth / 8;
for (y = 0; y < sdl.height; y++) {
char val;
dest = pixels + y * pitch;
src = lcd_base + src_pitch * y;
for (x = 0; x < sdl.width; x++, dest += 4) {
val = *src++;
dest[0] = val;
dest[1] = val;
dest[2] = val;
dest[3] = 0;
}
}
SDL_UnlockTexture(sdl.texture);
return 0;
}
int sandbox_sdl_sync(void *lcd_base)
{
struct SDL_Rect rect;
@ -173,7 +245,11 @@ int sandbox_sdl_sync(void *lcd_base)
if (!sdl.texture)
return 0;
SDL_RenderClear(sdl.renderer);
SDL_UpdateTexture(sdl.texture, NULL, lcd_base, sdl.pitch);
ret = copy_to_texture(lcd_base);
if (ret) {
printf("copy_to_texture: %d: %s\n", ret, SDL_GetError());
return -EIO;
}
ret = SDL_RenderCopy(sdl.renderer, sdl.texture, NULL, NULL);
if (ret) {
printf("SDL copy %d: %s\n", ret, SDL_GetError());

View file

@ -25,6 +25,13 @@
int sandbox_sdl_init_display(int width, int height, int log2_bpp,
bool double_size);
/**
* sandbox_sdl_remove_display() - Remove the SDL screen
*
* @return 0 if OK, -ENOENT if the SDL had not been inited.
*/
int sandbox_sdl_remove_display(void);
/**
* sandbox_sdl_sync() - Sync current U-Boot LCD frame buffer to SDL
*

View file

@ -8,6 +8,8 @@
#ifndef __ASM_TEST_H
#define __ASM_TEST_H
#include <video.h>
/* The sandbox driver always permits an I2C device with this address */
#define SANDBOX_I2C_TEST_ADDR 0x59
@ -285,4 +287,20 @@ void sandbox_cros_ec_set_test_flags(struct udevice *dev, uint flags);
*/
int sandbox_cros_ec_get_pwm_duty(struct udevice *dev, uint index, uint *duty);
/**
* sandbox_sdl_set_bpp() - Set the depth of the sandbox display
*
* The device must not be active when this function is called. It activiates it
* before returning.
*
* This updates the depth value and adjusts a few other settings accordingly.
* It must be called before the display is probed.
*
* @dev: Device to adjust
* @l2bpp: depth to set
* @return 0 if the device was already active, other error if it fails to probe
* after the change
*/
int sandbox_sdl_set_bpp(struct udevice *dev, enum video_log2_bpp l2bpp);
#endif

View file

@ -4,10 +4,11 @@
*/
#include <common.h>
#include <asm/cb_sysinfo.h>
#include <asm/global_data.h>
#include <splash.h>
#include <init.h>
#include <smbios.h>
#include <asm/cb_sysinfo.h>
#include <asm/global_data.h>
int board_early_init_r(void)
{
@ -65,3 +66,18 @@ fallback:
return checkboard();
}
#endif
static struct splash_location coreboot_splash_locations[] = {
{
.name = "virtio_fs",
.storage = SPLASH_STORAGE_VIRTIO,
.flags = SPLASH_STORAGE_RAW,
.devpart = "0",
},
};
int splash_screen_prepare(void)
{
return splash_source_load(coreboot_splash_locations,
ARRAY_SIZE(coreboot_splash_locations));
}

View file

@ -8,6 +8,7 @@
#include <command.h>
#include <env.h>
#include <gzip.h>
#include <mapmem.h>
#include <part.h>
static int do_unzip(struct cmd_tbl *cmdtp, int flag, int argc,
@ -28,7 +29,8 @@ static int do_unzip(struct cmd_tbl *cmdtp, int flag, int argc,
return CMD_RET_USAGE;
}
if (gunzip((void *) dst, dst_len, (void *) src, &src_len) != 0)
if (gunzip(map_sysmem(dst, dst_len), dst_len, map_sysmem(src, 0),
&src_len) != 0)
return 1;
printf("Uncompressed size: %lu = 0x%lX\n", src_len, src_len);

View file

@ -348,6 +348,7 @@ static void console_puts_select(int file, bool serial_only, const char *s)
void console_puts_select_stderr(bool serial_only, const char *s)
{
if (gd->flags & GD_FLG_DEVINIT)
console_puts_select(stderr, serial_only, s);
}
@ -401,7 +402,8 @@ static inline void console_putc(int file, const char c)
void console_puts_select(int file, bool serial_only, const char *s)
{
if (serial_only == console_dev_is_serial(stdio_devices[file]))
if ((gd->flags & GD_FLG_DEVINIT) &&
serial_only == console_dev_is_serial(stdio_devices[file]))
stdio_devices[file]->puts(stdio_devices[file], s);
}

View file

@ -52,7 +52,7 @@ static struct splash_location default_splash_locations[] = {
},
};
#if defined(CONFIG_DM_VIDEO) && defined(CONFIG_VIDEO_LOGO)
#ifdef CONFIG_VIDEO_LOGO
#include <bmp_logo_data.h>

View file

@ -20,6 +20,7 @@
#include <spi_flash.h>
#include <splash.h>
#include <usb.h>
#include <virtio.h>
#include <asm/global_data.h>
DECLARE_GLOBAL_DATA_PTR;
@ -179,6 +180,16 @@ static inline int splash_init_sata(void)
}
#endif
static int splash_init_virtio(void)
{
if (!IS_ENABLED(CONFIG_VIRTIO)) {
printf("Cannot load splash image: no virtio support\n");
return -ENOSYS;
} else {
return virtio_init();
}
}
#ifdef CONFIG_CMD_UBIFS
static int splash_mount_ubifs(struct splash_location *location)
{
@ -233,6 +244,9 @@ static int splash_load_fs(struct splash_location *location, u32 bmp_load_addr)
if (location->storage == SPLASH_STORAGE_SATA)
res = splash_init_sata();
if (location->storage == SPLASH_STORAGE_VIRTIO)
res = splash_init_virtio();
if (location->ubivol != NULL)
res = splash_mount_ubifs(location);

View file

@ -106,6 +106,7 @@ CONFIG_USB_GADGET_PRODUCT_NUM=0x4000
CONFIG_CI_UDC=y
CONFIG_USB_GADGET_DOWNLOAD=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
# CONFIG_VIDEO_BPP8 is not set
# CONFIG_VIDEO_BPP32 is not set
CONFIG_SYS_WHITE_ON_BLACK=y

View file

@ -109,6 +109,7 @@ CONFIG_SYSRESET_WATCHDOG=y
CONFIG_USB=y
CONFIG_USB_STORAGE=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
CONFIG_SYS_WHITE_ON_BLACK=y
CONFIG_DISPLAY=y
CONFIG_VIDEO_IPUV3=y

View file

@ -109,6 +109,7 @@ CONFIG_SYSRESET_WATCHDOG=y
CONFIG_USB=y
CONFIG_USB_STORAGE=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
CONFIG_SYS_WHITE_ON_BLACK=y
CONFIG_DISPLAY=y
CONFIG_VIDEO_IPUV3=y

View file

@ -106,6 +106,7 @@ CONFIG_USB=y
CONFIG_USB_KEYBOARD=y
CONFIG_SYS_USB_EVENT_POLL_VIA_INT_QUEUE=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
CONFIG_VIDEO_IPUV3=y
CONFIG_SPLASH_SCREEN=y
CONFIG_SPLASH_SOURCE=y

View file

@ -79,6 +79,7 @@ CONFIG_USB_GADGET_PRODUCT_NUM=0x4000
CONFIG_CI_UDC=y
CONFIG_USB_GADGET_DOWNLOAD=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
CONFIG_SYS_WHITE_ON_BLACK=y
CONFIG_SPLASH_SCREEN=y
CONFIG_SPLASH_SCREEN_ALIGN=y

View file

@ -95,6 +95,7 @@ CONFIG_USB_GADGET_PRODUCT_NUM=0x4000
CONFIG_CI_UDC=y
CONFIG_USB_GADGET_DOWNLOAD=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
CONFIG_SYS_WHITE_ON_BLACK=y
CONFIG_VIDEO_MXS=y
CONFIG_SPLASH_SCREEN=y

View file

@ -104,6 +104,7 @@ CONFIG_USB_GADGET_PRODUCT_NUM=0x4000
CONFIG_CI_UDC=y
CONFIG_USB_GADGET_DOWNLOAD=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
# CONFIG_VIDEO_BPP8 is not set
# CONFIG_VIDEO_BPP32 is not set
CONFIG_SYS_WHITE_ON_BLACK=y

View file

@ -91,6 +91,7 @@ CONFIG_USB_GADGET_PRODUCT_NUM=0x4000
CONFIG_CI_UDC=y
CONFIG_USB_GADGET_DOWNLOAD=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
CONFIG_SYS_WHITE_ON_BLACK=y
CONFIG_VIDEO_MXS=y
CONFIG_SPLASH_SCREEN=y

View file

@ -84,6 +84,7 @@ CONFIG_USB_GADGET_VENDOR_NUM=0x1b67
CONFIG_USB_GADGET_PRODUCT_NUM=0x4000
CONFIG_CI_UDC=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
CONFIG_SYS_WHITE_ON_BLACK=y
CONFIG_SPLASH_SCREEN=y
CONFIG_SPLASH_SCREEN_ALIGN=y

View file

@ -99,6 +99,7 @@ CONFIG_USB_GADGET_PRODUCT_NUM=0x4000
CONFIG_CI_UDC=y
CONFIG_USB_GADGET_DOWNLOAD=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
# CONFIG_VIDEO_BPP8 is not set
# CONFIG_VIDEO_BPP16 is not set
CONFIG_VIDEO_FSL_DCU_FB=y

View file

@ -51,5 +51,6 @@ CONFIG_ATMEL_PIT_TIMER=y
CONFIG_USB=y
CONFIG_USB_EHCI_HCD=y
CONFIG_DM_VIDEO=y
# CONFIG_VIDEO_LOGO is not set
# CONFIG_VIDEO_BPP32 is not set
CONFIG_CMD_DHRYSTONE=y

View file

@ -140,6 +140,7 @@ CONFIG_USB_GADGET_DOWNLOAD=y
CONFIG_USB_ETHER=y
CONFIG_USB_ETH_CDC=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
# CONFIG_BACKLIGHT is not set
# CONFIG_CMD_VIDCONSOLE is not set
# CONFIG_VIDEO_BPP8 is not set

View file

@ -144,6 +144,7 @@ CONFIG_USB_GADGET_DOWNLOAD=y
CONFIG_USB_ETHER=y
CONFIG_USB_ETH_CDC=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
# CONFIG_BACKLIGHT is not set
# CONFIG_CMD_VIDCONSOLE is not set
# CONFIG_VIDEO_BPP8 is not set

View file

@ -148,6 +148,7 @@ CONFIG_USB_GADGET_DOWNLOAD=y
CONFIG_USB_ETHER=y
CONFIG_USB_ETH_CDC=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
# CONFIG_BACKLIGHT is not set
# CONFIG_CMD_VIDCONSOLE is not set
# CONFIG_VIDEO_BPP8 is not set

View file

@ -66,6 +66,7 @@ CONFIG_PINCTRL_IMX6=y
CONFIG_MXC_UART=y
CONFIG_IMX_THERMAL=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
# CONFIG_VIDEO_BPP8 is not set
# CONFIG_VIDEO_BPP32 is not set
CONFIG_SYS_WHITE_ON_BLACK=y

View file

@ -67,6 +67,7 @@ CONFIG_PINCTRL_IMX6=y
CONFIG_MXC_UART=y
CONFIG_IMX_THERMAL=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
# CONFIG_VIDEO_BPP8 is not set
# CONFIG_VIDEO_BPP32 is not set
CONFIG_SYS_WHITE_ON_BLACK=y

View file

@ -84,6 +84,7 @@ CONFIG_PINCTRL_IMX6=y
CONFIG_MXC_UART=y
CONFIG_IMX_THERMAL=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
# CONFIG_VIDEO_BPP8 is not set
# CONFIG_VIDEO_BPP32 is not set
CONFIG_SYS_WHITE_ON_BLACK=y

View file

@ -67,6 +67,7 @@ CONFIG_PINCTRL_IMX6=y
CONFIG_MXC_UART=y
CONFIG_IMX_THERMAL=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
# CONFIG_VIDEO_BPP8 is not set
# CONFIG_VIDEO_BPP32 is not set
CONFIG_SYS_WHITE_ON_BLACK=y

View file

@ -72,6 +72,7 @@ CONFIG_USB=y
# CONFIG_SPL_DM_USB is not set
CONFIG_USB_EHCI_HCD=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
CONFIG_BACKLIGHT_GPIO=y
CONFIG_SYS_WHITE_ON_BLACK=y
CONFIG_VIDEO_MXS=y

View file

@ -110,6 +110,7 @@ CONFIG_USB_ETHER_ASIX=y
CONFIG_USB_ETHER_MCS7830=y
CONFIG_USB_ETHER_SMSC95XX=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
# CONFIG_VIDEO_BPP8 is not set
# CONFIG_VIDEO_BPP32 is not set
CONFIG_SYS_WHITE_ON_BLACK=y

View file

@ -57,6 +57,7 @@ CONFIG_USB=y
CONFIG_USB_HOST_ETHER=y
CONFIG_USB_ETHER_ASIX=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
# CONFIG_BACKLIGHT is not set
# CONFIG_CMD_VIDCONSOLE is not set
# CONFIG_VIDEO_BPP8 is not set

View file

@ -70,6 +70,7 @@ CONFIG_IMX_THERMAL=y
CONFIG_USB=y
CONFIG_USB_KEYBOARD=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
# CONFIG_BACKLIGHT is not set
# CONFIG_CMD_VIDCONSOLE is not set
# CONFIG_VIDEO_BPP8 is not set

View file

@ -111,6 +111,7 @@ CONFIG_USB_GADGET_PRODUCT_NUM=0xa4a5
CONFIG_CI_UDC=y
CONFIG_USB_GADGET_DOWNLOAD=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
# CONFIG_VIDEO_BPP8 is not set
# CONFIG_VIDEO_BPP32 is not set
CONFIG_SYS_WHITE_ON_BLACK=y

View file

@ -118,6 +118,7 @@ CONFIG_USB_GADGET_VENDOR_NUM=0x0525
CONFIG_USB_GADGET_PRODUCT_NUM=0xa4a5
CONFIG_CI_UDC=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
# CONFIG_VIDEO_BPP8 is not set
# CONFIG_VIDEO_BPP32 is not set
CONFIG_SYS_WHITE_ON_BLACK=y

View file

@ -94,6 +94,7 @@ CONFIG_USB_GADGET_VENDOR_NUM=0x0525
CONFIG_USB_GADGET_PRODUCT_NUM=0xa4a5
CONFIG_CI_UDC=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
CONFIG_SYS_WHITE_ON_BLACK=y
CONFIG_VIDEO_MXS=y
CONFIG_SPLASH_SCREEN=y

View file

@ -84,6 +84,7 @@ CONFIG_IMX_THERMAL=y
CONFIG_USB=y
CONFIG_USB_STORAGE=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
CONFIG_SYS_WHITE_ON_BLACK=y
CONFIG_VIDEO_MXS=y
CONFIG_SPLASH_SCREEN=y

View file

@ -85,6 +85,7 @@ CONFIG_USB_GADGET=y
CONFIG_CI_UDC=y
CONFIG_USB_ETHER=y
CONFIG_USB_ETH_CDC=y
CONFIG_VIDEO_LOGO=y
# CONFIG_VIDEO_BPP8 is not set
# CONFIG_VIDEO_BPP32 is not set
CONFIG_SYS_WHITE_ON_BLACK=y

View file

@ -105,6 +105,7 @@ CONFIG_USB_GADGET_PRODUCT_NUM=0xa4a5
CONFIG_CI_UDC=y
CONFIG_USB_GADGET_DOWNLOAD=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
# CONFIG_VIDEO_BPP8 is not set
# CONFIG_VIDEO_BPP32 is not set
CONFIG_SYS_WHITE_ON_BLACK=y

View file

@ -85,6 +85,7 @@ CONFIG_USB_GADGET_VENDOR_NUM=0x0525
CONFIG_USB_GADGET_PRODUCT_NUM=0xa4a5
CONFIG_CI_UDC=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
CONFIG_SYS_WHITE_ON_BLACK=y
CONFIG_SPLASH_SCREEN=y
CONFIG_SPLASH_SCREEN_ALIGN=y

View file

@ -85,6 +85,7 @@ CONFIG_USB_GADGET_VENDOR_NUM=0x0525
CONFIG_USB_GADGET_PRODUCT_NUM=0xa4a5
CONFIG_CI_UDC=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
CONFIG_SYS_WHITE_ON_BLACK=y
CONFIG_SPLASH_SCREEN=y
CONFIG_SPLASH_SCREEN_ALIGN=y

View file

@ -82,6 +82,7 @@ CONFIG_USB_GADGET_VENDOR_NUM=0x0525
CONFIG_USB_GADGET_PRODUCT_NUM=0xa4a5
CONFIG_CI_UDC=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
# CONFIG_BACKLIGHT is not set
# CONFIG_CMD_VIDCONSOLE is not set
# CONFIG_VIDEO_BPP8 is not set

View file

@ -79,6 +79,7 @@ CONFIG_USB_GADGET_VENDOR_NUM=0x0525
CONFIG_USB_GADGET_PRODUCT_NUM=0xa4a5
CONFIG_CI_UDC=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
CONFIG_VIDEO_MXS=y
CONFIG_SPLASH_SCREEN=y
CONFIG_SPLASH_SCREEN_ALIGN=y

View file

@ -83,6 +83,7 @@ CONFIG_USB_GADGET_PRODUCT_NUM=0xa4a5
CONFIG_CI_UDC=y
CONFIG_USB_GADGET_DOWNLOAD=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
CONFIG_SYS_WHITE_ON_BLACK=y
CONFIG_VIDEO_MXS=y
CONFIG_SPLASH_SCREEN=y

View file

@ -85,6 +85,7 @@ CONFIG_USB_GADGET_VENDOR_NUM=0x0525
CONFIG_USB_GADGET_PRODUCT_NUM=0xa4a5
CONFIG_CI_UDC=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
CONFIG_SYS_WHITE_ON_BLACK=y
CONFIG_VIDEO_MXS=y
CONFIG_SPLASH_SCREEN=y

View file

@ -85,6 +85,7 @@ CONFIG_USB_GADGET_VENDOR_NUM=0x0525
CONFIG_USB_GADGET_PRODUCT_NUM=0xa4a5
CONFIG_CI_UDC=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
CONFIG_SYS_WHITE_ON_BLACK=y
CONFIG_SPLASH_SCREEN=y
CONFIG_SPLASH_SCREEN_ALIGN=y

View file

@ -85,6 +85,7 @@ CONFIG_USB_GADGET_VENDOR_NUM=0x0525
CONFIG_USB_GADGET_PRODUCT_NUM=0xa4a5
CONFIG_CI_UDC=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
CONFIG_SYS_WHITE_ON_BLACK=y
CONFIG_SPLASH_SCREEN=y
CONFIG_SPLASH_SCREEN_ALIGN=y

View file

@ -69,6 +69,7 @@ CONFIG_USB=y
CONFIG_USB_HOST_ETHER=y
CONFIG_USB_ETHER_ASIX=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
# CONFIG_BACKLIGHT is not set
# CONFIG_CMD_VIDCONSOLE is not set
# CONFIG_VIDEO_BPP8 is not set

View file

@ -50,6 +50,7 @@ CONFIG_DM_PMIC=y
CONFIG_DM_REGULATOR=y
CONFIG_CONS_INDEX=0
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
CONFIG_DISPLAY=y
CONFIG_VIDEO_NX=y
CONFIG_VIDEO_NX_RGB=y

View file

@ -285,6 +285,8 @@ CONFIG_OSD=y
CONFIG_SANDBOX_OSD=y
CONFIG_SPLASH_SCREEN_ALIGN=y
CONFIG_VIDEO_BMP_RLE8=y
CONFIG_BMP_16BPP=y
CONFIG_BMP_24BPP=y
CONFIG_W1=y
CONFIG_W1_GPIO=y
CONFIG_W1_EEPROM=y

View file

@ -198,6 +198,8 @@ CONFIG_VIDEO_SANDBOX_SDL=y
CONFIG_OSD=y
CONFIG_SANDBOX_OSD=y
CONFIG_VIDEO_BMP_RLE8=y
CONFIG_BMP_16BPP=y
CONFIG_BMP_24BPP=y
CONFIG_CMD_DHRYSTONE=y
CONFIG_RSA_VERIFY_WITH_PKEY=y
CONFIG_TPM=y

View file

@ -94,6 +94,7 @@ CONFIG_USB_GADGET_PRODUCT_NUM=0xa4a5
CONFIG_CI_UDC=y
CONFIG_USB_GADGET_DOWNLOAD=y
CONFIG_DM_VIDEO=y
# CONFIG_VIDEO_LOGO is not set
# CONFIG_BACKLIGHT is not set
# CONFIG_CMD_VIDCONSOLE is not set
# CONFIG_VIDEO_BPP8 is not set

View file

@ -74,6 +74,7 @@ CONFIG_MXC_UART=y
CONFIG_DM_THERMAL=y
CONFIG_USB=y
CONFIG_DM_VIDEO=y
CONFIG_VIDEO_LOGO=y
# CONFIG_VIDEO_BPP8 is not set
# CONFIG_VIDEO_BPP32 is not set
CONFIG_SYS_WHITE_ON_BLACK=y

View file

@ -14,6 +14,17 @@ config DM_VIDEO
option compiles in the video uclass and routes all LCD/video access
through this.
config VIDEO_LOGO
bool "Show the U-Boot logo on the display"
depends on DM_VIDEO
default y if !SPLASH_SCREEN
select VIDEO_BMP_RLE8
help
This enables showing the U-Boot logo on the display when a video
device is probed. It appears at the top right. The logo itself is at
tools/logos/u-boot_logo.bmp and looks best when the display has a
black background.
config BACKLIGHT
bool "Enable panel backlight uclass support"
depends on DM_VIDEO

View file

@ -17,6 +17,9 @@ obj-$(CONFIG_DM_VIDEO) += video_bmp.o
obj-$(CONFIG_PANEL) += panel-uclass.o
obj-$(CONFIG_DM_PANEL_HX8238D) += hx8238d.o
obj-$(CONFIG_SIMPLE_PANEL) += simple_panel.o
obj-$(CONFIG_VIDEO_LOGO) += u_boot_logo.o
endif
obj-${CONFIG_EXYNOS_FB} += exynos/

View file

@ -42,11 +42,6 @@
* VIDEO_TSTC_FCT - keyboard_tstc function
* VIDEO_GETC_FCT - keyboard_getc function
*
* CONFIG_VIDEO_LOGO - display Linux Logo in upper left corner.
* Use CONFIG_SPLASH_SCREEN_ALIGN with
* environment variable "splashpos" to place
* the logo on other position. In this case
* no CONSOLE_EXTRA_INFO is possible.
* CONFIG_VIDEO_BMP_LOGO - use bmp_logo instead of linux_logo
* CONFIG_CONSOLE_EXTRA_INFO - display additional board information
* strings that normaly goes to serial
@ -127,34 +122,6 @@ void console_cursor(int state);
#define CURSOR_SET video_set_cursor()
#endif /* CONFIG_VIDEO_SW_CURSOR */
#ifdef CONFIG_VIDEO_LOGO
#ifdef CONFIG_VIDEO_BMP_LOGO
#include <bmp_logo.h>
#include <bmp_logo_data.h>
#define VIDEO_LOGO_WIDTH BMP_LOGO_WIDTH
#define VIDEO_LOGO_HEIGHT BMP_LOGO_HEIGHT
#define VIDEO_LOGO_LUT_OFFSET BMP_LOGO_OFFSET
#define VIDEO_LOGO_COLORS BMP_LOGO_COLORS
#else /* CONFIG_VIDEO_BMP_LOGO */
#define LINUX_LOGO_WIDTH 80
#define LINUX_LOGO_HEIGHT 80
#define LINUX_LOGO_COLORS 214
#define LINUX_LOGO_LUT_OFFSET 0x20
#define __initdata
#include <linux_logo.h>
#define VIDEO_LOGO_WIDTH LINUX_LOGO_WIDTH
#define VIDEO_LOGO_HEIGHT LINUX_LOGO_HEIGHT
#define VIDEO_LOGO_LUT_OFFSET LINUX_LOGO_LUT_OFFSET
#define VIDEO_LOGO_COLORS LINUX_LOGO_COLORS
#endif /* CONFIG_VIDEO_BMP_LOGO */
#define VIDEO_INFO_X (VIDEO_LOGO_WIDTH)
#define VIDEO_INFO_Y (VIDEO_FONT_HEIGHT/2)
#else /* CONFIG_VIDEO_LOGO */
#define VIDEO_LOGO_WIDTH 0
#define VIDEO_LOGO_HEIGHT 0
#endif /* CONFIG_VIDEO_LOGO */
#define VIDEO_COLS VIDEO_VISIBLE_COLS
#define VIDEO_ROWS VIDEO_VISIBLE_ROWS
#ifndef VIDEO_LINE_LEN
@ -163,11 +130,7 @@ void console_cursor(int state);
#define VIDEO_SIZE (VIDEO_ROWS * VIDEO_LINE_LEN)
#define VIDEO_BURST_LEN (VIDEO_COLS/8)
#ifdef CONFIG_VIDEO_LOGO
#define CONSOLE_ROWS ((VIDEO_ROWS - video_logo_height) / VIDEO_FONT_HEIGHT)
#else
#define CONSOLE_ROWS (VIDEO_ROWS / VIDEO_FONT_HEIGHT)
#endif
#define CONSOLE_COLS (VIDEO_COLS / VIDEO_FONT_WIDTH)
#define CONSOLE_ROW_SIZE (VIDEO_FONT_HEIGHT * VIDEO_LINE_LEN)
@ -214,7 +177,7 @@ static GraphicDevice *pGD; /* Pointer to Graphic array */
static void *video_fb_address; /* frame buffer address */
static void *video_console_address; /* console buffer start address */
static int video_logo_height = VIDEO_LOGO_HEIGHT;
static int video_logo_height; /* not supported anymore */
static int __maybe_unused cursor_state;
static int __maybe_unused old_col;
@ -1670,292 +1633,6 @@ int video_display_bitmap(ulong bmp_image, int x, int y)
}
#endif
#ifdef CONFIG_VIDEO_LOGO
static int video_logo_xpos;
static int video_logo_ypos;
static void plot_logo_or_black(void *screen, int x, int y, int black);
static void logo_plot(void *screen, int x, int y)
{
plot_logo_or_black(screen, x, y, 0);
}
static void logo_black(void)
{
plot_logo_or_black(video_fb_address, video_logo_xpos, video_logo_ypos,
1);
}
static int do_clrlogo(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{
if (argc != 1)
return cmd_usage(cmdtp);
logo_black();
return 0;
}
U_BOOT_CMD(
clrlogo, 1, 0, do_clrlogo,
"fill the boot logo area with black",
" "
);
static void plot_logo_or_black(void *screen, int x, int y, int black)
{
int xcount, i;
int skip = VIDEO_LINE_LEN - VIDEO_LOGO_WIDTH * VIDEO_PIXEL_SIZE;
int ycount = video_logo_height;
unsigned char r, g, b, *logo_red, *logo_blue, *logo_green;
unsigned char *source;
unsigned char *dest;
#ifdef CONFIG_SPLASH_SCREEN_ALIGN
if (x == BMP_ALIGN_CENTER)
x = max(0, (int)(VIDEO_VISIBLE_COLS - VIDEO_LOGO_WIDTH) / 2);
else if (x < 0)
x = max(0, (int)(VIDEO_VISIBLE_COLS - VIDEO_LOGO_WIDTH + x + 1));
if (y == BMP_ALIGN_CENTER)
y = max(0, (int)(VIDEO_VISIBLE_ROWS - VIDEO_LOGO_HEIGHT) / 2);
else if (y < 0)
y = max(0, (int)(VIDEO_VISIBLE_ROWS - VIDEO_LOGO_HEIGHT + y + 1));
#endif /* CONFIG_SPLASH_SCREEN_ALIGN */
dest = (unsigned char *)screen + y * VIDEO_LINE_LEN + x * VIDEO_PIXEL_SIZE;
#ifdef CONFIG_VIDEO_BMP_LOGO
source = bmp_logo_bitmap;
/* Allocate temporary space for computing colormap */
logo_red = malloc(BMP_LOGO_COLORS);
logo_green = malloc(BMP_LOGO_COLORS);
logo_blue = malloc(BMP_LOGO_COLORS);
/* Compute color map */
for (i = 0; i < VIDEO_LOGO_COLORS; i++) {
logo_red[i] = (bmp_logo_palette[i] & 0x0f00) >> 4;
logo_green[i] = (bmp_logo_palette[i] & 0x00f0);
logo_blue[i] = (bmp_logo_palette[i] & 0x000f) << 4;
}
#else
source = linux_logo;
logo_red = linux_logo_red;
logo_green = linux_logo_green;
logo_blue = linux_logo_blue;
#endif
if (VIDEO_DATA_FORMAT == GDF__8BIT_INDEX) {
for (i = 0; i < VIDEO_LOGO_COLORS; i++) {
video_set_lut(i + VIDEO_LOGO_LUT_OFFSET,
logo_red[i], logo_green[i],
logo_blue[i]);
}
}
while (ycount--) {
#if defined(VIDEO_FB_16BPP_PIXEL_SWAP)
int xpos = x;
#endif
xcount = VIDEO_LOGO_WIDTH;
while (xcount--) {
if (black) {
r = 0x00;
g = 0x00;
b = 0x00;
} else {
r = logo_red[*source - VIDEO_LOGO_LUT_OFFSET];
g = logo_green[*source - VIDEO_LOGO_LUT_OFFSET];
b = logo_blue[*source - VIDEO_LOGO_LUT_OFFSET];
}
switch (VIDEO_DATA_FORMAT) {
case GDF__8BIT_INDEX:
*dest = *source;
break;
case GDF__8BIT_332RGB:
*dest = ((r >> 5) << 5) |
((g >> 5) << 2) |
(b >> 6);
break;
case GDF_15BIT_555RGB:
#if defined(VIDEO_FB_16BPP_PIXEL_SWAP)
fill_555rgb_pswap(dest, xpos++, r, g, b);
#else
*(unsigned short *) dest =
SWAP16((unsigned short) (
((r >> 3) << 10) |
((g >> 3) << 5) |
(b >> 3)));
#endif
break;
case GDF_16BIT_565RGB:
*(unsigned short *) dest =
SWAP16((unsigned short) (
((r >> 3) << 11) |
((g >> 2) << 5) |
(b >> 3)));
break;
case GDF_32BIT_X888RGB:
*(u32 *) dest =
SWAP32((u32) (
(r << 16) |
(g << 8) |
b));
break;
case GDF_24BIT_888RGB:
#ifdef VIDEO_FB_LITTLE_ENDIAN
dest[0] = b;
dest[1] = g;
dest[2] = r;
#else
dest[0] = r;
dest[1] = g;
dest[2] = b;
#endif
break;
}
source++;
dest += VIDEO_PIXEL_SIZE;
}
dest += skip;
}
#ifdef CONFIG_VIDEO_BMP_LOGO
free(logo_red);
free(logo_green);
free(logo_blue);
#endif
}
static void *video_logo(void)
{
char info[128];
__maybe_unused int y_off = 0;
__maybe_unused ulong addr;
__maybe_unused char *s;
__maybe_unused int len, ret, space;
splash_get_pos(&video_logo_xpos, &video_logo_ypos);
#ifdef CONFIG_SPLASH_SCREEN
s = env_get("splashimage");
if (s != NULL) {
ret = splash_screen_prepare();
if (ret < 0)
return video_fb_address;
addr = hextoul(s, NULL);
if (video_display_bitmap(addr,
video_logo_xpos,
video_logo_ypos) == 0) {
video_logo_height = 0;
return ((void *) (video_fb_address));
}
}
#endif /* CONFIG_SPLASH_SCREEN */
logo_plot(video_fb_address, video_logo_xpos, video_logo_ypos);
#ifdef CONFIG_SPLASH_SCREEN_ALIGN
/*
* when using splashpos for video_logo, skip any info
* output on video console if the logo is not at 0,0
*/
if (video_logo_xpos || video_logo_ypos) {
/*
* video_logo_height is used in text and cursor offset
* calculations. Since the console is below the logo,
* we need to adjust the logo height
*/
if (video_logo_ypos == BMP_ALIGN_CENTER)
video_logo_height += max(0, (int)(VIDEO_VISIBLE_ROWS -
VIDEO_LOGO_HEIGHT) / 2);
else if (video_logo_ypos > 0)
video_logo_height += video_logo_ypos;
return video_fb_address + video_logo_height * VIDEO_LINE_LEN;
}
#endif
if (board_cfb_skip())
return 0;
sprintf(info, " %s", version_string);
#ifndef CONFIG_HIDE_LOGO_VERSION
space = (VIDEO_COLS - VIDEO_INFO_X) / VIDEO_FONT_WIDTH;
len = strlen(info);
if (len > space) {
int xx = VIDEO_INFO_X, yy = VIDEO_INFO_Y;
uchar *p = (uchar *) info;
while (len) {
if (len > space) {
video_drawchars(xx, yy, p, space);
len -= space;
p = (uchar *)p + space;
if (!y_off) {
xx += VIDEO_FONT_WIDTH;
space--;
}
yy += VIDEO_FONT_HEIGHT;
y_off++;
} else {
video_drawchars(xx, yy, p, len);
len = 0;
}
}
} else
video_drawstring(VIDEO_INFO_X, VIDEO_INFO_Y, (uchar *) info);
#ifdef CONFIG_CONSOLE_EXTRA_INFO
{
int i, n =
((video_logo_height -
VIDEO_FONT_HEIGHT) / VIDEO_FONT_HEIGHT);
for (i = 1; i < n; i++) {
video_get_info_str(i, info);
if (!*info)
continue;
len = strlen(info);
if (len > space) {
video_drawchars(VIDEO_INFO_X,
VIDEO_INFO_Y +
(i + y_off) *
VIDEO_FONT_HEIGHT,
(uchar *) info, space);
y_off++;
video_drawchars(VIDEO_INFO_X +
VIDEO_FONT_WIDTH,
VIDEO_INFO_Y +
(i + y_off) *
VIDEO_FONT_HEIGHT,
(uchar *) info + space,
len - space);
} else {
video_drawstring(VIDEO_INFO_X,
VIDEO_INFO_Y +
(i + y_off) *
VIDEO_FONT_HEIGHT,
(uchar *) info);
}
}
}
#endif
#endif
return (video_fb_address + video_logo_height * VIDEO_LINE_LEN);
}
#endif
static int cfb_fb_is_in_dram(void)
{
struct bd_info *bd = gd->bd;

View file

@ -274,6 +274,27 @@ static int console_truetype_putc_xy(struct udevice *dev, uint x, uint y,
*/
for (row = 0; row < height; row++) {
switch (vid_priv->bpix) {
case VIDEO_BPP8:
if (IS_ENABLED(CONFIG_VIDEO_BPP8)) {
u8 *dst = line + xoff;
int i;
for (i = 0; i < width; i++) {
int val = *bits;
int out;
if (vid_priv->colour_bg)
val = 255 - val;
out = val;
if (vid_priv->colour_fg)
*dst++ |= out;
else
*dst++ &= out;
bits++;
}
end = dst;
}
break;
#ifdef CONFIG_VIDEO_BPP16
case VIDEO_BPP16: {
uint16_t *dst = (uint16_t *)line + xoff;

View file

@ -12,6 +12,7 @@
#include <asm/sdl.h>
#include <asm/state.h>
#include <asm/u-boot-sandbox.h>
#include <dm/device-internal.h>
#include <dm/test.h>
DECLARE_GLOBAL_DATA_PTR;
@ -43,27 +44,86 @@ static int sandbox_sdl_probe(struct udevice *dev)
uc_priv->vidconsole_drv_name = plat->vidconsole_drv_name;
uc_priv->font_size = plat->font_size;
if (IS_ENABLED(CONFIG_VIDEO_COPY))
uc_plat->copy_base = uc_plat->base - uc_plat->size / 2;
uc_plat->copy_base = uc_plat->base + uc_plat->size / 2;
return 0;
}
static void set_bpp(struct udevice *dev, enum video_log2_bpp l2bpp)
{
struct video_uc_plat *uc_plat = dev_get_uclass_plat(dev);
struct sandbox_sdl_plat *plat = dev_get_plat(dev);
plat->bpix = l2bpp;
uc_plat->size = plat->xres * plat->yres * VNBYTES(plat->bpix);
/*
* Set up to the maximum size we'll ever need. This is a strange case.
* The video memory is allocated by video_post_bind() called from
* board_init_r(). If a test changes the reoslution so it needs more
* memory later (with sandbox_sdl_set_bpp()), it is too late to make
* the frame buffer larger.
*
* So use a maximum size here.
*/
uc_plat->size = max(uc_plat->size, 1920U * 1080 * VNBYTES(VIDEO_BPP32));
/* Allow space for two buffers, the lower one being the copy buffer */
log_debug("Frame buffer size %x\n", uc_plat->size);
/*
* If a copy framebuffer is used, double the size and use the last half
* as the copy, with the first half as the normal frame buffer.
*/
if (IS_ENABLED(CONFIG_VIDEO_COPY))
uc_plat->size *= 2;
}
int sandbox_sdl_set_bpp(struct udevice *dev, enum video_log2_bpp l2bpp)
{
struct video_uc_plat *uc_plat = dev_get_uclass_plat(dev);
int ret;
if (device_active(dev))
return -EINVAL;
sandbox_sdl_remove_display();
uc_plat->hide_logo = true;
set_bpp(dev, l2bpp);
ret = device_probe(dev);
if (ret)
return ret;
return 0;
}
static int sandbox_sdl_remove(struct udevice *dev)
{
/*
* Removing the display it a bit annoying when running unit tests, since
* they remove all devices. It is nice to be able to see what the test
* wrote onto the display. So this comment is just here to show how to
* do it, if we want to make it optional one day.
*
* sandbox_sdl_remove_display();
*/
return 0;
}
static int sandbox_sdl_bind(struct udevice *dev)
{
struct video_uc_plat *uc_plat = dev_get_uclass_plat(dev);
struct sandbox_sdl_plat *plat = dev_get_plat(dev);
enum video_log2_bpp l2bpp;
int ret = 0;
plat->xres = dev_read_u32_default(dev, "xres", LCD_MAX_WIDTH);
plat->yres = dev_read_u32_default(dev, "yres", LCD_MAX_HEIGHT);
plat->bpix = dev_read_u32_default(dev, "log2-depth", VIDEO_BPP16);
l2bpp = dev_read_u32_default(dev, "log2-depth", VIDEO_BPP16);
plat->rot = dev_read_u32_default(dev, "rotate", 0);
uc_plat->size = plat->xres * plat->yres * (1 << plat->bpix) / 8;
/* Allow space for two buffers, the lower one being the copy buffer */
log_debug("Frame buffer size %x\n", uc_plat->size);
if (IS_ENABLED(CONFIG_VIDEO_COPY))
uc_plat->size *= 2;
set_bpp(dev, l2bpp);
return ret;
}
@ -79,5 +139,6 @@ U_BOOT_DRIVER(sandbox_lcd_sdl) = {
.of_match = sandbox_sdl_ids,
.bind = sandbox_sdl_bind,
.probe = sandbox_sdl_probe,
.remove = sandbox_sdl_remove,
.plat_auto = sizeof(struct sandbox_sdl_plat),
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

View file

@ -279,10 +279,10 @@ int video_sync_copy(struct udevice *dev, void *from, void *to)
*/
if (offset < -priv->fb_size || offset > 2 * priv->fb_size) {
#ifdef DEBUG
char str[80];
char str[120];
snprintf(str, sizeof(str),
"[sync_copy fb=%p, from=%p, to=%p, offset=%lx]",
"[** FAULT sync_copy fb=%p, from=%p, to=%p, offset=%lx]",
priv->fb, from, to, offset);
console_puts_select_stderr(true, str);
#endif
@ -319,23 +319,20 @@ int video_sync_copy_all(struct udevice *dev)
#endif
/* Set up the colour map */
static int video_pre_probe(struct udevice *dev)
#define SPLASH_DECL(_name) \
extern u8 __splash_ ## _name ## _begin[]; \
extern u8 __splash_ ## _name ## _end[]
#define SPLASH_START(_name) __splash_ ## _name ## _begin
SPLASH_DECL(u_boot_logo);
static int show_splash(struct udevice *dev)
{
struct video_priv *priv = dev_get_uclass_priv(dev);
u8 *data = SPLASH_START(u_boot_logo);
int ret;
priv->cmap = calloc(256, sizeof(ushort));
if (!priv->cmap)
return -ENOMEM;
return 0;
}
static int video_pre_remove(struct udevice *dev)
{
struct video_priv *priv = dev_get_uclass_priv(dev);
free(priv->cmap);
ret = video_bmp_display(dev, map_to_sysmem(data), -4, 4, true);
return 0;
}
@ -405,6 +402,14 @@ static int video_post_probe(struct udevice *dev)
return ret;
}
if (IS_ENABLED(CONFIG_VIDEO_LOGO) && !plat->hide_logo) {
ret = show_splash(dev);
if (ret) {
log_debug("Cannot show splash screen\n");
return ret;
}
}
return 0;
};
@ -447,9 +452,7 @@ UCLASS_DRIVER(video) = {
.name = "video",
.flags = DM_UC_FLAG_SEQ_ALIAS,
.post_bind = video_post_bind,
.pre_probe = video_pre_probe,
.post_probe = video_post_probe,
.pre_remove = video_pre_remove,
.priv_auto = sizeof(struct video_uc_priv),
.per_device_auto = sizeof(struct video_priv),
.per_device_plat_auto = sizeof(struct video_uc_plat),

View file

@ -13,34 +13,90 @@
#include <watchdog.h>
#include <asm/unaligned.h>
#ifdef CONFIG_VIDEO_BMP_RLE8
#define BMP_RLE8_ESCAPE 0
#define BMP_RLE8_EOL 0
#define BMP_RLE8_EOBMP 1
#define BMP_RLE8_DELTA 2
static void draw_unencoded_bitmap(ushort **fbp, uchar *bmap, ushort *cmap,
/**
* get_bmp_col_16bpp() - Convert a colour-table entry into a 16bpp pixel value
*
* @return value to write to the 16bpp frame buffer for this palette entry
*/
static uint get_bmp_col_16bpp(struct bmp_color_table_entry cte)
{
return ((cte.red << 8) & 0xf800) |
((cte.green << 3) & 0x07e0) |
((cte.blue >> 3) & 0x001f);
}
/**
* write_pix8() - Write a pixel from a BMP image into the framebuffer
*
* This handles frame buffers with 8, 16, 24 or 32 bits per pixel
*
* @fb: Place in frame buffer to update
* @bpix: Frame buffer bits-per-pixel, which controls how many bytes are written
* @palette: BMP palette table
* @bmap: Pointer to BMP bitmap position to write. This contains a single byte
* which is either written directly (bpix == 8) or used to look up the
* palette to get a colour to write
*/
static void write_pix8(u8 *fb, uint bpix, struct bmp_color_table_entry *palette,
u8 *bmap)
{
if (bpix == 8) {
*fb++ = *bmap;
} else if (bpix == 16) {
*(u16 *)fb = get_bmp_col_16bpp(palette[*bmap]);
} else {
/* Only support big endian */
struct bmp_color_table_entry *cte = &palette[*bmap];
if (bpix == 24) {
*fb++ = cte->red;
*fb++ = cte->green;
*fb++ = cte->blue;
} else {
*fb++ = cte->blue;
*fb++ = cte->green;
*fb++ = cte->red;
*fb++ = 0;
}
}
}
static void draw_unencoded_bitmap(u8 **fbp, uint bpix, uchar *bmap,
struct bmp_color_table_entry *palette,
int cnt)
{
u8 *fb = *fbp;
while (cnt > 0) {
*(*fbp)++ = cmap[*bmap++];
write_pix8(fb, bpix, palette, bmap++);
fb += bpix / 8;
cnt--;
}
*fbp = fb;
}
static void draw_encoded_bitmap(ushort **fbp, ushort col, int cnt)
static void draw_encoded_bitmap(u8 **fbp, uint bpix,
struct bmp_color_table_entry *palette, u8 *bmap,
int cnt)
{
ushort *fb = *fbp;
u8 *fb = *fbp;
while (cnt > 0) {
*fb++ = col;
write_pix8(fb, bpix, palette, bmap);
fb += bpix / 8;
cnt--;
}
*fbp = fb;
}
static void video_display_rle8_bitmap(struct udevice *dev,
struct bmp_image *bmp, ushort *cmap,
struct bmp_image *bmp, uint bpix,
struct bmp_color_table_entry *palette,
uchar *fb, int x_off, int y_off,
ulong width, ulong height)
{
@ -49,6 +105,7 @@ static void video_display_rle8_bitmap(struct udevice *dev,
ulong cnt, runlen;
int x, y;
int decode = 1;
uint bytes_per_pixel = bpix / 8;
debug("%s\n", __func__);
bmap = (uchar *)bmp + get_unaligned_le32(&bmp->header.data_offset);
@ -64,8 +121,8 @@ static void video_display_rle8_bitmap(struct udevice *dev,
bmap += 2;
x = 0;
y--;
/* 16bpix, 2-byte per pixel, width should *2 */
fb -= (width * 2 + priv->line_length);
fb -= width * bytes_per_pixel +
priv->line_length;
break;
case BMP_RLE8_EOBMP:
/* end of bitmap */
@ -75,9 +132,9 @@ static void video_display_rle8_bitmap(struct udevice *dev,
/* delta run */
x += bmap[2];
y -= bmap[3];
/* 16bpix, 2-byte per pixel, x should *2 */
fb = (uchar *)(priv->fb + (y + y_off - 1)
* priv->line_length + (x + x_off) * 2);
fb = (uchar *)(priv->fb +
(y + y_off - 1) * priv->line_length +
(x + x_off) * bytes_per_pixel);
bmap += 4;
break;
default:
@ -91,8 +148,8 @@ static void video_display_rle8_bitmap(struct udevice *dev,
else
cnt = runlen;
draw_unencoded_bitmap(
(ushort **)&fb,
bmap, cmap, cnt);
&fb, bpix,
bmap, palette, cnt);
}
x += runlen;
}
@ -116,8 +173,8 @@ static void video_display_rle8_bitmap(struct udevice *dev,
cnt = width - x;
else
cnt = runlen;
draw_encoded_bitmap((ushort **)&fb,
cmap[bmap[1]], cnt);
draw_encoded_bitmap(&fb, bpix, palette,
&bmap[1], cnt);
}
x += runlen;
}
@ -125,20 +182,6 @@ static void video_display_rle8_bitmap(struct udevice *dev,
}
}
}
#endif
__weak void fb_put_byte(uchar **fb, uchar **from)
{
*(*fb)++ = *(*from)++;
}
#if defined(CONFIG_BMP_16BPP)
__weak void fb_put_word(uchar **fb, uchar **from)
{
*(*fb)++ = *(*from)++;
*(*fb)++ = *(*from)++;
}
#endif /* CONFIG_BMP_16BPP */
/**
* video_splash_align_axis() - Align a single coordinate
@ -169,28 +212,10 @@ static void video_splash_align_axis(int *axis, unsigned long panel_size,
*axis = max(0, (int)axis_alignment);
}
static void video_set_cmap(struct udevice *dev,
struct bmp_color_table_entry *cte, unsigned colours)
{
struct video_priv *priv = dev_get_uclass_priv(dev);
int i;
ushort *cmap = priv->cmap;
debug("%s: colours=%d\n", __func__, colours);
for (i = 0; i < colours; ++i) {
*cmap = ((cte->red << 8) & 0xf800) |
((cte->green << 3) & 0x07e0) |
((cte->blue >> 3) & 0x001f);
cmap++;
cte++;
}
}
int video_bmp_display(struct udevice *dev, ulong bmp_image, int x, int y,
bool align)
{
struct video_priv *priv = dev_get_uclass_priv(dev);
ushort *cmap_base = NULL;
int i, j;
uchar *start, *fb;
struct bmp_image *bmp = map_sysmem(bmp_image, 0);
@ -246,9 +271,6 @@ int video_bmp_display(struct udevice *dev, ulong bmp_image, int x, int y,
debug("Display-bmp: %d x %d with %d colours, display %d\n",
(int)width, (int)height, (int)colours, 1 << bpix);
if (bmp_bpix == 8)
video_set_cmap(dev, palette, colours);
padded_width = (width & 0x3 ? (width & ~0x3) + 4 : width);
if (align) {
@ -270,23 +292,19 @@ int video_bmp_display(struct udevice *dev, ulong bmp_image, int x, int y,
switch (bmp_bpix) {
case 1:
case 8: {
struct bmp_color_table_entry *cte;
cmap_base = priv->cmap;
#ifdef CONFIG_VIDEO_BMP_RLE8
u32 compression = get_unaligned_le32(&bmp->header.compression);
case 8:
if (IS_ENABLED(CONFIG_VIDEO_BMP_RLE8)) {
u32 compression = get_unaligned_le32(
&bmp->header.compression);
debug("compressed %d %d\n", compression, BMP_BI_RLE8);
if (compression == BMP_BI_RLE8) {
if (bpix != 16) {
/* TODO implement render code for bpix != 16 */
printf("Error: only support 16 bpix");
return -EPROTONOSUPPORT;
}
video_display_rle8_bitmap(dev, bmp, cmap_base, fb, x,
y, width, height);
video_display_rle8_bitmap(dev, bmp, bpix, palette, fb,
x, y, width, height);
break;
}
#endif
}
/* Not compressed */
byte_width = width * (bpix / 8);
if (!byte_width)
byte_width = width;
@ -294,81 +312,64 @@ int video_bmp_display(struct udevice *dev, ulong bmp_image, int x, int y,
for (i = 0; i < height; ++i) {
WATCHDOG_RESET();
for (j = 0; j < width; j++) {
if (bpix == 8) {
fb_put_byte(&fb, &bmap);
} else if (bpix == 16) {
*(uint16_t *)fb = cmap_base[*bmap];
write_pix8(fb, bpix, palette, bmap);
bmap++;
fb += sizeof(uint16_t) / sizeof(*fb);
} else {
/* Only support big endian */
cte = &palette[*bmap];
bmap++;
if (bpix == 24) {
*(fb++) = cte->red;
*(fb++) = cte->green;
*(fb++) = cte->blue;
} else {
*(fb++) = cte->blue;
*(fb++) = cte->green;
*(fb++) = cte->red;
*(fb++) = 0;
}
}
fb += bpix / 8;
}
bmap += (padded_width - width);
fb -= byte_width + priv->line_length;
}
break;
}
#if defined(CONFIG_BMP_16BPP)
case 16:
if (IS_ENABLED(CONFIG_BMP_16BPP)) {
for (i = 0; i < height; ++i) {
WATCHDOG_RESET();
for (j = 0; j < width; j++)
fb_put_word(&fb, &bmap);
for (j = 0; j < width; j++) {
*fb++ = *bmap++;
*fb++ = *bmap++;
}
bmap += (padded_width - width);
fb -= width * 2 + priv->line_length;
}
}
break;
#endif /* CONFIG_BMP_16BPP */
#if defined(CONFIG_BMP_24BPP)
case 24:
if (IS_ENABLED(CONFIG_BMP_24BPP)) {
for (i = 0; i < height; ++i) {
for (j = 0; j < width; j++) {
if (bpix == 16) {
/* 16bit 555RGB format */
*(u16 *)fb = ((bmap[2] >> 3) << 10) |
((bmap[1] >> 3) << 5) |
/* 16bit 565RGB format */
*(u16 *)fb = ((bmap[2] >> 3)
<< 11) |
((bmap[1] >> 2) << 5) |
(bmap[0] >> 3);
bmap += 3;
fb += 2;
} else {
*(fb++) = *(bmap++);
*(fb++) = *(bmap++);
*(fb++) = *(bmap++);
*(fb++) = 0;
*fb++ = *bmap++;
*fb++ = *bmap++;
*fb++ = *bmap++;
*fb++ = 0;
}
}
fb -= priv->line_length + width * (bpix / 8);
bmap += (padded_width - width);
}
}
break;
#endif /* CONFIG_BMP_24BPP */
#if defined(CONFIG_BMP_32BPP)
case 32:
if (IS_ENABLED(CONFIG_BMP_32BPP)) {
for (i = 0; i < height; ++i) {
for (j = 0; j < width; j++) {
*(fb++) = *(bmap++);
*(fb++) = *(bmap++);
*(fb++) = *(bmap++);
*(fb++) = *(bmap++);
*fb++ = *bmap++;
*fb++ = *bmap++;
*fb++ = *bmap++;
*fb++ = *bmap++;
}
fb -= priv->line_length + width * (bpix / 8);
}
}
break;
#endif /* CONFIG_BMP_32BPP */
default:
break;
};

View file

@ -373,7 +373,6 @@
#undef CONFIG_FSL_DIU_FB /* RDB doesn't support DIU */
#ifdef CONFIG_FSL_DIU_FB
#define CONFIG_SYS_DIU_ADDR (CONFIG_SYS_CCSRBAR + 0x180000)
#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_BMP_LOGO
#define CONFIG_CFI_FLASH_USE_WEAK_ACCESSORS
/*

View file

@ -362,7 +362,6 @@
#ifdef CONFIG_FSL_DIU_FB
#define CONFIG_FSL_DIU_CH7301
#define CONFIG_SYS_DIU_ADDR (CONFIG_SYS_CCSRBAR + 0x180000)
#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_BMP_LOGO
#endif
#endif

View file

@ -45,7 +45,6 @@
#define CONFIG_USBD_HS
/* Framebuffer and LCD */
#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_BMP_LOGO
#define CONFIG_IMX_HDMI
#define CONFIG_IMX_VIDEO_SKIP

View file

@ -443,7 +443,6 @@
/* Framebuffer */
/* check this console not needed, after test remove it */
#define CONFIG_IMX_VIDEO_SKIP
#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_BMP_LOGO
#define CONFIG_IMX6_PWM_PER_CLK 66000000

View file

@ -176,7 +176,6 @@
/* Display */
#define CONFIG_IMX_HDMI
#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_BMP_LOGO
/* EEPROM */

View file

@ -164,7 +164,6 @@
#if defined(CONFIG_DM_VIDEO)
#define MXS_LCDIF_BASE MX6UL_LCDIF1_BASE_ADDR
#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_BMP_LOGO
#endif

View file

@ -35,7 +35,6 @@
#define CONFIG_USBD_HS
/* Framebuffer and LCD */
#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_BMP_LOGO
#define CONFIG_IMX_HDMI
#define CONFIG_IMX_VIDEO_SKIP

View file

@ -197,7 +197,6 @@
#define CONFIG_USBD_HS
#if defined(CONFIG_DM_VIDEO)
#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_BMP_LOGO
#endif

View file

@ -15,7 +15,6 @@
#include <linux/sizes.h>
#ifdef CONFIG_VIDEO_FSL_DCU_FB
#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_BMP_LOGO
#define CONFIG_SYS_FSL_DCU_LE

View file

@ -10,6 +10,9 @@
#ifndef __CONFIG_H
#define __CONFIG_H
#define SPLASH_SETTINGS "splashsource=virtio_fs\0" \
"splashimage=0x1000000\0"
#include <configs/x86-common.h>
#define CONFIG_SYS_MONITOR_LEN (1 << 20)

View file

@ -52,7 +52,6 @@
#endif
/* Framebuffer */
#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_BMP_LOGO
#define CONFIG_IMX_HDMI
#define CONFIG_IMX_VIDEO_SKIP

View file

@ -72,7 +72,6 @@
#define CONFIG_USBD_HS
/* Framebuffer and LCD */
#define CONFIG_VIDEO_LOGO
#define CONFIG_IMX_HDMI
#define CONFIG_IMX_VIDEO_SKIP
#define CONFIG_VIDEO_BMP_LOGO

View file

@ -154,7 +154,6 @@
#ifdef CONFIG_VIDEO_IPUV3
# define CONFIG_IMX_VIDEO_SKIP
# define CONFIG_VIDEO_LOGO
# define CONFIG_VIDEO_BMP_LOGO
#endif

View file

@ -21,7 +21,6 @@
DMAMEM_SZ_ALL)
#ifdef CONFIG_DM_VIDEO
#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_BMP_LOGO
#define CONFIG_EXTRA_ENV_SETTINGS \

View file

@ -308,7 +308,6 @@
* Video
*/
#ifdef CONFIG_VIDEO_FSL_DCU_FB
#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_BMP_LOGO
#define CONFIG_FSL_DIU_CH7301

View file

@ -199,7 +199,6 @@
* Video
*/
#ifdef CONFIG_VIDEO_FSL_DCU_FB
#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_BMP_LOGO
#define CONFIG_FSL_DCU_SII9022A

View file

@ -110,7 +110,6 @@
/*
* LCD
*/
#define CONFIG_VIDEO_LOGO
#define CONFIG_SYS_VIDEO_LOGO_MAX_SIZE (2 << 20)
/* LVDS display */

View file

@ -27,7 +27,6 @@
/* Framebuffer support */
#ifdef CONFIG_DM_VIDEO
#define CONFIG_VIDEO_LOGO
#define CONFIG_SYS_VIDEO_LOGO_MAX_SIZE (512 << 10)
#endif

View file

@ -41,7 +41,6 @@
/* Framebuffer support */
#ifdef CONFIG_DM_VIDEO
#define CONFIG_VIDEO_LOGO
#define CONFIG_SYS_VIDEO_LOGO_MAX_SIZE (512 << 10)
#endif

View file

@ -43,7 +43,6 @@
#define CONFIG_MXC_USB_FLAGS MXC_EHCI_POWER_PINS_ENABLED
/* Framebuffer and LCD */
#define CONFIG_VIDEO_LOGO
#define CONFIG_ETHPRIME "FEC0"

View file

@ -132,6 +132,5 @@
#endif
/* Framebuffer and LCD */
#define CONFIG_VIDEO_LOGO
#endif /* __CONFIG_H */

View file

@ -25,7 +25,6 @@
#endif
/* Framebuffer */
#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_BMP_LOGO
#define CONFIG_IMX_HDMI
#define CONFIG_IMX_VIDEO_SKIP

View file

@ -153,7 +153,6 @@
/* Environment organization */
/* Framebuffer */
#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_BMP_LOGO
#define CONFIG_IMX_HDMI
#define CONFIG_IMX_VIDEO_SKIP

View file

@ -148,7 +148,6 @@
#ifndef CONFIG_SPL_BUILD
#ifdef CONFIG_DM_VIDEO
#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_BMP_LOGO
#define MXS_LCDIF_BASE MX6SX_LCDIF1_BASE_ADDR
#endif

View file

@ -149,7 +149,6 @@
#ifndef CONFIG_SPL_BUILD
#if defined(CONFIG_DM_VIDEO)
#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_BMP_LOGO
#define MXS_LCDIF_BASE MX6UL_LCDIF1_BASE_ADDR
#endif

View file

@ -123,7 +123,6 @@
#define CONFIG_USBD_HS
#ifdef CONFIG_DM_VIDEO
#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_BMP_LOGO
#endif

View file

@ -74,7 +74,6 @@
* Framebuffer
*/
/* Video console */
#define CONFIG_VIDEO_LOGO
#define VIDEO_FB_16BPP_PIXEL_SWAP
#define VIDEO_FB_16BPP_WORD_SWAP

View file

@ -86,7 +86,6 @@
#endif
/* Video output */
#define CONFIG_VIDEO_LOGO
#define CONFIG_IMX_HDMI
#define CONFIG_IMX_VIDEO_SKIP

View file

@ -41,7 +41,6 @@
/* LCD */
#ifndef CONFIG_SPL_BUILD
#ifdef CONFIG_DM_VIDEO
#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_BMP_LOGO
#define MXS_LCDIF_BASE MX6UL_LCDIF1_BASE_ADDR
#endif

View file

@ -136,7 +136,6 @@
#define CONFIG_FEC_MXC_PHYADDR 1
/* Framebuffer */
#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_BMP_LOGO
#define CONFIG_IMX_HDMI
#define CONFIG_IMX_VIDEO_SKIP

View file

@ -131,7 +131,6 @@
#define CONFIG_BOARD_SIZE_LIMIT 715776
#ifdef CONFIG_DM_VIDEO
#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_BMP_LOGO
#define MXS_LCDIF_BASE MX6UL_LCDIF1_BASE_ADDR
#endif

View file

@ -121,7 +121,6 @@
#define CONFIG_POWER_PFUZE3000_I2C_ADDR 0x08
#ifdef CONFIG_DM_VIDEO
#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_BMP_LOGO
#endif

View file

@ -76,7 +76,6 @@
#if defined(CONFIG_VIDEO)
#define CONFIG_VIDEO_DA8XX
#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_BMP_LOGO
#define DA8XX_LCD_CNTL_BASE LCD_CNTL_BASE
#define PWM_TICKS 0x1388

View file

@ -69,7 +69,6 @@
#if defined(CONFIG_VIDEO)
#define CONFIG_VIDEO_DA8XX
#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_BMP_LOGO
#define DA8XX_LCD_CNTL_BASE LCD_CNTL_BASE

View file

@ -121,8 +121,6 @@
* VIDEO
*/
#define CONFIG_VIDEO_LOGO
#ifdef CONFIG_VIDEO_LOGO
#ifdef CONFIG_SPLASH_SCREEN
#define SPLASH_FILE logo.bmp

View file

@ -32,7 +32,6 @@
#define CONFIG_MXC_USB_FLAGS 0
/* Framebuffer */
#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_BMP_LOGO
#define CONFIG_IMX_HDMI
#define CONFIG_IMX_VIDEO_SKIP

View file

@ -81,9 +81,14 @@
#define DISTRO_BOOTENV
#endif
#ifndef SPLASH_SETTINGS
#define SPLASH_SETTINGS
#endif
#define CONFIG_EXTRA_ENV_SETTINGS \
DISTRO_BOOTENV \
CONFIG_STD_DEVICES_SETTINGS \
SPLASH_SETTINGS \
"pciconfighost=1\0" \
"netdev=eth0\0" \
"consoledev=ttyS0\0" \

View file

@ -30,6 +30,7 @@ enum splash_storage {
SPLASH_STORAGE_MMC,
SPLASH_STORAGE_USB,
SPLASH_STORAGE_SATA,
SPLASH_STORAGE_VIRTIO,
};
enum splash_flags {

View file

@ -30,12 +30,14 @@ struct udevice;
* @base: Base address of frame buffer, 0 if not yet known
* @copy_base: Base address of a hardware copy of the frame buffer. See
* CONFIG_VIDEO_COPY.
* @hide_logo: Hide the logo (used for testing)
*/
struct video_uc_plat {
uint align;
uint size;
ulong base;
ulong copy_base;
bool hide_logo;
};
enum video_polarity {
@ -93,7 +95,6 @@ enum video_format {
* @colour_bg: Background colour (pixel value)
* @flush_dcache: true to enable flushing of the data cache after
* the LCD is updated
* @cmap: Colour map for 8-bit-per-pixel displays
* @fg_col_idx: Foreground color code (bit 3 = bold, bit 0-2 = color)
* @bg_col_idx: Background color code (bit 3 = bold, bit 0-2 = color)
*/
@ -118,7 +119,6 @@ struct video_priv {
u32 colour_fg;
u32 colour_bg;
bool flush_dcache;
ushort *cmap;
u8 fg_col_idx;
u8 bg_col_idx;
};

View file

@ -20,6 +20,7 @@
#ifndef __VIRTIO_H__
#define __VIRTIO_H__
#include <virtio_types.h>
#include <linux/bitops.h>
#include <linux/bug.h>
#define VIRTIO_ID_NET 1 /* virtio net */

Some files were not shown because too many files have changed in this diff Show more