arch/arm/src/lpc54xx: Add the ported LPC1788 LCD driver to use the LPC54xx pin definitions and SYSCON.

This commit is contained in:
Gregory Nutt 2017-12-12 12:53:33 -06:00
parent 88834b6e50
commit b33d7eb59f
5 changed files with 131 additions and 81 deletions

View File

@ -640,6 +640,21 @@ config LPC54_LCD_VRAMBASE
Base address of the video RAM frame buffer. The default is
(LPC54_EXTDRAM_CS0 + 0x00010000)
config LPC54_LCD_USE_VD012
bool "Use VD0, VD1, and VD2 pins"
default y
---help---
Some LCDs do not connect these pins.
config LPC54_LCD_USE_CLKIN
bool "Use optional input clock"
default n
config LPC54_LCD_CLKIN_FREQUENCY
int "Input clock frequency"
default 0
depends on LPC54_LCD_USE_CLKIN
config LPC54_LCD_REFRESH_FREQ
int "LCD refesh rate (Hz)"
default 50

View File

@ -584,41 +584,41 @@
/* LCD */
#define GPIO_LCD_AC (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_PORT2 | GPIO_PIN15)
#define GPIO_LCD_CLKIN (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_PORT2 | GPIO_PIN17)
#define GPIO_LCD_DCLK (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_PORT2 | GPIO_PIN13)
#define GPIO_LCD_FP (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_PORT2 | GPIO_PIN14)
#define GPIO_LCD_LE (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_PORT2 | GPIO_PIN12)
#define GPIO_LCD_LP (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_PORT2 | GPIO_PIN16)
#define GPIO_LCD_PWR (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_PORT2 | GPIO_PIN11)
#define GPIO_LCD_VD0_1 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_PORT2 | GPIO_PIN18)
#define GPIO_LCD_VD0_2 (GPIO_ALT2 | GPIO_MODE_DIGITAL | GPIO_PORT3 | GPIO_PIN6)
#define GPIO_LCD_VD1_1 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_PORT2 | GPIO_PIN19)
#define GPIO_LCD_VD1_2 (GPIO_ALT2 | GPIO_MODE_DIGITAL | GPIO_PORT3 | GPIO_PIN7)
#define GPIO_LCD_VD2_1 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_PORT2 | GPIO_PIN20)
#define GPIO_LCD_VD2_2 (GPIO_ALT2 | GPIO_MODE_DIGITAL | GPIO_PORT3 | GPIO_PIN8)
#define GPIO_LCD_VD3_1 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_PORT2 | GPIO_PIN21)
#define GPIO_LCD_VD3_2 (GPIO_ALT2 | GPIO_MODE_DIGITAL | GPIO_PORT3 | GPIO_PIN9)
#define GPIO_LCD_VD4 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_PORT2 | GPIO_PIN22)
#define GPIO_LCD_VD5 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_PORT2 | GPIO_PIN23)
#define GPIO_LCD_VD6 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_PORT2 | GPIO_PIN24)
#define GPIO_LCD_VD7 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_PORT2 | GPIO_PIN25)
#define GPIO_LCD_VD8 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_PORT2 | GPIO_PIN26)
#define GPIO_LCD_VD9 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_PORT2 | GPIO_PIN27)
#define GPIO_LCD_VD10 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_PORT2 | GPIO_PIN28)
#define GPIO_LCD_VD11 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_PORT2 | GPIO_PIN29)
#define GPIO_LCD_VD12 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_PORT2 | GPIO_PIN30)
#define GPIO_LCD_VD13 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_PORT2 | GPIO_PIN31)
#define GPIO_LCD_VD14 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_PORT3 | GPIO_PIN0)
#define GPIO_LCD_VD15 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_PORT3 | GPIO_PIN1)
#define GPIO_LCD_VD16 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_PORT3 | GPIO_PIN2)
#define GPIO_LCD_VD17 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_PORT3 | GPIO_PIN3)
#define GPIO_LCD_VD18 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_PORT3 | GPIO_PIN4)
#define GPIO_LCD_VD19 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_PORT3 | GPIO_PIN5)
#define GPIO_LCD_VD20 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_PORT3 | GPIO_PIN6)
#define GPIO_LCD_VD21 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_PORT3 | GPIO_PIN7)
#define GPIO_LCD_VD22 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_PORT3 | GPIO_PIN8)
#define GPIO_LCD_VD23 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_PORT3 | GPIO_PIN9)
#define GPIO_LCD_AC (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT2 | GPIO_PIN15)
#define GPIO_LCD_CLKIN (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT2 | GPIO_PIN17)
#define GPIO_LCD_DCLK (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT2 | GPIO_PIN13)
#define GPIO_LCD_FP (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT2 | GPIO_PIN14)
#define GPIO_LCD_LE (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT2 | GPIO_PIN12)
#define GPIO_LCD_LP (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT2 | GPIO_PIN16)
#define GPIO_LCD_PWR (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT2 | GPIO_PIN11)
#define GPIO_LCD_VD0_1 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT2 | GPIO_PIN18)
#define GPIO_LCD_VD0_2 (GPIO_ALT2 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT3 | GPIO_PIN6)
#define GPIO_LCD_VD1_1 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT2 | GPIO_PIN19)
#define GPIO_LCD_VD1_2 (GPIO_ALT2 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT3 | GPIO_PIN7)
#define GPIO_LCD_VD2_1 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT2 | GPIO_PIN20)
#define GPIO_LCD_VD2_2 (GPIO_ALT2 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT3 | GPIO_PIN8)
#define GPIO_LCD_VD3_1 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT2 | GPIO_PIN21)
#define GPIO_LCD_VD3_2 (GPIO_ALT2 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT3 | GPIO_PIN9)
#define GPIO_LCD_VD4 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT2 | GPIO_PIN22)
#define GPIO_LCD_VD5 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT2 | GPIO_PIN23)
#define GPIO_LCD_VD6 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT2 | GPIO_PIN24)
#define GPIO_LCD_VD7 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT2 | GPIO_PIN25)
#define GPIO_LCD_VD8 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT2 | GPIO_PIN26)
#define GPIO_LCD_VD9 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT2 | GPIO_PIN27)
#define GPIO_LCD_VD10 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT2 | GPIO_PIN28)
#define GPIO_LCD_VD11 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT2 | GPIO_PIN29)
#define GPIO_LCD_VD12 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT2 | GPIO_PIN30)
#define GPIO_LCD_VD13 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT2 | GPIO_PIN31)
#define GPIO_LCD_VD14 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT3 | GPIO_PIN0)
#define GPIO_LCD_VD15 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT3 | GPIO_PIN1)
#define GPIO_LCD_VD16 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT3 | GPIO_PIN2)
#define GPIO_LCD_VD17 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT3 | GPIO_PIN3)
#define GPIO_LCD_VD18 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT3 | GPIO_PIN4)
#define GPIO_LCD_VD19 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT3 | GPIO_PIN5)
#define GPIO_LCD_VD20 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT3 | GPIO_PIN6)
#define GPIO_LCD_VD21 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT3 | GPIO_PIN7)
#define GPIO_LCD_VD22 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT3 | GPIO_PIN8)
#define GPIO_LCD_VD23 (GPIO_ALT1 | GPIO_MODE_DIGITAL | GPIO_FILTER_OFF | GPIO_PORT3 | GPIO_PIN9)
/* MCLK */

