96SEO 2026-02-20 04:07 8
P505CLK_SRC_MASK_LCDCLK_DIV_LCD

本篇是LINUX3.14环境中的LCD驱动框架的第一篇主要讲解LCD显示的基本原理RGB控制器的运行原理LCD硬件编程的准备知识包括大量的需要使用到的寄存器详述。
由于涉及到大量的细节因此写的过程中难免有错误与遗漏因此如有发现错漏请及时留言指出。
哪些地方不好理解或没说明白也请指出我们一起讨论完善。
从这张图就可以看出。
白光经过楄光和液晶层后通过每一个像素的RGB的三个子像素后就能呈现出彩色图像。
因此LCD的电路主要任务就是控制如图中的电极板从而控制液晶形态而达到控制每个红兰绿子像素的秀光量。
显示器的颜色一般采用RGB标准通过对红(RED)、绿(GREEN)蓝(BLUE)三个颜色相互叠加得到各种不同的颜色。
通过对颜色的编码来对颜色进行量化即转换成数字量RGB是一种编码方式每种颜色根据RGB格式不同每种颜色的量化位不相同常见的RGB格式有RGB565/RGB888即:
blue:824BPP有的还会有个alpha参数用于实现图形渐变效果以及半透明效果0xFFF全透明0x0不透明
像素pix显示的最小单位在计算机只常用若干位数据来表示一个像素比如使用R8、G8、B8共24位来表示一个像素这个也称为像素深度单位为BPP
常见的有16BPP/24BPP像素深度越大则一个像素点所显示的颜色就越多所显示的颜色更广
画油画的时候通常先在调色板里配好想要的颜色再用画笔沾到画布上作画。
LCD控制器里也借用了这个概念从FrameBuffer获得数据这个数据作为索引从调色板获得对应数据再发给电子枪显示出来。
假如是16BPP的数据LCD控制器从FB取出16bit数据显示到LCD上。
当如果想节约内存对颜色要求也没那么高就可以采用调色板的方式调色板里存放了256个16bit的数据FB只存放每个像素的索引根据索引去调色板找到对应的数据传给LCD控制器再通过电子枪显示出来。
不同的组件之间的连接需要做好很多约定这些软硬件的约定构成了接口。
在LCD的屏与控制器之间的接口是开发者重点要关注的。
接口有不同层次的分别使用时注意区分
用于连接LCD驱动器与LCD控制器这间的软硬件规范。
是芯片级的接口。
在单片机上MCU接口在嵌入式中RGB接口、LVDS接口、MIPI-DSI接口
当LCD与SOC有一定的距离就需要用到传输技术来为控制器和驱动器传递信号传输线缆与控制器之前的连接也涉及到相应的软硬件规范。
应用领域小尺寸手机屏单片机应用一般4寸以下。
优势价格便宜。
劣势指令逐点写入速度慢接口执行标准Intel
应用领域嵌入式应用一般7寸以上。
优势直接写屏显示速度快劣势价格高功耗大抗EMI电磁干扰弱接口执行标准TTL
应用领域嵌入式应用一般7寸以上。
优势直接写屏显示速度快功耗小EMI电磁干扰小劣势价格高接口执行标准LVDS
由于手上是一块RGB的7寸电容屏因此本文重点介绍RGB接口的驱动方法。
下面这些内容会涉及到比较多的细节这是因为在具体编写驱动时会设置LCD控制器和LCD屏的很多参数这些个参数的具体与硬件的对应关系就在本章节列述。
如果不想看那么多可直接跳到第三章看框架介绍。
在具体编写驱动时再回头来看本章。
存SoC在内存中选一段内存用来存放颜色数据应用程序通过往显存中写数据然后通过配置将LCD控制器和这一段内存连接起来构成一个映射关系一旦这个关系建立以后LCD控制器就会自动从显存中读取像素数据传给LCD驱动器LCD驱动器会自动的控制每个像素点的液晶分子以形成最终的图像建立这个映射以后就不需要SoC再来参与任何行为了。
LCD控制器在SoC内部会集成有LCD控制器它负责通过数字接口向外部的LCD驱动器提供要显示的像素数字信号。
它必须按照一定的时序和LCD驱动器通信LCD控制器受SoC控制SoC会从内存中拿出像素数据给LCD控制器并最终传给LCD驱动器。
LCD驱动器LCD驱动器一般与LCD面板集成在一起面板需要一定的模拟电信号来控制液晶分子LCD驱动器芯片负责给面板提供控制液晶分子的模拟电信号驱动器的控制信号数字信号来自于LCD控制器的提供的接口。
LCD显示一张图片其实是每一个像素点的填充只是速度很快我们人眼没有察觉而已。
我们将LCD屏幕分为水平方向和垂直方向LCD每一行的像素点被逐一填充填充完一行继续填充下一行填充顺序可以为左-右
右-左每一帧图像就从第一行的第一个像素点一直填充到最后一行的最后一个像素点。
例如上图就现实一帧的图像(从左到右从上到下)。
时钟是LCD正确工作的核心因素。
上面所描述的每个像素的逐一发送每一行每一帧的正确发送都依靠各个时钟的有序运作。
其中最基础的是像素时钟。
显示一行LCD需要填充800个像素点。
每一个像素由RGB三元素组成每个元素(R、G、B)由8bit位数组成也就是说一个像素我们需要通过信号线传输24bit的数据。
如图所示每一个clk的脉冲发送一个像素数据。
一行共发送800个像素数据。
像素时钟clk是一个持续的信号在实际工作中必须还要解决哪一个CLK代表一行的开始哪一个CLK代表第一个有效的像素数据这就需要有水平同步时钟HSYNC。
其中CLK没有任何变化只是多了HSYNC和DEN上图中的ENB两个信号。
如图中的红色箭头当HSYNC产生了如图所示的变化表示新的一行数据传送马上开始当ENB信号线为高电平期间传输的数据视为有效数据。
这样一来一行800个像素的数据才能正确的传送完成。
按照我们之前假设的800*480LCD。
从第一行一直到最后一行整个LCD屏幕所有像素填充完毕这一过程也就是写了一帧数据我们如果要LCD能够实时显示画面很显然一帧数据肯定不够所以要给LCD不断的提供新的帧数据这无非也就是重复上述显示一帧的过程。
上图中VSYNC垂直同步信号当产生如图所示的变化就代表新的一帧数据马上开始传送。
那么这里怎么没有有效数据信号DEN呢
其实很简单因为新的一帧数据不就是从LCD第一行的第一个像素开始填充嘛那么前面我们已经说明了每一行都自己的同步信号而每一行也有对应的数据有效信号线。
所以垂直同步信号只用关心从一帧数据的同步而不同关心每一行的同步。
时序图完整的描述了几个不同的控制信号之间如何相互协作。
以及各个信号之间的工作间隔时间等。
对于LCD控制器的寄存器设置的相关参数也在这个时序图中描述。
Data)数据信号用于传输图像的像素数据。
每个像素的颜色信息通过VD信号传输。
HSYNCHorizontal
Sync水平同步信号用于同步每行图像数据的传输。
每发出一个HSYNC脉冲表示新的一行图像数据开始发送。
VSYNCVertical
Sync垂直同步信号用于同步每帧图像数据的传输。
每发出一个VSYNC脉冲表示新的一帧图像数据开始发送。
VDENVideo
Enable数据有效标志与HSYNC和VSYNC信号结合使用。
VDEN信号表示VD数据的有效性只有在VDEN为高电平时VD数据才是有效的。
LENDLine
End行结束标志是一种时序信号用于表示一行图像数据的结束。
不是所有接口都需要使用LEND信号例如210接口就没有。
VCLKVideo
Clock时钟信号用于同步图像数据的传输。
VCLK信号的频率决定了图像数据的传输速度。
想象每个像素点是由电子枪发射出来的电子枪依次扫描整个LCD界面就显示了一副完整的图像。
当发出一个HSYNC信号后电子枪就会从行末花费HBP时长移动到行首然后在VCLK时钟下在下图中阴影区域显示像素等到了行末后再等待HFP时长待HSYNC信号到来再移动到行首如此往复。
因此HBP和HFP分别决定了左边和右边的黑框。
同理当发出一个VSYNC信号后电子枪就会从列末花费VBP时长移动到列首然后在VCLK时钟下在图中阴影区域显示像素等到了列末后再等待VFP时长待VSYNC信号到来再移动到列首如此往复。
因此VBP和VFP分别决定了上边和下边的黑框。
1、产生垂直信号表示一帧数据将要开始2、经过VBP个行后才开始有效数据的第一行
类似上边距3、经过HBP具体的数值在后面会解释个CLK后才开始传输每行的有效数据。
类似调整了A4纸张的左边距4、每行有效数据传输完毕经过HFP个CLK后才开始下一行。
类似右边距5、重复3和4两个步骤一直到有效行显示完。
6、有效行显示完毕后经过VFP个行后再开始下一帧数据
Width)行同步信号的脉宽单位为1VCLK的时间。
HBP(Horizontal
Porch)水平后肩水平同步信号HSYNC的下降沿到VDEN的上升沿的间隔称为HBP。
单位为1VCLK的时间。
在图中为HBPD1。
HFP(Horizontal
Porch)水平前肩把VDEN的下降沿到水平同步信号HSYNC的上升沿的间隔称为HFP单位为1VCLK的时间。
在图中为HFPD1。
HOZVAL行显示尺寸-1即屏列宽-1对于800*480分配率的LCD屏那么HOZVAL800-1799请记住是屏列宽也就是LCD屏显示一行数据所需要的像素(pixel)的数目。
VSPW(Vertical
Width)帧同步信号的脉宽单位为1行Line的时间。
VBP(Vertical
Porch)垂直后肩垂直同步信号VSYNC下降沿到VDEN信号产生之前的一个行同步信号VHSYNC的上升沿之间隔。
单位为1行Line的时间。
在图中为VBPD1。
VFP(Vertical
Porch)垂直前肩VDEN数据信号的下降沿到垂直同步信号VSYNC产生的上升沿之间隔。
单位为1行Line的时间。
在图中为VFPD1。
LINEVAL帧显示尺寸-1即屏行宽-1对于800*480分配率的LCD屏那么LINEVAL480-1479请记住是屏行宽也就是LCD屏显示一帧数据所需要的行的数目。
VSPW、HSPW这两个值其实很简单其中的W代表width也就是宽度的意思。
所以这两个值分别描述的是垂直信号和水平信号的宽度如下图所示。
而一个VCLK时间由LCD寄存器VIDCON0内的CLKVAL决定:
------这个公式是exynos4412的LCD控制器的其他CPU的不一定一样
[(VSPW1)(VBPD1)(LINEVAL1)(VFPD1)]
下图为从linux角度对lcd时序的理解这与前面从LCD控制器的角度对lcd时序的理解差别在于hsync_len和vsync_len。
这实际是没有区别的只是理解的角度不同。
因要写的是linux的驱动因此要清楚从linux的角度是如何映射的。
可选的视频模式名称。
这个成员用于存储视频模式的名称可以是一个字符串。
可选的刷新率。
这个成员用于指定视频模式的刷新率以每秒刷新次数表示。
在每行象素数据结束到LCD行同步时钟脉冲之间插入的空闲象素时钟数
同步极性设置,可根据需要设置FB_SYNC_HOR_HIGH_ACT(水平同步高电平有效)和FB_SYNC_VERT_HIGH_ACT(垂直同步高电平有效)
显示模式。
这个成员指定了显示器的模式例如非隔行模式或隔行模式。
标志位。
这个成员用于指示视频模式的一些特性和选项例如是否支持透明度等
65000000。
sync成员用于指定同步信号的类型可以是水平同步、垂直同步或两者的组合。
FB_SYNC_HOR_HIGH_ACT表示水平同步信号在高电平时激活。
在某些视频模式中需要在高电平时发送水平同步信号。
FB_SYNC_VERT_HIGH_ACT表示垂直同步信号在高电平时激活。
在某些视频模式中需要在高电平时发送垂直同步信号。
FB_SYNC_EXT表示使用外部同步信号。
某些设备可能支持使用外部同步信号而不是内部的同步信号。
FB_SYNC_COMP_HIGH_ACT表示复合同步信号在高电平时激活。
复合同步信号是基于水平和垂直同步信号组合而成的同步信号。
FB_SYNC_BROADCAST表示广播视频时所使用的视频定时信息。
在PAL制式下垂直总行数为144行渐进扫描或288行隔行扫描在NTSC制式下垂直总行数为121行渐进扫描或242行隔行扫描。
FB_SYNC_ON_GREEN表示同步信号发送在绿色通道上。
某些视频模式可能需要使用绿色通道来传输同步信号。
vmode成员用于指定视频模式的类型可以是以下几种常见的填写方式
FB_VMODE_NONINTERLACED表示非隔行模式也即渐进扫描模式。
在这种模式下视频图像的每一帧都是通过逐行扫描显示的。
FB_VMODE_INTERLACED表示隔行模式也即隔行扫描模式。
在这种模式下视频图像的每一帧由两个交替的场组成每个场只显示图像的一半行数通过交替显示两个场来达到全帧显示的效果。
FB_VMODE_DOUBLE表示双帧缓冲模式。
在这种模式下使用两个帧缓冲器来交替渲染显示图像的每一帧可以减少视频闪烁的效果。
FB_VMODE_ODD_FLD_FIRST表示隔行模式下先显示奇数场。
在某些设备上隔行扫描模式下可以选择先显示奇数场还是偶数场。
FB_VMODE_MASK用于屏蔽其他标志位只保留视频模式的相关信息。
FB_VMODE_YWRAP表示使用y轴环绕而不是滚动。
在某些设备上可以选择使用y轴环绕来显示图像而不是滚动显示。
FB_VMODE_SMOOTH_XPAN表示支持平滑的水平滚动。
在某些设备上可以平滑地滚动图像而不是简单地按照整数像素进行滚动。
FB_VMODE_CONUPDATE表示不要更新x和y偏移量。
在某些设备上可能希望固定x和y偏移量而不更新它们。
fb_videomode时可以参考设备文档或相关的驱动程序来确定正确的填写方式。
在具体驱动编写时还要配置以上几个信号是否需要反转并去设置相应的寄存器。
判断的过程就是通过你SOC数据手册中介绍lcd的时序图另外还要再对比你屏厂的数据手册的时序图就可以判断出来
从上两图对比可以看出实验用屏的VSYNC与HSYNC需要反转。
8位灰度显示此时能表示256种颜色这时候显示不了色彩但是有了黑白明暗的区别
32位还是RGB888的颜色分布剩下的8位代表透明度故称之为ARGB是目前主流
arm-A9框架LCD7寸电容触摸tft-lcd屏分辨率1024
3.14交叉编译环境arm-linux-gnueabi-FPC连接器定义
这样所有的LCD屏与开发板相连接的引脚都能一一对应到SoC上的GPIO脚上了。
由于在linux3.14环境中在实际编写LCD驱动程序中不仅涉及到上面所介绍的相关lcd的控制原理也涉及到如何设置LCD控制寄存器的相关。
以下是对exynos4412的数据手册《4412手册完整版SEC_Exynos
Manual_Ver.0.10.00_Preliminary》摘录与翻译
exynos4412的LCD驱动程序接口支持三种接口。
它们是RGB接口、间接i80接口和用于写回的YUV接口。
显示控制器使用多达五个覆盖图像窗口这些窗口支持各种颜色格式、256级alpha混合、颜色键、x-y位置控制、软滚动和可变窗口大小等。
显示控制器支持各种颜色格式如RGB1到24BPP和YCbCr
您可以对显示控制器进行编程以支持屏幕上与水平和垂直像素数、数据接口的数据线宽、接口定时和刷新率相关的不同要求。
显示控制器传输视频数据并生成必要的控制信号例如RGB_VSYNC、RGB_HSYNC、RGB
VCLK、RGB_VDEN、SYS_CS0、SYS_CS1和SYS_WE。
除了生成控制信号外显示控制器还包含视频数据的数据端口RGB_VD[23:0]和SYS_VD
显示控制器由VSFR、VDMA、VPRCS、VTIME和视频时钟发生器组成。
121个可编程寄存器组一个伽玛LUT寄存器组64个寄存器一个i80命令寄存器组12个寄存器五个
VDMA是一种专用的显示DMA用于将帧存储器中的视频数据传输到VPRCS。
通过使用这种特殊的DMA您可以在屏幕上显示视频数据而无需CPU干预。
VPRCS从VDMA接收视频数据并通过数据端口RGB_VD或SYS_VD将其发送到显示设备LCD在将视频数据更改为合适的数据格式后例如每像素8位模式8BPP模式或每像素16位模式16BPP模式。
VTIME由可编程逻辑组成以支持不同LCD驱动器中常见的接口时序和速率的可变要求。
TIME块生成RGB_VSYNC、RGB_HSYNC、RGB_VCLK、RGB_VDEN、VEN_VSYNC、VEN_HSYNC、VEN_FIELD、VEN_HREF、SYS_CS0、SYS_CS1、SYS_WE等。
使用显示控制器数据可以通过设置LCDBLK_CFG寄存器0x1001_0210来选择上述数据路径之一。
有关更多信息请参阅“Chapter
VTIME生成用于RGB接口的控制信号例如RGB_VSYNC、RGB_HSYNC、RGB
VDEN和RGB_VCLK信号。
在VSFR寄存器中配置VIDTCON0/1/2寄存器时可以使用这些控制信号。
您可以在VSFR中对显示控制寄存器的配置进行编程。
然后VTIME模块生成支持不同类型显示设备的可编程控制信号。
RGB_VSYNC信号使LCD行指针从显示器顶部开始。
HOZVAL字段和LINEVAL寄存器的配置控制RGB_VSYNC和RGB_HSYNC的脉冲生成。
基于这些方程LCD面板的尺寸决定了HOZVAL和LINEVAL
VIDCON0寄存器中的CLKVAL字段控制RGB_VCLK信号的速率。
LCD控制器的使用全部依赖对其提供的寄存器的设置。
因此在开发lcd驱动程序时必须根据情况去设置寄存器才能使LCD正常工作。
因此以下对LCD所使用的寄存器进行一一的介绍。
LCD控制器直接操作的寄存器很多但主要有以下这些。
其中的x指代0,1,2…等数值在使用时要注意区分。
时钟寄存器是属于系统的时钟的部分其中涉及到LCD的部分时钟寄存器如下表基地址为0x1003_C000:
BLK的时钟源掩码。
如果希望使用外部时钟源来驱动LCD控制器可以设置CLK_SRC_MASK_LCD寄存器的相应位为1将其它位设置为0
BLK的IP时钟门控。
设置为1时表示使能LCD控制器的时钟设置为0时表示关闭LCD控制器的时钟。
寄存器lcdblk_cfg是Exynos4412芯片中与LCD控制器背光控制相关的寄存器。
该寄存器用于配置和控制LCD控制器背光的工作方式和参数。
Display模块。
设置为1时表示绕过FIMD模块背光控制由外部电路或外部控制器进行设置为0时表示背光控制由FIMD模块进行。
VIDOSD0A用于配置视频显示层0的位置和大小。
通过设置该寄存器的位字段可以指定视频显示层0在屏幕上的位置和大小。
VIDOSD0B用于配置视频显示层0的颜色控制。
通过设置该寄存器的位字段可以调整视频显示层0的颜色属性例如亮度、对比度、饱和度等。
VIDOSD0C用于配置视频显示层0的混合模式和透明度。
通过设置该寄存器的位字段可以指定视频显示层0的混合模式例如覆盖、叠加等以及透明度。
这些寄存器的区别在于它们分别用于配置视频显示层的不同方面。
VIDOSD0A用于配置位置和大小VIDOSD0B用于配置颜色控制VIDOSD0C用于配置混合模式和透明度。
4.4.2.5
到此有了以上的知识准备接下来就可以开始进行LCD驱动程序的开发了。
在下一篇中我们将讲述linux3.14中的LCD驱动的FrameBuffer框架相关内容。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback