S3C6410 TFT-LCD控制器的设置(LCD型号为WXCAT43,开发板为飞凌OK6410B)

原文出处

#include"RGB_24Bit_LCDInit.h" 

//这个头文件是用于定义寄存器地址相关的一些信息

//头文件下面有给出,注意该ARM芯片支持多窗口,这里使用的是Win0窗口

//u32 为 unsigned long

u32 (*LCD_BUFFER)[LCD_XSIZE];//当前使用的缓冲区指针

u32 LCD_BUFFER0[LCD_YSIZE][LCD_XSIZE];

u32 LCD_BUFFER1[LCD_YSIZE][LCD_XSIZE];

void LCD_Clear(u32 color)

{

    int x,y;

    for( x = 0;x<LCD_XSIZE;x++ )

    { 

        for( y=0;y<LCD_YSIZE;y++ )

        {

            LCD_BUFFER[y][x] = color;

        }

    }

}


void LCD_Disable(void)

{

    WINCON0 &= ~0x1;//1失能

}

void LCD_Enable(void)

{

    WINCON0 |= 0x1;//1使能

}


void Win0_BufferSel(char bufferNum)//选择LCD缓冲区

{

    LCD_Disable();

    if(bufferNum==1)//缓冲区1

    {

        WINCON0 |= (0x00000001<<20);//选择为缓冲区1

        LCD_BUFFER=LCD_BUFFER1;

    }

    else//缓冲区0

    {

        WINCON0 &= ~(1<<20);//选择为缓冲区0

        LCD_BUFFER=LCD_BUFFER0;

    }

    LCD_Enable();

}


void LCD_Win0Init(void)

{

    LCD_Disable();

    GPICON = 0xaaaaaaaa;

    GPJCON = 0xaaaaaaaa;

    SPCON &= ~0x00000003;// 将SPCON寄存器中,最低两位设为01,即RGB I/F style

    SPCON |= 0x00000001;

    MIFPCON &= ~0x00000008;// (1)MOFPCON:SEL_BYPASS[3] value@0x7410800C  必须设置为0

    VIDCON0 = VIDCON0_CONFIG;//视频主控制器0寄存器配置

    VIDCON1 = VIDCON1_CONFIG;//视频主控制器1寄存器配置

    VIDCON2 = 0;//视频主控制器2寄存器配置

    VIDTCON0 = VIDTCON0_CONFIG;//视频时序控制0寄存器配置

    VIDTCON1 = VIDTCON1_CONFIG;//视频时序控制1寄存器配置

    VIDTCON2 = VIDTCON2_CONFIG;//视频时序控制2寄存器配置

    WINCON0 = WINCON0_CONFIG;//窗口0控制寄存器配置

    VIDOSD0A = VIDOSD0A_CONFIG;//窗口0位置控制A寄存器配置

    VIDOSD0B = VIDOSD0B_CONFIG;//窗口0位置控制B寄存器配置

    VIDOSD0C = VIDOSD0C_OSDSIZE;//窗口0位置控制C寄存器配置

    VIDW00ADD2 = (0 << 13)|(LCD_XSIZE * 2);//缓冲区大小

    //缓冲区0配置

    VIDW00ADD0B0 = (u32)LCD_BUFFER0;//缓冲区0起始地址

    VIDW00ADD1B0 = ((u32)LCD_BUFFER0&0xffffff+480*272);//缓冲区0结束地址

    //缓冲区1配置

    VIDW00ADD0B1 = (u32)LCD_BUFFER1;//缓冲区1起始地址

    VIDW00ADD1B1 = (((u32)LCD_BUFFER1)&0xffffff+480*272 );//缓冲区0结束地址

    LCD_BUFFER=LCD_BUFFER0;//初始化时,指向缓冲区0

    DITHMODE=(1<<5)|(1<<3)|(1<<1)|(1<<0);//设置抖动

    LCD_Enable();

}






/*


为该C源程序所用到的头文件 RGB_24Bit_LCDInit.h


I端口共16个只引脚,作LCD脚时,对应的寄存器2位应该设置为 "10"

GPI[0]-GPIp[15]分别对应LCD VD[0]-LCD VD[15]

I端口和J端口前8个引脚为LCD的数据位

J端口共12只引脚,作LCD脚时,和I端口情况一致

GPJ[8]-GPJ[11]分别对应HSYNC,VSYNC,VDEN,VCLK

*/

