`

LCD 原理和移植总结

阅读更多

LCD 原理和移植总结



图1. LCD子系统结构



Framebuffer:是linux的framebuffer驱动在内存开辟的一块显存,存放一帧图像数据。
IPU:是mx51的图像处理单元,里面包含DMA控制器和DI显示接口等。
LCD Driver :是一块和LCD屏幕整合在一起的驱动芯片,接收IPU传过来的数据和时序信号,转化为有规律的LCD驱动电压。

一幅图像的显示过程是这样的:用户打开/dev/fbx设备,使用mmap()系统调用映射framebuffer内存空间到用户空间,用户直接用 memcpy()复制图像数据到framebuffer,DMA探测到framebuffer数据发生变动,启动DMA传输图像数据到IPUI,PU再根 据framebuffer驱动设置的处理模式对像素数据进行一系列处理,比如framebuffer使用了overlay framebuffer那就启动overlay处理单元混合两个framebuffer的数据,另外IPU还会packing像素数据,比如 framebuffer里像素格式为RGB565,IPU会把他packing成RGB666的格式,以配合LCD模块的接口。IPU处理完数据后,送到 DI,在DI时序模块产生的时序信号同步下,一起输出到LCD驱动芯片。

移植LCD驱动的第一步,是确保IPU输出给LCD Driver的时序、数据、供电信号是对的。
时序信号一般是根据LCD的datasheet上的参数,填写fb_videomode这个结构体:

struct fb_videomode {
        const char *name;        /* optional */
        u32 refresh;                /* optional */
        u32 xres;                // x分辨率
        u32 yres;                // y分辨率
        u32 pixclock;                // 像素时钟频率,即每个时钟周期显示一个像素点
        u32 left_margin;        // 行扫描开始脉冲到一行像素数据开始输出的延迟 hsync<==>DEN
        u32 right_margin;        // 一行像素数据输出完毕到下一行的行扫描开始脉冲间的延迟 DEN <==>hsync
        u32 upper_margin;        // 帧扫描开始脉冲到第一行像素数据开始输出的延迟 vsync<==>DEN(1st line)
        u32 lower_margin;        // 最后一行像素数据输出结束到下一帧的那帧扫描开始脉冲间的延迟DEN(last line)<==>vsync
        u32 hsync_len; // 行扫描脉冲宽度,单位为pixclock
        u32 vsync_len; // 帧扫描脉冲宽度,单位为line
        u32 sync; // 各同步信号的极性定义,如hsync、vsync、DEN的极性等。
        u32 vmode; // 显示模式,逐行还是隔行扫描
        u32 flag; // 一般为0
};

这个结构体定义完之后,对于一般的LCD,在连线正确的情况下,系统启动后应该就出来图像了,此时图像可能是上下跳动或者左右有偏移,这就需要再调整一下 fb_videomode中left/right/upper/lower margin参数。如果上电后没有图像,则首先用示波器检测hsync, vsync,DEN,pclk等波形是否正确,使用双踪示波器通过hsync、vsync与DEN的比对查看left/right/upper /lower margin是否合适。如果这些信号都没有问题,那么说明LCD需要通过spi总线发送命令对其进行初始化。初始化代码一般由LCD厂商提供,不过很多厂 商提供的初始化代码都有问题,会导致LCD白屏或者其他不正常的现象。

TFT LCD的原理:



图2. TFT LCD截面图



TFT LCD主要由两个透明电极,中间的液晶分子和一个有色玻璃组成。在没有通电的情况下,液晶分子呈无规则排列,背光无法透过液晶层。当有外加电场时,液晶分 子顺着电场的方向有序排列,背光可以通过,并且由于有色玻璃的滤光,呈现红,绿,蓝色调,不过,背光的透过率只有10%,这是LCD的一个缺点。

以上是一个像素中的一个RGB分量的产生过程。接下来看看如何整合这个基本单元,组成一个LCD屏幕。



图3. LCD平面图



这个图比上面多出来的是2种长条和一种MOS晶体管。这3个东西的作用是在一定的时序下给各显示电极充电。横向的长条和LCD驱动芯片的Gate Driver连接的,用于打开各行的MOSFET。纵向的长条和LCD驱动芯片的Source Driver连接,代表RGB数据。整个过程大致是这样的:首先第一行的Gate线产生一个充电脉冲,使第一行的MOS管导通,同时Source线那边经 过数模转换后的RGB电压也已经就绪,于是通过MOS管对显示电极充电,每个pixel clock充电一个像素,即3根Source线完成充电。对于320x480的屏,一共有480根Gate线,320x3=960根Source线,则经 过320个pclk后,第一行充电完成,显示出相应的画面。然后,第二行的Gate线产生一个充电脉冲,一次类推,直到最后一行,又从第一行开 始.....



图4. LCD基本结构





图4. LCD传输分解





图5. LCD基本单元图




图6. LCD阵列图




图7. LCD信号图




图8. LCD整体框图



LCD点屏步骤:
1.参考LCD datasheet修改fb_videomode结构体的参数。
2.配置GPIO,点亮LCD背光。
3.参考LCD datasheet看这个LCD是否需要spi总线发送命令进行初始化,一般厂商给datasheet时也会给一份初始化代码,不过有些参数是错误的,需要调整,发送不正确的命令会导致LCD白屏。
4.用示波器测试从LCD控制器出来的Hsync, Vsync, DE, PCLK是否正确,用万用表测量Vio, Vci是否正常。
5.有的LCD Driver需要LCD控制器发出一个CS片选使能信号。
6.用万用表测量LCD的栅压是否正常,一般为9.2V。
7.如果上述步骤后还出不来,再检查LCD初始化命令是否正确,spi时序是否符合。

图像异常处理:
1.驱动问题
上下抖动,左右没对齐:调整left/right/upper/lower margin值
2.LCD初始化命令问题
有纹波:调整VDD/AVDD/VGL/VGH电压
色彩失真:看LCD的RGB模式设置和LCD控制器出来的RGB模式是否一致
分享到:
评论

相关推荐

    AM335X LCD驱动移植

    总结起来,AM335X LCD驱动移植的关键步骤包括:理解时钟域配置原理并实际配置时钟域;配置LCD控制器寄存器,满足特定LCD屏幕的时序要求;生成图像的十六进制数据数组;在Uboot中增加LCD显示功能;通过自定义命令实现...

    基于STM32的LCD移植

    接下来,要了解LCD的工作原理,包括时序控制和数据传输。LCD通常有多种工作模式,例如SPI、I2C或并行接口,每种模式的时序不同。例如,并行接口通常需要更多的GPIO引脚,但数据传输速度快;而SPI和I2C则使用较少的...

    STM32 F407探索者移植正点原子LCD例程(CubeMx)

    总结起来,STM32 F407探索者移植正点原子LCD例程涉及到的知识点包括STM32 CubeMX的使用、GPIO和通信接口配置、LCD驱动库的移植与应用、以及调试技巧。通过这个过程,开发者不仅可以掌握STM32的开发技能,还能深入...

    FPGA TFT LCD 控制器 源码工程,基于 高云 GW1N LV1 。包含移植好LVGL 的F407工程,原理图。

    总结来说,这个资源包提供了基于高云GW1N LV1 FPGA的TFT LCD控制器设计,包括STM32 F407的LVGL移植项目和FPGA的硬件设计。开发者可以利用这些资源学习FPGA驱动LCD的技术,了解如何在嵌入式系统中集成图形界面,以及...

    LCD多级菜单显示Menu.rar_LCD 列表 显示_LCDdriver_lcd 菜单_lcd显示菜单_菜单

    移植性强意味着这个框架可以方便地应用到不同类型的LCD驱动和硬件平台上。 6. 实现细节 - 链表:链表是一种线性数据结构,每个节点包含数据和指向下一个节点的指针。在多级菜单中,每个节点代表一个菜单项,指针...

    Linux的LCD驱动源码分析及移植.doc

    总结来说,Linux LCD驱动的源码分析与移植是一个涉及硬件理解、内核机制掌握以及驱动编程的过程。通过对平台设备的注册、资源分配、中断处理等步骤,实现驱动程序与硬件的对接,从而让Linux系统能够正确控制和显示...

    基于IMX6X系列4.1.15内核的LCD移植.docx

    尽管主要针对的是IMX6Q-C平台,但其原理和方法对于其他类似的嵌入式Linux平台也有一定的参考价值。需要注意的是,在不同的硬件平台上进行移植时,可能需要根据具体情况进行相应的调整。 #### 二、内核部分修改详解 ...

    迅为国产RK3568开发板Android移植 LCD 屏幕

    RK3568 开发板 Android 移植 LCD 屏幕知识点总结 一、RK3568 芯片介绍 RK3568 是一款强大的芯片,支持多种屏幕接口,包括 MIPI 接口、HDMI 接口、LVDS 接口等。RK3568 芯片的硬件原理图分析显示它支持 MIPI 接口的...

    s3c2440原理图和s3c2440中文手册(含fl2440原理图)

    5. 图像接口:支持LCD控制器和摄像头接口,方便在嵌入式设备上实现图形显示和图像处理。 四、FL2440开发板 FL2440是一款基于S3C2440的开发板,常用于嵌入式系统的原型开发和测试。其原理图详细描绘了各个模块的连接...

    AM335X uboot 2011 lcd驱动

    总结来说,"AM335X uboot 2011 lcd驱动"是一个关于在U-Boot中为TI AM335X处理器移植和配置LCD驱动的项目,涉及的内容包括驱动代码编写、硬件接口配置、U-Boot环境设置等,目的是使设备能够通过LCD显示相关信息。...

    STM32下移植UCGUI的教程

    1. **了解LCD控制器**:根据你的LCD屏类型,学习其工作原理和接口协议,如SPI、I2C或8/16位并行接口。 2. **编写LCD驱动**:在STM32项目中编写相应的LCD驱动代码,实现初始化、点画、清屏等基本操作。 四、移植...

    LCD.rar_LCD.C

    LCD(Liquid Crystal Display)是一种广泛应用于电子设备中...理解LCD的工作原理和C语言的底层控制特性,是深入学习此程序的关键。通过阅读和分析代码,开发者可以掌握如何编写类似的LCD控制程序,为实际项目提供基础。

    LPC1788 LCD例程

    总结来说,LPC1788 LCD例程涉及了微控制器的硬件接口配置、LCD控制器的初始化、显示函数的编写以及可能的图形处理和用户交互设计。通过理解LCD的工作原理和LPC1788的特性,开发者可以创建出功能丰富、性能稳定的LCD...

    μC/GUI在MSGl9264液晶上的移植

    总结来说,μC/GUI移植需要对液晶屏的工作原理和控制指令有清晰的认识,同时对移植过程中的硬件连接和软件配置也必须仔细处理。这样的移植工作将使μC/GUI在嵌入式系统中发挥图形用户界面的强大功能,为用户提供高...

    按键控制LCD液晶显示

    总结来说,"按键控制LCD液晶显示"涉及到的关键知识点包括:LCD1602液晶显示器的工作原理和驱动方法,按键扫描技术及其在微控制器上的实现,以及程序的可移植性和硬件兼容性。通过理解和掌握这些知识,开发者能够创建...

    Android系统开发之触摸屏tslib移植(内核)和原理分析 - CSDN博客1

    本文主要探讨了如何在内核层面移植和校准触摸屏驱动,以及其工作原理。我们以tsc2007驱动为例,这是一个适用于某些平台的触摸屏驱动,相关的源代码位于内核的`drivers/input/touchscreen`目录下,包含`tsc2007.c`和`...

    基于单片机LCD液晶显示的多级菜单程序解析

    此外,文档中可能还包含了移植过程中的注意事项、技巧和常见问题的解决方案,这些都是宝贵的经验总结,对于初学者和有经验的开发者来说都是很有价值的学习资源。 总之,基于单片机的LCD液晶显示多级菜单程序设计...

    LCD_C语言_plain9xe_

    通过研究"LCD.c"文件,开发者可以学习如何编写控制LCD的函数,理解单片机与外部设备通信的原理,并掌握在嵌入式系统中实现图形和文本显示的技术。这个项目对于想要涉足单片机开发,尤其是涉及LCD显示的初学者来说,...

    STM32移植UCGUI3.90笔记.doc

    此外,为了提高项目的稳定性和兼容性,建议对UCGUI的源码进行深入研究,以便更好地掌握其工作原理和定制方法。 最后,希望这份笔记能够帮助到正在尝试将UCGUI移植到STM32或其他单片机平台上的开发者们。如果有任何...

Global site tag (gtag.js) - Google Analytics