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。

因此就有了下面的代码:

现将整个代码贴出来:

  1 #define HCLK 100
  2
  3 void jz2440_lcd_pin_init(void)
  4 {
  5     /* 初始化引脚 : 背光引脚 */
  6     GPBCON &= ~0x3;
  7     GPBCON |= 0x01;
  8
  9     /* LCD专用引脚 */
 10     GPCCON = 0xaaaaaaaa;
 11     GPDCON = 0xaaaaaaaa;
 12
 13     /* PWREN */
 14     GPGCON |= (3<<8);
 15 }
 16
 17
 18 /* 根据传入的LCD参数设置LCD控制器 */
 19 void s3c2440_lcd_controller_init(p_lcd_params plcdparams)
 20 {
 21     int pixelplace;
 22     unsigned int addr;
 23
 24     jz2440_lcd_pin_init();
 25
 26     /* [17:8]: clkval, vclk = HCLK / [(CLKVAL+1) x 2]
 27      *                   9   = 100M /[(CLKVAL+1) x 2], clkval = 4.5 = 5
 28      *                 CLKVAL = 100/vclk/2-1
 29      * [6:5]: 0b11, tft lcd
 30      * [4:1]: bpp mode
 31      * [0]  : LCD video output and the logic enable/disable
 32      */
 33     int clkval = (double)HCLK/plcdparams->time_seq.vclk/2-1+0.5;
 34     int bppmode = plcdparams->bpp == 8  ? 0xb :\
 35                   plcdparams->bpp == 16 ? 0xc :\
 36                   0xd;  /* 0xd: 24bpp */
 37     LCDCON1 = (clkval<<8) | (3<<5) | (bppmode<<1) ;
 38
 39     /* [31:24] : VBPD    = tvb - 1
 40      * [23:14] : LINEVAL = line - 1
 41      * [13:6]  : VFPD    = tvf - 1
 42      * [5:0]   : VSPW    = tvp - 1
 43      */
 44     LCDCON2 =     ((plcdparams->time_seq.tvb - 1)<<24) | \
 45                 ((plcdparams->yres - 1)<<14)         | \
 46                 ((plcdparams->time_seq.tvf - 1)<<6)  | \
 47                 ((plcdparams->time_seq.tvp - 1)<<0);
 48
 49     /* [25:19] : HBPD     = thb - 1
 50      * [18:8]  : HOZVAL  = 列 - 1
 51      * [7:0]   : HFPD     = thf - 1
 52      */
 53     LCDCON3 =    ((plcdparams->time_seq.thb - 1)<<19) | \
 54                 ((plcdparams->xres - 1)<<8)              | \
 55                 ((plcdparams->time_seq.thf - 1)<<0);
 56
 57     /*
 58      * [7:0]   : HSPW     = thp - 1
 59      */
 60     LCDCON4 =    ((plcdparams->time_seq.thp - 1)<<0);
 61
 62     /* 用来设置引脚极性, 设置16bpp, 设置内存中象素存放的格式
 63      * [12] : BPP24BL
 64      * [11] : FRM565, 1-565
 65      * [10] : INVVCLK, 0 = The video data is fetched at VCLK falling edge
 66      * [9]  : HSYNC是否反转
 67      * [8]  : VSYNC是否反转
 68      * [7]  : INVVD, rgb是否反转
 69      * [6]  : INVVDEN
 70      * [5]  : INVPWREN
 71      * [4]  : INVLEND
 72      * [3]  : PWREN, LCD_PWREN output signal enable/disable
 73      * [2]  : ENLEND
 74      * [1]  : BSWP
 75      * [0]  : HWSWP
 76      */
 77
 78     pixelplace = plcdparams->bpp == 24 ? (0<<12) : |\
 79                  plcdparams->bpp == 16 ? (1<<0) : |\
 80                  (1<<1);  /* 8bpp */
 81     LCDCON5 = (plcdparams->pins_pol.vclk<<10) |\
 82               (plcdparams->pins_pol.rgb<<7)   |\
 83               (plcdparams->pins_pol.hsync<<9) |\
 84               (plcdparams->pins_pol.vsync<<8) |\
 85                (plcdparams->pins_pol.de<<6)    |\
 86               (plcdparams->pins_pol.pwren<<5) |\
 87               (1<<11) | pixelplace;
 88
 89     /* framebuffer地址 */
 90     /*
 91      * [29:21] : LCDBANK, A[30:22] of fb
 92      * [20:0]  : LCDBASEU, A[21:1] of fb
 93      */
 94     addr = plcdparams->fb_base & ~(1<<31);
 95     LCDSADDR1 = (addr >> 1);
 96
 97     /*
 98      * [20:0] : LCDBASEL, A[21:1] of end addr
 99      */
100     addr = plcdparams->fb_base + plcdparams->xres*plcdparams->yres*plcdparams->bpp/8;
101     addr >>=1;
102     addr &= 0x1fffff;
103     LCDSADDR2 = addr;//
104 }
105
106 void s3c2440_lcd_controller_enalbe(void)
107 {
108     /* 背光引脚 : GPB0 */
109     GPBDAT |= (1<<0);
110
111     /* pwren    : 给LCD提供AVDD  */
112     LCDCON5 |= (1<<3);
113
114     /* LCDCON1'BIT 0 : 设置LCD控制器是否输出信号 */
115     LCDCON1 |= (1<<0);
116 }
117
118 void s3c2440_lcd_controller_disable(void)
119 {
120     /* 背光引脚 : GPB0 */
121     GPBDAT &= ~(1<<0);
122
123     /* pwren    : 给LCD提供AVDD  */
124     LCDCON5 &= ~(1<<3);
125
126     /* LCDCON1'BIT 0 : 设置LCD控制器是否输出信号 */
127     LCDCON1 &= ~(1<<0);
128 }
129
130 struct lcd_controller s3c2440_lcd_controller = {
131     .init    = s3c2440_lcd_controller_init,
132     .enalbe  = s3c2440_lcd_controller_enalbe,
133     .disable = s3c2440_lcd_controller_disable,
134 };