#define GPICON       *((u32*)(0x7F008100))

#define GPIDAT       *((u32*)(0x7F008104))

#define GPIPUD       *((u32*)(0x7F008108))

#define GPJCON       *((u32*)(0x7F008120))

#define GPJDAT       *((u32*)(0x7F008124))

#define GPJPUD       *((u32*)(0x7F008128))

//视频主控制寄存器

#define VIDCON0      *((u32*)(0x77100000))

#define VIDCON1      *((u32*)(0x77100004))

#define VIDCON2      *((u32*)(0x77100008))

//视频时序控制寄存器

#define VIDTCON0     *((u32*)(0x77100010))//配置视频输出时序和显示尺寸

#define VIDTCON1     *((u32*)(0x77100014))

#define VIDTCON2     *((u32*)(0x77100018))

//0窗口寄存器

#define WINCON0      *((u32*)(0x77100020))

#define VIDOSD0A     *((u32*)(0x77100040))

#define VIDOSD0B     *((u32*)(0x77100044))

#define VIDOSD0C     *((u32*)(0x77100048))

//1窗口寄存器

#define WINCON1      *((u32*)(0x77100024))

#define VIDOSD1A     *((u32*)(0x77100050))

#define VIDOSD1B     *((u32*)(0x77100054))

#define VIDOSD1C     *((u32*)(0x77100058))

#define VIDOSD1D     *((u32*)(0x7710005C))

//2窗口寄存器

#define WINCON2      *((u32*)(0x77100028))

#define VIDOSD2A     *((u32*)(0x77100060))

#define VIDOSD2B     *((u32*)(0x77100064))

#define VIDOSD2C     *((u32*)(0x77100068))

#define VIDOSD2D     *((u32*)(0x7710006C))

//3窗口寄存器

#define WINCON3      *((u32*)(0x7710002C))

#define VIDOSD3A     *((u32*)(0x77100070))

#define VIDOSD3B     *((u32*)(0x77100074))

#define VIDOSD3C     *((u32*)(0x77100078))

//4窗口寄存器

#define WINCON4      *((u32*)(0x77100030))

#define VIDOSD4A     *((u32*)(0x77100080))

#define VIDOSD4B     *((u32*)(0x77100084))

#define VIDOSD4C     *((u32*)(0x77100088))

//各窗口缓冲寄存器

#define VIDW00ADD0B0     *((u32*)(0x771000A0))

#define VIDW00ADD0B1     *((u32*)(0x771000A4))

#define VIDW01ADD0B0     *((u32*)(0x771000A8))

#define VIDW01ADD0B1     *((u32*)(0x771000AC))

#define VIDW02ADD0       *((u32*)(0x771000B0))

#define VIDW03ADD0       *((u32*)(0x771000B8))

#define VIDW04ADD0       *((u32*)(0x771000C0))

#define VIDW00ADD1B0     *((u32*)(0x771000D0))

#define VIDW00ADD1B1     *((u32*)(0x771000D4))

#define VIDW01ADD1B0     *((u32*)(0x771000D8))

#define VIDW01ADD1B1     *((u32*)(0x771000DC))

#define VIDW02ADD1       *((u32*)(0x771000E0))

#define VIDW03ADD1       *((u32*)(0x771000E8))

#define VIDW04ADD1       *((u32*)(0x771000F0))

#define VIDW00ADD2       *((u32*)(0x77100100))

#define VIDW01ADD2       *((u32*)(0x77100104))

#define VIDW02ADD2       *((u32*)(0x77100108))

#define VIDW03ADD2       *((u32*)(0x7710010C))

#define VIDW04ADD2       *((u32*)(0x77100110))

#define VIDINTCON0       *((u32*)(0x77100130))

#define VIDINTCON1       *((u32*)(0x77100134))

#define W1KEYCON0        *((u32*)(0x77100140))

#define W1KEYCON1        *((u32*)(0x77100144))

#define W2KEYCON0        *((u32*)(0x77100148))

#define W2KEYCON1        *((u32*)(0x7710014C))

#define W3KEYCON0        *((u32*)(0x77100150))

#define W3KEYCON1        *((u32*)(0x77100154))

#define W4KEYCON0        *((u32*)(0x77100158))

#define W4KEYCON1        *((u32*)(0x7710015C))

#define DITHMODE         *((u32*)(0x77100170))

#define WIN0MAP          *((u32*)(0x77100180))

#define WIN1MAP          *((u32*)(0x77100184))

