Merge branch 'master' of bitbucket.org:Tectu/ugfx
This commit is contained in:
commit
0fa640f1ed
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:
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user