diff --git a/halext/drivers/gdispNokia6610/gdisp_lld.c b/halext/drivers/gdispNokia6610/gdisp_lld.c index 93b6478b..1608c1f0 100644 --- a/halext/drivers/gdispNokia6610/gdisp_lld.c +++ b/halext/drivers/gdispNokia6610/gdisp_lld.c @@ -54,40 +54,6 @@ #error "gdispNokia6610: Either LCD_USE_GE8 or LCD_USE_GE12 must be defined depending on your controller" #endif -// mask definitions -#define BIT0 0x00000001 -#define BIT1 0x00000002 -#define BIT2 0x00000004 -#define BIT3 0x00000008 -#define BIT4 0x00000010 -#define BIT5 0x00000020 -#define BIT6 0x00000040 -#define BIT7 0x00000080 -#define BIT8 0x00000100 -#define BIT9 0x00000200 -#define BIT10 0x00000400 -#define BIT11 0x00000800 -#define BIT12 0x00001000 -#define BIT13 0x00002000 -#define BIT14 0x00004000 -#define BIT15 0x00008000 -#define BIT16 0x00010000 -#define BIT17 0x00020000 -#define BIT18 0x00040000 -#define BIT19 0x00080000 -#define BIT20 0x00100000 -#define BIT21 0x00200000 -#define BIT22 0x00400000 -#define BIT23 0x00800000 -#define BIT24 0x01000000 -#define BIT25 0x02000000 -#define BIT26 0x04000000 -#define BIT27 0x08000000 -#define BIT28 0x10000000 -#define BIT29 0x20000000 -#define BIT30 0x40000000 -#define BIT31 0x80000000 - /*===========================================================================*/ /* Driver exported variables. */ /*===========================================================================*/ @@ -347,87 +313,6 @@ void gdisp_lld_drawpixel(coord_t x, coord_t y, color_t color) { gdisp_lld_fillarea() and gdisp_lld_blitarea(). */ -#if GDISP_HARDWARE_POWERCONTROL || defined(__DOXYGEN__) - /** - * @brief Sets the power mode for the graphic device. - * @note The power modes are powerOn, powerSleep and powerOff. - * If powerSleep is not supported it is equivalent to powerOn. - * - * @param[in] powerMode The new power mode - * - * @notapi - */ - void gdisp_lld_setpowermode(gdisp_powermode_t powerMode) { - /* NOT IMPLEMENTED YET */ - if (GDISP.Powermode == powerMode) - return; - - switch(powerMode) { - case powerOff: - /* Code here */ - break; - case powerOn: - /* Code here */ - /* You may need this --- - if (GDISP.Powermode != powerSleep) - gdisp_lld_init(); - */ - break; - case powerSleep: - /* Code here */ - break; - default: - return; - } - - GDISP.Powermode = powerMode; - } -#endif - -#if GDISP_HARDWARE_ORIENTATION || defined(__DOXYGEN__) - /** - * @brief Sets the orientation of the display. - * @note This may be ignored if not supported by the device. - * - * @param[in] newOrientation The new orientation - * - * @notapi - */ - void gdisp_lld_setorientation(gdisp_orientation_t newOrientation) { - /* NOT IMPLEMENTED YET */ - if (GDISP.Orientation == newOrientation) - return; - -// WriteSpiData(0x48); // no mirror Y (temporary to satisfy Olimex bmptoarray utility) -// WriteSpiData(0xC8); // restore to (mirror x and y, reverse rgb) - switch(newOrientation) { - case portrait: - /* Code here */ - GDISP.Height = SCREEN_HEIGHT; - GDISP.Width = SCREEN_WIDTH; - break; - case landscape: - /* Code here */ - GDISP.Height = SCREEN_WIDTH; - GDISP.Width = SCREEN_HEIGHT; - break; - case portraitInv: - /* Code here */ - GDISP.Height = SCREEN_HEIGHT; - GDISP.Width = SCREEN_WIDTH; - break; - case landscapeInv: - /* Code here */ - GDISP.Height = SCREEN_WIDTH; - GDISP.Width = SCREEN_HEIGHT; - break; - default: - return; - } - GDISP.Orientation = newOrientation; - } -#endif - #if GDISP_HARDWARE_CLEARS || defined(__DOXYGEN__) /** * @brief Clear the display. @@ -461,23 +346,6 @@ void gdisp_lld_drawpixel(coord_t x, coord_t y, color_t color) { } #endif -#if GDISP_HARDWARE_BOX || defined(__DOXYGEN__) - /** - * @brief Draw a box. - * @pre The GDISP unit must be in powerOn or powerSleep mode. - * - * @param[in] x0,y0 The start position - * @param[in] cx,cy The size of the box (outside dimensions) - * @param[in] color The color to use - * @param[in] filled Should the box should be filled - * - * @notapi - */ - void gdisp_lld_drawbox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) { - /* NOT IMPLEMENTED */ - } -#endif - #if GDISP_HARDWARE_FILLS || defined(__DOXYGEN__) /** * @brief Fill an area with a color. @@ -713,5 +581,89 @@ void gdisp_lld_drawpixel(coord_t x, coord_t y, color_t color) { } #endif +#if GDISP_HARDWARE_CONTROL || defined(__DOXYGEN__) + /** + * @brief Driver Control + * @detail Unsupported control codes are ignored. + * @note The value parameter should always be typecast to (void *). + * @note There are some predefined and some specific to the low level driver. + * @note GDISP_CONTROL_POWER - Takes a gdisp_powermode_t + * GDISP_CONTROL_ORIENTATION - Takes a gdisp_orientation_t + * GDISP_CONTROL_BACKLIGHT - Takes an int from 0 to 100. For a driver + * that only supports off/on anything other + * than zero is on. + * GDISP_CONTROL_CONTRAST - Takes an int from 0 to 100. + * GDISP_CONTROL_LLD - Low level driver control constants start at + * this value. + * + * @param[in] what What to do. + * @param[in] value The value to use (always cast to a void *). + * + * @notapi + */ + void gdisp_lld_control(int what, void *value) { + /* NOT IMPLEMENTED YET */ + switch(what) { + case GDISP_CONTROL_POWER: + if (GDISP.Powermode == (gdisp_powermode_t)value) + return; + switch((gdisp_powermode_t)value) { + case powerOff: + /* Code here */ + break; + case powerOn: + /* Code here */ + /* You may need this --- + if (GDISP.Powermode != powerSleep) + gdisp_lld_init(); + */ + break; + case powerSleep: + /* Code here */ + break; + default: + return; + } + GDISP.Powermode = (gdisp_powermode_t)value; + return; + case GDISP_CONTROL_ORIENTATION: + if (GDISP.Orientation == (gdisp_orientation_t)value) + return; + // WriteSpiData(0x48); // no mirror Y (temporary to satisfy Olimex bmptoarray utility) + // WriteSpiData(0xC8); // restore to (mirror x and y, reverse rgb) + switch((gdisp_orientation_t)value) { + case portrait: + /* Code here */ + GDISP.Height = SCREEN_HEIGHT; + GDISP.Width = SCREEN_WIDTH; + break; + case landscape: + /* Code here */ + GDISP.Height = SCREEN_WIDTH; + GDISP.Width = SCREEN_HEIGHT; + break; + case portraitInv: + /* Code here */ + GDISP.Height = SCREEN_HEIGHT; + GDISP.Width = SCREEN_WIDTH; + break; + case landscapeInv: + /* Code here */ + GDISP.Height = SCREEN_WIDTH; + GDISP.Width = SCREEN_HEIGHT; + break; + default: + return; + } + GDISP.Orientation = (gdisp_orientation_t)value; + return; +/* + case GDISP_CONTROL_BACKLIGHT: + case GDISP_CONTROL_CONTRAST: +*/ + } + } +#endif + #endif /* HAL_USE_GDISP */ /** @} */ diff --git a/halext/drivers/gdispNokia6610/gdisp_lld.h b/halext/drivers/gdispNokia6610/gdisp_lld.h deleted file mode 100644 index 618c8490..00000000 --- a/halext/drivers/gdispNokia6610/gdisp_lld.h +++ /dev/null @@ -1,166 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. - - This file is part of ChibiOS/RT. - - ChibiOS/RT 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 3 of the License, or - (at your option) any later version. - - ChibiOS/RT 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, see . - - --- - - A special exception to the GPL can be applied should you wish to distribute - a combined work that includes ChibiOS/RT, without being obliged to provide - the source code for any proprietary components. See the file exception.txt - for full details of how and when the exception can be applied. -*/ -/* - Concepts and parts of this file have been contributed by: - Joel Bodenmann aka Tectu -> Maintainer - Andrew Hannam aka inmarket -> framework - Badger -> console implementation and FSMC - Abhishek -> font rendering - Ben William -> fastMath and lcdDrawEllipse() - Dongxu Li aka dxli -> lcdDrawEllipse() filled option -*/ - -/** - * @file gdispNokia6610/gdisp_lld.h - * @brief GDISP Graphic Driver subsystem low level driver header for the Nokia6610 display. - * - * @addtogroup GDISP - * @{ - */ - -#ifndef _GDISP_LLD_H -#define _GDISP_LLD_H - -#if HAL_USE_GDISP || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Structure representing a GDISP driver. - * @note Implementations may extend this structure to contain more, - * architecture dependent, fields. - */ -struct GDISPDriver { - /** - * @brief Width of the screen. - * @note Read-only. - */ - coord_t Width; - /** - * @brief Height of the screen. - * @note Read-only. - */ - coord_t Height; - /** - * @brief Current orientation of the screen. - * @note Read-only. - */ - gdisp_orientation_t Orientation; - /** - * @brief Current power mode of the screen. - * @note Read-only. - */ - gdisp_powermode_t Powermode; - - #if defined(GDISP_DRIVER_EXT_FIELDS) - GDISP_DRIVER_EXT_FIELDS - #endif - /* End of mandatory fields */ -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(__DOXYGEN__) - extern GDISPDriver GDISP; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - - /* Core functions */ - void gdisp_lld_init(void); - void gdisp_lld_setpowermode(gdisp_powermode_t powerMode); - void gdisp_lld_setorientation(gdisp_orientation_t newOrientation); - - /* Some of these functions will be implemented in software by the high level driver - depending on the GDISP_HARDWARE_XXX macros defined in gdisp_lld_config.h. - */ - - /* Drawing functions */ - void gdisp_lld_clear(color_t color); - void gdisp_lld_drawpixel(coord_t x, coord_t y, color_t color); - void gdisp_lld_drawline(coord_t x0, coord_t y0, coord_t x1, coord_t y1, color_t color); - void gdisp_lld_drawbox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color); - void gdisp_lld_fillarea(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color); - void gdisp_lld_blitarea(coord_t x, coord_t y, coord_t cx, coord_t cy, pixel_t *buffer); - - /* Circular Drawing Functions */ - #if GDISP_NEED_CIRCLE - void gdisp_lld_drawcircle(coord_t x, coord_t y, coord_t radius, color_t color); - void gdisp_lld_fillcircle(coord_t x, coord_t y, coord_t radius, color_t color); - #endif - - #if GDISP_NEED_ELLIPSE - void gdisp_lld_drawellipse(coord_t x, coord_t y, coord_t a, coord_t b, color_t color); - void gdisp_lld_fillellipse(coord_t x, coord_t y, coord_t a, coord_t b, color_t color); - #endif - - /* Text Rendering Functions */ - #if GDISP_NEED_TEXT - void gdisp_lld_drawchar(coord_t x, coord_t y, char c, font_t font, color_t color); - void gdisp_lld_fillchar(coord_t x, coord_t y, char c, font_t font, color_t color, color_t bgcolor); - #endif - - /* Pixel readback */ - #if GDISP_NEED_PIXELREAD - color_t gdisp_lld_getpixelcolor(coord_t x, coord_t y); - #endif - - /* Scrolling Function - clears the area scrolled out */ - #if GDISP_NEED_SCROLL - void gdisp_lld_verticalscroll(coord_t x, coord_t y, coord_t cx, coord_t cy, int lines, color_t bgcolor); - #endif - -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_GDISP */ - -#endif /* _GDISP_LLD_H */ -/** @} */ diff --git a/halext/drivers/gdispNokia6610/gdisp_lld_board_olimexsam7ex256.h b/halext/drivers/gdispNokia6610/gdisp_lld_board_olimexsam7ex256.h index 6d83d1c0..e2a8c1d7 100644 --- a/halext/drivers/gdispNokia6610/gdisp_lld_board_olimexsam7ex256.h +++ b/halext/drivers/gdispNokia6610/gdisp_lld_board_olimexsam7ex256.h @@ -29,6 +29,40 @@ #ifndef _GDISP_LLD_BOARD_H #define _GDISP_LLD_BOARD_H +// mask definitions +#define BIT0 0x00000001 +#define BIT1 0x00000002 +#define BIT2 0x00000004 +#define BIT3 0x00000008 +#define BIT4 0x00000010 +#define BIT5 0x00000020 +#define BIT6 0x00000040 +#define BIT7 0x00000080 +#define BIT8 0x00000100 +#define BIT9 0x00000200 +#define BIT10 0x00000400 +#define BIT11 0x00000800 +#define BIT12 0x00001000 +#define BIT13 0x00002000 +#define BIT14 0x00004000 +#define BIT15 0x00008000 +#define BIT16 0x00010000 +#define BIT17 0x00020000 +#define BIT18 0x00040000 +#define BIT19 0x00080000 +#define BIT20 0x00100000 +#define BIT21 0x00200000 +#define BIT22 0x00400000 +#define BIT23 0x00800000 +#define BIT24 0x01000000 +#define BIT25 0x02000000 +#define BIT26 0x04000000 +#define BIT27 0x08000000 +#define BIT28 0x10000000 +#define BIT29 0x20000000 +#define BIT30 0x40000000 +#define BIT31 0x80000000 + // ****************************************************** // Pointers to AT91SAM7X256 peripheral data structures // ****************************************************** diff --git a/halext/drivers/gdispNokia6610/gdisp_lld_config.h b/halext/drivers/gdispNokia6610/gdisp_lld_config.h index 713dabc8..fafda6c3 100644 --- a/halext/drivers/gdispNokia6610/gdisp_lld_config.h +++ b/halext/drivers/gdispNokia6610/gdisp_lld_config.h @@ -29,178 +29,40 @@ #ifndef _GDISP_LLD_CONFIG_H #define _GDISP_LLD_CONFIG_H -#if HAL_USE_GDISP || defined(__DOXYGEN__) +#if HAL_USE_GDISP /*===========================================================================*/ -/* Driver pre-compile time settings. */ +/* Driver hardware support. */ /*===========================================================================*/ -/** - * @name GDISP hardware accelerated support - * @{ - */ - /** - * @brief Hardware supports changing the orientation. - * @details If set to @p FALSE a software stubb is provided. - */ - #define GDISP_HARDWARE_ORIENTATION FALSE +#define GDISP_HARDWARE_LINES FALSE +#define GDISP_HARDWARE_CLEARS FALSE +#define GDISP_HARDWARE_FILLS TRUE +#define GDISP_HARDWARE_BITFILLS TRUE +#define GDISP_HARDWARE_CIRCLES FALSE +#define GDISP_HARDWARE_CIRCLEFILLS FALSE +#define GDISP_HARDWARE_ELLIPSES FALSE +#define GDISP_HARDWARE_ELLIPSEFILLS FALSE +#define GDISP_HARDWARE_TEXT FALSE +#define GDISP_HARDWARE_TEXTFILLS FALSE +#define GDISP_HARDWARE_SCROLL FALSE +#define GDISP_HARDWARE_PIXELREAD FALSE +#define GDISP_HARDWARE_CONTROL FALSE - /** - * @brief Hardware supports power control. - * @details If set to @p FALSE a software stubb is provided. - */ - #define GDISP_HARDWARE_POWERCONTROL FALSE +#define GDISP_SOFTWARE_TEXTFILLDRAW TRUE +#define GDISP_SOFTWARE_TEXTBLITCOLUMN FALSE - /** - * @brief Hardware accelerated line drawing. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_LINES FALSE +#define GDISP_PIXELFORMAT_RGB444 +#define GDISP_PACKED_PIXELS FALSE +#define GDISP_PACKED_LINES FALSE - /** - * @brief Hardware accelerated box drawing. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_BOX FALSE +/*===========================================================================*/ +/* Extra fields for the GDISPDriver structure */ +/*===========================================================================*/ - /** - * @brief Hardware accelerated screen clears. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_CLEARS FALSE - - /** - * @brief Hardware accelerated rectangular fills. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_FILLS TRUE - - /** - * @brief Hardware accelerated fills from an image. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_BITFILLS TRUE - - /** - * @brief Hardware accelerated circles. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_CIRCLES FALSE - - /** - * @brief Hardware accelerated filled circles. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_CIRCLEFILLS FALSE - - /** - * @brief Hardware accelerated ellipses. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_ELLIPSES FALSE - - /** - * @brief Hardware accelerated filled ellipses. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_ELLIPSEFILLS FALSE - - /** - * @brief Hardware accelerated text drawing. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_TEXT FALSE - - /** - * @brief Hardware accelerated text drawing with a filled background. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_TEXTFILLS FALSE - - /** - * @brief Hardware accelerated scrolling. - * @details If set to @p FALSE there is no support for scrolling. - */ - #define GDISP_HARDWARE_SCROLL FALSE - - /** - * @brief Reading back of pixel values. - * @details If set to @p FALSE there is no support for pixel read-back. - */ - #define GDISP_HARDWARE_PIXELREAD FALSE -/** @} */ - -/** - * @name GDISP software algorithm choices - * @{ - */ - /** - * @brief For filled text drawing, use a background fill and then draw - * the text instead of using a blit or direct pixel drawing. - * @details If set to @p TRUE background fill and then text draw is used. - * @note This is ignored if hardware accelerated text is supported. - */ - #define GDISP_SOFTWARE_TEXTFILLDRAW TRUE - /** - * @brief For filled text drawing, when using a bitmap blit - * use a column by column buffer rather than a full character - * buffer to save memory at a small performance cost. - * @details If set to @p TRUE background fill one character column at a time. - * @note This is ignored if software text using blit is not being used. - */ - #define GDISP_SOFTWARE_TEXTBLITCOLUMN FALSE -/** @} */ - -/** - * @name GDISP pixel format choices - * @{ - */ - /** - * @brief The native pixel format for this device - * @note One of the following should be defined: - * GDISP_PIXELFORMAT_RGB565 - * GDISP_PIXELFORMAT_RGB888 - * GDISP_PIXELFORMAT_RGB444 - * GDISP_PIXELFORMAT_RGB332 - * GDISP_PIXELFORMAT_RGB666 - * GDISP_PIXELFORMAT_CUSTOM - * @note If you define GDISP_PIXELFORMAT_CUSTOM you need to also define - * color_t, RGB2COLOR(r,g,b), HTML2COLOR(h), - * RED_OF(c), GREEN_OF(c), BLUE_OF(c), - * COLOR(c) and MASKCOLOR. - */ - #define GDISP_PIXELFORMAT_RGB444 - - /** - * @brief Do pixels require packing for a blit - * @note Is only valid for a pixel format that doesn't fill it's datatype. ie formats: - * GDISP_PIXELFORMAT_RGB888 - * GDISP_PIXELFORMAT_RGB444 - * GDISP_PIXELFORMAT_RGB666 - * GDISP_PIXELFORMAT_CUSTOM - * @note If you use GDISP_PIXELFORMAT_CUSTOM and packed bit fills - * you need to also define @P gdispPackPixels(buf,cx,x,y,c) - * @note If you are using GDISP_HARDWARE_BITFILLS = FALSE then the pixel - * format must not be a packed format as the software blit does - * not support packed pixels - * @note Very few cases should actually require packed pixels as the low - * level driver can also pack on the fly as it is sending it - * to the graphics device. - */ - #define GDISP_PACKED_PIXELS FALSE - - /** - * @brief Do lines of pixels require packing for a blit - * @note Ignored if GDISP_PACKED_PIXELS is FALSE - */ - #define GDISP_PACKED_LINES FALSE - - /** - * @brief Do lines of pixels require packing for a blit - * @note Ignored if GDISP_PACKED_PIXELS is FALSE - */ - #define GDISP_PACKED_LINES FALSE -/** @} */ +/* +#define GDISP_DRIVER_EXT_FIELDS int abc; int def; +*/ #endif /* HAL_USE_GDISP */ diff --git a/halext/drivers/gdispS6d1121/gdisp_lld.c b/halext/drivers/gdispS6d1121/gdisp_lld.c index fd7339c2..dfac4e82 100644 --- a/halext/drivers/gdispS6d1121/gdisp_lld.c +++ b/halext/drivers/gdispS6d1121/gdisp_lld.c @@ -244,87 +244,6 @@ void gdisp_lld_drawpixel(coord_t x, coord_t y, color_t color) { gdisp_lld_fillarea() and gdisp_lld_blitarea(). */ -#if GDISP_HARDWARE_POWERCONTROL || defined(__DOXYGEN__) -/** - * @brief Sets the power mode for the graphic device. - * @note The power modes are powerOn, powerSleep and powerOff. - * If powerSleep is not supported it is equivalent to powerOn. - * - * @param[in] powerMode The new power mode - * - * @notapi - */ - void gdisp_lld_setpowermode(gdisp_powermode_t powerMode) { - if (GDISP.Powermode == powerMode) - return; - - switch(powerMode) { - case powerOff: - /* Code here */ - break; - case powerOn: - /* Code here */ - /* You may need this --- - if (GDISP.Powermode != powerSleep) - gdisp_lld_init(); - */ - break; - case powerSleep: - /* Code here */ - break; - default: - return; - } - - GDISP.Powermode = powerMode; - } -#endif - -#if GDISP_HARDWARE_ORIENTATION || defined(__DOXYGEN__) - /** - * @brief Sets the orientation of the display. - * @note This may be ignored if not supported by the device. - * - * @param[in] newOrientation The new orientation - * - * @notapi - */ - void gdisp_lld_setorientation(gdisp_orientation_t newOrientation) { - if (GDISP.Orientation == newOrientation) - return; - - switch(newOrientation) { - case portrait: - lld_lcdWriteReg(0x0001,0x0127); - lld_lcdWriteReg(0x03, 0b0011); - GDISP.Height = SCREEN_HEIGHT; - GDISP.Width = SCREEN_WIDTH; - break; - case landscape: - lld_lcdWriteReg(0x0001,0x0027); - lld_lcdWriteReg(0x0003, 0b1011); - GDISP.Height = SCREEN_WIDTH; - GDISP.Width = SCREEN_HEIGHT; - break; - case portraitInv: - lld_lcdWriteReg(0x0001,0x0127); - lld_lcdWriteReg(0x0003, 0b0000); - GDISP.Height = SCREEN_HEIGHT; - GDISP.Width = SCREEN_WIDTH; - break; - case landscapeInv: - lld_lcdWriteReg(0x0001,0x0027); - lld_lcdWriteReg(0x0003, 0b1000); - GDISP.Height = SCREEN_WIDTH; - GDISP.Width = SCREEN_HEIGHT; - break; - default: - return; - } - GDISP.Orientation = newOrientation; - } -#endif - #if GDISP_HARDWARE_CLEARS || defined(__DOXYGEN__) /** * @brief Clear the display. @@ -366,26 +285,6 @@ void gdisp_lld_drawpixel(coord_t x, coord_t y, color_t color) { } #endif -#if GDISP_HARDWARE_BOX || defined(__DOXYGEN__) - /** - * @brief Draw a box. - * @pre The GDISP unit must be in powerOn or powerSleep mode. - * - * @param[in] x0,y0 The start position - * @param[in] cx,cy The size of the box (outside dimensions) - * @param[in] color The color to use - * @param[in] filled Should the box should be filled - * - * @notapi - */ - void gdisp_lld_drawbox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) { - #if GDISP_NEED_VALIDATION - /* Need to clip to screen */ - #endif - /* Code here */ - } -#endif - #if GDISP_HARDWARE_FILLS || defined(__DOXYGEN__) /** * @brief Fill an area with a color. @@ -675,5 +574,90 @@ void gdisp_lld_drawpixel(coord_t x, coord_t y, color_t color) { } #endif +#if GDISP_HARDWARE_CONTROL || defined(__DOXYGEN__) + /** + * @brief Driver Control + * @detail Unsupported control codes are ignored. + * @note The value parameter should always be typecast to (void *). + * @note There are some predefined and some specific to the low level driver. + * @note GDISP_CONTROL_POWER - Takes a gdisp_powermode_t + * GDISP_CONTROL_ORIENTATION - Takes a gdisp_orientation_t + * GDISP_CONTROL_BACKLIGHT - Takes an int from 0 to 100. For a driver + * that only supports off/on anything other + * than zero is on. + * GDISP_CONTROL_CONTRAST - Takes an int from 0 to 100. + * GDISP_CONTROL_LLD - Low level driver control constants start at + * this value. + * + * @param[in] what What to do. + * @param[in] value The value to use (always cast to a void *). + * + * @notapi + */ + void gdisp_lld_control(int what, void *value) { + switch(what) { + case GDISP_CONTROL_POWER: + if (GDISP.Powermode == (gdisp_powermode_t)value) + return; + switch((gdisp_powermode_t)value) { + case powerOff: + /* Code here */ + /* break; */ + case powerOn: + /* Code here */ + /* You may need this --- + if (GDISP.Powermode != powerSleep) + gdisp_lld_init(); + */ + /* break; */ + case powerSleep: + /* Code here */ + /* break; */ + default: + return; + } + GDISP.Powermode = (gdisp_powermode_t)value; + return; + case GDISP_CONTROL_ORIENTATION: + if (GDISP.Orientation == (gdisp_orientation_t)value) + return; + switch((gdisp_orientation_t)value) { + case portrait: + lld_lcdWriteReg(0x0001,0x0127); + lld_lcdWriteReg(0x03, 0b0011); + GDISP.Height = SCREEN_HEIGHT; + GDISP.Width = SCREEN_WIDTH; + break; + case landscape: + lld_lcdWriteReg(0x0001,0x0027); + lld_lcdWriteReg(0x0003, 0b1011); + GDISP.Height = SCREEN_WIDTH; + GDISP.Width = SCREEN_HEIGHT; + break; + case portraitInv: + lld_lcdWriteReg(0x0001,0x0127); + lld_lcdWriteReg(0x0003, 0b0000); + GDISP.Height = SCREEN_HEIGHT; + GDISP.Width = SCREEN_WIDTH; + break; + case landscapeInv: + lld_lcdWriteReg(0x0001,0x0027); + lld_lcdWriteReg(0x0003, 0b1000); + GDISP.Height = SCREEN_WIDTH; + GDISP.Width = SCREEN_HEIGHT; + break; + default: + return; + } + GDISP.Orientation = (gdisp_orientation_t)value; + return; +/* + case GDISP_CONTROL_BACKLIGHT: + case GDISP_CONTROL_CONTRAST: +*/ + } + } +#endif + #endif /* HAL_USE_GDISP */ /** @} */ diff --git a/halext/drivers/gdispS6d1121/gdisp_lld.h b/halext/drivers/gdispS6d1121/gdisp_lld.h deleted file mode 100644 index f32b3e47..00000000 --- a/halext/drivers/gdispS6d1121/gdisp_lld.h +++ /dev/null @@ -1,150 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2012 - Joel Bodenmann aka Tectu - - This file is part of ChibiOS-LCD-Driver. - - ChibiOS-LCD-Driver 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 3 of the License, or - (at your option) any later version. - - ChibiOS-LCD-Driver 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, see . -*/ - -/** - * @file templates/gdisp_lld.h - * @brief GDISP Graphic Driver subsystem low level driver header template. - * - * @addtogroup GDISP - * @{ - */ - -#ifndef _GDISP_LLD_H -#define _GDISP_LLD_H - -#if HAL_USE_GDISP || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Structure representing a GDISP driver. - * @note Implementations may extend this structure to contain more, - * architecture dependent, fields. - */ -struct GDISPDriver { - /** - * @brief Width of the screen. - * @note Read-only. - */ - coord_t Width; - /** - * @brief Height of the screen. - * @note Read-only. - */ - coord_t Height; - /** - * @brief Current orientation of the screen. - * @note Read-only. - */ - gdisp_orientation_t Orientation; - /** - * @brief Current power mode of the screen. - * @note Read-only. - */ - gdisp_powermode_t Powermode; - - #if defined(GDISP_DRIVER_EXT_FIELDS) - GDISP_DRIVER_EXT_FIELDS - #endif - /* End of mandatory fields */ -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(__DOXYGEN__) - extern GDISPDriver GDISP; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - - /* Core functions */ - void gdisp_lld_init(void); - void gdisp_lld_setpowermode(gdisp_powermode_t powerMode); - void gdisp_lld_setorientation(gdisp_orientation_t newOrientation); - - /* Some of these functions will be implemented in software by the high level driver - depending on the GDISP_HARDWARE_XXX macros defined in gdisp_lld_config.h. - */ - - /* Drawing functions */ - void gdisp_lld_clear(color_t color); - void gdisp_lld_drawpixel(coord_t x, coord_t y, color_t color); - void gdisp_lld_drawline(coord_t x0, coord_t y0, coord_t x1, coord_t y1, color_t color); - void gdisp_lld_drawbox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color); - void gdisp_lld_fillarea(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color); - void gdisp_lld_blitarea(coord_t x, coord_t y, coord_t cx, coord_t cy, pixel_t *buffer); - - /* Circular Drawing Functions */ - #if GDISP_NEED_CIRCLE - void gdisp_lld_drawcircle(coord_t x, coord_t y, coord_t radius, color_t color); - void gdisp_lld_fillcircle(coord_t x, coord_t y, coord_t radius, color_t color); - #endif - - #if GDISP_NEED_ELLIPSE - void gdisp_lld_drawellipse(coord_t x, coord_t y, coord_t a, coord_t b, color_t color); - void gdisp_lld_fillellipse(coord_t x, coord_t y, coord_t a, coord_t b, color_t color); - #endif - - /* Text Rendering Functions */ - #if GDISP_NEED_TEXT - void gdisp_lld_drawchar(coord_t x, coord_t y, char c, font_t font, color_t color); - void gdisp_lld_fillchar(coord_t x, coord_t y, char c, font_t font, color_t color, color_t bgcolor); - #endif - - /* Pixel readback */ - #if GDISP_NEED_PIXELREAD - color_t gdisp_lld_getpixelcolor(coord_t x, coord_t y); - #endif - - /* Scrolling Function - clears the area scrolled out */ - #if GDISP_NEED_SCROLL - void gdisp_lld_verticalscroll(coord_t x, coord_t y, coord_t cx, coord_t cy, int lines, color_t bgcolor); - #endif - -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_GDISP */ - -#endif /* _GDISP_LLD_H */ -/** @} */ diff --git a/halext/drivers/gdispS6d1121/gdisp_lld_config.h b/halext/drivers/gdispS6d1121/gdisp_lld_config.h index f38b3fb7..83f5ce3d 100644 --- a/halext/drivers/gdispS6d1121/gdisp_lld_config.h +++ b/halext/drivers/gdispS6d1121/gdisp_lld_config.h @@ -1,208 +1,70 @@ -/* - ChibiOS/RT - Copyright (C) 2012 - Joel Bodenmann aka Tectu - - This file is part of ChibiOS-LCD-Driver. - - ChibiOS-LCD-Driver 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 3 of the License, or - (at your option) any later version. - - ChibiOS-LCD-Driver 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, see . -*/ - -/** - * @file gdispS6d1121/gdisp_lld_config.h - * @brief GDISP Graphic Driver subsystem low level driver header for the S6d1121 display. - * - * @addtogroup GDISP - * @{ - */ - -#ifndef _GDISP_LLD_CONFIG_H -#define _GDISP_LLD_CONFIG_H - -#if HAL_USE_GDISP || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name GDISP hardware accelerated support - * @{ - */ - /** - * @brief Hardware supports changing the orientation. - * @details If set to @p FALSE a software stubb is provided. - */ - #define GDISP_HARDWARE_ORIENTATION TRUE - - /** - * @brief Hardware supports power control. - * @details If set to @p FALSE a software stubb is provided. - */ - #define GDISP_HARDWARE_POWERCONTROL FALSE - - /** - * @brief Hardware accelerated line drawing. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_LINES FALSE - - /** - * @brief Hardware accelerated box drawing. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_BOX FALSE - - /** - * @brief Hardware accelerated screen clears. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_CLEARS TRUE - - /** - * @brief Hardware accelerated rectangular fills. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_FILLS TRUE - - /** - * @brief Hardware accelerated fills from an image. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_BITFILLS TRUE - - /** - * @brief Hardware accelerated circles. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_CIRCLES FALSE - - /** - * @brief Hardware accelerated filled circles. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_CIRCLEFILLS FALSE - - /** - * @brief Hardware accelerated ellipses. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_ELLIPSES FALSE - - /** - * @brief Hardware accelerated filled ellipses. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_ELLIPSEFILLS FALSE - - /** - * @brief Hardware accelerated text drawing. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_TEXT FALSE - - /** - * @brief Hardware accelerated text drawing with a filled background. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_TEXTFILLS FALSE - - /** - * @brief Hardware accelerated scrolling. - * @details If set to @p FALSE there is no support for scrolling. - */ - #define GDISP_HARDWARE_SCROLL FALSE - - /** - * @brief Reading back of pixel values. - * @details If set to @p FALSE there is no support for pixel read-back. - */ - #define GDISP_HARDWARE_PIXELREAD FALSE -/** @} */ - -/** - * @name GDISP software algorithm choices - * @{ - */ - /** - * @brief For filled text drawing, use a background fill and then draw - * the text instead of using a blit or direct pixel drawing. - * @details If set to @p TRUE background fill and then text draw is used. - * @note This is ignored if hardware accelerated text is supported. - */ - #define GDISP_SOFTWARE_TEXTFILLDRAW FALSE - /** - * @brief For filled text drawing, when using a bitmap blit - * use a column by column buffer rather than a full character - * buffer to save memory at a small performance cost. - * @details If set to @p TRUE background fill one character column at a time. - * @note This is ignored if software text using blit is not being used. - */ - #define GDISP_SOFTWARE_TEXTBLITCOLUMN FALSE -/** @} */ - -/** - * @name GDISP pixel format choices - * @{ - */ - /** - * @brief The native pixel format for this device - * @note One of the following should be defined: - * GDISP_PIXELFORMAT_RGB565 - * GDISP_PIXELFORMAT_RGB888 - * GDISP_PIXELFORMAT_RGB444 - * GDISP_PIXELFORMAT_RGB332 - * GDISP_PIXELFORMAT_RGB666 - * GDISP_PIXELFORMAT_CUSTOM - * @note If you define GDISP_PIXELFORMAT_CUSTOM you need to also define - * color_t, RGB2COLOR(r,g,b), HTML2COLOR(h), - * RED_OF(c), GREEN_OF(c), BLUE_OF(c), - * COLOR(c) and MASKCOLOR. - */ - #define GDISP_PIXELFORMAT_RGB565 - - /** - * @brief Do pixels require packing for a blit - * @note Is only valid for a pixel format that doesn't fill it's datatype. ie formats: - * GDISP_PIXELFORMAT_RGB888 - * GDISP_PIXELFORMAT_RGB444 - * GDISP_PIXELFORMAT_RGB666 - * GDISP_PIXELFORMAT_CUSTOM - * @note If you use GDISP_PIXELFORMAT_CUSTOM and packed bit fills - * you need to also define @P gdispPackPixels(buf,cx,x,y,c) - * @note If you are using GDISP_HARDWARE_BITFILLS = FALSE then the pixel - * format must not be a packed format as the software blit does - * not support packed pixels - * @note Very few cases should actually require packed pixels as the low - * level driver can also pack on the fly as it is sending it - * to the graphics device. - */ - #define GDISP_PACKED_PIXELS FALSE - - /** - * @brief Do lines of pixels require packing for a blit - * @note Ignored if GDISP_PACKED_PIXELS is FALSE - */ - #define GDISP_PACKED_LINES FALSE - - /** - * @brief Do lines of pixels require packing for a blit - * @note Ignored if GDISP_PACKED_PIXELS is FALSE - */ - #define GDISP_PACKED_LINES FALSE -/** @} */ - -#endif /* HAL_USE_GDISP */ - -#endif /* _GDISP_LLD_CONFIG_H */ -/** @} */ +/* + ChibiOS/RT - Copyright (C) 2012 + Joel Bodenmann aka Tectu + + This file is part of ChibiOS-LCD-Driver. + + ChibiOS-LCD-Driver 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 3 of the License, or + (at your option) any later version. + + ChibiOS-LCD-Driver 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, see . +*/ + +/** + * @file gdispS6d1121/gdisp_lld_config.h + * @brief GDISP Graphic Driver subsystem low level driver header for the S6d1121 display. + * + * @addtogroup GDISP + * @{ + */ + +#ifndef _GDISP_LLD_CONFIG_H +#define _GDISP_LLD_CONFIG_H + +#if HAL_USE_GDISP || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Driver hardware support. */ +/*===========================================================================*/ + +#define GDISP_HARDWARE_LINES FALSE +#define GDISP_HARDWARE_CLEARS TRUE +#define GDISP_HARDWARE_FILLS TRUE +#define GDISP_HARDWARE_BITFILLS TRUE +#define GDISP_HARDWARE_CIRCLES FALSE +#define GDISP_HARDWARE_CIRCLEFILLS FALSE +#define GDISP_HARDWARE_ELLIPSES FALSE +#define GDISP_HARDWARE_ELLIPSEFILLS FALSE +#define GDISP_HARDWARE_TEXT FALSE +#define GDISP_HARDWARE_TEXTFILLS FALSE +#define GDISP_HARDWARE_SCROLL FALSE +#define GDISP_HARDWARE_PIXELREAD FALSE +#define GDISP_HARDWARE_CONTROL TRUE + +#define GDISP_SOFTWARE_TEXTFILLDRAW FALSE +#define GDISP_SOFTWARE_TEXTBLITCOLUMN FALSE + +#define GDISP_PIXELFORMAT_RGB565 +#define GDISP_PACKED_PIXELS FALSE +#define GDISP_PACKED_LINES FALSE + +/*===========================================================================*/ +/* Extra fields for the GDISPDriver structure */ +/*===========================================================================*/ + +/* +#define GDISP_DRIVER_EXT_FIELDS int abc; int def; +*/ + +#endif /* HAL_USE_GDISP */ + +#endif /* _GDISP_LLD_CONFIG_H */ +/** @} */ diff --git a/halext/drivers/gdispSsd1289/gdisp_lld.c b/halext/drivers/gdispSsd1289/gdisp_lld.c index a16eb7d7..f5c94bf1 100644 --- a/halext/drivers/gdispSsd1289/gdisp_lld.c +++ b/halext/drivers/gdispSsd1289/gdisp_lld.c @@ -189,92 +189,6 @@ void gdisp_lld_drawpixel(coord_t x, coord_t y, color_t color) { gdisp_lld_fillarea() and gdisp_lld_blitarea(). */ -#if GDISP_HARDWARE_POWERCONTROL || defined(__DOXYGEN__) - /** - * @brief Sets the power mode for the graphic device. - * @note The power modes are powerOn, powerSleep and powerOff. - * If powerSleep is not supported it is equivelent to powerOn. - * - * @param[in] powerMode The new power mode - * - * @notapi - */ - void gdisp_lld_setpowermode(gdisp_powermode_t powerMode) { - if (GDISP.Powermode == powerMode) - return; - - switch(powerMode) { - case powerOff: - lld_lcdWriteReg(0x0010, 0x0000); // leave sleep mode - lld_lcdWriteReg(0x0007, 0x0000); // halt operation - lld_lcdWriteReg(0x0000, 0x0000); // turn off oszillator - lld_lcdWriteReg(0x0010, 0x0001); // enter sleepmode - break; - case powerOn: - lld_lcdWriteReg(0x0010, 0x0000); // leave sleep mode - if (GDISP.Powermode != powerSleep) - gdisp_lld_init(); - break; - case powerSleep: - lld_lcdWriteReg(0x0010, 0x0001); // enter sleep mode - break; - default: - return; - } - - GDISP.Powermode = powerMode; - } -#endif - -#if GDISP_HARDWARE_ORIENTATION || defined(__DOXYGEN__) - /** - * @brief Sets the orientation of the display. - * @note This may be ignored if not supported by the device. - * - * @param[in] newOrientation The new orientation - * - * @notapi - */ - void gdisp_lld_setorientation(gdisp_orientation_t newOrientation) { - if (GDISP.Orientation == newOrientation) - return; - - switch(newOrientation) { - case portrait: - lld_lcdWriteReg(0x0001, 0x2B3F); - /* ID = 11 AM = 0 */ - lld_lcdWriteReg(0x0011, 0x6070); - GDISP.Height = SCREEN_HEIGHT; - GDISP.Width = SCREEN_WIDTH; - break; - case landscape: - lld_lcdWriteReg(0x0001, 0x293F); - /* ID = 11 AM = 1 */ - lld_lcdWriteReg(0x0011, 0x6078); - GDISP.Height = SCREEN_WIDTH; - GDISP.Width = SCREEN_HEIGHT; - break; - case portraitInv: - lld_lcdWriteReg(0x0001, 0x2B3F); - /* ID = 01 AM = 0 */ - lld_lcdWriteReg(0x0011, 0x6040); - GDISP.Height = SCREEN_HEIGHT; - GDISP.Width = SCREEN_WIDTH; - break; - case landscapeInv: - lld_lcdWriteReg(0x0001, 0x293F); - /* ID = 01 AM = 1 */ - lld_lcdWriteReg(0x0011, 0x6048); - GDISP.Height = SCREEN_WIDTH; - GDISP.Width = SCREEN_HEIGHT; - break; - default: - return; - } - GDISP.Orientation = newOrientation; - } -#endif - #if GDISP_HARDWARE_CLEARS || defined(__DOXYGEN__) /** * @brief Clear the display. @@ -313,23 +227,6 @@ void gdisp_lld_drawpixel(coord_t x, coord_t y, color_t color) { } #endif -#if GDISP_HARDWARE_BOX || defined(__DOXYGEN__) - /** - * @brief Draw a box. - * @pre The GDISP unit must be in powerOn or powerSleep mode. - * - * @param[in] x0,y0 The start position - * @param[in] cx,cy The size of the box (outside dimensions) - * @param[in] color The color to use - * @param[in] filled Should the box should be filled - * - * @notapi - */ - void gdisp_lld_drawbox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) { - /* NOT IMPLEMENTED */ - } -#endif - #if GDISP_HARDWARE_FILLS || defined(__DOXYGEN__) /** * @brief Fill an area with a color. @@ -594,5 +491,95 @@ void gdisp_lld_drawpixel(coord_t x, coord_t y, color_t color) { } #endif +#if GDISP_HARDWARE_CONTROL || defined(__DOXYGEN__) + /** + * @brief Driver Control + * @detail Unsupported control codes are ignored. + * @note The value parameter should always be typecast to (void *). + * @note There are some predefined and some specific to the low level driver. + * @note GDISP_CONTROL_POWER - Takes a gdisp_powermode_t + * GDISP_CONTROL_ORIENTATION - Takes a gdisp_orientation_t + * GDISP_CONTROL_BACKLIGHT - Takes an int from 0 to 100. For a driver + * that only supports off/on anything other + * than zero is on. + * GDISP_CONTROL_CONTRAST - Takes an int from 0 to 100. + * GDISP_CONTROL_LLD - Low level driver control constants start at + * this value. + * + * @param[in] what What to do. + * @param[in] value The value to use (always cast to a void *). + * + * @notapi + */ + void gdisp_lld_control(int what, void *value) { + switch(what) { + case GDISP_CONTROL_POWER: + if (GDISP.Powermode == (gdisp_powermode_t)value) + return; + switch((gdisp_powermode_t)value) { + case powerOff: + lld_lcdWriteReg(0x0010, 0x0000); // leave sleep mode + lld_lcdWriteReg(0x0007, 0x0000); // halt operation + lld_lcdWriteReg(0x0000, 0x0000); // turn off oszillator + lld_lcdWriteReg(0x0010, 0x0001); // enter sleepmode + break; + case powerOn: + lld_lcdWriteReg(0x0010, 0x0000); // leave sleep mode + if (GDISP.Powermode != powerSleep) + gdisp_lld_init(); + break; + case powerSleep: + lld_lcdWriteReg(0x0010, 0x0001); // enter sleep mode + break; + default: + return; + } + GDISP.Powermode = (gdisp_powermode_t)value; + return; + case GDISP_CONTROL_ORIENTATION: + if (GDISP.Orientation == (gdisp_orientation_t)value) + return; + switch((gdisp_orientation_t)value) { + case portrait: + lld_lcdWriteReg(0x0001, 0x2B3F); + /* ID = 11 AM = 0 */ + lld_lcdWriteReg(0x0011, 0x6070); + GDISP.Height = SCREEN_HEIGHT; + GDISP.Width = SCREEN_WIDTH; + break; + case landscape: + lld_lcdWriteReg(0x0001, 0x293F); + /* ID = 11 AM = 1 */ + lld_lcdWriteReg(0x0011, 0x6078); + GDISP.Height = SCREEN_WIDTH; + GDISP.Width = SCREEN_HEIGHT; + break; + case portraitInv: + lld_lcdWriteReg(0x0001, 0x2B3F); + /* ID = 01 AM = 0 */ + lld_lcdWriteReg(0x0011, 0x6040); + GDISP.Height = SCREEN_HEIGHT; + GDISP.Width = SCREEN_WIDTH; + break; + case landscapeInv: + lld_lcdWriteReg(0x0001, 0x293F); + /* ID = 01 AM = 1 */ + lld_lcdWriteReg(0x0011, 0x6048); + GDISP.Height = SCREEN_WIDTH; + GDISP.Width = SCREEN_HEIGHT; + break; + default: + return; + } + GDISP.Orientation = (gdisp_orientation_t)value; + return; +/* + case GDISP_CONTROL_BACKLIGHT: + case GDISP_CONTROL_CONTRAST: +*/ + } + } +#endif + #endif /* HAL_USE_GDISP */ /** @} */ diff --git a/halext/drivers/gdispSsd1289/gdisp_lld.h b/halext/drivers/gdispSsd1289/gdisp_lld.h deleted file mode 100644 index f32b3e47..00000000 --- a/halext/drivers/gdispSsd1289/gdisp_lld.h +++ /dev/null @@ -1,150 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2012 - Joel Bodenmann aka Tectu - - This file is part of ChibiOS-LCD-Driver. - - ChibiOS-LCD-Driver 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 3 of the License, or - (at your option) any later version. - - ChibiOS-LCD-Driver 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, see . -*/ - -/** - * @file templates/gdisp_lld.h - * @brief GDISP Graphic Driver subsystem low level driver header template. - * - * @addtogroup GDISP - * @{ - */ - -#ifndef _GDISP_LLD_H -#define _GDISP_LLD_H - -#if HAL_USE_GDISP || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Structure representing a GDISP driver. - * @note Implementations may extend this structure to contain more, - * architecture dependent, fields. - */ -struct GDISPDriver { - /** - * @brief Width of the screen. - * @note Read-only. - */ - coord_t Width; - /** - * @brief Height of the screen. - * @note Read-only. - */ - coord_t Height; - /** - * @brief Current orientation of the screen. - * @note Read-only. - */ - gdisp_orientation_t Orientation; - /** - * @brief Current power mode of the screen. - * @note Read-only. - */ - gdisp_powermode_t Powermode; - - #if defined(GDISP_DRIVER_EXT_FIELDS) - GDISP_DRIVER_EXT_FIELDS - #endif - /* End of mandatory fields */ -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(__DOXYGEN__) - extern GDISPDriver GDISP; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - - /* Core functions */ - void gdisp_lld_init(void); - void gdisp_lld_setpowermode(gdisp_powermode_t powerMode); - void gdisp_lld_setorientation(gdisp_orientation_t newOrientation); - - /* Some of these functions will be implemented in software by the high level driver - depending on the GDISP_HARDWARE_XXX macros defined in gdisp_lld_config.h. - */ - - /* Drawing functions */ - void gdisp_lld_clear(color_t color); - void gdisp_lld_drawpixel(coord_t x, coord_t y, color_t color); - void gdisp_lld_drawline(coord_t x0, coord_t y0, coord_t x1, coord_t y1, color_t color); - void gdisp_lld_drawbox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color); - void gdisp_lld_fillarea(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color); - void gdisp_lld_blitarea(coord_t x, coord_t y, coord_t cx, coord_t cy, pixel_t *buffer); - - /* Circular Drawing Functions */ - #if GDISP_NEED_CIRCLE - void gdisp_lld_drawcircle(coord_t x, coord_t y, coord_t radius, color_t color); - void gdisp_lld_fillcircle(coord_t x, coord_t y, coord_t radius, color_t color); - #endif - - #if GDISP_NEED_ELLIPSE - void gdisp_lld_drawellipse(coord_t x, coord_t y, coord_t a, coord_t b, color_t color); - void gdisp_lld_fillellipse(coord_t x, coord_t y, coord_t a, coord_t b, color_t color); - #endif - - /* Text Rendering Functions */ - #if GDISP_NEED_TEXT - void gdisp_lld_drawchar(coord_t x, coord_t y, char c, font_t font, color_t color); - void gdisp_lld_fillchar(coord_t x, coord_t y, char c, font_t font, color_t color, color_t bgcolor); - #endif - - /* Pixel readback */ - #if GDISP_NEED_PIXELREAD - color_t gdisp_lld_getpixelcolor(coord_t x, coord_t y); - #endif - - /* Scrolling Function - clears the area scrolled out */ - #if GDISP_NEED_SCROLL - void gdisp_lld_verticalscroll(coord_t x, coord_t y, coord_t cx, coord_t cy, int lines, color_t bgcolor); - #endif - -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_GDISP */ - -#endif /* _GDISP_LLD_H */ -/** @} */ diff --git a/halext/drivers/gdispSsd1289/gdisp_lld_config.h b/halext/drivers/gdispSsd1289/gdisp_lld_config.h index 38f8dba7..60be3017 100644 --- a/halext/drivers/gdispSsd1289/gdisp_lld_config.h +++ b/halext/drivers/gdispSsd1289/gdisp_lld_config.h @@ -1,208 +1,70 @@ -/* - ChibiOS/RT - Copyright (C) 2012 - Joel Bodenmann aka Tectu - - This file is part of ChibiOS-LCD-Driver. - - ChibiOS-LCD-Driver 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 3 of the License, or - (at your option) any later version. - - ChibiOS-LCD-Driver 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, see . -*/ - -/** - * @file gdispSsd1289/gdisp_lld_config.h - * @brief GDISP Graphic Driver subsystem low level driver header for the Ssd1289 display. - * - * @addtogroup GDISP - * @{ - */ - -#ifndef _GDISP_LLD_CONFIG_H -#define _GDISP_LLD_CONFIG_H - -#if HAL_USE_GDISP || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name GDISP hardware accelerated support - * @{ - */ - /** - * @brief Hardware supports changing the orientation. - * @details If set to @p FALSE a software stubb is provided. - */ - #define GDISP_HARDWARE_ORIENTATION TRUE - - /** - * @brief Hardware supports power control. - * @details If set to @p FALSE a software stubb is provided. - */ - #define GDISP_HARDWARE_POWERCONTROL TRUE - - /** - * @brief Hardware accelerated line drawing. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_LINES FALSE - - /** - * @brief Hardware accelerated box drawing. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_BOX FALSE - - /** - * @brief Hardware accelerated screen clears. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_CLEARS TRUE - - /** - * @brief Hardware accelerated rectangular fills. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_FILLS TRUE - - /** - * @brief Hardware accelerated fills from an image. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_BITFILLS TRUE - - /** - * @brief Hardware accelerated circles. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_CIRCLES FALSE - - /** - * @brief Hardware accelerated filled circles. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_CIRCLEFILLS FALSE - - /** - * @brief Hardware accelerated ellipses. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_ELLIPSES FALSE - - /** - * @brief Hardware accelerated filled ellipses. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_ELLIPSEFILLS FALSE - - /** - * @brief Hardware accelerated text drawing. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_TEXT FALSE - - /** - * @brief Hardware accelerated text drawing with a filled background. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_TEXTFILLS FALSE - - /** - * @brief Hardware accelerated scrolling. - * @details If set to @p FALSE there is no support for scrolling. - */ - #define GDISP_HARDWARE_SCROLL TRUE - - /** - * @brief Reading back of pixel values. - * @details If set to @p FALSE there is no support for pixel read-back. - */ - #define GDISP_HARDWARE_PIXELREAD TRUE -/** @} */ - -/** - * @name GDISP software algorithm choices - * @{ - */ - /** - * @brief For filled text drawing, use a background fill and then draw - * the text instead of using a blit or direct pixel drawing. - * @details If set to @p TRUE background fill and then text draw is used. - * @note This is ignored if hardware accelerated text is supported. - */ - #define GDISP_SOFTWARE_TEXTFILLDRAW FALSE - /** - * @brief For filled text drawing, when using a bitmap blit - * use a column by column buffer rather than a full character - * buffer to save memory at a small performance cost. - * @details If set to @p TRUE background fill one character column at a time. - * @note This is ignored if software text using blit is not being used. - */ - #define GDISP_SOFTWARE_TEXTBLITCOLUMN FALSE -/** @} */ - -/** - * @name GDISP pixel format choices - * @{ - */ - /** - * @brief The native pixel format for this device - * @note One of the following should be defined: - * GDISP_PIXELFORMAT_RGB565 - * GDISP_PIXELFORMAT_RGB888 - * GDISP_PIXELFORMAT_RGB444 - * GDISP_PIXELFORMAT_RGB332 - * GDISP_PIXELFORMAT_RGB666 - * GDISP_PIXELFORMAT_CUSTOM - * @note If you define GDISP_PIXELFORMAT_CUSTOM you need to also define - * color_t, RGB2COLOR(r,g,b), HTML2COLOR(h), - * RED_OF(c), GREEN_OF(c), BLUE_OF(c), - * COLOR(c) and MASKCOLOR. - */ - #define GDISP_PIXELFORMAT_RGB565 - - /** - * @brief Do pixels require packing for a blit - * @note Is only valid for a pixel format that doesn't fill it's datatype. ie formats: - * GDISP_PIXELFORMAT_RGB888 - * GDISP_PIXELFORMAT_RGB444 - * GDISP_PIXELFORMAT_RGB666 - * GDISP_PIXELFORMAT_CUSTOM - * @note If you use GDISP_PIXELFORMAT_CUSTOM and packed bit fills - * you need to also define @P gdispPackPixels(buf,cx,x,y,c) - * @note If you are using GDISP_HARDWARE_BITFILLS = FALSE then the pixel - * format must not be a packed format as the software blit does - * not support packed pixels - * @note Very few cases should actually require packed pixels as the low - * level driver can also pack on the fly as it is sending it - * to the graphics device. - */ - #define GDISP_PACKED_PIXELS FALSE - - /** - * @brief Do lines of pixels require packing for a blit - * @note Ignored if GDISP_PACKED_PIXELS is FALSE - */ - #define GDISP_PACKED_LINES FALSE - - /** - * @brief Do lines of pixels require packing for a blit - * @note Ignored if GDISP_PACKED_PIXELS is FALSE - */ - #define GDISP_PACKED_LINES FALSE -/** @} */ - -#endif /* HAL_USE_GDISP */ - -#endif /* _GDISP_LLD_CONFIG_H */ -/** @} */ +/* + ChibiOS/RT - Copyright (C) 2012 + Joel Bodenmann aka Tectu + + This file is part of ChibiOS-LCD-Driver. + + ChibiOS-LCD-Driver 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 3 of the License, or + (at your option) any later version. + + ChibiOS-LCD-Driver 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, see . +*/ + +/** + * @file gdispSsd1289/gdisp_lld_config.h + * @brief GDISP Graphic Driver subsystem low level driver header for the Ssd1289 display. + * + * @addtogroup GDISP + * @{ + */ + +#ifndef _GDISP_LLD_CONFIG_H +#define _GDISP_LLD_CONFIG_H + +#if HAL_USE_GDISP || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Driver hardware support. */ +/*===========================================================================*/ + +#define GDISP_HARDWARE_LINES FALSE +#define GDISP_HARDWARE_CLEARS TRUE +#define GDISP_HARDWARE_FILLS TRUE +#define GDISP_HARDWARE_BITFILLS TRUE +#define GDISP_HARDWARE_CIRCLES FALSE +#define GDISP_HARDWARE_CIRCLEFILLS FALSE +#define GDISP_HARDWARE_ELLIPSES FALSE +#define GDISP_HARDWARE_ELLIPSEFILLS FALSE +#define GDISP_HARDWARE_TEXT FALSE +#define GDISP_HARDWARE_TEXTFILLS FALSE +#define GDISP_HARDWARE_SCROLL TRUE +#define GDISP_HARDWARE_PIXELREAD TRUE +#define GDISP_HARDWARE_CONTROL TRUE + +#define GDISP_SOFTWARE_TEXTFILLDRAW FALSE +#define GDISP_SOFTWARE_TEXTBLITCOLUMN FALSE + +#define GDISP_PIXELFORMAT_RGB565 +#define GDISP_PACKED_PIXELS FALSE +#define GDISP_PACKED_LINES FALSE + +/*===========================================================================*/ +/* Extra fields for the GDISPDriver structure */ +/*===========================================================================*/ + +/* +#define GDISP_DRIVER_EXT_FIELDS int abc; int def; +*/ + +#endif /* HAL_USE_GDISP */ + +#endif /* _GDISP_LLD_CONFIG_H */ +/** @} */ diff --git a/halext/drivers/gdispTestStub/gdisp_lld.c b/halext/drivers/gdispTestStub/gdisp_lld.c index 6140d0d6..2b80f997 100644 --- a/halext/drivers/gdispTestStub/gdisp_lld.c +++ b/halext/drivers/gdispTestStub/gdisp_lld.c @@ -117,33 +117,6 @@ void gdisp_lld_drawpixel(coord_t UNUSED(x), coord_t UNUSED(y), color_t UNUSED(co gdisp_lld_fillarea() and gdisp_lld_blitarea(). */ -#if GDISP_HARDWARE_POWERCONTROL || defined(__DOXYGEN__) -/** - * @brief Sets the power mode for the graphic device. - * @note The power modes are powerOn, powerSleep and powerOff. - * If powerSleep is not supported it is equivelent to powerOn. - * - * @param[in] powerMode The new power mode - * - * @notapi - */ -void gdisp_lld_setpowermode(gdisp_powermode_t UNUSED(powerMode)) { -} -#endif - -#if GDISP_HARDWARE_ORIENTATION || defined(__DOXYGEN__) -/** - * @brief Sets the orientation of the display. - * @note This may be ignored if not supported by the device. - * - * @param[in] newOrientation The new orientation - * - * @notapi - */ -void gdisp_lld_setorientation(gdisp_orientation_t UNUSED(newOrientation)) { -} -#endif - #if GDISP_HARDWARE_CLEARS || defined(__DOXYGEN__) /** * @brief Clear the display. @@ -172,22 +145,6 @@ void gdisp_lld_setorientation(gdisp_orientation_t UNUSED(newOrientation)) { } #endif -#if GDISP_HARDWARE_BOX || defined(__DOXYGEN__) - /** - * @brief Draw a box. - * @pre The GDISP unit must be in powerOn or powerSleep mode. - * - * @param[in] x0,y0 The start position - * @param[in] cx,cy The size of the box (outside dimensions) - * @param[in] color The color to use - * @param[in] filled Should the box should be filled - * - * @notapi - */ - void gdisp_lld_drawbox(coord_t UNUSED(x), coord_t UNUSED(y), coord_t UNUSED(cx), coord_t UNUSED(cy), color_t UNUSED(color)) { - } -#endif - #if GDISP_HARDWARE_FILLS || defined(__DOXYGEN__) /** * @brief Fill an area with a color. @@ -351,5 +308,29 @@ void gdisp_lld_setorientation(gdisp_orientation_t UNUSED(newOrientation)) { } #endif +#if GDISP_HARDWARE_CONTROL || defined(__DOXYGEN__) + /** + * @brief Driver Control + * @detail Unsupported control codes are ignored. + * @note The value parameter should always be typecast to (void *). + * @note There are some predefined and some specific to the low level driver. + * @note GDISP_CONTROL_POWER - Takes a gdisp_powermode_t + * GDISP_CONTROL_ORIENTATION - Takes a gdisp_orientation_t + * GDISP_CONTROL_BACKLIGHT - Takes an int from 0 to 100. For a driver + * that only supports off/on anything other + * than zero is on. + * GDISP_CONTROL_CONTRAST - Takes an int from 0 to 100. + * GDISP_CONTROL_LLD - Low level driver control constants start at + * this value. + * + * @param[in] what What to do. + * @param[in] value The value to use (always cast to a void *). + * + * @notapi + */ + void gdisp_lld_control(int UNUSED(what), void *UNUSED(value)) { + } +#endif + #endif /* HAL_USE_GDISP */ /** @} */ diff --git a/halext/drivers/gdispTestStub/gdisp_lld.h b/halext/drivers/gdispTestStub/gdisp_lld.h deleted file mode 100644 index 3919f9fc..00000000 --- a/halext/drivers/gdispTestStub/gdisp_lld.h +++ /dev/null @@ -1,150 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2012 - Joel Bodenmann aka Tectu - - This file is part of ChibiOS-LCD-Driver. - - ChibiOS-LCD-Driver 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 3 of the License, or - (at your option) any later version. - - ChibiOS-LCD-Driver 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, see . -*/ - -/** - * @file gdispTestStub/gdisp_lld.h - * @brief GDISP Graphic Driver subsystem low level driver header template. - * - * @addtogroup GDISP - * @{ - */ - -#ifndef _GDISP_LLD_H -#define _GDISP_LLD_H - -#if HAL_USE_GDISP || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Structure representing a GDISP driver. - * @note Implementations may extend this structure to contain more, - * architecture dependent, fields. - */ -struct GDISPDriver { - /** - * @brief Width of the screen. - * @note Read-only. - */ - coord_t Width; - /** - * @brief Height of the screen. - * @note Read-only. - */ - coord_t Height; - /** - * @brief Current orientation of the screen. - * @note Read-only. - */ - gdisp_orientation_t Orientation; - /** - * @brief Current power mode of the screen. - * @note Read-only. - */ - gdisp_powermode_t Powermode; - - #if defined(GDISP_DRIVER_EXT_FIELDS) - GDISP_DRIVER_EXT_FIELDS - #endif - /* End of mandatory fields */ -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(__DOXYGEN__) - extern GDISPDriver GDISP; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - - /* Core functions */ - void gdisp_lld_init(void); - void gdisp_lld_setpowermode(gdisp_powermode_t powerMode); - void gdisp_lld_setorientation(gdisp_orientation_t newOrientation); - - /* Some of these functions will be implemented in software by the high level driver - depending on the GDISP_HARDWARE_XXX macros defined in gdisp_lld_config.h. - */ - - /* Drawing functions */ - void gdisp_lld_clear(color_t color); - void gdisp_lld_drawpixel(coord_t x, coord_t y, color_t color); - void gdisp_lld_drawline(coord_t x0, coord_t y0, coord_t x1, coord_t y1, color_t color); - void gdisp_lld_drawbox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color); - void gdisp_lld_fillarea(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color); - void gdisp_lld_blitarea(coord_t x, coord_t y, coord_t cx, coord_t cy, pixel_t *buffer); - - /* Circular Drawing Functions */ - #if GDISP_NEED_CIRCLE - void gdisp_lld_drawcircle(coord_t x, coord_t y, coord_t radius, color_t color); - void gdisp_lld_fillcircle(coord_t x, coord_t y, coord_t radius, color_t color); - #endif - - #if GDISP_NEED_ELLIPSE - void gdisp_lld_drawellipse(coord_t x, coord_t y, coord_t a, coord_t b, color_t color); - void gdisp_lld_fillellipse(coord_t x, coord_t y, coord_t a, coord_t b, color_t color); - #endif - - /* Text Rendering Functions */ - #if GDISP_NEED_TEXT - void gdisp_lld_drawchar(coord_t x, coord_t y, char c, font_t font, color_t color); - void gdisp_lld_fillchar(coord_t x, coord_t y, char c, font_t font, color_t color, color_t bgcolor); - #endif - - /* Pixel readback */ - #if GDISP_NEED_PIXELREAD - color_t gdisp_lld_getpixelcolor(coord_t x, coord_t y); - #endif - - /* Scrolling Function - clears the area scrolled out */ - #if GDISP_NEED_SCROLL - void gdisp_lld_verticalscroll(coord_t x, coord_t y, coord_t cx, coord_t cy, int lines, color_t bgcolor); - #endif - -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_GDISP */ - -#endif /* _GDISP_LLD_H */ -/** @} */ diff --git a/halext/drivers/gdispTestStub/gdisp_lld_config.h b/halext/drivers/gdispTestStub/gdisp_lld_config.h index d70a1e82..f58ca878 100644 --- a/halext/drivers/gdispTestStub/gdisp_lld_config.h +++ b/halext/drivers/gdispTestStub/gdisp_lld_config.h @@ -1,208 +1,70 @@ -/* - ChibiOS/RT - Copyright (C) 2012 - Joel Bodenmann aka Tectu - - This file is part of ChibiOS-LCD-Driver. - - ChibiOS-LCD-Driver 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 3 of the License, or - (at your option) any later version. - - ChibiOS-LCD-Driver 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, see . -*/ - -/** - * @file gdispTestStub/gdisp_lld_config.h - * @brief GDISP Graphic Driver subsystem low level driver header (stub). - * - * @addtogroup GDISP - * @{ - */ - -#ifndef _GDISP_LLD_CONFIG_H -#define _GDISP_LLD_CONFIG_H - -#if HAL_USE_GDISP || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name GDISP hardware accelerated support - * @{ - */ - /** - * @brief Hardware supports changing the orientation. - * @details If set to @p FALSE a software stubb is provided. - */ - #define GDISP_HARDWARE_ORIENTATION FALSE - - /** - * @brief Hardware supports power control. - * @details If set to @p FALSE a software stubb is provided. - */ - #define GDISP_HARDWARE_POWERCONTROL FALSE - - /** - * @brief Hardware accelerated line drawing. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_LINES FALSE - - /** - * @brief Hardware accelerated box drawing. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_BOX FALSE - - /** - * @brief Hardware accelerated screen clears. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_CLEARS FALSE - - /** - * @brief Hardware accelerated rectangular fills. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_FILLS FALSE - - /** - * @brief Hardware accelerated fills from an image. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_BITFILLS FALSE - - /** - * @brief Hardware accelerated circles. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_CIRCLES FALSE - - /** - * @brief Hardware accelerated filled circles. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_CIRCLEFILLS FALSE - - /** - * @brief Hardware accelerated ellipses. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_ELLIPSES FALSE - - /** - * @brief Hardware accelerated filled ellipses. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_ELLIPSEFILLS FALSE - - /** - * @brief Hardware accelerated text drawing. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_TEXT FALSE - - /** - * @brief Hardware accelerated text drawing with a filled background. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_TEXTFILLS FALSE - - /** - * @brief Hardware accelerated scrolling. - * @details If set to @p FALSE there is no support for scrolling. - */ - #define GDISP_HARDWARE_SCROLL FALSE - - /** - * @brief Reading back of pixel values. - * @details If set to @p FALSE there is no support for pixel read-back. - */ - #define GDISP_HARDWARE_PIXELREAD FALSE -/** @} */ - -/** - * @name GDISP software algorithm choices - * @{ - */ - /** - * @brief For filled text drawing, use a background fill and then draw - * the text instead of using a blit or direct pixel drawing. - * @details If set to @p TRUE background fill and then text draw is used. - * @note This is ignored if hardware accelerated text is supported. - */ - #define GDISP_SOFTWARE_TEXTFILLDRAW FALSE - /** - * @brief For filled text drawing, when using a bitmap blit - * use a column by column buffer rather than a full character - * buffer to save memory at a small performance cost. - * @details If set to @p TRUE background fill one character column at a time. - * @note This is ignored if software text using blit is not being used. - */ - #define GDISP_SOFTWARE_TEXTBLITCOLUMN FALSE -/** @} */ - -/** - * @name GDISP pixel format choices - * @{ - */ - /** - * @brief The native pixel format for this device - * @note One of the following should be defined: - * GDISP_PIXELFORMAT_RGB565 - * GDISP_PIXELFORMAT_RGB888 - * GDISP_PIXELFORMAT_RGB444 - * GDISP_PIXELFORMAT_RGB332 - * GDISP_PIXELFORMAT_RGB666 - * GDISP_PIXELFORMAT_CUSTOM - * @note If you define GDISP_PIXELFORMAT_CUSTOM you need to also define - * color_t, RGB2COLOR(r,g,b), HTML2COLOR(h), - * RED_OF(c), GREEN_OF(c), BLUE_OF(c), - * COLOR(c) and MASKCOLOR. - */ - #define GDISP_PIXELFORMAT_RGB565 - - /** - * @brief Do pixels require packing for a blit - * @note Is only valid for a pixel format that doesn't fill it's datatype. ie formats: - * GDISP_PIXELFORMAT_RGB888 - * GDISP_PIXELFORMAT_RGB444 - * GDISP_PIXELFORMAT_RGB666 - * GDISP_PIXELFORMAT_CUSTOM - * @note If you use GDISP_PIXELFORMAT_CUSTOM and packed bit fills - * you need to also define @P gdispPackPixels(buf,cx,x,y,c) - * @note If you are using GDISP_HARDWARE_BITFILLS = FALSE then the pixel - * format must not be a packed format as the software blit does - * not support packed pixels - * @note Very few cases should actually require packed pixels as the low - * level driver can also pack on the fly as it is sending it - * to the graphics device. - */ - #define GDISP_PACKED_PIXELS FALSE - - /** - * @brief Do lines of pixels require packing for a blit - * @note Ignored if GDISP_PACKED_PIXELS is FALSE - */ - #define GDISP_PACKED_LINES FALSE - - /** - * @brief Do lines of pixels require packing for a blit - * @note Ignored if GDISP_PACKED_PIXELS is FALSE - */ - #define GDISP_PACKED_LINES FALSE -/** @} */ - -#endif /* HAL_USE_GDISP */ - -#endif /* _GDISP_LLD_CONFIG_H */ -/** @} */ +/* + ChibiOS/RT - Copyright (C) 2012 + Joel Bodenmann aka Tectu + + This file is part of ChibiOS-LCD-Driver. + + ChibiOS-LCD-Driver 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 3 of the License, or + (at your option) any later version. + + ChibiOS-LCD-Driver 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, see . +*/ + +/** + * @file gdispTestStub/gdisp_lld_config.h + * @brief GDISP Graphic Driver subsystem low level driver header (stub). + * + * @addtogroup GDISP + * @{ + */ + +#ifndef _GDISP_LLD_CONFIG_H +#define _GDISP_LLD_CONFIG_H + +#if HAL_USE_GDISP || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Driver hardware support. */ +/*===========================================================================*/ + +#define GDISP_HARDWARE_LINES FALSE +#define GDISP_HARDWARE_CLEARS FALSE +#define GDISP_HARDWARE_FILLS FALSE +#define GDISP_HARDWARE_BITFILLS FALSE +#define GDISP_HARDWARE_CIRCLES FALSE +#define GDISP_HARDWARE_CIRCLEFILLS FALSE +#define GDISP_HARDWARE_ELLIPSES FALSE +#define GDISP_HARDWARE_ELLIPSEFILLS FALSE +#define GDISP_HARDWARE_TEXT FALSE +#define GDISP_HARDWARE_TEXTFILLS FALSE +#define GDISP_HARDWARE_SCROLL FALSE +#define GDISP_HARDWARE_PIXELREAD FALSE +#define GDISP_HARDWARE_CONTROL FALSE + +#define GDISP_SOFTWARE_TEXTFILLDRAW FALSE +#define GDISP_SOFTWARE_TEXTBLITCOLUMN FALSE + +#define GDISP_PIXELFORMAT_RGB565 +#define GDISP_PACKED_PIXELS FALSE +#define GDISP_PACKED_LINES FALSE + +/*===========================================================================*/ +/* Extra fields for the GDISPDriver structure */ +/*===========================================================================*/ + +/* +#define GDISP_DRIVER_EXT_FIELDS int abc; int def; +*/ + +#endif /* HAL_USE_GDISP */ + +#endif /* _GDISP_LLD_CONFIG_H */ +/** @} */ diff --git a/halext/include/gdisp.h b/halext/include/gdisp.h index 258cc8b5..24a8b1b4 100644 --- a/halext/include/gdisp.h +++ b/halext/include/gdisp.h @@ -17,6 +17,13 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ +/** + * @file gdisp.h + * @brief GDISP Graphic Driver subsystem header file. + * + * @addtogroup GDISP + * @{ + */ #ifndef _GDISP_H #define _GDISP_H @@ -52,6 +59,26 @@ #define Pink HTML2COLOR(0xFFC0CB) #define SkyBlue HTML2COLOR(0x87CEEB) +/** + * @brief Driver Control Constants + * @detail Unsupported control codes are ignored. + * @note The value parameter should always be typecast to (void *). + * @note There are some predefined and some specific to the low level driver. + * @note GDISP_CONTROL_POWER - Takes a gdisp_powermode_t + * GDISP_CONTROL_ORIENTATION - Takes a gdisp_orientation_t + * GDISP_CONTROL_BACKLIGHT - Takes an int from 0 to 100. For a driver + * that only supports off/on anything other + * than zero is on. + * GDISP_CONTROL_CONTRAST - Takes an int from 0 to 100. + * GDISP_CONTROL_LLD - Low level driver control constants start at + * this value. + */ +#define GDISP_CONTROL_POWER 0 +#define GDISP_CONTROL_ORIENTATION 1 +#define GDISP_CONTROL_BACKLIGHT 2 +#define GDISP_CONTROL_CONTRAST 3 +#define GDISP_CONTROL_LLD 1000 + /*===========================================================================*/ /* Driver pre-compile time settings. */ /*===========================================================================*/ @@ -60,208 +87,91 @@ * @name GDISP more complex functionality to be compiled * @{ */ -/** - * @brief Should all operations be clipped to the screen and colors validated. - * @details Defaults to TRUE. - * @note If this is FALSE, any operations that extend beyond the - * edge of the screen will have undefined results. Any - * out-of-range colors will produce undefined results. - * @note If defined then all low level and high level driver routines - * must check the validity of inputs and do something sensible - * if they are out of range. It doesn't have to be efficient, - * just valid. - */ -#ifndef GDISP_NEED_VALIDATION - #define GDISP_NEED_VALIDATION TRUE -#endif + /** + * @brief Should all operations be clipped to the screen and colors validated. + * @details Defaults to TRUE. + * @note If this is FALSE, any operations that extend beyond the + * edge of the screen will have undefined results. Any + * out-of-range colors will produce undefined results. + * @note If defined then all low level and high level driver routines + * must check the validity of inputs and do something sensible + * if they are out of range. It doesn't have to be efficient, + * just valid. + */ + #ifndef GDISP_NEED_VALIDATION + #define GDISP_NEED_VALIDATION TRUE + #endif -/** - * @brief Are circle functions needed. - * @details Defaults to TRUE - */ -#ifndef GDISP_NEED_CIRCLE - #define GDISP_NEED_CIRCLE TRUE -#endif + /** + * @brief Are circle functions needed. + * @details Defaults to TRUE + */ + #ifndef GDISP_NEED_CIRCLE + #define GDISP_NEED_CIRCLE TRUE + #endif -/** - * @brief Are ellipse functions needed. - * @details Defaults to TRUE - */ -#ifndef GDISP_NEED_ELLIPSE - #define GDISP_NEED_ELLIPSE TRUE -#endif + /** + * @brief Are ellipse functions needed. + * @details Defaults to TRUE + */ + #ifndef GDISP_NEED_ELLIPSE + #define GDISP_NEED_ELLIPSE TRUE + #endif -/** - * @brief Are text functions needed. - * @details Defaults to TRUE - */ -#ifndef GDISP_NEED_TEXT - #define GDISP_NEED_TEXT TRUE -#endif + /** + * @brief Are text functions needed. + * @details Defaults to TRUE + */ + #ifndef GDISP_NEED_TEXT + #define GDISP_NEED_TEXT TRUE + #endif -/** - * @brief Is scrolling needed. - * @details Defaults to FALSE - */ -#ifndef GDISP_NEED_SCROLL - #define GDISP_NEED_SCROLL FALSE -#endif + /** + * @brief Is scrolling needed. + * @details Defaults to FALSE + */ + #ifndef GDISP_NEED_SCROLL + #define GDISP_NEED_SCROLL FALSE + #endif -/** - * @brief Is the capability to read pixels back needed. - * @details Defaults to FALSE - */ -#ifndef GDISP_NEED_PIXELREAD - #define GDISP_NEED_PIXELREAD FALSE -#endif + /** + * @brief Is the capability to read pixels back needed. + * @details Defaults to FALSE + */ + #ifndef GDISP_NEED_PIXELREAD + #define GDISP_NEED_PIXELREAD FALSE + #endif -/** - * @brief Do the drawing functions need to be thread-safe. - * @details Defaults to FALSE - * @note Turning this on adds two context switches per transaction - * so it can significantly slow graphics drawing. - */ -#ifndef GDISP_NEED_MULTITHREAD - #define GDISP_NEED_MULTITHREAD FALSE -#endif + /** + * @brief Control some aspect of the drivers operation. + * @details Defaults to FALSE + */ + #ifndef GDISP_NEED_CONTROL + #define GDISP_NEED_CONTROL FALSE + #endif + + /** + * @brief Do the drawing functions need to be thread-safe. + * @details Defaults to FALSE + * @note Turning this on adds two context switches per transaction + * so it can significantly slow graphics drawing. + */ + #ifndef GDISP_NEED_MULTITHREAD + #define GDISP_NEED_MULTITHREAD FALSE + #endif /** @} */ -/* Include the low level driver configuration information */ -#include "gdisp_lld_config.h" - /*===========================================================================*/ -/* Derived constants and error checks. */ +/* Low Level Driver details and error checks. */ /*===========================================================================*/ -#if GDISP_NEED_SCROLL && !GDISP_HARDWARE_SCROLL - #error "GDISP: Hardware scrolling is wanted but not supported." -#endif - -#if GDISP_NEED_PIXELREAD && !GDISP_HARDWARE_PIXELREAD - #error "GDISP: Pixel read-back is wanted but not supported." -#endif +/* Include the low level driver information */ +#include "gdisp_lld.h" /*===========================================================================*/ -/* Driver data structures and types. */ +/* Type definitions */ /*===========================================================================*/ -/* Define the basic Macro's for the various pixel formats */ - -#if defined(GDISP_PIXELFORMAT_RGB565) || defined(__DOXYGEN__) - /** - * @brief The color of a pixel. - */ - typedef uint16_t color_t; - /** - * @brief Convert a number (of any type) to a color_t. - * @details Masks any invalid bits in the color - */ - #define COLOR(c) ((color_t)(c)) - /** - * @brief Does the color_t type contain invalid bits that need masking. - */ - #define MASKCOLOR FALSE - /** - * @brief Convert red, green, blue (each 0 to 255) into a color value. - */ - #define RGB2COLOR(r,g,b) ((color_t)((((r) & 0xF8)<<8) | (((g) & 0xFC)<<3) | (((b) & 0xF8)>>3))) - /** - * @brief Convert a 6 digit HTML code (hex) into a color value. - */ - #define HTML2COLOR(h) ((color_t)((((h) & 0xF80000)>>8) | (((h) & 0x00FC00)>>5) | (((h) & 0x0000F8)>>3))) - /** - * @brief Extract the red component (0 to 255) of a color value. - */ - #define RED_OF(c) (((c) & 0xF800)>>8) - /** - * @brief Extract the green component (0 to 255) of a color value. - */ - #define GREEN_OF(c) (((c)&0x007E)>>3) - /** - * @brief Extract the blue component (0 to 255) of a color value. - */ - #define BLUE_OF(c) (((c)&0x001F)<<3) - -#elif defined(GDISP_PIXELFORMAT_RGB888) - typedef uint32_t color_t; - #define COLOR(c) ((color_t)(((c) & 0xFFFFFF))) - #define MASKCOLOR TRUE - #define RGB2COLOR(r,g,b) ((color_t)((((r) & 0xFF)<<16) | (((g) & 0xFF) << 8) | ((b) & 0xFF))) - #define HTML2COLOR(h) ((color_t)(h)) - #define RED_OF(c) (((c) & 0xFF0000)>>16) - #define GREEN_OF(c) (((c)&0x00FF00)>>8) - #define BLUE_OF(c) ((c)&0x0000FF) - -#elif defined(GDISP_PIXELFORMAT_RGB444) - typedef uint16_t color_t; - #define COLOR(c) ((color_t)(((c) & 0x0FFF))) - #define MASKCOLOR TRUE - #define RGB2COLOR(r,g,b) ((color_t)((((r) & 0xF0)<<4) | ((g) & 0xF0) | (((b) & 0xF0)>>4))) - #define HTML2COLOR(h) ((color_t)((((h) & 0xF00000)>>12) | (((h) & 0x00F000)>>8) | (((h) & 0x0000F0)>>4))) - #define RED_OF(c) (((c) & 0x0F00)>>4) - #define GREEN_OF(c) ((c)&0x00F0) - #define BLUE_OF(c) (((c)&0x000F)<<4) - -#elif defined(GDISP_PIXELFORMAT_RGB332) - typedef uint8_t color_t; - #define COLOR(c) ((color_t)(c)) - #define MASKCOLOR FALSE - #define RGB2COLOR(r,g,b) ((color_t)(((r) & 0xE0) | (((g) & 0xE0)>>3) | (((b) & 0xC0)>>6))) - #define HTML2COLOR(h) ((color_t)((((h) & 0xE00000)>>16) | (((h) & 0x00E000)>>11) | (((h) & 0x0000C0)>>6))) - #define RED_OF(c) ((c) & 0xE0) - #define GREEN_OF(c) (((c)&0x1C)<<3) - #define BLUE_OF(c) (((c)&0x03)<<6) - -#elif defined(GDISP_PIXELFORMAT_RGB666) - typedef uint32_t color_t; - #define COLOR(c) ((color_t)(((c) & 0x03FFFF))) - #define MASKCOLOR TRUE - #define RGB2COLOR(r,g,b) ((color_t)((((r) & 0xFC)<<10) | (((g) & 0xFC)<<4) | (((b) & 0xFC)>>2))) - #define HTML2COLOR(h) ((color_t)((((h) & 0xFC0000)>>6) | (((h) & 0x00FC00)>>4) | (((h) & 0x0000FC)>>2))) - #define RED_OF(c) (((c) & 0x03F000)>>12) - #define GREEN_OF(c) (((c)&0x00FC00)>>8) - #define BLUE_OF(c) (((c)&0x00003F)<<2) - -#elif !defined(GDISP_PIXELFORMAT_CUSTOM) - #error "GDISP: No supported pixel format has been specified." -#endif - -/* Verify information for packed pixels and define a non-packed pixel macro */ -#if !GDISP_PACKED_PIXELS - #define gdispPackPixels(buf,cx,x,y,c) { ((color_t *)(buf))[(y)*(cx)+(x)] = (c); } -#elif !GDISP_HARDWARE_BITFILLS - #error "GDISP: packed pixel formats are only supported for hardware accelerated drivers." -#elif !defined(GDISP_PIXELFORMAT_RGB888) \ - && !defined(GDISP_PIXELFORMAT_RGB444) \ - && !defined(GDISP_PIXELFORMAT_RGB666) \ - && !defined(GDISP_PIXELFORMAT_CUSTOM) - #error "GDISP: A packed pixel format has been specified for an unsupported pixel format." -#endif - -/** - * @brief The type for a coordinate or length on the screen. - */ -typedef uint16_t coord_t; -/** - * @brief The type of a pixel. - */ -typedef color_t pixel_t; -/** - * @brief The type of a font. - */ -typedef const struct font *font_t; -/** - * @brief Type of a structure representing a GDISP driver. - */ -typedef struct GDISPDriver GDISPDriver; -/** - * @brief Type for the screen orientation. - */ -typedef enum orientation {portrait, landscape, portraitInv, landscapeInv} gdisp_orientation_t; -/** - * @brief Type for the available power modes for the screen. - */ -typedef enum powermode {powerOff, powerSleep, powerOn} gdisp_powermode_t; /** * @brief Type for the text justification. */ @@ -271,23 +181,29 @@ typedef enum justify {justifyLeft, justifyCenter, justifyRight} justify_t; */ typedef enum fontmetric {fontHeight, fontDescendersHeight, fontLineSpacing, fontCharPadding, fontMinWidth, fontMaxWidth} fontmetric_t; - /*===========================================================================*/ /* External declarations. */ /*===========================================================================*/ -/* Include the low level driver information */ -#include "gdisp_lld.h" - #if GDISP_NEED_TEXT || defined(__DOXYGEN__) /** * @brief Predefined fonts. */ extern const struct font fontSmall; +extern const struct font fontSmallDouble; +extern const struct font fontSmallNarrow; extern const struct font fontLarger; +extern const struct font fontLargerDouble; +extern const struct font fontLargerNarrow; extern const struct font fontUI1; +extern const struct font fontUI1Double; +extern const struct font fontUI1Narrow; extern const struct font fontUI2; +extern const struct font fontUI2Double; +extern const struct font fontUI2Narrow; extern const struct font fontLargeNumbers; +extern const struct font fontLargeNumbersDouble; +extern const struct font fontLargeNumbersNarrow; #endif #ifdef __cplusplus @@ -298,14 +214,11 @@ extern "C" { /* Base Functions */ void gdispInit(GDISPDriver *gdisp); - void gdispSetPowerMode(gdisp_powermode_t powerMode); - void gdispSetOrientation(gdisp_orientation_t newOrientation); /* Drawing Functions */ void gdispClear(color_t color); void gdispDrawPixel(coord_t x, coord_t y, color_t color); void gdispDrawLine(coord_t x0, coord_t y0, coord_t x1, coord_t y1, color_t color); - void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color); void gdispFillArea(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color); void gdispBlitArea(coord_t x, coord_t y, coord_t cx, coord_t cy, const pixel_t *buffer); @@ -337,16 +250,18 @@ extern "C" { void gdispVerticalScroll(coord_t x, coord_t y, coord_t cx, coord_t cy, int lines, color_t bgcolor); #endif + /* Set driver specific control */ + #if GDISP_NEED_CONTROL + void gdispControl(unsigned what, void *value); + #endif + #else /* The same as above but use the low level driver directly if no multi-thread support is needed */ #define gdispInit(gdisp) gdisp_lld_init() - #define gdispSetPowerMode(powerMode) gdisp_lld_setpowermode(powerMode) - #define gdispSetOrientation(newOrientation) gdisp_lld_setorientation(newOrientation) #define gdispClear(color) gdisp_lld_clear(color) #define gdispDrawPixel(x, y, color) gdisp_lld_drawpixel(x, y, color) #define gdispDrawLine(x0, y0, x1, y1, color) gdisp_lld_drawline(x0, y0, x1, y1, color) - #define gdispDrawBox(x, y, cx, cy, color) gdisp_lld_drawbox(x, y, cx, cy, color) #define gdispFillArea(x, y, cx, cy, color) gdisp_lld_fillarea(x, y, cx, cy, color) #define gdispBlitArea(x, y, cx, cy, buffer) gdisp_lld_blitarea(x, y, cx, cy, buffer) #define gdispDrawCircle(x, y, radius, color) gdisp_lld_drawcircle(x, y, radius, color) @@ -357,9 +272,12 @@ extern "C" { #define gdispFillChar(x, y, c, font, color, bgcolor) gdisp_lld_fillchar(x, y, c, font, color, bgcolor) #define gdispGetPixelColor(x, y) gdisp_lld_getpixelcolor(x, y) #define gdispVerticalScroll(x, y, cx, cy, lines, bgcolor) gdisp_lld_verticalscroll(x, y, cx, cy, lines, bgcolor) + #define gdispControl(what, value) gdisp_lld_control(what, value) #endif +void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color); + /* Extra Text Functions */ #if GDISP_NEED_TEXT void gdispDrawString(coord_t x, coord_t y, const char *str, font_t font, color_t color); @@ -375,6 +293,10 @@ extern "C" { void gdispPackPixels(const pixel_t *buf, coord_t cx, coord_t x, coord_t y, color_t color); #endif +/* Deprecated Routines (already!) */ +#define gdispSetPowerMode(powerMode) gdispControl(GDISP_CONTROL_POWER, (void *)(powerMode)) +#define gdispSetOrientation(newOrientation) gdispControl(GDISP_CONTROL_ORITENTATION, (void *)(newOrientation)) + #ifdef __cplusplus } #endif diff --git a/halext/include/gdisp_fonts.h b/halext/include/gdisp_fonts.h index 2f573344..a271030e 100644 --- a/halext/include/gdisp_fonts.h +++ b/halext/include/gdisp_fonts.h @@ -72,6 +72,8 @@ struct font { uint8_t maxWidth; char minChar; char maxChar; + uint8_t xscale; + uint8_t yscale; const uint8_t *widthTable; const uint16_t *offsetTable; const fontcolumn_t *dataTable; diff --git a/halext/include/gdisp_lld.h b/halext/include/gdisp_lld.h new file mode 100644 index 00000000..bef4f96a --- /dev/null +++ b/halext/include/gdisp_lld.h @@ -0,0 +1,466 @@ +/* + ChibiOS/RT - Copyright (C) 2012 + Joel Bodenmann aka Tectu + + This file is part of ChibiOS-LCD-Driver. + + ChibiOS-LCD-Driver 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 3 of the License, or + (at your option) any later version. + + ChibiOS-LCD-Driver 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, see . +*/ +/** + * @file gdisp_lld.h + * @brief GDISP Graphic Driver subsystem low level driver header. + * + * @addtogroup GDISP + * @{ + */ + +#ifndef _GDISP_LLD_H +#define _GDISP_LLD_H + +#if HAL_USE_GDISP || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Include the low level driver configuration information */ +/*===========================================================================*/ + +#include "gdisp_lld_config.h" + +/*===========================================================================*/ +/* Error checks. */ +/*===========================================================================*/ + +/** + * @name GDISP hardware accelerated support + * @{ + */ + /** + * @brief Hardware accelerated line drawing. + * @details If set to @p FALSE software emulation is used. + */ + #ifndef GDISP_HARDWARE_LINES + #define GDISP_HARDWARE_LINES FALSE + #endif + + /** + * @brief Hardware accelerated screen clears. + * @details If set to @p FALSE software emulation is used. + */ + #ifndef GDISP_HARDWARE_CLEARS + #define GDISP_HARDWARE_CLEARS FALSE + #endif + + /** + * @brief Hardware accelerated rectangular fills. + * @details If set to @p FALSE software emulation is used. + */ + #ifndef GDISP_HARDWARE_FILLS + #define GDISP_HARDWARE_FILLS FALSE + #endif + + /** + * @brief Hardware accelerated fills from an image. + * @details If set to @p FALSE software emulation is used. + */ + #ifndef GDISP_HARDWARE_BITFILLS + #define GDISP_HARDWARE_BITFILLS FALSE + #endif + + /** + * @brief Hardware accelerated circles. + * @details If set to @p FALSE software emulation is used. + */ + #ifndef GDISP_HARDWARE_CIRCLES + #define GDISP_HARDWARE_CIRCLES FALSE + #endif + + /** + * @brief Hardware accelerated filled circles. + * @details If set to @p FALSE software emulation is used. + */ + #ifndef GDISP_HARDWARE_CIRCLEFILLS + #define GDISP_HARDWARE_CIRCLEFILLS FALSE + #endif + + /** + * @brief Hardware accelerated ellipses. + * @details If set to @p FALSE software emulation is used. + */ + #ifndef GDISP_HARDWARE_ELLIPSES + #define GDISP_HARDWARE_ELLIPSES FALSE + #endif + + /** + * @brief Hardware accelerated filled ellipses. + * @details If set to @p FALSE software emulation is used. + */ + #ifndef GDISP_HARDWARE_ELLIPSEFILLS + #define GDISP_HARDWARE_ELLIPSEFILLS FALSE + #endif + + /** + * @brief Hardware accelerated text drawing. + * @details If set to @p FALSE software emulation is used. + */ + #ifndef GDISP_HARDWARE_TEXT + #define GDISP_HARDWARE_TEXT FALSE + #endif + + /** + * @brief Hardware accelerated text drawing with a filled background. + * @details If set to @p FALSE software emulation is used. + */ + #ifndef GDISP_HARDWARE_TEXTFILLS + #define GDISP_HARDWARE_TEXTFILLS FALSE + #endif + + /** + * @brief Hardware accelerated scrolling. + * @details If set to @p FALSE there is no support for scrolling. + */ + #ifndef GDISP_HARDWARE_SCROLL + #define GDISP_HARDWARE_SCROLL FALSE + #endif + + /** + * @brief Reading back of pixel values. + * @details If set to @p FALSE there is no support for pixel read-back. + */ + #ifndef GDISP_HARDWARE_PIXELREAD + #define GDISP_HARDWARE_PIXELREAD FALSE + #endif + + /** + * @brief The driver supports one or more control commands. + * @details If set to @p FALSE there is no support for control commands. + */ + #ifndef GDISP_HARDWARE_CONTROL + #define GDISP_HARDWARE_CONTROL FALSE + #endif +/** @} */ + +/** + * @name GDISP software algorithm choices + * @{ + */ + /** + * @brief For filled text drawing, use a background fill and then draw + * the text instead of using a blit or direct pixel drawing. + * @details If set to @p TRUE background fill and then text draw is used. + * @note This is ignored if hardware accelerated text is supported. + */ + #ifndef GDISP_SOFTWARE_TEXTFILLDRAW + #define GDISP_SOFTWARE_TEXTFILLDRAW FALSE + #endif + + /** + * @brief For filled text drawing, when using a bitmap blit + * use a column by column buffer rather than a full character + * buffer to save memory at a small performance cost. + * @details If set to @p TRUE background fill one character column at a time. + * @note This is ignored if software text using blit is not being used. + */ + #ifndef GDISP_SOFTWARE_TEXTBLITCOLUMN + #define GDISP_SOFTWARE_TEXTBLITCOLUMN FALSE + #endif +/** @} */ + +/** + * @name GDISP pixel format choices + * @{ + */ + /** + * @brief The native pixel format for this device + * @note One of the following should be defined: + * GDISP_PIXELFORMAT_RGB565 + * GDISP_PIXELFORMAT_RGB888 + * GDISP_PIXELFORMAT_RGB444 + * GDISP_PIXELFORMAT_RGB332 + * GDISP_PIXELFORMAT_RGB666 + * GDISP_PIXELFORMAT_CUSTOM + * @note If you define GDISP_PIXELFORMAT_CUSTOM you need to also define + * color_t, RGB2COLOR(r,g,b), HTML2COLOR(h), + * RED_OF(c), GREEN_OF(c), BLUE_OF(c), + * COLOR(c) and MASKCOLOR. + */ + #define GDISP_PIXELFORMAT_XXXXXX + + /** + * @brief Do pixels require packing for a blit + * @note Is only valid for a pixel format that doesn't fill it's datatype. ie formats: + * GDISP_PIXELFORMAT_RGB888 + * GDISP_PIXELFORMAT_RGB444 + * GDISP_PIXELFORMAT_RGB666 + * GDISP_PIXELFORMAT_CUSTOM + * @note If you use GDISP_PIXELFORMAT_CUSTOM and packed bit fills + * you need to also define @P gdispPackPixels(buf,cx,x,y,c) + * @note If you are using GDISP_HARDWARE_BITFILLS = FALSE then the pixel + * format must not be a packed format as the software blit does + * not support packed pixels + * @note Very few cases should actually require packed pixels as the low + * level driver can also pack on the fly as it is sending it + * to the graphics device. + */ + #ifndef GDISP_PACKED_PIXELS + #define GDISP_PACKED_PIXELS FALSE + #endif + + /** + * @brief Do lines of pixels require packing for a blit + * @note Ignored if GDISP_PACKED_PIXELS is FALSE + */ + #ifndef GDISP_PACKED_LINES + #define GDISP_PACKED_LINES FALSE + #endif +/** @} */ + +/*===========================================================================*/ +/* Define the macro's for the various pixel formats */ +/*===========================================================================*/ + +#if defined(__DOXYGEN__) + /** + * @brief The color of a pixel. + */ + typedef uint16_t color_t; + /** + * @brief Convert a number (of any type) to a color_t. + * @details Masks any invalid bits in the color + */ + #define COLOR(c) ((color_t)(c)) + /** + * @brief Does the color_t type contain invalid bits that need masking. + */ + #define MASKCOLOR FALSE + /** + * @brief Convert red, green, blue (each 0 to 255) into a color value. + */ + #define RGB2COLOR(r,g,b) ((color_t)((((r) & 0xF8)<<8) | (((g) & 0xFC)<<3) | (((b) & 0xF8)>>3))) + /** + * @brief Convert a 6 digit HTML code (hex) into a color value. + */ + #define HTML2COLOR(h) ((color_t)((((h) & 0xF80000)>>8) | (((h) & 0x00FC00)>>5) | (((h) & 0x0000F8)>>3))) + /** + * @brief Extract the red component (0 to 255) of a color value. + */ + #define RED_OF(c) (((c) & 0xF800)>>8) + /** + * @brief Extract the green component (0 to 255) of a color value. + */ + #define GREEN_OF(c) (((c)&0x007E)>>3) + /** + * @brief Extract the blue component (0 to 255) of a color value. + */ + #define BLUE_OF(c) (((c)&0x001F)<<3) + +#elif defined(GDISP_PIXELFORMAT_RGB565) + typedef uint16_t color_t; + #define COLOR(c) ((color_t)(c)) + #define MASKCOLOR FALSE + #define RGB2COLOR(r,g,b) ((color_t)((((r) & 0xF8)<<8) | (((g) & 0xFC)<<3) | (((b) & 0xF8)>>3))) + #define HTML2COLOR(h) ((color_t)((((h) & 0xF80000)>>8) | (((h) & 0x00FC00)>>5) | (((h) & 0x0000F8)>>3))) + #define RED_OF(c) (((c) & 0xF800)>>8) + #define GREEN_OF(c) (((c)&0x007E)>>3) + #define BLUE_OF(c) (((c)&0x001F)<<3) + +#elif defined(GDISP_PIXELFORMAT_RGB888) + typedef uint32_t color_t; + #define COLOR(c) ((color_t)(((c) & 0xFFFFFF))) + #define MASKCOLOR TRUE + #define RGB2COLOR(r,g,b) ((color_t)((((r) & 0xFF)<<16) | (((g) & 0xFF) << 8) | ((b) & 0xFF))) + #define HTML2COLOR(h) ((color_t)(h)) + #define RED_OF(c) (((c) & 0xFF0000)>>16) + #define GREEN_OF(c) (((c)&0x00FF00)>>8) + #define BLUE_OF(c) ((c)&0x0000FF) + +#elif defined(GDISP_PIXELFORMAT_RGB444) + typedef uint16_t color_t; + #define COLOR(c) ((color_t)(((c) & 0x0FFF))) + #define MASKCOLOR TRUE + #define RGB2COLOR(r,g,b) ((color_t)((((r) & 0xF0)<<4) | ((g) & 0xF0) | (((b) & 0xF0)>>4))) + #define HTML2COLOR(h) ((color_t)((((h) & 0xF00000)>>12) | (((h) & 0x00F000)>>8) | (((h) & 0x0000F0)>>4))) + #define RED_OF(c) (((c) & 0x0F00)>>4) + #define GREEN_OF(c) ((c)&0x00F0) + #define BLUE_OF(c) (((c)&0x000F)<<4) + +#elif defined(GDISP_PIXELFORMAT_RGB332) + typedef uint8_t color_t; + #define COLOR(c) ((color_t)(c)) + #define MASKCOLOR FALSE + #define RGB2COLOR(r,g,b) ((color_t)(((r) & 0xE0) | (((g) & 0xE0)>>3) | (((b) & 0xC0)>>6))) + #define HTML2COLOR(h) ((color_t)((((h) & 0xE00000)>>16) | (((h) & 0x00E000)>>11) | (((h) & 0x0000C0)>>6))) + #define RED_OF(c) ((c) & 0xE0) + #define GREEN_OF(c) (((c)&0x1C)<<3) + #define BLUE_OF(c) (((c)&0x03)<<6) + +#elif defined(GDISP_PIXELFORMAT_RGB666) + typedef uint32_t color_t; + #define COLOR(c) ((color_t)(((c) & 0x03FFFF))) + #define MASKCOLOR TRUE + #define RGB2COLOR(r,g,b) ((color_t)((((r) & 0xFC)<<10) | (((g) & 0xFC)<<4) | (((b) & 0xFC)>>2))) + #define HTML2COLOR(h) ((color_t)((((h) & 0xFC0000)>>6) | (((h) & 0x00FC00)>>4) | (((h) & 0x0000FC)>>2))) + #define RED_OF(c) (((c) & 0x03F000)>>12) + #define GREEN_OF(c) (((c)&0x00FC00)>>8) + #define BLUE_OF(c) (((c)&0x00003F)<<2) + +#elif !defined(GDISP_PIXELFORMAT_CUSTOM) + #error "GDISP: No supported pixel format has been specified." +#endif + +/* Verify information for packed pixels and define a non-packed pixel macro */ +#if !GDISP_PACKED_PIXELS + #define gdispPackPixels(buf,cx,x,y,c) { ((color_t *)(buf))[(y)*(cx)+(x)] = (c); } +#elif !GDISP_HARDWARE_BITFILLS + #error "GDISP: packed pixel formats are only supported for hardware accelerated drivers." +#elif !defined(GDISP_PIXELFORMAT_RGB888) \ + && !defined(GDISP_PIXELFORMAT_RGB444) \ + && !defined(GDISP_PIXELFORMAT_RGB666) \ + && !defined(GDISP_PIXELFORMAT_CUSTOM) + #error "GDISP: A packed pixel format has been specified for an unsupported pixel format." +#endif + +#if GDISP_NEED_SCROLL && !GDISP_HARDWARE_SCROLL + #error "GDISP: Hardware scrolling is wanted but not supported." +#endif + +#if GDISP_NEED_PIXELREAD && !GDISP_HARDWARE_PIXELREAD + #error "GDISP: Pixel read-back is wanted but not supported." +#endif + +/*===========================================================================*/ +/* Driver types. */ +/*===========================================================================*/ + +/** + * @brief The type for a coordinate or length on the screen. + */ +typedef uint16_t coord_t; +/** + * @brief The type of a pixel. + */ +typedef color_t pixel_t; +/** + * @brief The type of a font. + */ +typedef const struct font *font_t; +/** + * @brief Type of a structure representing a GDISP driver. + */ +typedef struct GDISPDriver GDISPDriver; +/** + * @brief Type for the screen orientation. + */ +typedef enum orientation {portrait, landscape, portraitInv, landscapeInv} gdisp_orientation_t; +/** + * @brief Type for the available power modes for the screen. + */ +typedef enum powermode {powerOff, powerSleep, powerOn} gdisp_powermode_t; + +/** + * @brief Structure representing a GDISP driver. + * @note Implementations may extend this structure to contain more, + * architecture dependent, fields by defining GDISP_DRIVER_EXT_FIELDS + */ +struct GDISPDriver { + /** + * @brief Width of the screen. + * @note Read-only. + */ + coord_t Width; + /** + * @brief Height of the screen. + * @note Read-only. + */ + coord_t Height; + /** + * @brief Current orientation of the screen. + * @note Read-only. + */ + gdisp_orientation_t Orientation; + /** + * @brief Current power mode of the screen. + * @note Read-only. + */ + gdisp_powermode_t Powermode; + + #if defined(GDISP_DRIVER_EXT_FIELDS) + GDISP_DRIVER_EXT_FIELDS + #endif +}; + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +#if !defined(__DOXYGEN__) + extern GDISPDriver GDISP; +#endif + +#ifdef __cplusplus +extern "C" { +#endif + + /* Core functions */ + void gdisp_lld_init(void); + + /* Some of these functions will be implemented in software by the high level driver + depending on the GDISP_HARDWARE_XXX macros defined in gdisp_lld_config.h. + */ + + /* Drawing functions */ + void gdisp_lld_clear(color_t color); + void gdisp_lld_drawpixel(coord_t x, coord_t y, color_t color); + void gdisp_lld_fillarea(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color); + void gdisp_lld_blitarea(coord_t x, coord_t y, coord_t cx, coord_t cy, pixel_t *buffer); + void gdisp_lld_drawline(coord_t x0, coord_t y0, coord_t x1, coord_t y1, color_t color); + + /* Circular Drawing Functions */ + #if GDISP_NEED_CIRCLE + void gdisp_lld_drawcircle(coord_t x, coord_t y, coord_t radius, color_t color); + void gdisp_lld_fillcircle(coord_t x, coord_t y, coord_t radius, color_t color); + #endif + + #if GDISP_NEED_ELLIPSE + void gdisp_lld_drawellipse(coord_t x, coord_t y, coord_t a, coord_t b, color_t color); + void gdisp_lld_fillellipse(coord_t x, coord_t y, coord_t a, coord_t b, color_t color); + #endif + + /* Text Rendering Functions */ + #if GDISP_NEED_TEXT + void gdisp_lld_drawchar(coord_t x, coord_t y, char c, font_t font, color_t color); + void gdisp_lld_fillchar(coord_t x, coord_t y, char c, font_t font, color_t color, color_t bgcolor); + #endif + + /* Pixel readback */ + #if GDISP_NEED_PIXELREAD + color_t gdisp_lld_getpixelcolor(coord_t x, coord_t y); + #endif + + /* Scrolling Function - clears the area scrolled out */ + #if GDISP_NEED_SCROLL + void gdisp_lld_verticalscroll(coord_t x, coord_t y, coord_t cx, coord_t cy, int lines, color_t bgcolor); + #endif + + /* Set driver specific control */ + #if GDISP_NEED_CONTROL + void gdisp_lld_control(int what, void *value); + #endif + +#ifdef __cplusplus +} +#endif + +#endif /* HAL_USE_GDISP */ + +#endif /* _GDISP_LLD_H */ +/** @} */ diff --git a/halext/src/gdisp.c b/halext/src/gdisp.c index 195b01f2..4bbff695 100644 --- a/halext/src/gdisp.c +++ b/halext/src/gdisp.c @@ -32,7 +32,7 @@ #if HAL_USE_GDISP || defined(__DOXYGEN__) #ifdef GDISP_NEED_TEXT -#include "gdisp_fonts.h" + #include "gdisp_fonts.h" #endif #if GDISP_NEED_MULTITHREAD @@ -90,25 +90,6 @@ } #endif -#if GDISP_NEED_MULTITHREAD || defined(__DOXYGEN__) - /** - * @brief Set the power mode for the display. - * @pre The GDISP unit must have been initialised using @p gdispInit(). - * @note Depending on the hardware implementation this function may not - * support powerSleep. If not powerSleep is treated the same as powerOn. - * (sleep allows drawing to the display without the display updating). - * - * @param[in] powerMode The power mode to use - * - * @api - */ - void gdispSetPowerMode(gdisp_powermode_t powerMode) { - MUTEX_ENTER - gdisp_lld_setpowermode(powerMode); - MUTEX_EXIT - } -#endif - #if GDISP_NEED_MULTITHREAD || defined(__DOXYGEN__) /** * @brief Set the orientation of the display. @@ -178,25 +159,6 @@ } #endif -#if GDISP_NEED_MULTITHREAD || defined(__DOXYGEN__) - /** - * @brief Draw a rectangular box. - * @pre The GDISP unit must be in powerOn or powerSleep mode. - * - * @param[in] x0,y0 The start position - * @param[in] cx,cy The size of the box (outside dimensions) - * @param[in] color The color to use - * @param[in] filled Should the box should be filled - * - * @api - */ - void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) { - MUTEX_ENTER - gdisp_lld_drawbox(x, y, cx, cy, color); - MUTEX_EXIT - } -#endif - #if GDISP_NEED_MULTITHREAD || defined(__DOXYGEN__) /** * @brief Fill an area with a color. @@ -327,6 +289,46 @@ } #endif +#if (GDISP_NEED_PIXELREAD && GDISP_NEED_MULTITHREAD) || defined(__DOXYGEN__) + /** + * @brief Get the color of a pixel. + * @return The color of the pixel. + * + * @param[in] x,y The position of the pixel + * + * @api + */ + color_t gdispGetPixelColor(coord_t x, coord_t y) { + color_t c; + + MUTEX_ENTER + c = gdisp_lld_getpixelcolor(x, y); + MUTEX_EXIT + + return c; + } +#endif + +#if (GDISP_NEED_SCROLL && GDISP_NEED_MULTITHREAD) || defined(__DOXYGEN__) + /** + * @brief Scroll vertically a section of the screen. + * @note Optional. + * @note If lines is >= cy, it is equivelent to a area fill with bgcolor. + * + * @param[in] x, y The start of the area to be scrolled + * @param[in] cx, cy The size of the area to be scrolled + * @param[in] lines The number of lines to scroll (Can be positive or negative) + * @param[in] bgcolor The color to fill the newly exposed area. + * + * @api + */ + void gdispVerticalScroll(coord_t x, coord_t y, coord_t cx, coord_t cy, int lines, color_t bgcolor) { + MUTEX_ENTER + gdisp_lld_verticalscroll(x, y, cx, cy, lines, bgcolor); + MUTEX_EXIT + } +#endif + #if (GDISP_NEED_TEXT && GDISP_NEED_MULTITHREAD) || defined(__DOXYGEN__) /** * @brief Draw a text character with a filled background. @@ -346,6 +348,68 @@ } #endif +#if (GDISP_NEED_CONTROL && GDISP_NEED_MULTITHREAD) || defined(__DOXYGEN__) + /** + * @brief Set the power mode for the display. + * @pre The GDISP unit must have been initialised using @p gdispInit(). + * @note Depending on the hardware implementation this function may not + * support powerSleep. If not powerSleep is treated the same as powerOn. + * (sleep allows drawing to the display without the display updating). + * + * @param[in] powerMode The power mode to use + * + * @api + */ + void gdispControl(int what, void *value) { + MUTEX_ENTER + gdisp_lld_control(what, value); + MUTEX_EXIT + } +#endif + +/*===========================================================================*/ +/* High Level Driver Routines. */ +/*===========================================================================*/ + +#if GDISP_NEED_MULTITHREAD || defined(__DOXYGEN__) + /** + * @brief Draw a rectangular box. + * @pre The GDISP unit must be in powerOn or powerSleep mode. + * + * @param[in] x0,y0 The start position + * @param[in] cx,cy The size of the box (outside dimensions) + * @param[in] color The color to use + * @param[in] filled Should the box should be filled + * + * @api + */ + void gdispDrawBox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) { + /* No mutex required as we only call high level functions which have their own mutex */ + coord_t x1, y1; + + x1 = x+cx-1; + y1 = y+cy-1; + + if (cx > 2) { + if (cy >= 1) { + gdisp_lld_drawline(x, y, x1, y, color); + if (cy >= 2) { + gdisp_lld_drawline(x, y1, x1, y1, color); + if (cy > 2) { + gdisp_lld_drawline(x, y+1, x, y1-1, color); + gdisp_lld_drawline(x1, y+1, x1, y1-1, color); + } + } + } + } else if (cx == 2) { + gdisp_lld_drawline(x, y, x, y1, color); + gdisp_lld_drawline(x1, y, x1, y1, color); + } else if (cx == 1) { + gdisp_lld_drawline(x, y, x, y1, color); + } + } +#endif + #if GDISP_NEED_TEXT || defined(__DOXYGEN__) /** * @brief Draw a text string. @@ -359,21 +423,22 @@ */ void gdispDrawString(coord_t x, coord_t y, const char *str, font_t font, color_t color) { /* No mutex required as we only call high level functions which have their own mutex */ - coord_t w; + coord_t w, p; char c; int first; first = 1; + p = font->charPadding * font->xscale; while(*str) { /* Get the next printable character */ c = *str++; - w = _getCharWidth(font, c); + w = _getCharWidth(font, c) * font->xscale; if (!w) continue; /* Handle inter-character padding */ - if (font->charPadding) { + if (p) { if (!first) - x += font->charPadding; + x += p; else first = 0; } @@ -399,22 +464,24 @@ */ void gdispFillString(coord_t x, coord_t y, const char *str, font_t font, color_t color, color_t bgcolor) { /* No mutex required as we only call high level functions which have their own mutex */ - coord_t w; + coord_t w, h, p; char c; int first; first = 1; + h = font->height * font->yscale; + p = font->charPadding * font->xscale; while(*str) { /* Get the next printable character */ c = *str++; - w = _getCharWidth(font, c); + w = _getCharWidth(font, c) * font->xscale; if (!w) continue; /* Handle inter-character padding */ - if (font->charPadding) { + if (p) { if (!first) { - gdispFillArea(x, y, font->charPadding, font->height, bgcolor); - x += font->charPadding; + gdispFillArea(x, y, p, h, bgcolor); + x += p; } else first = 0; } @@ -442,16 +509,19 @@ */ void gdispFillStringBox(coord_t x, coord_t y, coord_t cx, coord_t cy, const char* str, font_t font, color_t color, color_t bgcolor, justify_t justify) { /* No mutex required as we only call high level functions which have their own mutex */ - coord_t w, ypos, xpos; + coord_t w, h, p, ypos, xpos; char c; int first; const char *rstr; + h = font->height * font->yscale; + p = font->charPadding * font->xscale; + /* Oops - font too large for the area */ - if (font->height > cy) return; + if (h > cy) return; /* See if we need to fill above the font */ - ypos = (cy - font->height)/2; + ypos = (cy - h + 1)/2; if (ypos > 0) { gdispFillArea(x, y, cx, ypos, bgcolor); y += ypos; @@ -459,7 +529,7 @@ } /* See if we need to fill below the font */ - ypos = cy - font->height; + ypos = cy - h; if (ypos > 0) { gdispFillArea(x, y+cy-ypos, cx, ypos, bgcolor); cy -= ypos; @@ -480,13 +550,13 @@ while(*str) { /* Get the next printable character */ c = *str++; - w = _getCharWidth(font, c); + w = _getCharWidth(font, c) * font->xscale; if (!w) continue; /* Handle inter-character padding */ - if (font->charPadding) { + if (p) { if (!first) { - xpos += font->charPadding; + xpos += p; if (xpos > ypos) break; } else first = 0; @@ -507,14 +577,14 @@ for(str--; str >= rstr; str--) { /* Get the next printable character */ c = *str; - w = _getCharWidth(font, c); + w = _getCharWidth(font, c) * font->xscale; if (!w) continue; /* Handle inter-character padding */ - if (font->charPadding) { + if (p) { if (!first) { - if (xpos - font->charPadding < x) break; - xpos -= font->charPadding; + if (xpos - p < x) break; + xpos -= p; } else first = 0; } @@ -541,15 +611,15 @@ while(*str) { /* Get the next printable character */ c = *str++; - w = _getCharWidth(font, c); + w = _getCharWidth(font, c) * font->xscale; if (!w) continue; /* Handle inter-character padding */ - if (font->charPadding) { + if (p) { if (!first) { - if (xpos + font->charPadding > x+cx) break; - gdispFillArea(xpos, y, font->charPadding, cy, bgcolor); - xpos += font->charPadding; + if (xpos + p > x+cx) break; + gdispFillArea(xpos, y, p, cy, bgcolor); + xpos += p; } else first = 0; } @@ -579,12 +649,12 @@ coord_t gdispGetFontMetric(font_t font, fontmetric_t metric) { /* No mutex required as we only read static data */ switch(metric) { - case fontHeight: return font->height; - case fontDescendersHeight: return font->descenderHeight; - case fontLineSpacing: return font->lineSpacing; - case fontCharPadding: return font->charPadding; - case fontMinWidth: return font->minWidth; - case fontMaxWidth: return font->maxWidth; + case fontHeight: return font->height * font->yscale; + case fontDescendersHeight: return font->descenderHeight * font->yscale; + case fontLineSpacing: return font->lineSpacing * font->yscale; + case fontCharPadding: return font->charPadding * font->xscale; + case fontMinWidth: return font->minWidth * font->xscale; + case fontMaxWidth: return font->maxWidth * font->xscale; } return 0; } @@ -602,7 +672,7 @@ */ coord_t gdispGetCharWidth(char c, font_t font) { /* No mutex required as we only read static data */ - return _getCharWidth(font, c); + return _getCharWidth(font, c) * font->xscale; } #endif @@ -618,22 +688,24 @@ */ coord_t gdispGetStringWidth(const char* str, font_t font) { /* No mutex required as we only read static data */ - coord_t w, x; + coord_t w, h, p, x; char c; int first; first = 1; x = 0; + h = font->height * font->yscale; + p = font->charPadding * font->xscale; while(*str) { /* Get the next printable character */ c = *str++; - w = _getCharWidth(font, c); + w = _getCharWidth(font, c) * font->xscale; if (!w) continue; /* Handle inter-character padding */ - if (font->charPadding) { + if (p) { if (!first) - x += font->charPadding; + x += p; else first = 0; } @@ -672,45 +744,5 @@ } #endif -#if (GDISP_NEED_PIXELREAD && GDISP_NEED_MULTITHREAD) || defined(__DOXYGEN__) - /** - * @brief Get the color of a pixel. - * @return The color of the pixel. - * - * @param[in] x,y The position of the pixel - * - * @api - */ - color_t gdispGetPixelColor(coord_t x, coord_t y) { - color_t c; - - MUTEX_ENTER - c = gdisp_lld_getpixelcolor(x, y); - MUTEX_EXIT - - return c; - } -#endif - -#if (GDISP_NEED_SCROLL && GDISP_NEED_MULTITHREAD) || defined(__DOXYGEN__) - /** - * @brief Scroll vertically a section of the screen. - * @note Optional. - * @note If lines is >= cy, it is equivelent to a area fill with bgcolor. - * - * @param[in] x, y The start of the area to be scrolled - * @param[in] cx, cy The size of the area to be scrolled - * @param[in] lines The number of lines to scroll (Can be positive or negative) - * @param[in] bgcolor The color to fill the newly exposed area. - * - * @api - */ - void gdispVerticalScroll(coord_t x, coord_t y, coord_t cx, coord_t cy, int lines, color_t bgcolor) { - MUTEX_ENTER - gdisp_lld_verticalscroll(x, y, cx, cy, lines, bgcolor); - MUTEX_EXIT - } -#endif - #endif /* HAL_USE_GDISP */ /** @} */ diff --git a/halext/src/gdisp_emulation.c b/halext/src/gdisp_emulation.c index 528986c9..26562e92 100644 --- a/halext/src/gdisp_emulation.c +++ b/halext/src/gdisp_emulation.c @@ -134,33 +134,6 @@ } #endif -#if !GDISP_HARDWARE_BOX - void gdisp_lld_drawbox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) { - coord_t x1, y1; - - x1 = x+cx-1; - y1 = y+cy-1; - - if (cx > 2) { - if (cy >= 1) { - gdisp_lld_drawline(x, y, x1, y, color); - if (cy >= 2) { - gdisp_lld_drawline(x, y1, x1, y1, color); - if (cy > 2) { - gdisp_lld_drawline(x, y+1, x, y1-1, color); - gdisp_lld_drawline(x1, y+1, x1, y1-1, color); - } - } - } - } else if (cx == 2) { - gdisp_lld_drawline(x, y, x, y1, color); - gdisp_lld_drawline(x1, y, x1, y1, color); - } else if (cx == 1) { - gdisp_lld_drawline(x, y, x, y1, color); - } - } -#endif - #if !GDISP_HARDWARE_FILLS void gdisp_lld_fillarea(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) { #if GDISP_HARDWARE_SCROLL @@ -310,23 +283,32 @@ void gdisp_lld_drawchar(coord_t x, coord_t y, char c, font_t font, color_t color) { const fontcolumn_t *ptr; fontcolumn_t column; - coord_t width, i, j; + coord_t width, height, xscale, yscale; + coord_t i, j, xs, ys; /* Check we actually have something to print */ width = _getCharWidth(font, c); if (!width) return; + xscale = font->xscale; + yscale = font->yscale; + height = font->height * yscale; + width *= xscale; + ptr = _getCharData(font, c); /* Loop through the data and display. The font data is LSBit first, down the column */ - for(i = 0; i < width; i++) { + for(i=0; i < width; i+=xscale) { /* Get the font bitmap data for the column */ column = *ptr++; /* Draw each pixel */ - for(j = 0; j < font->height; j++, column >>= 1) { - if (column & 0x01) - gdisp_lld_drawpixel(x+i, y+j, color); + for(j=0; j < height; j+=yscale, column >>= 1) { + if (column & 0x01) { + for(xs=0; xs < xscale; xs++) + for(ys=0; ys < yscale; ys++) + gdisp_lld_drawpixel(x+i+xs, y+j+ys, color); + } } } } @@ -334,17 +316,23 @@ #if GDISP_NEED_TEXT && !GDISP_HARDWARE_TEXTFILLS void gdisp_lld_fillchar(coord_t x, coord_t y, char c, font_t font, color_t color, color_t bgcolor) { - coord_t width; + coord_t width, height; + coord_t xscale, yscale; /* Check we actually have something to print */ width = _getCharWidth(font, c); if (!width) return; + xscale = font->xscale; + yscale = font->yscale; + height = font->height * yscale; + width *= xscale; + /* Method 1: Use background fill and then draw the text */ #if GDISP_HARDWARE_TEXT || GDISP_SOFTWARE_TEXTFILLDRAW /* Fill the area */ - gdisp_lld_fillarea(x, y, width, font->height, bgcolor); + gdisp_lld_fillarea(x, y, width, height, bgcolor); /* Draw the text */ gdisp_lld_drawchar(x, y, c, font, color); @@ -354,24 +342,39 @@ { const fontcolumn_t *ptr; fontcolumn_t column; - coord_t i, j; - - /* Working buffer for fast non-transparent text rendering [patch by Badger] */ - static pixel_t buf[sizeof(fontcolumn_t)*8]; + coord_t i, j, xs, ys; + + /* Working buffer for fast non-transparent text rendering [patch by Badger] + This needs to be larger than the largest character we can print. + Assume the max is double sized by one column. + */ + static pixel_t buf[sizeof(fontcolumn_t)*8*2]; + + #if GDISP_NEED_VALIDATION + /* Check our buffer is big enough */ + if (height > sizeof(buf)/sizeof(buf[0])) return; + #endif ptr = _getCharData(font, c); /* Loop through the data and display. The font data is LSBit first, down the column */ - for(i = 0; i < width; i++) { + for(i = 0; i < width; i+=xscale) { /* Get the font bitmap data for the column */ column = *ptr++; /* Draw each pixel */ - for(j = 0; j < font->height; j++, column >>= 1) { - gdispPackPixels(buf, 1, j, 0, (column & 0x01) ? color : bgcolor); + for(j = 0; j < height; j+=yscale, column >>= 1) { + if (column & 0x01) { + for(ys=0; ys < yscale; ys++) + gdispPackPixels(buf, 1, j+ys, 0, color); + } else { + for(ys=0; ys < yscale; ys++) + gdispPackPixels(buf, 1, j+ys, 0, bgcolor); + } } - gdisp_lld_blitarea(x+i, y, 1, font->height, buf); + for(xs=0; xs < xscale; xs++) + gdisp_lld_blitarea(x+i+xs, y, 1, height, buf); } } @@ -380,33 +383,42 @@ { const fontcolumn_t *ptr; fontcolumn_t column; - coord_t i, j; + coord_t i, j, xs, ys; /* Working buffer for fast non-transparent text rendering [patch by Badger] This needs to be larger than the largest character we can print. + Assume the max is double sized. */ - static pixel_t buf[20*(sizeof(fontcolumn_t)*8)]; + static pixel_t buf[20*(sizeof(fontcolumn_t)*8)*2]; #if GDISP_NEED_VALIDATION /* Check our buffer is big enough */ - if (width * font->height > sizeof(buf)/sizeof(buf[0])) return; + if (width * height > sizeof(buf)/sizeof(buf[0])) return; #endif ptr = _getCharData(font, c); /* Loop through the data and display. The font data is LSBit first, down the column */ - for(i = 0; i < width; i++) { + for(i = 0; i < width; i+=xscale) { /* Get the font bitmap data for the column */ column = *ptr++; /* Draw each pixel */ - for(j = 0; j < font->height; j++, column >>= 1) { - gdispPackPixels(buf, width, i, j, (column & 0x01) ? color : bgcolor); + for(j = 0; j < height; j+=yscale, column >>= 1) { + if (column & 0x01) { + for(xs=0; xs < xscale; xs++) + for(ys=0; ys < yscale; ys++) + gdispPackPixels(buf, width, i+xs, j+ys, color); + } else { + for(xs=0; xs < xscale; xs++) + for(ys=0; ys < yscale; ys++) + gdispPackPixels(buf, width, i+xs, j+ys, bgcolor); + } } } /* [Patch by Badger] Write all in one stroke */ - gdisp_lld_blitarea(x, y, width, font->height, buf); + gdisp_lld_blitarea(x, y, width, height, buf); } /* Method 4: Draw pixel by pixel */ @@ -414,18 +426,26 @@ { const fontcolumn_t *ptr; fontcolumn_t column; - coord_t i, j; - + coord_t i, j, xs, ys; + ptr = _getCharData(font, c); /* Loop through the data and display. The font data is LSBit first, down the column */ - for(i = 0; i < width; i++) { + for(i = 0; i < width; i+=xscale) { /* Get the font bitmap data for the column */ column = *ptr++; /* Draw each pixel */ - for(j = 0; j < font->height; j++, column >>= 1) { - gdisp_lld_drawpixel(x+i, y+j, (column & 0x01) ? color : bgcolor); + for(j = 0; j < height; j+=yscale, column >>= 1) { + if (column & 0x01) { + for(xs=0; xs < xscale; xs++) + for(ys=0; ys < yscale; ys++) + gdisp_lld_drawpixel(x+i, y+j, color); + } else { + for(xs=0; xs < xscale; xs++) + for(ys=0; ys < yscale; ys++) + gdisp_lld_drawpixel(x+i, y+j, bgcolor); + } } } } @@ -433,4 +453,11 @@ } #endif + +#if GDISP_NEED_CONTROL && !GDISP_HARDWARE_CONTROL + void gdisp_lld_control(int UNUSED(what), void *UNUSED(value)) { + /* Ignore everything */ + } +#endif + #endif /* HAL_USE_GDISP */ diff --git a/halext/src/gdisp_fonts.c b/halext/src/gdisp_fonts.c index 0037bcc8..25a56526 100644 --- a/halext/src/gdisp_fonts.c +++ b/halext/src/gdisp_fonts.c @@ -38,7 +38,15 @@ static const uint16_t fontSmall_Offsets[]; static const fontcolumn_t fontSmall_Data[]; - const struct font fontSmall = { 11, 0, 14, 2, 2, 12, ' ', '~', + const struct font fontSmall = { 11, 0, 14, 2, 2, 12, ' ', '~', 1, 1, + fontSmall_Widths, + fontSmall_Offsets, + fontSmall_Data}; + const struct font fontSmallDouble = { 11, 0, 14, 2, 2, 12, ' ', '~', 2, 2, + fontSmall_Widths, + fontSmall_Offsets, + fontSmall_Data}; + const struct font fontSmallNarrow = { 11, 0, 14, 2, 2, 12, ' ', '~', 1, 2, fontSmall_Widths, fontSmall_Offsets, fontSmall_Data}; @@ -171,11 +179,18 @@ static const uint16_t fontLarger_Offsets[]; static const fontcolumn_t fontLarger_Data[]; - const struct font fontLarger = { 12, 1, 13, 2, 2, 13, ' ', '~', + const struct font fontLarger = { 12, 1, 13, 2, 2, 13, ' ', '~', 1, 1, + fontLarger_Widths, + fontLarger_Offsets, + fontLarger_Data}; + const struct font fontLargerDouble = { 12, 1, 13, 2, 2, 13, ' ', '~', 2, 2, + fontLarger_Widths, + fontLarger_Offsets, + fontLarger_Data}; + const struct font fontLargerNarrow = { 12, 1, 13, 2, 2, 13, ' ', '~', 1, 2, fontLarger_Widths, fontLarger_Offsets, fontLarger_Data}; - static const uint8_t fontLarger_Widths[] = { 2, 3, 5, 8, 7, 13, 8, 2, 4, 4, 7, 8, 3, 4, 3, 5, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 3, 3, 9, 8, 9, 6, @@ -305,7 +320,15 @@ static const uint16_t fontUI1_Offsets[]; static const fontcolumn_t fontUI1_Data[]; - const struct font fontUI1 = { 13, 0, 15, 2, 3, 13, ' ', '~', + const struct font fontUI1 = { 13, 0, 15, 2, 3, 13, ' ', '~', 1, 1, + fontUI1_Widths, + fontUI1_Offsets, + fontUI1_Data}; + const struct font fontUI1Double = { 13, 0, 15, 2, 3, 13, ' ', '~', 2, 2, + fontUI1_Widths, + fontUI1_Offsets, + fontUI1_Data}; + const struct font fontUI1Narrow = { 13, 0, 15, 2, 3, 13, ' ', '~', 1, 2, fontUI1_Widths, fontUI1_Offsets, fontUI1_Data}; @@ -439,7 +462,15 @@ static const uint16_t fontUI2_Offsets[]; static const fontcolumn_t fontUI2_Data[]; - const struct font fontUI2 = { 11, 1, 13, 2, 2, 12, ' ', '~', + const struct font fontUI2 = { 11, 1, 13, 2, 2, 12, ' ', '~', 1, 1, + fontUI2_Widths, + fontUI2_Offsets, + fontUI2_Data}; + const struct font fontUI2Double = { 11, 1, 13, 2, 2, 12, ' ', '~', 2, 2, + fontUI2_Widths, + fontUI2_Offsets, + fontUI2_Data}; + const struct font fontUI2Narrow = { 11, 1, 13, 2, 2, 12, ' ', '~', 1, 2, fontUI2_Widths, fontUI2_Offsets, fontUI2_Data}; @@ -576,7 +607,15 @@ static const uint16_t fontLargeNumbers_Offsets[]; static const fontcolumn_t fontLargeNumbers_Data[]; - const struct font fontLargeNumbers = { 16, 2, 21, 1, 3, 15, '%', ':', + const struct font fontLargeNumbers = { 16, 2, 21, 1, 3, 15, '%', ':', 1, 1, + fontLargeNumbers_Widths, + fontLargeNumbers_Offsets, + fontLargeNumbers_Data}; + const struct font fontLargeNumbersDouble = { 16, 2, 21, 1, 3, 15, '%', ':', 2, 2, + fontLargeNumbers_Widths, + fontLargeNumbers_Offsets, + fontLargeNumbers_Data}; + const struct font fontLargeNumbersNarrow = { 16, 2, 21, 1, 3, 15, '%', ':', 1, 2, fontLargeNumbers_Widths, fontLargeNumbers_Offsets, fontLargeNumbers_Data}; diff --git a/halext/templates/gdispXXXXX/gdisp_lld.c b/halext/templates/gdispXXXXX/gdisp_lld.c index a677ad31..cb465915 100644 --- a/halext/templates/gdispXXXXX/gdisp_lld.c +++ b/halext/templates/gdispXXXXX/gdisp_lld.c @@ -81,9 +81,6 @@ /* Driver exported functions. */ /*===========================================================================*/ -/* Include the software emulation routines */ -#include "gdisp_lld_inc_emulation.c.h" - /* ---- Required Routines ---- */ /* The following 2 routines are required. @@ -138,83 +135,6 @@ void gdisp_lld_drawpixel(coord_t x, coord_t y, color_t color) { gdisp_lld_fillarea() and gdisp_lld_blitarea(). */ -#if GDISP_HARDWARE_POWERCONTROL || defined(__DOXYGEN__) - /** - * @brief Sets the power mode for the graphic device. - * @note The power modes are powerOn, powerSleep and powerOff. - * If powerSleep is not supported it is equivalent to powerOn. - * - * @param[in] powerMode The new power mode - * - * @notapi - */ - void gdisp_lld_setpowermode(gdisp_powermode_t powerMode) { - if (GDISP.Powermode == powerMode) - return; - - switch(powerMode) { - case powerOff: - /* Code here */ - break; - case powerOn: - /* Code here */ - /* You may need this --- - if (GDISP.Powermode != powerSleep) - gdisp_lld_init(); - */ - break; - case powerSleep: - /* Code here */ - break; - default: - return; - } - - GDISP.Powermode = powerMode; - } -#endif - -#if GDISP_HARDWARE_ORIENTATION || defined(__DOXYGEN__) - /** - * @brief Sets the orientation of the display. - * @note This may be ignored if not supported by the device. - * - * @param[in] newOrientation The new orientation - * - * @notapi - */ - void gdisp_lld_setorientation(gdisp_orientation_t newOrientation) { - if (GDISP.Orientation == newOrientation) - return; - - switch(newOrientation) { - case portrait: - /* Code here */ - GDISP.Height = SCREEN_HEIGHT; - GDISP.Width = SCREEN_WIDTH; - break; - case landscape: - /* Code here */ - GDISP.Height = SCREEN_WIDTH; - GDISP.Width = SCREEN_HEIGHT; - break; - case portraitInv: - /* Code here */ - GDISP.Height = SCREEN_HEIGHT; - GDISP.Width = SCREEN_WIDTH; - break; - case landscapeInv: - /* Code here */ - GDISP.Height = SCREEN_WIDTH; - GDISP.Width = SCREEN_HEIGHT; - break; - default: - return; - } - GDISP.Orientation = newOrientation; - } -#endif - #if GDISP_HARDWARE_CLEARS || defined(__DOXYGEN__) /** * @brief Clear the display. @@ -248,26 +168,6 @@ void gdisp_lld_drawpixel(coord_t x, coord_t y, color_t color) { } #endif -#if GDISP_HARDWARE_BOX || defined(__DOXYGEN__) - /** - * @brief Draw a box. - * @pre The GDISP unit must be in powerOn or powerSleep mode. - * - * @param[in] x0,y0 The start position - * @param[in] cx,cy The size of the box (outside dimensions) - * @param[in] color The color to use - * @param[in] filled Should the box should be filled - * - * @notapi - */ - void gdisp_lld_drawbox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) { - #if GDISP_NEED_VALIDATION - /* Need to clip to screen */ - #endif - /* Code here */ - } -#endif - #if GDISP_HARDWARE_FILLS || defined(__DOXYGEN__) /** * @brief Fill an area with a color. @@ -476,5 +376,86 @@ void gdisp_lld_drawpixel(coord_t x, coord_t y, color_t color) { } #endif +#if GDISP_HARDWARE_CONTROL || defined(__DOXYGEN__) + /** + * @brief Driver Control + * @detail Unsupported control codes are ignored. + * @note The value parameter should always be typecast to (void *). + * @note There are some predefined and some specific to the low level driver. + * @note GDISP_CONTROL_POWER - Takes a gdisp_powermode_t + * GDISP_CONTROL_ORIENTATION - Takes a gdisp_orientation_t + * GDISP_CONTROL_BACKLIGHT - Takes an int from 0 to 100. For a driver + * that only supports off/on anything other + * than zero is on. + * GDISP_CONTROL_CONTRAST - Takes an int from 0 to 100. + * GDISP_CONTROL_LLD - Low level driver control constants start at + * this value. + * + * @param[in] what What to do. + * @param[in] value The value to use (always cast to a void *). + * + * @notapi + */ + void gdisp_lld_control(int what, void *value) { + switch(what) { + case GDISP_CONTROL_POWER: + if (GDISP.Powermode == (gdisp_powermode_t)value) + return; + switch((gdisp_powermode_t)value) { + case powerOff: + /* Code here */ + break; + case powerOn: + /* Code here */ + /* You may need this --- + if (GDISP.Powermode != powerSleep) + gdisp_lld_init(); + */ + break; + case powerSleep: + /* Code here */ + break; + default: + return; + } + GDISP.Powermode = (gdisp_powermode_t)value; + return; + case GDISP_CONTROL_ORIENTATION: + if (GDISP.Orientation == (gdisp_orientation_t)value) + return; + switch((gdisp_orientation_t)value) { + case portrait: + /* Code here */ + GDISP.Height = SCREEN_HEIGHT; + GDISP.Width = SCREEN_WIDTH; + break; + case landscape: + /* Code here */ + GDISP.Height = SCREEN_WIDTH; + GDISP.Width = SCREEN_HEIGHT; + break; + case portraitInv: + /* Code here */ + GDISP.Height = SCREEN_HEIGHT; + GDISP.Width = SCREEN_WIDTH; + break; + case landscapeInv: + /* Code here */ + GDISP.Height = SCREEN_WIDTH; + GDISP.Width = SCREEN_HEIGHT; + break; + default: + return; + } + GDISP.Orientation = (gdisp_orientation_t)value; + return; +/* + case GDISP_CONTROL_BACKLIGHT: + case GDISP_CONTROL_CONTRAST: +*/ + } + } +#endif + #endif /* HAL_USE_GDISP */ /** @} */ diff --git a/halext/templates/gdispXXXXX/gdisp_lld.h b/halext/templates/gdispXXXXX/gdisp_lld.h deleted file mode 100644 index f32b3e47..00000000 --- a/halext/templates/gdispXXXXX/gdisp_lld.h +++ /dev/null @@ -1,150 +0,0 @@ -/* - ChibiOS/RT - Copyright (C) 2012 - Joel Bodenmann aka Tectu - - This file is part of ChibiOS-LCD-Driver. - - ChibiOS-LCD-Driver 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 3 of the License, or - (at your option) any later version. - - ChibiOS-LCD-Driver 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, see . -*/ - -/** - * @file templates/gdisp_lld.h - * @brief GDISP Graphic Driver subsystem low level driver header template. - * - * @addtogroup GDISP - * @{ - */ - -#ifndef _GDISP_LLD_H -#define _GDISP_LLD_H - -#if HAL_USE_GDISP || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver constants. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Derived constants and error checks. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* Driver data structures and types. */ -/*===========================================================================*/ - -/** - * @brief Structure representing a GDISP driver. - * @note Implementations may extend this structure to contain more, - * architecture dependent, fields. - */ -struct GDISPDriver { - /** - * @brief Width of the screen. - * @note Read-only. - */ - coord_t Width; - /** - * @brief Height of the screen. - * @note Read-only. - */ - coord_t Height; - /** - * @brief Current orientation of the screen. - * @note Read-only. - */ - gdisp_orientation_t Orientation; - /** - * @brief Current power mode of the screen. - * @note Read-only. - */ - gdisp_powermode_t Powermode; - - #if defined(GDISP_DRIVER_EXT_FIELDS) - GDISP_DRIVER_EXT_FIELDS - #endif - /* End of mandatory fields */ -}; - -/*===========================================================================*/ -/* Driver macros. */ -/*===========================================================================*/ - -/*===========================================================================*/ -/* External declarations. */ -/*===========================================================================*/ - -#if !defined(__DOXYGEN__) - extern GDISPDriver GDISP; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - - /* Core functions */ - void gdisp_lld_init(void); - void gdisp_lld_setpowermode(gdisp_powermode_t powerMode); - void gdisp_lld_setorientation(gdisp_orientation_t newOrientation); - - /* Some of these functions will be implemented in software by the high level driver - depending on the GDISP_HARDWARE_XXX macros defined in gdisp_lld_config.h. - */ - - /* Drawing functions */ - void gdisp_lld_clear(color_t color); - void gdisp_lld_drawpixel(coord_t x, coord_t y, color_t color); - void gdisp_lld_drawline(coord_t x0, coord_t y0, coord_t x1, coord_t y1, color_t color); - void gdisp_lld_drawbox(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color); - void gdisp_lld_fillarea(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color); - void gdisp_lld_blitarea(coord_t x, coord_t y, coord_t cx, coord_t cy, pixel_t *buffer); - - /* Circular Drawing Functions */ - #if GDISP_NEED_CIRCLE - void gdisp_lld_drawcircle(coord_t x, coord_t y, coord_t radius, color_t color); - void gdisp_lld_fillcircle(coord_t x, coord_t y, coord_t radius, color_t color); - #endif - - #if GDISP_NEED_ELLIPSE - void gdisp_lld_drawellipse(coord_t x, coord_t y, coord_t a, coord_t b, color_t color); - void gdisp_lld_fillellipse(coord_t x, coord_t y, coord_t a, coord_t b, color_t color); - #endif - - /* Text Rendering Functions */ - #if GDISP_NEED_TEXT - void gdisp_lld_drawchar(coord_t x, coord_t y, char c, font_t font, color_t color); - void gdisp_lld_fillchar(coord_t x, coord_t y, char c, font_t font, color_t color, color_t bgcolor); - #endif - - /* Pixel readback */ - #if GDISP_NEED_PIXELREAD - color_t gdisp_lld_getpixelcolor(coord_t x, coord_t y); - #endif - - /* Scrolling Function - clears the area scrolled out */ - #if GDISP_NEED_SCROLL - void gdisp_lld_verticalscroll(coord_t x, coord_t y, coord_t cx, coord_t cy, int lines, color_t bgcolor); - #endif - -#ifdef __cplusplus -} -#endif - -#endif /* HAL_USE_GDISP */ - -#endif /* _GDISP_LLD_H */ -/** @} */ diff --git a/halext/templates/gdispXXXXX/gdisp_lld_config.h b/halext/templates/gdispXXXXX/gdisp_lld_config.h index 156a809e..0caf3f4c 100644 --- a/halext/templates/gdispXXXXX/gdisp_lld_config.h +++ b/halext/templates/gdispXXXXX/gdisp_lld_config.h @@ -1,208 +1,70 @@ -/* - ChibiOS/RT - Copyright (C) 2012 - Joel Bodenmann aka Tectu - - This file is part of ChibiOS-LCD-Driver. - - ChibiOS-LCD-Driver 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 3 of the License, or - (at your option) any later version. - - ChibiOS-LCD-Driver 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, see . -*/ - -/** - * @file templates/gdisp_lld_config.h - * @brief GDISP Graphic Driver subsystem low level driver header template. - * - * @addtogroup GDISP - * @{ - */ - -#ifndef _GDISP_LLD_CONFIG_H -#define _GDISP_LLD_CONFIG_H - -#if HAL_USE_GDISP || defined(__DOXYGEN__) - -/*===========================================================================*/ -/* Driver pre-compile time settings. */ -/*===========================================================================*/ - -/** - * @name GDISP hardware accelerated support - * @{ - */ - /** - * @brief Hardware supports changing the orientation. - * @details If set to @p FALSE a software stubb is provided. - */ - #define GDISP_HARDWARE_ORIENTATION FALSE - - /** - * @brief Hardware supports power control. - * @details If set to @p FALSE a software stubb is provided. - */ - #define GDISP_HARDWARE_POWERCONTROL FALSE - - /** - * @brief Hardware accelerated line drawing. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_LINES FALSE - - /** - * @brief Hardware accelerated box drawing. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_BOX FALSE - - /** - * @brief Hardware accelerated screen clears. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_CLEARS FALSE - - /** - * @brief Hardware accelerated rectangular fills. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_FILLS FALSE - - /** - * @brief Hardware accelerated fills from an image. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_BITFILLS FALSE - - /** - * @brief Hardware accelerated circles. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_CIRCLES FALSE - - /** - * @brief Hardware accelerated filled circles. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_CIRCLEFILLS FALSE - - /** - * @brief Hardware accelerated ellipses. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_ELLIPSES FALSE - - /** - * @brief Hardware accelerated filled ellipses. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_ELLIPSEFILLS FALSE - - /** - * @brief Hardware accelerated text drawing. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_TEXT FALSE - - /** - * @brief Hardware accelerated text drawing with a filled background. - * @details If set to @p FALSE software emulation is used. - */ - #define GDISP_HARDWARE_TEXTFILLS FALSE - - /** - * @brief Hardware accelerated scrolling. - * @details If set to @p FALSE there is no support for scrolling. - */ - #define GDISP_HARDWARE_SCROLL FALSE - - /** - * @brief Reading back of pixel values. - * @details If set to @p FALSE there is no support for pixel read-back. - */ - #define GDISP_HARDWARE_PIXELREAD FALSE -/** @} */ - -/** - * @name GDISP software algorithm choices - * @{ - */ - /** - * @brief For filled text drawing, use a background fill and then draw - * the text instead of using a blit or direct pixel drawing. - * @details If set to @p TRUE background fill and then text draw is used. - * @note This is ignored if hardware accelerated text is supported. - */ - #define GDISP_SOFTWARE_TEXTFILLDRAW FALSE - /** - * @brief For filled text drawing, when using a bitmap blit - * use a column by column buffer rather than a full character - * buffer to save memory at a small performance cost. - * @details If set to @p TRUE background fill one character column at a time. - * @note This is ignored if software text using blit is not being used. - */ - #define GDISP_SOFTWARE_TEXTBLITCOLUMN FALSE -/** @} */ - -/** - * @name GDISP pixel format choices - * @{ - */ - /** - * @brief The native pixel format for this device - * @note One of the following should be defined: - * GDISP_PIXELFORMAT_RGB565 - * GDISP_PIXELFORMAT_RGB888 - * GDISP_PIXELFORMAT_RGB444 - * GDISP_PIXELFORMAT_RGB332 - * GDISP_PIXELFORMAT_RGB666 - * GDISP_PIXELFORMAT_CUSTOM - * @note If you define GDISP_PIXELFORMAT_CUSTOM you need to also define - * color_t, RGB2COLOR(r,g,b), HTML2COLOR(h), - * RED_OF(c), GREEN_OF(c), BLUE_OF(c), - * COLOR(c) and MASKCOLOR. - */ - #define GDISP_PIXELFORMAT_RGB565 - - /** - * @brief Do pixels require packing for a blit - * @note Is only valid for a pixel format that doesn't fill it's datatype. ie formats: - * GDISP_PIXELFORMAT_RGB888 - * GDISP_PIXELFORMAT_RGB444 - * GDISP_PIXELFORMAT_RGB666 - * GDISP_PIXELFORMAT_CUSTOM - * @note If you use GDISP_PIXELFORMAT_CUSTOM and packed bit fills - * you need to also define @P gdispPackPixels(buf,cx,x,y,c) - * @note If you are using GDISP_HARDWARE_BITFILLS = FALSE then the pixel - * format must not be a packed format as the software blit does - * not support packed pixels - * @note Very few cases should actually require packed pixels as the low - * level driver can also pack on the fly as it is sending it - * to the graphics device. - */ - #define GDISP_PACKED_PIXELS FALSE - - /** - * @brief Do lines of pixels require packing for a blit - * @note Ignored if GDISP_PACKED_PIXELS is FALSE - */ - #define GDISP_PACKED_LINES FALSE - - /** - * @brief Do lines of pixels require packing for a blit - * @note Ignored if GDISP_PACKED_PIXELS is FALSE - */ - #define GDISP_PACKED_LINES FALSE -/** @} */ - -#endif /* HAL_USE_GDISP */ - -#endif /* _GDISP_LLD_CONFIG_H */ -/** @} */ +/* + ChibiOS/RT - Copyright (C) 2012 + Joel Bodenmann aka Tectu + + This file is part of ChibiOS-LCD-Driver. + + ChibiOS-LCD-Driver 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 3 of the License, or + (at your option) any later version. + + ChibiOS-LCD-Driver 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, see . +*/ + +/** + * @file templates/gdisp_lld_config.h + * @brief GDISP Graphic Driver subsystem low level driver header template. + * + * @addtogroup GDISP + * @{ + */ + +#ifndef _GDISP_LLD_CONFIG_H +#define _GDISP_LLD_CONFIG_H + +#if HAL_USE_GDISP || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Driver hardware support. */ +/*===========================================================================*/ + +#define GDISP_HARDWARE_LINES FALSE +#define GDISP_HARDWARE_CLEARS FALSE +#define GDISP_HARDWARE_FILLS FALSE +#define GDISP_HARDWARE_BITFILLS FALSE +#define GDISP_HARDWARE_CIRCLES FALSE +#define GDISP_HARDWARE_CIRCLEFILLS FALSE +#define GDISP_HARDWARE_ELLIPSES FALSE +#define GDISP_HARDWARE_ELLIPSEFILLS FALSE +#define GDISP_HARDWARE_TEXT FALSE +#define GDISP_HARDWARE_TEXTFILLS FALSE +#define GDISP_HARDWARE_SCROLL FALSE +#define GDISP_HARDWARE_PIXELREAD FALSE +#define GDISP_HARDWARE_CONTROL FALSE + +#define GDISP_SOFTWARE_TEXTFILLDRAW FALSE +#define GDISP_SOFTWARE_TEXTBLITCOLUMN FALSE + +#define GDISP_PIXELFORMAT_RGB565 +#define GDISP_PACKED_PIXELS FALSE +#define GDISP_PACKED_LINES FALSE + +/*===========================================================================*/ +/* Extra fields for the GDISPDriver structure */ +/*===========================================================================*/ + +/* +#define GDISP_DRIVER_EXT_FIELDS int abc; int def; +*/ + +#endif /* HAL_USE_GDISP */ + +#endif /* _GDISP_LLD_CONFIG_H */ +/** @} */