历史上的今天
返回首页

历史上的今天

今天是:2025年02月02日(星期日)

2020年02月02日 | ARM2440 LCD实验

2020-02-02 来源:eefocus

1. S3C2440内部LCD控制器结构图:

我们根据数据手册来描述一下这个集成在S3C2440内部的LCD控制器:

a:LCD控制器由REGBANK、LCDCDMA、TIMEGEN、VIDPRCS寄存器组成;

b:REGBANK由17个可编程的寄存器组和一块256*16的调色板内存组成,它们用来配置LCD控制器的;

c:LCDCDMA是一个专用的DMA,它能自动地把在侦内存中的视频数据传送到LCD驱动器,通过使用这个DMA通道,视频数据在不需要CPU的干预的情况下显示在LCD屏上;

d:VIDPRCS接收来自LCDCDMA的数据,将数据转换为合适的数据格式,比如说4/8位单扫,4位双扫显示模式,然后通过数据端口VD[23:0]传送视频数据到LCD驱动器;

e:TIMEGEN由可编程的逻辑组成,他生成LCD驱动器需要的控制信号,比如VSYNC、HSYNC、VCLK和LEND等,而这些控制信号又与REGBANK寄存器组中的LCDCON1/2/3/4/5的配置密切相关,通过不同的配置,TIMEGEN就能产生这些信号的不同形态,从而支持不同的LCD驱动器(即不同的STN/TFT屏)。


FIFO存储器位于LCDCDMA.。当FIFO空或部分空时,LCDCDMA要求从帧缓冲中取来要显示的图像数据,而这个帧缓冲是LCD控制器在RAM中开辟的一片缓冲区。当这个传输请求被存储控制器中的总线仲裁器接收到后,从系统存储器到内部FIFO就会成功传输4个字节。FIFO的总大小是28个字,其中低位FIFOL是12个字,高位FIFOH是16个字。

 

2. 常见TFT屏工作时序分析:

 

3.LCD提供的外部接口信号:
VSYNC/VFRAME/STV:垂直同步信号(TFT)/帧同步信号(STN)/SEC TFT信号;
HSYNC/VLINE/CPV:水平同步信号(TFT)/行同步脉冲信号(STN)/SEC TFT信号;
VCLK/LCD_HCLK:象素时钟信号(TFT/STN)/SEC TFT信号;
VD[23:0]:LCD像素数据输出端口(TFT/STN/SEC TFT);
VDEN/VM/TP:数据使能信号(TFT)/LCD驱动交流偏置信号(STN)/SEC TFT 信号;
LEND/STH:行结束信号(TFT)/SEC TFT信号;
LCD_LPCOE:SEC TFT OE信号;
LCD_LPCREV:SEC TFT REV信号;
LCD_LPCREVB:SEC TFT REVB信号。

 

所有显示器显示图像的原理都是从上到下,从左到右的。这是什么意思呢?这么说吧,一副图像可以看做是一个矩形,由很多排列整齐的点一行一行组成,这些点称之为像素。那么这幅图在LCD上的显示原理就是:
A:显示指针从矩形左上角的第一行第一个点开始,一个点一个点的在LCD上显示,在上面的时序图上用时间线表示就为VCLK,我们称之为像素时钟信号;
B:当显示指针一直显示到矩形的右边就结束这一行,那么这一行的动作在上面的时序图中就称之为1 Line;
C:接下来显示指针又回到矩形的左边从第二行开始显示,注意,显示指针在从第一行的右边回到第二行的左边是需要一定的时间的,我们称之为行切换;
D:如此类推,显示指针就这样一行一行的显示至矩形的右下角才把一副图显示完成。因此,这一行一行的显示在时间线上看,就是时序图上的HSYNC;
E:然 而,LCD的显示并不是对一副图像快速的显示一下,为了持续和稳定的在LCD上显示,就需要切换到另一幅图上(另一幅图可以和上一副图一样或者不一样,目 的只是为了将图像持续的显示在LCD上)。那么这一副一副的图像就称之为帧,在时序图上就表示为1 Frame,因此从时序图上可以看出1 Line只是1 Frame中的一行;
F:同样的,在帧与帧切换之间也是需要一定的时间的,我们称之为帧切换,那么LCD整个显示的过程在时间线上看,就可表示为时序图上的VSYNC。

 

