ARM--LCD控制原理笔记
目录
概念:
2440LCD接口原理图解析:
LCD显示图像原理:
扫描:
LCD时序:
控制信号:
时序图:
时序图时间参数:
LCD 控制器
LCD接口介绍:
概念:
2440LCD接口原理图解析:
①是时钟信号,每来一个CLK,电子枪就移动一个像素;
②是用来传输颜色数据;
③是垂直方向同步信号,FRAME(帧);
④是水平方向同步信号,LINE(行);
LCD显示图像原理:
扫描:
想象有一个电子枪,一边移动,一边发出各种颜色的光。这里有很多细节问题,我们一个一个的梳理。
- 1. 电子枪是如何移动的?
答:有一条CLK时钟线与LCD相连,每发出一次CLK(高低电平),电子枪就移动一个像素。
- 2. 颜色如何确定?
答:由连接LCD的三组线:R(Red)、G(Green)、B(Blue)确定。
- 3. 电子枪如何得知应跳到下一行?
答:有一条HSYNC信号线与LCD相连,每发出一次脉冲(高低电平),电子枪就跳到下一行。
- 4. 电子枪如何得知应跳到原点?
答:有一条VSYNC信号线与LCD相连,每发出一次脉冲(高低电平),电子枪就跳到原点。
- 5. RGB线上的数据从何而来?
答:内存里面划分一块显存(FrameBuffer),里面存放了要显示的数据,LCD控制器从里面将数据读出来,通过RGB三组线传给电子枪,电子枪再依次打到显示屏上。
- 6. 前面的信号由谁发给LCD?
答:有S3C2440里面的LCD控制器来控制发出信号。
总结:
1、cpu初始化一块显存显存(FrameBuffer) ,
2、建立 显存(FrameBuffer)和LCD控制器的关系
3、LCD控制器向LCD驱动器发出控制信号和显示的数据
4、LCD驱动器给显示面板发送模拟信号控制面板在何处显示什么颜色的点
LCD时序:
控制信号:
- Vsync 帧同步信号,一帧数据就是填充一个屏幕画面的数据,相当于一幅图片,Vsync 一个脉冲代表一帧,一帧(一个画面)显示完毕后,接着发出Vsync 同步信号,扫描枪头回到顶端位置,准备显示下一帧数据
- Hsync 行同步信号,一个Hsync脉冲代表显示一行数据,一行像素显示完毕后发出下一行Hsync控制信号,接着回到下一行开始重新开始扫描
- CLK 在有效的时钟内,每个像素点就是一个时钟脉冲
时序图:
时序图时间参数:
- thp (Horizontal Pulse width ) 水平同步信号脉冲宽度: 这个时间不能太短,太短电子枪可能识别不到
- thb HBP(Horizontal Back Porch)水平后沿 在每行或每列的象素数据开始输出时要插入的象 素时钟周期数 也就是说每显示完一行像素点,要插入几个等待周期,等待下一行像素点开始
- thd Horizontal display period 水平显示周期,就是显示一行像素点的时间
- thf HFP(Horizontal Front Porch ) 水平前沿:在每行或每列的象素结束到LCD 行时钟输出脉冲 之间的象素时钟数, 就是说,一行显示完了,要插入几个等待周期,让枪头回到下一行开始的位置。
- tvp Vertical Pulse width
- tvb VBP(Vertical Back Porch) 垂直后沿:在垂直同步周期之后帧开头时的无效行数 一帧开始的准备阶段的等待周期时间
- tvd Vertical display period 显示一帧的时间
- tvf VFP(Vertical Front Porch)垂直前沿:本帧数据输出结束到下一帧垂直同步周期开始之 前的无效行数 HPW(HSYNC plus width)行同步脉宽 单位:像素时钟周期
当发出一个HSYNC信号后,电子枪就会从最右边花费HBP时长移动到最左边,等到了最右边后,等待HFP时长HSYNC信号才回来。因此,HBP和HFP分别决定了左边和右边的黑框。
同理,当发出一个VSYNC信号后,电子枪就会从最下边花费VBP时长移动到最上边,等到了最下边后,等待VFP时长VSYNC信号才回来。因此,VBP和VFP分别决定了上边和下边的黑框。 中间灰色区域才是有效显示区域。
再来解决最后一个问题:每个像素再FrameBuffer中,占据多少位BPP(Bits Per Pixels)? 前面的LCD引脚功能图里,R0-R7、G0-G7、B0-B7,每个像素是占据3*8=24位的,即硬件上LCD的BPP是确定的。虽然LCD上的引脚是固定的,但我们使用的时候,可以根据实际情况进行取舍,比如我们的JZ2440使用的是16BPP,因此LCD只需要R0-R4、G0-G5、B0-B4与SOC相连,5+6+5=16BPP,每个像素就只占据16位数据
LCD 控制器
[27:18]为只读数据位,不需要设置;
[17:8]用于设置CLKVAL(像素时钟频率),我们使用的是TFT屏,因此采用的公式是VCLK = HCLK / [(CLKVAL+1) x 2],其中HCLK为100M。LCD手册里面Clock cycle的要求范围为5-12MHz即可,即假设VCLK=9,根据公式9=100/[(CLKVAL+1)x2],算出CLKVAL≈4.5=5。VCLK为plcdparams->time_seq.vclk,则clkval = HCLK/plcdparams->time_seq.vclk/2-1+0.5;
[7]不用管,默认即可;
[6:5]TFT lcd配置为0b11;
[4:1]设置bpp模式,根据传入的plcdparams->bpp配置为相应的数值;
[0]LCD输出使能,先暂时关闭不输出;
/* [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 = (float)HCLK/plcdparams->time_seq.vclk/2-1+0.5;
//int clkval = 5;
int bppmode = plcdparams->bpp == 8 ? 0xb :\
plcdparams->bpp == 16 ? 0xc :\
0xd; /* 0xd: 24,32bpp */
LCDCON1 = (clkval<<8) | (3<<5) | (bppmode<<1) ;
注意: VBPD = tvb - 1 这个要对比两个数据手册
对比2440LCD部分时序图和LCD时序图,得出两者之间关系,以后就可通过plcdparams传参数进来设置相关寄存器。
[31:24] : VBPD = tvb - 1
[23:14] : LINEVAL = line - 1
[13:6] : VFPD = tvf - 1
[5:0] : VSPW = tvp - 1
/* [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 - 1)<<24) | \
((plcdparams->yres - 1)<<14) | \
((plcdparams->time_seq.tvf - 1)<<6) | \
((plcdparams->time_seq.tvp - 1)<<0);
[25:19] : HBPD = thb - 1
[18:8] : HOZVAL = 列 - 1
[7:0] : HFPD = thf - 1
/* [25:19] : HBPD = thb - 1
* [18:8] : HOZVAL = 列 - 1
* [7:0] : HFPD = thf - 1
*/
LCDCON3 = ((plcdparams->time_seq.thb - 1)<<19) | \
((plcdparams->xres - 1)<<8) | \
((plcdparams->time_seq.thf - 1)<<0);
HSPW = thp - 1
/*
* [7:0] : HSPW = thp - 1
*/
LCDCON4 = ((plcdparams->time_seq.thp - 1)<<0);
脚极性, 设置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
/* 用来设置引脚极性, 设置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 == 32 ? (0) : \
plcdparams->bpp == 16 ? (1) : \
(1<<1); /* 8bpp */
LCDCON5 = (plcdparams->pins_pol.vclk<<10) |\
(plcdparams->pins_pol.rgb<<7) |\
(plcdparams->pins_pol.hsync<<9) |\
(plcdparams->pins_pol.vsync<<8) |\
(plcdparams->pins_pol.de<<6) |\
(plcdparams->pins_pol.pwren<<5) |\
(1<<11) | pixelplace;
[29:21] : LCDBANK, A[30:22] of fb
[20:0] : LCDBASEU, A[21:1] of fb
即用[29:0]表示起始地址的[30:1]。
[20:0] : LCDBASEL, A[21:1] of end addr
即framebuffer的结束地址。
专业术语(英文解释):
horizontal 水平
vertical 垂直
pixels 像素
panel 面板
pallet 调色
non-palletized 无调色
dedicated 专用的
generate 发生
register sets 寄存器组
intervention. 干涉,介入
data flow 数据流
is present in 存在于
partially 部分
arbitrator 仲裁
successive 连续的
In case of 万一,假如
burst memory transfer mode 突发传输模式
without allowing 不允许
mastership 控制权
Dummy Bit 无效位
toggle rate 反转效率
indicate 保存,指示表明
YT_SEU: 请教下,_start之后的第二条指令就是跳转到_start,那岂不是一直循环?
多少詹点: AT+CLBS=1,1不返回东西
CSDN-Ada助手: 推荐 Python入门 技能树:https://edu.csdn.net/skill/python?utm_source=AI_act_python
崔崔崔崔崔不灭: 老哥,提示访问不了git网站怎么解决啊,搜了一大堆教程,环境像也没用
Lvxuanman: 学长你好,请问AT+SAPBR=3,1,"APN","UNINET" AT+SAPBR=1,1 出现error,是什么原因呢