#define WIN2MAP          *((u32*)(0x77100188))

#define WIN3MAP          *((u32*)(0x7710018C))

#define WIN4MAP          *((u32*)(0x77100190))



#define MIFPCON      *((u32*)(0x7410800c))//常规显示模式下该寄存器必须设置为0

#define SPCON        *((u32*)(0x7F0081A0))

/*

使用的是WXCAT43的TFT 24位480*272LCD

下面是关于窗口0的配置,对应dataSheet里面的内容。

配置为 24位真彩RGB显示 

*/


//视频主控制器0寄存器VIDCON0

#define VIDCON0_INTERLACE_F            (0<<29)//渐行

#define VIDCON0_VIDOUT                 (0<<26)//RGB接口

#define VIDCON0_L1_DATA16              (0<<23)//I80 (LDI1)输出24bit模式  无关紧要

#define VIDCON0_L0_DATA16              (0<<20)//I80 (LDI0)输出24bit模式    无关紧要       

#define VIDCON0_PNRMODE                (0<<17)//显示格式 RGB格式                        

#define VIDCON0_CLKVALUP               (0<<16)//选择CLKVAL_F 更新时序控制

#define VIDCON0_CLKVAL_F               (14<<6)//时钟分频,最大66MHz VCLK=视频时钟源/(CLKVAL+1) CLKVAL>=1  VCLK推荐为9MHz

#define VIDCON0_VCLKFREE               (0<<5)//VCLK 自由运行控制(只有在RGB IF 模式下有效):自由运行模式

#define VIDCON0_CLKDIR                 (1<<4)//用CLKVAL_F 寄存器划分时钟源

#define VIDCON0_CLKSEL_F               (0<<2)//选择时钟源,HCLK = 133MHz

#define VIDCON0_ENVID                  (1<<1)//视频输出及显示控制信号禁止,该位用于关闭显示控制器不可与ENVID_F同时设置为0

#define VIDCON0_ENVID_F                (1<<0)//单帧视频输出及显示控制信号禁止

#define VIDCON0_CONFIG (VIDCON0_INTERLACE_F|VIDCON0_VIDOUT|VIDCON0_L1_DATA16|VIDCON0_L0_DATA16|VIDCON0_PNRMODE|VIDCON0_CLKVALUP|VIDCON0_CLKVAL_F|VIDCON0_VCLKFREE|VIDCON0_CLKDIR|VIDCON0_CLKSEL_F|VIDCON0_ENVID|VIDCON0_ENVID_F)

//视频主控制器1寄存器VIDCON1

#define VIDCON1_IVCLK                  (0<<7)//时钟下降沿有效

#define VIDCON1_IHSYNC                 (1<<6)//HSYNC反向(负脉冲)

#define VIDCON1_IVSYNC                 (1<<5)//VSYNC常规(负脉冲)

#define VIDCON1_IVDEN                  (0<<4)//DE信号常规(上升沿有效)

#define VIDCON1_CONFIG (VIDCON1_IVCLK|VIDCON1_IHSYNC|VIDCON1_IVSYNC|VIDCON1_IVDEN)

//视频时序控制0寄存器VIDTCON0

#define VIDTCON0_VBPDE                 (0<<24)//在帧开始处,垂直后沿是不活动行的数量,在垂直同步过程之后(只对YVU 接口)

#define VIDTCON0_VBPD                  (1<<16)//垂直后沿是不活动行的数量,在垂直同步过程之后

#define VIDTCON0_VFPD                  (1<<8)//在帧末尾处,垂直前沿是不活动行的数量

#define VIDTCON0_VSPW                  (9<<0)//通过计算不活动行的数量,垂直同步脉冲宽度决定VSYNC 脉冲的高点品宽度。

#define VIDTCON0_CONFIG (VIDTCON0_VBPDE|VIDTCON0_VBPD|VIDTCON0_VFPD|VIDTCON0_VSPW)

//视频时序控制1寄存器VIDTCON1

#define VIDTCON1_VFPDE                 (0<<24)//在帧末尾处,垂直前沿是不活动行的数量,在垂直同步过程之前(只对YVU 接口)

#define VIDTCON1_HBPD                  (1<<16)//水平后沿是HSYNC 下降沿和有效数据开始之间的VCLK 周期的数量

#define VIDTCON1_HFPD                  (1<<8)//水平前沿是有效数据末端和HSYNC 上升沿之间的VCLK 周期的数量

