From 117e195354853ce2b53afef4ebb5860bf44fdde2 Mon Sep 17 00:00:00 2001 From: inmarket Date: Thu, 21 Aug 2014 09:11:10 +1000 Subject: Update to the SPFD54124B gdisp driver. Added an example board file for it to the boards/addons/gdisp directory --- boards/addons/gdisp/board_SPFD54124B_stm32f3.h | 203 +++++++++++++++++++++++++ 1 file changed, 203 insertions(+) create mode 100644 boards/addons/gdisp/board_SPFD54124B_stm32f3.h (limited to 'boards') 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 */ -- cgit v1.2.3