diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2013-03-26 16:56:09 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2013-03-26 16:56:09 +0000 |
commit | bd800e9348fe0ab62fa37a1f04c9a40f21bedf46 (patch) | |
tree | 9fa3ab0047612050c7bb22e9f9409f43b59a84a9 /nuttx/arch/arm/src/lpc17xx/lpc17_lcd.c | |
parent | 97802f4b576ac03abedd9f19fe40980a42e20ddb (diff) | |
download | px4-nuttx-bd800e9348fe0ab62fa37a1f04c9a40f21bedf46.tar.gz px4-nuttx-bd800e9348fe0ab62fa37a1f04c9a40f21bedf46.tar.bz2 px4-nuttx-bd800e9348fe0ab62fa37a1f04c9a40f21bedf46.zip |
Some initial LCD logic for the lpc1788 (still a work-in-progress)
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@5786 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/arch/arm/src/lpc17xx/lpc17_lcd.c')
-rw-r--r-- | nuttx/arch/arm/src/lpc17xx/lpc17_lcd.c | 416 |
1 files changed, 416 insertions, 0 deletions
diff --git a/nuttx/arch/arm/src/lpc17xx/lpc17_lcd.c b/nuttx/arch/arm/src/lpc17xx/lpc17_lcd.c new file mode 100644 index 000000000..0fdae36e7 --- /dev/null +++ b/nuttx/arch/arm/src/lpc17xx/lpc17_lcd.c @@ -0,0 +1,416 @@ +/**************************************************************************** + * arch/arm/src//lpc17xx/lpc17_lcd.c + * + * Copyright (C) 2013 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt <gnutt@nuttx.org> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> + +#include <stdint.h> +#include <string.h> +#include <errno.h> +#include <debug.h> + +#include <nuttx/fb.h> +#include "lpc17_internal.h" + +/**************************************************************************** + * Pre-Processor Definitions + ****************************************************************************/ + +/* Framebuffer characteristics in bytes */ + +#define FB_WIDTH ((CONFIG_LPC17_LCD_HWIDTH * CONFIG_LPC17_LCD_BPP + 7) / 8) +#define FB_SIZE (FB_WIDTH * CONFIG_LPC17_LCD_VHEIGHT) + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +/* Get information about the video controller configuration and the + * configuration of each color plane. + */ + +static int lpc17_getvideoinfo(FAR struct fb_vtable_s *vtable, + FAR struct fb_videoinfo_s *vinfo); +static int lpc17_getplaneinfo(FAR struct fb_vtable_s *vtable, int planeno, + FAR struct fb_planeinfo_s *pinfo); + +/* The following is provided only if the video hardware supports RGB color + * mapping + */ + +#ifdef CONFIG_FB_CMAP +static int lpc17_getcmap(FAR struct fb_vtable_s *vtable, + FAR struct fb_cmap_s *cmap); +static int lpc17_putcmap(FAR struct fb_vtable_s *vtable, + FAR const struct fb_cmap_s *cmap); +#endif + +/* The following is provided only if the video hardware supports a hardware + * cursor + */ + +#ifdef CONFIG_FB_HWCURSOR +static int lpc17_getcursor(FAR struct fb_vtable_s *vtable, + FAR struct fb_cursorattrib_s *attrib); +static int lpc17_setcursor(FAR struct fb_vtable_s *vtable, + FAR struct fb_setcursor_s *setttings); +#endif + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/* This structure describes the simulated video controller */ + +static const struct fb_videoinfo_s g_videoinfo = +{ + .fmt = FB_FMT, + .xres = CONFIG_LPC17_LCD_HWIDTH, + .yres = CONFIG_LPC17_LCD_VHEIGHT, + .nplanes = 1, +}; + +/* This structure describes the single, simulated color plane */ + +static const struct fb_planeinfo_s g_planeinfo = +{ + .fbmem = (FAR void *)LCD_VRAM_BASE, + .fblen = FB_SIZE, + .stride = FB_WIDTH, + .bpp = CONFIG_LPC17_LCD_BPP, +}; + +/* Current cursor position */ + +#ifdef CONFIG_FB_HWCURSOR +static struct fb_cursorpos_s g_cpos; + +/* Current cursor size */ + +#ifdef CONFIG_FB_HWCURSORSIZE +static struct fb_cursorsize_s g_csize; +#endif +#endif + +/* The framebuffer object -- There is no private state information in this simple + * framebuffer simulation. + */ + +struct fb_vtable_s g_fbobject = +{ + .getvideoinfo = lpc17_getvideoinfo, + .getplaneinfo = lpc17_getplaneinfo, +#ifdef CONFIG_FB_CMAP + .getcmap = lpc17_getcmap, + .putcmap = lpc17_putcmap, +#endif +#ifdef CONFIG_FB_HWCURSOR + .getcursor = lpc17_getcursor, + .setcursor = lpc17_setcursor, +#endif +}; + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: lpc17_getvideoinfo + ****************************************************************************/ + +static int lpc17_getvideoinfo(FAR struct fb_vtable_s *vtable, + FAR struct fb_videoinfo_s *vinfo) +{ + dbg("vtable=%p vinfo=%p\n", vtable, vinfo); + if (vtable && vinfo) + { + memcpy(vinfo, &g_videoinfo, sizeof(struct fb_videoinfo_s)); + return OK; + } + + dbg("Returning EINVAL\n"); + return -EINVAL; +} + +/**************************************************************************** + * Name: lpc17_getplaneinfo + ****************************************************************************/ + +static int lpc17_getplaneinfo(FAR struct fb_vtable_s *vtable, int planeno, + FAR struct fb_planeinfo_s *pinfo) +{ + dbg("vtable=%p planeno=%d pinfo=%p\n", vtable, planeno, pinfo); + if (vtable && planeno == 0 && pinfo) + { + memcpy(pinfo, &g_planeinfo, sizeof(struct fb_planeinfo_s)); + return OK; + } + + dbg("Returning EINVAL\n"); + return -EINVAL; +} + +/**************************************************************************** + * Name: lpc17_getcmap + ****************************************************************************/ + +#ifdef CONFIG_FB_CMAP +static int lpc17_getcmap(FAR struct fb_vtable_s *vtable, FAR struct fb_cmap_s *cmap) +{ + int len; + int i; + + dbg("vtable=%p cmap=%p len=%d\n", vtable, cmap, cmap->len); + if (vtable && cmap) + { + for (i = cmap->first, len = 0; i < 256 && len < cmap->len; i++, len++) + { + cmap->red[i] = i; + cmap->green[i] = i; + cmap->blue[i] = i; +#ifdef CONFIG_FB_TRANSPARENCY + cmap->transp[i] = i; +#endif + } + + cmap->len = len; + return OK; + } + + dbg("Returning EINVAL\n"); + return -EINVAL; +} +#endif + +/**************************************************************************** + * Name: lpc17_putcmap + ****************************************************************************/ + +#ifdef CONFIG_FB_CMAP +static int lpc17_putcmap(FAR struct fb_vtable_s *vtable, FAR const struct fb_cmap_s *cmap) +{ + dbg("vtable=%p cmap=%p len=%d\n", vtable, cmap, cmap->len); + if (vtable && cmap) + { + return OK; + } + + dbg("Returning EINVAL\n"); + return -EINVAL; +} +#endif + +/**************************************************************************** + * Name: lpc17_getcursor + ****************************************************************************/ + +#ifdef CONFIG_FB_HWCURSOR +static int lpc17_getcursor(FAR struct fb_vtable_s *vtable, + FAR struct fb_cursorattrib_s *attrib) +{ + dbg("vtable=%p attrib=%p\n", vtable, attrib); + if (vtable && attrib) + { +#ifdef CONFIG_FB_HWCURSORIMAGE + attrib->fmt = FB_FMT; +#endif + dbg("pos: (x=%d, y=%d)\n", g_cpos.x, g_cpos.y); + attrib->pos = g_cpos; +#ifdef CONFIG_FB_HWCURSORSIZE + attrib->mxsize.h = CONFIG_LPC17_LCD_VHEIGHT; + attrib->mxsize.w = CONFIG_LPC17_LCD_HWIDTH; + dbg("size: (h=%d, w=%d)\n", g_csize.h, g_csize.w); + attrib->size = g_csize; +#endif + return OK; + } + + dbg("Returning EINVAL\n"); + return -EINVAL; +} +#endif + +/**************************************************************************** + * Name: lpc17_setcursor + ****************************************************************************/ + +#ifdef CONFIG_FB_HWCURSOR +static int lpc17_setcursor(FAR struct fb_vtable_s *vtable, + FAR struct fb_setcursor_s *setttings) +{ + dbg("vtable=%p setttings=%p\n", vtable, setttings); + if (vtable && setttings) + { + dbg("flags: %02x\n", settings->flags); + if ((flags & FB_CUR_SETPOSITION) != 0) + { + g_cpos = settings->pos; + dbg("pos: (h:%d, w:%d)\n", g_cpos.x, g_cpos.y); + } +#ifdef CONFIG_FB_HWCURSORSIZE + if ((flags & FB_CUR_SETSIZE) != 0) + { + g_csize = settings->size; + dbg("size: (h:%d, w:%d)\n", g_csize.h, g_csize.w); + } +#endif +#ifdef CONFIG_FB_HWCURSORIMAGE + if ((flags & FB_CUR_SETIMAGE) != 0) + { + dbg("image: (h:%d, w:%d) @ %p\n", + settings->img.height, settings->img.width, settings->img.image); + } +#endif + return OK; + } + + dbg("Returning EINVAL\n"); + return -EINVAL; +} +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: lpc17_fbinitialize + * + * Description: + * Initialize the framebuffer video hardware + * + ****************************************************************************/ + +int up_fbinitialize(void) +{ + /* Disable LCD controller */ +#warning "Missing logioc" + + /* Configure pins */ + /* R */ + + lpc17_configgpio(GPIO_LCD_VD0); + lpc17_configgpio(GPIO_LCD_VD1); + lpc17_configgpio(GPIO_LCD_VD2); + lpc17_configgpio(GPIO_LCD_VD3); + lpc17_configgpio(GPIO_LCD_VD4); + lpc17_configgpio(GPIO_LCD_VD5); + lpc17_configgpio(GPIO_LCD_VD6); + lpc17_configgpio(GPIO_LCD_VD7); + + /* G */ + + lpc17_configgpio(GPIO_LCD_VD8); + lpc17_configgpio(GPIO_LCD_VD9); + lpc17_configgpio(GPIO_LCD_VD10); + lpc17_configgpio(GPIO_LCD_VD11); + lpc17_configgpio(GPIO_LCD_VD12); + lpc17_configgpio(GPIO_LCD_VD13); + lpc17_configgpio(GPIO_LCD_VD14); + lpc17_configgpio(GPIO_LCD_VD15); + + /* B */ + + lpc17_configgpio(GPIO_LCD_VD16); + lpc17_configgpio(GPIO_LCD_VD17); + lpc17_configgpio(GPIO_LCD_VD18); + lpc17_configgpio(GPIO_LCD_VD19); + lpc17_configgpio(GPIO_LCD_VD20); + lpc17_configgpio(GPIO_LCD_VD21); + lpc17_configgpio(GPIO_LCD_VD22); + lpc17_configgpio(GPIO_LCD_VD23); + + /* Other pins */ + + lpc17_configgpio(GPIO_LCD_DCLK); + lpc17_configgpio(GPIO_LCD_LP); + lpc17_configgpio(GPIO_LCD_FP); + lpc17_configgpio(GPIO_LCD_ENABM); + lpc17_configgpio(GPIO_LCD_PWR); + + return OK; +} + +/**************************************************************************** + * Name: lpc17_fbgetvplane + * + * Description: + * Return a a reference to the framebuffer object for the specified video + * plane. + * + * Input parameters: + * None + * + * Returned value: + * Reference to the framebuffer object (NULL on failure) + * + ***************************************************************************/ + +FAR struct fb_vtable_s *up_fbgetvplane(int vplane) +{ + if (vplane == 0) + { + return &g_fbobject; + } + else + { + return NULL; + } +} + +/**************************************************************************** + * Name: lpc17_fbinitialize + * + * Description: + * Unitialize the framebuffer support + * + ****************************************************************************/ + +void fb_uninitialize(void) +{ + return OK; +} + |