LCD 原理和移植总结【转】
转自:http://blog.chinaunix.net/uid-22915173-id-329617.html
Framebuffer:是linux的framebuffer驱动在内存开辟的一块显存,存放一帧图像数据。
IPU:是mx51的图像处理单元,里面包含DMA控制器和DI显示接口等。
LCDDriver:是一块和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模式是否一致
本次点屏过程:
0. 非常感谢张同学和梁同学在本次点屏中所作的关键性工作。
1. 在mx51_kernel的mxcfb_epson_vga.c的fb_videomode结构体中修改了时序参数,上电,LCD无任何反应
2. 张同学在mx51_3stack_gpio.c中通过配置GPIO NANDF_CS6 打开了LCD背光灯,LCD产生白屏闪动现象,并在mxcfb_epson_vga.c的lcd_init()中加入了ilitek提供的初始化命令。
3. 梁同学在mx51_3stack_gpio.c中通过配置MX51_PIN_DI1_D1_CS ,使其一直拉低,提供了LCD Driver芯片的片选使能,并测量出upper margin和lower margin时序有偏移,经过调整此2值,消除了IPU error。
4. 去掉3条冗余的LCD初始化命令,LCD点亮。
5. 对于本次调屏,以上步骤都是必要的,也是充分的
kernel 文件修改:
1.driver/video/mxc/mxcfb_epson_vga.c
(1).static struct fb_videomode video_modes[] 改为:
- static struct fb_videomode video_modes[] = {
- {
- /* 320x480 @ 60 Hz */
- "Elite-HVGA", 60, 320, 480, 86566, 20, 40, 5, 1, 10, 2,
- FB_SYNC_CLK_LAT_FALL,
- FB_VMODE_NONINTERLACED,
- 0,},
- };
复制代码
(2).static void lcd_init(void)改为:
- static void lcd_init(void)
- {
- u16 i;
- const u16 cmd[] = {
- 0x11,
- 0xD0, param(0x07), param(0x41), param(0x0F),
- 0xD1, param(0x00), param(0x3E), param(0x1F),
- 0xD2, param(0x01), param(0x10),
- 0xC0, param(0x00), param(0x3B), param(0x00), param(0x02),
- param(0x11),
- 0xC5, param(0x02),
- // 0xC6, param(0x1B),
- 0xC6, param(0x02),
- 0xC8, param(0x66), param(0x66), param(0x66), param(0x66),
- param(0x0E), param(0x1E), param(0x66), param(0x66),
- param(0x77), param(0x66), param(0x0F), param(0x0F),
- 0x36, param(0x0A), // set_address_mode, RGB order
- 0x3A, param(0x66), // 0x60: RGB=666; 0x50: RGB=565; 0x10: RGB=111
- 0xB4, param(0x11),
- 0x29,
- 0x2C
- };
- if (lcd_spi) {
- spi_write(lcd_spi, (const u8 *)cmd, ARRAY_SIZE(cmd));
- } else {
- for (i = 0; i < sizeof(cmd) / 2; i++)
- {
- ipu_disp_direct_write(DIRECT_ASYNC1, cmd[i], 0);
- }
- msleep(1);
- ipu_uninit_channel(DIRECT_ASYNC1);
- }
- }
复制代码
2.arch/arm/mach-mx51/mx51_3stack.c
- static struct mxc_lcd_platform_data lcd_data = {
- .core_reg = "VIOHI",
- .io_reg = "SW4",
- .reset = lcd_reset,
- };
复制代码
改 为
- static struct mxc_lcd_platform_data lcd_data = {
- .core_reg = "VSD",
- .io_reg = "SW4",
- .reset = lcd_reset,
- };
复制代码
3.arch/arm/mach-mx51/mx51_3stack_gpio.c
void gpio_lcd_active(void)修改为:
- void gpio_lcd_active(void)
- {
- mxc_request_iomux(MX51_PIN_NANDF_CS6, IOMUX_CONFIG_ALT3);
- mxc_set_gpio_direction(MX51_PIN_NANDF_CS6, 0);
- mxc_set_gpio_dataout(MX51_PIN_NANDF_CS6, 1);
- mxc_request_iomux(MX51_PIN_DI1_D1_CS, IOMUX_CONFIG_ALT4);
- mxc_set_gpio_direction(MX51_PIN_DI1_D1_CS, 0);
- mxc_set_gpio_dataout(MX51_PIN_DI1_D1_CS, 0);
- mxc_request_iomux(MX51_PIN_DI_GP2, IOMUX_CONFIG_ALT0);
- mxc_request_iomux(MX51_PIN_DI_GP3, IOMUX_CONFIG_ALT0);
- }
LCD 原理和移植总结【转】的更多相关文章
- TQ2440平台上LCD驱动的移植
参考: http://liu1227787871.blog.163.com/blog/static/205363197201242393031250/ http://blog.csdn.net/cum ...
- STM32驱动LCD原理
TFTLCD即薄膜晶体管液晶显示器.它与无源TN-LCD.STN-LCD的简单矩阵不同,它在液晶显示屏的每一个像素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性 ...
- Arduino+ESP32 之 驱动GC9A01圆形LCD(二),移植LVGL,跑示例程序,显示自制图片
在前文Arduino+ESP32 之 驱动GC9A01圆形LCD(一), 我们已经移植好了arduino GFX库, 该库的示例程序内,还有LVGL的示例程序哦. arduino环境下移植lvgl是很 ...
- Contiki源码+原理+功能+编程+移植+驱动+网络(转)
源:Contiki源码+原理+功能+编程+移植+驱动+网络 请链接:http://www.rimelink.com/nd.jsp? id=31&_np=105_315 假设您对于用Contik ...
- 【STM32H7教程】第54章 STM32H7的LTDC应用之LCD电阻触摸和电容触摸
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第54章 STM32H7的LTDC应用之LCD电阻 ...
- FL2440驱动添加(3)LCD驱动添加学习笔记
FL2440 LCD内置控制器,320*240 TFT型LCD. 自我理解总结的两种添加驱动模式: 非platform方式添加驱动: 加载驱动: 1,硬件初始化,申请内存,并作地址映射 2,分配设备号 ...
- 高通安卓调试LCD几方面总结
来公司上班现在已经整整一个月了,蔽人不才,能力有限,学习进度缓慢,不过也是有一点点的收获与心得,在这里写出来与大家分享,养成良好的记录习惯也免得后忘记. 不啰嗦了,开入正题.来公司一个月左右的时间,主 ...
- U-BOOT 移植到友善之臂mini2440
U-BOOT 移植到友善之臂mini2440 开发环境:ubuntu 10.10 编译器:友善之臂mini2440光盘自带arm-linux-gcc 4.4.3 一. 在denx官网下载源码,我所用版 ...
- linux 驱动之LCD驱动(有framebuffer)
<简介> LCD驱动里有个很重要的概念叫帧缓冲(framebuffer),它是Linux系统为显示设备提供的一个接口,应用程序在图形模式允许对显示缓冲区进行读写操作.用户根本不用关心物理显 ...
随机推荐
- flutter Oops; flutter has exited unexpectedly
使用模拟器时执行flutter run 报出下面一大堆错误 注意只有模拟器有这种问题,真机可以正常运行 Oops; flutter has exited unexpectedly. Sending c ...
- 几行python代码解决相关词联想
日常生活中经常会遇到相关词联想的问题,也就是说输入一个词汇,把相关的词汇查询出来,听起来这个做法也不是太难,但如何去积累那么多的词汇,再用好的算法将相关内容联系起来,本身还是不简单的.笔者认为最简单的 ...
- java.lang.ClassNotFoundException: org.apache.commons.dbutils.QueryRunner
七月 28, 2017 11:06:33 下午 org.apache.catalina.core.StandardWrapperValve invoke严重: Servlet.service() fo ...
- Java:面向对象(继承,方法的重写(overide),super,object类及object类中方法的重写,父子类代码块执行顺序)
继承: 1.继承是对某一匹类的抽象,从而实现对现实世界更好的建模. 2.提高代码的复用性. 3.extends(扩展),子类是父类的扩展. 4.子类继承父类可以得到父类的全部属性和方法.(除了父类的构 ...
- C语言基础:自定义函数
#include <stdio.h>//声明函数的原型:参数名可以省略 void printRectangle();void printfTriangle();void printhh(l ...
- 安装VMTool
一. 安装VMTool 开启虚拟机,然后在VMware上选虚拟机->安装VMTool 如果提示光驱被占用就先用root登录 在命令行中挂载光盘 #mount /dev/cdrom ...
- uni-app编译配置
Uni-app 编译配置 <!-- #ifdef H5 --> <view>只在H5编译</view> <!-- #endif --> <!-- ...
- keys随机生成
随机keys生成 const fs=require('fs'); const KEY_LEN=1024; const KEY_COUNT=2048; const CHARS='abcdefghijkl ...
- vue2-org-tree 基于VUE的部门组织架构组件,增删节点实现
本文所用组件传送门:vue-org-tree 本文基于antd (其他前端组件框架操作基本都类似的: iview,elementui,boostrap-vue...) 当然,github上还有其他类似 ...
- 使用Zabbix进行IPMI监控
1. 安装IPMItool软件包 # yum -y install OpenIPMI OpenIPMI-devel ipmitoolfreeipmi 2. 配置Zabbix 服务器端配置z ...