2015-02-01 16:35:18 +00:00
|
|
|
/*
|
|
|
|
* 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
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef GDISP_LLD_BOARD_H
|
|
|
|
#define GDISP_LLD_BOARD_H
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Board file for HY-MiniSTM32V board from HAOYU (China).
|
|
|
|
* www.powermcu.com or www.hotmcu.com.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* NOTE: In order to make this work you need to set:
|
|
|
|
* STM32_PWM_USE_TIM3 TRUE in mcuconf.h
|
|
|
|
* HAL_USE_PWM TRUE in halconf.h
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* TM3 ch2 is connected to LCD BL_CNT (PB5)
|
|
|
|
*/
|
|
|
|
static const PWMConfig pwmcfg =
|
|
|
|
{
|
|
|
|
100000, // frequency
|
|
|
|
100, // period
|
|
|
|
NULL, // callback
|
|
|
|
{
|
|
|
|
{PWM_OUTPUT_DISABLED, 0},
|
|
|
|
{PWM_OUTPUT_ACTIVE_HIGH, 0},
|
|
|
|
{PWM_OUTPUT_DISABLED, 0},
|
|
|
|
{PWM_OUTPUT_DISABLED, 0}
|
|
|
|
},
|
|
|
|
0, // cr2
|
|
|
|
0, // dier
|
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* LCD_RS is on A16 (PD11)
|
|
|
|
*/
|
|
|
|
#define GDISP_REG (*((volatile uint16_t *) 0x60000000)) /* RS = 0 */
|
|
|
|
#define GDISP_RAM (*((volatile uint16_t *) 0x60020000)) /* RS = 1 */
|
|
|
|
/*
|
|
|
|
* STM32_DMA1_STREAM7
|
|
|
|
* NOTE: conflicts w/ USART2_TX, TIM2_CH2, TIM2_CH4, TIM4_UP, I2C1_RX in case
|
|
|
|
*/
|
|
|
|
#define GDISP_DMA_STREAM STM32_DMA1_STREAM7
|
|
|
|
#define FSMC_BANK 0
|
|
|
|
|
2015-10-23 08:24:49 +00:00
|
|
|
static GFXINLINE void init_board(GDisplay *g) {
|
2015-02-01 16:35:18 +00:00
|
|
|
/*
|
|
|
|
* 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) {
|
|
|
|
/*
|
|
|
|
* Set up for Display 0
|
|
|
|
*/
|
|
|
|
case 0:
|
|
|
|
/* FSMC setup for F1 */
|
|
|
|
rccEnableAHB(RCC_AHBENR_FSMCEN, 0);
|
|
|
|
|
|
|
|
/* Group pins for FSMC setup as alternate function */
|
|
|
|
IOBus busD = { GPIOD, (1 << 0) | (1 << 1) | (1 << 4) | (1 << 5) | \
|
|
|
|
(1 << 7) | (1 << 8) | (1 << 9) | (1 << 10) | (1 << 11) | \
|
|
|
|
(1 << 14) | (1 << 15), 0 };
|
|
|
|
|
|
|
|
IOBus busE = { GPIOE, (1 << 7) | (1 << 8) | (1 << 9) | (1 << 10) | \
|
|
|
|
(1 << 11) | (1 << 12) | (1 << 13) | (1 << 14) | \
|
|
|
|
(1 << 15), 0 };
|
|
|
|
|
|
|
|
/* FSMC sa alternate function */
|
|
|
|
palSetBusMode(&busD, PAL_MODE_STM32_ALTERNATE_PUSHPULL);
|
|
|
|
palSetBusMode(&busE, PAL_MODE_STM32_ALTERNATE_PUSHPULL);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* NOTE: stm32F10x.h is FAULTY on FSMC
|
|
|
|
* NOTE: Used hardcore bit shifting below
|
|
|
|
* NOTE: All timings for 72MHz HCLK - should be revised for lower HCLK
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* FSMC timing - Read: DATAST = 0x20; all the rest = 0.
|
|
|
|
* 100ns cycle time for SSD1289 as per DataSheet
|
|
|
|
*/
|
|
|
|
FSMC_Bank1->BTCR[FSMC_BANK+1] = (0x20 << 8);
|
|
|
|
|
|
|
|
/* FSMC timing - Write: DATAST = 0x01, ADDSET = 0x01 all the rest = 0.
|
|
|
|
* 1000ns cycle time for SSD1289 as per DataSheet
|
|
|
|
*/
|
|
|
|
FSMC_Bank1E->BWTR[FSMC_BANK] = (0x1 << 8) | (0x01 << 0);
|
|
|
|
|
|
|
|
/* Bank1 NOR/SRAM control register configuration
|
|
|
|
* Note: different read and write cycle timing
|
|
|
|
*/
|
|
|
|
FSMC_Bank1->BTCR[FSMC_BANK] = FSMC_BCR1_MWID_0 | FSMC_BCR1_WREN | \
|
|
|
|
FSMC_BCR1_MBKEN | FSMC_BCR1_EXTMOD;
|
|
|
|
|
|
|
|
/* DMA Setup. */
|
|
|
|
#if defined(GDISP_USE_DMA) && defined(GDISP_DMA_STREAM)
|
|
|
|
if (dmaStreamAllocate(GDISP_DMA_STREAM, 0, 0, 0))
|
|
|
|
gfxExit();
|
|
|
|
|
|
|
|
dmaStreamSetMemory0(GDISP_DMA_STREAM, &GDISP_RAM);
|
|
|
|
dmaStreamSetMode(GDISP_DMA_STREAM, STM32_DMA_CR_PL(0) | \
|
|
|
|
STM32_DMA_CR_PSIZE_HWORD | STM32_DMA_CR_MSIZE_HWORD | \
|
|
|
|
STM32_DMA_CR_DIR_M2M);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* Display backlight control */
|
|
|
|
/* TIM3 ch2 (PB5) connected to LCD BL_CNT */
|
|
|
|
pwmStart(&PWMD3, &pwmcfg);
|
|
|
|
palSetPadMode(GPIOB, 5, PAL_MODE_STM32_ALTERNATE_PUSHPULL);
|
|
|
|
pwmEnableChannel(&PWMD3, 1, 100);
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-10-23 08:24:49 +00:00
|
|
|
static GFXINLINE void post_init_board(GDisplay *g) {
|
2015-02-01 16:35:18 +00:00
|
|
|
(void) g;
|
|
|
|
}
|
|
|
|
|
2015-10-23 08:24:49 +00:00
|
|
|
static GFXINLINE void setpin_reset(GDisplay *g, bool_t state) {
|
2015-02-01 16:35:18 +00:00
|
|
|
(void) g;
|
|
|
|
|
|
|
|
if(state) {}
|
|
|
|
else {}
|
|
|
|
}
|
|
|
|
|
2015-10-23 08:24:49 +00:00
|
|
|
static GFXINLINE void set_backlight(GDisplay *g, uint8_t percent) {
|
2015-02-01 16:35:18 +00:00
|
|
|
(void) g;
|
|
|
|
if (percent > 100) { percent = 100; }
|
|
|
|
pwmEnableChannel(&PWMD3, 1, percent);
|
|
|
|
}
|
|
|
|
|
2015-10-23 08:24:49 +00:00
|
|
|
static GFXINLINE void acquire_bus(GDisplay *g) {
|
2015-02-01 16:35:18 +00:00
|
|
|
(void) g;
|
|
|
|
}
|
|
|
|
|
2015-10-23 08:24:49 +00:00
|
|
|
static GFXINLINE void release_bus(GDisplay *g) {
|
2015-02-01 16:35:18 +00:00
|
|
|
(void) g;
|
|
|
|
}
|
|
|
|
|
2015-10-23 08:24:49 +00:00
|
|
|
static GFXINLINE void write_index(GDisplay *g, uint16_t index) {
|
2015-02-01 16:35:18 +00:00
|
|
|
(void) g;
|
|
|
|
GDISP_REG = index;
|
|
|
|
}
|
|
|
|
|
2015-10-23 08:24:49 +00:00
|
|
|
static GFXINLINE void write_data(GDisplay *g, uint16_t data) {
|
2015-02-01 16:35:18 +00:00
|
|
|
(void) g;
|
|
|
|
GDISP_RAM = data;
|
|
|
|
}
|
|
|
|
|
2015-10-23 08:24:49 +00:00
|
|
|
static GFXINLINE void setreadmode(GDisplay *g) {
|
2015-02-01 16:35:18 +00:00
|
|
|
(void) g;
|
|
|
|
}
|
|
|
|
|
2015-10-23 08:24:49 +00:00
|
|
|
static GFXINLINE void setwritemode(GDisplay *g) {
|
2015-02-01 16:35:18 +00:00
|
|
|
(void) g;
|
|
|
|
}
|
|
|
|
|
2015-10-23 08:24:49 +00:00
|
|
|
static GFXINLINE uint16_t read_data(GDisplay *g) {
|
2015-02-01 16:35:18 +00:00
|
|
|
(void) g;
|
|
|
|
return GDISP_RAM;
|
|
|
|
}
|
|
|
|
|
|
|
|
#if defined(GDISP_USE_DMA) || defined(__DOXYGEN__)
|
2015-10-23 08:24:49 +00:00
|
|
|
static GFXINLINE void dma_with_noinc(GDisplay *g, color_t *buffer, int area) {
|
2015-02-01 16:35:18 +00:00
|
|
|
(void) g;
|
|
|
|
dmaStreamSetPeripheral(GDISP_DMA_STREAM, buffer);
|
|
|
|
dmaStreamSetMode(GDISP_DMA_STREAM, STM32_DMA_CR_PL(0) | \
|
|
|
|
STM32_DMA_CR_PSIZE_HWORD | STM32_DMA_CR_MSIZE_HWORD | \
|
|
|
|
STM32_DMA_CR_DIR_M2M);
|
|
|
|
for (; area > 0; area -= 65535) {
|
|
|
|
dmaStreamSetTransactionSize(GDISP_DMA_STREAM, area > 65535 ? 65535 : area);
|
|
|
|
dmaStreamEnable(GDISP_DMA_STREAM);
|
|
|
|
dmaWaitCompletion(GDISP_DMA_STREAM);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-10-23 08:24:49 +00:00
|
|
|
static GFXINLINE void dma_with_inc(GDisplay *g, color_t *buffer, int area) {
|
2015-02-01 16:35:18 +00:00
|
|
|
(void) g;
|
|
|
|
dmaStreamSetPeripheral(GDISP_DMA_STREAM, buffer);
|
|
|
|
dmaStreamSetMode(GDISP_DMA_STREAM, STM32_DMA_CR_PL(0) | STM32_DMA_CR_PINC | \
|
|
|
|
STM32_DMA_CR_PSIZE_HWORD | STM32_DMA_CR_MSIZE_HWORD | \
|
|
|
|
STM32_DMA_CR_DIR_M2M);
|
|
|
|
for (; area > 0; area -= 65535) {
|
|
|
|
dmaStreamSetTransactionSize(GDISP_DMA_STREAM, area > 65535 ? 65535 : area);
|
|
|
|
dmaStreamEnable(GDISP_DMA_STREAM);
|
|
|
|
dmaWaitCompletion(GDISP_DMA_STREAM);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif /* GDISP_LLD_BOARD_H */
|