LCD program

/******/

有关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****什么的工具,我用过,可以转换,本来想一起移植过来的,不过年底事情比较多,只有来年了..不过还是希望上面的程序对大家的理解有所帮助.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值