From d1217112a496ce0b3349ac93d7c5d6b2a5837f54 Mon Sep 17 00:00:00 2001 From: inmarket Date: Thu, 21 Aug 2014 08:11:27 +1000 Subject: [PATCH 1/2] Fix frame window logic bug and compile bug --- src/gwin/gwin_frame.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/gwin/gwin_frame.c b/src/gwin/gwin_frame.c index 63df3be2..8cb74a7d 100644 --- a/src/gwin/gwin_frame.c +++ b/src/gwin/gwin_frame.c @@ -96,7 +96,7 @@ static void forceFrameRedraw(GWidgetObject *gw) { gw->g.flags &= ~(GWIN_FRAME_CLOSE_PRESSED|GWIN_FRAME_MAX_PRESSED|GWIN_FRAME_MIN_PRESSED); forceFrameRedraw(gw); _gwinSendEvent(&gw->g, GEVENT_GWIN_CLOSE); - gwinDestroy(&gw->g); + _gwinDestroy(&gw->g, REDRAW_INSESSION); return; } if ((gw->g.flags & GWIN_FRAME_MAX_PRESSED)) { @@ -128,6 +128,7 @@ static void forceFrameRedraw(GWidgetObject *gw) { // Close is released - destroy the window. This is tricky as we already have the drawing lock. gw->g.flags &= ~(GWIN_FRAME_CLOSE_PRESSED|GWIN_FRAME_MAX_PRESSED|GWIN_FRAME_MIN_PRESSED); forceFrameRedraw(gw); + _gwinSendEvent(&gw->g, GEVENT_GWIN_CLOSE); _gwinDestroy(&gw->g, REDRAW_INSESSION); return; } @@ -308,7 +309,7 @@ void gwinFrameDraw_Std(GWidgetObject *gw, void *param) { for(y = gw->g.y+BORDER_T, ih = gi->height; y < my; y += ih) { if (ih > my - y) ih = my - y; - for(x = gw->g.x+BORDER_L; iw = gi->width; x < mx; x += iw) { + for(x = gw->g.x+BORDER_L, iw = gi->width; x < mx; x += iw) { if (iw > mx - x) iw = mx - x; gdispGImageDraw(gw->g.display, gi, x, y, ih, iw, 0, 0); From 117e195354853ce2b53afef4ebb5860bf44fdde2 Mon Sep 17 00:00:00 2001 From: inmarket Date: Thu, 21 Aug 2014 09:11:10 +1000 Subject: [PATCH 2/2] Update to the SPFD54124B gdisp driver. Added an example board file for it to the boards/addons/gdisp directory --- .../addons/gdisp/board_SPFD54124B_stm32f3.h | 203 ++++++++++++++++++ .../gdisp/SPFD54124B/gdisp_lld_SPFD54124B.c | 27 +-- 2 files changed, 208 insertions(+), 22 deletions(-) create mode 100644 boards/addons/gdisp/board_SPFD54124B_stm32f3.h diff --git a/boards/addons/gdisp/board_SPFD54124B_stm32f3.h b/boards/addons/gdisp/board_SPFD54124B_stm32f3.h new file mode 100644 index 00000000..765af495 --- /dev/null +++ b/boards/addons/gdisp/board_SPFD54124B_stm32f3.h @@ -0,0 +1,203 @@ +/* + * 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://ugfx.org/license.html + * + * Mail: fede.677387@hotmail.it + * + * Board: STM32F3-Discovery + */ + +/** + * @file boards/addons/gdisp/board_SPFD54124B_stm32f3.h + * @brief GDISP Graphic Driver subsystem board interface for the SPFD54124B display. + */ + +#ifndef _GDISP_LLD_BOARD_H +#define _GDISP_LLD_BOARD_H + +#define SPFD54124B_SPID SPID2 + +#define SPFD54124B_SPI_PORT GPIOB +#define SPFD54124B_SPI_NSS 12 +#define SPFD54124B_SPI_SCK 13 +#define SPFD54124B_SPI_MISO 14 // not used +#define SPFD54124B_SPI_MOSI 15 + +#define SPFD54124B_PIN_PORT GPIOA +#define SPFD54124B_PIN_RST 5 + +#define SET_RST palSetPad(SPFD54124B_PIN_PORT, SPFD54124B_PIN_RST); +#define CLR_RST palClearPad(SPFD54124B_PIN_PORT, SPFD54124B_PIN_RST); + +#define USE_SOFT_SPI TRUE +#define USE_HARD_SPI !(USE_SOFT_SPI) + +#if USE_HARD_SPI + +#if GFX_USE_OS_CHIBIOS +static int32_t thdPriority = 0; +#endif + +/* + * Maximum speed SPI configuration in 9 bit mode + */ +static const SPIConfig hs_spicfg = { + NULL, /* Operation complete callback or @p NULL. */ + SPFD54124B_SPI_PORT, /* The chip select line port */ + SPFD54124B_SPI_NSS, /* The chip select line pad number */ + 0, /* SPI CR1 register initialization data*/ + SPI_CR2_DS_3 /* SPI CR2 register initialization data 9-bit */ +}; +#endif + +#if USE_SOFT_SPI +static inline void soft_spi_sck(void){ + palSetPad(SPFD54124B_SPI_PORT, SPFD54124B_SPI_SCK); + palClearPad(SPFD54124B_SPI_PORT, SPFD54124B_SPI_SCK); +} + +static inline void soft_spi_write_9bit(uint16_t data){ + + uint8_t i; + + // activate lcd by low on CS pin + palClearPad(SPFD54124B_SPI_PORT, SPFD54124B_SPI_NSS); + + for (i=0; i<9; i++){ + // setting data + if(data & (SPFD54124B_SEND_DATA >> i)) { + palSetPad(SPFD54124B_SPI_PORT, SPFD54124B_SPI_MOSI); + } + else palClearPad(SPFD54124B_SPI_PORT, SPFD54124B_SPI_MOSI); + // clock data + soft_spi_sck(); + } + + //deactivate lcd by high on CS pin + palSetPad(SPFD54124B_SPI_PORT, SPFD54124B_SPI_NSS); + +} +#endif + +static inline void setpin_reset(GDisplay *g, bool_t state) { + (void) g; + if(state) { + CLR_RST; + } else { + SET_RST; + } +} + +static inline void init_board(GDisplay *g) { + // As we are not using multiple displays we set g->board to NULL as we don't use it. + g->board = 0; + + switch(g->controllerdisplay) { + case 0: // Set up for Display 0 + /* + * SPI1 I/O pins setup. + */ + palSetPadMode(SPFD54124B_PIN_PORT, SPFD54124B_PIN_RST, PAL_MODE_OUTPUT_PUSHPULL); /* RESET */ + setpin_reset(g, TRUE); + +#if USE_HARD_SPI + palSetPadMode(SPFD54124B_SPI_PORT, SPFD54124B_SPI_SCK, PAL_MODE_ALTERNATE(5) | PAL_STM32_OSPEED_HIGHEST); /* SCK. */ + palSetPadMode(SPFD54124B_SPI_PORT, SPFD54124B_SPI_MISO, PAL_MODE_ALTERNATE(5) | PAL_STM32_OSPEED_HIGHEST); /* MISO.*/ + palSetPadMode(SPFD54124B_SPI_PORT, SPFD54124B_SPI_MOSI, PAL_MODE_ALTERNATE(5) | PAL_STM32_OSPEED_HIGHEST); /* MOSI.*/ + palSetPadMode(SPFD54124B_SPI_PORT, SPFD54124B_SPI_NSS, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); /* NSS */ + palSetPad(SPFD54124B_SPI_PORT, SPFD54124B_SPI_NSS); + palClearPad(SPFD54124B_SPI_PORT, SPFD54124B_SPI_SCK); + palClearPad(SPFD54124B_SPI_PORT, SPFD54124B_SPI_MOSI); + spiInit(); +#endif + +#if USE_SOFT_SPI + palSetPadMode(SPFD54124B_SPI_PORT, SPFD54124B_SPI_SCK, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); /* SCK. */ + palSetPadMode(SPFD54124B_SPI_PORT, SPFD54124B_SPI_MISO, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); /* MISO.*/ + palSetPadMode(SPFD54124B_SPI_PORT, SPFD54124B_SPI_MOSI, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); /* MOSI.*/ + palSetPadMode(SPFD54124B_SPI_PORT, SPFD54124B_SPI_NSS, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); /* NSS */ + palSetPad(SPFD54124B_SPI_PORT, SPFD54124B_SPI_NSS); + palClearPad(SPFD54124B_SPI_PORT, SPFD54124B_SPI_SCK); + palClearPad(SPFD54124B_SPI_PORT, SPFD54124B_SPI_MOSI); +#endif + + break; + } +} + +static inline void acquire_bus(GDisplay *g) { + (void) g; +#if USE_HARD_SPI +#if GFX_USE_OS_CHIBIOS + thdPriority = (int32_t)chThdGetPriority(); + chThdSetPriority(HIGHPRIO); +#endif + spiAcquireBus(&SPFD54124B_SPID); +#endif +} + +static inline void release_bus(GDisplay *g) { + (void) g; +#if USE_HARD_SPI +#if GFX_USE_OS_CHIBIOS + chThdSetPriority(thdPriority); +#endif + spiReleaseBus(&SPFD54124B_SPID); +#endif +} + +static inline void write_data(GDisplay *g, uint16_t data) { + (void) g; + + uint16_t b; + +#if USE_HARD_SPI + + spiStart(&SPFD54124B_SPID, &hs_spicfg); + spiSelect(&SPFD54124B_SPID); + + b = (data >> 0x08) | SPFD54124B_SEND_DATA; + spiSend(&SPFD54124B_SPID, 0x01, &b); + b = (data & 0xFF) | SPFD54124B_SEND_DATA; + spiSend(&SPFD54124B_SPID, 0x01, &b); + + spiUnselect(&SPFD54124B_SPID); + spiStop(&SPFD54124B_SPID); + +#endif +#if USE_SOFT_SPI + b = (data >> 0x08) | SPFD54124B_SEND_DATA; + soft_spi_write_9bit(b); + b = (data & 0xFF) | SPFD54124B_SEND_DATA; + soft_spi_write_9bit(b); +#endif + +} + +static inline void write_index(GDisplay *g, uint16_t index) { + (void) g; + +#if USE_HARD_SPI + spiStart(&SPFD54124B_SPID, &hs_spicfg); + spiSelect(&SPFD54124B_SPID); + spiSend(&SPFD54124B_SPID, 0x01, &index); + spiUnselect(&SPFD54124B_SPID); + spiStop(&SPFD54124B_SPID); +#endif +#if USE_SOFT_SPI + soft_spi_write_9bit(index); +#endif +} + +static inline void post_init_board(GDisplay *g) { + (void) g; +} + +static inline void set_backlight(GDisplay *g, uint8_t percent) { + (void) g; + (void) percent; +} + +#endif /* _GDISP_LLD_BOARD_H */ diff --git a/drivers/gdisp/SPFD54124B/gdisp_lld_SPFD54124B.c b/drivers/gdisp/SPFD54124B/gdisp_lld_SPFD54124B.c index da6592c2..91298aff 100644 --- a/drivers/gdisp/SPFD54124B/gdisp_lld_SPFD54124B.c +++ b/drivers/gdisp/SPFD54124B/gdisp_lld_SPFD54124B.c @@ -214,7 +214,7 @@ LLDSPEC void gdisp_lld_control(GDisplay *g) case GDISP_ROTATE_0: acquire_bus(g); write_index(g, SPFD54124B_CMD_MADCTR); - write_index(g, 0x00); + write_index(g, 0x0100); release_bus(g); g->g.Height = GDISP_SCREEN_HEIGHT; g->g.Width = GDISP_SCREEN_WIDTH; @@ -223,7 +223,7 @@ LLDSPEC void gdisp_lld_control(GDisplay *g) case GDISP_ROTATE_90: acquire_bus(g); write_index(g, SPFD54124B_CMD_MADCTR); - write_index(g, 0xA0); + write_index(g, 0x01A0); release_bus(g); g->g.Height = GDISP_SCREEN_WIDTH; g->g.Width = GDISP_SCREEN_HEIGHT; @@ -232,7 +232,7 @@ LLDSPEC void gdisp_lld_control(GDisplay *g) case GDISP_ROTATE_180: acquire_bus(g); write_index(g, SPFD54124B_CMD_MADCTR); - write_index(g, 0xC0); + write_index(g, 0x01C0); release_bus(g); g->g.Height = GDISP_SCREEN_HEIGHT; g->g.Width = GDISP_SCREEN_WIDTH; @@ -241,31 +241,14 @@ LLDSPEC void gdisp_lld_control(GDisplay *g) case GDISP_ROTATE_270: acquire_bus(g); write_index(g, SPFD54124B_CMD_MADCTR); - write_index(g, 0x60); + write_index(g, 0x0160); release_bus(g); g->g.Height = GDISP_SCREEN_WIDTH; g->g.Width = GDISP_SCREEN_HEIGHT; break; - case GDISP_ROTATE_PORTRAIT: - acquire_bus(g); - write_index(g, SPFD54124B_CMD_MADCTR); - write_index(g, 0x00); - release_bus(g); - g->g.Height = GDISP_SCREEN_HEIGHT; - g->g.Width = GDISP_SCREEN_WIDTH; - break; - - case GDISP_ROTATE_LANDSCAPE: - acquire_bus(g); - write_index(g, SPFD54124B_CMD_MADCTR); - write_index(g, 0xA0); - release_bus(g); - g->g.Height = GDISP_SCREEN_WIDTH; - g->g.Width = GDISP_SCREEN_HEIGHT; - break; - default: + // GDISP_ROTATE_PORTRAIT and GDISP_ROTATE_LANDSCAPE are handled by the higher level code return; }