/******/
有关LCD显示的这个知识,网上有一篇文章
《S3C2410下LCD驱动程序的移植及GUI程序编写.pdf》写的挺好,很不错,可以先看看,再看我这个编程流程,我这个LCD只是针对u-boot加入简单开机显示部′分用。
以下的程序,是我在u-boot里面的common/main.c里面添加的内容,添加在函数main_loop()中,导入以下的两个文件,编译 makefile ,就可以在开机启动时候看到彩条,为了不和u-boot内部定义冲突,因此我写的前面全部加上了jk_标识符号,以便区别。包含了 LCD_common.h和LCD_common.c两个文件.
我写的这个可能是比较烦的,因为我是直接拿硬件管脚进行配置 ,来显示,并不是修改u-boot内的某些配置,而是自己直接写了显示程序,包括从管脚初始化开始,内存初始化,我在SDRAM里面随便开了一块 480×234的framebuffer显存(0x33800000稍微后面一些,没有被使用中的),并且没有启动mmu内存管理模块
LCD_common.h
/**********jimk test uboot for LCD programing 2008 01***************/
#ifndef _LCD_COMMON_H_
#define _LCD_COMMON_H_
// S3C2440 I/O PORT
#define jk_rGPACON (*(volatile unsigned *)0x56000000) //Port A control
#define jk_rGPADAT (*(volatile unsigned *)0x56000004) //Port A data
#define jk_rGPBCON (*(volatile unsigned *)0x56000010) //Port B control
#define jk_rGPBDAT (*(volatile unsigned *)0x56000014) //Port B data
#define jk_rGPBUP (*(volatile unsigned *)0x56000018) //Pull-up control B
#define jk_rGPCCON (*(volatile unsigned *)0x56000020) //Port C control
#define jk_rGPCDAT (*(volatile unsigned *)0x56000024) //Port C data
#define jk_rGPCUP (*(volatile unsigned *)0x56000028) //Pull-up control C
#define jk_rGPDCON (*(volatile unsigned *)0x56000030) //Port D control
#define jk_rGPDDAT (*(volatile unsigned *)0x56000034) //Port D data
#define jk_rGPDUP (*(volatile unsigned *)0x56000038) //Pull-up control D
#define jk_rGPECON (*(volatile unsigned *)0x56000040) //Port E control
#define jk_rGPEDAT (*(volatile unsigned *)0x56000044) //Port E data
#define jk_rGPEUP (*(volatile unsigned *)0x56000048) //Pull-up control E
#define jk_rGPFCON (*(volatile unsigned *)0x56000050) //Port F control
#define jk_rGPFDAT (*(volatile unsigned *)0x56000054) //Port F data
#define jk_rGPFUP (*(volatile unsigned *)0x56000058) //Pull-up control F
#define jk_rGPGCON (*(volatile unsigned *)0x56000060) //Port G control
#define jk_rGPGDAT (*(volatile unsigned *)0x56000064) //Port G data
#define jk_rGPGUP (*(volatile unsigned *)0x56000068) //Pull-up control G
#define jk_rGPHCON (*(volatile unsigned *)0x56000070) //Port H control
#define jk_rGPHDAT (*(volatile unsigned *)0x56000074) //Port H data
#define jk_rGPHUP (*(volatile unsigned *)0x56000078) //Pull-up control H
#define jk_rGPJCON (*(volatile unsigned *)0x560000d0) //Port J control
#define jk_rGPJDAT (*(volatile unsigned *)0x560000d4) //Port J data
#define jk_rGPJUP (*(volatile unsigned *)0x560000d8) //Pull-up control J
#define jk_rEXTINT0 (*(volatile unsigned *)0x56000088) //External interrupt control register 0
#define jk_rEXTINT1 (*(volatile unsigned *)0x5600008c) //External interrupt control register 1
#define jk_rEXTINT2 (*(volatile unsigned *)0x56000090) //External interrupt control register 2
// LCD CONTROLLER
#define jk_rLCDCON1 (*(volatile unsigned *)0x4d000000) //LCD control 1
#define jk_rLCDCON2 (*(volatile unsigned *)0x4d000004) //LCD control 2
#define jk_rLCDCON3 (*(volatile unsigned *)0x4d000008) //LCD control 3
#define jk_rLCDCON4 (*(volatile unsigned *)0x4d00000c) //LCD control 4
#define jk_rLCDCON5 (*(volatile unsigned *)0x4d000010) //LCD control 5
#define jk_rLCDSADDR1 (*(volatile unsigned *)0x4d000014) //STN/TFT Frame buffer start address 1
#define jk_rLCDSADDR2 (*(volatile unsigned *)0x4d000018) //STN/TFT Frame buffer start address 2
#define jk_rLCDSADDR3 (*(volatile unsigned *)0x4d00001c) //STN/TFT Virtual screen address set
#define jk_rREDLUT (*(volatile unsigned *)0x4d000020) //STN Red lookup table
#define jk_rGREENLUT (*(volatile unsigned *)0x4d000024) //STN Green lookup table
#define jk_rBLUELUT (*(volatile unsigned *)0x4d000028) //STN Blue lookup table
#define jk_rDITHMODE (*(volatile unsigned *)0x4d00004c) //STN Dithering mode
#define jk_rTPAL (*(volatile unsigned *)0x4d000050) //TFT Temporary palette
#define jk_rLCDINTPND (*(volatile unsigned *)0x4d000054) //LCD Interrupt pending
#define jk_rLCDSRCPND (*(volatile unsigned *)0x4d000058) //LCD Interrupt source
#define jk_rLCDINTMSK (*(volatile unsigned *)0x4d00005c) //LCD Interrupt mask
#define jk_rTCONSEL (*(volatile unsigned *)0x4d000060) //LPC3600 Control --- edited by junon
#define jk_PALETTE 0x4d000400 //Palette start address
//Timing parameter
#define jk_VBPD_240320 ((2-1)&0xff) //场后肩,消隐信号
#define jk_VFPD_240320 ((1-1)&0xff) //jk 场前肩
#define jk_VSPW_240320 ((1-1) &0x3f) //场脉冲宽度
#define jk_HBPD_240320 ((46-1)&0x7f) //行后肩
#define jk_HFPD_240320 ((16-1)&0xff) //行前肩
#define jk_HSPW_240320 ((14-1)&0xff) //行脉冲宽度
// CLOCK & POWER MANAGEMENT
#define jk_rLOCKTIME (*(volatile unsigned *)0x4c000000) //PLL lock time counter
#define jk_rMPLLCON (*(volatile unsigned *)0x4c000004) //MPLL Control
#define jk_rUPLLCON (*(volatile unsigned *)0x4c000008) //UPLL Control
#define jk_rCLKCON (*(volatile unsigned *)0x4c00000c) //Clock generator control
#define jk_rCLKSLOW (*(volatile unsigned *)0x4c000010) //Slow clock control
#define jk_rCLKDIVN (*(volatile unsigned *)0x4c000014) //Clock divider control
#define jk_rCAMDIVN (*(volatile unsigned *)0x4c000018) //USB, CAM Clock divider contro
#endif
LCD_common.c
/**********jimk test uboot for LCD programing 2008 01***************/
#include "LCD_common.h"
#define U32 unsigned int
#define jk_M5D(n) ((n) & 0x1fffff) // To get lower 21bits
//#define true 1
//#define false 0
#define jk_TFT_16Bit 0
#define jk_TFT_24Bit 1
#define jk_LCD_Mode jk_TFT_16Bit
//实际物理屏的大小尺寸
#define jk_LCD_XSIZE_TFT_240320 (480)
#define jk_LCD_YSIZE_TFT_240320 (234)
//虚拟显存的大小=实际大小的2倍
#define jk_SCR_XSIZE_TFT_240320 (jk_LCD_XSIZE_TFT_240320*2)
#define jk_SCR_YSIZE_TFT_240320 (jk_LCD_YSIZE_TFT_240320*2)
//LCD显示垂直和水平的尺寸定义
#define jk_HOZVAL_TFT_240320 (jk_LCD_XSIZE_TFT_240320-1)
#define jk_LINEVAL_TFT_240320 (jk_LCD_YSIZE_TFT_240320-1)
//VCOM翻转的频率
#define jk_MVAL (13)
//定义虚拟缓存大小
U32 (*jk_frameBuffer16BitTft240320)[jk_SCR_XSIZE_TFT_240320/2]; //定义一个framebuffer数组
U32 (*jk_frameBuffer24BitTft240320)[jk_SCR_XSIZE_TFT_240320];
#define jk_LCDFRAMEBUFFER 0x33800000 //no cache =直接写,SDRAM速度也还好
#define jk_CLKVAL_TFT_240320 (9) // 60hz @133Mhz TFT: VCLK = HCLK / [(CLKVAL+1) x 2] ( CLKVAL ≥ 0 )
// (9) 60hz @100Mhz
#define jk_MVAL_USED (0) //Determine the toggle rate of the VM. 0:Each frame 1=The rate defined by the MVAL
//通常说的VCOM信号翻转频率
//extern void LCD_test_make();
//extern void jk_Port_Init(void);
//extern void MMU_Init();
extern void jk_TFT_Logo(void);
static unsigned int save_rGPCUP,save_rGPCDAT,save_rGPCCON;
static unsigned int save_rGPDUP,save_rGPDDAT,save_rGPDCON;
//根据自己的要求、重新定义CPU的工作频率
U32 jk_Mdiv, jk_Pdiv, jk_Sdiv, jk_Fclk, jk_Hclk, jk_Pclk, jk_Hdivn, jk_Pdivn, jk_Hclk_Ratio, jk_Pclk_Ratio, jk_Ref_Cnt;
#define jk_FIN (16934400) //CPU external cry
#define jk_LCDCLK (5000000) //5MHz
#define jk_CPU2440A true
#define jk_MEGA (1000000)
/*
void LCD_test_make()
{
printf("this is LCD here!/n");
}
*/
static void Lcd_Port_Init(void)
{
save_rGPCCON=jk_rGPCCON;
save_rGPCDAT=jk_rGPCDAT;
save_rGPCUP=jk_rGPCUP;
save_rGPDCON=jk_rGPDCON;
save_rGPDDAT=jk_rGPDDAT;
save_rGPDUP=jk_rGPDUP;
jk_rGPCUP=0xffffffff; // Disable Pull-up register
jk_rGPCCON=0xaaaaaaaa; //Initialize VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND
jk_rGPDUP=0xffffffff; // Disable Pull-up register
jk_rGPDCON=0xaaaaaaaa; //Initialize VD[23:8]
}
static void Lcd_Port_Return(void)
{
jk_rGPCUP=save_rGPCUP; // Disable Pull-up register
jk_rGPCCON=save_rGPCCON; //Initialize VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND
jk_rGPDUP=save_rGPDUP; // Disable Pull-up register
jk_rGPDCON=save_rGPDCON; //Initialize VD[23:8]
}
/*******此函数根据硬件设置不同,进行更改********/
void Lcd_PowerEnable(int invpwren,int pwren)
{
//GPG4 is setted as LCD_PWREN
jk_rGPGUP=jk_rGPGUP&(~(1<<4))|(1<<4); // Pull-up disable
jk_rGPGCON=jk_rGPGCON&(~(3<<8))|(3<<8); //GPG4=LCD_PWREN
//Enable LCD POWER ENABLE Function
jk_rLCDCON5=jk_rLCDCON5&(~(1<<3))|(pwren<<3); // PWREN
jk_rLCDCON5=jk_rLCDCON5&(~(1<<5))|(invpwren<<5); // INVPWREN
}
/**enable the video output enable ***/
void Lcd_EnvidOnOff(int onoff)
{
if(onoff==1)
jk_rLCDCON1|=1; // ENVID=ON
else
jk_rLCDCON1 =jk_rLCDCON1 & 0x3fffe; // ENVID Off
}
void jk_LCD_init(int jk_TFT_type)
{
switch(jk_TFT_type)
{
case jk_TFT_16Bit:
jk_frameBuffer16BitTft240320=(U32 (*)[jk_SCR_XSIZE_TFT_240320/2])jk_LCDFRAMEBUFFER;
jk_rLCDCON1=(jk_CLKVAL_TFT_240320<<8)|(jk_MVAL_USED<<7)|(3<<5)|(12<<1)|0;
// TFT LCD panel,12bpp TFT,ENVID=off
jk_rLCDCON2=(jk_VBPD_240320<<24)|(jk_LINEVAL_TFT_240320<<14)|(jk_VFPD_240320<<6)|(jk_VSPW_240320);
jk_rLCDCON3=(jk_HBPD_240320<<19)|(jk_HOZVAL_TFT_240320<<8)|(jk_HFPD_240320);
jk_rLCDCON4=(jk_MVAL<<8)|(jk_HSPW_240320);
jk_rLCDCON5=(1<<11)|(1<<9)|(1<<8); //FRM5:6:5,HSYNC and VSYNC are inverted
//Frame buffer start address register 1.2.3
jk_rLCDSADDR1=(((U32)jk_frameBuffer16BitTft240320>>22)<<21)|jk_M5D((U32)jk_frameBuffer16BitTft240320>>1);
jk_rLCDSADDR2=jk_M5D( ((U32)jk_frameBuffer16BitTft240320+(jk_SCR_XSIZE_TFT_240320*jk_LCD_YSIZE_TFT_240320*2))>>1 );
jk_rLCDSADDR3=(((jk_SCR_XSIZE_TFT_240320-jk_LCD_XSIZE_TFT_240320)/1)<<11)|(jk_LCD_XSIZE_TFT_240320/1);
jk_rLCDINTMSK|=(3); // MASK LCD Sub Interrupt
jk_rTCONSEL&=(~7); // Disable LPC3600
jk_rTPAL=0; // Disable Temp Palette
break;
case jk_TFT_24Bit:
/* jk_frameBuffer24BitTft240320=(U32 (*)[jk_SCR_XSIZE_TFT_240320])jk_LCDFRAMEBUFFER;
jk_rLCDCON1=(CLKVAL_TFT_240320<<8)|(MVAL_USED<<7)|(3<<5)|(13<<1)|0;
// TFT LCD panel,12bpp TFT,ENVID=off
jk_rLCDCON2=(VBPD_240320<<24)|(LINEVAL_TFT_240320<<14)|(VFPD_240320<<6)|(VSPW_240320);
jk_rLCDCON3=(HBPD_240320<<19)|(HOZVAL_TFT_240320<<8)|(HFPD_240320);
jk_rLCDCON4=(MVAL<<8)|(HSPW_240320);
jk_rLCDCON5=(0<12)|(1<<9)|(1<<8); //BPP24:MSB,HSYNC and VSYNC are inverted
jk_rLCDSADDR1=(((U32)frameBuffer24BitTft240320>>22)<<21)|M5D((U32)frameBuffer24BitTft240320>>1);
jk_rLCDSADDR2=M5D( ((U32)frameBuffer24BitTft240320+(SCR_XSIZE_TFT_240320*LCD_YSIZE_TFT_240320*4))>>1 );
jk_rLCDSADDR3=(((SCR_XSIZE_TFT_240320-LCD_XSIZE_TFT_240320)*2)<<11)|(LCD_XSIZE_TFT_240320*2);
jk_rLCDINTMSK|=(3); // MASK LCD Sub Interrupt
jk_rTCONSEL&=(~7); // Disable LPC3600
jk_rTPAL=0; // Disable Temp Palette
*/
break;
}
}
/***************************/
/***********jk_frameBuffer16BitTft240320是直接在SDRAM中开辟的显存:大小为(U32)jk_frameBuffer16BitTft240320[Xsize/2][ysize]****************/
void jk_PutTft16Bit_240320(U32 x,U32 y,U32 c)
{
if(x<jk_SCR_XSIZE_TFT_240320 && y<jk_SCR_YSIZE_TFT_240320)
jk_frameBuffer16BitTft240320[(y)][(x)/2]=( jk_frameBuffer16BitTft240320[(y)][x/2]
& ~(0xffff0000>>((x)%2)*16) ) | ( (c&0x0000ffff)<<((2-1-((x)%2))*16) );
}
void (*PutPixel)(U32,U32,U32);
void Glib_Init(int type)
{
switch(type)
{
case jk_TFT_16Bit:
PutPixel=jk_PutTft16Bit_240320;
break;
case jk_TFT_24Bit:
/*PutPixel=_PutTft24Bit_240320; */
break;
default:
break;
}
}
void Glib_Line(int x1,int y1,int x2,int y2,int color)
{
int dx,dy,e;
dx=x2-x1;
dy=y2-y1;
if(dx>=0)
{
if(dy >= 0) // dy>=0
{
if(dx>=dy) // 1/8 octant
{
e=dy-dx/2;
while(x1<=x2)
{
PutPixel(x1,y1,color);
if(e>0){y1+=1;e-=dx;}
x1+=1;
e+=dy;
}
}
else // 2/8 octant
{
e=dx-dy/2;
while(y1<=y2)
{
PutPixel(x1,y1,color);
if(e>0){x1+=1;e-=dy;}
y1+=1;
e+=dx;
}
}
}
else // dy<0
{
dy=-dy; // dy=abs(dy)
if(dx>=dy) // 8/8 octant
{
e=dy-dx/2;
while(x1<=x2)
{
PutPixel(x1,y1,color);
if(e>0){y1-=1;e-=dx;}
x1+=1;
e+=dy;
}
}
else // 7/8 octant
{
e=dx-dy/2;
while(y1>=y2)
{
PutPixel(x1,y1,color);
if(e>0){x1+=1;e-=dy;}
y1-=1;
e+=dx;
}
}
}
}
else //dx<0
{
dx=-dx; //dx=abs(dx)
if(dy >= 0) // dy>=0
{
if(dx>=dy) // 4/8 octant
{
e=dy-dx/2;
while(x1>=x2)
{
PutPixel(x1,y1,color);
if(e>0){y1+=1;e-=dx;}
x1-=1;
e+=dy;
}
}
else // 3/8 octant
{
e=dx-dy/2;
while(y1<=y2)
{
PutPixel(x1,y1,color);
if(e>0){x1-=1;e-=dy;}
y1+=1;
e+=dx;
}
}
}
else // dy<0
{
dy=-dy; // dy=abs(dy)
if(dx>=dy) // 5/8 octant
{
e=dy-dx/2;
while(x1>=x2)
{
PutPixel(x1,y1,color);
if(e>0){y1-=1;e-=dx;}
x1-=1;
e+=dy;
}
}
else // 6/8 octant
{
e=dx-dy/2;
while(y1>=y2)
{
PutPixel(x1,y1,color);
if(e>0){x1-=1;e-=dy;}
y1-=1;
e+=dx;
}
}
}
}
}
void Glib_Rectangle(int x1,int y1,int x2,int y2,int color)
{
Glib_Line(x1,y1,x2,y1,color);
Glib_Line(x2,y1,x2,y2,color);
Glib_Line(x1,y2,x2,y2,color);
Glib_Line(x1,y1,x1,y2,color);
}
void Glib_FilledRectangle(int x1,int y1,int x2,int y2,int color)
{
int i;
for(i=y1;i<=y2;i++)
Glib_Line(x1,i,x2,i,color);
}
/****S3C2440 I/O Port 初始化*****/
void jk_Port_Init(void)
{
//CAUTION:Follow the configuration order for setting the ports.
// 1) setting value(GPnDAT)
// 2) setting control register (GPnCON)
// 3) configure pull-up resistor(GPnUP)
//32bit data bus configuration
//*** PORT A GROUP
//Ports : GPA22 GPA21 GPA20 GPA19 GPA18 GPA17 GPA16 GPA15 GPA14 GPA13 GPA12
//Signal : nFCE nRSTOUT nFRE nFWE ALE CLE nGCS5 nGCS4 nGCS3 nGCS2 nGCS1
//Binary : 1 1 1 , 1 1 1 1 , 1 1 1 1
//Ports : GPA11 GPA10 GPA9 GPA8 GPA7 GPA6 GPA5 GPA4 GPA3 GPA2 GPA1 GPA0
//Signal : ADDR26 ADDR25 ADDR24 ADDR23 ADDR22 ADDR21 ADDR20 ADDR19 ADDR18 ADDR17 ADDR16 ADDR0
//Binary : 1 1 1 1 , 1 1 1 1 , 1 1 1 1
jk_rGPACON = 0x7fffff;
//**** PORT B GROUP
//Ports : GPB10 GPB9 GPB8 GPB7 GPB6 GPB5 GPB4 GPB3 GPB2 GPB1 GPB0
//Signal : nXDREQ0 nXDACK0 nXDREQ1 nXDACK1 nSS_KBD nDIS_OFF L3CLOCK L3DATA L3MODE nIrDATXDEN Keyboard
//Setting: OUTPUT OUTPUT OUTPUT OUTPUT OUTPUT OUTPUT OUTPUT OUTPUT OUTPUT OUTPUT OUTPUT
//Binary : 01 , 01 01 , 01 01 , 01 01 , 01 01 , 01 01
jk_rGPBCON = 0x155555;
jk_rGPBUP = 0x7ff; // The pull up function is disabled GPB[10:0]
jk_rGPBDAT = jk_rGPBDAT&(0xff);
//*** PORT C GROUP
//Ports : GPC15 GPC14 GPC13 GPC12 GPC11 GPC10 GPC9 GPC8 GPC7 GPC6 GPC5 GPC4 GPC3 GPC2 GPC1 GPC0
//Signal : VD7 VD6 VD5 VD4 VD3 VD2 VD1 VD0 LCDVF2 LCDVF1 LCDVF0 VM VFRAME VLINE VCLK LEND
//Binary : 10 10 , 10 10 , 10 10 , 10 10 , 10 01 , 01 01 , 10 10 , 10 01
jk_rGPCCON = 0xaaaa95aA;
jk_rGPCUP = 0xffff; // The pull up function is disabled GPC[15:0]
// rGPCDAT = (rGPCDAT&(0xff))|0x50;
//*** PORT D GROUP
//Ports : GPD15 GPD14 GPD13 GPD12 GPD11 GPD10 GPD9 GPD8 GPD7 GPD6 GPD5 GPD4 GPD3 GPD2 GPD1 GPD0
//Signal : VD23 VD22 VD21 VD20 VD19 VD18 VD17 VD16 VD15 VD14 VD13 VD12 VD11 VD10 VD9 VD8
//Binary : 10 10 , 10 10 , 10 10 , 10 10 , 10 10 , 10 10 , 10 10 ,10 10
jk_rGPDCON = 0xaaaaaaaa;
jk_rGPDUP = 0xffff; // The pull up function is disabled GPD[15:0]
//*** PORT E GROUP
//Ports : GPE15 GPE14 GPE13 GPE12 GPE11 GPE10 GPE9 GPE8 GPE7 GPE6 GPE5 GPE4
//Signal : IICSDA IICSCL SPICLK SPIMOSI SPIMISO SDDATA3 SDDATA2 SDDATA1 SDDATA0 SDCMD SDCLK I2SSDO
//Binary : 10 10 , 10 10 , 10 10 , 10 10 , 10 10 , 10 10 ,
//-------------------------------------------------------------------------------------------------------
//Ports : GPE3 GPE2 GPE1 GPE0
//Signal : I2SSDI CDCLK I2SSCLK I2SLRCK
//Binary : 10 10 , 10 10
jk_rGPECON = 0xaa6aaaaa; //mdy by jk GPE11=for LCDBacklight test 2007 10 16
jk_rGPEDAT&=0xf7ff;
jk_rGPEUP = 0xffff; // The pull up function is disabled GPE[15:0]
//*** PORT F GROUP
//Ports : GPF7 GPF6 GPF5 GPF4 GPF3 GPF2 GPF1 GPF0
//Signal : nLED_8 nLED_4 nLED_2 nLED_1 nIRQ_PCMCIA EINT2 KBDINT EINT0
//Setting: Output Output Output Output EINT3 EINT2 EINT1 EINT0
//Binary : 01 01 , 01 01 , 10 10 , 10 10
jk_rGPFCON = 0x55aa;
jk_rGPFUP = 0xff; // The pull up function is disabled GPF[7:0]
//*** PORT G GROUP
//Ports : GPG15 GPG14 GPG13 GPG12 GPG11 GPG10 GPG9 GPG8 GPG7 GPG6
//Signal : nYPON YMON nXPON XMON EINT19 DMAMODE1 DMAMODE0 DMASTART KBDSPICLK KBDSPIMOSI
//Setting: nYPON YMON nXPON XMON EINT19 Output Output Output SPICLK1 SPIMOSI1
//Binary : 11 11 , 11 11 , 10 01 , 01 01 , 11 11
//-----------------------------------------------------------------------------------------
//Ports : GPG5 GPG4 GPG3 GPG2 GPG1 GPG0
//Signal : KBDSPIMISO LCD_PWREN EINT11 nSS_SPI IRQ_LAN IRQ_PCMCIA
//Setting: SPIMISO1 LCD_PWRDN EINT11 nSS0 EINT9 EINT8
//Binary : 11 11 , 10 11 , 10 10
jk_rGPGCON = 0xff95ebba;
jk_rGPGUP = 0xffff; // The pull up function is disabled GPG[15:0]
jk_rGPGDAT &=0xffef;
//*** PORT H GROUP
//Ports : GPH10 GPH9 GPH8 GPH7 GPH6 GPH5 GPH4 GPH3 GPH2 GPH1 GPH0
//Signal : CLKOUT1 CLKOUT0 UCLK nCTS1 nRTS1 RXD1 TXD1 RXD0 TXD0 nRTS0 nCTS0
//Binary : 10 , 10 10 , 11 11 , 10 10 , 10 10 , 10 10
jk_rGPHCON = 0x2afaaa;
jk_rGPHUP = 0x7ff; // The pull up function is disabled GPH[10:0]
// Added for S3C2440, DonGo
//PORT J GROUP
//Ports : GPJ12 GPJ11 GPJ10 GPJ9 GPJ8 GPJ7 GPJ6 GPJ5 GPJ4 GPJ3 GPJ2 GPJ1 GPJ0
//Signal : CAMRESET CAMCLKOUT CAMHREF CAMVS CAMPCLKIN CAMD7 CAMD6 CAMD5 CAMD4 CAMD3 CAMD2 CAMD1 CAMD0
//Setting: Out Out CAMHREF CAMVS CAMPCLKIN CAMD7 CAMD6 CAMD5 CAMD4 CAMD3 CAMD2 CAMD1 CAMD0
//Binary : 01 01 10 10 10 10 10 10 10 10 10 10 10
//PU_OFF : 1 0 1 1 1 1 1 1 1 1 1 1 1
//---------------------------------------------------------------------------------------
jk_rGPJDAT = (1<<12)|(0<<11);
jk_rGPJCON = 0x016aaaa;
jk_rGPJUP = ~((0<<12)|(1<<11));
jk_rGPJDAT = (0<<12)|(0<<11);
jk_rGPJCON = 0x016aaaa;
jk_rGPJUP = 0x1fff;//~((1<<12)|(1<<11));
//rGPJCON = 0x02aaaaaa;
//rGPJUP = 0x1fff; // The pull up function is disabled GPH[10:0]
//External interrupt will be falling edge triggered.
/**设置外部中断信号触发的模式:000:低电平触发 001:高电平触发 ......**/
jk_rEXTINT0 = 0x22222222; // EINT[7:0]
jk_rEXTINT1 = 0x22222222; // EINT[15:8]
jk_rEXTINT2 = 0x22222222; // EINT[23:16]
}
/******************************/
/******************************/
/******************************/
/******************************/
/******************************
void MMU_Init(void)
{
int i,j;
//========================== IMPORTANT NOTE =========================
//The current stack and code area can't be re-mapped in this routine.
//If you want memory map mapped freely, your own sophiscated MMU
//initialization code is needed.
//===================================================================
//If write-back is used,the DCache should be cleared. Dcache must be enabled.
for(i=0;i<64;i++)
for(j=0;j<8;j++)
MMU_CleanInvalidateDCacheIndex((i<<26)|(j<<5));
MMU_DisableDCache();
MMU_DisableICache();
MMU_InvalidateICache();
#if 0
//To complete MMU_Init() fast, Icache may be turned on here.
MMU_EnableICache();
#endif
MMU_DisableMMU();
MMU_InvalidateTLB();
//MMU_SetMTT(int vaddrStart,int vaddrEnd,int paddrStart,int attr)
MMU_SetMTT(0x00000000,0x07f00000,0x00000000,RW_CNB); //bank0
MMU_SetMTT(0x08000000,0x0ff00000,0x08000000,RW_CNB); //bank1
MMU_SetMTT(0x10000000,0x17f00000,0x10000000,RW_NCNB); //bank2
MMU_SetMTT(0x18000000,0x1ff00000,0x18000000,RW_NCNB); //bank3
//MMU_SetMTT(0x20000000,0x27f00000,0x20000000,RW_CB); //bank4
MMU_SetMTT(0x20000000,0x27f00000,0x20000000,RW_CNB); //bank4 for STRATA Flash
MMU_SetMTT(0x28000000,0x2ff00000,0x28000000,RW_NCNB); //bank5
MMU_SetMTT(0x30000000,0x30f00000,0x30000000,RW_CB); //bank6-1
MMU_SetMTT(0x31000000,0x33e00000,0x31000000,RW_NCNB); //bank6-2
MMU_SetMTT(0x33f00000,0x33f00000,0x33f00000,RW_CB); //bank6-3
MMU_SetMTT(0x38000000,0x3ff00000,0x38000000,RW_NCNB); //bank7
MMU_SetMTT(0x40000000,0x47f00000,0x40000000,RW_NCNB); //SFR
MMU_SetMTT(0x48000000,0x5af00000,0x48000000,RW_NCNB); //SFR
MMU_SetMTT(0x5b000000,0x5b000000,0x5b000000,RW_NCNB); //SFR
MMU_SetMTT(0x5b100000,0xfff00000,0x5b100000,RW_FAULT);//not used
MMU_SetTTBase(_MMUTT_STARTADDRESS);
MMU_SetDomain(0x55555550|DOMAIN1_ATTR|DOMAIN0_ATTR);
//DOMAIN1: no_access, DOMAIN0,2~15=client(AP is checked)
MMU_SetProcessId(0x0);
MMU_EnableAlignFault();
MMU_EnableMMU();
MMU_EnableICache();
MMU_EnableDCache(); //DCache should be turned on after MMU is turned on.
}
*/
void Glib_ClearScr(U32 c, int type)
{
int i,j;
for(j=0;j<jk_SCR_YSIZE_TFT_240320;j++)
for(i=0;i<jk_SCR_XSIZE_TFT_240320;i++)
PutPixel(i,j,c);
}
void Calc_Clock(int print_msg)
{
unsigned int mpll_val, sval, lcd_clk_val, tmpi;
// Get MPS value from register.
/*******参考s3C2440说明书-page227开始*也可以参考我的博客里相关时钟的一章*****/
/*******MpLL=(2*m*Fin)/(p*2s) ******/
/***** ********/
/*************/
mpll_val = jk_rMPLLCON;
/**Page 228 MPLLCON------查找表格中的Mdiv,pdiv,sdiv设置不同值的PLL频率改变**/
/***记录读取MPLLCON的频率设置的相关值***/
/***PLL出来的值既FCLK***/
jk_Mdiv = (mpll_val&(0xff<<12))>>12; /**MDIV[19:12]**/
jk_Pdiv = (mpll_val&(0x3f<<4))>>4; /**PDIV[9:12]**/
jk_Sdiv = (mpll_val&0x3); /**SDIV[1:0]**/
// Get HDIVN, PDIVN value from register.
jk_Hdivn = ((jk_rCLKDIVN&0x6)>>1); /**设置HCLK和FCLK的关系*CLKDIVN[2:1]*/
jk_Pdivn = (jk_rCLKDIVN&1); /**设置PCLK和HCLK的关系*CLKDIVN[0]*/
// Get the HCLK and PCLK ratio
switch(jk_Hdivn) { //HCLK=??FCLK
case 0: jk_Hclk_Ratio=1; break;
case 1: jk_Hclk_Ratio=2; break;
case 2: jk_Hclk_Ratio=4; break;
case 3: jk_Hclk_Ratio=3; break;
}
switch(jk_Pdivn) { //PCLK=??HCLK
case 0: jk_Pclk_Ratio=1; break;
case 1: jk_Pclk_Ratio=2; break;
}
tmpi = jk_rCAMDIVN&(3<<8); // //HCLK=??FCLK CAMDIVN[9:8]
if(tmpi!=0) {
if(jk_Hclk_Ratio==3 || jk_Hclk_Ratio==4)
jk_Hclk_Ratio *= 2;
}
// Get sval for calc Fout.
//sval=(int)pow(2,Sdiv);
switch(jk_Sdiv) { //Mpll=(2*m*Fin)/p*2s //s=SDIV,m=MDIV+8,p=PDIV+2
case 0: sval = 1; break;
case 1: sval = 2; break;
case 2: sval = 4; break;
case 3: sval = 8; break;
default: sval = 0; break;
}
//sval=2s
// Calc Fclk, Hclk, Pclk
#if jk_CPU2440A==true
jk_Fclk=(U32)( (((float)jk_Mdiv+8)*jk_FIN*2.0)/( ((float)jk_Pdiv+2)*(float)sval) ); // pll2188x.
#else
jk_Fclk=(U32)( (((float)jk_Mdiv+8)*jk_FIN)/( ((float)jk_Pdiv+2)*(float)sval) ); // pll2115x
#endif
jk_Hclk =(U32)( ((float)jk_Fclk/(float)jk_Hclk_Ratio) );
jk_Pclk = (U32)( (((float)jk_Fclk/(float)jk_Hclk_Ratio)/(float)jk_Pclk_Ratio));
// Calc refresh count.
jk_Ref_Cnt = 2048+1-(U32)( (float)( ((float)jk_Hclk*7.8)/jk_MEGA) );
//Uart_TxEmpty(1);
//Uart_Init(Pclk, 115200);
/*
if(print_msg!=0) {
Uart_Printf("MPLLVal [M:%xh(%d),P:%xh,S:%xh]/n", Mdiv, Mdiv, Pdiv, Sdiv);
Uart_Printf("F/H/PCLK=[1:%d:%d=", Hclk_Ratio, Hclk_Ratio*Pclk_Ratio);
//Uart_Printf("%4.3f:%4.3f:%4.3f MHz]/n", (float)Fclk/MEGA, (float)Hclk/MEGA, (float)Pclk/MEGA);
Uart_Printf("%4.1f:%4.1f:%4.1f MHz]/n", (float)Fclk/MEGA, (float)Hclk/MEGA, (float)Pclk/MEGA);
Uart_Printf("Refcnt:%d/n", Ref_Cnt);
}*/
lcd_clk_val = (jk_Hclk/(2.0*jk_LCDCLK)+0.5)-1;
jk_rLCDCON1 = (jk_rLCDCON1 & ~(0x3ff<<8)) | lcd_clk_val<<8;
//Uart_Printf("CLKVAL:%d/n", lcd_clk_val);
}
void jk_TFT_Logo(void)
{
jk_Port_Init();
jk_LCD_init(jk_TFT_16Bit);
Glib_Init(jk_TFT_16Bit);
Delay(3000);
Lcd_PowerEnable(0, 1);
Lcd_EnvidOnOff(1);
Glib_ClearScr(0, jk_TFT_16Bit);
Glib_FilledRectangle(0,0,480,1,0x07e0); // R
Glib_FilledRectangle(0,2,480,78,0xf800); // R
Glib_FilledRectangle(0,79,480,156,0x07e0); // G
Glib_FilledRectangle(0,157,480,232,0x001f); // B
Glib_FilledRectangle(0,233,480,234,0x07e0); // B
printf("LCD jimk test is compliment!");
jk_rGPGCON &=0xfffff5ff;
jk_rGPGCON |=0x00000500;
jk_rGPGUP =0x7ff;
jk_rGPGDAT &=0xffcf;
}
我自身直接在SRAM上开了一个显存,用来修改logo,现在的这个程序很简单,直接修改buffer就可以了,如果需要导入*.bmp文件,uboot里面有一个tools/bmp****什么的工具,我用过,可以转换,本来想一起移植过来的,不过年底事情比较多,只有来年了..不过还是希望上面的程序对大家的理解有所帮助.