本节来学习裸机下的LCD 驱动,本节学完后,再来学习Linux下如何使用LCD驱动

Linux中的LCD驱动,链接如下:

(Linux-LCD层次分析链接:http://www.cnblogs.com/lifexy/p/7603327.html)

(Linux-LCD驱动分析链接:http://www.cnblogs.com/lifexy/p/7604011.html)


横屏4.3寸LCD为480*272(行:480个像素点        列:272个行)

1.LCD原理图 :

Pin1- Pin6:Von/ Voff  电源正/负(由GPG4控制,高电平有效)

Pin2:VM/VDEN 数据使能信号 (0:表示正在跳行,1:表示可以传输像素数据)

Pin8:VLINE/HSYNC 水平同步信号(每扫完一行,即发一次水平同步信号)

Pin28:VFRAME/VSNC 垂直同步信号(每扫完一屏,即发一次垂直同步信号)

Pin30:VLCK 时钟信号

Pin42,Pin45 LED+,LED-   背光显示开关 (由0:off   1:no)

VD23~VD19:R信号   

VD15~VD10:G信号 

VD7~VD3    :B信号 

数据是采用16Bpp像素,RGB565格式(因为LCD控制器不支持18Bpp格式)

例如:粉色RGB值分别为209,92,174(11010001,01011100,10101110)

数据从高位往下取,R和B取5位,G取6位,那么值为0XD2F5。

565RGB引脚连接图如下:

1.2配置引脚

     GPCUP   = 0xffffffff;   // 禁止内部上拉
GPCCON = 0xaaaaaaaa; // GPIO管脚用于VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND
GPDUP = 0xffffffff; // 禁止内部上拉
GPDCON = 0xaaaaaaaa; // GPIO管脚用于VD[23:8]
GPBCON &= ~(GPB0_MSK); // Power enable pin
GPBCON |= GPB0_out;
GPBDAT &= ~(<<); // Power off

2.设置LCDCON1~5控制寄存器

2.1BSWP和HWSWP介绍

更改存储格式,对于16bppRGB565(高数据在后)来说,BSWP=0, HWSWP=1

2.2查看2440中LCD控制器初始状态时序图:

VSPW: 垂直同步脉冲宽度 pulse widch 

VBPD: 垂直脉冲后沿延迟(用来等待LCD模块响应的时间)  back delay 

VFPD: 垂直脉冲前沿延迟(用来等待LCD模块响应的时间)  Front delay

HSPW: 行同步脉冲宽度 pulse widch 

HBPD: 行脉冲后沿延迟(用来等待LCD模块响应的时间)  back delay 

HFPD: 行脉冲前沿延迟(用来等待LCD模块响应的时间)  Front delay

 LINEVAL:行数,用来决定垂直尺寸,对于4.3寸时,LINEVAL=272-1

HOZVAL:行数,用来决定水平像素点个数,对于4.3寸时,HOZVAL=480-1

2.3 查看 LCD芯片手册时序图,计算周期时间:

从上图2中得到时钟周期为10Mhz(100ns)

通过图1和图3计算出:

HSPW+1=T7=5 clock

HFPD+1=T8-T11=11 clock

HBPD+1=T6-T7-T8=17 clock

VSPW+1=T1=1 Line

VFPD+1=T2-T5=2 Line

VBPD+1=T0-T2-T1=4 Line

2.4 配置LCDCON1~5

根据上面就先来定义全局变量:

 #define  HSPW_16bpp      5-1
#define HFPD _16bpp 11-1
#define HBPD _16bpp 17-1
#define VSPW _16bpp 1-1
#define VFPD _16bpp 2-1
#define VBPD _16bpp 4-1

设置LCDCON1寄存器:

CLKVAL[17:8]:

设置VCLK时钟, CLKVAL =HCLK/(LCD时钟*2)-1

本裸板的HCLK=100Mhz,LCD时钟=10MHZ,所以CLKVAL =4

PNRMODE [6:5]:

设置为TFT模式,PNRMODE =0x3

BPPMODE[4:1]:

设置为16BPP, BPPMODE=0x0C

ENVID [0]:

控制PWREN信号(GPG4)输出,先配置好再输出PWREN, ENVID =0

(开启之前应该设置LCDCON5位[3]允许PWREN信号才有效)

设置LCDCON2寄存器:

VBPD [31:24]:垂直脉冲后沿延时, VBPD=VBPD_16bpp;

LINEVAL[23:14]:垂直行数,决定垂直大小, LINEVAL=272-1;

VFPD[13:6]:垂直脉冲前沿延时, VFPD= VFPD_16bpp;

VSPW[5:0]:垂直同步脉冲宽度, VSPW= VSPW_16bpp;

设置LCDCON3寄存器:

HBPD[25:19]:水平脉冲后沿延时, HBPD= HBPD_16bpp;

HOZVAL[18:8]:水平像素点个数, HBPD= 479;

HFPD[7:0]:水平脉冲前沿延时, HFPD= HFPD_16bpp;

设置LCDCON4寄存器:

HSPW[7:0]:水平同步脉冲宽度, HSPW = HSPW_16bpp;

设置LCDCON5寄存器:

FRM565[11]:设置16bpp输出格式, FRM565=1(RGB565);

INVVCLK[10]:设置VCLK记性,LCD手册如下,所以等于0,不设置(下降沿读取数据)

INVVLINE [9]:HSYNC水平同步信号反转, 因为LCD手册和2440手册不一样,所以INVVLINE=1;

INVVFRAME[8]:VSYNC垂直同步信号反转, 因为LCD手册和2440手册不一样,所以INVVFRAME =1;

INVVFRAME[3]:PWREN信号(GPG4)允许位,=0,不设置,等设置了缓存寄存器后才设置

HWSWP [0]:更改存储格式,这里HWSWP=1,BSWP[1]默认等于0,使我们的LCD像素显示从低到高排列

代码如下:


 LCDCON1 = (4<<8) | (0X3<<5) |  (0x0C <<1) | (0<<0);

 LCDCON2 = ((VBPD_16bpp)<<24) | (271<<14) |  ((VFPD_16bpp)<<6) |((VSPW_16bpp)<<0);

 LCDCON3 = ((HBPD_16bpp)<<19) | (479<<8) | ((HFPD_16bpp));

 LCDCON4 = (HSPW_16bpp);

 LCDCON5 = (1<<11) | (1<<9) | (1<<8) |  (1<<0);

 LCDCON1 &=~(1<<0);          // 关闭PWREN信号输出

 LCDCON5 &=~(1<<3);          //禁止PWREN信号

3.设置LCDSADDR1~3缓冲地址寄存器

设置LCDSADDR1寄存器:

LCDBANK[29:21]:

保存缓冲起始地址A[30:22]

LCDBASEU[20:0]:

保存缓冲起始地址A[21:1]

设置LCDSADDR2寄存器:

LCDBASEL[20:0]:

保存存缓冲结束地址A[21:1],这里我们 采用4.3寸LCD,所以等于((0x30400000+(480)*(272)*2)>>1)&0x1fffff; 这里*2是代表一个像素占了2字节,若是8bpp模式,则就不需要乘以2  

设置LCDSADDR3寄存器:

OFFSIZE[21:11]:

保存LCD上一行结尾和下一行开头的地址之间的差(半字数为单位),我们使用的是连续地址,所以不设置,默认为0

PAGEWIDTH [10:0]:

保存LCD一行占的宽度(半字数为单位),我们每个像素点是半字数,所以等于480

代码如下:         

 LCDSADDR1 = ((0x30400000>>)<<) |  ((0x30400000>>)& 0x1fffff);
LCDSADDR2 = ((0x30400000+()*()*)>>)& 0x1fffff;
LCDSADDR3 = (<<) | (*/);

4.允许并输出PWREN信号

GPGCON = (GPGCON & (~(<<))) | (<<);   // GPG4用作LCD_PWREN
GPGUP = (GPGUP & (~(<<))) | (<<); // 禁止内部上拉 LCDCON5 = (LCDCON5 & (~(<<))) | (<<); // 设置LCD_PWREN的极性: 正常
LCDCON5 = (LCDCON5 & (~(<<))) | (<<); // 允许LCD_PWREN信号输出 LCDCON1 |= ; //输出LCD_PWREN信号

 5.驱动LCD显示白色

 fb_base_addr=0x30400000;    //缓存起始地址
LCDCON1 |= 1; // 使能LCD驱动
GPBDAT |= (1<<0); // 开背光
color=0xffffff; //显示白色颜色
for (y = 0; y < 272; y++) //向缓存地址里存数据
for (x = 0; x < 480; x++)
{
UINT16 *addr = (UINT16 *)fb_base_addr + (y * 480 + x); //定义指针变量等于缓存地址
red = (color >> 19) & 0x1f;
green = (color >> 10) & 0x3f;
blue = (color >> 3) & 0x1f;
color = (red << 11) | (green << 5) | blue; // 格式5:6:5
*addr = (UINT16) color; //addr表示缓存地址,*addr表示缓存地址里的变量,
}
LCDCON1 &= 0x3fffe; // 失能LCD驱动
GPBDAT &= ~(1<<0); // 关背光

  

6.TPAL临时调色板寄存器介绍

当清屏时,可以使用TPAL寄存器,快速清屏

    位[24]     TPAL使能位

    位[23:0]  RGB数据位

例如: TPAL=0x1ffffff (使能TPAL寄存器,并设为白色屏)

裸机LCD驱动配置的更多相关文章

  1. Smart210学习-----lcd驱动

    帧缓冲设备 1.1帧缓冲设备:帧缓冲(framebuffer)是 Linux 系统为显示设备提供的一个接口,它将显示缓冲区抽象,屏蔽图像硬件的底层差异,允许上层应用程序在图形模式下直接对显示缓冲区进行 ...

  2. lcd驱动框架

    目录 lcd驱动框架 框图 程序分析 入口 打开open 读read 初始化registered_fb 注册 小结 程序设计 测试 方式一操作fb0 方式二操作tty 方式三操作终端 完整程序 tit ...

  3. Linux驱动之LCD驱动编写

    在Linux驱动之内核自带的S3C2440的LCD驱动分析这篇博客中已经分析了编写LCD驱动的步骤,接下来就按照这个步骤来字尝试字节编写LCD驱动.用的LCD屏幕为tft屏,每个像素点为16bit.对 ...

  4. 嵌入式Linux驱动学习之路(十八)LCD驱动

    驱动代码: /************************************************************************* > File Name: lcd ...

  5. S3C2440 LCD驱动(FrameBuffer)实例开发<一>(转)

    1. 背景知识 在多媒体的推动下,彩色LCD越来越多地应用到嵌入式系统中,PDA和手机等大多都采用LCD作为显示器材,因此学习LCD的应用很有实际意义! LCD工作的硬件需求:要使一块LCD正常的显示 ...

  6. 单片机模拟 1/2 Bias、1/4 Duty的 LCD 驱动使用方法

    工作原理 方式一     根据 LCD 的驱动原理可知,LCD 像素点上只能加上 AC 电压,LCD 显示器的对比度由 COM脚上的电压值减去 SEG 脚上的电压值决定,当这个电压差大于 LCD 的饱 ...

  7. sc7731 Android 5.1 LCD驱动简明笔记之一

    基于展讯sc7731 - Android 5.1 代码分析浏览.将屏蔽细节,把握整体,并且不涉及其他设备和LCD的交互. 以下对sc7731 lcd大体流程进行简要说明. 第一,lcd 的两个阶段 1 ...

  8. android系统平台显示驱动开发简要:LCD驱动调试篇『四』

    平台信息: 内核:linux3.4.39系统:android4.4 平台:S5P4418(cortex a9) 作者:瘋耔(欢迎转载,请注明作者) 欢迎指正错误,共同学习.共同进步!! 关注博主新浪博 ...

  9. LCD驱动(FrameBuffer)实例开发讲解

    一.开发环境 主  机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand, Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2 二.背景知识 ...

随机推荐

  1. Sybase数据库的连接,JNDI配置,Hibernate配置

    最近的一个项目就是移植老项目的代码,有一个模块用的是Sybase数据库,我表示从来没接触过,更不用说怎么用了.再者这东西都是几乎被淘汰的东西了,而且网上搜到的东西简直了,全是复制粘贴的. 一.使用工具 ...

  2. Docker 学习笔记

    1. Docker 资源 英文资源 Docker 官网:https://www.docker.com/ Docker 官方文档:https://docs.docker.com/ Docker wind ...

  3. opencv 访问图像像素的三种方式

    访问图像中的像素 访问图像像素有三种可行的方法方法一:指针访问指针访问访问的速度最快,Mat类可以通过ptr函数得到图像任意一行的首地址,同时,Mat类的一些属性也可以用到公有属性 rows和cols ...

  4. android学习Gallery和ImageSwitch的使用

    Gallery组件被称之为画廊,是一种横向浏览图片的列表,在使用android API 19 Platform 时会发现Gallery被画上了横线,表明谷歌已经不推荐使用该组件了, * @deprec ...

  5. python基础笔记(一)

    python解释器执行python程序的过程:python3 C:\test.py 1.启动python解释器(内存中) 2.将C:\test.py 内容从硬盘读入内存(这一步与文本编辑器是一样的) ...

  6. ML: 聚类算法R包-模糊聚类

    1965年美国加州大学柏克莱分校的扎德教授第一次提出了'集合'的概念.经过十多年的发展,模糊集合理论渐渐被应用到各个实际应用方面.为克服非此即彼的分类缺点,出现了以模糊集合论为数学基础的聚类分析.用模 ...

  7. 【EntityFramework 6.1.3】个人理解与问题记录(3)

    前言 说点题外话:前几天接连微软老爹发布了 .net core 2.0 / asp.net core 2.0 / ef core 2.0 / .net standard 2.0(此处撒花,不管是否后面 ...

  8. xargs - 地下管道

    xargs - 地下管道 xargs 促使我去思!考,管道 | 的具象含义是什么. $ cat sample.txt Things to do today: Low:Go grocery shoppi ...

  9. Entity Framework - 基于外键关联的单向一对一关系

    代码的世界,原以为世界关系很简单,确道是关系无处不在.NET世界里ORM框架中EntityFramework作为其中翘楚,大大解放了搬砖工作的重复工作,着实提高了不少生产力,而也碰到过不少问题!比如关 ...

  10. SQL笔记 --- 数据库设计步骤(转)

    SQL笔记 --- 数据库设计步骤 目录 总体设计过程需求分析概念结构设计逻辑结构设计数据库物理设计数据库实施数据库运行和维护 总体设计过程 0 » 下一篇:vim 命令集 posted @ 2012 ...