转载于:https://www.cnblogs.com/-glb/p/11335680.html

LCD编程_LCD控制器相关推荐

  1. S3C2440的LCD编程

    S3C2440的LCD编程 1. LCD工作的硬件需求: 要使一块LCD正常的显示文字或图像,不仅需要LCD驱动器,而且还需要相应的LCD控制器.在通常情况下,生产厂商把LCD驱动器会以COF/COG ...

  2. php中的控制器是什么意思,理解PHP中的MVC编程之控制器_php

    简单来讲,控制器的作用就是接受请求.它使用获取的方法,在这里是通过URI,载入一个功能模块来刷新或者提交一个表述层.控制器将使用$_GET自动全局变量来判断载入哪一个模块. 一个请求的例子,看起来像这 ...

  3. APIC -- 高级可编程中断控制器

    文章目录 APIC -- 高级可编程中断控制器 1.x86 中断 2.Local APIC 2.1.1 使能或禁止 Local APIC 2.1.2 重定位 Local APIC 寄存器基地址 2.2 ...

  4. 【x86架构】APIC -- 高级可编程中断控制器

    APIC – 高级可编程中断控制器 x86架构的中断类型以及实现方式上有很多种.从中断控制器模块上分,x86中有8259中断控制器.Local APIC 以及 I/O APIC ,另外在PCI/PCI ...

  5. 一、SM1P可编程步进电机控制器简介

    SM1P可编程步进电机控制器,功能灵活,结合步进电机或者伺服电机.输入开关量.输出开关量控制的"一体机"方案. 液晶显示.方便中文指令编程,步进.伺服电机带加减速功能,支持多线程, ...

  6. 可编程DDC控制器的实现 (1)

    要实现一个可编程DDC控制器需要怎么做? 首先, 什么是可编程DDC控制器? 和PLC有什么区别? 比较详细的解释如下 应用领域:PLC最初的设计目标只是替代复杂的继电器电路,DDC最初只用于工业自动 ...

  7. 可编程中断控制器8259A

    可编程中断控制器8259A是Intel公司专为80x86 CPU控制外部中断而设计开发的芯片. 它将中断源优先级判优.中断源识别和中断屏蔽电路集于一体,不需要附加任何电路就可以对外部中断进行管理,单片 ...

  8. 可编程中断控制器 8259A

    可编程中断控制器 8259A 8259A 的中断类型号 中断源的识别:CPU要对中断请求进行处理,必须要找到相应的中断服务程序(处理中断的程序)的入口地址,这就是中断源的识别. 两种识别方法:查询中断 ...

  9. 可编程计算机控制器课设,可编程计算机控制器课程设计(电气)

    [可编程计算机控制器课程设计] [Programmable  Computer  Controller] 一.基本信息 课程代码:[099582] 课程学分:[1] 面向专业:[电气工程及其自动化] ...

最新文章

  1. 2022-2028年中国丝印硅胶行业市场深度分析及投资前景趋势报告
  2. 4.1 ucGUI 图片显示方法
  3. C++ 实现高精度的计算
  4. Ubuntu16.04 配置pytorch
  5. ASP.NET学习笔记(11)--ASP简介
  6. php7 不是有效的32位,Win7系统安装软件提示“不是有效的win32应用程序”怎么办?...
  7. ubuntu下制作u盘镜像_deepin下制作win10启动U盘
  8. centos6.5下搭建oracle 11g
  9. [HDOJ]1005. Number Sequence
  10. tnsnames.ora 的编写
  11. 【推荐算法】点击率模型特征交叉方向的发展及CAN模型介绍
  12. android一键改机之真改机build.prop
  13. 7月26日 select单表查询基础语句
  14. recyclerview简单使用
  15. ubuntu设置开机启动图形应用程序,替换默认图形桌面
  16. 真正的计算机科学,清华大学“姚半”的创始人,计算机科学界真正的“泰国斗”...
  17. R语言ggplot绘制地图-报错汇总(一)
  18. C语言字符型变量的存储和取值
  19. Tokenview | 区块链安全
  20. 如何用u盘做系统盘?

热门文章

  1. Python回顾与整理10:模块
  2. Docker入门(一) - 仓库、容器、镜像、数据卷
  3. 交换机生成树协议配置
  4. Spring学习笔记--spring+mybatis集成
  5. 【转】Backbone标准例子——通讯录
  6. ERP_Oracle Erp 11i 和 R12的区别概述(概念)
  7. eclipse 鲜为人知的调试技巧,你用过多少
  8. jQuery 学习之路(1):引子
  9. Linux下安装配置EasyPR中文车牌识别系统
  10. php 8 jit,PHP8正式版发布,带来了注解和JIT