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 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; - /* 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; + /* 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 @@
  1. 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

  2. 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

  3. -
  4. Any modification to the Works must be contributed to the License Owners as per Section 4 prior to distribution; and

  5. +
  6. 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

  7. 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.

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.

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 ***