View File

@ -553,8 +553,16 @@
#define SYSCON_DMICCLKSEL_
/* SCTimer/PWM clock source select */
#define SYSCON_SCTCLKSEL_
/* LCD clock source select */
#define SYSCON_LCDCLKSEL_
#define SYSCON_LCDCLKSEL_SHIFT (0) /* Bits 0-1: LCD clock source select */
#define SYSCON_LCDCLKSEL_MASK (3 << SYSCON_LCDCLKSEL_SHIFT)
# define SYSCON_LCDCLKSEL_MAINCLK (0 << SYSCON_LCDCLKSEL_SHIFT) /* Main clock (main_clk) */
# define SYSCON_LCDCLKSEL_LCDCLKIN (1 << SYSCON_LCDCLKSEL_SHIFT) /* LCD external clock input (LCD_CLKIN) */
# define SYSCON_LCDCLKSEL_FROHF (2 << SYSCON_LCDCLKSEL_SHIFT) /* FRO 96 or 48 MHz (fro_hf) */
# define SYSCON_LCDCLKSEL_NONE (3 << SYSCON_LCDCLKSEL_SHIFT) /* None */
/* SDIO clock source select */
#define SYSCON_SDIOCLKSEL_
@ -610,8 +618,16 @@
#define SYSCON_DMICCLKDIV_
/* I2S MCLK clock divider */
#define SYSCON_MCLKDIV_
/* LCD clock divider */
#define SYSCON_LCDCLKDIV_
#define SYSCON_LCDCLKDIV_DIV_SHIFT (0) /* Bits 0-7: Clock divider value */
#define SYSCON_LCDCLKDIV_DIV_MASK (0xff <<SYSCON_LCDCLKDIV_DIV_SHIFT)
# define SYSCON_LCDCLKDIV_DIV(n) ((uint32_t)((n)-1) << SYSCON_LCDCLKDIV_DIV_SHIFT)
#define SYSCON_LCDCLKDIV_RESET (1 << 29) /* Bit 29: Resets the divider counter */
#define SYSCON_LCDCLKDIV_HALT (1 << 30) /* Bit 30: Halts the divider counter */
#define SYSCON_LCDCLKDIV_REQFLAG (1 << 31) /* Bit 31: Divider status flag */
/* SCT/PWM clock divider */
#define SYSCON_SCTCLKDIV_
@ -621,7 +637,7 @@
#define SYSCON_EMCCLKDIV_DIV_MASK (0xff <<SYSCON_EMCCLKDIV_DIV_SHIFT)
# define SYSCON_EMCCLKDIV_DIV(n) ((uint32_t)((n)-1) << SYSCON_EMCCLKDIV_DIV_SHIFT)
#define SYSCON_EMCCLKDIV_RESET (1 << 29) /* Bit 29: Resets the divider counter */
#define SYSCON_EMCCLKDIV_ HALT (1 << 30) /* Bit 30: Halts the divider counter */
#define SYSCON_EMCCLKDIV_HALT (1 << 30) /* Bit 30: Halts the divider counter */
#define SYSCON_EMCCLKDIV_REQFLAG (1 << 31) /* Bit 31: Divider status flag */
/* SDIO clock divider */