上面时序图上各时钟延时参数的含义如下:(这些参数的值,LCD产生厂商会提供相应的数据手册)
VBPD(vertical back porch):表示在一帧图像开始时,垂直同步信号以后的无效的行数,对应驱动中的upper_margin;
VFBD(vertical front porch):表示在一帧图像结束后,垂直同步信号以前的无效的行数,对应驱动中的lower_margin;
VSPW(vertical sync pulse width):表示垂直同步脉冲的宽度,用行数计算,对应驱动中的vsync_len;
HBPD(horizontal back porch):表示从水平同步信号开始到一行的有效数据开始之间的VCLK的个数,对应驱动中的left_margin;
HFPD(horizontal front porth):表示一行的有效数据结束到下一个水平同步信号开始之间的VCLK的个数,对应驱动中的right_margin;
HSPW(horizontal sync pulse width):表示水平同步信号的宽度,用VCLK计算,对应驱动中的hsync_len;


注:对于一个已知尺寸的LCD屏,只要确定了VCLK值,行频和场频就应该知道了。但这样还不行的,因为在每一帧时钟信号中,还会有一些与屏显示无关的时钟出现,这就给确定行频和场频带来了一定的复杂性。如在HSYNC信号先后会有水平同步信号前肩(HFPD)和水平同步信号后肩(HBPD)出现,在VSYNC信号先后会有垂直同步信号前肩(VFPD)和垂直同步信号后肩(VBPD)出现,在这些信号时序内,不会有有效像素信号出现,另外HSYNC和VSYNC信号有效时,其电平要保持一定的时间,它们分别叫做水平同步信号脉宽HSPW和垂直同步信号脉宽VSPW,这段时间也不能有像素信号。因此计算行频和场频时,一定要包括这些信号。

 

对于以上这些参数的值将分别保存到REGBANK寄存器组中的LCDCON1/2/3/4/5寄存器中:(对寄存器的操作请查看S3c2440数据手册LCD部分)

 

 

 

4. 帧缓冲(FrameBuffer):
帧缓冲是Linux为显示设备提供的一个接口,它把一些显示设备描述成一个缓冲区,允许应用程序通过 FrameBuffer定义好的接口访问这些图形设备,从而不用去关心具体的硬件细节。对于帧缓冲设备而言,只要在显示缓冲区与显示点对应的区域写入颜色值,对应的颜色就会自动的在屏幕上显示。下面来看一下在不同色位模式下缓冲区与显示点的对应关系:

 

一.初始化(GPC管脚用于VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND)


二.对于控制TFT LCD来说,只用设置寄存器LCDCON1~LCDCON5(用于选择LCD类型,设置各类控制信号的时间特性等)和LCDSADDR1~LCDSADDR3(用于设置帧内存地址)几个寄存器就可以了。对于这几个寄存器的设置

其中VBPD,VFPD,VSPW,HBPD,HFPD,HSPW这几个参数是有LCD生产商提供的,根据其datashet修改就是了。


8位色显比16位等多初始化了调色板


