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; }