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控制器的更多相关文章

  1. LCD编程_使用调色板

    在前面的博客中,使用的像素格式都是16bpp,24bpp(24bpp实际实际上就是32bpp)?如果想使用8bpp时,就需要使用调色板. 在以前的博客中,曾经说过,在framebuffer中如果每个像 ...

  2. LCD编程_简单测试

    首先,需要编写一个led_test.c的文件,依据代码框架,在led_test.c中我们能够看到的只是led.c.我们是看不到led_controller.c的.比如说,在led_test.c中,需要 ...

  3. LCD编程框架组织

    看下面的代码,你会发现韦老师这种组织与内核框架的组织是一脉相承的. led.c #define LCD_NUM 10 static p_lcd_params p_array_lcd[LCD_NUM]; ...

  4. LCD编程_显示文字

    在上篇博客中,实现了画点操作,然后在画点的基础上实现了画线.画圆的操作.实际上显示文字也是在画点的基础上实现的. 文字是由点组成的,那么这些点阵是在哪里获得的呢? 随便打开一个内核文件,搜索font, ...

  5. LCD编程_画点线圆

    上篇博客中进行了lcd的简单测试,这篇博客将进行更加复杂的测试——画点.画线.画圆.画线和画圆是在画点的基础上实现的,因此本篇博客重点实现画点操作. 先抛出这样的一个问题,已知: (x,y)的坐标: ...

  6. LCD控制器与驱动器

    这回我再讲讲从 MCU 到 LCD 之间是怎样一个控制流程,即我们的位图数据是怎样显示到 LCD 上的.前面我们了解到 LCD 显示是用动态扫描的方式来实现的,每次显示一整行,在一帧里每行一次扫描一遍 ...

  7. LCD framebuffer驱动设计文档

    内容提要:1. android display相关的名词2. 调试LCD驱动需要注意的步骤3. 关于帧缓冲区及I/O内存---------------------------------------- ...

  8. LCD硬件原理

    想象一下,屏幕的后面有一个电子枪,电子枪位于某个像素的背后,然后向这个像素发射红绿蓝三原色,从而就可以组成任意一种颜色.简单的说,电子枪在像素的背后一边移动,一边向像素发射红绿蓝. 如果要编写出LCD ...

  9. FL2440驱动添加(3)LCD驱动添加学习笔记

    FL2440 LCD内置控制器,320*240 TFT型LCD. 自我理解总结的两种添加驱动模式: 非platform方式添加驱动: 加载驱动: 1,硬件初始化,申请内存,并作地址映射 2,分配设备号 ...

随机推荐

  1. c语言线程中传输多个参数

    前言:c语言中创建一条线程,但是需要传送多个参数给线程的话我们自然会想到通过传送数组或者结构体来实现,下面我们来看看如何在创建线程的时候传送结构体和数组. #include <stdio.h&g ...

  2. [LeetCode] 871. Minimum Number of Refueling Stops 最少的加油站个数

    A car travels from a starting position to a destination which is target miles east of the starting p ...

  3. [LeetCode] 890. Find and Replace Pattern 查找和替换模式

    You have a list of words and a pattern, and you want to know which words in words matches the patter ...

  4. Salesforce 开发整理(九) 开发中使用的一些小技巧汇总[持续更新]

    1.查询一个对象下所有字段 当需要查询一个对象所有字段进行复制或其他操作,可以使用一段拼接的语句来查询 String query = 'select '; for(String fieldApi : ...

  5. Android保存的文件显示到文件管理的最近文件和下载列表中

    发现Android开发每搞一个和系统扯上关系的功能都要磨死人,对新手真不友好.运气不好难以快速精准的找到有效的资料

  6. RabbitMQ操作代码封装

    1.Message.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; u ...

  7. 百度语音识别在ROS下的应用-导航

    先去wiki下载百度的ros语音识别包:http://wiki.ros.org/baidu_speech 里面包含语音识别voice和speak的node节点,不过voice_node里面有一个小的错 ...

  8. Redis 内存管理 源码分析

    要想了解redis底层的内存管理是如何进行的,直接看源码绝对是一个很好的选择 下面是我添加了详细注释的源码,需要注意的是,为了便于源码分析,我把redis为了弥补平台差异的那部分代码删了,只需要知道有 ...

  9. ['1', '2', '3'].map(parseInt) 输出答案和解析

    根据题目可以了解到这道题主要考我们的是对map函数和parseInt函数的熟悉程序,所以我们先来了解这两个函数 map 根据MDN上对于map的解释:map() 方法创建一个新数组,其结果是该数组中的 ...

  10. Window 远程桌面漏洞风险,各个厂家的扫描修复方案(CVE-2019-0708)

    自微软公司于2019年5月14日发布远程桌面服务远程代码执行漏洞(CVE-2019-0708)安全公告后,整个业界都一直在密切关注,这个漏洞编号必将在当今网络中掀起腥风血雨.各大厂商也纷纷推出自己的修 ...