123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856 |
- /**********************************************************************
- * $Id$ lpc_lcd.c 2011-10-14
- *//**
- * @file lpc_lcd.c
- * @brief Contains all functions support for LCD firmware library
- * on LPC
- * @version 1.0
- * @date 14. October. 2011
- * @author NXP MCU SW Application Team
- *
- * Copyright(C) 2011, NXP Semiconductor
- * All rights reserved.
- *
- ***********************************************************************
- * Software that is described herein is for illustrative purposes only
- * which provides customers with programming information regarding the
- * products. This software is supplied "AS IS" without any warranties.
- * NXP Semiconductors assumes no responsibility or liability for the
- * use of the software, conveys no license or title under any patent,
- * copyright, or mask work right to the product. NXP Semiconductors
- * reserves the right to make changes in the software without
- * notification. NXP Semiconductors also make no representation or
- * warranty that such application will be suitable for the specified
- * use without further testing or modification.
- * Permission to use, copy, modify, and distribute this software and its
- * documentation is hereby granted, under NXP Semiconductors'
- * relevant copyright in the software, without fee, provided that it
- * is used in conjunction with NXP Semiconductors microcontrollers. This
- * copyright, permission, and disclaimer notice must appear in all copies of
- * this code.
- **********************************************************************/
- #ifdef __BUILD_WITH_EXAMPLE__
- #include "lpc_libcfg.h"
- #else
- #include "lpc_libcfg_default.h"
- #endif /* __BUILD_WITH_EXAMPLE__ */
- #ifdef _LCD
- #include "lpc_clkpwr.h"
- #include "lpc_pinsel.h"
- #include "lpc_gpio.h"
- #include "lpc_lcd.h"
- uint32_t lcd_hsize = 0, lcd_vsize = 0;
- uint32_t lcd_cursor_base_addr = 0;
- uint32_t lcd_cursor_size = 64;
- LCD_Config_Type lcd_config;
- static uint8_t bits_per_pixel[] = { 1, 2, 4, 8, 16, 32, 16, 16 };
- uint32_t rect[1024];
- static void LCD_SetHorizontalTiming(LCD_HConfig_Type* pConfig);
- static void LCD_SetVertialTiming(LCD_VConfig_Type* pConfig);
- static void LCD_SetPolarity(LCD_TYPES lcd_type, LCD_POLARITY_Type* pConfig);
- static void LCD_CtrlSetup(LCD_Config_Type* pConfig);
- /** @addtogroup LCD_Private_Functions LCD Private Function
- * @ingroup LCD
- * @{
- */
- /*********************************************************************//**
- * @brief Init LCD. The input clock is CClk
- *
- * @param[in] pConfig Configuration Information
- *
- * @return LCD_FUNC_OK Execute successfully
- * LCD_FUNC_ERR Error occurred.
- *
- **********************************************************************/
- LCD_RET_CODE LCD_Init (LCD_Config_Type* pConfig)
- {
- uint8_t clkdiv;
- if(pConfig == NULL)
- return LCD_FUNC_ERR;
- if(pConfig->big_endian_byte & !pConfig->big_endian_pixel)
- return LCD_FUNC_ERR;
-
- lcd_config = *pConfig;
-
- // Assign pins
- PINSEL_ConfigPin(0,4,7);
- PINSEL_ConfigPin(0,5,7);
- PINSEL_ConfigPin(0,6,7);
- PINSEL_ConfigPin(0,7,7);
- PINSEL_ConfigPin(0,8,7);
- PINSEL_ConfigPin(0,9,7);
- PINSEL_ConfigPin(1,20,7);
- PINSEL_ConfigPin(1,21,7);
- PINSEL_ConfigPin(1,22,7);
- PINSEL_ConfigPin(1,23,7);
- PINSEL_ConfigPin(1,24,7);
- PINSEL_ConfigPin(1,25,7);
- PINSEL_ConfigPin(1,26,7);
- PINSEL_ConfigPin(1,27,7);
- PINSEL_ConfigPin(1,28,7);
- PINSEL_ConfigPin(1,29,7);
- PINSEL_ConfigPin(2,0,7);
- PINSEL_ConfigPin(2,1,7);
- PINSEL_ConfigPin(2,2,7);
- PINSEL_ConfigPin(2,3,7);
- PINSEL_ConfigPin(2,4,7);
- PINSEL_ConfigPin(2,5,7);
- PINSEL_ConfigPin(2,6,7);
- #ifdef CORE_M4
- PINSEL_ConfigPin(0,10,7);
- #else
- PINSEL_ConfigPin(2,7,7);
- #endif
- PINSEL_ConfigPin(2,8,7);
- PINSEL_ConfigPin(2,9,7);
- PINSEL_ConfigPin(2,11,7);
- PINSEL_ConfigPin(2,12,7);
- PINSEL_ConfigPin(2,13,7);
- PINSEL_ConfigPin(4,28,7);
- PINSEL_ConfigPin(4,29,7);
-
- //Turn on LCD clock
- CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCLCD, ENABLE);
- // Set clock
- LPC_LCD->POL &= ~(0x01 << 5);
- if( pConfig->panel_clk > 0) {
- clkdiv = CLKPWR_GetCLK(CLKPWR_CLKTYPE_CPU) / pConfig->panel_clk - 1;
- LPC_SC->LCD_CFG = clkdiv & 0x1F;
- LPC_LCD->POL |=(1<<26);
- }
- // init Horizontal Timing
- LCD_SetHorizontalTiming(&pConfig->hConfig);
- // Init Vertical Timing
- LCD_SetVertialTiming(&pConfig->vConfig);
- // Set Polarity
- LCD_SetPolarity(pConfig->lcd_type, &pConfig->polarity);
- if(NULL != pConfig->lcd_palette)
- {
- LCD_SetPalette(pConfig->lcd_palette);
- }
- // Set Base address
- LCD_SetBaseAddress(LCD_PANEL_UPPER, pConfig->lcd_panel_upper);
- LCD_SetBaseAddress(LCD_PANEL_LOWER, pConfig->lcd_panel_lower);
- // Setup
- LCD_CtrlSetup(pConfig);
-
- return LCD_FUNC_OK;
-
- }
- /*********************************************************************//**
- * @brief Horizontal Timing Setting
- *
- * @param[in] pConfig Configuration Information
- *
- * @return None.
- *
- **********************************************************************/
- void LCD_SetHorizontalTiming(LCD_HConfig_Type* pConfig)
- {
- LPC_LCD->TIMH = 0; //reset TIMH before set value
- LPC_LCD->TIMH |= ((pConfig->hbp - 1)& 0xFF)<<24;
- LPC_LCD->TIMH |= ((pConfig->hfp - 1)& 0xFF)<<16;
- LPC_LCD->TIMH |= ((pConfig->hsw - 1)& 0xFF)<<8;
- LPC_LCD->TIMH |= ((pConfig->ppl/16 - 1)& 0x3F)<<2;
- lcd_hsize = pConfig->ppl;
- }
- /*********************************************************************//**
- * @brief Vertical Timing Setting
- *
- * @param[in] pConfig Configuration Information
- *
- * @return None.
- *
- **********************************************************************/
- void LCD_SetVertialTiming(LCD_VConfig_Type* pConfig)
- {
- LPC_LCD->TIMV = 0; //reset TIMV value before setting
- LPC_LCD->TIMV |= ((pConfig->vbp)& 0xFF)<<24;
- LPC_LCD->TIMV |= ((pConfig->vfp)& 0xFF)<<16;
- LPC_LCD->TIMV |= ((pConfig->vsw - 1)& 0x3F)<<10;
- LPC_LCD->TIMV |= ((pConfig->lpp - 1)& 0x03FF)<<0;
- lcd_vsize = pConfig->lpp;
- }
- /*********************************************************************//**
- * @brief Polarity Setting
- *
- * @param[in] pConfig Configuration Information
- * @param[in] lcd_type It can be:
- * - LCD_STN_MONOCHROME
- * - LCD_STN_COLOR
- * - LCD_TFT
- *
- * @return None.
- *
- **********************************************************************/
- void LCD_SetPolarity(LCD_TYPES lcd_type, LCD_POLARITY_Type* pConfig)
- {
- // LCDFP pin is active LOW and inactive HIGH
- if(pConfig->invert_vsync)
- LPC_LCD->POL |= (1<<11);
- else
- LPC_LCD->POL &= ~(1<<11);
- // LCDLP pin is active LOW and inactive HIGH
- if(pConfig->invert_hsync)
- LPC_LCD->POL |= (1<<12);
- else
- LPC_LCD->POL &= ~(1<<12);
- // data is driven out into the LCD on the falling edge
- if(pConfig->invert_panel_clock)
- LPC_LCD->POL |= (1<<13);
- else
- LPC_LCD->POL &= ~(1<<13);
-
- // active high
- if(pConfig->active_high) {
- LPC_LCD->POL &= ~(1<<14);
- }
- else
- {
- LPC_LCD->POL |= (1<<14);
- }
- LPC_LCD->POL &= ~(0x3FF <<16);
- LPC_LCD->POL |= (pConfig->cpl - 1)<<16;
- if(lcd_type == LCD_STN_COLOR || lcd_type == LCD_STN_MONOCHROME)
- LPC_LCD->POL |= (pConfig->acb & 0x1F) << 6;
- }
- /*********************************************************************//**
- * @brief Set base address of frame buffer
- *
- * @param[in] panel identify which panel is.
- * @param[in] pAddress base address of the inputted panel.
- *
- * @return None.
- *
- **********************************************************************/
- void LCD_SetBaseAddress(LCD_PANEL panel, uint32_t pAddress)
- {
- // Frame Base Address doubleword aligned
- if(panel == LCD_PANEL_UPPER)
- LPC_LCD->UPBASE = pAddress & ~7UL ;
- else
- LPC_LCD->LPBASE = pAddress & ~7UL ;
- }
- /*********************************************************************//**
- * @brief LCD Setup.
- *
- * @param[in] pConfig Configuration information.
- *
- * @return None.
- *
- **********************************************************************/
- void LCD_CtrlSetup(LCD_Config_Type* pConfig)
- {
- // disable LCD controller
- LPC_LCD->CTRL = 0;
-
- // bpp
- LPC_LCD->CTRL &= ~(0x07 <<1);
- LPC_LCD->CTRL |=((pConfig->lcd_bpp & 0x07)<<1);
- if(pConfig->lcd_type == LCD_TFT) {
- LPC_LCD->CTRL |= (0x01 << 5); // TFT
- }
- else {
- // Color/Mono
- if(pConfig->lcd_type == LCD_STN_COLOR) {
- LPC_LCD->CTRL &= ~ (0x01 << 4); // Color
- }
- else if (pConfig->lcd_type == LCD_STN_MONOCHROME) {
- LPC_LCD->CTRL |= (0x01 << 4); // Mono
- }
- // STN/TFT
- LPC_LCD->CTRL &= ~ (0x01 << 5); // STN
- // Mono4/8
- if(pConfig->lcd_mono8)
- LPC_LCD->CTRL |= (0x01 << 6);
- else
- LPC_LCD->CTRL &= ~(0x01 << 6);
- // Single/dual
- if(pConfig->lcd_dual)
- LPC_LCD->CTRL |= (0x01 << 7);
- else
- LPC_LCD->CTRL &= ~(0x01 << 7);
- }
-
- // notmal output
- if(pConfig->lcd_bgr)
- LPC_LCD->CTRL |= (1<<8); // BGR
- else
- LPC_LCD->CTRL &= ~(1<<8); // RGB
- // Byte order
- if(pConfig->big_endian_byte)
- LPC_LCD->CTRL |= (1<<9);
- else
- LPC_LCD->CTRL &= ~(1<<9);
- // Pixel order
- if(pConfig->big_endian_pixel)
- LPC_LCD->CTRL |= (1<<10);
- else
- LPC_LCD->CTRL &= ~(1<<10);
-
- // disable power
- LPC_LCD->CTRL &= ~(1<<11);
- }
- /*********************************************************************//**
- * @brief Enable/disable LCD Display.
- *
- * @param[in] bEna 0: disable, 1: enable.
- *
- * @return None.
- *
- **********************************************************************/
- void LCD_Enable (Bool bEna)
- {
- volatile uint32_t i;
- if (bEna)
- {
- LPC_LCD->CTRL |= (1<<0);
- for(i = LCD_PWR_ENA_DIS_DLY; i; i--);
- LPC_LCD->CTRL |= (1<<11);
- }
- else
- {
- LPC_LCD->CTRL &= ~(1<<11);
- for(i = LCD_PWR_ENA_DIS_DLY; i; i--);
- LPC_LCD->CTRL &= ~(1<<0);
- }
- }
- /*********************************************************************//**
- * @brief Set palette.
- *
- * @param[in] bEna 0: disable, 1: enable.
- *
- * @return None.
- *
- **********************************************************************/
- void LCD_SetPalette (const uint8_t* pPallete)
- {
- uint32_t i;
- uint32_t size = (0x01 << bits_per_pixel[lcd_config.lcd_bpp])/2 ;
- uint32_t * pDst = (uint32_t *)LPC_LCD->PAL;
- uint32_t * pInput = (uint32_t*) pPallete;
- for (i = 0; i < size; i++)
- {
- *pDst = *pInput;
- pDst++;
- pInput++;
- }
- }
- /*********************************************************************//**
- * @brief Get word offset for the given pixel
- *
- * @param[in] x x position of input pixel
- * @param[in] y y position of input pixel
- *
- * @return Offset
- *
- **********************************************************************/
- uint32_t LCD_GetWordOffset(uint32_t x, uint32_t y)
- {
- uint32_t pixel_num = x + y*lcd_hsize;
- return (pixel_num * bits_per_pixel[lcd_config.lcd_bpp])/32;
- }
- /*********************************************************************//**
- * @brief Get bit offset for the given pixel
- *
- * @param[in] x x position of input pixel
- * @param[in] y y position of input pixel
- *
- * @return Offset
- *
- **********************************************************************/
- uint32_t LCD_GetBitOffset(uint32_t x, uint32_t y)
- {
- uint32_t pixel_num;
- uint32_t ofs;
- pixel_num = x + y*lcd_hsize;
-
- ofs = (pixel_num * bits_per_pixel[lcd_config.lcd_bpp])%32;
-
- if(lcd_config.big_endian_pixel & lcd_config.big_endian_byte)
- {
- ofs = 32 - bits_per_pixel[lcd_config.lcd_bpp] - ofs;
- }
- else if (lcd_config.big_endian_pixel & !lcd_config.big_endian_byte)
- {
- if(bits_per_pixel[lcd_config.lcd_bpp] < 8)
- {
- ofs = (ofs/8)*8 + (8 - (ofs%8)-bits_per_pixel[lcd_config.lcd_bpp]);
- }
- }
- return ofs;
- }
- /*********************************************************************//**
- * @brief Copy pixel values from image buffer to frame buffer.
- *
- * @param[in] panel It can be:
- * - LCD_PANEL_UPPER
- * - LCD_PANEL_LOWER
- * @param[in] pPain point to image buffer.
- *
- * @return None.
- *
- **********************************************************************/
- void LCD_SetImage(LCD_PANEL panel, const uint8_t *pPain)
- {
- volatile uint32_t i;
- uint32_t * pWordDst = NULL;
- uint8_t* pByteDst = NULL;
- uint32_t bytes_num;
- if(panel == LCD_PANEL_UPPER)
- pWordDst = (uint32_t*) LPC_LCD->UPBASE;
- else
- pWordDst = (uint32_t*) LPC_LCD->LPBASE;
- pByteDst = (uint8_t*) pWordDst;
- bytes_num = ((lcd_hsize * lcd_vsize) * bits_per_pixel[lcd_config.lcd_bpp]) /8;
- if (NULL == pPain)
- {
- // clear display memory
- for( i = 0; bytes_num > i; i++)
- {
- *pByteDst++ = 0;
- }
- }
- else
- {
- // set display memory
- for(i = 0; bytes_num > i; i++)
- {
- *pByteDst++ = *pPain++;
- }
- }
- for(i = LCD_PWR_ENA_DIS_DLY; i; i--);
- }
- /*********************************************************************//**
- * @brief Draw a pixel on the given panel.
- *
- * @param[in] panel It can be:
- * - LCD_PANEL_UPPER
- * - LCD_PANEL_LOWER
- * @param[in] X_Left X position.
- * @param[in] Y_Up Y position.
- * @param[in] color Color which is placed to the given pixel.
- *
- * @return None.
- *
- **********************************************************************/
- void LCD_PutPixel (LCD_PANEL panel, uint32_t X_Left, uint32_t Y_Up, LcdPixel_t color)
- {
- uint32_t k;
- uint32_t * pWordData = NULL;
- uint8_t* pByteData = NULL;
- uint32_t bitOffset;
- uint8_t* pByteSrc = (uint8_t*)&color;
- uint8_t bpp = bits_per_pixel[lcd_config.lcd_bpp];
- uint8_t bytes_per_pixel = bpp/8;
- uint32_t start_bit;
-
- if((X_Left >= lcd_hsize)||(Y_Up >= lcd_vsize))
- return;
- if(panel == LCD_PANEL_UPPER)
- pWordData = (uint32_t*) LPC_LCD->UPBASE + LCD_GetWordOffset(X_Left,Y_Up);
- else
- pWordData = (uint32_t*) LPC_LCD->LPBASE + LCD_GetWordOffset(X_Left,Y_Up);
-
- bitOffset = LCD_GetBitOffset(X_Left,Y_Up);
- pByteData = (uint8_t*) pWordData;
- pByteData += bitOffset/8;
-
- start_bit = bitOffset%8;
- if(bpp < 8)
- {
- uint8_t bit_pos = start_bit;
- uint8_t bit_ofs = 0;
- for(bit_ofs = 0;bit_ofs <bpp; bit_ofs++,bit_pos++)
- {
- *pByteData &= ~ (0x01 << bit_pos);
- *pByteData |= ((*pByteSrc >> (k+bit_ofs)) & 0x01) << bit_pos;
- }
- }
- else
- {
- for(k = 0; k < bytes_per_pixel; k++)
- {
- *(pByteData+ k) = *pByteSrc++;
- }
- }
- }
- /*********************************************************************//**
- * @brief Place given image to given position.
- *
- * @param[in] panel It can be:
- * - LCD_PANEL_UPPER
- * - LCD_PANEL_LOWER
- * @param[in] X_Left Start X position.
- * @param[in] Y_Up Start Y position.
- * @param[in] pBmp Image information.
- * @param[in] Mask Mask on pixel values.
- *
- * @return None.
- *
- **********************************************************************/
- void LCD_LoadPic (LCD_PANEL panel, uint32_t X_Left, uint32_t Y_Up,
- Bmp_t * pBmp, uint32_t Mask)
- {
- uint32_t i, j, k, inc;
- uint32_t * pWordData = NULL;
- uint8_t* pByteData = NULL;
- uint32_t bitOffset;
- uint8_t* pByteSrc = (uint8_t*) pBmp->pPicStream;
- uint32_t X_LeftHold = X_Left;
- uint8_t bpp = bits_per_pixel[lcd_config.lcd_bpp];
- uint8_t bytes_per_pixel = bpp/8;
- uint8_t pixels_per_byte = 8/bpp;
- uint32_t hsize, vsize;
- uint32_t start_bit;
- if(pBmp->BytesPP == 0)
- pBmp->BytesPP = bytes_per_pixel;
-
- hsize = pBmp->H_Size;
- vsize = pBmp->V_Size;
- inc = (pixels_per_byte > 0) ? pixels_per_byte:1;
-
- for(i = 0; i < vsize; i++)
- {
- if(panel == LCD_PANEL_UPPER)
- pWordData = (uint32_t*) LPC_LCD->UPBASE + LCD_GetWordOffset(X_Left,Y_Up);
- else
- pWordData = (uint32_t*) LPC_LCD->LPBASE + LCD_GetWordOffset(X_Left,Y_Up);
- bitOffset = LCD_GetBitOffset(X_Left,Y_Up);
- pByteData = (uint8_t*) pWordData;
- pByteData += bitOffset/8;
-
- start_bit = bitOffset%8;
-
- if(pBmp->BytesPP > 0)
- pByteSrc = (uint8_t*) pBmp->pPicStream + i*hsize*pBmp->BytesPP; // storage of each line must be word alignment
- else
- pByteSrc = (uint8_t*) pBmp->pPicStream + (i*hsize*pBmp->BitsPP + 7)/8; // storage of each line must be word alignment
-
- X_LeftHold = X_Left;
- for(j = 0; j <= hsize; j+= inc)
- {
- if((X_LeftHold >= lcd_hsize) || (X_LeftHold - X_Left >= hsize))
- break;
- if(bpp < 8)
- {
- uint8_t bit_pos = start_bit;
- uint8_t bit_ofs = 0;
- for(k = 0; k < 8; k+= bpp)
- {
- for(bit_ofs = 0;bit_ofs <bpp; bit_ofs++,bit_pos++)
- {
- *pByteData &= ~ (0x01 << bit_pos);
- *pByteData |= ((*pByteSrc >> (k+bit_ofs)) & 0x01) << bit_pos;
- }
- if(lcd_config.big_endian_byte && lcd_config.big_endian_pixel)
- {
- if(bit_pos >= bpp*2)
- bit_pos -= bpp*2;
- else
- {
- bit_pos = 8-bpp;
- if((((uint32_t)pByteData)%4) == 0)
- pByteData += 7; // change to next word
- else
- pByteData--; // change to previous byte
- }
- }
- else if( !lcd_config.big_endian_byte && lcd_config.big_endian_pixel)
- {
- if(bit_pos >= bpp*2)
- bit_pos -= bpp*2;
- else
- {
- bit_pos = 8-bpp;
- pByteData++; // change to next byte
- }
- }
- else
- {
- if(bit_pos >= 8)
- {
- bit_pos = 0;
- pByteData++; // change to next byte
- }
-
- }
- X_LeftHold++;
- if((X_LeftHold >= lcd_hsize) ||
- (X_LeftHold - X_Left >= hsize))
- break;
- }
- pByteSrc++;
- continue;
- }
- else
- {
- for(k = 0; k < pBmp->BytesPP; k++)
- {
- *(pByteData+ k) = *pByteSrc++ ^ Mask;
- }
- if(lcd_config.big_endian_byte)
- {
- if((uint32_t)pByteData %4 > 0)
- pByteData -= bytes_per_pixel;
- else
- pByteData += 8 - bytes_per_pixel;
- }
- else
- pByteData+= bytes_per_pixel;
- X_LeftHold++;
- }
- }
- if(Y_Up++ >= lcd_vsize)
- {
- break;
- }
- }
- }
- /*********************************************************************//**
- * @brief Fill a rectangle.
- *
- * @param[in] panel It can be:
- * - LCD_PANEL_UPPER
- * - LCD_PANEL_LOWER
- * @param[in] startx Start X position.
- * @param[in] endy End X position.
- * @param[in] starty Start Y position.
- * @param[in] endy End Y position.
- *
- * @return None.
- *
- **********************************************************************/
- void LCD_FillRect (LCD_PANEL panel, uint32_t startx,uint32_t endx,
- uint32_t starty, uint32_t endy,
- LcdPixel_t color)
- {
- uint32_t x, xs, xe, ys, ye;
- uint8_t bpp, pixels_per_word;
- uint32_t word_val, mask;
- uint32_t max_vsize = 0;
- Bmp_t bitmap;
- uint32_t hsize, vsize;
- bpp = bits_per_pixel[lcd_config.lcd_bpp];
- pixels_per_word = 32/bpp;
- mask = 0;
- for( x = 0; x < bpp; x++)
- mask |= 0x01 << x;
-
- color &= mask;
- word_val = 0;
- for(x = 0; x < pixels_per_word; x++)
- word_val |= color << (x*bpp);
-
- ys = (starty > endy) ? endy : starty;
- ye = (starty > endy) ? starty : endy;
- xs = (startx > endx) ? endx : startx;
- xe = (startx > endx) ? startx : endx;
- bitmap.BitsPP = bpp;
- bitmap.BytesPP = bpp/8;
- hsize = xe - xs + 1;
- bitmap.H_Size = hsize;
- vsize = ye - ys + 1;
- bitmap.pPicStream = (uint8_t*)rect;
- max_vsize = ((1024 * 32)/(hsize*bpp));
- for( x = 0; x < 1024; x++)
- {
- rect[x] = word_val;
- }
-
- while(1)
- {
- if(max_vsize >= vsize)
- {
- bitmap.V_Size = vsize;
- LCD_LoadPic(panel,xs,ys, &bitmap, 0);
- break;
- }
- else {
- bitmap.V_Size = max_vsize;
- vsize -= bitmap.V_Size;
- LCD_LoadPic(panel,xs,ys, &bitmap, 0);
- ys += max_vsize;
- }
- }
-
- }
- /*********************************************************************//**
- * @brief Configure display of cursor.
- *
- * @param[in] pConfig Configuration information.
- *
- * @return None.
- *
- **********************************************************************/
- void LCD_Cursor_Cfg(LCD_Cursor_Config_Type* pConfig)
- {
- if(pConfig->size32) {
- LPC_LCD->CRSR_CFG &= ~(0x01 << 0);
- lcd_cursor_size = 32;
- }
- else {
- LPC_LCD->CRSR_CFG |= (0x01 << 0);
- lcd_cursor_size = 64;
- }
- if(pConfig->framesync)
- LPC_LCD->CRSR_CFG &= ~(0x01 << 1);
- else
- LPC_LCD->CRSR_CFG |= (0x01 << 1);
- lcd_cursor_base_addr = pConfig->baseaddress;
-
- LPC_LCD->CRSR_PAL0 = pConfig->palette[0].Red |
- pConfig->palette[0].Green << 8 |
- pConfig->palette[0].Blue << 16;
- LPC_LCD->CRSR_PAL1 = pConfig->palette[1].Red |
- pConfig->palette[1].Green << 8 |
- pConfig->palette[1].Blue << 16;
- }
- /*********************************************************************//**
- * @brief Enable/disable cursor display.
- *
- * @param[in] enable 0: disable, 1: enable.
- * @param[in] cursor identify which cursor image is used.
- *
- * @return None.
- *
- **********************************************************************/
- void LCD_Cursor_Enable(int enable, int cursor)
- {
- if(enable) {
- LPC_LCD->CRSR_CTRL |= (1<<0);
- LPC_LCD->CRSR_CTRL |= (cursor<<4);
- }
- else {
- LPC_LCD->CRSR_CTRL &= ~(1<<0);
- }
- }
- /*********************************************************************//**
- * @brief move the cursor to the inputted position.
- *
- * @param[in] x Position in x-direction.
- * @param[in] y Position in y-direction.
- *
- * @return None.
- *
- **********************************************************************/
- void LCD_Move_Cursor(int x, int y)
- {
- LPC_LCD->CRSR_CLIP = 0;
- LPC_LCD->CRSR_XY = 0;
- if(0 <= x)
- {//no clipping
- LPC_LCD->CRSR_XY |= (x & 0x3FF);
- }
- else
- {//clip x
- LPC_LCD->CRSR_CLIP |= -x;
- }
- if(0 <= y)
- {//no clipping
- LPC_LCD->CRSR_XY |= (y << 16);
- }
- else
- {//clip y
- LPC_LCD->CRSR_CLIP |= (-y << 8);
- }
- }
- /*********************************************************************//**
- * @brief Set the cursor image.
- *
- * @param[in] pCursor point to cursor image.
- * @param[in] cursor cursor image number. It has no meaning when cursor size is 64x64
- * @param[in] cursor cursor size in words.
- *
- * @return None.
- *
- **********************************************************************/
- void LCD_Cursor_SetImage (const uint32_t *pCursor, int cursor, int size)
- {
- uint32_t i ;
- uint32_t * pDst = (uint32_t *)lcd_cursor_base_addr;
- if(lcd_cursor_size == 32)
- pDst += cursor*GET_CURSOR_IMG_SIZE(lcd_cursor_size);
-
- for(i = 0; i < size ; i++)
- {
- *pDst = *pCursor;
- pDst++;
- pCursor++;
- }
- }
- /**
- * @}
- */
-
- #endif /*_LCD*/
|