aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gdisp/HX8347D/readme.txt2
-rw-r--r--drivers/gdisp/ILI9320/readme.txt6
-rw-r--r--drivers/gdisp/ILI9325/readme.txt6
-rw-r--r--drivers/gdisp/ILI9481/readme.txt4
-rw-r--r--drivers/gdisp/Nokia6610GE12/readme.txt4
-rw-r--r--drivers/gdisp/Nokia6610GE8/readme.txt4
-rw-r--r--drivers/gdisp/RA8875/gdisp_lld.c460
-rw-r--r--drivers/gdisp/RA8875/gdisp_lld.mk6
-rw-r--r--drivers/gdisp/RA8875/gdisp_lld_board.h199
-rw-r--r--drivers/gdisp/RA8875/gdisp_lld_board_example_fsmc.h181
-rw-r--r--drivers/gdisp/RA8875/gdisp_lld_board_example_gpio.h171
-rw-r--r--drivers/gdisp/RA8875/gdisp_lld_config.h42
-rw-r--r--drivers/gdisp/RA8875/gdisp_lld_panel.h74
-rw-r--r--drivers/gdisp/RA8875/gdisp_lld_panel_example.h74
-rw-r--r--drivers/gdisp/RA8875/ra8875.h18
-rw-r--r--drivers/gdisp/RA8875/readme.txt38
-rw-r--r--drivers/gdisp/S6D1121/readme.txt3
-rw-r--r--drivers/gdisp/SSD1289/readme.txt6
-rw-r--r--drivers/gdisp/SSD1963/readme.txt20
-rw-r--r--drivers/gdisp/SSD2119/gdisp_lld.c99
-rw-r--r--drivers/gdisp/SSD2119/gdisp_lld_board_embest_dmstf4bb.h82
-rw-r--r--drivers/gdisp/SSD2119/readme.txt13
-rw-r--r--drivers/gdisp/TestStub/readme.txt2
-rw-r--r--drivers/ginput/dial/GADC/readme.txt5
-rw-r--r--drivers/ginput/toggle/Pal/readme.txt4
-rw-r--r--drivers/ginput/touch/ADS7843/readme.txt3
-rw-r--r--drivers/ginput/touch/FT5x06/ft5x06.h82
-rw-r--r--drivers/ginput/touch/FT5x06/ginput_lld.mk5
-rw-r--r--drivers/ginput/touch/FT5x06/ginput_lld_mouse.c120
-rw-r--r--drivers/ginput/touch/FT5x06/ginput_lld_mouse_board.h111
-rw-r--r--drivers/ginput/touch/FT5x06/ginput_lld_mouse_board_example.h72
-rw-r--r--drivers/ginput/touch/FT5x06/ginput_lld_mouse_config.h32
-rw-r--r--drivers/ginput/touch/FT5x06/readme.txt8
-rw-r--r--drivers/ginput/touch/MCU/readme.txt3
-rw-r--r--drivers/multiple/Win32/readme.txt3
-rw-r--r--include/gdisp/gdisp.h2
-rw-r--r--license.html2
-rw-r--r--releases.txt2
38 files changed, 1873 insertions, 95 deletions
diff --git a/drivers/gdisp/HX8347D/readme.txt b/drivers/gdisp/HX8347D/readme.txt
index 1725ef60..d0000287 100644
--- a/drivers/gdisp/HX8347D/readme.txt
+++ b/drivers/gdisp/HX8347D/readme.txt
@@ -4,7 +4,7 @@ Driver for LCD with 4-wire serial interface (65k colors).
To use this driver:
-1. Add in your halconf.h:
+1. Add in your gfxconf.h:
a) #define GFX_USE_GDISP TRUE
b) Any optional high level driver defines (see gdisp.h) eg: GDISP_NEED_MULTITHREAD
diff --git a/drivers/gdisp/ILI9320/readme.txt b/drivers/gdisp/ILI9320/readme.txt
index dcffe206..028af728 100644
--- a/drivers/gdisp/ILI9320/readme.txt
+++ b/drivers/gdisp/ILI9320/readme.txt
@@ -1,15 +1,15 @@
To use this driver:
-1. Add in your halconf.h:
+1. Add in your gfxconf.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:
- Olimex STM32-LCD
+ Olimex STM32-LCD
2. To your makefile add the following lines:
include $(GFXLIB)/drivers/gdisp/ILI9320/gdisp_lld.mk
diff --git a/drivers/gdisp/ILI9325/readme.txt b/drivers/gdisp/ILI9325/readme.txt
index 9150610e..9bd96e6a 100644
--- a/drivers/gdisp/ILI9325/readme.txt
+++ b/drivers/gdisp/ILI9325/readme.txt
@@ -1,15 +1,15 @@
To use this driver:
-1. Add in your halconf.h:
+1. Add in your gfxconf.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
+ HY_STM32_100p
2. To your makefile add the following lines:
include $(GFXLIB)/drivers/gdisp/ILI9325/gdisp_lld.mk
diff --git a/drivers/gdisp/ILI9481/readme.txt b/drivers/gdisp/ILI9481/readme.txt
index dc66e27b..235c2582 100644
--- a/drivers/gdisp/ILI9481/readme.txt
+++ b/drivers/gdisp/ILI9481/readme.txt
@@ -1,6 +1,6 @@
To use this driver:
-1. Add in your halconf.h:
+1. Add in your gfxconf.h:
a) #define GFX_USE_GDISP TRUE
b) Any optional high level driver defines (see gdisp.h) eg: GDISP_NEED_MULTITHREAD
@@ -9,7 +9,7 @@ To use this driver:
and ensure it is on your include path.
Use the gdisp_lld_board_example.h or gdisp_lld_board_fsmc.h file as a basis.
Currently known boards are:
- BOARD_FIREBULL_STM32_F103 - GPIO interface: requires GDISP_CMD_PORT and GDISP_DATA_PORT to be defined
+ BOARD_FIREBULL_STM32_F103 - GPIO interface: requires GDISP_CMD_PORT and GDISP_DATA_PORT to be defined
2. To your makefile add the following lines:
include $(GFXLIB)/drivers/gdisp/ILI9481/gdisp_lld.mk
diff --git a/drivers/gdisp/Nokia6610GE12/readme.txt b/drivers/gdisp/Nokia6610GE12/readme.txt
index 54c4570f..bc0ee248 100644
--- a/drivers/gdisp/Nokia6610GE12/readme.txt
+++ b/drivers/gdisp/Nokia6610GE12/readme.txt
@@ -2,14 +2,14 @@ This driver is for the Nokia6610 Philips (GE12) controller
To use this driver:
-1. Add in your halconf.h:
+1. Add in your gfxconf.h:
a) #define GFX_USE_GDISP TRUE
b) Any optional high level driver defines (see gdisp.h) eg: GDISP_NEED_MULTITHREAD
c) 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:
- Olimex SAM7-EX256
+ Olimex SAM7-EX256
2. To your makefile add the following lines:
include $(GFXLIB)/drivers/gdisp/Nokia6610GE12/gdisp_lld.mk
diff --git a/drivers/gdisp/Nokia6610GE8/readme.txt b/drivers/gdisp/Nokia6610GE8/readme.txt
index c8ad8faa..503ca0b9 100644
--- a/drivers/gdisp/Nokia6610GE8/readme.txt
+++ b/drivers/gdisp/Nokia6610GE8/readme.txt
@@ -2,14 +2,14 @@ This driver is for the Nokia6610 Epson (GE8) controller
To use this driver:
-1. Add in your halconf.h:
+1. Add in your gfxconf.h:
a) #define GFX_USE_GDISP TRUE
b) Any optional high level driver defines (see gdisp.h) eg: GDISP_NEED_MULTITHREAD
c) 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:
- Olimex SAM7-EX256
+ Olimex SAM7-EX256
2. To your makefile add the following lines:
include $(GFXLIB)/drivers/gdisp/Nokia6610GE8/gdisp_lld.mk
diff --git a/drivers/gdisp/RA8875/gdisp_lld.c b/drivers/gdisp/RA8875/gdisp_lld.c
new file mode 100644
index 00000000..e04e5dba
--- /dev/null
+++ b/drivers/gdisp/RA8875/gdisp_lld.c
@@ -0,0 +1,460 @@
+/*
+ * This file is subject to the terms of the GFX License. If a copy of
+ * the license was not distributed with this file, you can obtain one at:
+ *
+ * http://chibios-gfx.com/license.html
+ */
+
+/**
+ * @file drivers/gdisp/RA8875/gdisp_lld.c
+ * @brief GDISP Graphics Driver subsystem low level driver source.
+ *
+ * @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"
+
+#include "ra8875.h"
+
+/* include the board abstraction */
+#include "gdisp_lld_board.h"
+
+/*===========================================================================*/
+/* Driver interrupt handlers. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Driver exported functions. */
+/*===========================================================================*/
+
+
+/* ---- Required Routines ---- */
+/*
+ The following 2 routines are required.
+ All other routines are optional.
+*/
+
+/**
+ * @brief Low level GDISP driver initialisation.
+ * @return TRUE if successful, FALSE on error.
+ *
+ * @notapi
+ */
+bool_t gdisp_lld_init(void) {
+ /* Initialise the display */
+ init_board();
+
+ /* soft reset */
+ write_index(0x01);
+ write_data(0x01);
+ write_data(0x00);
+ chThdSleepMilliseconds(1);
+
+ /* Driver PLL config 480x272*/
+ write_index(0x88);
+ write_data(0x08);
+ chThdSleepMilliseconds(1);
+ write_index(0x89);
+ write_data(0x02);
+ chThdSleepMilliseconds(1);
+
+ write_index(0x10); //SYSR bit[4:3]=00 256 color bit[2:1]= 00 8bit MPU interface
+ write_data(0x0F); // if 16bit MCU interface and 65k color display
+
+ write_index(0x04); //set PCLK invers
+ write_data(0x82);
+ chThdSleepMilliseconds(1);
+
+ //Horizontal set
+ write_index(0x14); //HDWR//Horizontal Display Width Setting Bit[6:0]
+ write_data(0x3B);//Horizontal display width(pixels) = (HDWR + 1)*8
+ write_index(0x15); //Horizontal Non-Display Period Fine Tuning Option Register (HNDFTR)
+ write_data(0x00);//Horizontal Non-Display Period Fine Tuning(HNDFT) [3:0]
+ write_index(0x16); //HNDR//Horizontal Non-Display Period Bit[4:0]
+ write_data(0x01);//Horizontal Non-Display Period (pixels) = (HNDR + 1)*8
+ write_index(0x17); //HSTR//HSYNC Start Position[4:0]
+ write_data(0x00);//HSYNC Start Position(PCLK) = (HSTR + 1)*8
+ write_index(0x18); //HPWR//HSYNC Polarity ,The period width of HSYNC.
+ write_data(0x05);//HSYNC Width [4:0] HSYNC Pulse width(PCLK) = (HPWR + 1)*8
+
+ //Vertical set
+ write_index(0x19); //VDHR0 //Vertical Display Height Bit [7:0]
+ write_data(0x0f); //Vertical pixels = VDHR + 1
+ write_index(0x1a); //VDHR1 //Vertical Display Height Bit [8]
+ write_data(0x01); //Vertical pixels = VDHR + 1
+ write_index(0x1b); //VNDR0 //Vertical Non-Display Period Bit [7:0]
+ write_data(0x02); //VSYNC Start Position(PCLK) = (VSTR + 1)
+ write_index(0x1c); //VNDR1 //Vertical Non-Display Period Bit [8]
+ write_data(0x00); //Vertical Non-Display area = (VNDR + 1)
+ write_index(0x1d); //VSTR0 //VSYNC Start Position[7:0]
+ write_data(0x07);//VSYNC Start Position(PCLK) = (VSTR + 1)
+ write_index(0x1e); //VSTR1 //VSYNC Start Position[8]
+ write_data(0x00);//VSYNC Start Position(PCLK) = (VSTR + 1)
+ write_index(0x1f); //VPWR //VSYNC Polarity ,VSYNC Pulse Width[6:0]
+ write_data(0x09); //VSYNC Pulse Width(PCLK) = (VPWR + 1)
+
+ //Active window set
+ //setting active window X
+ write_index(0x30); //Horizontal Start Point 0 of Active Window (HSAW0)
+ write_data(0x00); //Horizontal Start Point of Active Window [7:0]
+ write_index(0x31); //Horizontal Start Point 1 of Active Window (HSAW1)
+ write_data(0x00); //Horizontal Start Point of Active Window [9:8]
+ write_index(0x34); //Horizontal End Point 0 of Active Window (HEAW0)
+ write_data(0xDF); //Horizontal End Point of Active Window [7:0]
+ write_index(0x35); //Horizontal End Point 1 of Active Window (HEAW1)
+ write_data(0x01); //Horizontal End Point of Active Window [9:8]
+
+ //setting active window Y
+ write_index(0x32); //Vertical Start Point 0 of Active Window (VSAW0)
+ write_data(0x00); //Vertical Start Point of Active Window [7:0]
+ write_index(0x33); //Vertical Start Point 1 of Active Window (VSAW1)
+ write_data(0x00); //Vertical Start Point of Active Window [8]
+ write_index(0x36); //Vertical End Point of Active Window 0 (VEAW0)
+ write_data(0x0F); //Vertical End Point of Active Window [7:0]
+ write_index(0x37); //Vertical End Point of Active Window 1 (VEAW1)
+ write_data(0x01); //Vertical End Point of Active Window [8]
+
+ // Display ON
+ write_index(0x01); //PWRR
+ write_data(0x80);
+
+ // GPO0 DISP high
+ write_index(0x13); //GPO
+ write_data(0x01);
+
+ set_backlight(0x80); //set to 90% brightness
+
+ post_init_board();
+
+ /* Initialise the GDISP structure to match */
+ GDISP.Width = GDISP_SCREEN_WIDTH;
+ GDISP.Height = GDISP_SCREEN_HEIGHT;
+ GDISP.Orientation = GDISP_ROTATE_0;
+ GDISP.Powermode = powerOn;
+ GDISP.Backlight = 100;
+ GDISP.Contrast = 50;
+ #if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP
+ GDISP.clipx0 = 0;
+ GDISP.clipy0 = 0;
+ GDISP.clipx1 = GDISP.Width;
+ GDISP.clipy1 = GDISP.Height;
+ #endif
+
+ return TRUE;
+}
+
+void gdisp_lld_setwindow(coord_t x0, coord_t y0, coord_t x1, coord_t y1) {
+ /* We don't need to validate here as the LLD routines will validate first.
+ *
+ * #if GDISP_NEED_VALIDATION
+ * if (x0 >= GDISP.Width || y0 >= GDISP.Height || x0 < 0 || y0 < 0) return;
+ * else if (x1 >= GDISP.Width || y1 >= GDISP.Height || y1 < 0 || y2 < 0) return;
+ * #endif
+ */
+
+ //setting active window X
+ write_index(0x30); //HSAW0
+ write_data(x0);
+ write_index(0x31); //HSAW1
+ write_data(x0>>8);
+
+ write_index(0x34); //HEAW0
+ write_data(x1);
+ write_index(0x35); //HEAW1
+ write_data(x1>>8);
+
+ //setting active window Y
+ write_index(0x32); //VSAW0
+ write_data(y0);
+ write_index(0x33); //VSAW1
+ write_data(y0>>8);
+
+ write_index(0x36); //VEAW0
+ write_data(y1);
+ write_index(0x37); //VEAW1
+ write_data(y1>>8);
+
+ write_index(0x46);
+ write_data(x0);
+ write_index(0x47);
+ write_data(x0>>8);
+
+ write_index(0x48);
+ write_data(y0);
+ write_index(0x49);
+ write_data(y0>>8);
+}
+
+/**
+ * @brief Draws a pixel on the display.
+ *
+ * @param[in] x X location of the pixel
+ * @param[in] y Y location of the pixel
+ * @param[in] color The color of the pixel
+ *
+ * @notapi
+ */
+void gdisp_lld_draw_pixel(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
+
+ gdisp_lld_setwindow(x, y, x, y);
+ write_index(RA8875_WRITE_MEMORY_START);
+ write_data(color);
+}
+
+/* ---- Optional Routines ---- */
+
+#if GDISP_HARDWARE_FILLS || defined(__DOXYGEN__)
+ /**
+ * @brief Fill an area with a color.
+ * @note Optional - The high level driver can emulate using software.
+ *
+ * @param[in] x, y The start filled area
+ * @param[in] cx, cy The width and height to be filled
+ * @param[in] color The color of the fill
+ *
+ * @notapi
+ */
+ void gdisp_lld_fill_area(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) {
+ uint32_t area;
+
+ #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
+
+ area = cx*cy;
+
+ gdisp_lld_setwindow(x, y, x+cx-1, y+cy-1);
+ write_index(RA8875_WRITE_MEMORY_START);
+
+ #if defined(GDISP_USE_FSMC) && defined(GDISP_USE_DMA) && defined(GDISP_DMA_STREAM)
+ uint8_t i;
+ dmaStreamSetPeripheral(GDISP_DMA_STREAM, &color);
+ dmaStreamSetMode(GDISP_DMA_STREAM, STM32_DMA_CR_PL(0) | STM32_DMA_CR_PSIZE_HWORD | STM32_DMA_CR_MSIZE_HWORD | STM32_DMA_CR_DIR_M2M);
+ for (i = area/65535; i; i--) {
+ dmaStreamSetTransactionSize(GDISP_DMA_STREAM, 65535);
+ dmaStreamEnable(GDISP_DMA_STREAM);
+ dmaWaitCompletion(GDISP_DMA_STREAM);
+ }
+ dmaStreamSetTransactionSize(GDISP_DMA_STREAM, area%65535);
+ dmaStreamEnable(GDISP_DMA_STREAM);
+ dmaWaitCompletion(GDISP_DMA_STREAM);
+ #else
+ uint32_t index;
+ for(index = 0; index < area; index++)
+ write_data(color);
+ #endif //#ifdef GDISP_USE_DMA
+}
+#endif
+
+#if GDISP_HARDWARE_BITFILLS || defined(__DOXYGEN__)
+ /**
+ * @brief Fill an area with a bitmap.
+ * @note Optional - The high level driver can emulate using software.
+ *
+ * @param[in] x, y The start filled area
+ * @param[in] cx, cy The width and height to be filled
+ * @param[in] srcx, srcy The bitmap position to start the fill from
+ * @param[in] srccx The width of a line in the bitmap.
+ * @param[in] buffer The pixels to use to fill the area.
+ *
+ * @notapi
+ */
+ void gdisp_lld_blit_area_ex(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) {
+
+ #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
+
+ gdisp_lld_setwindow(x, y, x+cx-1, y+cy-1);
+ write_index(RA8875_WRITE_MEMORY_START);
+
+ buffer += srcx + srcy * srccx;
+
+ #if defined(GDISP_USE_FSMC) && defined(GDISP_USE_DMA) && defined(GDISP_DMA_STREAM)
+ uint32_t area = cx*cy;
+ uint8_t i;
+ dmaStreamSetPeripheral(GDISP_DMA_STREAM, buffer);
+ dmaStreamSetMode(GDISP_DMA_STREAM, STM32_DMA_CR_PL(0) | STM32_DMA_CR_PINC | STM32_DMA_CR_PSIZE_HWORD | STM32_DMA_CR_MSIZE_HWORD | STM32_DMA_CR_DIR_M2M);
+ for (i = area/65535; i; i--) {
+ dmaStreamSetTransactionSize(GDISP_DMA_STREAM, 65535);
+ dmaStreamEnable(GDISP_DMA_STREAM);
+ dmaWaitCompletion(GDISP_DMA_STREAM);
+ }
+ dmaStreamSetTransactionSize(GDISP_DMA_STREAM, area%65535);
+ dmaStreamEnable(GDISP_DMA_STREAM);
+ dmaWaitCompletion(GDISP_DMA_STREAM);
+ #else
+ coord_t endx, endy;
+ uint32_t lg;
+ endx = srcx + cx;
+ endy = y + cy;
+ lg = srccx - cx;
+ for(; y < endy; y++, buffer += lg)
+ for(x=srcx; x < endx; x++)
+ write_data(*buffer++);
+ #endif //#ifdef GDISP_USE_DMA
+ }
+#endif
+
+#if (GDISP_NEED_SCROLL && GDISP_HARDWARE_SCROLL) || defined(__DOXYGEN__)
+ /**
+ * @brief Scroll vertically a section of the screen.
+ * @note Optional.
+ * @note If x,y + cx,cy is off the screen, the result is undefined.
+ * @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.
+ *
+ * @notapi
+ */
+ void gdisp_lld_vertical_scroll(coord_t x, coord_t y, coord_t cx, coord_t cy, int lines, color_t bgcolor) {
+ #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
+ /* NOT IMPLEMENTED YET */
+
+ /*
+ uint16_t size = x1 - x0 ;
+
+ write_index(SSD1963_SET_SCROLL_AREA);
+ write_data((x0 >> 8) & 0xFF);
+ write_data((x0 >> 0) & 0xFF);
+ write_data((size >> 8) & 0xFF);
+ write_data((size >> 0) & 0xFF);
+ write_data(((lcd_height-x1) >> 8) & 0xFF);
+ write_data(((lcd_height-x1) >> 0) & 0xFF);
+
+ write_index(SSD1963_SET_SCROLL_START);
+ write_data((lines >> 8) & 0xFF);
+ write_data((lines >> 0) & 0xFF);
+ */
+ }
+
+#endif
+
+#if (GDISP_NEED_CONTROL && GDISP_HARDWARE_CONTROL) || defined(__DOXYGEN__)
+ /**
+ * @brief Driver Control
+ * @details 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(unsigned 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:
+ write_index(SSD1963_EXIT_SLEEP_MODE); // leave sleep mode
+ chThdSleepMilliseconds(5);
+ write_index(SSD1963_SET_DISPLAY_OFF);
+ write_index(SSD1963_SET_DEEP_SLEEP); // enter deep sleep mode
+ break;
+ case powerOn:
+ read_reg(0x0000); chThdSleepMilliseconds(5); // 2x Dummy reads to wake up from deep sleep
+ read_reg(0x0000); chThdSleepMilliseconds(5);
+ if (GDISP.Powermode != powerSleep)
+ gdisp_lld_init();
+ write_index(SSD1963_SET_DISPLAY_ON);
+
+ break;
+ case powerSleep:
+ write_index(SSD1963_SET_DISPLAY_OFF);
+ write_index(SSD1963_ENTER_SLEEP_MODE); // enter sleep mode
+ chThdSleepMilliseconds(5);
+ 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:
+ /* Code here */
+ GDISP.Height = GDISP_SCREEN_HEIGHT;
+ GDISP.Width = GDISP_SCREEN_WIDTH;
+ break;
+ case GDISP_ROTATE_90:
+ /* Code here */
+ GDISP.Height = GDISP_SCREEN_WIDTH;
+ GDISP.Width = GDISP_SCREEN_HEIGHT;
+ break;
+ case GDISP_ROTATE_180:
+ /* Code here */
+ GDISP.Height = GDISP_SCREEN_HEIGHT;
+ GDISP.Width = GDISP_SCREEN_WIDTH;
+ break;
+ case GDISP_ROTATE_270:
+ /* Code here */
+ 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:
+ gdisp_lld_bg_dimmer(54 + ((uint8_t)value) << 1);//turn 0..100% in 54..255
+ return;
+/*
+ case GDISP_CONTROL_CONTRAST:
+*/
+ }
+ }
+#endif
+
+#endif /* GFX_USE_GDISP */
+/** @} */
+
diff --git a/drivers/gdisp/RA8875/gdisp_lld.mk b/drivers/gdisp/RA8875/gdisp_lld.mk
new file mode 100644
index 00000000..471b7e83
--- /dev/null
+++ b/drivers/gdisp/RA8875/gdisp_lld.mk
@@ -0,0 +1,6 @@
+# List the required driver.
+GFXSRC += $(GFXLIB)/drivers/gdisp/RA8875/gdisp_lld.c
+
+# Required include directories
+GFXINC += $(GFXLIB)/drivers/gdisp/RA8875
+
diff --git a/drivers/gdisp/RA8875/gdisp_lld_board.h b/drivers/gdisp/RA8875/gdisp_lld_board.h
new file mode 100644
index 00000000..c8370020
--- /dev/null
+++ b/drivers/gdisp/RA8875/gdisp_lld_board.h
@@ -0,0 +1,199 @@
+/*
+ * This file is subject to the terms of the GFX License. If a copy of
+ * the license was not distributed with this file, you can obtain one at:
+ *
+ * http://chibios-gfx.com/license.html
+ */
+
+/**
+ * @file drivers/gdisp/SSD1289/gdisp_lld_board_example_fsmc.h
+ * @brief GDISP Graphic Driver subsystem board interface for the SSD1289 display.
+ *
+ * @addtogroup GDISP
+ * @{
+ */
+
+#ifndef _GDISP_LLD_BOARD_H
+#define _GDISP_LLD_BOARD_H
+
+#if defined(GDISP_USE_GPIO)
+ #define Set_CS palSetPad(GDISP_CMD_PORT, GDISP_CS);
+ #define Clr_CS palClearPad(GDISP_CMD_PORT, GDISP_CS);
+ #define Set_RS palSetPad(GDISP_CMD_PORT, GDISP_RS);
+ #define Clr_RS palClearPad(GDISP_CMD_PORT, GDISP_RS);
+ #define Set_WR palSetPad(GDISP_CMD_PORT, GDISP_WR);
+ #define Clr_WR palClearPad(GDISP_CMD_PORT, GDISP_WR);
+ #define Set_RD palSetPad(GDISP_CMD_PORT, GDISP_RD);
+ #define Clr_RD palClearPad(GDISP_CMD_PORT, GDISP_RD);
+#endif
+
+#if defined(GDISP_USE_FSMC)
+ /* Using FSMC A16 as RS */
+ #define GDISP_RAM (*((volatile uint16_t *) 0x68000000)) /* RS = 0 */
+ #define GDISP_REG (*((volatile uint16_t *) 0x68020000)) /* RS = 1 */
+#endif
+
+/**
+ * @brief Send data to the index register.
+ *
+ * @param[in] index The index register to set
+ *
+ * @notapi
+ */
+static inline void write_index(uint16_t index) { GDISP_REG = index; }
+
+/**
+ * @brief Send data to the lcd.
+ *
+ * @param[in] data The data to send
+ *
+ * @notapi
+ */
+static inline void write_data(uint16_t data) { GDISP_RAM = data; }
+
+/**
+ * @brief Read data from the lcd.
+ *
+ * @return The data from the lcd
+ * @note The chip select may need to be asserted/de-asserted
+ * around the actual spi read
+ *
+ * @notapi
+ */
+static inline uint16_t read_data(void) { return GDISP_RAM; }
+
+/**
+ * @brief Initialise the board for the display.
+ * @notes Performs the following functions:
+ * 1. initialise the io port used by your display
+ * 2. initialise the reset pin (initial state not-in-reset)
+ * 3. initialise the chip select pin (initial state not-active)
+ * 4. initialise the backlight pin (initial state back-light off)
+ *
+ * @notapi
+ */
+static inline void init_board(void) {
+ const unsigned char FSMC_Bank = 4;
+
+ #if defined(STM32F1XX) || defined(STM32F3XX)
+ /* FSMC setup for F1/F3 */
+ rccEnableAHB(RCC_AHBENR_FSMCEN, 0);
+
+ #if defined(GDISP_USE_DMA) && defined(GDISP_DMA_STREAM)
+ #error "DMA not implemented for F1/F3 Devices"
+ #endif
+ #elif defined(STM32F4XX) || defined(STM32F2XX)
+ /* STM32F2-F4 FSMC init */
+ rccEnableAHB3(RCC_AHB3ENR_FSMCEN, 0);
+
+ #if defined(GDISP_USE_DMA) && defined(GDISP_DMA_STREAM)
+ if (dmaStreamAllocate(GDISP_DMA_STREAM, 0, NULL, NULL)) chSysHalt();
+ dmaStreamSetMemory0(GDISP_DMA_STREAM, &GDISP_RAM);
+ dmaStreamSetMode(GDISP_DMA_STREAM, STM32_DMA_CR_PL(0) | STM32_DMA_CR_PSIZE_HWORD | STM32_DMA_CR_MSIZE_HWORD | STM32_DMA_CR_DIR_M2M);
+ #endif
+ #else
+ #error "FSMC not implemented for this device"
+ #endif
+
+ /* set pins to FSMC mode */
+ IOBus busD = {GPIOD, (1 << 0) | (1 << 1) | (1 << 4) | (1 << 5) | (1 << 8) |
+ (1 << 9) | (1 << 10) | (1 << 11) | (1 << 14) | (1 << 15), 0};
+
+ IOBus busE = {GPIOE, (1 << 7) | (1 << 8) | (1 << 9) | (1 << 10) | (1 << 11) | (1 << 12) |
+ (1 << 13) | (1 << 14) | (1 << 15), 0};
+
+ IOBus busG = {GPIOG, (1 << 10), 0};
+
+ palSetBusMode(&busD, PAL_MODE_ALTERNATE(12));
+ palSetBusMode(&busE, PAL_MODE_ALTERNATE(12));
+ palSetBusMode(&busG, PAL_MODE_ALTERNATE(12));
+
+ /* FSMC timing */
+ FSMC_Bank1->BTCR[FSMC_Bank+1] = (FSMC_BTR1_ADDSET_1 | FSMC_BTR1_ADDSET_3) \
+ | (FSMC_BTR1_DATAST_1 | FSMC_BTR1_DATAST_3) \
+ | (FSMC_BTR1_BUSTURN_1 | FSMC_BTR1_BUSTURN_3) ;
+
+ /* 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 post_init_board(void) {
+ const unsigned char FSMC_Bank = 2;
+ /* FSMC delay reduced as the controller now runs at full speed */
+ FSMC_Bank1->BTCR[FSMC_Bank+1] = FSMC_BTR1_ADDSET_0 | FSMC_BTR1_DATAST_2 | FSMC_BTR1_BUSTURN_0 ;
+ FSMC_Bank1->BTCR[FSMC_Bank] = FSMC_BCR1_MWID_0 | FSMC_BCR1_WREN | FSMC_BCR1_MBKEN;
+}
+
+/**
+ * @brief Set or clear the lcd reset pin.
+ *
+ * @param[in] state TRUE = lcd in reset, FALSE = normal operation
+ *
+ * @notapi
+ */
+static inline void setpin_reset(bool_t state) {
+ (void) state;
+ /* Nothing to do here */
+}
+
+/**
+ * @brief Set the lcd back-light level.
+ *
+ * @param[in] percent 0 to 100%
+ *
+ * @notapi
+ */
+static inline void set_backlight(uint8_t percent) {
+
+ //duty_cycle is 00..FF
+ //Work in progress: the RA8875 has a built-in PWM, its output can
+ //be used by a Dynamic Background Control or by a host (user)
+
+ uint8_t temp, temp1;
+ // Enable PWM1
+ write_index(0x8a);//MCLR
+ temp = read_data();
+ temp |= 1<<7 ;
+ write_data(temp);
+
+ // PWM1 function select
+ write_index(0x8a);//MCLR
+ temp = read_data();
+ temp &= ~(1<<4);
+ write_data(temp);
+
+ // PWM1 Clock ratio
+ temp1= 0x0b&0x0f;
+ write_index(0x8a);//MCLR
+ temp = read_data();
+ temp &= 0xf0;
+ temp |= temp1 ;
+ write_data(temp);
+
+ // Write duty cycle
+ write_index(0x8b);//PTNO
+ write_data(percent);
+ // PWM1 duty cycle
+}
+
+/**
+ * @brief Take exclusive control of the bus
+ *
+ * @notapi
+ */
+static inline void acquire_bus(void) {
+ /* Nothing to do here */
+}
+
+/**
+ * @brief Release exclusive control of the bus
+ *
+ * @notapi
+ */
+static inline void release_bus(void) {
+ /* Nothing to do here */
+}
+
+#endif /* _GDISP_LLD_BOARD_H */
+/** @} */
diff --git a/drivers/gdisp/RA8875/gdisp_lld_board_example_fsmc.h b/drivers/gdisp/RA8875/gdisp_lld_board_example_fsmc.h
new file mode 100644
index 00000000..f16fbfc7
--- /dev/null
+++ b/drivers/gdisp/RA8875/gdisp_lld_board_example_fsmc.h
@@ -0,0 +1,181 @@
+/*
+ * This file is subject to the terms of the GFX License. If a copy of
+ * the license was not distributed with this file, you can obtain one at:
+ *
+ * http://chibios-gfx.com/license.html
+ */
+
+/**
+ * @file drivers/gdisp/SSD1289/gdisp_lld_board_example_fsmc.h
+ * @brief GDISP Graphic Driver subsystem board interface for the SSD1289 display.
+ *
+ * @addtogroup GDISP
+ * @{
+ */
+
+#ifndef _GDISP_LLD_BOARD_H
+#define _GDISP_LLD_BOARD_H
+
+#if defined(GDISP_USE_GPIO)
+ #define Set_CS palSetPad(GDISP_CMD_PORT, GDISP_CS);
+ #define Clr_CS palClearPad(GDISP_CMD_PORT, GDISP_CS);
+ #define Set_RS palSetPad(GDISP_CMD_PORT, GDISP_RS);
+ #define Clr_RS palClearPad(GDISP_CMD_PORT, GDISP_RS);
+ #define Set_WR palSetPad(GDISP_CMD_PORT, GDISP_WR);
+ #define Clr_WR palClearPad(GDISP_CMD_PORT, GDISP_WR);
+ #define Set_RD palSetPad(GDISP_CMD_PORT, GDISP_RD);
+ #define Clr_RD palClearPad(GDISP_CMD_PORT, GDISP_RD);
+#endif
+
+#if defined(GDISP_USE_FSMC)
+ /* Using FSMC A16 as RS */
+ #define GDISP_REG (*((volatile uint16_t *) 0x60000000)) /* RS = 0 */
+ #define GDISP_RAM (*((volatile uint16_t *) 0x60020000)) /* RS = 1 */
+#endif
+
+/**
+ * @brief Send data to the index register.
+ *
+ * @param[in] index The index register to set
+ *
+ * @notapi
+ */
+static inline void write_index(uint16_t index) { GDISP_REG = index; }
+
+/**
+ * @brief Send data to the lcd.
+ *
+ * @param[in] data The data to send
+ *
+ * @notapi
+ */
+static inline void write_data(uint16_t data) { GDISP_RAM = data; }
+
+/**
+ * @brief Initialise the board for the display.
+ * @notes Performs the following functions:
+ * 1. initialise the io port used by your display
+ * 2. initialise the reset pin (initial state not-in-reset)
+ * 3. initialise the chip select pin (initial state not-active)
+ * 4. initialise the backlight pin (initial state back-light off)
+ *
+ * @notapi
+ */
+static inline void init_board(void) {
+ const unsigned char FSMC_Bank = 0;
+
+ #if defined(STM32F1XX) || defined(STM32F3XX)
+ /* FSMC setup for F1/F3 */
+ rccEnableAHB(RCC_AHBENR_FSMCEN, 0);
+
+ #if defined(GDISP_USE_DMA) && defined(GDISP_DMA_STREAM)
+ #error "DMA not implemented for F1/F3 Devices"
+ #endif
+ #elif defined(STM32F4XX) || defined(STM32F2XX)
+ /* STM32F2-F4 FSMC init */
+ rccEnableAHB3(RCC_AHB3ENR_FSMCEN, 0);
+
+ #if defined(GDISP_USE_DMA) && defined(GDISP_DMA_STREAM)
+ if (dmaStreamAllocate(GDISP_DMA_STREAM, 0, NULL, NULL)) chSysHalt();
+ dmaStreamSetMemory0(GDISP_DMA_STREAM, &GDISP_RAM);
+ dmaStreamSetMode(GDISP_DMA_STREAM, STM32_DMA_CR_PL(0) | STM32_DMA_CR_PSIZE_HWORD | STM32_DMA_CR_MSIZE_HWORD | STM32_DMA_CR_DIR_M2M);
+ #endif
+ #else
+ #error "FSMC not implemented for this device"
+ #endif
+
+ /* set pins to FSMC mode */
+ IOBus busD = {GPIOD, (1 << 0) | (1 << 1) | (1 << 4) | (1 << 5) | (1 << 7) | (1 << 8) |
+ (1 << 9) | (1 << 10) | (1 << 11) | (1 << 14) | (1 << 15), 0};
+
+ IOBus busE = {GPIOE, (1 << 7) | (1 << 8) | (1 << 9) | (1 << 10) | (1 << 11) | (1 << 12) |
+ (1 << 13) | (1 << 14) | (1 << 15), 0};
+
+ palSetBusMode(&busD, PAL_MODE_ALTERNATE(12));
+ palSetBusMode(&busE, PAL_MODE_ALTERNATE(12));
+
+ /* FSMC timing */
+ FSMC_Bank1->BTCR[FSMC_Bank+1] = (FSMC_BTR1_ADDSET_1 | FSMC_BTR1_ADDSET_3) \
+ | (FSMC_BTR1_DATAST_1 | FSMC_BTR1_DATAST_3) \
+ | (FSMC_BTR1_BUSTURN_1 | FSMC_BTR1_BUSTURN_3) ;
+
+ /* 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 post_init_board(void) {
+ const unsigned char FSMC_Bank = 0;
+ /* FSMC delay reduced as the controller now runs at full speed */
+ FSMC_Bank1->BTCR[FSMC_Bank+1] = FSMC_BTR1_ADDSET_0 | FSMC_BTR1_DATAST_2 | FSMC_BTR1_BUSTURN_0 ;
+ FSMC_Bank1->BTCR[FSMC_Bank] = FSMC_BCR1_MWID_0 | FSMC_BCR1_WREN | FSMC_BCR1_MBKEN;
+}
+
+/**
+ * @brief Set or clear the lcd reset pin.
+ *
+ * @param[in] state TRUE = lcd in reset, FALSE = normal operation
+ *
+ * @notapi
+ */
+static inline void setpin_reset(bool_t state) {
+ (void) state;
+ /* Nothing to do here */
+}
+
+/**
+ * @brief Set the lcd back-light level.
+ *
+ * @param[in] percent 0 to 100%
+ *
+ * @notapi
+ */
+static inline void set_backlight(uint8_t percent) {
+ //duty_cycle is 00..FF
+ //Work in progress: the SSD1963 has a built-in PWM, its output can
+ //be used by a Dynamic Background Control or by a host (user)
+ //Check your LCD's hardware, the PWM connection is default left open and instead
+ //connected to a LED connection on the breakout board
+ write_index(SSD1963_SET_PWM_CONF);//set PWM for BackLight
+ write_data(0x0001);
+ write_data(percent & 0x00FF);
+ write_data(0x0001);//controlled by host (not DBC), enabled
+ write_data(0x00FF);
+ write_data(0x0060);//don't let it go too dark, avoid a useless LCD
+ write_data(0x000F);//prescaler ???
+}
+
+/**
+ * @brief Take exclusive control of the bus
+ *
+ * @notapi
+ */
+static inline void acquire_bus(void) {
+ /* Nothing to do here */
+}
+
+/**
+ * @brief Release exclusive control of the bus
+ *
+ * @notapi
+ */
+static inline void release_bus(void) {
+ /* Nothing to do here */
+}
+
+#if GDISP_HARDWARE_READPIXEL || GDISP_HARDWARE_SCROLL || defined(__DOXYGEN__)
+/**
+ * @brief Read data from the lcd.
+ *
+ * @return The data from the lcd
+ * @note The chip select may need to be asserted/de-asserted
+ * around the actual spi read
+ *
+ * @notapi
+ */
+static inline uint16_t read_data(void) { return GDISP_RAM; }
+#endif
+
+#endif /* _GDISP_LLD_BOARD_H */
+/** @} */
+
diff --git a/drivers/gdisp/RA8875/gdisp_lld_board_example_gpio.h b/drivers/gdisp/RA8875/gdisp_lld_board_example_gpio.h
new file mode 100644
index 00000000..af879520
--- /dev/null
+++ b/drivers/gdisp/RA8875/gdisp_lld_board_example_gpio.h
@@ -0,0 +1,171 @@
+/*
+ * This file is subject to the terms of the GFX License. If a copy of
+ * the license was not distributed with this file, you can obtain one at:
+ *
+ * http://chibios-gfx.com/license.html
+ */
+
+/**
+ * @file drivers/gdisp/SSD1963/gdisp_lld_board_example_gpio.h
+ * @brief GDISP Graphic Driver subsystem board interface for the SSD1963 display.
+ *
+ * @addtogroup GDISP
+ * @{
+ */
+
+#ifndef _GDISP_LLD_BOARD_H
+#define _GDISP_LLD_BOARD_H
+
+#if defined(GDISP_USE_GPIO)
+ #define Set_CS palSetPad(GDISP_CMD_PORT, GDISP_CS);
+ #define Clr_CS palClearPad(GDISP_CMD_PORT, GDISP_CS);
+ #define Set_RS palSetPad(GDISP_CMD_PORT, GDISP_RS);
+ #define Clr_RS palClearPad(GDISP_CMD_PORT, GDISP_RS);
+ #define Set_WR palSetPad(GDISP_CMD_PORT, GDISP_WR);
+ #define Clr_WR palClearPad(GDISP_CMD_PORT, GDISP_WR);
+ #define Set_RD palSetPad(GDISP_CMD_PORT, GDISP_RD);
+ #define Clr_RD palClearPad(GDISP_CMD_PORT, GDISP_RD);
+#endif
+
+#if defined(GDISP_USE_FSMC)
+ /* Using FSMC A16 as RS */
+ #define GDISP_REG (*((volatile uint16_t *) 0x60000000)) /* RS = 0 */
+ #define GDISP_RAM (*((volatile uint16_t *) 0x60020000)) /* RS = 1 */
+#endif
+
+/**
+ * @brief Send data to the index register.
+ *
+ * @param[in] index The index register to set
+ *
+ * @notapi
+ */
+static inline void write_index(uint16_t index) {
+ Set_CS; Set_RS; Set_WR; Clr_RD;
+ palWritePort(GDISP_DATA_PORT, index);
+ Clr_CS;
+}
+
+/**
+ * @brief Send data to the lcd.
+ *
+ * @param[in] data The data to send
+ *
+ * @notapi
+ */
+static inline void write_data(uint16_t data) {
+ Set_CS; Clr_RS; Set_WR; Clr_RD;
+ palWritePort(GDISP_DATA_PORT, data);
+ Clr_CS;
+}
+
+/**
+ * @brief Initialise the board for the display.
+ *
+ * @notapi
+ */
+static inline void init_board(void) {
+
+ IOBus busCMD = {GDISP_CMD_PORT, (1 << GDISP_CS) | (1 << GDISP_RS) | (1 << GDISP_WR) | (1 << GDISP_RD), 0};
+ IOBus busDATA = {GDISP_CMD_PORT, 0xFFFFF, 0};
+ palSetBusMode(&busCMD, PAL_MODE_OUTPUT_PUSHPULL);
+ palSetBusMode(&busDATA, PAL_MODE_OUTPUT_PUSHPULL);
+}
+
+static inline void post_init_board(void) {
+ /* Nothing to do here */
+}
+
+/**
+ * @brief Set or clear the lcd reset pin.
+ *
+ * @param[in] state TRUE = lcd in reset, FALSE = normal operation
+ *
+ * @notapi
+ */
+static inline void setpin_reset(bool_t state) {
+
+}
+
+/**
+ * @brief Set the lcd back-light level.
+ *
+ * @param[in] percent 0 to 100%
+ *
+ * @notapi
+ */
+static inline void set_backlight(uint8_t percent) {
+ //duty_cycle is 00..FF
+ //Work in progress: the SSD1963 has a built-in PWM, its output can
+ //be used by a Dynamic Background Control or by a host (user)
+ //Check your LCD's hardware, the PWM connection is default left open and instead
+ //connected to a LED connection on the breakout board
+ write_index(SSD1963_SET_PWM_CONF);//set PWM for BackLight
+ write_data(0x0001);
+ write_data(percent & 0x00FF);
+ write_data(0x0001);//controlled by host (not DBC), enabled
+ write_data(0x00FF);
+ write_data(0x0060);//don't let it go too dark, avoid a useless LCD
+ write_data(0x000F);//prescaler ???
+}
+
+/**
+ * @brief Take exclusive control of the bus
+ *
+ * @notapi
+ */
+static inline void acquire_bus(void) {
+ /* Nothing to do here */
+}
+
+/**
+ * @brief Release exclusive control of the bus
+ *
+ * @notapi
+ */
+static inline void release_bus(void) {
+ /* Nothing to do here */
+}
+
+__inline void write_stream(uint16_t *buffer, uint16_t size) {
+ uint16_t i;
+ Set_CS; Clr_RS; Set_WR; Clr_RD;
+ for(i = 0; i < size; i++) {
+ Set_WR;
+ palWritePort(GDISP_DATA_PORT, buffer[i]);
+ Clr_WR;
+ }
+ Clr_CS;
+}
+
+__inline void read_stream(uint16_t *buffer, size_t size) {
+ uint16_t i;
+ Set_CS; Clr_RS; Clr_WR; Set_RD;
+ for(i = 0; i < size; i++) {
+ Set_RD;
+ buffer[i] = palReadPort(GDISP_DATA_PORT);
+ Clr_RD;
+ }
+}
+
+#if GDISP_HARDWARE_READPIXEL || GDISP_HARDWARE_SCROLL || defined(__DOXYGEN__)
+/**
+ * @brief Read data from the lcd.
+ *
+ * @return The data from the lcd
+ * @note The chip select may need to be asserted/de-asserted
+ * around the actual spi read
+ *
+ * @notapi
+ */
+static inline uint16_t read_data(void) {
+ Set_CS; Clr_RS; Clr_WR; Set_RD;
+ uint16_t data = palReadPort(GDISP_DATA_PORT);
+ Clr_CS;
+ return data;
+}
+#endif
+
+#endif /* _GDISP_LLD_BOARD_H */
+/** @} */
+
diff --git a/drivers/gdisp/RA8875/gdisp_lld_config.h b/drivers/gdisp/RA8875/gdisp_lld_config.h
new file mode 100644
index 00000000..315ab177
--- /dev/null
+++ b/drivers/gdisp/RA8875/gdisp_lld_config.h
@@ -0,0 +1,42 @@
+/*
+ * This file is subject to the terms of the GFX License. If a copy of
+ * the license was not distributed with this file, you can obtain one at:
+ *
+ * http://chibios-gfx.com/license.html
+ */
+
+/**
+ * @file drivers/gdisp/SSD1963/gdisp_lld_config.h
+ * @brief GDISP Graphic Driver subsystem low level driver header.
+ *
+ * @addtogroup GDISP
+ * @{
+ */
+
+#ifndef _GDISP_LLD_CONFIG_H
+#define _GDISP_LLD_CONFIG_H
+
+#if GFX_USE_GDISP
+
+/*===========================================================================*/
+/* Driver hardware support. */
+/*===========================================================================*/
+
+#define GDISP_DRIVER_NAME "RA8875"
+#define GDISP_LLD(x) gdisp_lld_##x##_RA8875
+
+#define GDISP_HARDWARE_FILLS TRUE
+#define GDISP_HARDWARE_BITFILLS TRUE
+#define GDISP_HARDWARE_READPIXEL TRUE
+
+/* Maybe someday soon */
+#define GDISP_HARDWARE_SCROLL FALSE
+#define GDISP_HARDWARE_CONTROL FALSE
+
+#define GDISP_PIXELFORMAT GDISP_PIXELFORMAT_RGB565
+
+#endif /* GFX_USE_GDISP */
+
+#endif /* _GDISP_LLD_CONFIG_H */
+/** @} */
+
diff --git a/drivers/gdisp/RA8875/gdisp_lld_panel.h b/drivers/gdisp/RA8875/gdisp_lld_panel.h
new file mode 100644
index 00000000..b6c4e4c8
--- /dev/null
+++ b/drivers/gdisp/RA8875/gdisp_lld_panel.h
@@ -0,0 +1,74 @@
+/*
+ * This file is subject to the terms of the GFX License, v1.0. If a copy of
+ * the license was not distributed with this file, you can obtain one at:
+ *
+ * http://chibios-gfx.com/license.html
+ */
+
+/**
+ * @file drivers/gdisp/SSD1963/gdisp_lld_panel_example.h
+ * @brief TFT LCD panel properties.
+ *
+ * @addtogroup GDISP
+ * @{
+ */
+
+#ifndef _GDISP_LLD_PANEL_H
+#define _GDISP_LLD_PANEL_H
+
+/* LCD panel specs */
+
+/* The timings need to follow the datasheet for your particular TFT/LCD screen (the actual screen, not the controller)
+*** Datasheets normally use a specific set of timings and acronyms, their value refers to the number of pixel clocks
+** Non-display periods refer to pulses/timings that occur before or after the timings that actually put pixels on the screen
+** Display periods refer to pulses/timings that directly put pixels on the screen
+HDP: Horizontal Display Period, normally the width - 1
+HT: Horizontal Total period (display + non-display)
+HPS: non-display period between the start of the horizontal sync (LLINE) signal and the first display data
+LPS: horizontal sync pulse (LLINE) start location in pixel clocks
+HPW: Horizontal sync Pulse Width
+VDP: Vertical Display period, normally height - 1
+VT: Vertical Total period (display + non-display)
+VPS: non-display period in lines between the start of the frame and the first display data in number of lines
+FPS: vertical sync pulse (LFRAME) start location in lines.
+VPW: Vertical sync Pulse Width
+
+*** Here's how to convert them:
+HPS = SCREEN_HSYNC_PULSE + SCREEN_HSYNC_BACK_PORCH
+HT - HPS = GDISP_SCREEN_WIDTH + SCREEN_HSYNC_FRONT_PORCH
+=> SCREEN_HSYNC_FRONT_PORCH = ( HT - HPS ) - GDISP_SCREEN_WIDTH
+ SCREEN_HSYNC_PULSE = HPW
+ SCREEN_HSYNC_BACK_PORCH = HPS - HPW
+ SCREEN_HSYNC_PERIOD = HT
+
+VPS = SCREEN_VSYNC_PULSE + SCREEN_VSYNC_BACK_PORCH
+VT - VPS = GDISP_SCREEN_HEIGHT + SCREEN_VSYNC_FRONT_PORCH
+=> SCREEN_VSYNC_FRONT_PORCH = ( VT - VPS ) - GDISP_SCREEN_HEIGHT
+ SCREEN_VSYNC_PULSE = VPW
+ SCREEN_VSYNC_BACK_PORCH = VPS - LPS
+ SCREEN_VSYNC_PERIOD = VT
+*/
+
+#define SCREEN_FPS 60ULL
+
+//The following values are for a 4.3" TFT LCD
+
+#define GDISP_SCREEN_WIDTH 480
+#define GDISP_SCREEN_HEIGHT 272
+
+#define SCREEN_HSYNC_BACK_PORCH 2
+#define SCREEN_HSYNC_FRONT_PORCH 2
+#define SCREEN_HSYNC_PULSE 41
+
+#define SCREEN_VSYNC_BACK_PORCH 2
+#define SCREEN_VSYNC_FRONT_PORCH 2
+#define SCREEN_VSYNC_PULSE 10
+
+#define SCREEN_HSYNC_PERIOD (SCREEN_HSYNC_PULSE + SCREEN_HSYNC_BACK_PORCH + GDISP_SCREEN_WIDTH + SCREEN_HSYNC_FRONT_PORCH)
+#define SCREEN_VSYNC_PERIOD (SCREEN_VSYNC_PULSE + SCREEN_VSYNC_BACK_PORCH + GDISP_SCREEN_HEIGHT + SCREEN_VSYNC_FRONT_PORCH)
+
+#define SCREEN_PCLK (SCREEN_HSYNC_PERIOD * SCREEN_VSYNC_PERIOD * SCREEN_FPS)
+#define GDISP_FPR ((SCREEN_PCLK * 1048576)/100000000)
+
+#endif
+/** @} */
diff --git a/drivers/gdisp/RA8875/gdisp_lld_panel_example.h b/drivers/gdisp/RA8875/gdisp_lld_panel_example.h
new file mode 100644
index 00000000..b6c4e4c8
--- /dev/null
+++ b/drivers/gdisp/RA8875/gdisp_lld_panel_example.h
@@ -0,0 +1,74 @@
+/*
+ * This file is subject to the terms of the GFX License, v1.0. If a copy of
+ * the license was not distributed with this file, you can obtain one at:
+ *
+ * http://chibios-gfx.com/license.html
+ */
+
+/**
+ * @file drivers/gdisp/SSD1963/gdisp_lld_panel_example.h
+ * @brief TFT LCD panel properties.
+ *
+ * @addtogroup GDISP
+ * @{
+ */
+
+#ifndef _GDISP_LLD_PANEL_H
+#define _GDISP_LLD_PANEL_H
+
+/* LCD panel specs */
+
+/* The timings need to follow the datasheet for your particular TFT/LCD screen (the actual screen, not the controller)
+*** Datasheets normally use a specific set of timings and acronyms, their value refers to the number of pixel clocks
+** Non-display periods refer to pulses/timings that occur before or after the timings that actually put pixels on the screen
+** Display periods refer to pulses/timings that directly put pixels on the screen
+HDP: Horizontal Display Period, normally the width - 1
+HT: Horizontal Total period (display + non-display)
+HPS: non-display period between the start of the horizontal sync (LLINE) signal and the first display data
+LPS: horizontal sync pulse (LLINE) start location in pixel clocks
+HPW: Horizontal sync Pulse Width
+VDP: Vertical Display period, normally height - 1
+VT: Vertical Total period (display + non-display)
+VPS: non-display period in lines between the start of the frame and the first display data in number of lines
+FPS: vertical sync pulse (LFRAME) start location in lines.
+VPW: Vertical sync Pulse Width
+
+*** Here's how to convert them:
+HPS = SCREEN_HSYNC_PULSE + SCREEN_HSYNC_BACK_PORCH
+HT - HPS = GDISP_SCREEN_WIDTH + SCREEN_HSYNC_FRONT_PORCH
+=> SCREEN_HSYNC_FRONT_PORCH = ( HT - HPS ) - GDISP_SCREEN_WIDTH
+ SCREEN_HSYNC_PULSE = HPW
+ SCREEN_HSYNC_BACK_PORCH = HPS - HPW
+ SCREEN_HSYNC_PERIOD = HT
+
+VPS = SCREEN_VSYNC_PULSE + SCREEN_VSYNC_BACK_PORCH
+VT - VPS = GDISP_SCREEN_HEIGHT + SCREEN_VSYNC_FRONT_PORCH
+=> SCREEN_VSYNC_FRONT_PORCH = ( VT - VPS ) - GDISP_SCREEN_HEIGHT
+ SCREEN_VSYNC_PULSE = VPW
+ SCREEN_VSYNC_BACK_PORCH = VPS - LPS
+ SCREEN_VSYNC_PERIOD = VT
+*/
+
+#define SCREEN_FPS 60ULL
+
+//The following values are for a 4.3" TFT LCD
+
+#define GDISP_SCREEN_WIDTH 480
+#define GDISP_SCREEN_HEIGHT 272
+
+#define SCREEN_HSYNC_BACK_PORCH 2
+#define SCREEN_HSYNC_FRONT_PORCH 2
+#define SCREEN_HSYNC_PULSE 41
+
+#define SCREEN_VSYNC_BACK_PORCH 2
+#define SCREEN_VSYNC_FRONT_PORCH 2
+#define SCREEN_VSYNC_PULSE 10
+
+#define SCREEN_HSYNC_PERIOD (SCREEN_HSYNC_PULSE + SCREEN_HSYNC_BACK_PORCH + GDISP_SCREEN_WIDTH + SCREEN_HSYNC_FRONT_PORCH)
+#define SCREEN_VSYNC_PERIOD (SCREEN_VSYNC_PULSE + SCREEN_VSYNC_BACK_PORCH + GDISP_SCREEN_HEIGHT + SCREEN_VSYNC_FRONT_PORCH)
+
+#define SCREEN_PCLK (SCREEN_HSYNC_PERIOD * SCREEN_VSYNC_PERIOD * SCREEN_FPS)
+#define GDISP_FPR ((SCREEN_PCLK * 1048576)/100000000)
+
+#endif
+/** @} */
diff --git a/drivers/gdisp/RA8875/ra8875.h b/drivers/gdisp/RA8875/ra8875.h
new file mode 100644
index 00000000..7c25cf42
--- /dev/null
+++ b/drivers/gdisp/RA8875/ra8875.h
@@ -0,0 +1,18 @@
+/*
+ * This file is subject to the terms of the GFX License. If a copy of
+ * the license was not distributed with this file, you can obtain one at:
+ *
+ * http://chibios-gfx.com/license.html
+ */
+
+#ifndef RA8875_H
+#define RA8875_H
+
+#define mHIGH(x) (x >> 8)
+#define mLOW(x) (x & 0xFF)
+
+#define RA8875_WRITE_MEMORY_START 0x0002
+#define RA8875_READ_MEMORY_START 0x0002
+
+#endif
+
diff --git a/drivers/gdisp/RA8875/readme.txt b/drivers/gdisp/RA8875/readme.txt
new file mode 100644
index 00000000..ff4222b3
--- /dev/null
+++ b/drivers/gdisp/RA8875/readme.txt
@@ -0,0 +1,38 @@
+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: #define GDISP_NEED_MULTITHREAD TRUE
+ c) One (only) of:
+ #define GDISP_USE_GPIO
+ #define GDISP_USE_FSMC
+ d) If you want to use DMA (only works with FSMC):
+ #define GDISP_USE_DMA
+ #define GDISP_DMA_STREAM STM32_DMA2_STREAM6 //You can change the DMA channel according to your needs
+
+2. Edit gdisp_lld_panel.h with your panel properties
+
+3. To your makefile add the following lines:
+ include $(GFXLIB)/drivers/gdisp/RA8875/gdisp_lld.mk
+
+
+Example FSMC config with DMA:
+
+#define GDISP_SCREEN_WIDTH 480
+#define GDISP_SCREEN_HEIGHT 272
+
+#define GDISP_USE_FSMC
+
+#define GDISP_USE_DMA
+#define GDISP_DMA_STREAM STM32_DMA2_STREAM6
+
+#if defined(GDISP_USE_GPIO)
+
+ #define GDISP_CMD_PORT GPIOC
+ #define GDISP_DATA_PORT GPIOD
+
+ #define GDISP_CS 0
+ #define GDISP_RS 1
+ #define GDISP_WR 2
+ #define GDISP_RD 3
+#endif
diff --git a/drivers/gdisp/S6D1121/readme.txt b/drivers/gdisp/S6D1121/readme.txt
index b76b565f..54bb3091 100644
--- a/drivers/gdisp/S6D1121/readme.txt
+++ b/drivers/gdisp/S6D1121/readme.txt
@@ -1,9 +1,8 @@
To use this driver:
-1. Add in your halconf.h:
+1. Add in your gfxconf.h:
a) #define GFX_USE_GDISP TRUE
b) Any optional high level driver defines (see gdisp.h) eg: GDISP_NEED_MULTITHREAD
2. To your makefile add the following lines:
include $(GFXLIB)/drivers/gdisp/S6D1121/gdisp_lld.mk
-
diff --git a/drivers/gdisp/SSD1289/readme.txt b/drivers/gdisp/SSD1289/readme.txt
index f6b265a7..80d2bdab 100644
--- a/drivers/gdisp/SSD1289/readme.txt
+++ b/drivers/gdisp/SSD1289/readme.txt
@@ -1,6 +1,6 @@
To use this driver:
-1. Add in your halconf.h:
+1. Add in your gfxconf.h:
a) #define GFX_USE_GDISP TRUE
b) Any optional high level driver defines (see gdisp.h) eg: GDISP_NEED_MULTITHREAD
@@ -9,8 +9,8 @@ To use this driver:
and ensure it is on your include path.
Use the gdisp_lld_board_example.h or gdisp_lld_board_fsmc.h file as a basis.
Currently known boards are:
- BOARD_FIREBULL_STM32_F103 - GPIO interface: requires GDISP_CMD_PORT and GDISP_DATA_PORT to be defined
- BOARD_ST_STM32F4_DISCOVERY - FSMC interface
+ BOARD_FIREBULL_STM32_F103 - GPIO interface: requires GDISP_CMD_PORT and GDISP_DATA_PORT to be defined
+ BOARD_ST_STM32F4_DISCOVERY - FSMC interface
d) The following are optional - define them if you are not using the defaults below:
#define GDISP_SCREEN_WIDTH 320
diff --git a/drivers/gdisp/SSD1963/readme.txt b/drivers/gdisp/SSD1963/readme.txt
index 567faf58..f74e9b7f 100644
--- a/drivers/gdisp/SSD1963/readme.txt
+++ b/drivers/gdisp/SSD1963/readme.txt
@@ -1,14 +1,14 @@
To use this driver:
-1. Add in your halconf.h:
+1. Add in your gfxconf.h:
a) #define GFX_USE_GDISP TRUE
b) Any optional high level driver defines (see gdisp.h) eg: #define GDISP_NEED_MULTITHREAD TRUE
c) One (only) of:
#define GDISP_USE_GPIO
#define GDISP_USE_FSMC
- d) If you want to use DMA (only works with FSMC):
- #define GDISP_USE_DMA
- #define GDISP_DMA_STREAM STM32_DMA2_STREAM6 //You can change the DMA channel according to your needs
+ d) If you want to use DMA (only works with FSMC):
+ #define GDISP_USE_DMA
+ #define GDISP_DMA_STREAM STM32_DMA2_STREAM6 //You can change the DMA channel according to your needs
2. Edit gdisp_lld_panel.h with your panel properties
@@ -28,11 +28,11 @@ Example FSMC config with DMA:
#if defined(GDISP_USE_GPIO)
- #define GDISP_CMD_PORT GPIOC
- #define GDISP_DATA_PORT GPIOD
+ #define GDISP_CMD_PORT GPIOC
+ #define GDISP_DATA_PORT GPIOD
- #define GDISP_CS 0
- #define GDISP_RS 1
- #define GDISP_WR 2
- #define GDISP_RD 3
+ #define GDISP_CS 0
+ #define GDISP_RS 1
+ #define GDISP_WR 2
+ #define GDISP_RD 3
#endif
diff --git a/drivers/gdisp/SSD2119/gdisp_lld.c b/drivers/gdisp/SSD2119/gdisp_lld.c
index fe28ca45..b3fa4fd3 100644
--- a/drivers/gdisp/SSD2119/gdisp_lld.c
+++ b/drivers/gdisp/SSD2119/gdisp_lld.c
@@ -240,13 +240,13 @@ bool_t gdisp_lld_init(void) {
write_reg(SSD2119_REG_Y_RAM_ADDR, 0x00);
delay(5);
- // Release the bus
+ // Release the bus
release_bus();
/* Turn on the backlight */
set_backlight(GDISP_INITIAL_BACKLIGHT);
- /* Initialise the GDISP structure */
+ /* Initialise the GDISP structure */
GDISP.Width = GDISP_SCREEN_WIDTH;
GDISP.Height = GDISP_SCREEN_HEIGHT;
GDISP.Orientation = GDISP_ROTATE_0;
@@ -309,14 +309,33 @@ void gdisp_lld_draw_pixel(coord_t x, coord_t y, color_t color) {
* @notapi
*/
void gdisp_lld_clear(color_t color) {
- unsigned i;
+ unsigned area;
+
+ area = GDISP_SCREEN_WIDTH * GDISP_SCREEN_HEIGHT;
acquire_bus();
reset_viewport();
set_cursor(0, 0);
stream_start();
- for(i = 0; i < GDISP_SCREEN_WIDTH * GDISP_SCREEN_HEIGHT; i++)
- write_data(color);
+
+ #if defined(GDISP_USE_FSMC) && defined(GDISP_USE_DMA) && defined(GDISP_DMA_STREAM)
+ uint8_t i;
+ dmaStreamSetPeripheral(GDISP_DMA_STREAM, &color);
+ dmaStreamSetMode(GDISP_DMA_STREAM, STM32_DMA_CR_PL(0) | STM32_DMA_CR_PSIZE_HWORD | STM32_DMA_CR_MSIZE_HWORD | STM32_DMA_CR_DIR_M2M);
+ for (i = area / 65535; i; i--) {
+ dmaStreamSetTransactionSize(GDISP_DMA_STREAM, 65535);
+ dmaStreamEnable(GDISP_DMA_STREAM);
+ dmaWaitCompletion(GDISP_DMA_STREAM);
+ }
+ dmaStreamSetTransactionSize(GDISP_DMA_STREAM, area % 65535);
+ dmaStreamEnable(GDISP_DMA_STREAM);
+ dmaWaitCompletion(GDISP_DMA_STREAM);
+ #else
+ uint32_t index;
+ for(index = 0; index < area; index++)
+ write_data(color);
+ #endif // defined(GDISP_USE_FSMC) && defined(GDISP_USE_DMA) && defined(GDISP_DMA_STREAM)
+
stream_stop();
release_bus();
}
@@ -334,7 +353,7 @@ void gdisp_lld_draw_pixel(coord_t x, coord_t y, color_t color) {
* @notapi
*/
void gdisp_lld_fill_area(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color) {
- unsigned i, area;
+ unsigned area;
#if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP
if (x < GDISP.clipx0) { cx -= GDISP.clipx0 - x; x = GDISP.clipx0; }
@@ -349,8 +368,25 @@ void gdisp_lld_draw_pixel(coord_t x, coord_t y, color_t color) {
acquire_bus();
set_viewport(x, y, cx, cy);
stream_start();
- for(i = 0; i < area; i++)
- write_data(color);
+
+ #if defined(GDISP_USE_FSMC) && defined(GDISP_USE_DMA) && defined(GDISP_DMA_STREAM)
+ uint8_t i;
+ dmaStreamSetPeripheral(GDISP_DMA_STREAM, &color);
+ dmaStreamSetMode(GDISP_DMA_STREAM, STM32_DMA_CR_PL(0) | STM32_DMA_CR_PSIZE_HWORD | STM32_DMA_CR_MSIZE_HWORD | STM32_DMA_CR_DIR_M2M);
+ for (i = area / 65535; i; i--) {
+ dmaStreamSetTransactionSize(GDISP_DMA_STREAM, 65535);
+ dmaStreamEnable(GDISP_DMA_STREAM);
+ dmaWaitCompletion(GDISP_DMA_STREAM);
+ }
+ dmaStreamSetTransactionSize(GDISP_DMA_STREAM, area % 65535);
+ dmaStreamEnable(GDISP_DMA_STREAM);
+ dmaWaitCompletion(GDISP_DMA_STREAM);
+ #else
+ uint32_t index;
+ for(index = 0; index < area; index++)
+ write_data(color);
+ #endif // defined(GDISP_USE_FSMC) && defined(GDISP_USE_DMA) && defined(GDISP_DMA_STREAM)
+
stream_stop();
release_bus();
}
@@ -370,8 +406,6 @@ void gdisp_lld_draw_pixel(coord_t x, coord_t y, color_t color) {
* @notapi
*/
void gdisp_lld_blit_area_ex(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; }
@@ -382,17 +416,36 @@ void gdisp_lld_draw_pixel(coord_t x, coord_t y, color_t color) {
if (y+cy > GDISP.clipy1) cy = GDISP.clipy1 - y;
#endif
+ buffer += srcx + srcy * srccx;
+
acquire_bus();
set_viewport(x, y, cx, cy);
stream_start();
- 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++)
- write_data(*buffer++);
+ #if defined(GDISP_USE_FSMC) && defined(GDISP_USE_DMA) && defined(GDISP_DMA_STREAM)
+ uint32_t area = cx * cy;
+ uint8_t i;
+ dmaStreamSetPeripheral(GDISP_DMA_STREAM, buffer);
+ dmaStreamSetMode(GDISP_DMA_STREAM, STM32_DMA_CR_PL(0) | STM32_DMA_CR_PINC | STM32_DMA_CR_PSIZE_HWORD | STM32_DMA_CR_MSIZE_HWORD | STM32_DMA_CR_DIR_M2M);
+ for (i = area / 65535; i; i--) {
+ dmaStreamSetTransactionSize(GDISP_DMA_STREAM, 65535);
+ dmaStreamEnable(GDISP_DMA_STREAM);
+ dmaWaitCompletion(GDISP_DMA_STREAM);
+ }
+ dmaStreamSetTransactionSize(GDISP_DMA_STREAM, area % 65535);
+ dmaStreamEnable(GDISP_DMA_STREAM);
+ dmaWaitCompletion(GDISP_DMA_STREAM);
+ #else
+ coord_t endx, endy;
+ uint32_t lg;
+ endx = srcx + cx;
+ endy = y + cy;
+ lg = srccx - cx;
+ for(; y < endy; y++, buffer += lg)
+ for(x=srcx; x < endx; x++)
+ write_data(*buffer++);
+ #endif // defined(GDISP_USE_FSMC) && defined(GDISP_USE_DMA) && defined(GDISP_DMA_STREAM)
+
stream_stop();
release_bus();
}
@@ -418,8 +471,10 @@ void gdisp_lld_draw_pixel(coord_t x, coord_t y, color_t color) {
acquire_bus();
set_cursor(x, y);
stream_start();
- color = read_data(); // dummy read
+
+ color = read_data(); // dummy read
color = read_data();
+
stream_stop();
release_bus();
@@ -450,8 +505,8 @@ void gdisp_lld_draw_pixel(coord_t x, coord_t y, color_t color) {
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;
+ if (x+cx > GDISP.clipx1) cx = GDISP.clipx1 - x;
+ if (y+cy > GDISP.clipy1) cy = GDISP.clipy1 - y;
#endif
abslines = lines < 0 ? -lines : lines;
@@ -474,9 +529,11 @@ void gdisp_lld_draw_pixel(coord_t x, coord_t y, color_t color) {
/* read row0 into the buffer and then write at row1*/
set_viewport(x, row0, cx, 1);
stream_start();
- j = read_data(); // dummy read
+
+ j = read_data(); // dummy read
for (j = 0; (coord_t)j < cx; j++)
buf[j] = read_data();
+
stream_stop();
set_viewport(x, row1, cx, 1);
diff --git a/drivers/gdisp/SSD2119/gdisp_lld_board_embest_dmstf4bb.h b/drivers/gdisp/SSD2119/gdisp_lld_board_embest_dmstf4bb.h
index ccbba2a3..068af149 100644
--- a/drivers/gdisp/SSD2119/gdisp_lld_board_embest_dmstf4bb.h
+++ b/drivers/gdisp/SSD2119/gdisp_lld_board_embest_dmstf4bb.h
@@ -16,38 +16,67 @@
#ifndef _GDISP_LLD_BOARD_H
#define _GDISP_LLD_BOARD_H
+/* This board file uses only FSMC, so don't undefine this. */
+#define GDISP_USE_FSMC
+/* But it is OK to disable DMA use. */
+#define GDISP_USE_DMA
+#define GDISP_DMA_STREAM STM32_DMA2_STREAM6
+
/* Using FSMC A19 (PE3) as DC */
-#define GDISP_REG (*((volatile uint16_t *) 0x60000000)) /* DC = 0 */
-#define GDISP_RAM (*((volatile uint16_t *) 0x60100000)) /* DC = 1 */
+#define GDISP_REG (*((volatile uint16_t *) 0x60000000)) /* DC = 0 */
+#define GDISP_RAM (*((volatile uint16_t *) 0x60100000)) /* DC = 1 */
-#define SET_RST palSetPad(GPIOD, 3);
-#define CLR_RST palClearPad(GPIOD, 3);
+#define SET_RST palSetPad(GPIOD, 3);
+#define CLR_RST palClearPad(GPIOD, 3);
-/* PWM configuration structure. We use timer 4 channel 2 (orange LED on board). */
+/*
+ * PWM configuration structure. We use timer 4 channel 2 (orange LED on board).
+ * The reason for so high clock is that with any lower, onboard coil is squeaking.
+ * The major disadvantage of this clock is a lack of linearity between PWM duty
+ * cycle width and brightness. In fact only with low preset one sees any change
+ * (eg. duty cycle between 1-20). Feel free to adjust this, maybe only my board
+ * behaves like this. According to the G5126 datesheet (backlight LED driver)
+ * the PWM frequency should be somewhere between 200 Hz to 200 kHz.
+ */
static const PWMConfig pwmcfg = {
- 1000000, /* 1 MHz PWM clock frequency. */
- 100, /* PWM period is 100 cycles. */
- NULL,
- {
- {PWM_OUTPUT_ACTIVE_HIGH, NULL},
- {PWM_OUTPUT_ACTIVE_HIGH, NULL},
- {PWM_OUTPUT_ACTIVE_HIGH, NULL},
- {PWM_OUTPUT_ACTIVE_HIGH, NULL}
- },
- 0
+ 1000000, /* 1 MHz PWM clock frequency. */
+ 100, /* PWM period is 100 cycles. */
+ NULL,
+ {
+ {PWM_OUTPUT_ACTIVE_HIGH, NULL},
+ {PWM_OUTPUT_ACTIVE_HIGH, NULL},
+ {PWM_OUTPUT_ACTIVE_HIGH, NULL},
+ {PWM_OUTPUT_ACTIVE_HIGH, NULL}
+ },
+ 0
};
/**
* @brief Initialise the board for the display.
- * @notes This board definition uses GPIO and assumes exclusive access to these GPIO pins
+ * @notes This board definition uses GPIO and assumes exclusive access to these GPIO pins
*
* @notapi
*/
static inline void init_board(void) {
unsigned char FSMC_Bank;
- /* STM32F4 FSMC init */
- rccEnableAHB3(RCC_AHB3ENR_FSMCEN, 0);
+ #ifndef GDISP_USE_FSMC
+ #error "This board uses only FSMC, please define GDISP_USE_FSMC"
+ #endif
+
+ #if defined(STM32F4XX) || defined(STM32F2XX)
+ /* STM32F4 FSMC init */
+ rccEnableAHB3(RCC_AHB3ENR_FSMCEN, 0);
+
+ #if defined(GDISP_USE_DMA) && defined(GDISP_DMA_STREAM)
+ if (dmaStreamAllocate(GDISP_DMA_STREAM, 0, NULL, NULL))
+ gfxExit();
+ dmaStreamSetMemory0(GDISP_DMA_STREAM, &GDISP_RAM);
+ dmaStreamSetMode(GDISP_DMA_STREAM, STM32_DMA_CR_PL(0) | STM32_DMA_CR_PSIZE_HWORD | STM32_DMA_CR_MSIZE_HWORD | STM32_DMA_CR_DIR_M2M);
+ #endif
+ #else
+ #error "FSMC not implemented for this device"
+ #endif
/* Group pins */
IOBus busD = {GPIOD, (1 << 0) | (1 << 1) | (1 << 4) | (1 << 5) | (1 << 7) | (1 << 8) |
@@ -61,15 +90,14 @@ static inline void init_board(void) {
palSetBusMode(&busE, PAL_MODE_ALTERNATE(12));
FSMC_Bank = 0;
-
- /* FSMC timing */
- FSMC_Bank1->BTCR[FSMC_Bank+1] = (FSMC_BTR1_ADDSET_1 | FSMC_BTR1_ADDSET_3) \
- | (FSMC_BTR1_DATAST_1 | FSMC_BTR1_DATAST_3) \
- | (FSMC_BTR1_BUSTURN_1 | FSMC_BTR1_BUSTURN_3) ;
-
- /* 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;
+ /* FSMC timing register configuration */
+ FSMC_Bank1->BTCR[FSMC_Bank + 1] = (FSMC_BTR1_ADDSET_2 | FSMC_BTR1_ADDSET_1) \
+ | (FSMC_BTR1_DATAST_2 | FSMC_BTR1_DATAST_1) \
+ | FSMC_BTR1_BUSTURN_0;
+
+ /* Bank1 NOR/PSRAM control register configuration
+ * Write enable, memory databus width set to 16 bit, memory bank enable */
+ FSMC_Bank1->BTCR[FSMC_Bank] = FSMC_BCR1_WREN | FSMC_BCR1_MWID_0 | FSMC_BCR1_MBKEN;
/* Display backlight control */
/* TIM4 is an alternate function 2 (AF2) */
diff --git a/drivers/gdisp/SSD2119/readme.txt b/drivers/gdisp/SSD2119/readme.txt
index 371df813..23d82eb7 100644
--- a/drivers/gdisp/SSD2119/readme.txt
+++ b/drivers/gdisp/SSD2119/readme.txt
@@ -4,17 +4,20 @@ Driver for LCD with 16-bit 8080 interface (65k colors).
To use this driver:
-1. Add in your halconf.h:
+1. Add in your gfxconf.h:
a) #define GFX_USE_GDISP TRUE
b) Any optional high level driver defines (see gdisp.h) eg: GDISP_NEED_MULTITHREAD
c) 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_embest_dmstf4bb_fsmc.h file as a basis.
+ and ensure it is on your include path. Use the gdisp_lld_board_embest_dmstf4bb.h
+ file as a basis.
Currently known boards are:
- BOARD_EMBEST_DMSTF4BB_FSMC - FSMC interface
- Board configuration assume that you have STM32_PWM_USE_TIM4 set to TRUE in your mcuconf.h.
+ BOARD_EMBEST_DMSTF4BB - FSMC interface
+ This board configuration assumes that you have PWM driver enabled
+ and STM32_PWM_USE_TIM4 set to TRUE in your mcuconf.h.
+ If you use FSMC, define in your board file GDISP_USE_FSMC. If you use DMA,
+ define GDISP_USE_DMA.
d) The following are optional - define them if you are not using the defaults below:
#define GDISP_SCREEN_WIDTH 320
diff --git a/drivers/gdisp/TestStub/readme.txt b/drivers/gdisp/TestStub/readme.txt
index 11145290..ddd7d38e 100644
--- a/drivers/gdisp/TestStub/readme.txt
+++ b/drivers/gdisp/TestStub/readme.txt
@@ -7,7 +7,7 @@ Do not use this driver as a template for new drivers. Use the
To use this driver:
-1. Add in your halconf.h:
+1. Add in your gfxconf.h:
a) #define GFX_USE_GDISP TRUE
b) Any optional high level driver defines (see gdisp.h)
you want to compile test eg: GDISP_NEED_MULTITHREAD
diff --git a/drivers/ginput/dial/GADC/readme.txt b/drivers/ginput/dial/GADC/readme.txt
index 5c303870..25558dbc 100644
--- a/drivers/ginput/dial/GADC/readme.txt
+++ b/drivers/ginput/dial/GADC/readme.txt
@@ -1,6 +1,6 @@
To use this driver:
-1. Add in your halconf.h:
+1. Add in your gfxconf.h:
a) #define GFX_USE_GINPUT TRUE
#define GINPUT_NEED_DIAL TRUE
#define GINPUT_NEED_GADC TRUE
@@ -8,9 +8,8 @@ To use this driver:
and ensure it is on your include path.
Use the ginput_lld_dial_board_example.h file as a basis.
Currently known boards are:
- Olimex SAM7-EX256
+ Olimex SAM7-EX256
2. To your makefile add the following lines:
include $(GFXLIB)/drivers/ginput/dial/GADC/ginput_lld.mk
include $(GFXLIB)/drivers/gadc/yourGADCdriver/gadc_lld.mk
- \ No newline at end of file
diff --git a/drivers/ginput/toggle/Pal/readme.txt b/drivers/ginput/toggle/Pal/readme.txt
index e6976f7d..35d2ee47 100644
--- a/drivers/ginput/toggle/Pal/readme.txt
+++ b/drivers/ginput/toggle/Pal/readme.txt
@@ -1,13 +1,13 @@
To use this driver:
-1. Add in your halconf.h:
+1. Add in your gfxconf.h:
a) #define GFX_USE_GINPUT TRUE
#define GINPUT_NEED_TOGGLE TRUE
d) If you are not using a known board then create a ginput_lld_toggle_board.h file
and ensure it is on your include path.
Use the ginput_lld_toggle_board_example.h file as a basis.
Currently known boards are:
- Olimex SAM7-EX256
+ Olimex SAM7-EX256
2. To your makefile add the following lines:
include $(GFXLIB)/drivers/ginput/togglePal/ginput_lld.mk
diff --git a/drivers/ginput/touch/ADS7843/readme.txt b/drivers/ginput/touch/ADS7843/readme.txt
index 852a1ea0..abc4b0e9 100644
--- a/drivers/ginput/touch/ADS7843/readme.txt
+++ b/drivers/ginput/touch/ADS7843/readme.txt
@@ -1,9 +1,8 @@
To use this driver:
-1. Add in your halconf.h:
+1. Add in your gfxconf.h:
a) #define GFX_USE_GINPUT TRUE
b) #define GINPUT_NEED_MOUSE TRUE
2. To your makefile add the following lines:
include $(GFXLIB)/drivers/ginput/touch/ADS7843/ginput_lld.mk
-
diff --git a/drivers/ginput/touch/FT5x06/ft5x06.h b/drivers/ginput/touch/FT5x06/ft5x06.h
new file mode 100644
index 00000000..e0d212ce
--- /dev/null
+++ b/drivers/ginput/touch/FT5x06/ft5x06.h
@@ -0,0 +1,82 @@
+/*
+ * This file is subject to the terms of the GFX License. If a copy of
+ * the license was not distributed with this file, you can obtain one at:
+ *
+ * http://chibios-gfx.com/license.html
+ */
+
+/**
+ * @file drivers/ginput/touch/FT5x06/ft5x05.h
+ * @brief Register definition header for the STMPE811 touch controller.
+ *
+ * @addtogroup GINPUT
+ * @{
+ */
+
+#ifndef _FT5x06_H
+#define _FT5x06_H
+
+// Slave address
+#define FT5x06_ADDR (0x70 >> 1)
+
+// Maximum timeout
+#define FT5x06_TIMEOUT 0x3000
+
+#define FT5x06_DEVICE_MODE 0x00
+#define FT5x06_GESTURE_ID 0x01
+#define FT5x06_TOUCH_POINTS 0x02
+
+#define FT5x06_TOUCH1_EV_FLAG 0x03
+#define FT5x06_TOUCH1_XH 0x03
+#define FT5x06_TOUCH1_XL 0x04
+#define FT5x06_TOUCH1_YH 0x05
+#define FT5x06_TOUCH1_YL 0x06
+
+#define FT5x06_TOUCH2_EV_FLAG 0x09
+#define FT5x06_TOUCH2_XH 0x09
+#define FT5x06_TOUCH2_XL 0x0A
+#define FT5x06_TOUCH2_YH 0x0B
+#define FT5x06_TOUCH2_YL 0x0C
+
+#define FT5x06_TOUCH3_EV_FLAG 0x0F
+#define FT5x06_TOUCH3_XH 0x0F
+#define FT5x06_TOUCH3_XL 0x10
+#define FT5x06_TOUCH3_YH 0x11
+#define FT5x06_TOUCH3_YL 0x12
+
+#define FT5x06_TOUCH4_EV_FLAG 0x15
+#define FT5x06_TOUCH4_XH 0x15
+#define FT5x06_TOUCH4_XL 0x16
+#define FT5x06_TOUCH4_YH 0x17
+#define FT5x06_TOUCH4_YL 0x18
+
+#define FT5x06_TOUCH5_EV_FLAG 0x1B
+#define FT5x06_TOUCH5_XH 0x1B
+#define FT5x06_TOUCH5_XL 0x1C
+#define FT5x06_TOUCH5_YH 0x1D
+#define FT5x06_TOUCH5_YL 0x1E
+
+#define FT5x06_ID_G_THGROUP 0x80
+#define FT5x06_ID_G_THPEAK 0x81
+#define FT5x06_ID_G_THCAL 0x82
+#define FT5x06_ID_G_THWATER 0x83
+#define FT5x06_ID_G_THTEMP 0x84
+#define FT5x06_ID_G_THDIFF 0x85
+#define FT5x06_ID_G_CTRL 0x86
+#define FT5x06_ID_G_TIME_ENTER_MONITOR 0x87
+#define FT5x06_ID_G_PERIODACTIVE 0x88
+#define FT5x06_ID_G_PERIODMONITOR 0x89
+#define FT5x06_ID_G_AUTO_CLB_MODE 0xA0
+#define FT5x06_ID_G_LIB_VERSION_H 0xA1
+#define FT5x06_ID_G_LIB_VERSION_L 0xA2
+#define FT5x06_ID_G_CIPHER 0xA3
+#define FT5x06_ID_G_MODE 0xA4
+#define FT5x06_ID_G_PMODE 0xA5
+#define FT5x06_ID_G_FIRMID 0xA6
+#define FT5x06_ID_G_STATE 0xA7
+#define FT5x06_ID_G_FT5201ID 0xA8
+#define FT5x06_ID_G_ERR 0xA9
+
+#endif /* _FT5x06_H */
+/** @} */
+
diff --git a/drivers/ginput/touch/FT5x06/ginput_lld.mk b/drivers/ginput/touch/FT5x06/ginput_lld.mk
new file mode 100644
index 00000000..17d38c61
--- /dev/null
+++ b/drivers/ginput/touch/FT5x06/ginput_lld.mk
@@ -0,0 +1,5 @@
+# List the required driver.
+GFXSRC += $(GFXLIB)/drivers/ginput/touch/FT5x06/ginput_lld_mouse.c
+
+# Required include directories
+GFXINC += $(GFXLIB)/drivers/ginput/touch/FT5x06
diff --git a/drivers/ginput/touch/FT5x06/ginput_lld_mouse.c b/drivers/ginput/touch/FT5x06/ginput_lld_mouse.c
new file mode 100644
index 00000000..fd62e1e0
--- /dev/null
+++ b/drivers/ginput/touch/FT5x06/ginput_lld_mouse.c
@@ -0,0 +1,120 @@
+/*
+ * This file is subject to the terms of the GFX License. If a copy of
+ * the license was not distributed with this file, you can obtain one at:
+ *
+ * http://chibios-gfx.com/license.html
+ */
+
+/**
+ * @file drivers/ginput/touch/STMPE811/ginput_lld_mouse.c
+ * @brief GINPUT Touch low level driver source for the STMPE811.
+ *
+ * @defgroup Mouse Mouse
+ * @ingroup GINPUT
+ * @{
+ */
+
+#include "ch.h"
+#include "hal.h"
+#include "gfx.h"
+
+#include "ft5x06.h"
+
+#if (GFX_USE_GINPUT && GINPUT_NEED_MOUSE) /*|| defined(__DOXYGEN__)*/
+
+#include "ginput/lld/mouse.h"
+
+// include board abstraction
+#include "ginput_lld_mouse_board.h"
+
+static coord_t x, y, z;
+static uint8_t touched;
+
+/**
+ * @brief Initialise the mouse/touch.
+ *
+ * @notapi
+ */
+void ginput_lld_mouse_init(void) {
+ init_board();
+
+ // Init default values. (From NHD-3.5-320240MF-ATXL-CTP-1 datasheet)
+ // Valid touching detect threshold
+ write_reg(FT5x06_ID_G_THGROUP, 1, 0x16);
+
+ // valid touching peak detect threshold
+ write_reg(FT5x06_ID_G_THPEAK, 1, 0x3C);
+
+ // Touch focus threshold
+ write_reg(FT5x06_ID_G_THCAL, 1, 0xE9);
+
+ // threshold when there is surface water
+ write_reg(FT5x06_ID_G_THWATER, 1, 0x01);
+
+ // threshold of temperature compensation
+ write_reg(FT5x06_ID_G_THTEMP, 1, 0x01);
+
+ // Touch difference threshold
+ write_reg(FT5x06_ID_G_THDIFF, 1, 0xA0);
+
+ // Delay to enter 'Monitor' status (s)
+ write_reg(FT5x06_ID_G_TIME_ENTER_MONITOR, 1, 0x0A);
+
+ // Period of 'Active' status (ms)
+ write_reg(FT5x06_ID_G_PERIODACTIVE, 1, 0x06);
+
+ // Timer to enter ÔidleÕ when in 'Monitor' (ms)
+ write_reg(FT5x06_ID_G_PERIODMONITOR, 1, 0x28);
+}
+
+/**
+ * @brief Read the mouse/touch position.
+ *
+ * @param[in] pt A pointer to the structure to fill
+ *
+ * @note For drivers that don't support returning a position
+ * when the touch is up (most touch devices), it should
+ * return the previous position with the new Z value.
+ * The z value is the pressure for those touch devices
+ * that support it (-100 to 100 where > 0 is touched)
+ * or, 0 or 100 for those drivers that don't.
+ *
+ * @notapi
+ */
+void ginput_lld_mouse_get_reading(MouseReading *pt) {
+ // Poll to get the touched status
+ uint8_t last_touched;
+
+ last_touched = touched;
+ touched = (uint8_t)read_reg(FT5x06_TOUCH_POINTS, 1) & 0x07;
+
+ // If not touched, return the previous results
+ if (touched == 0) {
+ pt->x = x;
+ pt->y = y;
+ pt->z = 0;
+ pt->buttons = 0;
+ return;
+ }
+
+ /* Get the X, Y, Z values */
+ x = (coord_t)(read_reg(FT5x06_TOUCH1_XH, 2) & 0x0fff);
+ y = (coord_t)read_reg(FT5x06_TOUCH1_YH, 2);
+ z = 100;
+
+ // Rescale X,Y,Z - X & Y don't need scaling when you are using calibration!
+#if !GINPUT_MOUSE_NEED_CALIBRATION
+ x = gdispGetWidth() - x / (4096/gdispGetWidth());
+ y = y / (4096/gdispGetHeight());
+#endif
+
+ // Return the results. ADC gives values from 0 to 2^12 (4096)
+ pt->x = x;
+ pt->y = y;
+ pt->z = z;
+ pt->buttons = GINPUT_TOUCH_PRESSED;
+}
+
+#endif /* GFX_USE_GINPUT && GINPUT_NEED_MOUSE */
+/** @} */
+
diff --git a/drivers/ginput/touch/FT5x06/ginput_lld_mouse_board.h b/drivers/ginput/touch/FT5x06/ginput_lld_mouse_board.h
new file mode 100644
index 00000000..f8381b65
--- /dev/null
+++ b/drivers/ginput/touch/FT5x06/ginput_lld_mouse_board.h
@@ -0,0 +1,111 @@
+/*
+ * This file is subject to the terms of the GFX License. If a copy of
+ * the license was not distributed with this file, you can obtain one at:
+ *
+ * http://chibios-gfx.com/license.html
+ */
+
+/**
+ * @file drivers/ginput/touch/FT5x06/ginput_lld_mouse_board_.h
+ * @brief GINPUT Touch low level driver source for the FT5x06.
+ *
+ * @defgroup Mouse Mouse
+ * @ingroup GINPUT
+ * @{
+ */
+
+#ifndef _GINPUT_LLD_MOUSE_BOARD_H
+#define _GINPUT_LLD_MOUSE_BOARD_H
+
+/* I2C interface #2 - Touchscreen controller */
+static const I2CConfig i2ccfg2 = {
+ OPMODE_I2C,
+ 400000,
+ FAST_DUTY_CYCLE_2,
+};
+
+/**
+ * @brief Initialise the board for the touch.
+ *
+ * @notapi
+ */
+static void init_board(void) {
+ i2cStart(&I2CD2, &i2ccfg2);
+}
+
+
+/**
+ * @brief Write a value into a certain register
+ *
+ * @param[in] reg The register address
+ * @param[in] n The amount of bytes (one or two)
+ * @param[in] val The value
+ *
+ * @notapi
+ */
+static void write_reg(uint8_t reg, uint8_t n, uint16_t val) {
+ uint8_t txbuf[3];
+
+ i2cAcquireBus(&I2CD2);
+
+ txbuf[0] = reg;
+
+ if (n == 1) {
+ txbuf[1] = val;
+ i2cMasterTransmitTimeout(&I2CD2, FT5x06_ADDR, txbuf, 2, NULL, 0, MS2ST(FT5x06_TIMEOUT));
+ } else if (n == 2) {
+ txbuf[1] = ((val & 0xFF00) >> 8);
+ txbuf[2] = (val & 0x00FF);
+ i2cMasterTransmitTimeout(&I2CD2, FT5x06_ADDR, txbuf, 3, NULL, 0, MS2ST(FT5x06_TIMEOUT));
+ }
+
+ i2cReleaseBus(&I2CD2);
+}
+
+/**
+ * @brief Read the value of a certain register
+ *
+ * @param[in] reg The register address
+ * @param[in] n The amount of bytes (one or two)
+ *
+ * @return Data read from device (one byte or two depending on n param)
+ *
+ * @notapi
+ */
+static uint16_t read_reg(uint8_t reg, uint8_t n) {
+ uint8_t txbuf[1], rxbuf[2];
+ uint16_t ret;
+
+ rxbuf[0] = 0;
+ rxbuf[1] = 0;
+
+ i2cAcquireBus(&I2CD2);
+
+ txbuf[0] = reg;
+ i2cMasterTransmitTimeout(&I2CD2, FT5x06_ADDR, txbuf, 1, rxbuf, n, MS2ST(FT5x06_TIMEOUT));
+
+ if (n == 1) {
+ ret = rxbuf[0];
+ } else if (n == 2) {
+ ret = ((rxbuf[0] << 8) | (rxbuf[1] & 0xFF));
+ }
+
+ i2cReleaseBus(&I2CD2);
+
+ return ret;
+}
+
+static void read_reg_n(uint8_t reg, uint8_t n, uint8_t *rxbuf) {
+ uint8_t txbuf[1];
+
+ i2cAcquireBus(&I2CD2);
+
+ txbuf[0] = reg;
+ i2cMasterTransmitTimeout(&I2CD2, FT5x06_ADDR, txbuf, 1, rxbuf, n, MS2ST(FT5x06_TIMEOUT));
+
+ i2cReleaseBus(&I2CD2);
+}
+
+#endif /* _GINPUT_LLD_MOUSE_BOARD_H */
+/** @} */
+
diff --git a/drivers/ginput/touch/FT5x06/ginput_lld_mouse_board_example.h b/drivers/ginput/touch/FT5x06/ginput_lld_mouse_board_example.h
new file mode 100644
index 00000000..19e824e5
--- /dev/null
+++ b/drivers/ginput/touch/FT5x06/ginput_lld_mouse_board_example.h
@@ -0,0 +1,72 @@
+/*
+ * This file is subject to the terms of the GFX License. If a copy of
+ * the license was not distributed with this file, you can obtain one at:
+ *
+ * http://chibios-gfx.com/license.html
+ */
+
+/**
+ * @file drivers/ginput/touch/FT5x06/ginput_lld_mouse_board_example.h
+ * @brief GINPUT Touch low level driver source for the FT5x06 on the example board.
+ *
+ * @defgroup Mouse Mouse
+ * @ingroup GINPUT
+ * @{
+ */
+
+#ifndef _GINPUT_LLD_MOUSE_BOARD_H
+#define _GINPUT_LLD_MOUSE_BOARD_H
+
+/**
+ * @brief Initialise the board for the touch.
+ *
+ * @notapi
+ */
+static void init_board(void) {
+ /* Code here */
+ #error "ginputFT5x06: You must supply a definition for init_board for your board"
+}
+
+/**
+ * @brief Check whether an interrupt is raised
+ * @return TRUE if there is an interrupt signal present
+ *
+ * @notapi
+ */
+static inline bool_t getpin_irq(void) {
+ /* Code here */
+ #error "ginputFT5x06: You must supply a definition for getpin_irq for your board"
+}
+
+/**
+ * @brief Write a value into a certain register
+ *
+ * @param[in] reg The register address
+ * @param[in] n The amount of bytes (one or two)
+ * @param[in] val The value
+ *
+ * @notapi
+ */
+static void write_reg(uint8_t reg, uint8_t n, uint16_t val) {
+ /* Code here */
+ #error "ginputFT5x06: You must supply a definition for write_reg for your board"
+}
+
+/**
+ * @brief Read the value of a certain register
+ *
+ * @param[in] reg The register address
+ * @param[in] n The amount of bytes (one or two)
+ *
+ * @return Data read from device (one byte or two depending on n param)
+ *
+ * @notapi
+ */
+static uint16_t read_reg(uint8_t reg, uint8_t n) {
+ /* Code here */
+ #error "ginputFT5x06: You must supply a definition for read_reg for your board"
+}
+
+#endif /* _GINPUT_LLD_MOUSE_BOARD_H */
+/** @} */
+
diff --git a/drivers/ginput/touch/FT5x06/ginput_lld_mouse_config.h b/drivers/ginput/touch/FT5x06/ginput_lld_mouse_config.h
new file mode 100644
index 00000000..c990e921
--- /dev/null
+++ b/drivers/ginput/touch/FT5x06/ginput_lld_mouse_config.h
@@ -0,0 +1,32 @@
+/*
+ * This file is subject to the terms of the GFX License. If a copy of
+ * the license was not distributed with this file, you can obtain one at:
+ *
+ * http://chibios-gfx.com/license.html
+ */
+
+/**
+ * @file drivers/ginput/touch/STMPE811/ginput_lld_mouse_config.h
+ * @brief GINPUT LLD header file for mouse/touch driver.
+ *
+ * @defgroup Mouse Mouse
+ * @ingroup GINPUT
+ *
+ * @{
+ */
+
+#ifndef _LLD_GINPUT_MOUSE_CONFIG_H
+#define _LLD_GINPUT_MOUSE_CONFIG_H
+
+#define GINPUT_MOUSE_EVENT_TYPE GEVENT_TOUCH
+#define GINPUT_MOUSE_NEED_CALIBRATION TRUE
+#define GINPUT_MOUSE_LLD_CALIBRATION_LOADSAVE FALSE
+#define GINPUT_MOUSE_MAX_CALIBRATION_ERROR 15
+#define GINPUT_MOUSE_READ_CYCLES 1
+#define GINPUT_MOUSE_POLL_PERIOD 25
+#define GINPUT_MOUSE_MAX_CLICK_JITTER 10
+#define GINPUT_MOUSE_MAX_MOVE_JITTER 5
+#define GINPUT_MOUSE_CLICK_TIME 450
+
+#endif /* _LLD_GINPUT_MOUSE_CONFIG_H */
+/** @} */
diff --git a/drivers/ginput/touch/FT5x06/readme.txt b/drivers/ginput/touch/FT5x06/readme.txt
new file mode 100644
index 00000000..ec3ae757
--- /dev/null
+++ b/drivers/ginput/touch/FT5x06/readme.txt
@@ -0,0 +1,8 @@
+To use this driver:
+
+1. Add in your gfxconf.h:
+ a) #define GFX_USE_GINPUT TRUE
+ b) #define GINPUT_NEED_MOUSE TRUE
+
+2. To your makefile add the following lines:
+ include $(GFXLIB)/drivers/ginput/touch/FT5x06/ginput_lld.mk
diff --git a/drivers/ginput/touch/MCU/readme.txt b/drivers/ginput/touch/MCU/readme.txt
index 4dbe5543..c7bb90f8 100644
--- a/drivers/ginput/touch/MCU/readme.txt
+++ b/drivers/ginput/touch/MCU/readme.txt
@@ -1,9 +1,8 @@
To use this driver:
-1. Add in your halconf.h:
+1. Add in your gfxconf.h:
a) #define GFX_USE_GINPUT TRUE
b) #define GINPUT_NEED_MOUSE TRUE
2. To your makefile add the following lines:
include $(GFXLIB)/drivers/ginput/touch/MCU/ginput_lld.mk
-
diff --git a/drivers/multiple/Win32/readme.txt b/drivers/multiple/Win32/readme.txt
index 6151f2f2..7ff8546c 100644
--- a/drivers/multiple/Win32/readme.txt
+++ b/drivers/multiple/Win32/readme.txt
@@ -3,7 +3,7 @@ To use this driver:
This driver is special in that it implements both the gdisp low level driver
and a touchscreen driver.
-1. Add in your halconf.h:
+1. Add in your gfxconf.h:
a) #define GFX_USE_GDISP TRUE
b) #define GFX_USE_GINPUT TRUE
#define GINPUT_USE_MOUSE TRUE
@@ -19,4 +19,3 @@ and a touchscreen driver.
3. Modify your makefile to add -lgdi32 to the DLIBS line. i.e.
DLIBS = -lws2_32 -lgdi32
-
diff --git a/include/gdisp/gdisp.h b/include/gdisp/gdisp.h
index f7208b00..4ba72580 100644
--- a/include/gdisp/gdisp.h
+++ b/include/gdisp/gdisp.h
@@ -522,7 +522,7 @@ extern "C" {
#if GDISP_NEED_SCROLL || defined(__DOXYGEN__)
/**
* @brief Scroll vertically a section of the screen.
- * @pre GDISP_NEED_SCROLL must be set to TRUE in halconf.h
+ * @pre GDISP_NEED_SCROLL must be set to TRUE in gfxconf.h
* @note Optional.
* @note If lines is >= cy, it is equivelent to a area fill with bgcolor.
*
diff --git a/license.html b/license.html
index 67bac607..4aee4953 100644
--- a/license.html
+++ b/license.html
@@ -109,7 +109,7 @@
<ol type="a">
<li><p>All distribution of the Works in Source Code Form, including any Modifications that You create or to which You contribute, must be under the terms of this License; and</p></li>
<li><p>You must inform recipients that the Source Code Form of the Works is governed by the terms of this License, and how they can obtain a copy of this License. You may not attempt to alter the recipients rights in the Source Code Form; and</p></li>
-<li><p>Any modification to the Works must be contributed to the License Owners as per Section 4 prior to distribution; and</p></li>
+<li><p>Any modification to the Works must be contributed to the License Owners, as per Section 4, prior to distribution with the exception of a working public source control repository. In this situation, modifications of the Works must be contributed to the License Owners within one calendar month; and</p></li>
<li><p>source code not forming part of the Works that are distributed in conjunction with the Works do not need to be contributed to the License Owners or use this License.</p></li>
</ol>
<i><p>Note: This means that you must contribute changes you make to the library, you do not need to contribute your application or any other code outside of GFX library itself.</p></i>
diff --git a/releases.txt b/releases.txt
index 86463cd3..d071674b 100644
--- a/releases.txt
+++ b/releases.txt
@@ -35,6 +35,8 @@ FEATURE: Added HX8347D driver by user 'Eddie'
FEATURE: Added enhanced notepad demo by user 'Abhishek'
FEATURE: Added GOS module (including sub modules such as GQUEUE)
FEATURE: Added some functionalities to the TDISP module by user 'Frysk'
+FEATURE: Added RA8875 GDISP driver
+FEATURE: Added FT5x06 GINPUT/touch driver
*** changes after 1.4 ***