×
显示-光电 > 显示技术 > 详情

wince代码写入LCD驱动参考,数码产品怎样分别是不是LCD坏点

发布时间:2020-05-20 发布时间:
|

  数码产品的坏点到底是不是LCD坏点?

  一、什么是CCD/LCD坏点?坏点和亮点分别是什么?

  我的一些顾客都在同时问两个问题:“能保证CCD和LCD没有坏点同时也没有亮点吗?”这里必须说明,所谓的“坏点”和“亮点”其实是一个概念。在术语上,应该叫“坏点”。

  坏点就是CCD元件上不能成像的点。具体表现就是:每张照片的固定位置出现全白或全黑的斑点,就是CCD元件上不发光或者始终发光的点。这是一个比较严重的问题,严重影响了成像效果,一旦发现坏点是要坚决换机的。

  同理,所谓LCD坏点,也是指LCD(显示屏)上不能成像的点。LCD上的坏点并不影响相机的实际成像效果,一般来说,LCD上有3个以上坏点才算质量问题,厂家才会同意换机。比如柯达公司就规定LCD有5个坏点才换屏。LCD坏点只是影响观瞻,影响心情吧,其实3个以下的坏点,肉眼基本是没有感觉的。

  在我们实际销售的过程中,CCD坏点几率非常低,目前只遇到过一台。LCD坏点则遇到过7、8台,一般也都在发货前进行了调换。

  二、如何界定、判断“坏点”?

  关于这个问题,网上很多文章都在讲。我不想罗嗦了。只是想用通俗的语言给大家再讲一遍。

  1、获得检测“坏点”的全黑照片。拿到相机后,预热几分钟,把相机的ISO(感光度)调节到最小值(一般是100),关闭闪光灯,设定曝光时间为1/60秒、光圈最大值,然后用镜头盖盖住镜头(没有镜头盖的,可在平坦的桌子上放张厚纸,将镜头扣在纸上拍摄,一定不能让光线进入到镜头里面,同时也不要太过用力),按下快门,拍摄一张全黑的照片。然后,把曝光时间设定为1秒,再拍摄一张全黑照片,这两张照片就是我们要检测“坏点”的证据。如果你购买的相机有自动降躁功能,那么也要注意关闭。

  如果是全自动相机,则一般在默认模式、关闭闪光灯、ISO最低值的情况下,拍摄一张全黑照片就可以了。

  有的专家把整个过程说的过分复杂了,在实际操作中,除非是专业级别的玩家对待专业级别的相机,普通家用相机和一般的摄影爱好者用这个通俗易懂的方式获得全黑照片就可以。

  2、对全黑照片进行检测。使用Dead Pixel Test软件来进行检测的。设定超过60流明的点是噪点(hot),超过250流明的点为坏点(dead)。把全黑照片输入电脑,通过该软件进行测试,很快就会出来测试结果——有多少躁点、有没有坏点,结果很快就出来了。这个软件网上很多地方可以下载,是免费的软件,这个软件很容易上手,具体不再讲了。

  3、用全黑照片测试LCD屏幕。用LCD屏幕来回放这一张全黑照片,就可以看出来LCD屏幕是否有坏点。一般来说,不超过3个都是合格的。当然,对于一个非常注重自己信誉的卖家来说,也许一个也不会放过。

  WinCE的LCD驱动程序该如何编写?

  本文以1024*768分辨率的TFT_16BPP真彩LCD为例,说明在WIN CE 4.2中驱动程序的修改事项,目标板的微处理器是S3C2410A。

  该LCD的时序图如下图所示:

  Note:LCD时序的参数和时钟相位因不同LCD而异,请参考相应LCD的datasheet.

  在WIN CE 4.2中修改LCD驱动程序有五个相关文件,分别是:

  1. …\WINCE420\PLATFORM\SMDK2410\INC\s2410.h

  2. …\WINCE420\PLATFORM\SMDK2410\KERNEL\HAL\cfw.c

  3. …\WINCE420\PLATFORM\SMDK2410\DRIVERS\DISPLAY\S3C2410LCD\s3c2410disp.cpp

  4. …\WINCE420\PLATFORM\SMDK2410\FILES\config.bib

  5. …\ WINCE420\PLATFORM\SMDK2410\FILES\platform.reg

  1. s2410.h

  …\WINCE420\PLATFORM\SMDK2410\INC\s2410.h

  主要有LCD控制器的寄存器定义、LCD控制器的工作时序定义、分辨率的定义等等。红色部分为修改后的内容:

  #define LCDTYPE TFT16BPP

  #define LCD_TYPE TFTxxx_xxx

  #define SCR_XSIZE_TFT (1280)

  #define SCR_YSIZE_TFT (960)

  #define LCD_XSIZE_TFT (1024)

  #define LCD_YSIZE_TFT (768)

  #define VBPD ((2-1)&0xff)

  #define VFPD ((2-1)&0xff)

  #define VSPW ((2-1) &0x3f)

  #define HBPD ((16-1)&0x7f)

  #define HFPD ((200-1)&0xff)

  #define HSPW ((16-1)&0xff)

  #define CLKVAL_TFT (1) //这个值的定义在LCD初始化函数中并不用到,而是直接用数值表示。

  2. cfw.c

  …\WINCE420\PLATFORM\SMDK2410\KERNEL\HAL\cfw.c

  红色部分为修改后的内容:

  static void InitDisplay()

  {

  ********

  s2410LCD-》rLCDCON1=(1《《8)|(MVAL_USED《《7)|(3《《5)|(12《《1)|0;

  // CLKVAL_TFT = 1 , HCLK = 100MHz -》 VCLK = 25MHz

  //TFT LCD panel

  //16 bpp for TFT

  s2410LCD-》rLCDCON2=(VBPD《《24)|(LINEVAL_TFT《《14)|(VFPD《《6)|(VSPW);

  s2410LCD-》rLCDCON3=(HBPD《《19)|(HOZVAL_TFT《《8)|(HFPD);

  s2410LCD-》rLCDCON4=(MVAL《《8)|(HSPW);

  s2410LCD-》rLCDCON5=

  (1《《11)|(0《《10)|(0《《9)|(0《《8)|(0《《7)|(0《《6)|(0《《3)|(0《《1)|(1《《0);

  //5:6:5 Format

  //The video data is fetched at VCLK falling edge

  //VLINE/HSYNC pulse polarity-Normal

  //VFRAME/VSYNC pulse polarity-Normal

  //VD (video data) pulse polarity-Normal

  //VDEN signal polarity-Normal

  //Disable PWREN signal

  //Byte swap Disable

  //Half-Word swap Enable

  ********

  }

  红色部分为修改后的内容:

  WORD TempBuffer[1025][768];

  S3C2410DISP::S3C2410DISP (void)

  {

  ********

  m_nScreenWidth = 1024;

  m_nScreenHeight = 768;

  *********

  }

  到此修改工作基本完成,但还要一个问题:1024*768分辨率占用的显示缓冲区大小是:1024*768*2 = 1536 K Bytes,因此要确认所分配的内存空间够不够,是在config.bib文件中定义的。如果以前定义的足够大,后面的步骤可以省略了。

  4. config.bib

  …\WINCE420\PLATFORM\SMDK2410\FILES\config.bib

  #define NKNAME NK

  #define NKSTART 8C200000

  #define NKLEN 01D00000

  #define RAMSTART 8E000000

  #define RAMLEN 01F00000

  $(NKNAME) $(NKSTART) $(NKLEN) RAMIMAGE

  RAM $(RAMSTART) $(RAMLEN) RAM

  AUD_DMA 8c002000 00002000 RESERVED

  DRV_GLB 8c010000 00010000 RESERVED

  DBGSER_DMA 8c022000 00002000 RESERVED

  SER_DMA 8c024000 00002000 RESERVED

  IR_DMA 8c026000 00002000 RESERVED

  SD_DMA 8c028000 00008000 RESERVED

  EDBG 8c030000 00020000 RESERVED

  CPXIPCHAIN 8c050000 00008000 RESERVED

  SLEEP_BUFF 8c058000 00004000 RESERVED

  DISPLAY 8c100000 00100000 RESERVED

  DISPLAY

  AUD_DMA 8c002000 00002000 RESERVED

  DRV_GLB 8c010000 00010000 RESERVED

  DBGSER_DMA 8c022000 00002000 RESERVED

  SER_DMA 8c024000 00002000 RESERVED

  IR_DMA 8c026000 00002000 RESERVED

  SD_DMA 8c028000 00008000 RESERVED

  EDBG 8c030000 00020000 RESERVED

  CPXIPCHAIN 8c050000 00008000 RESERVED

  SLEEP_BUFF 8c058000 00004000 RESERVED

  ;DISPLAY 8c100000 00100000 RESERVED

  DISPLAY 8c060000 001a0000 RESERVED

  5.

  在(4)中修改了DISPLAY显示缓冲区的开始地址,因此要在“s2410.h”中做相应的修改:

  …\WINCE420\PLATFORM\SMDK2410\INC\s2410.h

  #define DMA_BUFFER_BASE 0xAC000000

  #define DMA_PHYSICAL_BASE 0x30000000

  //#define FRAMEBUF_BASE (DMA_BUFFER_BASE + 0x00100000)

  //#define FRAMEBUF_DMA_BASE (DMA_PHYSICAL_BASE + 0x00100000)

  #define FRAMEBUF_BASE (DMA_BUFFER_BASE + 0x00060000)

  #define FRAMEBUF_DMA_BASE (DMA_PHYSICAL_BASE + 0x00060000)

  6. 在(4)中修改了DISPLAY显示缓冲区的大小, 因此要在“s3c2410disp.cpp”中做相应的修改:

  …\WINCE420\PLATFORM\SMDK2410\DRIVERS\DISPLAY\S3C2410LCD\s3c2410disp.cpp

  红色部分为修改后的内容:

  void S3C2410DISP::InitializeHardware (void)

  {

  *********

  m_VirtualFrameBuffer = (DWORD)VirtualAlloc(0, (0x1A0000), MEM_RESERVE, PAGE_NOACCESS);

  if (m_VirtualFrameBuffer == NULL)

  {

  RETAILMSG(0,(TEXT(“m_VirtualFrameBuffer is not allocated\n\r”)));

  return;

  }

  else if (!VirtualCopy((PVOID)m_VirtualFrameBuffer, (PVOID)gdwLCDVirtualFrameBase, (0x1A0000), PAGE_READWRITE | PAGE_NOCACHE))

  {

  RETAILMSG(0, (TEXT(“m_VirtualFrameBuffer is not mapped\n\r”)));

  VirtualFree((PVOID)m_VirtualFrameBuffer, 0, MEM_RELEASE);

  return;

  }

  *********

  }


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
室内照明的新趋势