网站导航: 首页 > 设计参考 > 正文 文章搜索
s3c2410 LCD图片显示
 
文章编号:
081229102513
文章分类: 单片机 ARM
点 击:
...
关 键 词: s3c2410,LCD,图片
文章来源:
网络
摘 要:
最近研究了s3c2410下LCD控制器的相关知识,参考了WinCE下的部分代码,于是写了此程序,用以在LCD上显示图片。本程序可以在LCD上居中显示小于800×480的任意大小的图片。用到的辅助工具就是上篇文章中的RGB分量提取器

        最近研究了s3c2410下LCD控制器的相关知识,主要的参考资料就是 三星s3c2410数据手册(arm920T),英文版,看的不是非常明白,后来参考了WinCE下的部分代码,似有所领悟。于是写了此程序,用以在LCD上显示图片。
本程序可以在LCD上居中显示小于800×480的任意大小的图片。用到的辅助工具就是上篇文章中的RGB分量提取器.
关键模块如下:

1、全局变量的定义:

 
  1. #define DMA_BUFFER_BASE            0xAC000000   
  2. #define DMA_PHYSICAL_BASE        0x35000000  // S3C2410X01 0x30000000   
  3.   
  4. #define FRAMEBUF_BASE                (DMA_BUFFER_BASE + 0x00100000)   
  5. #define FRAMEBUF_DMA_BASE            (DMA_PHYSICAL_BASE + 0x00000000)//0x00100000   
  6.   
  7. #define IOP_BASE      0x56000000 // 0x56000000   
  8.   
  9. typedef struct  {   
  10.     unsigned int  GPACON;        // 00   
  11.     unsigned int  GPADAT;   
  12.     unsigned int  PAD1[2];   
  13.     ...................   
  14. }IOPreg;     
  15.   
  16. // Define LCD type of S3C2400X01   
  17. #define TFT24BPP    3   
  18. #define LCDTYPE     TFT24BPP   // define LCD type as upper definition.   
  19. //   
  20. // Registers : LCD Controller   
  21. //   
  22.   
  23. #define LCD_BASE      0x4D000000 // 0x4D000000   
  24. typedef struct  {   
  25.     unsigned int  LCDCON1;        // 00   
  26.     unsigned int  LCDCON2;        // 04   
  27.     unsigned int  LCDCON3;        // 08   
  28.     .....................   
  29. }LCDreg ;       
  30.   
  31. // LCD register value       
  32.   
  33. #define MODE_TFT_24BIT            (224)   
  34. #define LCD_XSIZE_TFT       (800)       
  35. #define LCD_YSIZE_TFT       (480)   
  36. #define ARRAY_SIZE_TFT_24BIT    (SCR_XSIZE*4*SCR_YSIZE)   
  37. #define HOZVAL_TFT          (LCD_XSIZE_TFT-1)   
  38. #define LINEVAL_TFT         (LCD_YSIZE_TFT-1)   
  39. #define MVAL                (13)   
  40. #define MVAL_USED           (0)   
  41. #define VBPD                ((32-1)&0xff)   
  42. #define VFPD                ((11-1)&0xff)   
  43. #define VSPW                ((2-1) &0x3f)   
  44. #define HBPD                ((88-1)&0x7f)   
  45. #define HFPD                ((40-1)&0xff)   
  46. #define HSPW                ((128-1)&0xff)   
  47. #define CLKVAL_TFT          (1)   
  48. #define M5D(n)              ((n) & 0x1fffff)   
  49.   
  50. U32* pLCDBuffer24=(U32*)FRAMEBUF_DMA_BASE;   
  51. U32* picData;   
  52.   
  53. volatile LCDreg *s2410LCD = (LCDreg *)LCD_BASE;     
  54.   
  55. volatile IOPreg *s2410IOP= (IOPreg *)IOP_BASE;   
  56.   
  57. int nCol = 800;//象素列数   
  58. int nRow = 480;//象素行数   
  59. U32* picDataT=NULL;   
  60.   

 

1、入口函数,其中包括了相应端口、寄存器初始化的入口,aa,bb,cc,dd,ee是可选择的5幅预定义图片的GRB码数组,具体代码如下

 
  1. void lcd_Main(void)   
  2. {   
  3.     char sel;   
  4.     Uart_Printf("Lcd_Driver ");   
  5.        
  6.     lcd_port_init();   
  7.     lcd_regs_init();   
  8.        
  9.     Uart_Printf("select one Picture to show(1 2 3 4 5 0) ");   
  10.        
  11.       while((sel = Uart_Getch()) != 'e')   
  12.       {   
  13.           Uart_Printf("%c ",sel);   
  14.           switch(sel)   
  15.           {   
  16.           case '1':   
  17.              picData = (U32*)aa;break;   
  18.         case '2':   
  19.              picData =(U32*)bb;break;   
  20.         case '3':   
  21.              picData = (U32*)cc;break;   
  22.         case '4':   
  23.              picData = (U32*)dd; break;   
  24.         case '5':   
  25.              picData = (U32*)ee;break;   
  26.         default:   
  27.              Uart_Printf("Input 1 2 3 4 5 0 ");   
  28.          }   
  29.             
  30.          lcd_display();   
  31.             
  32.          Uart_Printf("select one Picture to show(1 2 3 4 5 0) ");   
  33.      }   
  34.     Uart_Printf("Exit");   
  35.     //lcd_close();   
  36. }   
  37.   

 