lcddrv.h

  1 /*

  2  * FILE: lcddrv.h

  3  * 操作LCD控制器、调色板等的底层函数接口

  4  */

  5 

  6 #ifndef __LCDDRV_H__

  7 #define __LCDDRV_H__

  8 

  9 #include

 10 

 11 #define LOWER21BITS(n)  ((n) & 0x1fffff)

 12 

 13 #define BPPMODE_1BPP    0x8

 14 #define BPPMODE_2BPP    0x9

 15 #define BPPMODE_4BPP    0xA

 16 #define BPPMODE_8BPP    0xB

 17 #define BPPMODE_16BPP   0xC

 18 #define BPPMODE_24BPP   0xD

 19 

 20 #define LCDTYPE_TFT     0x3

 21 

 22 #define ENVID_DISABLE   0

 23 #define ENVID_ENABLE    1

 24 

 25 #define FORMAT8BPP_5551 0

 26 #define FORMAT8BPP_565  1

 27 

 28 #define HSYNC_NORM      0

 29 #define HSYNC_INV       1

 30 

 31 #define VSYNC_NORM      0

 32 #define VSYNC_INV       1

 33 

 34 #define BSWP            1

 35 #define HWSWP           1

 36 

 37 //TFT LCD Panel(240*320)

 38 #define MODE_TFT_1BIT_240320     (0x4101)

 39 #define MODE_TFT_8BIT_240320      (0x4102)

 40 #define MODE_TFT_16BIT_240320    (0x4104)

 41 #define MODE_TFT_24BIT_240320    (0x4108)

 42 

 43 //TFT 240320

 44 #define LCD_XSIZE_TFT_240320     (240)    

 45 #define LCD_YSIZE_TFT_240320     (320)

 46 

 47 //TFT 240320

 48 #define HOZVAL_TFT_240320    (LCD_XSIZE_TFT_240320-1)

 49 #define LINEVAL_TFT_240320    (LCD_YSIZE_TFT_240320-1)

 50 

 51 #define CLKVAL_TFT_240320    (4)

 52 // 60hz @133Mhz

 53 // (9) 60hz @100Mhz

 54 

 55 //Timing parameter for LTS350Q1(SAMSUNG) 

 56 #define VBPD_240320        ((6-1)&0xff)

 57 #define VFPD_240320        ((4-1)&0xff)

 58 #define VSPW_240320        ((2-1) &0x3f)

 59 #define HBPD_240320        ((11-1)&0x7f)

 60 #define HFPD_240320        ((2-1)&0xff)

 61 #define HSPW_240320        ((1-1)&0xff)

 62 

 63 

 64 

 65 //TFT LCD Panel(640*480)

 66 #define MODE_TFT_1BIT_640480     (0x4201)

 67 #define MODE_TFT_8BIT_640480     (0x4202)

 68 #define MODE_TFT_16BIT_640480    (0x4204)

 69 #define MODE_TFT_24BIT_640480    (0x4208)

 70 

 71 //TFT 640480

 72 #define LCD_XSIZE_TFT_640480     (640)    

 73 #define LCD_YSIZE_TFT_640480     (480)

 74 

 75 //TFT640480

 76 #define HOZVAL_TFT_640480    (LCD_XSIZE_TFT_640480-1)

 77 #define LINEVAL_TFT_640480    (LCD_YSIZE_TFT_640480-1)

 78 

 79 //Timing parameter for V16C6448AB(PRIME VIEW) 

 80 #define VBPD_640480        ((33-1)&0xff)

 81 #define VFPD_640480        ((10-1)&0xff)

 82 #define VSPW_640480        ((2-1) &0x3f)

 83 #define HBPD_640480        ((48-1)&0x7f)

 84 #define HFPD_640480        ((16-1)&0xff)

 85 #define HSPW_640480        ((96-1)&0xff)

 86 

 87 

 88 #define CLKVAL_TFT_640480     (1)

 89     //53.5hz @90Mhz

 90     //VSYNC,HSYNC should be inverted

 91     //HBPD=47VCLK,HFPD=15VCLK,HSPW=95VCLK

 92     //VBPD=32HSYNC,VFPD=9HSYNC,VSPW=1HSYNC

 93 

 94 #define LCDFRAMEBUFFER 0x30400000

 95 

 96 /*

 97  * 初始化用于LCD的引脚

 98  */

 99 void Lcd_Port_Init(void);

100 

101 /*

102  * 初始化LCD控制器

103  * 输入参数:

104  * type: 显示模式

105  *      MODE_TFT_8BIT_640480  : 640*640 8bpp的TFT LCD

106  *      MODE_TFT_16BIT_640480 : 640*640 16bpp的TFT LCD

107  */

108 void Tft_Lcd_Init(int type);

109 

110 /*

111  * 设置调色板

112  */

113 void Lcd_Palette8Bit_Init(void);

114 

115 /*

116  * 设置LCD控制器是否输出信号

117  * 输入参数:

118  * onoff: 

119  *      0 : 关闭

120  *      1 : 打开

121  */

122 void Lcd_EnvidOnOff(int onoff);

123 

124 /*

125  * 设置是否输出LCD电源开关信号LCD_PWREN

126  * 输入参数:

127  *     invpwren: 0 - LCD_PWREN有效时为正常极性

128  *               1 - LCD_PWREN有效时为反转极性

129  *     pwren:    0 - LCD_PWREN输出有效

130  *               1 - LCD_PWREN输出无效

131  */

132 void Lcd_PowerEnable(int invpwren, int pwren);

133 

134 /*

135  * 使用临时调色板寄存器输出单色图像

136  * 输入参数:

137  *     color: 颜色值,格式为0xRRGGBB

138  */

139 void ClearScrWithTmpPlt(UINT32 color);

140 

141 /*

142  * 停止使用临时调色板寄存器

143  */

144 void DisableTmpPlt(void);

145 

