aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoel Bodenmann <joel@unormal.org>2014-08-21 18:34:59 +0200
committerJoel Bodenmann <joel@unormal.org>2014-08-21 18:34:59 +0200
commit0fa640f1edf98970e7c2e5ca9f574160223143c5 (patch)
tree50afce8dcb9a8e92ee3d6e7487f38d359fa93f49
parent7c791f2a9204f892e141d03163c9bcb36b335b41 (diff)
parent117e195354853ce2b53afef4ebb5860bf44fdde2 (diff)
downloaduGFX-0fa640f1edf98970e7c2e5ca9f574160223143c5.tar.gz
uGFX-0fa640f1edf98970e7c2e5ca9f574160223143c5.tar.bz2
uGFX-0fa640f1edf98970e7c2e5ca9f574160223143c5.zip
Merge branch 'master' of bitbucket.org:Tectu/ugfx
-rw-r--r--boards/addons/gdisp/board_SPFD54124B_stm32f3.h203
-rw-r--r--drivers/gdisp/SPFD54124B/gdisp_lld_SPFD54124B.c27
-rw-r--r--src/gwin/gwin_frame.c5
3 files changed, 211 insertions, 24 deletions
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;
}
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);