clock_Init
BL Memsetup
BL Copy_Steppingstone_to_SDRAM
LDR PC,=ON_SDRAM
ON_SDRAM:
LDR SP,=0x34000000 @脡脰栈
BL main
HALT_LOOP:
B HALT_LOOP
Copy_Steppingstone_to_SDRAM:
MOV R0,#0
LDR R1,=SDRAM_BASE
MOV R2,#4*1024
1:
LDR R3,[R0],#4 @麓脫teppingstone露脕隆4脳陆诘脛媒垄脠源碌脴路录脫
STR R3,[R1],#4
CMP R0,R2
BNE 1b
MOV PC,LR
Memsetup:
MOV R0,#MEM_CTL_BASE
ADRL R1,MEM_CFG_VAL
ADD R2,R0,#52
1:
LDR R3,[R1],#4
STR R3,[R0],#4
CMP R0,R2
BNE 1b
MOV PC,LR
.align 4
MEM_CFG_VAL:
@麓娲⒙棵樏喢访睹β得劽ㄖ?
.long 0x22011110 @BWSCON
.long 0x00000700 @BANKCON0
.long 0x00000700 @BANKCON1
.long 0x00000700 @BANKCON2
.long 0x00000700 @BANKCON3
.long 0x00000700 @BANKCON4
.long 0x00000700 @BANKCON5
.long 0x00018005 @BANKCON6
.long 0x00018005 @BANKCON7
.long 0x008c07a3 @REFRESH
.long 0x000000b1 @BANKSIZE
.long 0x00000030 @MRSRB6
.long 0x00000030 @MRSRB7
lcd.c
#include "s3c2440.h"
#include "Types.h"
/*LCDCON1 录脛麓忙脝梅碌脛脰碌*/
#define CLKVAL (6 << 8) //VCLK=6.39MHz 6
#define PNRMODE (0x3 << 5) // TFT LCD panel
#define BPPMODE (0xc << 1) //16 bpp for TFT
#define ENVID (0) //Disable the video output and the LCD control signal
/*LCDCON2 register value*/
#define VBPD (0x08 << 24) //2
#define LINEVAL (271 << 14) //271
#define VFPD (0x09 << 6) //2
#define VSPW (0x01) //2
/*LCDCON3 register value*/
#define HBPD (0x27 << 19) //19
#define HOZVAL (479 << 8) //479
#define HFPD (0x03) //10
/*LCDCON4 register value*/
#define HSPW (0x01) //10
/*LCDCON5 register value*/
#define FRM565 (1 << 11)
#define INVVCLK (0 << 10)
#define INVVLINE (1 << 9)
#define INVVFRAME (1 << 8)
#define INVVD (0 << 7)
#define INVVDEN (0 << 6)
#define INVPWREN (0 << 5)
#define INVLEND (0 << 4)
#define PWREN (1 << 3) //Enable PWREN signal
#define ENLEND (0 << 2) //Enable LEND signal
#define BSWP (0 << 1)
#define HWSWP (1)
#define LCD_WIDTH 480
#define LCD_HEIGHT 272
#define LCD_XSIZE LCD_WIDTH
#define LCD_YSIZE LCD_HEIGHT
#define SCR_XSIZE LCD_WIDTH
#define SCR_YSIZE LCD_HEIGHT
volatile unsigned long LCD_BUFF[SCR_YSIZE][SCR_XSIZE];
void delay()
{
unsigned long c=100000;
while(c--);
}
void Lcd_PowerEnable(int invpwren,int pwren)
{
//GPG4 is setted as LCD_PWREN
GPGUP = GPGUP|(1<<4); // Pull-up disable
GPGCON = GPGCON|(3<<8); //GPG4=LCD_PWREN
//Enable LCD POWER ENABLE Function
LCDCON5 = LCDCON5&(~(1<<3))|(pwren<<3); // PWREN
LCDCON5 = LCDCON5&(~(1<<5))|(invpwren<<5); // INVPWREN
}
void LcdBklSet(void)
{
GPBCON = GPBCON & (~(3<<2)) | (1<<2) ; //GPB1脡脰驴output
GPBDAT |= (1<<1);
}
void TFT_LCD_ClearSCR(unsigned short c)
{
unsigned int x,y;
for(y = 0; y < LCD_HEIGHT; y++)
for(x = 0; x < LCD_WIDTH; x++)
{
LCD_BUFF[y][x] = c;
}
}
/*
*Function Name : LCD_Port_Init
*Parameter : void
*Description : configure LCD's I/O ports registers
*/
void LCD_Port_Init(void)
{
// GPCCON = 0xaaaaaaaa;//0xaaaa02a8; //GPIO I/O ports are used for VD[7:0],LCDVF[2:0],
// //VM,VFRAME,VLINE,VCLK,LEND
// GPCUP = 0xffff; //Disable Pull-up register
// GPDCON = 0xaaaaaaaa; //GPIO ports are used for VD[8:23]
// GPDUP = 0xffff; //Disable Pull-up registers
//GPGCON |= (3 << 8); //GPG4 is used for LCD_PWRDN
//GPGUP |= (1 << 4); //Disable GPG4 Pull-up register
rGPCUP=0xffffffff; // Disable Pull-up register
rGPCCON=0xaaaa02a8; //Initialize VD[7:0],VM,VFRAME,VLINE,VCLK
rGPDUP=0xffffffff; // Disable Pull-up register
rGPDCON=0xaaaaaaaa; //Initialize VD[15:8]
}
/*
*Function Name : TFT_LCD_Init
*Parameter : void
*Description : configure LCD's registers
*/
void TFT_LCD_Init(void)
{
#define M5D(n) ((n)&0x1fffff)
#define LCD_ADDR ((U32)LCD_BUFF)
LCDCON1 = (CLKVAL | PNRMODE | BPPMODE | ENVID);
LCDCON2 = (VBPD | LINEVAL | VFPD | VSPW);
LCDCON3 = (HBPD | HOZVAL | HFPD);
LCDCON4 = HSPW;
LCDCON5 = (FRM565 | INVVCLK | INVVLINE | INVVFRAME | INVVD | INVVDEN | INVLEND | ENLEND | BSWP | HWSWP);
LCDSADDR1 = (((LCD_ADDR >> 22) << 21) | ((LCD_ADDR >> 1)&0x1fffff));
LCDSAddr2 = (((LCD_ADDR + LCD_WIDTH*LCD_HEIGHT*2) >> 1)&0x1fffff);
LCDSAddr3 = LCD_WIDTH;
TPAL = 0x0;
}
/*
*Function Name : LCD_ENVID_OnOff
*Parameter : onoff
*Description : Enable or disable LCD video output and the logic
*/
void LCD_ENVID_OnOff( int onoff)
{
IF( onoff == 1)
{
LCDCON1 |= 1; //ENVID = ON;
}
else
LCDCON1 = LCDCON1 & 0x3fffe; //ENVID = OFF;
}
main.c
int main()
{
LCD_Port_Init();
TFT_LCD_Init();
LcdBklSet();
Lcd_PowerEnable(0,1);
LCD_ENVID_OnOff(1);
while(1)
{
TFT_LCD_ClearSCR(0x1f);
delay();
}
//while(1);
return 0;
}
0