146 /*

147  * 改变调色板为一种颜色

148  * 输入参数:

149  *     color: 颜色值,格式为0xRRGGBB

150  */

151 void ChangePalette(UINT32 color);

152 

153 

154 #endif /*__LCDDRV_H__*/


lcddrv.c

  1 /*

  2  * FILE: lcddrv.c

  3  * 提供操作LCD控制器、调色板等的底层函数

  4  */

  5 

  6 #include

  7 #include "s3c24xx.h"

  8 #include "lcddrv.h"

  9 

 10 #define GPB0_tout0  (2<<(0*2))

 11 #define GPB0_out    (1<<(0*2))

 12 #define GPB1_out    (1<<(1*2))

 13 

 14 #define GPB0_MSK    (3<<(0*2))

 15 #define GPB1_MSK    (3<<(1*2))

 16 

 17 

 18 unsigned int fb_base_addr;

 19 unsigned int bpp;

 20 unsigned int xsize;

 21 unsigned int ysize;

 22 

 23 static const unsigned short DEMO256pal[]={

 24     0x0b5e,0xce9a,0xffd9,0x9d99,0xb63a,0xae7c,0xdd71,0x6c57,0xfd4d,0x00ae,0x9c4d,0xb5f8,0xad96,0x0131,0x0176,0xefff,0xcedd,0x9556,0xe4bf,0x00b6,0x22b7,0x002b,0x89de,0x002c,0x57df,0xab5f,0x3031,0x14bf,0x797e,0x5391,0x93ab,0x7239,0x7453,0xafdf,0x71b9,0x8c92,0x014d,0x302e,0x5175,0x0029,0x0969,0x004e,0x2a6d,0x0021,0x3155,0x4b6e,0xd677,0xf6b6,0x9b5f,0x4bb5,0xffd5,0x0027,0xdfdf,0x74d8,0x1256,0x6bcd,0x9b08,0x2ab2,0xbd72,0x84b5,0xfe52,0xd4ad,0x00ad,0xfffc,0x422b,0x73b0,0x0024,0x5246,0x8e5e,0x28b3,0x0050,0x3b52,0x2a4a,0x3a74,0x8559,0x3356,0x1251,0x9abf,0x4034,0x40b1,

 25     0x8cb9,0x00b3,0x5c55,0xdf3d,0x61b7,0x1f5f,0x00d9,0x4c59,0x0926,0xac3f,0x925f,0x85bc,0x29d2,0xc73f,0xef5c,0xcb9f,0x827b,0x5279,0x4af5,0x01b9,0x4290,0xf718,0x126d,0x21a6,0x515e,0xefbd,0xd75e,0x42ab,0x00aa,0x10b3,0x7349,0x63b5,0x61a3,0xaadf,0xcb27,0x87df,0x6359,0xc7df,0x4876,0xb5bc,0x4114,0xfe2e,0xef5e,0x65be,0x43b9,0xe5df,0x21c9,0x7d16,0x6abb,0x5c11,0x49f7,0xbc0b,0x9e1a,0x3b0f,0x202b,0xff12,0x821b,0x842f,0xbccf,0xdefb,0x8a3e,0x68fa,0xa4f1,0x38ae,0x28b7,0x21ad,0x31d7,0x0073,0x182b,0x1831,0x3415,0xbdf6,0x2dbf,0x0a5d,0xc73d,0x182c,0x293e,0x7b3d,0x643d,0x3cbd,

推荐阅读

史海拾趣

Ecera Comtek Corp公司的发展小趣事

Ecera Comtek Corp公司成立于XX世纪初,由几位热衷于电子通信技术的工程师共同创立。初创时期,公司面临着资金短缺、技术挑战和市场竞争等多重压力。然而,创始人们凭借对技术的热情和执着,不断研发创新产品,逐渐在行业内树立了口碑。他们经常通宵达旦地工作,试验新的设计方案,努力提升产品的性能和稳定性。经过数年的努力,Ecera Comtek Corp公司终于推出了首款具有竞争力的无线通信设备,为公司的发展奠定了坚实的基础。

Dantona Industries公司的发展小趣事

随着公司实力的增强,Dantona Industries开始寻求市场扩张的机会。他们首先将目光投向了海外市场,通过参加国际展会、建立海外销售网络等方式,逐步打开了国际市场的大门。然而,市场扩张也带来了新的挑战。不同国家和地区的市场需求、文化差异、法律法规等因素都需要公司去适应和应对。在这个过程中,Dantona Industries展现了出色的市场洞察力和应变能力,成功克服了各种困难,实现了市场的稳步扩张。

GE公司的发展小趣事

作为一家有社会责任感的企业,Dantona Industries始终关注环境保护和社会公益。他们积极推广绿色生产理念,采用环保材料和生产工艺,减少对环境的影响。同时,公司还积极参与社会公益活动,为贫困地区的教育、医疗等事业提供援助。这些举措不仅展现了公司的社会担当精神,也为公司赢得了良好的社会声誉和品牌形象。

Hirose Electric公司的发展小趣事

Dantona Industries非常重视人才的培养和团队建设。他们深知,一个优秀的团队是公司发展的基石。因此,公司投入大量资源用于员工培训、激励机制建设等方面。他们定期组织技术研讨会、团队拓展活动等,提升员工的业务能力和团队凝聚力。同时,公司还建立了完善的晋升机制和薪酬体系,确保员工能够享受到与公司共同成长的成果。这种以人为本的管理理念为公司的持续发展提供了有力保障。

Carlo Gavazzi公司的发展小趣事

随着全球对环境保护和社会责任的日益关注,Carlo Gavazzi公司也积极承担起自己的社会责任。公司致力于开发环保型产品和技术,推动可持续发展。同时,公司还积极参与社会公益活动,回馈社会,赢得了广泛的社会认可和尊重。

这五个故事只是Carlo Gavazzi公司发展历史中的一部分,但它们足以展示这家公司在电子行业中的奋斗、创新和成功。作为一家具有悠久历史和深厚底蕴的企业,Carlo Gavazzi公司将继续在未来的发展中书写新的篇章。

Everspin公司的发展小趣事

Everspin公司成立于XXXX年,总部和晶圆厂均位于美国亚利桑那州的钱德勒市。自成立以来,Everspin一直致力于磁阻随机存取存储器(MRAM)技术的研发和商业化。2006年,Everspin成功推出了业界第一款商业化MRAM产品,这一突破性的技术为数据存储领域带来了革命性的变化。

问答坊 | AI 解惑

这个介绍的S参数是啥东东,看来这篇文章,还是不大懂

搞射频得看看,这个介绍的S参数是啥东东,看来这篇文章,还是不大懂。…

查看全部问答>

公交车上的刷卡机是怎样通信的?

公交车上的刷卡机是怎样通信的?钱是如何扣得?…

查看全部问答>

性价比和发展前景

最近想买一块进阶的开发板,现在看到三块合心意的板,希望大家能够给点意见。 1.DE2         2.DE1                3.周立功公司即将推出的EasyFPGA 060(198 R ...…

查看全部问答>

兼容DC

用CreateCompatibleDC创建的DC 与 源DC有什么联系与区别?…

查看全部问答>

重启cdma的AT指令是什么啊

重启cdma的AT指令是什么啊!…

查看全部问答>

【请前辈们指点】初学ARM11,自己在OK6410上写了一个LED程序,但有几个地方不太明白

OK6410使用VB.NET控制ARM11开发板LED程序 我是一个从单片机思想转变到ARM上来的,一开始很不习惯使用ARM的开发方式,主要是自己对嵌入式的架构理解起来不那么快,受单片机开发影响,P0=0;即可点亮LED灯的影响,一直没太搞懂arm上LED驱动是怎么回事 ...…

查看全部问答>

MSP430的单电池供电方案

MSP430的低功耗特点是大家众所周知的,但是要发挥出430低功耗的特点其实还需要一个很好的供电方案,如果供电方案不优秀的话,MSP430所省下的功耗会很容易的被供电方案中消耗的能量抵消掉。下面这个文档介绍的就是如果利用单电池为MSP430供电。…

查看全部问答>

分立薄膜电容封装

请问这个封装是什么意思?X1-17.5*7.5…

查看全部问答>

感应计数器设计

要开发一个手持计数器,当感应头扫过抽油烟机的排风管(密的时候,不拉开)的表面,能显示出经过的圈数。难点就是手持的,要在5--15mm范围内有效(宽些更好)。z9941@126.com…

查看全部问答>

搞不懂MSP430FR5739的一段IIC示范程序

程序如下,为IIC的master通讯程序:     #include unsigned char TXData =0;                    // Pointer to TX data unsigned char TXByteCtr; int ma ...…

查看全部问答>