#define VIDTCON1_HSPW                  (40<<0)//horizontal sync pulse width

#define VIDTCON1_CONFIG (VIDTCON1_VFPDE|VIDTCON1_HBPD|VIDTCON1_HFPD|VIDTCON1_HSPW)

//视频时序控制2寄存器VIDTCON2

#define VIDTCON2_LINEVAL               (271<<11)//这些位决定显示的垂直尺寸  屏幕尺寸减1 

#define VIDTCON2_HOZVAL                (479<<0)//这些位决定显示的水平尺寸屏幕尺寸减1 

#define VIDTCON2_CONFIG (VIDTCON2_LINEVAL|VIDTCON2_HOZVAL)

//窗口0控制寄存器WINCON0                  

#define WINCON0_nWide_Narrow           (0<<26)//根据输入值范围选择从YCbCr 到RGB 的颜色空间转换等式。YCbCr 宽范围是2’00, YCbCr 窄范围是2’11,宽范围:Y/Cb/Cr:2514-0窄范围:Y:2314-16,Cb/Cr:240-16

#define WINCON0_ENLOCAL                (0<<22)//选择数据访问方式:专用DMA

#define WINCON0_BUFSEL                 (0<<20)//缓冲区设置为0

#define WINCON0_BUFAUTOEN              (0<<19) //双缓冲区自动控制位,由BUFSEL控制

#define WINCON0_BITSWP                 (0<<18)//位交换禁止

#define WINCON0_BYTSWP                 (0<<17)//字节交换禁止

#define WINCON0_HAWSWP                 (0<<16)//半子交换禁止

#define WINCON0_InRGB                  (0<<13)//此位指明源图像的输入颜色空间(只对ENLOCALI 有效):RGB

#define WINCON0_BURSTLEN               (0<<9)//DMA 的突发最大长度选择:16BYTE

#define WINCON0_BPPMODE_F              (11<<2)//24bit RGB565                    配制

#define WINCON0_CONFIG (WINCON0_nWide_Narrow|WINCON0_ENLOCAL|WINCON0_BUFSEL|WINCON0_BUFAUTOEN|WINCON0_BITSWP|WINCON0_BYTSWP|WINCON0_HAWSWP|WINCON0_InRGB|WINCON0_BURSTLEN|WINCON0_BPPMODE_F)

//窗口0位置控制A寄存器VIDOSD0A

#define VIDOSD0A_OSD_LeftTopX_F        (0 << 11)//左上角的OSD 图像像素横向屏幕坐标

#define VIDOSD0A_OSD_LeftTopY_F        (0 << 0) //左上角的OSD 图像像素纵向屏幕坐标(对于接口TV输出而言,这个值必须设置在屏幕y 坐标值的一半位置。Y 坐标值的初始位置必须为偶数)

#define VIDOSD0A_CONFIG (VIDOSD0A_OSD_LeftTopX_F+VIDOSD0A_OSD_LeftTopY_F)

//窗口0位置控制B寄存器VIDOSD0B

#define VIDOSD0B_OSD_RightBotX_F       (479<<11)//右下角的OSD 图像像素横向屏幕坐标

#define VIDOSD0B_OSD_RightBotY_F       (271<<0)//右下角的OSD 图像像素纵向屏幕坐标(对于接口TV输出而言,这个值必须设置在屏幕y 坐标值的一半位置。Y 坐标值的初始位置必须为奇数)

#define VIDOSD0B_CONFIG (VIDOSD0B_OSD_RightBotY_F+VIDOSD0B_OSD_RightBotX_F)

//窗口0位置控制C寄存器VIDOSD0C

#define VIDOSD0C_OSDSIZE   (480*272)//窗口尺寸=高*宽(字数)



#define LCD_XSIZE 480         //水平显示尺寸

#define LCD_YSIZE 272         //垂直显示尺寸


extern u32 (*LCD_BUFFER)[LCD_XSIZE];//指向当前使用的缓冲区指针    

extern u32 LCD_BUFFER0[LCD_YSIZE][LCD_XSIZE];//全局显存

extern u32 LCD_BUFFER1[LCD_YSIZE][LCD_XSIZE];


/***************************************

相关函数

***************************************/

void LCD_Win0Init(void);

void LCD_Clear(u32 Color);

void Win0_BufferSel(char bufferNum);

void LCD_Disable(void);

void LCD_Enable(void);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值