Merge branch 'master' of bitbucket.org:Tectu/ugfx
This commit is contained in:
commit
0fa640f1ed
3 changed files with 211 additions and 24 deletions
203
boards/addons/gdisp/board_SPFD54124B_stm32f3.h
Normal file
203
boards/addons/gdisp/board_SPFD54124B_stm32f3.h
Normal file
|
@ -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 */
|
|
@ -214,7 +214,7 @@ LLDSPEC void gdisp_lld_control(GDisplay *g)
|
||||||
case GDISP_ROTATE_0:
|
case GDISP_ROTATE_0:
|
||||||
acquire_bus(g);
|
acquire_bus(g);
|
||||||
write_index(g, SPFD54124B_CMD_MADCTR);
|
write_index(g, SPFD54124B_CMD_MADCTR);
|
||||||
write_index(g, 0x00);
|
write_index(g, 0x0100);
|
||||||
release_bus(g);
|
release_bus(g);
|
||||||
g->g.Height = GDISP_SCREEN_HEIGHT;
|
g->g.Height = GDISP_SCREEN_HEIGHT;
|
||||||
g->g.Width = GDISP_SCREEN_WIDTH;
|
g->g.Width = GDISP_SCREEN_WIDTH;
|
||||||
|
@ -223,7 +223,7 @@ LLDSPEC void gdisp_lld_control(GDisplay *g)
|
||||||
case GDISP_ROTATE_90:
|
case GDISP_ROTATE_90:
|
||||||
acquire_bus(g);
|
acquire_bus(g);
|
||||||
write_index(g, SPFD54124B_CMD_MADCTR);
|
write_index(g, SPFD54124B_CMD_MADCTR);
|
||||||
write_index(g, 0xA0);
|
write_index(g, 0x01A0);
|
||||||
release_bus(g);
|
release_bus(g);
|
||||||
g->g.Height = GDISP_SCREEN_WIDTH;
|
g->g.Height = GDISP_SCREEN_WIDTH;
|
||||||
g->g.Width = GDISP_SCREEN_HEIGHT;
|
g->g.Width = GDISP_SCREEN_HEIGHT;
|
||||||
|
@ -232,7 +232,7 @@ LLDSPEC void gdisp_lld_control(GDisplay *g)
|
||||||
case GDISP_ROTATE_180:
|
case GDISP_ROTATE_180:
|
||||||
acquire_bus(g);
|
acquire_bus(g);
|
||||||
write_index(g, SPFD54124B_CMD_MADCTR);
|
write_index(g, SPFD54124B_CMD_MADCTR);
|
||||||
write_index(g, 0xC0);
|
write_index(g, 0x01C0);
|
||||||
release_bus(g);
|
release_bus(g);
|
||||||
g->g.Height = GDISP_SCREEN_HEIGHT;
|
g->g.Height = GDISP_SCREEN_HEIGHT;
|
||||||
g->g.Width = GDISP_SCREEN_WIDTH;
|
g->g.Width = GDISP_SCREEN_WIDTH;
|
||||||
|
@ -241,31 +241,14 @@ LLDSPEC void gdisp_lld_control(GDisplay *g)
|
||||||
case GDISP_ROTATE_270:
|
case GDISP_ROTATE_270:
|
||||||
acquire_bus(g);
|
acquire_bus(g);
|
||||||
write_index(g, SPFD54124B_CMD_MADCTR);
|
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);
|
release_bus(g);
|
||||||
g->g.Height = GDISP_SCREEN_WIDTH;
|
g->g.Height = GDISP_SCREEN_WIDTH;
|
||||||
g->g.Width = GDISP_SCREEN_HEIGHT;
|
g->g.Width = GDISP_SCREEN_HEIGHT;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
// GDISP_ROTATE_PORTRAIT and GDISP_ROTATE_LANDSCAPE are handled by the higher level code
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -96,7 +96,7 @@ static void forceFrameRedraw(GWidgetObject *gw) {
|
||||||
gw->g.flags &= ~(GWIN_FRAME_CLOSE_PRESSED|GWIN_FRAME_MAX_PRESSED|GWIN_FRAME_MIN_PRESSED);
|
gw->g.flags &= ~(GWIN_FRAME_CLOSE_PRESSED|GWIN_FRAME_MAX_PRESSED|GWIN_FRAME_MIN_PRESSED);
|
||||||
forceFrameRedraw(gw);
|
forceFrameRedraw(gw);
|
||||||
_gwinSendEvent(&gw->g, GEVENT_GWIN_CLOSE);
|
_gwinSendEvent(&gw->g, GEVENT_GWIN_CLOSE);
|
||||||
gwinDestroy(&gw->g);
|
_gwinDestroy(&gw->g, REDRAW_INSESSION);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if ((gw->g.flags & GWIN_FRAME_MAX_PRESSED)) {
|
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.
|
// 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);
|
gw->g.flags &= ~(GWIN_FRAME_CLOSE_PRESSED|GWIN_FRAME_MAX_PRESSED|GWIN_FRAME_MIN_PRESSED);
|
||||||
forceFrameRedraw(gw);
|
forceFrameRedraw(gw);
|
||||||
|
_gwinSendEvent(&gw->g, GEVENT_GWIN_CLOSE);
|
||||||
_gwinDestroy(&gw->g, REDRAW_INSESSION);
|
_gwinDestroy(&gw->g, REDRAW_INSESSION);
|
||||||
return;
|
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) {
|
for(y = gw->g.y+BORDER_T, ih = gi->height; y < my; y += ih) {
|
||||||
if (ih > my - y)
|
if (ih > my - y)
|
||||||
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)
|
if (iw > mx - x)
|
||||||
iw = mx - x;
|
iw = mx - x;
|
||||||
gdispGImageDraw(gw->g.display, gi, x, y, ih, iw, 0, 0);
|
gdispGImageDraw(gw->g.display, gi, x, y, ih, iw, 0, 0);
|
||||||
|
|
Loading…
Add table
Reference in a new issue