diff options
author | inmarket <andrewh@inmarket.com.au> | 2013-06-22 23:14:54 +1000 |
---|---|---|
committer | inmarket <andrewh@inmarket.com.au> | 2013-06-22 23:14:54 +1000 |
commit | c8300fe9c2c7facff1ad32978a5d961690473de4 (patch) | |
tree | 0e653df0a5d733e254b2d5d3a463968285340837 /drivers | |
parent | d362d9603e9d161e7006282f882205754e5afc58 (diff) | |
parent | 9aa1e95423f681277d048bed6b9acc5101f2cbe2 (diff) | |
download | uGFX-c8300fe9c2c7facff1ad32978a5d961690473de4.tar.gz uGFX-c8300fe9c2c7facff1ad32978a5d961690473de4.tar.bz2 uGFX-c8300fe9c2c7facff1ad32978a5d961690473de4.zip |
Merge branch 'master' into GWIN
Diffstat (limited to 'drivers')
35 files changed, 1869 insertions, 93 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
-
|