From bee9002fcc323e76c9e243424c48f52847f72b67 Mon Sep 17 00:00:00 2001 From: Joel Bodenmann Date: Thu, 20 Dec 2012 19:46:34 +0100 Subject: [PATCH 01/12] small doxygen cleanup --- include/gdisp/fonts.h | 3 --- include/gdisp/gdisp.h | 7 +++---- include/gdisp/options.h | 2 +- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/include/gdisp/fonts.h b/include/gdisp/fonts.h index 34a5b89d..f92f1b81 100644 --- a/include/gdisp/fonts.h +++ b/include/gdisp/fonts.h @@ -71,9 +71,6 @@ struct font { const fontcolumn_t *dataTable; }; -/** - * @brief Macros to get to the complex parts of the font structure. - */ #define _getCharWidth(f,c) (((c) < (f)->minChar || (c) > (f)->maxChar) ? 0 : (f)->widthTable[(c) - (f)->minChar]) #define _getCharOffset(f,c) ((f)->offsetTable[(c) - (f)->minChar]) #define _getCharData(f,c) (&(f)->dataTable[_getCharOffset(f, c)]) diff --git a/include/gdisp/gdisp.h b/include/gdisp/gdisp.h index f8d5745f..da6d859f 100644 --- a/include/gdisp/gdisp.h +++ b/include/gdisp/gdisp.h @@ -52,7 +52,8 @@ typedef int16_t coord_t; /*===========================================================================*/ /** - * @brief Some basic colors + * @name Some basic colors + * @{ */ #define White HTML2COLOR(0xFFFFFF) #define Black HTML2COLOR(0x000000) @@ -76,6 +77,7 @@ typedef int16_t coord_t; #define Orange HTML2COLOR(0xFFA500) #define Pink HTML2COLOR(0xFFC0CB) #define SkyBlue HTML2COLOR(0x87CEEB) +/** @} */ /*===========================================================================*/ /* Low Level Driver details and error checks. */ @@ -102,9 +104,6 @@ typedef enum fontmetric {fontHeight, fontDescendersHeight, fontLineSpacing, font /*===========================================================================*/ #if (GDISP_NEED_TEXT && GDISP_OLD_FONT_DEFINITIONS) || defined(__DOXYGEN__) - /** - * @brief Predefined fonts. - */ #if GDISP_INCLUDE_FONT_SMALL extern const struct font fontSmall; extern const struct font fontSmallDouble; diff --git a/include/gdisp/options.h b/include/gdisp/options.h index b53138ca..2fedd34d 100644 --- a/include/gdisp/options.h +++ b/include/gdisp/options.h @@ -163,7 +163,7 @@ #define GDISP_OLD_FONT_DEFINITIONS FALSE #endif /** - * @brief Predefined built in fonts. + * @brief Predefined built in fonts * @note Turning off the ones you are not using can save program size. */ #ifndef GDISP_INCLUDE_FONT_SMALL From 2df6eaf2fdd5064b410369cc67b614362a63dde2 Mon Sep 17 00:00:00 2001 From: Joel Bodenmann Date: Thu, 20 Dec 2012 19:50:02 +0100 Subject: [PATCH 02/12] small demo code cleanup --- demos/modules/gdisp_basics/main.c | 7 ++++--- demos/modules/gdisp_circles/main.c | 1 - demos/modules/gdisp_text/main.c | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/demos/modules/gdisp_basics/main.c b/demos/modules/gdisp_basics/main.c index e18b0e9e..fa0bef45 100644 --- a/demos/modules/gdisp_basics/main.c +++ b/demos/modules/gdisp_basics/main.c @@ -39,9 +39,10 @@ int main(void) { // Code Here gdispDrawBox(10, 10, width/2, height/2, Yellow); - gdispFillArea (width/2, height/2, width/2-10, height/2-10, Blue); - gdispDrawLine (5, 30, width-50, height-40, Red); - for(i=5, j=0; i < width && j < height; i+=7, j+=i/20) + gdispFillArea(width/2, height/2, width/2-10, height/2-10, Blue); + gdispDrawLine(5, 30, width-50, height-40, Red); + + for(i = 5, j = 0; i < width && j < height; i += 7, j += i/20) gdispDrawPixel (i, j, White); while(TRUE) { diff --git a/demos/modules/gdisp_circles/main.c b/demos/modules/gdisp_circles/main.c index d682a6ff..45764d4f 100644 --- a/demos/modules/gdisp_circles/main.c +++ b/demos/modules/gdisp_circles/main.c @@ -44,7 +44,6 @@ int main(void) { gdispDrawArc(width-width/8, height/8, 30, 10, 70, Gray); gdispFillArc(width/8, height/8, 30, 10, 70, Gray); - while(TRUE) { chThdSleepMilliseconds(500); } diff --git a/demos/modules/gdisp_text/main.c b/demos/modules/gdisp_text/main.c index 907e84be..4dc45f71 100644 --- a/demos/modules/gdisp_text/main.c +++ b/demos/modules/gdisp_text/main.c @@ -25,7 +25,7 @@ int main(void) { coord_t width, height; font_t font1, font2, font3, font4; - const char *msg; + const char *msg; halInit(); chSysInit(); @@ -47,6 +47,7 @@ int main(void) { // Display large numbers on the right (measuring the string) msg = "123456"; gdispDrawString(width-gdispGetStringWidth(msg, font4)-3, 3, msg, font4, Green); + // Display the font name under it. msg = gdispGetFontName(font4); gdispDrawString(width-gdispGetStringWidth(msg, font1)-3, 20, msg, font1, Green); From 9d2f63d4b7b83ae9185c863c9dd090de19614709 Mon Sep 17 00:00:00 2001 From: Joel Bodenmann Date: Thu, 20 Dec 2012 23:33:19 +0100 Subject: [PATCH 03/12] doxygen warning fix --- include/gwin/options.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/gwin/options.h b/include/gwin/options.h index e5e335bb..6e17e61f 100644 --- a/include/gwin/options.h +++ b/include/gwin/options.h @@ -45,7 +45,7 @@ * @details Defaults to FALSE * @note To use chprintf() for printing in a console window you need to * include in your application source file... - * #include "chprintf.h" + * \#include "chprintf.h" * Also in your makefile, as part of your list of C source files, include * ${CHIBIOS}/os/various/chprintf.c */ From f2219b5353cfccf1720a4cc583ab2e7962c47e09 Mon Sep 17 00:00:00 2001 From: Joel Bodenmann Date: Fri, 21 Dec 2012 09:41:01 +0100 Subject: [PATCH 04/12] doxygen fix --- src/gwin/graph.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gwin/graph.c b/src/gwin/graph.c index 39628047..b75d76ee 100644 --- a/src/gwin/graph.c +++ b/src/gwin/graph.c @@ -18,10 +18,10 @@ along with this program. If not, see . */ /** - * @file src/gwin/button.c + * @file src/gwin/graph.c * @brief GWIN sub-system button code. * - * @defgroup Button Button + * @defgroup Graph Graph * @ingroup GWIN * * @{ From b6a8a15536b450049a4985d36825317b633af6b1 Mon Sep 17 00:00:00 2001 From: Joel Bodenmann Date: Fri, 21 Dec 2012 15:18:22 +0100 Subject: [PATCH 05/12] doxygen & cleanup --- include/gwin/button.h | 98 +++++++++++++++++++++++++++++------ include/gwin/graph.h | 115 ++++++++++++++++++++++++++++-------------- src/gwin/button.c | 43 ---------------- src/gwin/graph.c | 70 ------------------------- 4 files changed, 160 insertions(+), 166 deletions(-) diff --git a/include/gwin/button.h b/include/gwin/button.h index 698c840a..ffec858b 100644 --- a/include/gwin/button.h +++ b/include/gwin/button.h @@ -97,24 +97,92 @@ typedef struct GButtonObject_t { extern "C" { #endif - GHandle gwinCreateButton(GButtonObject *gb, coord_t x, coord_t y, coord_t width, coord_t height, font_t font, GButtonType type); - void gwinSetButtonStyle(GHandle gh, const GButtonStyle *style); - void gwinSetButtonText(GHandle gh, const char *txt, bool_t useAlloc); - void gwinButtonDraw(GHandle gh); - #define gwinGetButtonState(gh) (((GButtonObject *)(gh))->state) +/** + * @brief Create a button window. + * @return NULL if there is no resultant drawing area, otherwise a window handle. + * + * @param[in] gb The GButtonObject structure to initialise. If this is NULL the structure is dynamically allocated. + * @param[in] x,y The screen co-ordinates for the bottom left corner of the window + * @param[in] width The width of the window + * @param[in] height The height of the window + * @param[in] font The font to use + * @param[in] type The type of button + * @note The drawing color gets set to White and the background drawing color to Black. + * @note The dimensions and position may be changed to fit on the real screen. + * @note The button is not automatically drawn. Call gwinButtonDraw() after changing the button style or setting the text. + * + * @api + */ +GHandle gwinCreateButton(GButtonObject *gb, coord_t x, coord_t y, coord_t width, coord_t height, font_t font, GButtonType type); - // Get the source handle so the application can listen for events - #define gwinGetButtonSource(gh) ((GSourceHandle)(gh)) +/** + * @brief Set the style of a button. + * @details The button style is defined by its shape and colours. + * + * @param[in] gh The window handle (must be a button window) + * @param[in] style The button style to set. + * @note The button is not automatically redrawn. Call gwinButtonDraw() after changing the button style + * + * @api + */ +void gwinSetButtonStyle(GHandle gh, const GButtonStyle *style); - #if defined(GINPUT_NEED_MOUSE) && GINPUT_NEED_MOUSE - // Attach a mouse source to this button. - bool_t gwinAttachButtonMouseSource(GHandle gh, GSourceHandle gsh); - #endif +/** + * @brief Set the text of a button. + * + * @param[in] gh The window handle (must be a button window) + * @param[in] txt The button text to set. This must be a constant string unless useAlloc is set. + * @param[in] useAlloc If TRUE the string specified will be copied into dynamically allocated memory. + * @note The button is not automatically redrawn. Call gwinButtonDraw() after changing the button text. + * + * @api + */ +void gwinSetButtonText(GHandle gh, const char *txt, bool_t useAlloc); - #if defined(GINPUT_NEED_TOGGLE) && GINPUT_NEED_TOGGLE - // Attach a toggle source to this button. - bool_t gwinAttachButtonToggleSource(GHandle gh, GSourceHandle gsh); - #endif +/** + * @brief Redraw the button. + * + * @param[in] gh The window handle (must be a button window) + * + * @api + */ +void gwinButtonDraw(GHandle gh); + +#define gwinGetButtonState(gh) (((GButtonObject *)(gh))->state) + +/** + * @brief Get the source handle of a button + * @details Get the source handle of a button so the application can listen for events + * + * @param[in] gh The Hanlde + */ +#define gwinGetButtonSource(gh) ((GSourceHandle)(gh)) + +#if defined(GINPUT_NEED_MOUSE) && GINPUT_NEED_MOUSE + /** + * @brief Attach a mouse source + * @details Attach a mouse source to a given button + * + * @param[in] gh The button handle + * @param[in] gsh The source handle + * + * @return + */ + bool_t gwinAttachButtonMouseSource(GHandle gh, GSourceHandle gsh); +#endif + +#if defined(GINPUT_NEED_TOGGLE) && GINPUT_NEED_TOGGLE + /** + * @brief Attach a toggle source + * @details Attach a toggle source to this button + * + * @gh The button handle + * @gsh The source handle + * + * @return + */ + bool_t gwinAttachButtonToggleSource(GHandle gh, GSourceHandle gsh); +#endif #ifdef __cplusplus } diff --git a/include/gwin/graph.h b/include/gwin/graph.h index 155fd9a9..9267813b 100644 --- a/include/gwin/graph.h +++ b/include/gwin/graph.h @@ -113,50 +113,89 @@ typedef struct GGraphObject_t { extern "C" { #endif - GHandle gwinCreateGraph(GGraphObject *gg, coord_t x, coord_t y, coord_t width, coord_t height); - void gwinGraphSetStyle(GHandle gh, const GGraphStyle *pstyle); - void gwinGraphSetOrigin(GHandle gh, coord_t x, coord_t y); - void gwinGraphDrawAxis(GHandle gh); - void gwinGraphStartSet(GHandle gh); - void gwinGraphDrawPoint(GHandle gh, coord_t x, coord_t y); - void gwinGraphDrawPoints(GHandle gh, const GGraphPoint *points, unsigned count); +/** + * @brief Create a graph window. + * @return NULL if there is no resultant drawing area, otherwise a window handle. + * + * @param[in] gg The GGraphObject structure to initialise. If this is NULL the structure is dynamically allocated. + * @param[in] x,y The screen co-ordinates for the bottom left corner of the window + * @param[in] width The width of the window + * @param[in] height The height of the window + * @note The console is not automatically cleared on creation. You must do that by calling gwinClear() (possibly after changing your background color) + * @note The coordinate system within the window for graphing operations (but not for any other drawing + * operation) is relative to the bottom left corner and then shifted right and up by the specified + * graphing x and y origin. Note that this system is inverted in the y direction relative to the display. + * This gives the best graphing arrangement ie. increasing y values are closer to the top of the display. + * + * @api + */ +GHandle gwinCreateGraph(GGraphObject *gg, coord_t x, coord_t y, coord_t width, coord_t height); -#ifdef __cplusplus -} -#endif +/** + * @brief Set the style of the graphing operations. + * + * @param[in] gh The window handle (must be a graph window) + * @param[in] pstyle The graph style to set. + * @note The graph is not automatically redrawn. The new style will apply to any new drawing operations. + * + * @api + */ +void gwinGraphSetStyle(GHandle gh, const GGraphStyle *pstyle); -/*===========================================================================*/ -/* Type definitions */ -/*===========================================================================*/ +/** + * @brief Set the origin for graphing operations. + * + * @param[in] gh The window handle (must be a graph window) + * @param[in] x, y The new origin for the graph (in graph coordinates relative to the bottom left corner). + * @note The graph is not automatically redrawn. The new origin will apply to any new drawing operations. + * + * @api + */ +void gwinGraphSetOrigin(GHandle gh, coord_t x, coord_t y); -typedef struct _Graph { - coord_t origin_x; - coord_t origin_y; - coord_t xmin; - coord_t xmax; - coord_t ymin; - coord_t ymax; - uint16_t grid_size; - uint16_t dot_space; - bool_t full_grid; - bool_t arrows; - color_t axis_color; - color_t grid_color; +/** + * @brief Draw the axis and the background grid. + * + * @param[in] gh The window handle (must be a graph window) + * @note The graph is not automatically cleared. You must do that first by calling gwinClear(). + * + * @api + */ +void gwinGraphDrawAxis(GHandle gh); - /* do never modify values below this line manually */ - coord_t x0; - coord_t x1; - coord_t y0; - coord_t y1; -} Graph; +/** + * @brief Start a new set of graphing data. + * @details This prevents a line being drawn from the last data point to the next point to be drawn. + * + * @param[in] gh The window handle (must be a graph window) + * + * @api + */ +void gwinGraphStartSet(GHandle gh); -#ifdef __cplusplus -extern "C" { -#endif +/** + * @brief Draw a graph point. + * @details A graph point and a line connecting to the previous point will be drawn. + * + * @param[in] gh The window handle (must be a graph window) + * @param[in] x, y The new point for the graph. + * + * @api + */ +void gwinGraphDrawPoint(GHandle gh, coord_t x, coord_t y); -/*===========================================================================*/ -/* Type definitions */ -/*===========================================================================*/ +/** + * @brief Draw multiple graph points. + * @details A graph point and a line connecting to each previous point will be drawn. + * + * @param[in] gh The window handle (must be a graph window) + * @param[in] points The array of points for the graph. + * @param[in] count The number of points in the array. + * @note This is slightly more efficient than calling gwinGraphDrawPoint() repeatedly. + * + * @api + */ +void gwinGraphDrawPoints(GHandle gh, const GGraphPoint *points, unsigned count); #ifdef __cplusplus } diff --git a/src/gwin/button.c b/src/gwin/button.c index 9a06f4fe..8a904d95 100644 --- a/src/gwin/button.c +++ b/src/gwin/button.c @@ -131,22 +131,6 @@ static void gwinButtonCallback(void *param, GEvent *pe) { #undef gh } -/** - * @brief Create a button window. - * @return NULL if there is no resultant drawing area, otherwise a window handle. - * - * @param[in] gb The GButtonObject structure to initialise. If this is NULL the structure is dynamically allocated. - * @param[in] x,y The screen co-ordinates for the bottom left corner of the window - * @param[in] width The width of the window - * @param[in] height The height of the window - * @param[in] font The font to use - * @param[in] type The type of button - * @note The drawing color gets set to White and the background drawing color to Black. - * @note The dimensions and position may be changed to fit on the real screen. - * @note The button is not automatically drawn. Call gwinButtonDraw() after changing the button style or setting the text. - * - * @api - */ GHandle gwinCreateButton(GButtonObject *gb, coord_t x, coord_t y, coord_t width, coord_t height, font_t font, GButtonType type) { if (!(gb = (GButtonObject *)_gwinInit((GWindowObject *)gb, x, y, width, height, sizeof(GButtonObject)))) return 0; @@ -161,16 +145,6 @@ GHandle gwinCreateButton(GButtonObject *gb, coord_t x, coord_t y, coord_t width, return (GHandle)gb; } -/** - * @brief Set the style of a button. - * @details The button style is defined by its shape and colours. - * - * @param[in] gh The window handle (must be a button window) - * @param[in] style The button style to set. - * @note The button is not automatically redrawn. Call gwinButtonDraw() after changing the button style - * - * @api - */ void gwinSetButtonStyle(GHandle gh, const GButtonStyle *style) { #define gbw ((GButtonObject *)gh) if (gh->type != GW_BUTTON) @@ -186,16 +160,6 @@ void gwinSetButtonStyle(GHandle gh, const GButtonStyle *style) { #undef gbw } -/** - * @brief Set the text of a button. - * - * @param[in] gh The window handle (must be a button window) - * @param[in] txt The button text to set. This must be a constant string unless useAlloc is set. - * @param[in] useAlloc If TRUE the string specified will be copied into dynamically allocated memory. - * @note The button is not automatically redrawn. Call gwinButtonDraw() after changing the button text. - * - * @api - */ void gwinSetButtonText(GHandle gh, const char *txt, bool_t useAlloc) { #define gbw ((GButtonObject *)gh) if (gh->type != GW_BUTTON) @@ -224,13 +188,6 @@ void gwinSetButtonText(GHandle gh, const char *txt, bool_t useAlloc) { #undef gbw } -/** - * @brief Redraw the button. - * - * @param[in] gh The window handle (must be a button window) - * - * @api - */ void gwinButtonDraw(GHandle gh) { color_t cedge; color_t cfill; diff --git a/src/gwin/graph.c b/src/gwin/graph.c index b75d76ee..a9d20c4b 100644 --- a/src/gwin/graph.c +++ b/src/gwin/graph.c @@ -176,22 +176,6 @@ static void lineto(GGraphObject *gg, coord_t x0, coord_t y0, coord_t x1, coord_t } } -/** - * @brief Create a graph window. - * @return NULL if there is no resultant drawing area, otherwise a window handle. - * - * @param[in] gg The GGraphObject structure to initialise. If this is NULL the structure is dynamically allocated. - * @param[in] x,y The screen co-ordinates for the bottom left corner of the window - * @param[in] width The width of the window - * @param[in] height The height of the window - * @note The console is not automatically cleared on creation. You must do that by calling gwinClear() (possibly after changing your background color) - * @note The coordinate system within the window for graphing operations (but not for any other drawing - * operation) is relative to the bottom left corner and then shifted right and up by the specified - * graphing x and y origin. Note that this system is inverted in the y direction relative to the display. - * This gives the best graphing arrangement ie. increasing y values are closer to the top of the display. - * - * @api - */ GHandle gwinCreateGraph(GGraphObject *gg, coord_t x, coord_t y, coord_t width, coord_t height) { if (!(gg = (GGraphObject *)_gwinInit((GWindowObject *)gg, x, y, width, height, sizeof(GGraphObject)))) return 0; @@ -202,15 +186,6 @@ GHandle gwinCreateGraph(GGraphObject *gg, coord_t x, coord_t y, coord_t width, c return (GHandle)gg; } -/** - * @brief Set the style of the graphing operations. - * - * @param[in] gh The window handle (must be a graph window) - * @param[in] pstyle The graph style to set. - * @note The graph is not automatically redrawn. The new style will apply to any new drawing operations. - * - * @api - */ void gwinGraphSetStyle(GHandle gh, const GGraphStyle *pstyle) { #define gg ((GGraphObject *)gh) @@ -242,15 +217,6 @@ void gwinGraphSetStyle(GHandle gh, const GGraphStyle *pstyle) { #undef gg } -/** - * @brief Set the origin for graphing operations. - * - * @param[in] gh The window handle (must be a graph window) - * @param[in] x, y The new origin for the graph (in graph coordinates relative to the bottom left corner). - * @note The graph is not automatically redrawn. The new origin will apply to any new drawing operations. - * - * @api - */ void gwinGraphSetOrigin(GHandle gh, coord_t x, coord_t y) { #define gg ((GGraphObject *)gh) @@ -263,14 +229,6 @@ void gwinGraphSetOrigin(GHandle gh, coord_t x, coord_t y) { #undef gg } -/** - * @brief Draw the axis and the background grid. - * - * @param[in] gh The window handle (must be a graph window) - * @note The graph is not automatically cleared. You must do that first by calling gwinClear(). - * - * @api - */ void gwinGraphDrawAxis(GHandle gh) { #define gg ((GGraphObject *)gh) coord_t i, xmin, ymin, xmax, ymax; @@ -332,14 +290,6 @@ void gwinGraphDrawAxis(GHandle gh) { #undef gg } -/** - * @brief Start a new set of graphing data. - * @details This prevents a line being drawn from the last data point to the next point to be drawn. - * - * @param[in] gh The window handle (must be a graph window) - * - * @api - */ void gwinGraphStartSet(GHandle gh) { if (gh->type != GW_GRAPH) return; @@ -347,15 +297,6 @@ void gwinGraphStartSet(GHandle gh) { gh->flags &= ~GGRAPH_FLG_CONNECTPOINTS; } -/** - * @brief Draw a graph point. - * @details A graph point and a line connecting to the previous point will be drawn. - * - * @param[in] gh The window handle (must be a graph window) - * @param[in] x, y The new point for the graph. - * - * @api - */ void gwinGraphDrawPoint(GHandle gh, coord_t x, coord_t y) { #define gg ((GGraphObject *)gh) @@ -382,17 +323,6 @@ void gwinGraphDrawPoint(GHandle gh, coord_t x, coord_t y) { #undef gg } -/** - * @brief Draw multiple graph points. - * @details A graph point and a line connecting to each previous point will be drawn. - * - * @param[in] gh The window handle (must be a graph window) - * @param[in] points The array of points for the graph. - * @param[in] count The number of points in the array. - * @note This is slightly more efficient than calling gwinGraphDrawPoint() repeatedly. - * - * @api - */ void gwinGraphDrawPoints(GHandle gh, const GGraphPoint *points, unsigned count) { #define gg ((GGraphObject *)gh) unsigned i; From b75f69d7a0640948b7d1e588ae2c041073a17b97 Mon Sep 17 00:00:00 2001 From: Joel Bodenmann Date: Fri, 21 Dec 2012 15:21:25 +0100 Subject: [PATCH 06/12] more update --- include/gwin/console.h | 68 ++++++++++++++++++++++++++++++++++++++---- src/gwin/console.c | 54 --------------------------------- 2 files changed, 63 insertions(+), 59 deletions(-) diff --git a/include/gwin/console.h b/include/gwin/console.h index 9fa867c8..30058b2b 100644 --- a/include/gwin/console.h +++ b/include/gwin/console.h @@ -70,11 +70,69 @@ typedef struct GConsoleObject_t { extern "C" { #endif - GHandle gwinCreateConsole(GConsoleObject *gc, coord_t x, coord_t y, coord_t width, coord_t height, font_t font); - BaseSequentialStream *gwinGetConsoleStream(GHandle gh); - void gwinPutChar(GHandle gh, char c); - void gwinPutString(GHandle gh, const char *str); - void gwinPutCharArray(GHandle gh, const char *str, size_t n); +/** + * @brief Create a console window. + * @details A console window allows text to be written using chprintf() (and the console functions defined here). + * @brief Text in a console window supports newlines and will wrap text as required. + * @return NULL if there is no resultant drawing area, otherwise a window handle. + * + * @param[in] gc The GConsoleObject structure to initialise. If this is NULL the structure is dynamically allocated. + * @param[in] x,y The screen co-ordinates for the bottom left corner of the window + * @param[in] width The width of the window + * @param[in] height The height of the window + * @param[in] font The font to use + * @note The console is not automatically cleared on creation. You must do that by calling gwinClear() (possibly after changing your background color) + * @note If the dispay does not support scrolling, the window will be cleared when the bottom line is reached. + * @note The default drawing color gets set to White and the background drawing color to Black. + * @note The dimensions and position may be changed to fit on the real screen. + * + * @api + */ +GHandle gwinCreateConsole(GConsoleObject *gc, coord_t x, coord_t y, coord_t width, coord_t height, font_t font); + +/** + * @brief Get a stream from a console window suitable for use with chprintf(). + * @return The stream handle or NULL if this is not a console window. + * + * @param[in] gh The window handle (must be a console window) + * + * @api + */ +BaseSequentialStream *gwinGetConsoleStream(GHandle gh); + +/** + * @brief Put a character at the cursor position in the window. + * @note Uses the current foreground color to draw the character and fills the background using the background drawing color + * + * @param[in] gh The window handle (must be a console window) + * @param[in] c The character to draw + * + * @api + */ +void gwinPutChar(GHandle gh, char c); + +/** + * @brief Put a string at the cursor position in the window. It will wrap lines as required. + * @note Uses the current foreground color to draw the string and fills the background using the background drawing color + * + * @param[in] gh The window handle (must be a console window) + * @param[in] str The string to draw + * + * @api + */ +void gwinPutString(GHandle gh, const char *str); + +/** + * @brief Put the character array at the cursor position in the window. It will wrap lines as required. + * @note Uses the current foreground color to draw the string and fills the background using the background drawing color + * + * @param[in] gh The window handle (must be a console window) + * @param[in] str The string to draw + * @param[in] n The number of characters to draw + * + * @api + */ +void gwinPutCharArray(GHandle gh, const char *str, size_t n); #ifdef __cplusplus } diff --git a/src/gwin/console.c b/src/gwin/console.c index 0297da30..9be7ee34 100644 --- a/src/gwin/console.c +++ b/src/gwin/console.c @@ -70,24 +70,6 @@ static const struct GConsoleWindowVMT_t GWindowConsoleVMT = { GWinStreamReadTimed }; -/** - * @brief Create a console window. - * @details A console window allows text to be written using chprintf() (and the console functions defined here). - * @brief Text in a console window supports newlines and will wrap text as required. - * @return NULL if there is no resultant drawing area, otherwise a window handle. - * - * @param[in] gc The GConsoleObject structure to initialise. If this is NULL the structure is dynamically allocated. - * @param[in] x,y The screen co-ordinates for the bottom left corner of the window - * @param[in] width The width of the window - * @param[in] height The height of the window - * @param[in] font The font to use - * @note The console is not automatically cleared on creation. You must do that by calling gwinClear() (possibly after changing your background color) - * @note If the dispay does not support scrolling, the window will be cleared when the bottom line is reached. - * @note The default drawing color gets set to White and the background drawing color to Black. - * @note The dimensions and position may be changed to fit on the real screen. - * - * @api - */ GHandle gwinCreateConsole(GConsoleObject *gc, coord_t x, coord_t y, coord_t width, coord_t height, font_t font) { if (!(gc = (GConsoleObject *)_gwinInit((GWindowObject *)gc, x, y, width, height, sizeof(GConsoleObject)))) return 0; @@ -99,29 +81,12 @@ GHandle gwinCreateConsole(GConsoleObject *gc, coord_t x, coord_t y, coord_t widt return (GHandle)gc; } -/** - * @brief Get a stream from a console window suitable for use with chprintf(). - * @return The stream handle or NULL if this is not a console window. - * - * @param[in] gh The window handle (must be a console window) - * - * @api - */ BaseSequentialStream *gwinGetConsoleStream(GHandle gh) { if (gh->type != GW_CONSOLE) return 0; return (BaseSequentialStream *)&(((GConsoleObject *)(gh))->stream); } -/** - * @brief Put a character at the cursor position in the window. - * @note Uses the current foreground color to draw the character and fills the background using the background drawing color - * - * @param[in] gh The window handle (must be a console window) - * @param[in] c The character to draw - * - * @api - */ void gwinPutChar(GHandle gh, char c) { uint8_t width; #define gcw ((GConsoleObject *)gh) @@ -178,30 +143,11 @@ void gwinPutChar(GHandle gh, char c) { #undef gcw } -/** - * @brief Put a string at the cursor position in the window. It will wrap lines as required. - * @note Uses the current foreground color to draw the string and fills the background using the background drawing color - * - * @param[in] gh The window handle (must be a console window) - * @param[in] str The string to draw - * - * @api - */ void gwinPutString(GHandle gh, const char *str) { while(*str) gwinPutChar(gh, *str++); } -/** - * @brief Put the character array at the cursor position in the window. It will wrap lines as required. - * @note Uses the current foreground color to draw the string and fills the background using the background drawing color - * - * @param[in] gh The window handle (must be a console window) - * @param[in] str The string to draw - * @param[in] n The number of characters to draw - * - * @api - */ void gwinPutCharArray(GHandle gh, const char *str, size_t n) { while(n--) gwinPutChar(gh, *str++); From d6740c5c91cf017096bea463a14eb0b378acabe5 Mon Sep 17 00:00:00 2001 From: etmatrix Date: Sat, 22 Dec 2012 18:50:17 +0100 Subject: [PATCH 07/12] Add benchmarks application --- demos/applications/benchmarks/gfxconf.h | 45 +++++++ demos/applications/benchmarks/main.c | 167 ++++++++++++++++++++++++ 2 files changed, 212 insertions(+) create mode 100644 demos/applications/benchmarks/gfxconf.h create mode 100644 demos/applications/benchmarks/main.c diff --git a/demos/applications/benchmarks/gfxconf.h b/demos/applications/benchmarks/gfxconf.h new file mode 100644 index 00000000..b86d6425 --- /dev/null +++ b/demos/applications/benchmarks/gfxconf.h @@ -0,0 +1,45 @@ +/** + * This file has a different license to the rest of the GFX system. + * You can copy, modify and distribute this file as you see fit. + * You do not need to publish your source modifications to this file. + * The only thing you are not permitted to do is to relicense it + * under a different license. + */ + +#ifndef _GFXCONF_H +#define _GFXCONF_H + +/* GFX sub-systems to turn on */ +#define GFX_USE_GDISP TRUE +#define GFX_USE_GWIN FALSE +#define GFX_USE_GEVENT FALSE +#define GFX_USE_GTIMER FALSE +#define GFX_USE_GINPUT FALSE + +/* Features for the GDISP sub-system. */ +#define GDISP_NEED_VALIDATION FALSE +#define GDISP_NEED_CLIP TRUE +#define GDISP_NEED_TEXT TRUE +#define GDISP_NEED_CIRCLE TRUE +#define GDISP_NEED_ELLIPSE FALSE +#define GDISP_NEED_ARC FALSE +#define GDISP_NEED_SCROLL FALSE +#define GDISP_NEED_PIXELREAD FALSE +#define GDISP_NEED_CONTROL TRUE +#define GDISP_NEED_MULTITHREAD TRUE +#define GDISP_NEED_ASYNC FALSE +#define GDISP_NEED_MSGAPI FALSE + +#define GINPUT_MOUSE_USE_CUSTOM_BOARD TRUE +/* Builtin Fonts */ +#define GDISP_INCLUDE_FONT_SMALL FALSE +#define GDISP_INCLUDE_FONT_LARGER FALSE +#define GDISP_INCLUDE_FONT_UI1 FALSE +#define GDISP_INCLUDE_FONT_UI2 TRUE +#define GDISP_INCLUDE_FONT_LARGENUMBERS TRUE + +/* Features for the GINPUT sub-system. */ +#define GINPUT_NEED_MOUSE FALSE + +#endif /* _GFXCONF_H */ + diff --git a/demos/applications/benchmarks/main.c b/demos/applications/benchmarks/main.c new file mode 100644 index 00000000..734231da --- /dev/null +++ b/demos/applications/benchmarks/main.c @@ -0,0 +1,167 @@ +/* + 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 . +*/ + +#include "ch.h" +#include "hal.h" +#include "chprintf.h" +#include "stdlib.h" +#include "string.h" +#include "gfx.h" + +#define SCB_DEMCR (*(volatile unsigned *)0xE000EDFC) +#define CPU_RESET_CYCLECOUNTER do { SCB_DEMCR = SCB_DEMCR | 0x01000000; \ +DWT_CYCCNT = 0; \ +DWT_CTRL = DWT_CTRL | 1 ; } while(0) + +int uitoa(unsigned int value, char * buf, int max) { + int n = 0; + int i = 0; + unsigned int tmp = 0; + + if (NULL == buf) + return -3; + + if (2 > max) + return -4; + + i=1; + tmp = value; + if (0 > tmp) { + tmp *= -1; + i++; + } + for (;;) { + tmp /= 10; + if (0 >= tmp) + break; + i++; + } + if (i >= max) { + buf[0] = '?'; + buf[1] = 0x0; + return 2; + } + + n = i; + tmp = value; + if (0 > tmp) { + tmp *= -1; + } + buf[i--] = 0x0; + for (;;) { + buf[i--] = (tmp % 10) + '0'; + tmp /= 10; + if (0 >= tmp) { + break; + } + } + if (-1 != i) { + buf[i--] = '-'; + } + + return n; +} + +static WORKING_AREA(waThread2, 2048); +__attribute__ ((__noreturn__)) +static msg_t Thread2(void *arg) { + (void)arg; + font_t font1; + chRegSetThreadName("lcd"); + + gdispInit(); + gdispSetOrientation(GDISP_ROTATE_90); + gdispClear(Black); + + uint16_t width = gdispGetWidth(); + uint16_t height = gdispGetHeight(); + + uint32_t pixels; + uint32_t i; + color_t random_color; + uint16_t rx, ry, rcx, rcy; + char pps_str[25]; + srand(DWT_CYCCNT); + + font1 = gdispOpenFont("UI2"); + + while (TRUE) { + gdispFillArea(10, 10, width-20, height-20, Grey); + gdispFillArea(30, 30, 300, 150, Red); + gdispFillArea(50, 50, 200, 100, Blue); + gdispFillArea(80, 80, 150, 50, Yellow); + gdispFillCircle(width/2, height/2, 50, White); + + const char *msg = "ChibiOS/GFX on SSD1289"; + gdispDrawString(width-gdispGetStringWidth(msg, font1)-3, height-24, msg, font1, White); + + chThdSleepMilliseconds(1000); + + pixels = 0; + gdispClear(Black); + gdispDrawString(10, height/2, "Doing 5000 random rectangles", font1, White); + chThdSleepMilliseconds(2000); + CPU_RESET_CYCLECOUNTER; + for (i = 0; i < 5000; i++) { + random_color = (rand() % 65535); + rx = (rand() % (width-10)); + ry = (rand() % (height-10)); + rcx = (rand() % ((width-rx)-10))+10; + rcy = (rand() % ((height-ry)-10))+10; + + gdispFillArea(rx, ry, rcx, rcy, random_color); + pixels += (rcx+1)*(rcy+1); + } + uint32_t ms = DWT_CYCCNT / 168000; + uint32_t pps = (float)pixels/((float)ms/1000.0f); + + memset (pps_str, 0, sizeof(pps_str)); + uitoa(pps, pps_str, sizeof(pps_str)); + strcat(pps_str, " Pixels/s"); + + gdispClear(Black); + gdispDrawString(100, height/2, pps_str, font1, White); + chThdSleepMilliseconds(3000); + } +} + +/* + * Application entry point. + */ +__attribute__ ((__noreturn__)) +int main(void) { + + /* + * System initializations. + * - HAL initialization, this also initializes the configured device drivers + * and performs the board-specific initializations. + * - Kernel initialization, the main() function becomes a thread and the + * RTOS is active. + */ + halInit(); + chSysInit(); + + /* + * Creates the example thread. + */ + chThdCreateStatic(waThread2, sizeof(waThread2), NORMALPRIO, Thread2, NULL); + while(TRUE) + chThdSleepMilliseconds(500); +} From a7eb91ace882ee5fbb23641017162bd8fe335a7d Mon Sep 17 00:00:00 2001 From: Joel Bodenmann Date: Sat, 22 Dec 2012 20:03:41 +0100 Subject: [PATCH 08/12] benchmark demo cleanup --- demos/applications/benchmarks/main.c | 36 ++++++++++------------------ 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/demos/applications/benchmarks/main.c b/demos/applications/benchmarks/main.c index 734231da..a6f6d134 100644 --- a/demos/applications/benchmarks/main.c +++ b/demos/applications/benchmarks/main.c @@ -1,15 +1,15 @@ /* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. + ChibiOS/GFX - Copyright (C) 2012 + Joel Bodenmann aka Tectu - This file is part of ChibiOS/RT. + This file is part of ChibiOS/GFX. - ChibiOS/RT is free software; you can redistribute it and/or modify + ChibiOS/GFX 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, + ChibiOS/GFX 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. @@ -80,13 +80,11 @@ int uitoa(unsigned int value, char * buf, int max) { } static WORKING_AREA(waThread2, 2048); -__attribute__ ((__noreturn__)) static msg_t Thread2(void *arg) { (void)arg; font_t font1; chRegSetThreadName("lcd"); - gdispInit(); gdispSetOrientation(GDISP_ROTATE_90); gdispClear(Black); @@ -140,28 +138,20 @@ static msg_t Thread2(void *arg) { gdispDrawString(100, height/2, pps_str, font1, White); chThdSleepMilliseconds(3000); } + + return 0; } -/* - * Application entry point. - */ -__attribute__ ((__noreturn__)) int main(void) { - - /* - * System initializations. - * - HAL initialization, this also initializes the configured device drivers - * and performs the board-specific initializations. - * - Kernel initialization, the main() function becomes a thread and the - * RTOS is active. - */ halInit(); chSysInit(); + gdispInit(); - /* - * Creates the example thread. - */ chThdCreateStatic(waThread2, sizeof(waThread2), NORMALPRIO, Thread2, NULL); - while(TRUE) + + while(TRUE) { chThdSleepMilliseconds(500); + } + + return 0; } From 130d84ec16a8566cd80c83e00d0cbfdcdd6ce072 Mon Sep 17 00:00:00 2001 From: Joel Bodenmann Date: Sat, 22 Dec 2012 20:45:11 +0100 Subject: [PATCH 09/12] benchmark demo update --- demos/applications/benchmarks/main.c | 157 ------------------ demos/{applications => }/benchmarks/gfxconf.h | 12 +- demos/benchmarks/main.c | 146 ++++++++++++++++ 3 files changed, 150 insertions(+), 165 deletions(-) delete mode 100644 demos/applications/benchmarks/main.c rename demos/{applications => }/benchmarks/gfxconf.h (80%) create mode 100644 demos/benchmarks/main.c diff --git a/demos/applications/benchmarks/main.c b/demos/applications/benchmarks/main.c deleted file mode 100644 index a6f6d134..00000000 --- a/demos/applications/benchmarks/main.c +++ /dev/null @@ -1,157 +0,0 @@ -/* - ChibiOS/GFX - Copyright (C) 2012 - Joel Bodenmann aka Tectu - - This file is part of ChibiOS/GFX. - - ChibiOS/GFX 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/GFX 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 . -*/ - -#include "ch.h" -#include "hal.h" -#include "chprintf.h" -#include "stdlib.h" -#include "string.h" -#include "gfx.h" - -#define SCB_DEMCR (*(volatile unsigned *)0xE000EDFC) -#define CPU_RESET_CYCLECOUNTER do { SCB_DEMCR = SCB_DEMCR | 0x01000000; \ -DWT_CYCCNT = 0; \ -DWT_CTRL = DWT_CTRL | 1 ; } while(0) - -int uitoa(unsigned int value, char * buf, int max) { - int n = 0; - int i = 0; - unsigned int tmp = 0; - - if (NULL == buf) - return -3; - - if (2 > max) - return -4; - - i=1; - tmp = value; - if (0 > tmp) { - tmp *= -1; - i++; - } - for (;;) { - tmp /= 10; - if (0 >= tmp) - break; - i++; - } - if (i >= max) { - buf[0] = '?'; - buf[1] = 0x0; - return 2; - } - - n = i; - tmp = value; - if (0 > tmp) { - tmp *= -1; - } - buf[i--] = 0x0; - for (;;) { - buf[i--] = (tmp % 10) + '0'; - tmp /= 10; - if (0 >= tmp) { - break; - } - } - if (-1 != i) { - buf[i--] = '-'; - } - - return n; -} - -static WORKING_AREA(waThread2, 2048); -static msg_t Thread2(void *arg) { - (void)arg; - font_t font1; - chRegSetThreadName("lcd"); - - gdispSetOrientation(GDISP_ROTATE_90); - gdispClear(Black); - - uint16_t width = gdispGetWidth(); - uint16_t height = gdispGetHeight(); - - uint32_t pixels; - uint32_t i; - color_t random_color; - uint16_t rx, ry, rcx, rcy; - char pps_str[25]; - srand(DWT_CYCCNT); - - font1 = gdispOpenFont("UI2"); - - while (TRUE) { - gdispFillArea(10, 10, width-20, height-20, Grey); - gdispFillArea(30, 30, 300, 150, Red); - gdispFillArea(50, 50, 200, 100, Blue); - gdispFillArea(80, 80, 150, 50, Yellow); - gdispFillCircle(width/2, height/2, 50, White); - - const char *msg = "ChibiOS/GFX on SSD1289"; - gdispDrawString(width-gdispGetStringWidth(msg, font1)-3, height-24, msg, font1, White); - - chThdSleepMilliseconds(1000); - - pixels = 0; - gdispClear(Black); - gdispDrawString(10, height/2, "Doing 5000 random rectangles", font1, White); - chThdSleepMilliseconds(2000); - CPU_RESET_CYCLECOUNTER; - for (i = 0; i < 5000; i++) { - random_color = (rand() % 65535); - rx = (rand() % (width-10)); - ry = (rand() % (height-10)); - rcx = (rand() % ((width-rx)-10))+10; - rcy = (rand() % ((height-ry)-10))+10; - - gdispFillArea(rx, ry, rcx, rcy, random_color); - pixels += (rcx+1)*(rcy+1); - } - uint32_t ms = DWT_CYCCNT / 168000; - uint32_t pps = (float)pixels/((float)ms/1000.0f); - - memset (pps_str, 0, sizeof(pps_str)); - uitoa(pps, pps_str, sizeof(pps_str)); - strcat(pps_str, " Pixels/s"); - - gdispClear(Black); - gdispDrawString(100, height/2, pps_str, font1, White); - chThdSleepMilliseconds(3000); - } - - return 0; -} - -int main(void) { - halInit(); - chSysInit(); - gdispInit(); - - chThdCreateStatic(waThread2, sizeof(waThread2), NORMALPRIO, Thread2, NULL); - - while(TRUE) { - chThdSleepMilliseconds(500); - } - - return 0; -} diff --git a/demos/applications/benchmarks/gfxconf.h b/demos/benchmarks/gfxconf.h similarity index 80% rename from demos/applications/benchmarks/gfxconf.h rename to demos/benchmarks/gfxconf.h index b86d6425..e96bf5fd 100644 --- a/demos/applications/benchmarks/gfxconf.h +++ b/demos/benchmarks/gfxconf.h @@ -18,28 +18,24 @@ /* Features for the GDISP sub-system. */ #define GDISP_NEED_VALIDATION FALSE -#define GDISP_NEED_CLIP TRUE +#define GDISP_NEED_CLIP FALSE #define GDISP_NEED_TEXT TRUE -#define GDISP_NEED_CIRCLE TRUE +#define GDISP_NEED_CIRCLE FALSE #define GDISP_NEED_ELLIPSE FALSE #define GDISP_NEED_ARC FALSE #define GDISP_NEED_SCROLL FALSE #define GDISP_NEED_PIXELREAD FALSE #define GDISP_NEED_CONTROL TRUE -#define GDISP_NEED_MULTITHREAD TRUE +#define GDISP_NEED_MULTITHREAD FALSE #define GDISP_NEED_ASYNC FALSE #define GDISP_NEED_MSGAPI FALSE -#define GINPUT_MOUSE_USE_CUSTOM_BOARD TRUE /* Builtin Fonts */ #define GDISP_INCLUDE_FONT_SMALL FALSE #define GDISP_INCLUDE_FONT_LARGER FALSE #define GDISP_INCLUDE_FONT_UI1 FALSE #define GDISP_INCLUDE_FONT_UI2 TRUE -#define GDISP_INCLUDE_FONT_LARGENUMBERS TRUE - -/* Features for the GINPUT sub-system. */ -#define GINPUT_NEED_MOUSE FALSE +#define GDISP_INCLUDE_FONT_LARGENUMBERS FALSE #endif /* _GFXCONF_H */ diff --git a/demos/benchmarks/main.c b/demos/benchmarks/main.c new file mode 100644 index 00000000..9bd3cef3 --- /dev/null +++ b/demos/benchmarks/main.c @@ -0,0 +1,146 @@ +/* + ChibiOS/GFX - Copyright (C) 2012 + Joel Bodenmann aka Tectu + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX 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/GFX 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 . +*/ + +#include "ch.h" +#include "hal.h" +#include "chprintf.h" +#include "stdlib.h" +#include "string.h" +#include "gfx.h" + +#define SCB_DEMCR (*(volatile unsigned *)0xE000EDFC) +#define CPU_RESET_CYCLECOUNTER do { SCB_DEMCR = SCB_DEMCR | 0x01000000; \ +DWT_CYCCNT = 0; \ +DWT_CTRL = DWT_CTRL | 1 ; } while(0) + +static int uitoa(unsigned int value, char * buf, int max) { + int n = 0; + int i = 0; + unsigned int tmp = 0; + + if (NULL == buf) + return -3; + + if (2 > max) + return -4; + + i=1; + tmp = value; + if (0 > tmp) { + tmp *= -1; + i++; + } + for (;;) { + tmp /= 10; + if (0 >= tmp) + break; + i++; + } + if (i >= max) { + buf[0] = '?'; + buf[1] = 0x0; + return 2; + } + + n = i; + tmp = value; + if (0 > tmp) { + tmp *= -1; + } + buf[i--] = 0x0; + for (;;) { + buf[i--] = (tmp % 10) + '0'; + tmp /= 10; + if (0 >= tmp) { + break; + } + } + if (-1 != i) { + buf[i--] = '-'; + } + + return n; +} + +void benchmark(void) { + uint32_t i, pixels, ms, pps; + char pps_str[25]; + coord_t height, width, rx, ry, rcx, rcy; + color_t random_color; + font_t font; + + gdispSetOrientation(GDISP_ROTATE_90); + gdispClear(Black); + + width = gdispGetWidth(); + height = gdispGetHeight(); + font = gdispOpenFont("UI2 Double"); + + gdispDrawStringBox(0, 0, width, 30, "ChibiOS/GFX - Benchmark", font, White, justifyCenter); + + font = gdispOpenFont("UI2"); + gdispDrawStringBox(0, height/2, width, 30, "5000 random rectangles", font, White, justifyCenter); + + chThdSleepMilliseconds(3000); + + /* seed for the rand() */ + srand(DWT_CYCCNT); + pixels = 0; + + CPU_RESET_CYCLECOUNTER; + + for (i = 0; i < 5000; i++) { + random_color = (rand() % 65535); + rx = (rand() % (width-10)); + ry = (rand() % (height-10)); + rcx = (rand() % ((width-rx)-10))+10; + rcy = (rand() % ((height-ry)-10))+10; + + gdispFillArea(rx, ry, rcx, rcy, random_color); + pixels += (rcx+1)*(rcy+1); + } + + ms = DWT_CYCCNT / 168000; + pps = (float)pixels/((float)ms/1000.0f); + + memset (pps_str, 0, sizeof(pps_str)); + uitoa(pps, pps_str, sizeof(pps_str)); + strcat(pps_str, " Pixels/s"); + + font = gdispOpenFont("UI2 Double"); + gdispClear(Black); + gdispDrawStringBox(0, 0, width, 30, "ChibiOS/GFX - Benchmark", font, White, justifyCenter); + gdispDrawStringBox(0, height/2, width, 30, pps_str, font, White, justifyCenter); + //gdispDrawString(20, height/2, pps_str, font, White); +} + +int main(void) { + halInit(); + chSysInit(); + gdispInit(); + + benchmark(); + + while(TRUE) { + chThdSleepMilliseconds(500); + } + + return 0; +} From 7dec36d56dd6fe636125e56e2deccc4e713676be Mon Sep 17 00:00:00 2001 From: Joel Bodenmann Date: Thu, 3 Jan 2013 16:20:52 +0100 Subject: [PATCH 10/12] added ILI9325 driver. Thanks to Chris van Dongen aka _Sjaak --- drivers/gdisp/ILI9325/gdisp_lld.c | 592 ++++++++++++++++++ drivers/gdisp/ILI9325/gdisp_lld.mk | 5 + .../gdisp/ILI9325/gdisp_lld_board_example.h | 59 ++ .../ILI9325/gdisp_lld_board_hy_stm32_100p.h | 96 +++ drivers/gdisp/ILI9325/gdisp_lld_config.h | 66 ++ drivers/gdisp/ILI9325/readme.txt | 15 + 6 files changed, 833 insertions(+) create mode 100644 drivers/gdisp/ILI9325/gdisp_lld.c create mode 100644 drivers/gdisp/ILI9325/gdisp_lld.mk create mode 100644 drivers/gdisp/ILI9325/gdisp_lld_board_example.h create mode 100644 drivers/gdisp/ILI9325/gdisp_lld_board_hy_stm32_100p.h create mode 100644 drivers/gdisp/ILI9325/gdisp_lld_config.h create mode 100644 drivers/gdisp/ILI9325/readme.txt diff --git a/drivers/gdisp/ILI9325/gdisp_lld.c b/drivers/gdisp/ILI9325/gdisp_lld.c new file mode 100644 index 00000000..58a9f84b --- /dev/null +++ b/drivers/gdisp/ILI9325/gdisp_lld.c @@ -0,0 +1,592 @@ +/* + ChibiOS/GFX - Copyright (C) 2012 + Joel Bodenmann aka Tectu + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX 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/GFX 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 . +*/ + +/* + driver quickly hacked together from a chinese sourcecode that came + with the board and existing ili9320 code by Chris van Dongen (sjaak) + (sjaak2002 at msn.com) + + Also added rotation for 180 and 270 degrees and minor tweaks to + setcursor + + Added code comes without warranty and free bugs. Feel free to use + or misuse the added code :D +*/ + +/** + * @file drivers/gdisp/ILI9325/gdisp_lld.c + * @brief GDISP Graphics Driver subsystem low level driver source for the ILI9325 display. + * + * @addtogroup GDISP + * @{ + */ + +#include "ch.h" +#include "hal.h" +#include "gfx.h" + +#if GFX_USE_GDISP /*|| defined(__DOXYGEN__)*/ + +/* Include the emulation code for things we don't support */ +#include "gdisp/lld/emulation.c" + +#if defined(GDISP_USE_CUSTOM_BOARD) && GDISP_USE_CUSTOM_BOARD + /* Include the user supplied board definitions */ + #include "gdisp_lld_board.h" +#elif defined(BOARD_HY_STM32_100P) + #include "gdisp_lld_board_hy_stm32_100p.h" +#else + #include "gdisp_lld_board.h" +#endif + +/*===========================================================================*/ +/* Driver local definitions. */ +/*===========================================================================*/ + +/* This controller is only ever used with a 240 x 320 display */ +#if defined(GDISP_SCREEN_HEIGHT) + #warning "GDISP: This low level driver does not support setting a screen size. It is being ignored." + #undef GDISP_SCREEN_HEIGHT +#endif +#if defined(GDISP_SCREEN_WIDTH) + #warning "GDISP: This low level driver does not support setting a screen size. It is being ignored." + #undef GDISP_SCREEN_WIDTH +#endif + +#define GDISP_SCREEN_WIDTH 240 +#define GDISP_SCREEN_HEIGHT 320 + +#define GDISP_INITIAL_CONTRAST 50 +#define GDISP_INITIAL_BACKLIGHT 100 + +/*===========================================================================*/ +/* Driver exported variables. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Driver local variables. */ +/*===========================================================================*/ +uint32_t DISPLAY_CODE; + +/*===========================================================================*/ +/* Driver local functions. */ +/*===========================================================================*/ +static __inline void lld_lcdDelay(uint16_t us) { + chThdSleepMicroseconds(us); +} + +static __inline void lld_lcdWriteIndex(uint16_t index) { + GDISP_LLD(write_index)(index); +} + +static __inline void lld_lcdWriteData(uint16_t data) { + GDISP_LLD(write_data)(data); +} + +static __inline void lld_lcdWriteReg(uint16_t lcdReg, uint16_t lcdRegValue) { + GDISP_LLD(write_index)(lcdReg); + GDISP_LLD(write_data)(lcdRegValue); +} + +static __inline uint16_t lld_lcdReadData(void) { + /* fix this! */ + //return GDISP_LLD(read_data); + return GDISP_RAM; +} + +static __inline uint16_t lld_lcdReadReg(uint16_t lcdReg) { + volatile uint16_t dummy; + + GDISP_LLD(write_index)(lcdReg); + dummy = lld_lcdReadData(); + (void)dummy; + + return lld_lcdReadData(); +} + +static __inline void lld_lcdWriteStreamStart(void) { + lld_lcdWriteIndex(0x0022); +} + +static __inline void lld_lcdWriteStreamStop(void) { + +} + +static __inline void lld_lcdWriteStream(uint16_t *buffer, uint16_t size) { + uint16_t i; + + for(i = 0; i < size; i++) + lld_lcdWriteData(buffer[i]); +} + +static __inline void lld_lcdReadStreamStart(void) { + lld_lcdWriteIndex(0x0022); +} + +static __inline void lld_lcdReadStreamStop(void) { + +} + +static __inline void lld_lcdReadStream(uint16_t *buffer, size_t size) { + uint16_t i; + volatile uint16_t dummy; + + dummy = lld_lcdReadData(); + (void)dummy; + + for(i = 0; i < size; i++) + buffer[i] = lld_lcdReadData(); +} + +bool_t GDISP_LLD(init)(void) { + /* Initialise your display */ + GDISP_LLD(init_board)(); + + /* Hardware reset */ + GDISP_LLD(setpin_reset)(TRUE); + lld_lcdDelay(1000); + GDISP_LLD(setpin_reset)(FALSE); + lld_lcdDelay(1000); + + // chinese code starts here + lld_lcdWriteReg(0x0000,0x0001); + lld_lcdDelay(10); + + lld_lcdWriteReg(0x0015,0x0030); + lld_lcdWriteReg(0x0011,0x0040); + lld_lcdWriteReg(0x0010,0x1628); + lld_lcdWriteReg(0x0012,0x0000); + lld_lcdWriteReg(0x0013,0x104d); + lld_lcdDelay(10); + lld_lcdWriteReg(0x0012,0x0010); + lld_lcdDelay(10); + lld_lcdWriteReg(0x0010,0x2620); + lld_lcdWriteReg(0x0013,0x344d); //304d + lld_lcdDelay(10); + + lld_lcdWriteReg(0x0001,0x0100); + lld_lcdWriteReg(0x0002,0x0300); + lld_lcdWriteReg(0x0003,0x1038);//0x1030 + lld_lcdWriteReg(0x0008,0x0604); + lld_lcdWriteReg(0x0009,0x0000); + lld_lcdWriteReg(0x000A,0x0008); + + lld_lcdWriteReg(0x0041,0x0002); + lld_lcdWriteReg(0x0060,0x2700); + lld_lcdWriteReg(0x0061,0x0001); + lld_lcdWriteReg(0x0090,0x0182); + lld_lcdWriteReg(0x0093,0x0001); + lld_lcdWriteReg(0x00a3,0x0010); + lld_lcdDelay(10); + + //################# void Gamma_Set(void) ####################// + lld_lcdWriteReg(0x30,0x0000); + lld_lcdWriteReg(0x31,0x0502); + lld_lcdWriteReg(0x32,0x0307); + lld_lcdWriteReg(0x33,0x0305); + lld_lcdWriteReg(0x34,0x0004); + lld_lcdWriteReg(0x35,0x0402); + lld_lcdWriteReg(0x36,0x0707); + lld_lcdWriteReg(0x37,0x0503); + lld_lcdWriteReg(0x38,0x1505); + lld_lcdWriteReg(0x39,0x1505); + lld_lcdDelay(10); + + //################## void Display_ON(void) ####################// + lld_lcdWriteReg(0x0007,0x0001); + lld_lcdDelay(10); + lld_lcdWriteReg(0x0007,0x0021); + lld_lcdWriteReg(0x0007,0x0023); + lld_lcdDelay(10); + lld_lcdWriteReg(0x0007,0x0033); + lld_lcdDelay(10); + lld_lcdWriteReg(0x0007,0x0133); + + // chinese code ends here + + // Turn on the backlight + GDISP_LLD(set_backlight)(GDISP_INITIAL_BACKLIGHT); + + /* Initialise the GDISP structure */ + GDISP.Width = GDISP_SCREEN_WIDTH; + GDISP.Height = GDISP_SCREEN_HEIGHT; + GDISP.Orientation = GDISP_ROTATE_0; + GDISP.Powermode = powerOn; + GDISP.Backlight = GDISP_INITIAL_BACKLIGHT; + GDISP.Contrast = GDISP_INITIAL_CONTRAST; + #if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP + GDISP.clipx0 = 0; + GDISP.clipy0 = 0; + GDISP.clipx1 = GDISP.Width; + GDISP.clipy1 = GDISP.Height; + #endif + + return TRUE; +} + +static void lld_lcdSetCursor(uint16_t x, uint16_t y) { + + switch(GDISP.Orientation) { + case GDISP_ROTATE_0: + lld_lcdWriteReg(0x0020, x); + lld_lcdWriteReg(0x0021, y); + break; + + case GDISP_ROTATE_90: + lld_lcdWriteReg(0x0020, y); + lld_lcdWriteReg(0x0021, x); + break; + + case GDISP_ROTATE_180: + lld_lcdWriteReg(0x0020, x); + lld_lcdWriteReg(0x0021, y); + break; + + case GDISP_ROTATE_270: + lld_lcdWriteReg(0x0020, y); + lld_lcdWriteReg(0x0021, x); + break; + } +} + +static void lld_lcdSetViewPort(uint16_t x, uint16_t y, uint16_t cx, uint16_t cy) { + switch(GDISP.Orientation) { + case GDISP_ROTATE_0: + lld_lcdWriteReg(0x0050, x); + lld_lcdWriteReg(0x0051, x + cx - 1); + lld_lcdWriteReg(0x0052, y); + lld_lcdWriteReg(0x0053, y + cy - 1); + break; + + case GDISP_ROTATE_90: + lld_lcdWriteReg(0x0050, y); + lld_lcdWriteReg(0x0051, y + cy - 1); + lld_lcdWriteReg(0x0052, x); + lld_lcdWriteReg(0x0053, x + cx - 1); + break; + + case GDISP_ROTATE_180: + lld_lcdWriteReg(0x0050, x); + lld_lcdWriteReg(0x0051, x + cx - 1); + lld_lcdWriteReg(0x0052, y); + lld_lcdWriteReg(0x0053, y + cy - 1); + break; + + case GDISP_ROTATE_270: + lld_lcdWriteReg(0x0050, y); + lld_lcdWriteReg(0x0051, y + cy - 1); + lld_lcdWriteReg(0x0052, x); + lld_lcdWriteReg(0x0053, x + cx - 1); + break; + + } + + lld_lcdSetCursor(x, y); +} + +static __inline void lld_lcdResetViewPort(void) { + switch(GDISP.Orientation) { + case GDISP_ROTATE_0: + case GDISP_ROTATE_180: + lld_lcdSetViewPort(0, 0, GDISP_SCREEN_WIDTH, GDISP_SCREEN_HEIGHT); + break; + case GDISP_ROTATE_90: + case GDISP_ROTATE_270: + lld_lcdSetViewPort(0, 0, GDISP_SCREEN_HEIGHT, GDISP_SCREEN_WIDTH); + break; + } +} + +void GDISP_LLD(drawpixel)(coord_t x, coord_t y, color_t color) { + #if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP + if (x < GDISP.clipx0 || y < GDISP.clipy0 || x >= GDISP.clipx1 || y >= GDISP.clipy1) return; + #endif + lld_lcdSetCursor(x, y); + lld_lcdWriteReg(0x0022, color); +} + +#if GDISP_HARDWARE_CLEARS || defined(__DOXYGEN__) + void GDISP_LLD(clear)(color_t color) { + unsigned i; + + lld_lcdSetCursor(0, 0); + lld_lcdWriteStreamStart(); + + for(i = 0; i < GDISP_SCREEN_WIDTH * GDISP_SCREEN_HEIGHT; i++) + lld_lcdWriteData(color); + + lld_lcdWriteStreamStop(); + } +#endif + +#if GDISP_HARDWARE_FILLS || defined(__DOXYGEN__) + void GDISP_LLD(fillarea)(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) { + #if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP + if (x < GDISP.clipx0) { cx -= GDISP.clipx0 - x; x = GDISP.clipx0; } + if (y < GDISP.clipy0) { cy -= GDISP.clipy0 - y; y = GDISP.clipy0; } + if (cx <= 0 || cy <= 0 || x >= GDISP.clipx1 || y >= GDISP.clipy1) return; + if (x+cx > GDISP.clipx1) cx = GDISP.clipx1 - x; + if (y+cy > GDISP.clipy1) cy = GDISP.clipy1 - y; + #endif + + unsigned i, area; + + area = cx*cy; + lld_lcdSetViewPort(x, y, cx, cy); + lld_lcdWriteStreamStart(); + for(i = 0; i < area; i++) + lld_lcdWriteData(color); + lld_lcdWriteStreamStop(); + lld_lcdResetViewPort(); + } +#endif + +#if GDISP_HARDWARE_BITFILLS || defined(__DOXYGEN__) + void GDISP_LLD(blitareaex)(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx, coord_t srcy, coord_t srccx, const pixel_t *buffer) { + coord_t endx, endy; + unsigned lg; + + #if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP + if (x < GDISP.clipx0) { cx -= GDISP.clipx0 - x; srcx += GDISP.clipx0 - x; x = GDISP.clipx0; } + if (y < GDISP.clipy0) { cy -= GDISP.clipy0 - y; srcy += GDISP.clipy0 - y; y = GDISP.clipy0; } + if (srcx+cx > srccx) cx = srccx - srcx; + if (cx <= 0 || cy <= 0 || x >= GDISP.clipx1 || y >= GDISP.clipy1) return; + if (x+cx > GDISP.clipx1) cx = GDISP.clipx1 - x; + if (y+cy > GDISP.clipy1) cy = GDISP.clipy1 - y; + #endif + + lld_lcdSetViewPort(x, y, cx, cy); + lld_lcdWriteStreamStart(); + + endx = srcx + cx; + endy = y + cy; + lg = srccx - cx; + buffer += srcx + srcy * srccx; + for(; y < endy; y++, buffer += lg) + for(x=srcx; x < endx; x++) + lld_lcdWriteData(*buffer++); + lld_lcdWriteStreamStop(); + lld_lcdResetViewPort(); + } +#endif + +#if (GDISP_NEED_PIXELREAD && GDISP_HARDWARE_PIXELREAD) || defined(__DOXYGEN__) + color_t GDISP_LLD(getpixelcolor)(coord_t x, coord_t y) { + color_t color; + + #if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP + if (x < 0 || x >= GDISP.Width || y < 0 || y >= GDISP.Height) return 0; + #endif + + lld_lcdSetCursor(x, y); + lld_lcdWriteStreamStart(); + + color = lld_lcdReadData(); + color = lld_lcdReadData(); + + lld_lcdWriteStreamStop(); + + return color; + } +#endif + +#if (GDISP_NEED_SCROLL && GDISP_HARDWARE_SCROLL) || defined(__DOXYGEN__) + void GDISP_LLD(verticalscroll)(coord_t x, coord_t y, coord_t cx, coord_t cy, int lines, color_t bgcolor) { + static color_t buf[((GDISP_SCREEN_HEIGHT > GDISP_SCREEN_WIDTH ) ? GDISP_SCREEN_HEIGHT : GDISP_SCREEN_WIDTH)]; + coord_t row0, row1; + unsigned i, gap, abslines; + + #if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP + if (x < GDISP.clipx0) { cx -= GDISP.clipx0 - x; x = GDISP.clipx0; } + if (y < GDISP.clipy0) { cy -= GDISP.clipy0 - y; y = GDISP.clipy0; } + if (!lines || cx <= 0 || cy <= 0 || x >= GDISP.clipx1 || y >= GDISP.clipy1) return; + if (x+cx > GDISP.clipx1) cx = GDISP.clipx1 - x; + if (y+cy > GDISP.clipy1) cy = GDISP.clipy1 - y; + #endif + + abslines = lines < 0 ? -lines : lines; + + if (abslines >= cy) { + abslines = cy; + gap = 0; + } else { + gap = cy - abslines; + for(i = 0; i < gap; i++) { + if(lines > 0) { + row0 = y + i + lines; + row1 = y + i; + } else { + row0 = (y - i - 1) + lines; + row1 = (y - i - 1); + } + + /* read row0 into the buffer and then write at row1*/ + lld_lcdSetViewPort(x, row0, cx, 1); + lld_lcdReadStreamStart(); + lld_lcdReadStream(buf, cx); + lld_lcdReadStreamStop(); + + lld_lcdSetViewPort(x, row1, cx, 1); + lld_lcdWriteStreamStart(); + lld_lcdWriteStream(buf, cx); + lld_lcdWriteStreamStop(); + } + } + + /* fill the remaining gap */ + lld_lcdSetViewPort(x, lines > 0 ? (y+gap) : y, cx, abslines); + lld_lcdWriteStreamStart(); + gap = cx*abslines; + for(i = 0; i < gap; i++) lld_lcdWriteData(bgcolor); + lld_lcdWriteStreamStop(); + lld_lcdResetViewPort(); + } +#endif + +#if (GDISP_NEED_CONTROL && GDISP_HARDWARE_CONTROL) || defined(__DOXYGEN__) + void GDISP_LLD(control)(unsigned 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(0x0007, 0x0000); + lld_lcdWriteReg(0x0010, 0x0000); + lld_lcdWriteReg(0x0011, 0x0000); + lld_lcdWriteReg(0x0012, 0x0000); + lld_lcdWriteReg(0x0013, 0x0000); + GDISP_LLD(set_backlight)(0); + break; + + case powerOn: + //*************Power On sequence ******************// + lld_lcdWriteReg(0x0010, 0x0000); /* SAP, BT[3:0], AP, DSTB, SLP, STB */ + lld_lcdWriteReg(0x0011, 0x0000); /* DC1[2:0], DC0[2:0], VC[2:0] */ + lld_lcdWriteReg(0x0012, 0x0000); /* VREG1OUT voltage */ + lld_lcdWriteReg(0x0013, 0x0000); /* VDV[4:0] for VCOM amplitude */ + lld_lcdDelay(2000); /* Dis-charge capacitor power voltage */ + lld_lcdWriteReg(0x0010, 0x17B0); /* SAP, BT[3:0], AP, DSTB, SLP, STB */ + lld_lcdWriteReg(0x0011, 0x0147); /* DC1[2:0], DC0[2:0], VC[2:0] */ + lld_lcdDelay(500); + lld_lcdWriteReg(0x0012, 0x013C); /* VREG1OUT voltage */ + lld_lcdDelay(500); + lld_lcdWriteReg(0x0013, 0x0E00); /* VDV[4:0] for VCOM amplitude */ + lld_lcdWriteReg(0x0029, 0x0009); /* VCM[4:0] for VCOMH */ + lld_lcdDelay(500); + lld_lcdWriteReg(0x0007, 0x0173); /* 262K color and display ON */ + GDISP_LLD(set_backlight)(GDISP.Backlight); + if(GDISP.Powermode != powerSleep || GDISP.Powermode != powerDeepSleep) + GDISP_LLD(init)(); + break; + + case powerSleep: + lld_lcdWriteReg(0x0007, 0x0000); /* display OFF */ + lld_lcdWriteReg(0x0010, 0x0000); /* SAP, BT[3:0], APE, AP, DSTB, SLP */ + lld_lcdWriteReg(0x0011, 0x0000); /* DC1[2:0], DC0[2:0], VC[2:0] */ + lld_lcdWriteReg(0x0012, 0x0000); /* VREG1OUT voltage */ + lld_lcdWriteReg(0x0013, 0x0000); /* VDV[4:0] for VCOM amplitude */ + lld_lcdDelay(2000); /* Dis-charge capacitor power voltage */ + lld_lcdWriteReg(0x0010, 0x0002); /* SAP, BT[3:0], APE, AP, DSTB, SLP */ + GDISP_LLD(set_backlight)(0); + break; + + case powerDeepSleep: + lld_lcdWriteReg(0x0007, 0x0000); /* display OFF */ + lld_lcdWriteReg(0x0010, 0x0000); /* SAP, BT[3:0], APE, AP, DSTB, SLP */ + lld_lcdWriteReg(0x0011, 0x0000); /* DC1[2:0], DC0[2:0], VC[2:0] */ + lld_lcdWriteReg(0x0012, 0x0000); /* VREG1OUT voltage */ + lld_lcdWriteReg(0x0013, 0x0000); /* VDV[4:0] for VCOM amplitude */ + lld_lcdDelay(2000); /* Dis-charge capacitor power voltage */ + lld_lcdWriteReg(0x0010, 0x0004); /* SAP, BT[3:0], APE, AP, DSTB, SLP */ + GDISP_LLD(set_backlight)(0); + 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 GDISP_ROTATE_0: + lld_lcdWriteReg(0x0001, 0x0100); + lld_lcdWriteReg(0x0003, 0x1038); + lld_lcdWriteReg(0x0060, 0x2700); + GDISP.Height = GDISP_SCREEN_HEIGHT; + GDISP.Width = GDISP_SCREEN_WIDTH; + break; + + case GDISP_ROTATE_90: + lld_lcdWriteReg(0x0001, 0x0000); + lld_lcdWriteReg(0x0003, 0x1030); + lld_lcdWriteReg(0x0060, 0x2700); + GDISP.Height = GDISP_SCREEN_WIDTH; + GDISP.Width = GDISP_SCREEN_HEIGHT; + break; + + case GDISP_ROTATE_180: + lld_lcdWriteReg(0x0001, 0x0000); + lld_lcdWriteReg(0x0003, 0x1038); + lld_lcdWriteReg(0x0060, 0xa700); + GDISP.Height = GDISP_SCREEN_HEIGHT; + GDISP.Width = GDISP_SCREEN_WIDTH; + break; + + case GDISP_ROTATE_270: + lld_lcdWriteReg(0x0001, 0x0100); + lld_lcdWriteReg(0x0003, 0x1030); + lld_lcdWriteReg(0x0060, 0xA700); + GDISP.Height = GDISP_SCREEN_WIDTH; + GDISP.Width = GDISP_SCREEN_HEIGHT; + break; + + default: + return; + } + + #if GDISP_NEED_CLIP || GDISP_NEED_VALIDATION + GDISP.clipx0 = 0; + GDISP.clipy0 = 0; + GDISP.clipx1 = GDISP.Width; + GDISP.clipy1 = GDISP.Height; + #endif + GDISP.Orientation = (gdisp_orientation_t)value; + return; + + case GDISP_CONTROL_BACKLIGHT: + if((unsigned)value > 100) value = (void *)100; + GDISP_LLD(set_backlight)((unsigned)value); + GDISP.Backlight = (unsigned)value; + break; + + default: + return; + } + } + +#endif + +#endif /* GFX_USE_GDISP */ +/** @} */ + diff --git a/drivers/gdisp/ILI9325/gdisp_lld.mk b/drivers/gdisp/ILI9325/gdisp_lld.mk new file mode 100644 index 00000000..b5061324 --- /dev/null +++ b/drivers/gdisp/ILI9325/gdisp_lld.mk @@ -0,0 +1,5 @@ +# List the required driver. +GFXSRC += $(GFXLIB)/drivers/gdisp/ILI9325/gdisp_lld.c + +# Required include directories +GFXINC += $(GFXLIB)/drivers/gdisp/ILI9325 diff --git a/drivers/gdisp/ILI9325/gdisp_lld_board_example.h b/drivers/gdisp/ILI9325/gdisp_lld_board_example.h new file mode 100644 index 00000000..7b537dcd --- /dev/null +++ b/drivers/gdisp/ILI9325/gdisp_lld_board_example.h @@ -0,0 +1,59 @@ +/* + ChibiOS/GFX - Copyright (C) 2012 + Joel Bodenmann aka Tectu + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX 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/GFX 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 drivers/gdisp/ILI9325/gdisp_lld_board_example.h + * @brief GDISP Graphic Driver subsystem board interface for the ILI9325 display. + * + * @addtogroup GDISP + * @{ + */ + +#ifndef GDISP_LLD_BOARD_H +#define GDISP_LLD_BOARD_H + +static __inline void GDISP_LLD(init_board)(void) { + #error "ILI9325: You must implement the init_board routine for your board" +} + +static __inline void GDISP_LLD(setpin_reset)(bool_t state) { + #error "ILI9325: You must implement setpin_reset routine for your board" +} + +static __inline void GDISP_LLD(write_index)(uint16_t data) { + #error "ILI9325: You must implement write_index routine for your board" +} + +static __inline void GDISP_LLD(write_data)(uint16_t data) { + #error "ILI9325: You must implement write_data routine for your board" +} + +static __inline uint16_t GDISP_LLD(read_data)(void) { + #error "ILI9325: You must implement read_data routine for your board" +} + +/* if not available, just ignore the argument and return */ +static __inline uint16_t GDISP_LLD(set_backlight)(uint8_t percentage) { + #error "ILI9325: You must implement set_backlight routine for your board" +} + +#endif /* GDISP_LLD_BOARD_H */ +/** @} */ + diff --git a/drivers/gdisp/ILI9325/gdisp_lld_board_hy_stm32_100p.h b/drivers/gdisp/ILI9325/gdisp_lld_board_hy_stm32_100p.h new file mode 100644 index 00000000..faa5854a --- /dev/null +++ b/drivers/gdisp/ILI9325/gdisp_lld_board_hy_stm32_100p.h @@ -0,0 +1,96 @@ +/* + ChibiOS/GFX - Copyright (C) 2012 + Joel Bodenmann aka Tectu + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX 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/GFX 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 . +*/ + +/* + driver quickly hacked together from a chinese sourcecode that came + with the board and existing ili9320 code by Chris van Dongen (sjaak) + (sjaak2002 at msn.com) + + Also added rotation for 180 and 270 degrees and minor tweaks to + setcursor + + Added code comes without warranty and free bugs. Feel free to use + or misuse the added code :D +*/ + + +/** + * @file drivers/gdisp/ILI9325/gdisp_lld_board_hy_stm32_100p.h + * @brief GDISP Graphic Driver subsystem board interface for the ILI9325 display. + * + * @addtogroup GDISP + * @{ + */ + +#ifndef GDISP_LLD_BOARD_H +#define GDISP_LLD_BOARD_H + +#define GDISP_REG (*((volatile uint16_t *) 0x60000000)) /* RS = 0 */ +#define GDISP_RAM (*((volatile uint16_t *) 0x60020000)) /* RS = 1 */ + +static __inline void GDISP_LLD(init_board)(void) { + /* FSMC setup for F1 */ + rccEnableAHB(RCC_AHBENR_FSMCEN, 0); + + /* set pin modes */ +/* IOBus busD = {GPIOD, PAL_WHOLE_PORT, 0}; + IOBus busE = {GPIOE, PAL_WHOLE_PORT, 0}; + palSetBusMode(&busD, PAL_MODE_STM32_ALTERNATE_PUSHPULL); + palSetBusMode(&busE, PAL_MODE_STM32_ALTERNATE_PUSHPULL); + palSetPadMode(GPIOE, GPIOE_TFT_RST, PAL_MODE_OUTPUT_PUSHPULL); + palSetPadMode(GPIOD, GPIOD_TFT_LIGHT, PAL_MODE_OUTPUT_PUSHPULL); */ + + const unsigned char FSMC_Bank = 0; + + /* FSMC timing */ + FSMC_Bank1->BTCR[FSMC_Bank+1] = (6) | (10 << 8) | (10 << 16); + + /* Bank1 NOR/SRAM control register configuration + * This is actually not needed as already set by default after reset */ + FSMC_Bank1->BTCR[FSMC_Bank] = FSMC_BCR1_MWID_0 | FSMC_BCR1_WREN | FSMC_BCR1_MBKEN; + +} + +static __inline void GDISP_LLD(setpin_reset)(bool_t state) { + if(state) + palClearPad(GPIOE, GPIOE_TFT_RST); + else + palSetPad(GPIOE, GPIOE_TFT_RST); +} + +static __inline void GDISP_LLD(write_index)(uint16_t reg) { + GDISP_REG = reg; +} + +static __inline void GDISP_LLD(write_data)(uint16_t data) { + GDISP_RAM = data; +} + +static __inline uint16_t GDISP_LLD(read_data)(void) { + return GDISP_RAM; +} + +static __inline void GDISP_LLD(set_backlight)(uint8_t percent) { + percent=percent; // avoid a warning +} + +#endif /* GDISP_LLD_BOARD_H */ +/** @} */ + diff --git a/drivers/gdisp/ILI9325/gdisp_lld_config.h b/drivers/gdisp/ILI9325/gdisp_lld_config.h new file mode 100644 index 00000000..c47da0ca --- /dev/null +++ b/drivers/gdisp/ILI9325/gdisp_lld_config.h @@ -0,0 +1,66 @@ +/* + ChibiOS/GFX - Copyright (C) 2012 + Joel Bodenmann aka Tectu + + This file is part of ChibiOS/GFX. + + ChibiOS/GFX 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/GFX 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 . +*/ + +/* + driver quickly hacked together from a chinese sourcecode that came + with the board and existing ili9320 code by Chris van Dongen (Sjaak) + (sjaak2002 at msn.com) + + Also added rotation for 180 and 270 degrees and minor tweaks to + setcursor + + Added code comes without warranty and free bugs. Feel free to use + or misuse the added code :D +*/ + +/** + * @file drivers/gdisp/ILI9325/gdisp_lld_config.h + * @brief GDISP Graphic Driver subsystem low level driver header for the ILI9325 display. + * + * @addtogroup GDISP + * @{ + */ + +#ifndef GDISP_LLD_CONFIG_H +#define GDISP_LLD_CONFIG_H + +#if GFX_USE_GDISP + +/*===========================================================================*/ +/* Driver hardware support. */ +/*===========================================================================*/ + +#define GDISP_DRIVER_NAME "ILI9325" +#define GDISP_LLD(x) gdisp_lld_##x##_ILI9325 + +#define GDISP_HARDWARE_CLEARS TRUE +#define GDISP_HARDWARE_FILLS TRUE +#define GDISP_HARDWARE_BITFILLS FALSE +#define GDISP_HARDWARE_SCROLL FALSE +#define GDISP_HARDWARE_PIXELREAD TRUE +#define GDISP_HARDWARE_CONTROL TRUE + +#define GDISP_PIXELFORMAT GDISP_PIXELFORMAT_RGB565 + +#endif /* GFX_USE_GDISP */ + +#endif /* _GDISP_LLD_CONFIG_H */ +/** @} */ + diff --git a/drivers/gdisp/ILI9325/readme.txt b/drivers/gdisp/ILI9325/readme.txt new file mode 100644 index 00000000..9150610e --- /dev/null +++ b/drivers/gdisp/ILI9325/readme.txt @@ -0,0 +1,15 @@ +To use this driver: + +1. Add in your halconf.h: + a) #define GFX_USE_GDISP TRUE + + b) Any optional high level driver defines (see gdisp.h) eg: GDISP_NEED_MULTITHREAD + + d) If you are not using a known board then create a gdisp_lld_board.h file + and ensure it is on your include path. + Use the gdisp_lld_board_example.h file as a basis. + Currently known boards are: + HY_STM32_100p + +2. To your makefile add the following lines: + include $(GFXLIB)/drivers/gdisp/ILI9325/gdisp_lld.mk From 403947eeafb1a4d5dd377b96e694878c18de673b Mon Sep 17 00:00:00 2001 From: Joel Bodenmann Date: Thu, 3 Jan 2013 16:22:29 +0100 Subject: [PATCH 11/12] doc update --- releases.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/releases.txt b/releases.txt index 00015354..467ffeb1 100644 --- a/releases.txt +++ b/releases.txt @@ -3,6 +3,7 @@ ***************************************************************************** current release: 1.5 +FEATURE: Added ILI9325 driver - Thanks to Chris van Dongen aka _Sjaak *** changes after 1.4 *** @@ -67,3 +68,4 @@ FEATURE: added SSD1963 DMA support FEATURE: added touchpad interface for storing calibration values (#define TOUCHPAD_STORE_CALIBRATION) CHANGE: replaced every GDISP_XXX macro with GDISP_XXX CHANGE: removed last digit of version number + From 7a66e63849f43aae17fb256afadc475ffc578945 Mon Sep 17 00:00:00 2001 From: Joel Bodenmann Date: Thu, 3 Jan 2013 18:06:48 +0100 Subject: [PATCH 12/12] cleanup --- drivers/gdisp/ILI9325/gdisp_lld.c | 12 ------------ .../gdisp/ILI9325/gdisp_lld_board_hy_stm32_100p.h | 2 +- drivers/gdisp/ILI9325/gdisp_lld_config.h | 12 ------------ 3 files changed, 1 insertion(+), 25 deletions(-) diff --git a/drivers/gdisp/ILI9325/gdisp_lld.c b/drivers/gdisp/ILI9325/gdisp_lld.c index 58a9f84b..42b03d74 100644 --- a/drivers/gdisp/ILI9325/gdisp_lld.c +++ b/drivers/gdisp/ILI9325/gdisp_lld.c @@ -18,18 +18,6 @@ along with this program. If not, see . */ -/* - driver quickly hacked together from a chinese sourcecode that came - with the board and existing ili9320 code by Chris van Dongen (sjaak) - (sjaak2002 at msn.com) - - Also added rotation for 180 and 270 degrees and minor tweaks to - setcursor - - Added code comes without warranty and free bugs. Feel free to use - or misuse the added code :D -*/ - /** * @file drivers/gdisp/ILI9325/gdisp_lld.c * @brief GDISP Graphics Driver subsystem low level driver source for the ILI9325 display. diff --git a/drivers/gdisp/ILI9325/gdisp_lld_board_hy_stm32_100p.h b/drivers/gdisp/ILI9325/gdisp_lld_board_hy_stm32_100p.h index faa5854a..e785ad10 100644 --- a/drivers/gdisp/ILI9325/gdisp_lld_board_hy_stm32_100p.h +++ b/drivers/gdisp/ILI9325/gdisp_lld_board_hy_stm32_100p.h @@ -50,7 +50,7 @@ static __inline void GDISP_LLD(init_board)(void) { rccEnableAHB(RCC_AHBENR_FSMCEN, 0); /* set pin modes */ -/* IOBus busD = {GPIOD, PAL_WHOLE_PORT, 0}; +/* IOBus busD = {GPIOD, PAL_WHOLE_PORT, 0}; IOBus busE = {GPIOE, PAL_WHOLE_PORT, 0}; palSetBusMode(&busD, PAL_MODE_STM32_ALTERNATE_PUSHPULL); palSetBusMode(&busE, PAL_MODE_STM32_ALTERNATE_PUSHPULL); diff --git a/drivers/gdisp/ILI9325/gdisp_lld_config.h b/drivers/gdisp/ILI9325/gdisp_lld_config.h index c47da0ca..44f8323f 100644 --- a/drivers/gdisp/ILI9325/gdisp_lld_config.h +++ b/drivers/gdisp/ILI9325/gdisp_lld_config.h @@ -18,18 +18,6 @@ along with this program. If not, see . */ -/* - driver quickly hacked together from a chinese sourcecode that came - with the board and existing ili9320 code by Chris van Dongen (Sjaak) - (sjaak2002 at msn.com) - - Also added rotation for 180 and 270 degrees and minor tweaks to - setcursor - - Added code comes without warranty and free bugs. Feel free to use - or misuse the added code :D -*/ - /** * @file drivers/gdisp/ILI9325/gdisp_lld_config.h * @brief GDISP Graphic Driver subsystem low level driver header for the ILI9325 display.