2、相应端口设置,包括GPC,GPD,GPG的相应位的设置: 

 
  1. void lcd_port_init(void)   
  2. {   
  3.   
  4.     // LCD port initialize.   
  5.     s2410IOP->GPCUP  = 0xFFFFFFFF;   
  6.     s2410IOP->GPCCON = 0xAAAAAAAA;   
  7.   
  8.     s2410IOP->GPDUP  = 0xFFFFFFFF;   
  9.     s2410IOP->GPDCON = 0xAAAAAAAA;   
  10.   
  11.     s2410IOP->GPGCON &= ~(3 << 8);                 /**//* Set LCD_PWREN as output                          */  
  12.     s2410IOP->GPGCON |=  (1 << 8);   
  13.   
  14.     s2410IOP->GPGDAT |=  (1 << 4);                 //* Backlight ON,关键,不然lcd不亮       
  15. }   
  16.   

3、控制寄存器设置:

 
  1. void lcd_regs_init(void)   
  2. {   
  3.   
  4.     #ifdef MODE_TFT_24BIT   
  5.   
  6.         s2410LCD->LCDCON1   =   (1           <<  8) |   //* VCLK = HCLK / ((CLKVAL + 1) * 2) -> About 7 Mhz     
  7.             (MVAL_USED   <<  7) |   //* 0 : Each Frame                                      
  8.             (3           <<  5) |   // TFT LCD Pannel                                      
  9.             (13          <<  1) |   //Y: // 24bpp Mode                                         
  10.             (0           <<  0) ;   // Disable LCD Output                                  
  11.   
  12.         s2410LCD->LCDCON2   =   (VBPD        << 24) |   //* VBPD          :  ((32-1)&0xff)                                 
  13.             (LINEVAL_TFT << 14) |   //* LINEVAL_TFT : 480 - 1                             
  14.             (VFPD        <<  6) |   //* VFPD          : ((11-1)&0xff)                                 
  15.             (VSPW        <<  0) ;   //* VSPW          : ((2-1) &0x3f)                                 
  16.   
  17.         s2410LCD->LCDCON3   =   (HBPD        << 19) |   //* HBPD          :  ((88-1)&0x7f)                                 
  18.             (HOZVAL_TFT  <<  8) |   //* HOZVAL_TFT    : 800 - 1                             
  19.             (HFPD        <<  0) ;   //* HFPD          : ((40-1)&0xff)                                 
  20.   
  21.   
  22.         s2410LCD->LCDCON4   =   (MVAL        <<  8) |   //* MVAL          :  13                                 
  23.             (HSPW        <<  0) ;   //* HSPW          : ((128-1)&0xff)                                 
  24.   
  25.         s2410LCD->LCDCON5   = 0x00000000;   
  26.         /**//*   
  27.             s2410LCD->LCDCON5   =   (0           << 12) |   // BPP24BL       : LSB valid                           
  28.             (0           << 11) |   // FRM565 MODE   : 5:5:5:1 Format                        
  29.             (0           << 10) |   // INVVCLK       : VCLK Falling Edge                   
  30.             (0           <<  9) |   // INVVLINE      : Inverted Polarity                   
  31.             (0           <<  8) |   // INVVFRAME     : Inverted Polarity                   
  32.             (0           <<  7) |   // INVVD         : Normal                              
  33.             (0           <<  6) |   // INVVDEN       : Normal                              
  34.             (0           <<  5) |   // INVPWREN      : Normal                             
  35.             (0           <<  4) |   // INVENDLINE    : Normal                              
  36.             (0           <<  3) |   // PWREN         : Disable PWREN                       
  37.             (0           <<  2) |   // ENLEND        : Disable LEND signal                 
  38.             (0           <<  1) |   // BSWP          : Swap Disable                        
  39.             (0           <<  0) ;   // HWSWP         : Swap Enable                         
  40.             */   
  41.         s2410LCD->LCDSADDR1 = ((FRAMEBUF_DMA_BASE >> 22)     << 21) |   
  42.             ((M5D(FRAMEBUF_DMA_BASE >> 1)) <<  0);   
  43.         //LCDBANK = ((FRAMEBUF_DMA_BASE >> 22)     << 21)   
  44.         //LCDBASEU = ((M5D(FRAMEBUF_DMA_BASE) >> 1) <<  0)   
  45.   
  46.         s2410LCD->LCDSADDR2 = (M5D(FRAMEBUF_DMA_BASE) >> 1) + ( (LCD_XSIZE_TFT*2) + 0 )*(LINEVAL_TFT+1);   
  47.         //LCDBASEL = s2410LCD->LCDSADDR2   
  48.   
  49.         s2410LCD->LCDSADDR3 = (((LCD_XSIZE_TFT - LCD_XSIZE_TFT) / 1) << 11) | (LCD_XSIZE_TFT);   
  50.         //OFFSIZE = (((LCD_XSIZE_TFT - LCD_XSIZE_TFT) / 1) << 11) == 0   
  51.         //PAGEWIDTH = (LCD_XSIZE_TFT)   
  52.   
  53.         s2410LCD->TPAL     = 0x0;   
  54.         s2410LCD->LCDCON1 |= 1;   
  55.   
  56.     #endif   
  57. }   
  58.   

 