View File

@ -471,62 +471,69 @@ static int lpc54_setcursor(FAR struct fb_vtable_s *vtable,
int up_fbinitialize(int display)
{
uint32_t regval;
uint32_t lcddiv;
int i;
lcdinfo("Entry\n");
/* Give LCD bus priority */
regval = ((SYSCON_MATRIXARB_PRI_ICODE(SYSCON_MATRIXARB_PRI_LOW)) |
(SYSCON_MATRIXARB_PRI_DCODE(SYSCON_MATRIXARB_PRI_HIGHEST)) |
(SYSCON_MATRIXARB_PRI_LCD(SYSCON_MATRIXARB_PRI_HIGHEST)));
putreg32(regval, LPC54_SYSCON_MATRIXARB);
/* Configure pins */
/* Video data */
/* LCD panel data. Pins used depend on the panel configuration */
lcdinfo("Configuring pins\n");
lpc54_configgpio(GPIO_LCD_VD0);
lpc54_configgpio(GPIO_LCD_VD1);
lpc54_configgpio(GPIO_LCD_VD2);
lpc54_configgpio(GPIO_LCD_VD3);
lpc54_configgpio(GPIO_LCD_VD4);
lpc54_configgpio(GPIO_LCD_VD5);
lpc54_configgpio(GPIO_LCD_VD6);
lpc54_configgpio(GPIO_LCD_VD7);
#ifdef CONFIG_LPC54_LCD_USE_VD012
lpc54_gpio_config(GPIO_LCD_VD0);
lpc54_gpio_config(GPIO_LCD_VD1);
lpc54_gpio_config(GPIO_LCD_VD2);
#endif
lpc54_gpio_config(GPIO_LCD_VD3);
lpc54_gpio_config(GPIO_LCD_VD4);
lpc54_gpio_config(GPIO_LCD_VD5);
lpc54_gpio_config(GPIO_LCD_VD6);
lpc54_gpio_config(GPIO_LCD_VD7);
lpc54_configgpio(GPIO_LCD_VD8);
lpc54_configgpio(GPIO_LCD_VD9);
lpc54_configgpio(GPIO_LCD_VD10);
lpc54_configgpio(GPIO_LCD_VD11);
lpc54_configgpio(GPIO_LCD_VD12);
lpc54_configgpio(GPIO_LCD_VD13);
lpc54_configgpio(GPIO_LCD_VD14);
lpc54_configgpio(GPIO_LCD_VD15);
lpc54_gpio_config(GPIO_LCD_VD8);
lpc54_gpio_config(GPIO_LCD_VD9);
lpc54_gpio_config(GPIO_LCD_VD10);
lpc54_gpio_config(GPIO_LCD_VD11);
lpc54_gpio_config(GPIO_LCD_VD12);
lpc54_gpio_config(GPIO_LCD_VD13);
lpc54_gpio_config(GPIO_LCD_VD14);
lpc54_gpio_config(GPIO_LCD_VD15);
#if LPC54_BPP > 16
lpc54_configgpio(GPIO_LCD_VD16);
lpc54_configgpio(GPIO_LCD_VD54);
lpc54_configgpio(GPIO_LCD_VD18);
lpc54_configgpio(GPIO_LCD_VD19);
lpc54_configgpio(GPIO_LCD_VD20);
lpc54_configgpio(GPIO_LCD_VD21);
lpc54_configgpio(GPIO_LCD_VD22);
lpc54_configgpio(GPIO_LCD_VD23);
lpc54_gpio_config(GPIO_LCD_VD16);
lpc54_gpio_config(GPIO_LCD_VD54);
lpc54_gpio_config(GPIO_LCD_VD18);
lpc54_gpio_config(GPIO_LCD_VD19);
lpc54_gpio_config(GPIO_LCD_VD20);
lpc54_gpio_config(GPIO_LCD_VD21);
lpc54_gpio_config(GPIO_LCD_VD22);
lpc54_gpio_config(GPIO_LCD_VD23);
#endif
/* Other pins */
lpc54_configgpio(GPIO_LCD_DCLK);
lpc54_configgpio(GPIO_LCD_LP);
lpc54_configgpio(GPIO_LCD_FP);
lpc54_configgpio(GPIO_LCD_ENABM);
lpc54_configgpio(GPIO_LCD_PWR);
lpc54_gpio_config(GPIO_LCD_AC); /* STN AC bias drive or TFT data enable output */
lpc54_gpio_config(GPIO_LCD_DCLK); /* LCD panel clock */
lpc54_gpio_config(GPIO_LCD_FP); /* Frame pulse (STN).
* Vertical synchronization pulse (TFT) */
lpc54_gpio_config(GPIO_LCD_LE); /* Line end signal */
lpc54_gpio_config(GPIO_LCD_LP); /* Line synchronization pulse (STN).
* Horizontal synchronization pulse (TFT) */
lpc54_gpio_config(GPIO_LCD_PWR); /* LCD panel power enable */
/* Turn on LCD clock */
#ifdef CONFIG_LPC54_LCD_USE_CLKIN
lpc54_gpio_config(GPIO_LCD_CLKIN); /* Optional clock input */
#endif
modifyreg32(LPC54_SYSCON_PCONP, 0, SYSCON_PCONP_PCLCD);
/* Route Main clock (or LCK CLKIN) to LCD. */
#ifdef CONFIG_LPC54_LCD_USE_CLKIN
putreg32(SYSCON_LCDCLKSEL_LCDCLKIN, LPC54_SYSCON_LCDCLKSEL);
#else
putreg32(SYSCON_LCDCLKSEL_MAINCLK, LPC54_SYSCON_LCDCLKSEL);
#endif
lcdinfo("Configuring the LCD controller\n");
@ -544,10 +551,16 @@ int up_fbinitialize(int display)
putreg32(0, LPC54_LCD_CTRL);
/* Initialize pixel clock (assuming clock source is the peripheral clock) */
/* Initialize pixel clock */
putreg32(((uint32_t)BOARD_PCLK_FREQUENCY / (uint32_t)LPC54_LCD_PIXEL_CLOCK)+1,
LPC54_SYSCON_LCDCFG);
#ifdef CONFIG_LPC54_LCD_USE_CLKIN
lcddiv = ((uint32_t)CONFIG_LPC54_LCD_CLKIN_FREQUENCY /
(uint32_t)LPC54_LCD_PIXEL_CLOCK) + 1
#else
lcddiv = ((uint32_t)BOARD_MAIN_CLK / (uint32_t)LPC54_LCD_PIXEL_CLOCK) + 1
#endif
putreg32(lcddiv, LPC54_SYSCON_LCDCLKDIV);
putreg32(lcddiv | SYSCON_LCDCLKDIV_REQFLAG, LPC54_SYSCON_LCDCLKDIV);
/* Set the bits per pixel */
@ -781,7 +794,7 @@ void up_fbuninitialize(int display)
/* Turn off clocking to the LCD. modifyreg32() can do this atomically. */
modifyreg32(LPC54_SYSCON_PCONP, SYSCON_PCONP_PCLCD, 0);
putreg32(SYSCON_LCDCLKSEL_NONE, LPC54_SYSCON_LCDCLKSEL);
}
/****************************************************************************

View File

@ -34,6 +34,12 @@ STATUS
but not reliable. Added framework for future I2C and SPI flexcomm
drivers (mostly empty files for now)
2017-12-12: The SDRAM is now functional passes the commplete RAM test.
Included configurations and logic to add none, portions, or all of the
external SDRAM to the system heap. Brought in the LPC1788 LCD driver.
The LPC1788 LCD registers are identical to the LPC54xx (other than a
minor clock source setting). That port required modifications only
for differences in some SYSCON and pin-related settings. No testing
has yet been performed.
Configurations
==============