深入理解ARM体系架构(S3C6410)---lcd 显示图片

本系列文章由张同浩编写,转载请注明出处:http://blog.csdn.net/muge0913/article/details/7437153


邮箱:muge0913@sina.com


S3C6410显示控制器包含这样的逻辑电路:从后处理器(POST Processor)或系统内存视频缓冲数据的本地总线传递数据到外部LCD驱动接口电路的逻辑电路。S3C6410包含4种接口:传统的RGB接口,I80接口,标准电视编码接口NTSC/PAL,IT-R BT.601接口。S3C6410显示控制器支持5层图像窗口。层图像窗口支持:various color format,16 level alpha blending, color key, x-y position control, soft scrolling,variable window size。显示控制器支持1BPP~24BPP 色彩的RGB格式和YCbCr格式。显示控制器能满足水平垂直像素,数据宽度, 接口时序, 刷新频率等各种设置需求。显示控制器视频数据接口包括:RGB_VD[23:0],SYS_VD[17:0], TV_OUT。



显示控制器由VSFR,VDMA,VPRCS,VTIME,和视频时钟产生器。VSFR包含一些可编程的寄存器和两个256x25的调色板内存。这些都是用于配置显示控制器的。VDMA专用于显示DMA。它能将一帧的视频数据发送到VPRCS。通过这些特定DMA,这些视频数据可以在CPU不调停的情况下,显示到显示屏上。VPRCS从VDMA接收视频数据,并把接收的数据转化成合适的数据格式,从而再发送到显示器件上(LCD)。VTIME包含一些可编程的逻辑器件以满足不同显示设备的需求,如设置接口时序和刷新频率. 产生:RGB_VSYNC,RGB_HSYNC, RGB_VCLK, RGB_VDEN,SYS_CS1, SYS_CS0等信号控制显示设备。



FIFO在VDMA中。当FIFO为空或部分为空时,VDMA就会请求数据。当内存中的总线仲裁接收到这样的传输请求时,就会从系统内存向内部FIFO传输4/8/16连续的字。每个FIFO有64个字,同时FIFO的使用大小又有数据的传输速率决定。显示控制器有5个FIFO,主要是为了满足5个图像层的使用。在每个屏幕显示模式中,只有一个FIFO被使用。VPRCS通过FIFO提取数据。VPRCS支持层功能,最多5个层。下面的图像显示了数据流从系统总线到输出缓存的过程。



再来看看mini6410中,nec43和显示控制器的连接原理图:



这样我们就可以参考相应的寄存器设置,来实现lcd的图片显示了,

原图片:


我的手机像素极差,,,,


程序如下:

初始化函数:

  1. void LCD_Init(void)   
  2. {  
  3.   
  4.   
  5.     //设置VD0~15  
  6.     rGPICON = 0xaaaaaaaa;  //设置GPI0~15为LCD VD0~15  
  7.     rGPIPUD = 0x00000000;  
  8.   
  9.     //设置VD16~23和HSYNC、VSYNC、VDEN、VCLK  
  10.     rGPJCON = 0x00aaaaaa;  
  11.     rGPJPUD = 0x00000000;  
  12.   
  13.     //LCD寄存器设置  
  14.     rSPCON |= (1<<0);  //设置RGBI/F配置  //rSPCON = rSPCON & ~(0x3) | 1;  
  15.     rMIFPCON &= ~(1<<3);  //设置LCD支路为一般模式  
  16.       
  17.     rVIDCON0 = (0<<29)|(0<<27)|(0<<26)|(0<<18)|(0<<17)|(0<<16)|(9<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(1<<1)|(1<<0);  
  18.     rVIDCON1 = 1<<7;  //1=RGB类型LCD设备在VCLK上升沿得到视频数据  
  19.       
  20.     //设置屏的时序  
  21.     rVIDTCON0 = (0x00<<16)|(0x00<<8)|(0x02<<0);  
  22.     rVIDTCON1 = (0x2d<<16)|(0x04<<8)|(0x06<<0);  
  23.     rVIDTCON2 = (271<<11)|(479<<0);  
  24.   
  25.     //设置窗口格式  
  26.     rWINCON0 = 11<<2;  //设置24BPP  
  27.   
  28.     //设置窗口位置  
  29.     rVIDOSD0A = (0<<11)|(0<<0);  
  30.     rVIDOSD0B = (479<<11)|(271<<0);  
  31.     rVIDOSD0C = (((480*272)&0xffffff)<<0);  //4.3屏幕分辨率480*272  
  32.   
  33.     //设置Window1的开始和结束的缓存地址与地址在内存中的存放地址以及缓存的大小  
  34.     rVIDW00ADD0B0 = ((addr>>24)<<24)|(addr&0xffffff);  
  35.     rVIDW00ADD1B0 = (addr&0xffffff + 480*272);  
  36.     rVIDW00ADD2 = (0<<13)|(480<<0);  
  37.   
  38.     //设置抖动  
  39.     rDITHMODE=(1<<5)|(1<<3)|(1<<1)|(1<<0);  
  40.   
  41.     //开显示  
  42.     rVIDCON0 |= (3<<0);  
  43.     rWINCON0 |= (1<<0);  
  44. }  


画图函数:


  1. void LCD_DrawPixel(unsigned int x, unsigned int y, unsigned int color)  
  2. {  
  3.     if((x<480) && (y<272))  
  4.         LCD_BUFFER[y][x] = color;  
  5. }  
  6.   
  7. void LCD_Paint_Bmp(int x0,int y0,int h,int l,const unsigned char *bmp)  
  8. {  
  9.     int x,y;  
  10.     unsigned int c;  
  11.     int p = 0;  
  12.       
  13.     for( y = y0 ; y < l ; y++ )  
  14.     {  
  15.         for( x = x0 ; x < h ; x++ )  
  16.         {  
  17.             //RGB888  
  18.             c = (bmp[p]) | (bmp[p+1]<<8) | (bmp[p+2]<<16);  
  19.             if ( ( (x0+x) < LCD_XSIZE) && ( (y0+y) <LCD_YSIZE) )  
  20.             LCD_BUFFER[y0+y][x0+x] = c ;  
  21.             p = p+3;    
  22.         }  
  23.     }  
  24. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值