S3C2440 LCD控制器,显示不全
小弟调了两天了,16位5:6:5,TFT 始终只能显示两行,经测试,貌似LCD_BUFFER器的起始,结束地址没问题,数组类型应该也对,可是只能显示2行多点,各位大哥给点思路,谢谢#include"2440addr.h"
#define U32 unsigned int
#define U16 unsigned short
#define M5D(n) ((n) & 0x1fffff)
#define CLKVAL 5
#define LINEVAL 239
#define HOZVAL 319
#define VBPD (12)
#define VFPD (4)
#define VSPW (5)
#define HBPD (22)
#define HFPD (33)
#define HSPW (44)
#define LCD_HEIGHT 240
#define LCD_WIDTH 320
U16 LCD_BUFFER;
void PLL_Init()
{
rMPLLCON = (92<<12)|(1<<4)|(0X1<<0); //FCLK=400MHz
rCLKDIVN = (0X2<<1)|(0X1<<0); //FCLK:HCLK:PCLK=1:4:8
}
void IO_Init()
{
rGPCCON = 0Xaaaa02a9;
rGPCUP = 0X00000000;
rGPDCON = 0Xaaaaaaaa;
rGPDUP = 0X00000000;
}
void PowerEnable(int invpwren, int pwren )
{
rGPGCON = (3<<8);
rGPGUP = 0X0;
rGPGDAT |= (1<<4);
rLCDCON5 = rLCDCON5&(~(1<<3))|(pwren<<3);
rLCDCON5 = rLCDCON5&(~(1<<5))|(invpwren<<5);
}
void Envidonoff(int onoff)
{
if(onoff == 1)
rLCDCON1 |= 1;
else
rLCDCON1 &= 0X3fffe;
}
void LCD_Init()
{
//Each Frame,TFT LCD,16bpp,Disable ENVID
rLCDCON1 = (CLKVAL<<8)|(0<<7)|(3<<5)|(12<<1)|0;
rLCDCON2 = (VBPD<<24)|(LINEVAL<<14)|(VFPD<<6)|(VSPW);
rLCDCON3 = (HBPD<<19)|(HOZVAL<<8)|(HFPD);
rLCDCON4 = (HSPW);
//LSB,565,falling edge,INVVLINE=1,INVVFRAME=1,PWREN=0,BSWP=1;
rLCDCON5 = (1<<11)|(0<<10)|(1<<9)|(1<<8)|(1<<0);
rLCDSADDR1 = ( (((U32)LCD_BUFFER>>22)<<21)|M5D((U32)LCD_BUFFER>>1) );
rLCDSADDR2 = (M5D(((U32)LCD_BUFFER+320*2*240)>>1));
rLCDSADDR3 = 320;
rLCDINTMSK |= 3;
rLPCSEL &= (~7);
rTPAL = 0;
}
void Brush_Background(U16 color)
{
unsigned int x,y;
for(y=0;y<240;y++)
{
for(x=0;x<320;x++)
{
LCD_BUFFER = color;
}
}
}
void Main()
{
PLL_Init();
IO_Init();
LCD_Init();
PowerEnable(0,1);
Envidonoff(1);
Brush_Background(0xff);
while(1);
} 这个是工程文件,ourdev_627933K3QD52.zip(文件大小:85K) (原文件名:TFT_LCD2.zip) /* LCDCON1 */
#define LCD_WIDTH240
#define LCD_HEIGHT 320
#define LCD_CLKVAL 7 // HCLK/((CLKVAL+1)*2) 100M/2/(7+1) = 6.25M
/* LCDCON2 */
#define LCD_VBPD 0
#define LCD_VFPD 2
#define LCD_VSPW 2
/* LCDCON3 */
#define LCD_HBPD 20
#define LCD_HFPD 10
/* LCDCON4 */
#define LCD_SPW 10
#pragma pack(100)
unsigned short VRAM;
#pragma pack()
#define M5D(n) ((n)&0x1fffff)
#define LCD_ADDR(cyg_uint32)VRAM
#define LCD_POWOFF_TIMEOUT 600 //60s
static struct pos {
cyg_uint32 x;
cyg_uint32 y;
cyg_uint16 c;
cyg_uint32 idle;
cyg_uint32 busy;
} cursor;
static void Lcd_Port_Init(void)
{
rGPCUP= 0xFFFFFFFF;// Disable Pull-up register
rGPCCON = 0xAAAA02A8;// Initialize VD,VM,VFRAME,VLINE,VCLK
rGPDUP= 0xFFFFFFFF;// Disable Pull-up register
rGPDCON = 0xAAAAAAAA;// Initialize VD
}
static void LCD_Init(void)
{
rLCDCON1 = (LCD_CLKVAL << 8) | (3 << 5) | (12 << 1);
rLCDCON2 = (LCD_VBPD << 24) | ((LCD_HEIGHT - 1) << 14) | (LCD_VFPD << 6)|(LCD_VSPW << 0);
rLCDCON3 = (LCD_HBPD << 19) | ((LCD_WIDTH - 1) << 8) | (LCD_HFPD << 0);
rLCDCON4 = (LCD_SPW << 0);
#if !defined(LCD_CON5)
# define LCD_CON5 ((1<<11) | (1 << 9) | (1 << 8) | (1 << 3) | (1 << 0))
#endif
rLCDCON5 = LCD_CON5;
rLCDSADDR1 = ((LCD_ADDR >> 22) << 21) | ((M5D(LCD_ADDR >> 1)) << 0);
rLCDSADDR2 = M5D((LCD_ADDR + LCD_WIDTH * LCD_HEIGHT * 2) >> 1);
rLCDSADDR3 = LCD_WIDTH;
rLCDINTMSK |= 3;
rLPCSEL &= (~7);
rTPAL = 0x0;
rLPCSEL &= ~((1 << 4) | 1);
} mark mark
页:
[1]