LCD编程_LCD控制器
CLKVAL :
VCLK = HCLK / [(CLKVAL+1) x 2]--------> CLKVAL = HCLK/VCLK/2-1
在这个地方HCLK=100M,那么VLCK等于多少呢?需要打开lcd的芯片手册
从中可以看出,5<= vclk<=12,正常情况是取9.
当VCLK =9 时,CLKVAL = 4.5 。取一个整数为5。当CLKVAL取为5时,再判断一下,VCLK是否在5到12之间。
PNRMODE:取11 = TFT LCD panel
BPPMODE :只支持8bpp/16bpp/24bpp
ENVID:LCD video output and the logic enable/disable. 用来使能LCD控制器本身,是否输出信号。在这个地方暂不设置,后面初始化函数中再进行设置。
将上一篇博客中led.h文件中的time_sequence增加一个数据成员vclk。
因此就有了下面这样的代码:
2、垂直方向和水平方向上一些参数的设置
垂直:
水平:
从上面的图可以看出:
垂直:
VBPD+1 = tvb -------->VBPD = tvb - 1
VFPD+1 = tvf --------->VFPD = tvf - 1
VSPW+1 = tvp --------->VSPW = tvp - 1
LINEVAL+1 = line ----->LINEVAL = line -1
水平:
HBPD+1 = thb
HBPD+1 = thb -------->HBPD= thb - 1
HFPD+1 = thf --------->HFPD = thf - 1
HOZVAL +1 = line ----->HOZVAL = 列 -1
注意在这个地方水平方向的同步脉冲宽度并没有设置,别急它是在另一个寄存器中设置的。
HSPW+1 = thp ------>HSPW = thp - 1
因此有了下面的代码:
3、
BPP24BL : This bit determines the order of 24 bpp video memory 。这一位只对24bpp中数据的存放格式有影响,对16bpp/8bpp都是没有影响的。
如果采用的是24bpp,在这里我们采用第一种方式,即将BPP24BL设置为0
那如果是16bpp,应该设置什么东西,使其指定数据的存放格式呢?
对于16bpp来说,是通过HWSWP来进行指定数据存放格式的,在此将HWSWP取为1
对于8bpp来说,又是通过什么来进行指定呢?
对于8bpp来说,是通过BSWP来进行指定数据存放格式的,在此将BSWP取为1
在这个地方,我们用pixelplace来指定数据存放的格式。
FRM565 : This bit selects the format of 16 bpp output video data. 用来设置16bpp数据输出的格式的,采用565格式。
INVVCLK:This bit controls the polarity of the VCLK active edge 。这一位控制着VCLK是上升沿有效还是下降沿有效。
INVVLINE :水平同步信号的极性
INVVFRAME:垂直同步信号的极性
INVVD :数据的极性
INVVDEN :数据使能信号的极性
INVPWREN :电源信号的极性
因此有了下面的程序:
4、framebuffer地址
至此,根据传入的LCD参数设置LCD控制器就已经完成了。
5、
接下来完成s3c2440_lcd_controller_enalbe,首先来看一下,lcd的原理图。
LED是lCD的背光驱动的电源。LED的背光驱动电路:
当KEYBOARD为高电平时,它可以给背光驱动电路提供电源,此时LCD才会亮起来。
那KEYBOARD又接在哪里呢?搜索一下:
可以看到KEYBOARD接的是GPB0,用于控制背光灯。需要设置为输出,需要设置GPBCON寄存器
使GPB0输出为1,需要设置GPBDAT寄存器
LCDCON1中的bit0,用来使能LCD控制器本身,是否输出信号。需要设置为1
LCDCON5中的PWREN
PWREN:LCD_PWREN output signal enable/disable.
6、
再看一下lcd的原理图,对于lcd用到的那些引脚也需要进行设置。
比如说VD19这样的引脚,搜索VD19
从这个图可以看出,对于VD[23:0],用到了两组寄存器 GPD和GPC。
对于VM,需要设置GPC4;
对于VLINE,需要设置GPC2
对于LCD_LPCREVB,需要设置GPC7
对于LCD_LPCREV,需要设置GPC6
对于VFRAME,需要设置GPC3
对于VCLK,需要设置GPC1
对于LEND,需要设置GPC0
打开GPDCON和GPCCON寄存器,看一下:
可以看到相邻的两位取10即可。
可以看到相邻的两位取10即可。
对于LCD_PWREN,需要设置GPG4。
因此就有了下面的代码:
现将整个代码贴出来:
- #define HCLK 100
- void jz2440_lcd_pin_init(void)
- {
- /* 初始化引脚 : 背光引脚 */
- GPBCON &= ~0x3;
- GPBCON |= 0x01;
- /* LCD专用引脚 */
- GPCCON = 0xaaaaaaaa;
- GPDCON = 0xaaaaaaaa;
- /* PWREN */
- GPGCON |= (<<);
- }
- /* 根据传入的LCD参数设置LCD控制器 */
- void s3c2440_lcd_controller_init(p_lcd_params plcdparams)
- {
- int pixelplace;
- unsigned int addr;
- jz2440_lcd_pin_init();
- /* [17:8]: clkval, vclk = HCLK / [(CLKVAL+1) x 2]
- * 9 = 100M /[(CLKVAL+1) x 2], clkval = 4.5 = 5
- * CLKVAL = 100/vclk/2-1
- * [6:5]: 0b11, tft lcd
- * [4:1]: bpp mode
- * [0] : LCD video output and the logic enable/disable
- */
- int clkval = (double)HCLK/plcdparams->time_seq.vclk/-+0.5;
- int bppmode = plcdparams->bpp == ? 0xb :\
- plcdparams->bpp == ? 0xc :\
- 0xd; /* 0xd: 24bpp */
- LCDCON1 = (clkval<<) | (<<) | (bppmode<<) ;
- /* [31:24] : VBPD = tvb - 1
- * [23:14] : LINEVAL = line - 1
- * [13:6] : VFPD = tvf - 1
- * [5:0] : VSPW = tvp - 1
- */
- LCDCON2 = ((plcdparams->time_seq.tvb - )<<) | \
- ((plcdparams->yres - )<<) | \
- ((plcdparams->time_seq.tvf - )<<) | \
- ((plcdparams->time_seq.tvp - )<<);
- /* [25:19] : HBPD = thb - 1
- * [18:8] : HOZVAL = 列 - 1
- * [7:0] : HFPD = thf - 1
- */
- LCDCON3 = ((plcdparams->time_seq.thb - )<<) | \
- ((plcdparams->xres - )<<) | \
- ((plcdparams->time_seq.thf - )<<);
- /*
- * [7:0] : HSPW = thp - 1
- */
- LCDCON4 = ((plcdparams->time_seq.thp - )<<);
- /* 用来设置引脚极性, 设置16bpp, 设置内存中象素存放的格式
- * [12] : BPP24BL
- * [11] : FRM565, 1-565
- * [10] : INVVCLK, 0 = The video data is fetched at VCLK falling edge
- * [9] : HSYNC是否反转
- * [8] : VSYNC是否反转
- * [7] : INVVD, rgb是否反转
- * [6] : INVVDEN
- * [5] : INVPWREN
- * [4] : INVLEND
- * [3] : PWREN, LCD_PWREN output signal enable/disable
- * [2] : ENLEND
- * [1] : BSWP
- * [0] : HWSWP
- */
- pixelplace = plcdparams->bpp == ? (<<) : |\
- plcdparams->bpp == ? (<<) : |\
- (<<); /* 8bpp */
- LCDCON5 = (plcdparams->pins_pol.vclk<<) |\
- (plcdparams->pins_pol.rgb<<) |\
- (plcdparams->pins_pol.hsync<<) |\
- (plcdparams->pins_pol.vsync<<) |\
- (plcdparams->pins_pol.de<<) |\
- (plcdparams->pins_pol.pwren<<) |\
- (<<) | pixelplace;
- /* framebuffer地址 */
- /*
- * [29:21] : LCDBANK, A[30:22] of fb
- * [20:0] : LCDBASEU, A[21:1] of fb
- */
- addr = plcdparams->fb_base & ~(<<);
- LCDSADDR1 = (addr >> );
- /*
- * [20:0] : LCDBASEL, A[21:1] of end addr
- */
- addr = plcdparams->fb_base + plcdparams->xres*plcdparams->yres*plcdparams->bpp/;
- addr >>=;
- addr &= 0x1fffff;
- LCDSADDR2 = addr;//
- }
- void s3c2440_lcd_controller_enalbe(void)
- {
- /* 背光引脚 : GPB0 */
- GPBDAT |= (<<);
- /* pwren : 给LCD提供AVDD */
- LCDCON5 |= (<<);
- /* LCDCON1'BIT 0 : 设置LCD控制器是否输出信号 */
- LCDCON1 |= (<<);
- }
- void s3c2440_lcd_controller_disable(void)
- {
- /* 背光引脚 : GPB0 */
- GPBDAT &= ~(<<);
- /* pwren : 给LCD提供AVDD */
- LCDCON5 &= ~(<<);
- /* LCDCON1'BIT 0 : 设置LCD控制器是否输出信号 */
- LCDCON1 &= ~(<<);
- }
- struct lcd_controller s3c2440_lcd_controller = {
- .init = s3c2440_lcd_controller_init,
- .enalbe = s3c2440_lcd_controller_enalbe,
- .disable = s3c2440_lcd_controller_disable,
- };
LCD编程_LCD控制器的更多相关文章
- LCD编程_使用调色板
在前面的博客中,使用的像素格式都是16bpp,24bpp(24bpp实际实际上就是32bpp)?如果想使用8bpp时,就需要使用调色板. 在以前的博客中,曾经说过,在framebuffer中如果每个像 ...
- LCD编程_简单测试
首先,需要编写一个led_test.c的文件,依据代码框架,在led_test.c中我们能够看到的只是led.c.我们是看不到led_controller.c的.比如说,在led_test.c中,需要 ...
- LCD编程框架组织
看下面的代码,你会发现韦老师这种组织与内核框架的组织是一脉相承的. led.c #define LCD_NUM 10 static p_lcd_params p_array_lcd[LCD_NUM]; ...
- LCD编程_显示文字
在上篇博客中,实现了画点操作,然后在画点的基础上实现了画线.画圆的操作.实际上显示文字也是在画点的基础上实现的. 文字是由点组成的,那么这些点阵是在哪里获得的呢? 随便打开一个内核文件,搜索font, ...
- LCD编程_画点线圆
上篇博客中进行了lcd的简单测试,这篇博客将进行更加复杂的测试——画点.画线.画圆.画线和画圆是在画点的基础上实现的,因此本篇博客重点实现画点操作. 先抛出这样的一个问题,已知: (x,y)的坐标: ...
- LCD控制器与驱动器
这回我再讲讲从 MCU 到 LCD 之间是怎样一个控制流程,即我们的位图数据是怎样显示到 LCD 上的.前面我们了解到 LCD 显示是用动态扫描的方式来实现的,每次显示一整行,在一帧里每行一次扫描一遍 ...
- LCD framebuffer驱动设计文档
内容提要:1. android display相关的名词2. 调试LCD驱动需要注意的步骤3. 关于帧缓冲区及I/O内存---------------------------------------- ...
- LCD硬件原理
想象一下,屏幕的后面有一个电子枪,电子枪位于某个像素的背后,然后向这个像素发射红绿蓝三原色,从而就可以组成任意一种颜色.简单的说,电子枪在像素的背后一边移动,一边向像素发射红绿蓝. 如果要编写出LCD ...
- FL2440驱动添加(3)LCD驱动添加学习笔记
FL2440 LCD内置控制器,320*240 TFT型LCD. 自我理解总结的两种添加驱动模式: 非platform方式添加驱动: 加载驱动: 1,硬件初始化,申请内存,并作地址映射 2,分配设备号 ...
随机推荐
- WEB前端开发职业学习路线初级完整版
作者 | Jeskson 来源 | 达达前端小酒馆 下面小编专门为广大web前端开发职业者汇总了学习路线初级完整版,其实web前端开发工程师可算是高福利,高薪水的职业了,所以现在学习web前端开发的技 ...
- [LeetCode] 854. K-Similar Strings 相似度为K的字符串
Strings A and B are K-similar (for some non-negative integer K) if we can swap the positions of two ...
- WPF 目录树绑定 与 遍历
定义树节点,(编译环境VS2017) public class GBTreeNode : INotifyPropertyChanged { private string _deviceId = str ...
- ASP.NET Core2使用Autofac实现IOC依赖注入竟然能如此的优雅简便(转载)
原文地址:https://www.cnblogs.com/Andre/p/9604759.html 初识ASP.NET Core的小伙伴一定会发现,其几乎所有的项目依赖都是通过依赖注入方式进行链式串通 ...
- C#调用WPS将文档转换成pdf进行预览
引用:https://www.jianshu.com/p/445996126c75 vs启动项目可以生成wps实例 本地iis部署的站点却不行 原因是vs是管理员权限,而iis没有权限 解决方法 启动 ...
- # Leetcode 67:Add Binary(二进制求和)
Leetcode 67:Add Binary(二进制求和) (python.java) Given two binary strings, return their sum (also a binar ...
- Linux内核中的并发与竞态概述
1.前言 众所周知,Linux系统是一个多任务的操作系统,当多个任务同时访问同一片内存区域的时候,这些任务可能会相互覆盖内存中数据,从而造成内存中的数据混乱,问题严重的话,还可能会导致系统崩溃. 2. ...
- Deep Learning专栏--强化学习之MDP、Bellman方程(1)
本文主要介绍强化学习的一些基本概念:包括MDP.Bellman方程等, 并且讲述了如何从 MDP 过渡到 Reinforcement Learning. 1. 强化学习基本概念 这里还是放上David ...
- 干货最新版 Spring Boot2.1.5 教程+案例合集
最近发了一系列的 Spring Boot 教程,但是发的时候没有顺序,有小伙伴反映不知道该从哪篇文章开始看起,刚好最近工作告一个小小段落,松哥就把这些资料按照学习顺序重新整理了一遍,给大家做一个索引, ...
- 另一种缓存,Spring Boot 整合 Ehcache
用惯了 Redis ,很多人已经忘记了还有另一个缓存方案 Ehcache ,是的,在 Redis 一统江湖的时代,Ehcache 渐渐有点没落了,不过,我们还是有必要了解下 Ehcache ,在有的场 ...