0 = 在VCLK下降沿视频数据被取走 1 =在VCLK上升沿视频数据被取走
INVVLINE [9] STN/TFT: 这个位设置行脉冲的极性
0 = Normal 1 = Inverted
INVVFRAME [8] STN/TFT: 这个位设置VFRAME脉冲的极性
0 = Normal 1 = Inverted
INVVD [7] STN/TFT: 这个位设置VD (video data)脉冲的极性
0 = Normal 1 = VD is inverted.
INVPWREN [5] STN/TFT: 这个位设置PWREN信号的极性
0 = Normal 1 = Inverted
BSWP [1] STN/TFT: 字节交换控制位
0 = Swap Disable 1 = Swap Enable
HWSWP [0] STN/TFT: 半字交换控制位
0 = Swap Disable 1 = Swap Enable
表4-6 为LCD的帧缓冲区开始地址寄存器1的的配置说明。
表4-6
28
LCDBANK: [29:21] 指示视频缓冲区在系统存储器的段地址A[30:22]
LCDBANK在视点移动时不能变化, LCD 帧缓冲区应当与4M区域对齐,因此在分配存储区应当注意
LCDBASEU: [20:0]
指示帧缓冲区或在双扫描LCD时的高帧缓冲区的开始地址A[21:1]
注:
1. LCDBANK在ENVID=1时不能变化.
2. 如果LCDBASEU,LCDBASEL在ENVID=1时变化,新的量将在下一帧起作用, 表4-7 为LCD的帧缓冲区开始地址寄存器2的的配置说明。
表4-7
LCDBASEL [20:0] 指示在使用双扫描LCD时的低帧存储区的开始地址A[21:1] 公式如下: LCDBASEL =LCDBASEU + (PAGEWIDTH + OFFSIZE) x (LINEVAL +1)
注:用户通过改变LCDBASEU 和LCDBASEL的值来滚动屏幕,但在帧结束时,不能改变LCDBASEU 和LCDBASEL的值,因为预取下一帧的数据优先于改变帧,如果这时改变帧, 预取的数据将无效和将显示不正确.为了检查LINECNT,中断应当被屏蔽,否则如果在读LINECNT后,任意中断刚好执行,因为ISR的执行,LINECNT的值可能是旧的。
表4-8为LCD的帧缓冲区开始地址寄存器3的的配置说明。它主要是进行虚拟屏幕地址设置。
OFFSIZE: [21:11] 虚拟屏幕偏移量(半字的数量),该值定义前一显示行的
最后
的半字和新的显示一行首先的半字之间的距离
29
PAGEWIDTH: [10:0] 虚拟屏幕宽度(半字的数量),该值定义帧的观察区域的
宽度
注: PAGEWIDTH 和OFFSIZE必须在ENVID = 0时变
表4-8
表4-9为LCD的RGB查找表寄存器3的的配置说明。在这三个寄存器中,我们要设定使用的8种红色,8种绿色,4种蓝色。
30
表4-9
其实,不同红色的差异,是通过时间抖动的算法及帧率控制的方法来实现的。对于绿、蓝也同样。因此,还要设置一下有关抖动模式寄存器。详细请看下面关于初始化S3C2410的LCD控制器的程序。
#define M5D(n) ((n) & 0x1fffff) #define MVAL (13)
#define MVAL_USED (0)
#define MODE_CSTN_8BIT (0x2001) #define LCD_XSIZE_CSTN (320) #define LCD_YSIZE_CSTN (240)
#define SCR_XSIZE_CSTN (LCD_XSIZE_CSTN*2) //虚拟屏幕大小 #define SCR_YSIZE_CSTN (LCD_YSIZE_CSTN*2) //
31
#define HOZVAL_CSTN (LCD_XSIZE_CSTN*3/8-1)// Valid VD data line number is 8.
#define LINEVAL_CSTN (LCD_YSIZE_CSTN-1) #define WLH_CSTN (0) #define WDLY_CSTN (0)
#define LINEBLANK_CSTN (16 &0xff) #define CLKVAL_CSTN (6)
// 130hz @50Mhz,WLH=16hclk,WDLY=16hclk,LINEBLANK=16*8hclk,VD=8 #define LCDFRAMEBUFFER 0x33800000 //_NONCACHE_STARTADDRESS
void LCD_Init(int type) {
switch(type) {
case MODE_CSTN_8BIT:
frameBuffer8Bit=(U32 (*)[SCR_XSIZE_CSTN / 4])LCDFRAMEBUFFER; // Packed Type : The L.C.M of 12 and 32 is 96.
rLCDCON1=(CLKVAL_CSTN<<8)|(MVAL_USED<<7)|(2<<5)|(3<<1)|0; // 8-bit single scan,8bpp CSTN,ENVID=off
rLCDCON2=(0<<24)|(LINEVAL_CSTN<<14)|(0<<6)|0;
rLCDCON3=(WDLY_CSTN<<19)|(HOZVAL_CSTN<<8)|(LINEBLANK_CSTN<<0); rLCDCON4=(MVAL<<8)|(WLH_CSTN<<0); rLCDCON5= 0;
//BPP24BL:x,FRM565:x,INVVCLK:x,INVVLINE:x,INVVFRAME:x,INVVD:x, //INVVDEN:x,INVPWREN:x,INVLEND:x,PWREN:x,ENLEND:x,BSWP:x,HWSWP:x rLCDSADDR1=(((U32)frameBuffer8Bit>>22)<<21)|M5D((U32)frameBuffer8Bit>>1);
rLCDSADDR2=M5D(((U32)frameBuffer8Bit+((SCR_XSIZE_CSTN)*LCD_YSIZE_CSTN))>>1);
rLCDSADDR3=(((SCR_XSIZE_CSTN-LCD_XSIZE_CSTN)/2)<<11)|(LCD_XSIZE_CSTN / 2);
rDITHMODE=0;
rREDLUT =0xfdb96420; rGREENLUT=0xfdb96420; rBLUELUT =0xfb40;
32