sandbox: sdl: Add an option to double the screen size
On high-DPI displays U-Boot's LCD window can look very small. Add a -K flag to expand it to make things easier to read, while still using the existing resolution internally. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Anatolij Gustschin <agust@denx.de>
This commit is contained in:
@@ -30,6 +30,8 @@ struct buf_info {
|
||||
*
|
||||
* @width: Width of simulated LCD display
|
||||
* @height: Height of simulated LCD display
|
||||
* @vis_width: Visible width (may be larger to allow for scaling up)
|
||||
* @vis_height: Visible height (may be larger to allow for scaling up)
|
||||
* @depth: Depth of the display in bits per pixel (16 or 32)
|
||||
* @pitch: Number of bytes per line of the display
|
||||
* @sample_rate: Current sample rate for audio
|
||||
@@ -46,6 +48,8 @@ struct buf_info {
|
||||
static struct sdl_info {
|
||||
int width;
|
||||
int height;
|
||||
int vis_width;
|
||||
int vis_height;
|
||||
int depth;
|
||||
int pitch;
|
||||
uint sample_rate;
|
||||
@@ -94,7 +98,8 @@ static int sandbox_sdl_ensure_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sandbox_sdl_init_display(int width, int height, int log2_bpp)
|
||||
int sandbox_sdl_init_display(int width, int height, int log2_bpp,
|
||||
bool double_size)
|
||||
{
|
||||
struct sandbox_state *state = state_get_current();
|
||||
int err;
|
||||
@@ -110,11 +115,19 @@ int sandbox_sdl_init_display(int width, int height, int log2_bpp)
|
||||
}
|
||||
sdl.width = width;
|
||||
sdl.height = height;
|
||||
if (double_size) {
|
||||
sdl.vis_width = sdl.width * 2;
|
||||
sdl.vis_height = sdl.height * 2;
|
||||
} else {
|
||||
sdl.vis_width = sdl.width;
|
||||
sdl.vis_height = sdl.height;
|
||||
}
|
||||
|
||||
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.width, sdl.height, 0);
|
||||
sdl.vis_width, sdl.vis_height, 0);
|
||||
if (!screen) {
|
||||
printf("Unable to initialise SDL screen: %s\n",
|
||||
SDL_GetError());
|
||||
|
||||
@@ -308,6 +308,16 @@ static int sandbox_cmdline_cb_show_lcd(struct sandbox_state *state,
|
||||
SANDBOX_CMDLINE_OPT_SHORT(show_lcd, 'l', 0,
|
||||
"Show the sandbox LCD display");
|
||||
|
||||
static int sandbox_cmdline_cb_double_lcd(struct sandbox_state *state,
|
||||
const char *arg)
|
||||
{
|
||||
state->double_lcd = true;
|
||||
|
||||
return 0;
|
||||
}
|
||||
SANDBOX_CMDLINE_OPT_SHORT(double_lcd, 'K', 0,
|
||||
"Double the LCD display size in each direction");
|
||||
|
||||
static const char *term_args[STATE_TERM_COUNT] = {
|
||||
"raw-with-sigs",
|
||||
"raw",
|
||||
|
||||
@@ -17,10 +17,13 @@
|
||||
* @height Window height in pixels
|
||||
* @log2_bpp: Log to base 2 of the number of bits per pixel. So a 32bpp
|
||||
* display will pass 5, since 2*5 = 32
|
||||
* @double_size: true to double the visible size in each direction for high-DPI
|
||||
* displays
|
||||
* @return 0 if OK, -ENODEV if no device, -EIO if SDL failed to initialize
|
||||
* and -EPERM if the video failed to come up.
|
||||
*/
|
||||
int sandbox_sdl_init_display(int width, int height, int log2_bpp);
|
||||
int sandbox_sdl_init_display(int width, int height, int log2_bpp,
|
||||
bool double_size);
|
||||
|
||||
/**
|
||||
* sandbox_sdl_sync() - Sync current U-Boot LCD frame buffer to SDL
|
||||
@@ -78,8 +81,8 @@ int sandbox_sdl_sound_stop(void);
|
||||
int sandbox_sdl_sound_init(int rate, int channels);
|
||||
|
||||
#else
|
||||
static inline int sandbox_sdl_init_display(int width, int height,
|
||||
int log2_bpp)
|
||||
static inline int sandbox_sdl_init_display(int width, int height, int log2_bpp,
|
||||
bool double_size)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@@ -83,6 +83,7 @@ struct sandbox_state {
|
||||
bool write_state; /* Write sandbox state on exit */
|
||||
bool ignore_missing_state_on_read; /* No error if state missing */
|
||||
bool show_lcd; /* Show LCD on start-up */
|
||||
bool double_lcd; /* Double display size for high-DPI */
|
||||
enum sysreset_t last_sysreset; /* Last system reset type */
|
||||
bool sysreset_allowed[SYSRESET_COUNT]; /* Allowed system reset types */
|
||||
enum state_terminal_raw term_raw; /* Terminal raw/cooked */
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <fdtdec.h>
|
||||
#include <video.h>
|
||||
#include <asm/sdl.h>
|
||||
#include <asm/state.h>
|
||||
#include <asm/u-boot-sandbox.h>
|
||||
#include <dm/test.h>
|
||||
|
||||
@@ -23,9 +24,11 @@ static int sandbox_sdl_probe(struct udevice *dev)
|
||||
{
|
||||
struct sandbox_sdl_plat *plat = dev_get_platdata(dev);
|
||||
struct video_priv *uc_priv = dev_get_uclass_priv(dev);
|
||||
struct sandbox_state *state = state_get_current();
|
||||
int ret;
|
||||
|
||||
ret = sandbox_sdl_init_display(plat->xres, plat->yres, plat->bpix);
|
||||
ret = sandbox_sdl_init_display(plat->xres, plat->yres, plat->bpix,
|
||||
state->double_lcd);
|
||||
if (ret) {
|
||||
puts("LCD init failed\n");
|
||||
return ret;
|
||||
|
||||
Reference in New Issue
Block a user