123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668 |
- /*************************************************************************
- *
- * Used with ICCARM and AARM.
- *
- * (c) Copyright IAR Systems 2008
- *
- * File name : drv_glcd.c
- * Description : Graphical LCD driver
- *
- * History :
- * 1. Date : 6, March 2008
- * Author : Stanimir Bonev
- * Description : Create
- *
- *
- * $Revision: 24636 $
- *
- * @Modify: NXP MCU Application Team - NguyenCao
- * @Date: 04. March. 2011
- **************************************************************************/
- #include <stdio.h>
- #include <stdlib.h>
- #include <assert.h>
- //#include "ConstGlbPtrs.h"
- //#include "Ex_sdram.h"
- #include "drv_glcd.h"
- #include "lpc177x_8x_clkpwr.h"
- #include "lpc177x_8x_pinsel.h"
- //#include "Cursor.h"
- //#include "logo.h"
- //#define MHZ
- #define C_GLCD_CLK_PER_LINE (C_GLCD_H_SIZE + C_GLCD_H_PULSE + C_GLCD_H_FRONT_PORCH + C_GLCD_H_BACK_PORCH)
- #define C_GLCD_LINES_PER_FRAME (C_GLCD_V_SIZE + C_GLCD_V_PULSE + C_GLCD_V_FRONT_PORCH + C_GLCD_V_BACK_PORCH)
- #define C_GLCD_PIX_CLK (C_GLCD_CLK_PER_LINE * C_GLCD_LINES_PER_FRAME)
- //LPC_LCD_TypeDef * const g_pLCD = ((LPC_LCD_TypeDef*) LPC_LCD_BASE);
- //LPC_SC_TypeDef * const g_pSC = ((LPC_SC_TypeDef*) LPC_SC_BASE);
- #define SDRAM_BASE 0xA0000000 /* CS0 */
- #define SDRAM_BASE_ADDR SDRAM_BASE
- #define LCD_VRAM_BASE_ADDR ((unsigned long)SDRAM_BASE_ADDR + 0x00000000)
- #define LCD_CURSOR_BASE_ADDR ((unsigned long)0x20088800)
- static pFontType_t pCurrFont = NULL;
- static LdcPixel_t TextColour;
- static LdcPixel_t TextBackgndColour;
- static unsigned long TextX_Pos = 0;
- static unsigned long TextY_Pos = 0;
- static unsigned long XL_Win = 0;
- static unsigned long YU_Win = 0;
- static unsigned long XR_Win = C_GLCD_H_SIZE-1;
- static unsigned long YD_Win = C_GLCD_V_SIZE-1;
- static unsigned long TabSize = TEXT_DEF_TAB_SIZE;
- static unsigned long WindY_Size, WindX_Size;
- static unsigned long CurrY_Size, CurrX_Size;
- static unsigned long *pWind;
- static unsigned long *pPix;
- /*************************************************************************
- * Function Name: GLCD_Cursor_Cnfg
- * Parameters:
- *
- * Return: none
- *
- * Description: Configure the cursor
- *
- *************************************************************************/
- void GLCD_Cursor_Cfg(int Cfg)
- {
- LPC_LCD->CRSR_CFG = Cfg;
- }
- /*************************************************************************
- * Function Name: GLCD_Cursor_En
- * Parameters: cursor - Cursor Number
- *
- * Return: none
- *
- * Description: Enable Cursor
- *
- *************************************************************************/
- void GLCD_Cursor_En(int cursor)
- {
- LPC_LCD->CRSR_CTRL |= (cursor<<4);
- LPC_LCD->CRSR_CTRL |= 1;
- }
- /*************************************************************************
- * Function Name: GLCD_Cursor_Dis
- * Parameters: None
- *
- * Return: none
- *
- * Description: Disable Cursor
- *
- *************************************************************************/
- void GLCD_Cursor_Dis(int cursor)
- {
- LPC_LCD->CRSR_CTRL &= (1<<0);
- }
- /*************************************************************************
- * Function Name: GLCD_Move_Cursor
- * Parameters: x - cursor x position
- * y - cursor y position
- *
- * Return: none
- *
- * Description: Moves cursor on position (x,y). Negativ values are posible.
- *
- *************************************************************************/
- void GLCD_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);
- }
- }
- /*************************************************************************
- * Function Name: GLCD_Copy_Cursor
- * Parameters: pCursor - pointer to cursor conts image
- * cursor - cursor Number (0,1,2 or 3)
- * for 64x64(size 256) pix cursor always use 0
- * size - cursor size in words
- * Return: none
- *
- * Description: Copy Cursor from const image to LCD RAM image
- *
- *************************************************************************/
- void GLCD_Copy_Cursor (const unsigned long *pCursor, int cursor, int size)
- {
- unsigned long i ;
- unsigned long * pDst = (unsigned long *)LCD_CURSOR_BASE_ADDR;
- pDst += cursor*64;
- for(i = 0; i < size ; i++)
- // *pDst++ = *pCursor++;
- {
- *pDst = *pCursor;
- pDst++;
- pCursor++;
- }
- }
- /*************************************************************************
- * Function Name: GLCD_Init
- * Parameters: const unsigned long *pPain, const unsigned long * pPallete
- *
- * Return: none
- *
- * Description: GLCD controller init
- *
- *************************************************************************/
- void GLCD_Init (void* VRAMBase)
- {
- // unsigned long i;
- // Assign pins
- LPC_IOCON->P2_9 = 0x06; // VD3, R0
- LPC_IOCON->P2_6 = 0x07; // VD4, R1
- LPC_IOCON->P2_7 = 0x07; // VD5, R2
- LPC_IOCON->P4_28 = 0x05; // VD6, R3
- LPC_IOCON->P4_29 = 0x05; // VD7, R4
- LPC_IOCON->P1_20 = 0x07; // VD10, G0
- LPC_IOCON->P1_21 = 0x07; // VD11, G1
- LPC_IOCON->P1_22 = 0x07; // VD12, G2
- LPC_IOCON->P1_23 = 0x07; // VD13, G3
- LPC_IOCON->P1_24 = 0x07; // VD14, G4
- LPC_IOCON->P1_25 = 0x07; // VD15, G5
- LPC_IOCON->P2_13 = 0x07; // VD19, B0
- LPC_IOCON->P1_26 = 0x07; // VD20, B1
- LPC_IOCON->P1_27 = 0x07; // VD21, B2
- LPC_IOCON->P1_28 = 0x07; // VD22, B3
- LPC_IOCON->P1_29 = 0x07; // VD23, B4
- LPC_IOCON->P2_2 = 0x07; // DCLK
- LPC_IOCON->P2_0 = 0x07; // DSIP(power)
- LPC_IOCON->P2_5 = 0x07; // HSYNC
- LPC_IOCON->P2_3 = 0x07; // VSYNC
- LPC_IOCON->P2_4 = 0x07; // DataEn
- // LPC_IOCON->P5_4 = 0x00; // Backlight
- // >>> debug >>>
- // <<< debug <<<
- /*Back light enable*/
- // LPC_GPIO5->DIR = (1<<4);
- // LPC_GPIO5->SET= (5<<4);
- //Turn on LCD clock
- CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCLCD, ENABLE);
- // Disable cursor
- LPC_LCD->CRSR_CTRL &=~(1<<0);
- // disable GLCD controller
- LPC_LCD->CTRL = 0;
- // RGB888
- LPC_LCD->CTRL &= ~(0x07 <<1);
- LPC_LCD->CTRL |= (6<<1);
- // TFT panel
- LPC_LCD->CTRL |= (1<<5);
- // single panel
- LPC_LCD->CTRL &= ~(1<<7);
- // notmal output
- LPC_LCD->CTRL &= ~(1<<8);
- // little endian byte order
- LPC_LCD->CTRL &= ~(1<<9);
- // little endian pix order
- LPC_LCD->CTRL &= ~(1<<10);
- // disable power
- LPC_LCD->CTRL &= ~(1<<11);
- // init pixel clock
- // g_pSC->LCD_CFG = CLKPWR_GetCLK(CLKPWR_CLKTYPE_PER) / ((unsigned long)C_GLCD_PIX_CLK);
- LPC_SC->LCD_CFG = CLKPWR_GetCLK(CLKPWR_CLKTYPE_PER) / ((unsigned long)C_GLCD_PIX_CLK);
- // bypass inrenal clk divider
- LPC_LCD->POL |=(1<<26);
- // clock source for the LCD block is HCLK
- LPC_LCD->POL &= ~(1<<5);
- // LCDFP pin is active LOW and inactive HIGH
- LPC_LCD->POL |= (1<<11);
- // LCDLP pin is active LOW and inactive HIGH
- LPC_LCD->POL |= (1<<12);
- // data is driven out into the LCD on the falling edge
- LPC_LCD->POL &= ~(1<<13);
- // active high
- LPC_LCD->POL &= ~(1<<14);
- LPC_LCD->POL &= ~(0x3FF <<16);
- LPC_LCD->POL |= (C_GLCD_H_SIZE-1)<<16;
- // init Horizontal Timing
- LPC_LCD->TIMH = 0; //reset TIMH before set value
- LPC_LCD->TIMH |= (C_GLCD_H_BACK_PORCH - 1)<<24;
- LPC_LCD->TIMH |= (C_GLCD_H_FRONT_PORCH - 1)<<16;
- LPC_LCD->TIMH |= (C_GLCD_H_PULSE - 1)<<8;
- LPC_LCD->TIMH |= ((C_GLCD_H_SIZE/16) - 1)<<2;
- // init Vertical Timing
- LPC_LCD->TIMV = 0; //reset TIMV value before setting
- LPC_LCD->TIMV |= (C_GLCD_V_BACK_PORCH)<<24;
- LPC_LCD->TIMV |= (C_GLCD_V_FRONT_PORCH)<<16;
- LPC_LCD->TIMV |= (C_GLCD_V_PULSE - 1)<<10;
- LPC_LCD->TIMV |= C_GLCD_V_SIZE - 1;
- // Frame Base Address doubleword aligned
- LPC_LCD->UPBASE = (unsigned long)VRAMBase & ~7UL ;
- LPC_LCD->LPBASE = (unsigned long)VRAMBase & ~7UL ;
- }
- /*************************************************************************
- * Function Name: GLCD_SetPallet
- * Parameters: const unsigned long * pPallete
- *
- * Return: none
- *
- * Description: GLCD init colour pallete
- *
- *************************************************************************/
- void GLCD_SetPallet (const unsigned long * pPallete)
- {
- unsigned long i;
- unsigned long * pDst = (unsigned long *)LPC_LCD->PAL;
- // //assert(pPallete);
- for (i = 0; i < 128; i++)
- {
- *pDst++ = *pPallete++;
- }
- }
- /*************************************************************************
- * Function Name: GLCD_Ctrl
- * Parameters: Bool bEna
- *
- * Return: none
- *
- * Description: GLCD enable disabe sequence
- *
- *************************************************************************/
- void GLCD_Ctrl (Bool bEna)
- {
- volatile unsigned long i;
- if (bEna)
- {
- // LCD_CTRL_bit.LcdEn = 1;
- LPC_LCD->CTRL |= (1<<0);
- for(i = C_GLCD_PWR_ENA_DIS_DLY; i; i--);
- // LCD_CTRL_bit.LcdPwr= 1; // enable power
- LPC_LCD->CTRL |= (1<<11);
- }
- else
- {
- // LCD_CTRL_bit.LcdPwr= 0; // disable power
- LPC_LCD->CTRL &= ~(1<<11);
- for(i = C_GLCD_PWR_ENA_DIS_DLY; i; i--);
- // LCD_CTRL_bit.LcdEn = 0;
- LPC_LCD->CTRL &= ~(1<<0);
- }
- }
- /*************************************************************************
- * Function Name: GLCD_SetFont
- * Parameters: pFontType_t pFont, LdcPixel_t Color
- * LdcPixel_t BackgndColor
- *
- * Return: none
- *
- * Description: Set current font, font color and background color
- *
- *************************************************************************/
- void GLCD_SetFont(pFontType_t pFont, LdcPixel_t Color, LdcPixel_t BackgndColor)
- {
- pCurrFont = pFont;
- TextColour = Color;
- TextBackgndColour = BackgndColor;
- }
- /*************************************************************************
- * Function Name: GLCD_SetWindow
- * Parameters: unsigned long X_Left, unsigned long Y_Up,
- * unsigned long X_Right, unsigned long Y_Down
- *
- * Return: none
- *
- * Description: Set draw window XY coordinate in pixels
- *
- *************************************************************************/
- void GLCD_SetWindow(unsigned long X_Left, unsigned long Y_Up,
- unsigned long X_Right, unsigned long Y_Down)
- {
- // //assert(X_Right < C_GLCD_H_SIZE);
- // //assert(Y_Down < C_GLCD_V_SIZE);
- // //assert(X_Left < X_Right);
- //assert(Y_Up < Y_Down);
- XL_Win = X_Left;
- YU_Win = Y_Up;
- XR_Win = X_Right;
- YD_Win = Y_Down;
- }
- /*************************************************************************
- * Function Name: GLCD_TextSetPos
- * Parameters: unsigned long X_UpLeft, unsigned long Y_UpLeft,
- * unsigned long X_DownLeft, unsigned long Y_DownLeft
- *
- * Return: none
- *
- * Description: Set text X,Y coordinate in characters
- *
- *************************************************************************/
- void GLCD_TextSetPos(unsigned long X, unsigned long Y)
- {
- TextX_Pos = X;
- TextY_Pos = Y;
- }
- /*************************************************************************
- * Function Name: GLCD_TextSetTabSize
- * Parameters: unsigned long Size
- *
- * Return: none
- *
- * Description: Set text tab size in characters
- *
- *************************************************************************/
- void GLCD_TextSetTabSize(unsigned long Size)
- {
- TabSize = Size;
- }
- /*************************************************************************
- * Function Name: LCD_SET_WINDOW
- * Parameters: int c
- *
- * Return: none
- *
- * Description: Put char function
- *
- *************************************************************************/
- static
- void LCD_SET_WINDOW (unsigned long X_Left, unsigned long X_Right,
- unsigned long Y_Up, unsigned long Y_Down)
- {
- pPix = pWind = ((unsigned long *)LCD_VRAM_BASE_ADDR) + X_Left + (Y_Up*C_GLCD_H_SIZE);
- WindX_Size = X_Right - X_Left;
- WindY_Size = Y_Down - Y_Up;
- CurrX_Size = CurrY_Size = 0;
- }
- /*************************************************************************
- * Function Name: LCD_SET_WINDOW
- * Parameters: int c
- *
- * Return: none
- *
- * Description: Put char function
- *
- *************************************************************************/
- static
- void LCD_WRITE_PIXEL (unsigned long Pixel)
- {
- *pPix++ = Pixel;
- if (++CurrX_Size > WindX_Size)
- {
- CurrX_Size = 0;
- if(++CurrY_Size > WindY_Size)
- {
- CurrY_Size = 0;
- }
- pPix = pWind + CurrY_Size * C_GLCD_H_SIZE;
- }
- }
- /*************************************************************************
- * Function Name: GLCD_TextCalcWindow
- * Parameters: unsigned long * pXL, unsigned long * pXR,
- * unsigned long * pYU, unsigned long * pYD,
- * unsigned long * pH_Size, unsigned long * pV_Size
- *
- * Return: Bool
- * FALSE - out of window coordinate aren't valid
- * TRUE - the returned coordinate are valid
- *
- * Description: Calculate character window
- *
- *************************************************************************/
- static
- Bool GLCD_TextCalcWindow (unsigned long * pXL, unsigned long * pXR,
- unsigned long * pYU, unsigned long * pYD,
- unsigned long * pH_Size, unsigned long * pV_Size)
- {
- *pH_Size = pCurrFont->H_Size;
- *pV_Size = pCurrFont->V_Size;
- *pXL = XL_Win + (TextX_Pos*pCurrFont->H_Size);
- if(*pXL > XR_Win)
- {
- return(FALSE);
- }
- *pYU = YU_Win + (TextY_Pos*pCurrFont->V_Size);
- if(*pYU > YD_Win)
- {
- return(FALSE);
- }
- *pXR = XL_Win + ((TextX_Pos+1)*pCurrFont->H_Size) - 1;
- if(*pXR > XR_Win)
- {
- *pH_Size -= *pXR - XR_Win;
- *pXR = XR_Win;
- }
- *pYD = YU_Win + ((TextY_Pos+1)*pCurrFont->V_Size) - 1;
- if(*pYD > YD_Win)
- {
- *pV_Size -= *pYD - YD_Win;
- *pYD = YD_Win;
- }
- return(TRUE);
- }
- /*************************************************************************
- * Function Name: putchar
- * Parameters: int c
- *
- * Return: none
- *
- * Description: Put char function
- *
- *************************************************************************/
- int _putchar (int c)
- {
- uint8_t *pSrc;
- unsigned long H_Line;
- unsigned long xl,xr,yu,yd,Temp,V_Size, H_Size, SrcInc = 1;
- unsigned long WhiteSpaceNumb;
- unsigned long i, j, k;
- if(pCurrFont == NULL)
- {
- return(EOF);
- }
- H_Line = (pCurrFont->H_Size / 8) + ((pCurrFont->H_Size % 8)?1:0);
- switch(c)
- {
- case '\n': // go to begin of next line (NewLine)
- ++TextY_Pos;
- break;
- case '\r': // go to begin of this line (Carriage Return)
- // clear from current position to end of line
- while(GLCD_TextCalcWindow(&xl,&xr,&yu,&yd,&H_Size,&V_Size))
- {
- LCD_SET_WINDOW(xl,xr,yu,yd);
- for(i = 0; i < V_Size; ++i)
- {
- for(j = 0; j < H_Size; ++j)
- {
- LCD_WRITE_PIXEL(TextBackgndColour);
- }
- }
- ++TextX_Pos;
- }
- TextX_Pos = 0;
- break;
- case '\b': // go back one position (BackSpace)
- if(TextX_Pos)
- {
- --TextX_Pos;
- // del current position
- if(GLCD_TextCalcWindow(&xl,&xr,&yu,&yd,&H_Size,&V_Size))
- {
- LCD_SET_WINDOW(xl,xr,yu,yd);
- for(i = 0; i < V_Size; ++i)
- {
- for(j = 0; j < H_Size; ++j)
- {
- LCD_WRITE_PIXEL(TextBackgndColour);
- }
- }
- }
- }
- break;
- case '\t': // go to next Horizontal Tab stop
- WhiteSpaceNumb = TabSize - (TextX_Pos%TabSize);
- for(k = 0; k < WhiteSpaceNumb; ++k)
- {
- LCD_SET_WINDOW(xl,xr,yu,yd);
- if(GLCD_TextCalcWindow(&xl,&xr,&yu,&yd,&H_Size,&V_Size))
- {
- for(i = 0; i < V_Size; ++i)
- {
- for(j = 0; j < H_Size; ++j)
- {
- LCD_WRITE_PIXEL(TextBackgndColour);
- }
- }
- ++TextX_Pos;
- }
- else
- {
- break;
- }
- }
- break;
- case '\f': // go to top of page (Form Feed)
- // clear entire window
- H_Size = XR_Win - XL_Win;
- V_Size = YD_Win - YU_Win;
- // set character window X left, Y right
- LCD_SET_WINDOW(XL_Win,XR_Win,YU_Win,YD_Win);
- // Fill window with background font color
- for(i = 0; i <= V_Size; ++i)
- {
- for(j = 0; j <= H_Size; ++j)
- {
- LCD_WRITE_PIXEL(TextBackgndColour);
- }
- }
- TextX_Pos = TextY_Pos = 0;
- break;
- case '\a': // signal an alert (BELl)
- TEXT_BEL1_FUNC();
- break;
- default:
- // Calculate the current character base address from stream
- // and the character position
- if((c < pCurrFont->CharacterOffset) &&
- (c >= pCurrFont->CharactersNuber))
- {
- c = 0;
- }
- else
- {
- c -= pCurrFont->CharacterOffset;
- }
- pSrc = pCurrFont->pFontStream + (H_Line * pCurrFont->V_Size * c);
- // Calculate character window and fit it in the text window
- if(GLCD_TextCalcWindow(&xl,&xr,&yu,&yd,&H_Size,&V_Size))
- {
- // set character window X left, Y right
- LCD_SET_WINDOW(xl,xr,yu,yd);
- // Send char data
- for(i = 0; i < V_Size; ++i)
- {
- SrcInc = H_Line;
- for(j = 0; j < H_Size; ++j)
- {
- Temp = (*pSrc & (1UL << (j&0x7)))?TextColour:TextBackgndColour;
- LCD_WRITE_PIXEL(Temp);
- if((j&0x7) == 7)
- {
- ++pSrc;
- --SrcInc;
- }
- }
- // next line of character
- pSrc += SrcInc;
- }
- }
- ++TextX_Pos;
- }
- return(c);
- }
- /*************************************************************************
- * Function Name: GLCD_LoadPic
- * Parameters: unsigned long X_Left, unsigned long Y_Up, Bmp_t * pBmp
- *
- * Return: none
- *
- * Description: Load picture in VRAM memory area
- *
- *************************************************************************/
- void GLCD_LoadPic (unsigned long X_Left, unsigned long Y_Up, Bmp_t * pBmp, unsigned long Mask)
- {
- unsigned long i, j;
- unsigned long * pData = ((unsigned long *) LCD_VRAM_BASE_ADDR) + X_Left + (Y_Up * C_GLCD_H_SIZE);
- unsigned long * pSrc = pBmp->pPicStream;
- unsigned long X_LeftHold;
- for(i = 0; i < pBmp->V_Size; i++)
- {
- if(Y_Up++ >= C_GLCD_V_SIZE)
- {
- break;
- }
- for(j = 0; j < pBmp->H_Size; j++)
- {
- if(X_LeftHold++ >= C_GLCD_H_SIZE)
- {
- pSrc += pBmp->H_Size - j;
- break;
- }
- *(pData+j) = *pSrc++ ^ Mask;
- }
- X_LeftHold = X_Left;
- pData += C_GLCD_H_SIZE;
- }
- }
|