LCDMem.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:16k
源码类别:

uCOS

开发平台:

C/C++

  1. /*
  2. *********************************************************************************************************
  3. *                                                uC/GUI
  4. *                        Universal graphic software for embedded applications
  5. *
  6. *                       (c) Copyright 2002, Micrium Inc., Weston, FL
  7. *                       (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
  8. *
  9. *              礐/GUI is protected by international copyright laws. Knowledge of the
  10. *              source code may not be used to write a similar product. This file may
  11. *              only be used in accordance with a license and should not be redistributed
  12. *              in any way. We appreciate your understanding and fairness.
  13. */
  14. #include <string.h>             /* for memset */
  15. #include <stddef.h>           /* needed for definition of NULL */
  16. #include "LCD_Private.h"      /* private modul definitions & config */
  17. #include "GUI_Private.h"
  18. #include "GUIDebug.h"
  19. #include "LCD_0.h"            /* Defines for first display */
  20. #include "2440addr.h"
  21. #include "2440lib.h"
  22. #include "2440slib.h"
  23. #include "lcdlib.h"
  24. #include "glib.h"
  25. #include "2440lcd.h"
  26. #include "DEMO256.h"
  27. #include "LCDMem.h"
  28. /**************************************************************
  29. The initial and control for 320×240 16Bpp TFT LCD----LCD_LTV350QV-F04
  30. **************************************************************/
  31. #include <stdarg.h>
  32. #include <string.h>
  33. #include <stdlib.h>
  34. #include <stdio.h>
  35. #include <ctype.h>
  36. #include "option.h"
  37. #include "2440addr.h"
  38. #include "2440lib.h"
  39. #include "2440slib.h" 
  40. #include "lcd.h"
  41. #define MVAL (13)
  42. #define MVAL_USED  (0) //0=each frame   1=rate by MVAL
  43. #define INVVDEN (1) //0=normal       1=inverted
  44. #define BSWP (0) //Byte swap control
  45. #define HWSWP (1) //Half word swap control
  46. #define M5D(n) ((n) & 0x1fffff) // To get lower 21bits
  47. //TFT 240320
  48. #define LCD_TFT_XSIZE  (240)
  49. #define LCD_TFT_YSIZE  (320)
  50. #define SCR_XSIZE_TFT  (240)
  51. #define SCR_YSIZE_TFT  (320)
  52. //TFT240320
  53. #define HOZVAL_TFT (LCD_TFT_XSIZE-1)
  54. #define LINEVAL_TFT (LCD_TFT_YSIZE-1)
  55. //Timing parameter for LCD LQ035Q7DB02
  56. #define VBPD (1) //垂直同步信号的后肩
  57. #define VFPD (5) //垂直同步信号的前肩
  58. #define VSPW (1) //垂直同步信号的脉宽
  59. #define HBPD (35) //水平同步信号的后肩
  60. #define HFPD (19) //水平同步信号的前肩
  61. #define HSPW (5) //水平同步信号的脉宽
  62. #define CLKVAL_TFT (4) 
  63. // GPB1/TOUT1 for Backlight control(PWM)
  64. #define GPB1_TO_OUT()   (rGPBUP &= 0xfffd, rGPBCON &= 0xfffffff3, rGPBCON |= 0x00000004)
  65. #define GPB1_TO_1()     (rGPBDAT |= 0x0002)
  66. #define GPB1_TO_0()     (rGPBDAT &= 0xfffd)
  67. //extern void Uart_Printf(char *f, ...) ;
  68. extern unsigned char __CHS[];
  69. extern unsigned char __VGA[];
  70. volatile static unsigned short LCD_BUFFER[SCR_YSIZE_TFT][SCR_XSIZE_TFT];
  71. #ifndef  LCD_BUSWIDTH
  72. #define  LCD_BUSWIDTH   16
  73. #endif 
  74. #define BKCOLOR LCD_BKCOLORINDEX
  75. #define   COLOR LCD_COLORINDEX
  76. static void  _DrawBitLine1BPP(int x, int y, U8 const*p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) {
  77.   LCD_PIXELINDEX Index0 = *(pTrans+0);
  78.   LCD_PIXELINDEX Index1 = *(pTrans+1);
  79.   x += Diff;
  80.   switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) {
  81.     case 0:
  82.       do {
  83.         LCD_L0_SetPixelIndex(x++, y, (*p & (0x80 >> Diff)) ? Index1 : Index0);
  84. if (++Diff == 8) {
  85.                Diff = 0;
  86.   p++;
  87.         }
  88.   } while (--xsize);
  89.       break;
  90.     case LCD_DRAWMODE_TRANS:
  91.       do {
  92.       if (*p & (0x80 >> Diff))
  93.           LCD_L0_SetPixelIndex(x, y, Index1);
  94.            x++;
  95.   if (++Diff == 8) {
  96.                         Diff = 0;
  97.    p++;
  98.   }
  99.   } while (--xsize);
  100.       break;
  101.     case LCD_DRAWMODE_XOR:;
  102.       do {
  103.      if (*p & (0x80 >> Diff)) {
  104.           int Pixel = LCD_L0_GetPixelIndex(x, y);
  105.           LCD_L0_SetPixelIndex(x, y, LCD_NUM_COLORS - 1 - Pixel);
  106.               }
  107.                 x++;
  108.   if (++Diff == 8) {
  109.                       Diff = 0;
  110.  p++;
  111.   }
  112.   } while (--xsize);
  113.       break;
  114. }
  115. }
  116. /*********************************************
  117. *
  118. *       Draw Bitmap 2 BPP
  119. *
  120. **********************************************
  121. */
  122. #if (LCD_MAX_LOG_COLORS > 2)
  123. static void  _DrawBitLine2BPP(int x, int y, U8 const * p, int Diff, int xsize, const LCD_PIXELINDEX * pTrans) {
  124.   LCD_PIXELINDEX Pixels = *p;
  125.   int CurrentPixel = Diff;
  126.   x += Diff;
  127.   switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) {
  128.     case 0:
  129.       do {
  130.         int Shift = (3 - CurrentPixel) << 1;
  131.         int Index = (Pixels & (0xC0 >> (6 - Shift))) >> Shift;
  132.         LCD_PIXELINDEX PixelIndex = *(pTrans + Index);
  133.         LCD_L0_SetPixelIndex(x++, y, PixelIndex);
  134.         if (++CurrentPixel == 4) {
  135.           CurrentPixel = 0;
  136.           Pixels = *(++p);
  137.         }
  138.   } while (--xsize);
  139.       break;
  140.     case LCD_DRAWMODE_TRANS:
  141.       do {
  142.         int Shift = (3 - CurrentPixel) << 1;
  143.         int Index = (Pixels & (0xC0 >> (6 - Shift))) >> Shift;
  144.         if (Index) {
  145.           LCD_PIXELINDEX PixelIndex = *(pTrans + Index);
  146.           LCD_L0_SetPixelIndex(x, y, PixelIndex);
  147.         }
  148.         x++;
  149.         if (++CurrentPixel == 4) {
  150.           CurrentPixel = 0;
  151.           Pixels = *(++p);
  152.         }
  153.   } while (--xsize);
  154.       break;
  155.   }
  156. }
  157. #endif
  158. /*********************************************
  159. *
  160. *       Draw Bitmap 4 BPP
  161. *
  162. **********************************************
  163. */
  164. #if (LCD_MAX_LOG_COLORS > 4)
  165. static void  _DrawBitLine4BPP(int x, int y, U8 const * p, int Diff, int xsize, const LCD_PIXELINDEX * pTrans) {
  166.   LCD_PIXELINDEX Pixels = *p;
  167.   int CurrentPixel = Diff;
  168.   switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) {
  169.     case 0:
  170.       do {
  171.         int Shift = (1 - CurrentPixel) << 2;
  172.         int Index = (Pixels & (0xF0 >> (4 - Shift))) >> Shift;
  173.         LCD_PIXELINDEX PixelIndex = *(pTrans + Index);
  174.         LCD_L0_SetPixelIndex(x++, y, PixelIndex);
  175.         if (++CurrentPixel == 2) {
  176.           CurrentPixel = 0;
  177.           Pixels = *(++p);
  178.         }
  179.   } while (--xsize);
  180.       break;
  181.     case LCD_DRAWMODE_TRANS:
  182.       do {
  183.         int Shift = (1 - CurrentPixel) << 2;
  184.         int Index = (Pixels & (0xF0 >> (4 - Shift))) >> Shift;
  185.         if (Index) {
  186.           LCD_PIXELINDEX PixelIndex = *(pTrans + Index);
  187.           LCD_L0_SetPixelIndex(x, y, PixelIndex);
  188.         }
  189.         x++;
  190.         if (++CurrentPixel == 2) {
  191.           CurrentPixel = 0;
  192.           Pixels = *(++p);
  193.         }
  194.   } while (--xsize);
  195.       break;
  196.   }
  197. }
  198. #endif
  199. /*********************************************
  200. *
  201. *       Draw Bitmap 8 BPP
  202. *
  203. **********************************************
  204. */
  205. #if (LCD_MAX_LOG_COLORS > 16)
  206. static void  _DrawBitLine8BPP(int x, int y, U8 const * p, int xsize, const LCD_PIXELINDEX * pTrans) {
  207.   LCD_PIXELINDEX Pixel;
  208.   switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) {
  209.     case 0:
  210.       if (pTrans) {
  211.         for (; xsize > 0; xsize--, x++, p++) {
  212.           Pixel = *p;
  213.           LCD_L0_SetPixelIndex(x, y, *(pTrans + Pixel));
  214.         }
  215.       } else {
  216.         for (; xsize > 0; xsize--, x++, p++) {
  217.           LCD_L0_SetPixelIndex(x, y, *p);
  218.         }
  219.       }
  220.       break;
  221.     case LCD_DRAWMODE_TRANS:
  222.       if (pTrans) {
  223.         for (; xsize > 0; xsize--, x++, p++) {
  224.           Pixel = *p;
  225.           if (Pixel) {
  226.             LCD_L0_SetPixelIndex(x, y, *(pTrans + Pixel));
  227.           }
  228.         }
  229.       } else {
  230.         for (; xsize > 0; xsize--, x++, p++) {
  231.           Pixel = *p;
  232.           if (Pixel) {
  233.             LCD_L0_SetPixelIndex(x, y, Pixel);
  234.           }
  235.         }
  236.       }
  237.       break;
  238.   }
  239. }
  240. #endif
  241. /*********************************************
  242. *
  243. *       Draw Bitmap 16 BPP
  244. *
  245. **********************************************
  246. */
  247. #if (LCD_BITSPERPIXEL > 8)
  248. static void  DrawBitLine16BPP(int x, int y, U16 const * p, int xsize, const LCD_PIXELINDEX * pTrans) {
  249.   LCD_PIXELINDEX pixel;
  250.   if ((GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) == 0) {
  251.     if (pTrans) {
  252.       for (; xsize > 0; xsize--, x++, p++) {
  253.         pixel = *p;
  254.         LCD_L0_SetPixelIndex(x, y, *(pTrans + pixel));
  255.       }
  256.     } else {
  257.       for (;xsize > 0; xsize--, x++, p++) {
  258.         LCD_L0_SetPixelIndex(x, y, *p);
  259.       }
  260.     }
  261.   } else {
  262.     if (pTrans) {
  263.       for (; xsize > 0; xsize--, x++, p++) {
  264.         pixel = *p;
  265.         if (pixel) {
  266.           LCD_L0_SetPixelIndex(x, y, *(pTrans + pixel));
  267.         }
  268.       }
  269.     } else {
  270.       for (; xsize > 0; xsize--, x++, p++) {
  271.         pixel = *p;
  272.         if (pixel) {
  273.           LCD_L0_SetPixelIndex(x, y, pixel);
  274.         }
  275.       }
  276.     }
  277.   }
  278. }
  279. #endif
  280. /*********************************************************************
  281. *
  282. *       Exported functions
  283. *
  284. **********************************************************************
  285. */
  286. /*********************************************
  287. *
  288. *       LCD_L0_SetPixelIndex
  289. *
  290. **********************************************
  291. Purpose:
  292.   Sets the index of the given pixel. The upper layers of emWin
  293.   calling this routine make sure that the coordinates are in range, so
  294.   that no check on the parameters needs to be performed.
  295. */
  296. void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex) 
  297. {
  298. #if 0
  299. U32 tempC1,tempC2;
  300.     tempC1 = (PixelIndex & 0xff0000)<<3;
  301.     tempC2 = (PixelIndex & 0x00ff00)<<2;
  302.     LCD_BUFFER[y][x>>1] = tempC1 | tempC2 | (PixelIndex << 3);
  303. #endif
  304. LCD_BUFFER[y][x] = PixelIndex;
  305. }
  306. /*********************************************
  307. *
  308. *       LCD_L0_GetPixelIndex
  309. *
  310. **********************************************
  311. Purpose:
  312.   Returns the index of the given pixel. The upper layers of emWin
  313.   calling this routine make sure that the coordinates are in range, so
  314.   that no check on the parameters needs to be performed.
  315. */
  316. unsigned int LCD_L0_GetPixelIndex(int x, int y) 
  317. {
  318. #if 0
  319. unsigned int tempC,tempC1,tempC2;
  320.     tempC1 = (LCD_BUFFER[y][x>>1] & 0xff0000)>>3;
  321.     tempC2 = (LCD_BUFFER[y][x>>1] & 0x00ff00)>>2;
  322.     tempC =  tempC1 | tempC2 | ((LCD_BUFFER[y][x>>1] & 0x0000ff)>>3);
  323.   return( tempC );
  324. #endif
  325. return LCD_BUFFER[y][x];
  326. }
  327. /*********************************************
  328. *
  329. *       LCD_L0_XorPixel
  330. *
  331. **********************************************
  332. */
  333. void LCD_L0_XorPixel(int x, int y) {
  334.   LCD_PIXELINDEX PixelIndex = LCD_L0_GetPixelIndex(x, y);
  335.   LCD_L0_SetPixelIndex(x, y, LCD_NUM_COLORS - PixelIndex - 1);
  336. }
  337. /*********************************************
  338. *
  339. *       LCD_L0_DrawHLine
  340. *
  341. **********************************************
  342. */
  343. void LCD_L0_DrawHLine  (int x0, int y,  int x1) {
  344.   if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR)
  345.   {
  346.     for (; x0 <= x1; x0++) 
  347. {
  348.       LCD_L0_XorPixel(x0, y);
  349.     }
  350.   } 
  351.   else
  352.   {
  353.     for (; x0 <= x1; x0++) 
  354. {
  355.        LCD_L0_SetPixelIndex(x0, y, LCD_COLORINDEX);
  356.     }
  357.   }
  358. }
  359. /*********************************************
  360. *
  361. *       LCD_L0_DrawVLine
  362. *
  363. **********************************************
  364. */
  365. void LCD_L0_DrawVLine  (int x, int y0,  int y1) {
  366.   if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  367.     for (; y0 <= y1; y0++) {
  368.       LCD_L0_XorPixel(x, y0);
  369.     }
  370.   } else {
  371.     for (; y0 <= y1; y0++) {
  372.       LCD_L0_SetPixelIndex(x, y0, LCD_COLORINDEX);
  373.     }
  374.   }
  375. }
  376. /*********************************************
  377. *
  378. *       LCD_L0_FillRect
  379. *
  380. **********************************************
  381. */
  382. void LCD_L0_FillRect(int x0, int y0, int x1, int y1) {
  383.   for (; y0 <= y1; y0++) {
  384.     LCD_L0_DrawHLine(x0, y0, x1);
  385.   }
  386. }
  387. /*********************************************
  388. *
  389. *       LCD_L0_DrawBitmap
  390. *
  391. **********************************************
  392. */
  393. void LCD_L0_DrawBitmap(int x0, int y0,
  394.                        int xsize, int ysize,
  395.                        int BitsPerPixel, 
  396.                        int BytesPerLine,
  397.                        const U8* pData, int Diff,
  398.                        const LCD_PIXELINDEX* pTrans)
  399. {
  400.   int i;
  401.   /* Use _DrawBitLineXBPP */
  402.   for (i=0; i<ysize; i++) {
  403.     switch (BitsPerPixel) {
  404.     case 1:
  405.       _DrawBitLine1BPP(x0, i + y0, pData, Diff, xsize, pTrans);
  406.       break;
  407.       case 2:
  408.         _DrawBitLine2BPP(x0, i + y0, pData, Diff, xsize, pTrans);
  409.         break;
  410.       case 4:
  411.         _DrawBitLine4BPP(x0, i + y0, pData, Diff, xsize, pTrans);
  412.         break;
  413.       case 8:
  414.         _DrawBitLine8BPP(x0, i + y0, pData, xsize, pTrans);
  415.         break;
  416.       case 16:
  417.         DrawBitLine16BPP(x0, i + y0, (const U16 *)pData, xsize, pTrans);
  418.         break;
  419.     }
  420.     pData += BytesPerLine;
  421.   }
  422. }
  423. /*********************************************
  424. *
  425. *       LCD_L0_SetOrg
  426. *
  427. **********************************************
  428. */
  429. void LCD_L0_SetOrg(int x, int y) {
  430.   GUI_USE_PARA(x);
  431.   GUI_USE_PARA(y);
  432. }
  433. /*********************************************
  434. *
  435. *       LCD_On / LCD_Off
  436. *
  437. **********************************************
  438. */
  439. void LCD_On (void) 
  440. {
  441. }
  442. void LCD_Off (void) 
  443. {
  444. }
  445. /*********************************************
  446. *
  447. *       LCD_L0_Init
  448. *
  449. **********************************************
  450. Purpose:
  451.   Initialises the LCD-controller.
  452. */
  453. #if 0
  454. int  LCD_L0_Init(void) 
  455. {
  456. U16 mode = MODE_TFT_16BIT_240320;
  457.    Lcd_Port_Init();
  458. Lcd_Init(mode);
  459. Glib_Init(mode);
  460. Select_Tcon();
  461. Lcd_PowerEnable(0, 1);
  462. Lcd_EnvidOnOff(1);
  463. Glib_ClearScr(0, mode);
  464.   return 0;
  465. }
  466. #endif
  467. void  LCD_L0_ReInit(void) {
  468.   LCD_INIT_CONTROLLER();                     /* macro defined in config */
  469. }
  470. /*********************************************
  471. *
  472. *       LCD_L0_SetLUTEntry
  473. *
  474. **********************************************
  475. */
  476. void LCD_L0_SetLUTEntry(U8 Pos, LCD_COLOR Color) {
  477.   GUI_USE_PARA(Pos);
  478.   GUI_USE_PARA(Color);
  479. }
  480. ///////from here it is myself define
  481. /**************************************************************
  482. 320×240 16Bpp TFT LCD功能模块初始化
  483. **************************************************************/
  484. void Lcd_Init(void )
  485. {
  486.     rGPCUP  = 0x00000000;
  487.  rGPCCON = 0xaaaa02a9; 
  488.  
  489. //    rGPDUP=0xffffffff; // Disable Pull-up register
  490.      rGPDUP  = 0x00000000;
  491.    rGPDCON=0xaaaaaaaa; //Initialize VD[15:8]
  492. rLCDCON1=(CLKVAL_TFT<<8)|(MVAL_USED<<7)|(3<<5)|(12<<1)|0;
  493.      // TFT LCD panel,16bpp TFT,ENVID=off
  494. rLCDCON2=(VBPD<<24)|(LINEVAL_TFT<<14)|(VFPD<<6)|(VSPW);
  495. rLCDCON3=(HBPD<<19)|(HOZVAL_TFT<<8)|(HFPD);
  496. rLCDCON4=(MVAL<<8)|(HSPW);
  497. #if LCD_TYPE==LCD_TYPE_VGA1024x768
  498. rLCDCON5=(1<<11)|(0<<9)|(0<<8)|(0<<3)|(1<<0);
  499. #else
  500.     rLCDCON5 = (1<<11) | (1<<10) | (1<<9) | (1<<8) | (0<<7) | (0<<6)
  501.              | (1<<3)  |(BSWP<<1) | (HWSWP);
  502.              //5:6:5 VCLK posedge BSWP=0,HWSWP=1;
  503. #endif             
  504. rLCDSADDR1=(((U32)LCD_BUFFER>>22)<<21)|M5D((U32)LCD_BUFFER>>1);
  505. rLCDSADDR2=M5D( ((U32)LCD_BUFFER+(SCR_XSIZE_TFT*LCD_TFT_YSIZE*2))>>1 );
  506. rLCDSADDR3=(((SCR_XSIZE_TFT-LCD_TFT_XSIZE)/1)<<11)|(LCD_TFT_XSIZE/1);
  507. rLCDINTMSK|=(3); // MASK LCD Sub Interrupt
  508.     rTCONSEL &= (~7) ;     // Disable LPC3480
  509. rTPAL=0; // Disable Temp Palette
  510. }
  511. /**************************************************************
  512. LCD视频和控制信号输出或者停止,1开启视频输出
  513. **************************************************************/
  514. void Lcd_EnvidOnOff(int onoff)
  515. {
  516.     if(onoff==1)
  517. rLCDCON1|=1; // ENVID=ON
  518.     else
  519. rLCDCON1 =rLCDCON1 & 0x3fffe; // ENVID Off
  520. }
  521. /**************************************************************
  522. 320×240 16Bpp TFT LCD 电源控制引脚使能
  523. **************************************************************/
  524. void Lcd_PowerEnable(int invpwren,int pwren)
  525. {
  526.     //GPG4 is setted as LCD_PWREN
  527.     rGPGUP=rGPGUP&(~(1<<4))|(1<<4); // Pull-up disable
  528.     rGPGCON=rGPGCON&(~(3<<8))|(3<<8); //GPG4=LCD_PWREN
  529.     rGPGDAT = rGPGDAT | (1<<4) ;
  530. // invpwren=pwren;
  531.     //Enable LCD POWER ENABLE Function
  532.     rLCDCON5=rLCDCON5&(~(1<<3))|(pwren<<3);   // PWREN
  533.     rLCDCON5=rLCDCON5&(~(1<<5))|(invpwren<<5);   // INVPWREN
  534. }
  535. /**************************************************************
  536. 240×320 16Bpp TFT LCD全屏填充特定颜色单元或清屏
  537. **************************************************************/
  538. void Lcd_ClearScr( U16 c)
  539. {
  540. unsigned int x,y ;
  541.     for( y = 0 ; y < SCR_YSIZE_TFT_240320 ; y++ )
  542.     {
  543.      for( x = 0 ; x < SCR_XSIZE_TFT_240320 ; x++ )
  544.      {
  545. LCD_BUFFER[y][x] = c ;
  546.      }
  547.     }
  548. }
  549. int LCD_L0_Init(void)
  550. {
  551.     Lcd_Init();
  552. Lcd_PowerEnable(0, 1);
  553.     Lcd_EnvidOnOff(1); //turn on vedio
  554.     Lcd_ClearScr( (0x00<<11) | (0x00<<5) | (0x00) );  
  555. return 0;
  556. }