mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-24 21:54:01 +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
|
||||
|
||||
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)
|
||||
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;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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, };
|
||||
|
||||
/*
|
||||
|
@ -616,6 +660,9 @@ void api_init(void)
|
|||
calls_table[API_ENV_GET] = &API_env_get;
|
||||
calls_table[API_ENV_SET] = &API_env_set;
|
||||
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;
|
||||
|
||||
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);
|
||||
|
||||
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_ */
|
||||
|
|
|
@ -48,6 +48,7 @@ int main(int argc, char * const argv[])
|
|||
ulong start, now;
|
||||
struct device_info *di;
|
||||
lbasize_t rlen;
|
||||
struct display_info disinfo;
|
||||
|
||||
if (!api_search_sig(&sig))
|
||||
return -1;
|
||||
|
@ -176,6 +177,36 @@ int main(int argc, char * const argv[])
|
|||
while ((env = ub_env_enum(env)) != NULL)
|
||||
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 */
|
||||
printf("\n*** Resetting board ***\n");
|
||||
ub_reset();
|
||||
|
|
|
@ -402,3 +402,34 @@ const char * ub_env_enum(const char *last)
|
|||
|
||||
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);
|
||||
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_ */
|
||||
|
|
|
@ -90,6 +90,9 @@ enum {
|
|||
API_ENV_ENUM,
|
||||
API_ENV_GET,
|
||||
API_ENV_SET,
|
||||
API_DISPLAY_GET_INFO,
|
||||
API_DISPLAY_DRAW_BITMAP,
|
||||
API_DISPLAY_CLEAR,
|
||||
API_MAXCALL
|
||||
};
|
||||
|
||||
|
@ -152,4 +155,17 @@ struct device_info {
|
|||
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_ */
|
||||
|
|
Loading…
Reference in a new issue