mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-25 06:46:00 +00:00
api: export LCD device to external apps
This patch exports LCD info-query and bitmap-rendering functions to external apps. This patch is tested on a Seaboard. Because the LCD driver is not yet upstreamed, the test was done in a local downstream repo. Signed-off-by: Che-Liang Chiou <clchiou@chromium.org>
This commit is contained in:
parent
d3983ee853
commit
a2a5729fc1
8 changed files with 210 additions and 1 deletions
|
@ -24,7 +24,8 @@ include $(TOPDIR)/config.mk
|
||||||
|
|
||||||
LIB = $(obj)libapi.o
|
LIB = $(obj)libapi.o
|
||||||
|
|
||||||
COBJS-$(CONFIG_API) += api.o api_net.o api_storage.o api_platform-$(ARCH).o
|
COBJS-$(CONFIG_API) += api.o api_display.o api_net.o api_storage.o \
|
||||||
|
api_platform-$(ARCH).o
|
||||||
|
|
||||||
COBJS := $(COBJS-y)
|
COBJS := $(COBJS-y)
|
||||||
SRCS := $(COBJS:.o=.c)
|
SRCS := $(COBJS:.o=.c)
|
||||||
|
|
47
api/api.c
47
api/api.c
|
@ -553,6 +553,50 @@ static int API_env_enum(va_list ap)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* pseudo signature:
|
||||||
|
*
|
||||||
|
* int API_display_get_info(int type, struct display_info *di)
|
||||||
|
*/
|
||||||
|
static int API_display_get_info(va_list ap)
|
||||||
|
{
|
||||||
|
int type;
|
||||||
|
struct display_info *di;
|
||||||
|
|
||||||
|
type = va_arg(ap, int);
|
||||||
|
di = va_arg(ap, struct display_info *);
|
||||||
|
|
||||||
|
return display_get_info(type, di);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* pseudo signature:
|
||||||
|
*
|
||||||
|
* int API_display_draw_bitmap(ulong bitmap, int x, int y)
|
||||||
|
*/
|
||||||
|
static int API_display_draw_bitmap(va_list ap)
|
||||||
|
{
|
||||||
|
ulong bitmap;
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
bitmap = va_arg(ap, ulong);
|
||||||
|
x = va_arg(ap, int);
|
||||||
|
y = va_arg(ap, int);
|
||||||
|
|
||||||
|
return display_draw_bitmap(bitmap, x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* pseudo signature:
|
||||||
|
*
|
||||||
|
* void API_display_clear(void)
|
||||||
|
*/
|
||||||
|
static int API_display_clear(va_list ap)
|
||||||
|
{
|
||||||
|
display_clear();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static cfp_t calls_table[API_MAXCALL] = { NULL, };
|
static cfp_t calls_table[API_MAXCALL] = { NULL, };
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -616,6 +660,9 @@ void api_init(void)
|
||||||
calls_table[API_ENV_GET] = &API_env_get;
|
calls_table[API_ENV_GET] = &API_env_get;
|
||||||
calls_table[API_ENV_SET] = &API_env_set;
|
calls_table[API_ENV_SET] = &API_env_set;
|
||||||
calls_table[API_ENV_ENUM] = &API_env_enum;
|
calls_table[API_ENV_ENUM] = &API_env_enum;
|
||||||
|
calls_table[API_DISPLAY_GET_INFO] = &API_display_get_info;
|
||||||
|
calls_table[API_DISPLAY_DRAW_BITMAP] = &API_display_draw_bitmap;
|
||||||
|
calls_table[API_DISPLAY_CLEAR] = &API_display_clear;
|
||||||
calls_no = API_MAXCALL;
|
calls_no = API_MAXCALL;
|
||||||
|
|
||||||
debugf("API initialized with %d calls\n", calls_no);
|
debugf("API initialized with %d calls\n", calls_no);
|
||||||
|
|
74
api/api_display.c
Normal file
74
api/api_display.c
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2011 The Chromium OS Authors.
|
||||||
|
* See file CREDITS for list of people who contributed to this
|
||||||
|
* project.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||||
|
* MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
#include <api_public.h>
|
||||||
|
#include <lcd.h>
|
||||||
|
#include <video_font.h> /* Get font width and height */
|
||||||
|
|
||||||
|
/* lcd.h needs BMP_LOGO_HEIGHT to calculate CONSOLE_ROWS */
|
||||||
|
#if defined(CONFIG_LCD_LOGO) && !defined(CONFIG_LCD_INFO_BELOW_LOGO)
|
||||||
|
#include <bmp_logo.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* TODO(clchiou): add support of video device */
|
||||||
|
|
||||||
|
int display_get_info(int type, struct display_info *di)
|
||||||
|
{
|
||||||
|
if (!di)
|
||||||
|
return API_EINVAL;
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
default:
|
||||||
|
debug("%s: unsupport display device type: %d\n",
|
||||||
|
__FILE__, type);
|
||||||
|
return API_ENODEV;
|
||||||
|
#ifdef CONFIG_LCD
|
||||||
|
case DISPLAY_TYPE_LCD:
|
||||||
|
di->pixel_width = panel_info.vl_col;
|
||||||
|
di->pixel_height = panel_info.vl_row;
|
||||||
|
di->screen_rows = CONSOLE_ROWS;
|
||||||
|
di->screen_cols = CONSOLE_COLS;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
di->type = type;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int display_draw_bitmap(ulong bitmap, int x, int y)
|
||||||
|
{
|
||||||
|
if (!bitmap)
|
||||||
|
return API_EINVAL;
|
||||||
|
#ifdef CONFIG_LCD
|
||||||
|
return lcd_display_bitmap(bitmap, x, y);
|
||||||
|
#else
|
||||||
|
return API_ENODEV;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void display_clear(void)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_LCD
|
||||||
|
lcd_clear();
|
||||||
|
#endif
|
||||||
|
}
|
|
@ -45,4 +45,8 @@ int dev_write_net(void *, void *, int);
|
||||||
|
|
||||||
void dev_stor_init(void);
|
void dev_stor_init(void);
|
||||||
|
|
||||||
|
int display_get_info(int type, struct display_info *di);
|
||||||
|
int display_draw_bitmap(ulong bitmap, int x, int y);
|
||||||
|
void display_clear(void);
|
||||||
|
|
||||||
#endif /* _API_PRIVATE_H_ */
|
#endif /* _API_PRIVATE_H_ */
|
||||||
|
|
|
@ -48,6 +48,7 @@ int main(int argc, char * const argv[])
|
||||||
ulong start, now;
|
ulong start, now;
|
||||||
struct device_info *di;
|
struct device_info *di;
|
||||||
lbasize_t rlen;
|
lbasize_t rlen;
|
||||||
|
struct display_info disinfo;
|
||||||
|
|
||||||
if (!api_search_sig(&sig))
|
if (!api_search_sig(&sig))
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -176,6 +177,36 @@ int main(int argc, char * const argv[])
|
||||||
while ((env = ub_env_enum(env)) != NULL)
|
while ((env = ub_env_enum(env)) != NULL)
|
||||||
printf("%s = %s\n", env, ub_env_get(env));
|
printf("%s = %s\n", env, ub_env_get(env));
|
||||||
|
|
||||||
|
printf("\n*** Display ***\n");
|
||||||
|
|
||||||
|
if (ub_display_get_info(DISPLAY_TYPE_LCD, &disinfo)) {
|
||||||
|
printf("LCD info: failed\n");
|
||||||
|
} else {
|
||||||
|
printf("LCD info:\n");
|
||||||
|
printf(" pixel width: %d\n", disinfo.pixel_width);
|
||||||
|
printf(" pixel height: %d\n", disinfo.pixel_height);
|
||||||
|
printf(" screen rows: %d\n", disinfo.screen_rows);
|
||||||
|
printf(" screen cols: %d\n", disinfo.screen_cols);
|
||||||
|
}
|
||||||
|
if (ub_display_get_info(DISPLAY_TYPE_VIDEO, &disinfo)) {
|
||||||
|
printf("video info: failed\n");
|
||||||
|
} else {
|
||||||
|
printf("video info:\n");
|
||||||
|
printf(" pixel width: %d\n", disinfo.pixel_width);
|
||||||
|
printf(" pixel height: %d\n", disinfo.pixel_height);
|
||||||
|
printf(" screen rows: %d\n", disinfo.screen_rows);
|
||||||
|
printf(" screen cols: %d\n", disinfo.screen_cols);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("*** Press any key to continue ***\n");
|
||||||
|
printf("got char 0x%x\n", ub_getc());
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This only clears messages on screen, not on serial port. It is
|
||||||
|
* equivalent to a no-op if no display is available.
|
||||||
|
*/
|
||||||
|
ub_display_clear();
|
||||||
|
|
||||||
/* reset */
|
/* reset */
|
||||||
printf("\n*** Resetting board ***\n");
|
printf("\n*** Resetting board ***\n");
|
||||||
ub_reset();
|
ub_reset();
|
||||||
|
|
|
@ -402,3 +402,34 @@ const char * ub_env_enum(const char *last)
|
||||||
|
|
||||||
return env_name;
|
return env_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************
|
||||||
|
*
|
||||||
|
* display
|
||||||
|
*
|
||||||
|
****************************************/
|
||||||
|
|
||||||
|
int ub_display_get_info(int type, struct display_info *di)
|
||||||
|
{
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
|
if (!syscall(API_DISPLAY_GET_INFO, &err, (uint32_t)type, (uint32_t)di))
|
||||||
|
return API_ESYSC;
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ub_display_draw_bitmap(ulong bitmap, int x, int y)
|
||||||
|
{
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
|
if (!syscall(API_DISPLAY_DRAW_BITMAP, &err, bitmap, x, y))
|
||||||
|
return API_ESYSC;
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ub_display_clear(void)
|
||||||
|
{
|
||||||
|
syscall(API_DISPLAY_CLEAR, NULL);
|
||||||
|
}
|
||||||
|
|
|
@ -77,4 +77,9 @@ int ub_dev_send(int handle, void *buf, int len);
|
||||||
int ub_dev_recv(int handle, void *buf, int len, int *rlen);
|
int ub_dev_recv(int handle, void *buf, int len, int *rlen);
|
||||||
struct device_info * ub_dev_get(int);
|
struct device_info * ub_dev_get(int);
|
||||||
|
|
||||||
|
/* display */
|
||||||
|
int ub_display_get_info(int type, struct display_info *di);
|
||||||
|
int ub_display_draw_bitmap(ulong bitmap, int x, int y);
|
||||||
|
void ub_display_clear(void);
|
||||||
|
|
||||||
#endif /* _API_GLUE_H_ */
|
#endif /* _API_GLUE_H_ */
|
||||||
|
|
|
@ -90,6 +90,9 @@ enum {
|
||||||
API_ENV_ENUM,
|
API_ENV_ENUM,
|
||||||
API_ENV_GET,
|
API_ENV_GET,
|
||||||
API_ENV_SET,
|
API_ENV_SET,
|
||||||
|
API_DISPLAY_GET_INFO,
|
||||||
|
API_DISPLAY_DRAW_BITMAP,
|
||||||
|
API_DISPLAY_CLEAR,
|
||||||
API_MAXCALL
|
API_MAXCALL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -152,4 +155,17 @@ struct device_info {
|
||||||
int state;
|
int state;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define DISPLAY_TYPE_LCD 0x0001
|
||||||
|
#define DISPLAY_TYPE_VIDEO 0x0002
|
||||||
|
|
||||||
|
struct display_info {
|
||||||
|
int type;
|
||||||
|
/* screen size in pixels */
|
||||||
|
int pixel_width;
|
||||||
|
int pixel_height;
|
||||||
|
/* screen size in rows and columns of text */
|
||||||
|
int screen_rows;
|
||||||
|
int screen_cols;
|
||||||
|
};
|
||||||
|
|
||||||
#endif /* _API_PUBLIC_H_ */
|
#endif /* _API_PUBLIC_H_ */
|
||||||
|
|
Loading…
Add table
Reference in a new issue