diff options
| -rw-r--r-- | api/Makefile | 3 | ||||
| -rw-r--r-- | api/api.c | 47 | ||||
| -rw-r--r-- | api/api_display.c | 74 | ||||
| -rw-r--r-- | api/api_private.h | 4 | ||||
| -rw-r--r-- | examples/api/demo.c | 31 | ||||
| -rw-r--r-- | examples/api/glue.c | 31 | ||||
| -rw-r--r-- | examples/api/glue.h | 5 | ||||
| -rw-r--r-- | include/api_public.h | 16 | 
8 files changed, 210 insertions, 1 deletions
| diff --git a/api/Makefile b/api/Makefile index 2a64c4ddf..0e99f741b 100644 --- a/api/Makefile +++ b/api/Makefile @@ -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) @@ -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); diff --git a/api/api_display.c b/api/api_display.c new file mode 100644 index 000000000..643917088 --- /dev/null +++ b/api/api_display.c @@ -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 +} diff --git a/api/api_private.h b/api/api_private.h index 94a7fc509..988f70235 100644 --- a/api/api_private.h +++ b/api/api_private.h @@ -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_ */ diff --git a/examples/api/demo.c b/examples/api/demo.c index 65e749184..19d38f695 100644 --- a/examples/api/demo.c +++ b/examples/api/demo.c @@ -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(); diff --git a/examples/api/glue.c b/examples/api/glue.c index eff6a7e62..d907e3f28 100644 --- a/examples/api/glue.c +++ b/examples/api/glue.c @@ -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); +} diff --git a/examples/api/glue.h b/examples/api/glue.h index 6bf47d07c..e43f7d994 100644 --- a/examples/api/glue.h +++ b/examples/api/glue.h @@ -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_ */ diff --git a/include/api_public.h b/include/api_public.h index 5940d81fd..4420c990b 100644 --- a/include/api_public.h +++ b/include/api_public.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_ */ |