4、居中显示图片:

 
  1. void lcd_display(void)   
  2. {   
  3.     int y;   
  4.     int pw, ph;   
  5.     int sw=800, sh=480;   
  6.     U32* pdata;   
  7.     U32* pBt=NULL;   
  8.        
  9.     lcd_clear();   
  10.        
  11.     get_XY();//获得图片的宽与高,以保存在RGB数组的头两个字节。   
  12.     pw = nCol, ph = nRow;   
  13.        
  14.     pBt = pLCDBuffer24 + sw*(sh/2-ph/2) + (sw/2-pw/2);//定位图片显示的起始位置   
  15.        
  16.     pdata = (U32*)picDataT;   
  17.     for(y=0; y<nRow; ++y)   
  18.     ...{       
  19.         memcpy((pBt+800*y),(char*)pdata,nCol*4);//一行一行显示   
  20.         pdata = (U32*)(pdata+nCol);   
  21.     }            
  22.        
  23.     s2410LCD->LCDCON1 |= 0;   
  24.        
  25. }   

 

5、每次显示都要获得图片的宽度和高度,并且清除前面的屏幕,所谓清屏就是显示背景图片(蓝色):

 
  1. void lcd_clear()   
  2. {   
  3.     int y=0;   
  4.     U32* pdata = (U32*)(bgData+2);   
  5.     for(y=0; y<480; ++y)   
  6.     {       
  7.         memcpy((pLCDBuffer24+800*y),(char*)pdata,800*4);   
  8.         pdata = (U32*)(pdata+800);   
  9.     }   
  10. }   
  11.   
  12. void get_XY(void)   
  13. {   
  14.     nCol = picData[0];   
  15.     nRow = picData[1];   
  16.        
  17.     picDataT =(U32*) (picData + 2);   
  18. }   

 

 
相关文章:
S3C2440A驱动RGB接口TFT LCD的研究[图]
s3c2410 Timer工作原理[图]
虚拟SPI时序在TC77与S3C2410通信中的应用[图]
s3c2410 MMU(存储器管理单元)讲解[图]
s3c2410 CACHES,WRITE BUFFER讲解[图]
S3C2410中的脉宽调制定时器(PWM)
S3C2410 中断程序的实现
s3c2410 watchdog详解
s3c2410 中断异常处理[图]
基于ARM9芯片S3C2410a的GPRS数据终端设计
ARM系统中DMA方式在数据采集中的应用[图]
AD7888与S3C2410的SPI接口及Linux下嵌入式驱动的实现[图]
基于s3c2410的ARMer9开发平台的使用
ARM S3C2410硬件手册重点
基于ARM S3C2410与TMS320C6416的接口设计[图]
S3C2410上Jffs2的移植
ARM S3C2410驱动TFT-LCD的研究[图]
MINIGUI在S3C2410开发板的移植
mplayer在S3C2410上的移植
在S3C2410上移植yaffs2文件系统
S3C2410 bootloader(vivi)阅读笔记
S3C2410 LCD 驱动程序移植及GUI程序编写[图]
S3C2410X开发总结及心得
U-Boot在S3C2410开发板上的移植
S3C2410初始化
S3C2410通过IIS总线与音频芯片UDA1380进行通信
在S3C2410上移植bluetooth(蓝牙)
S3c2410软件调试总结
S3C2410上触摸屏的应用实例
S3c2410的触摸屏及模数转换
S3C2410的快速启动技术
基于嵌入式linux和s3c2410平台的视频采集
S3c2410 LCD驱动学习心得
s3c2410移植MPlayer到linux2.6

 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4