1. 程式人生 > >修改LCD和觸控式螢幕驅動的一些經驗

修改LCD和觸控式螢幕驅動的一些經驗

硬體平臺:遠峰開發板 + 3.5寸三星液晶屏
軟體平臺:winCE PB5.0 + SMDK BSP

====LCD部分====

解析度修改
1、s2410.h (D:/WINCE500/PLATFORM/SMDK2410/INC/)
#define LCD_XSIZE_TFT (640)  
#define LCD_YSIZE_TFT (480)
修改為
#define LCD_XSIZE_TFT (240)  
#define LCD_YSIZE_TFT (320)

修改時序 (可選的範圍很寬,很多時候可以不做修改)
1、cfw.c (D:/WINCE500/PLATFORM/SMDK2410/KERNEL/HAL/)
修改函式 InitDisplay()

LCD顯示 豎屏改為橫屏

(不需要修改s2410.h和cfw.c中的任何內容)
1、SMDK2440/DRIVERS/DISPLAY/S3C2440LCD 目錄下的sources檔案合適位置增加:
CLEARTYPE=0
2、s3c2440disp.h檔案頭上加一句
#define ROTATE
3、s3c2440disp.cpp中 S3C2440DISP::S3C2440DISP (void)加上
#ifdef ROTATE
  m_iRotate = DMDO_90;
  SetRotateParms();
#endif
4、登錄檔檔案wince420/platform/smdk2410/files/platform.reg中新增如下鍵值:
[HKEY_LOCAL_MACHINE/System/GDI/ROTATION]
“Angle”=dword:5A
“LandscapeMode”=dword:1
5、修改函式DrvEscape()和DynRotate() ULONG S3C2410DISP::DrvEscape(
 SURFOBJ *pso,
 ULONG iEsc,
 ULONG cjIn,
 PVOID pvIn,
 ULONG cjOut,
 PVOID pvOut)
{
#ifdef ROTATE
      if (iEsc == DRVESC_GETGAMMAVALUE)
    {
    return GetGammaValue((ULONG *)pvOut);
    }
    else if (iEsc == DRVESC_SETGAMMAVALUE)
    {
    return SetGammaValue(cjIn, *(BOOL *)pvIn);
    }
  
   if (iEsc == DRVESC_GETSCREENROTATION)
    {
      *(int *)pvOut = ((DMDO_0 | DMDO_90 | DMDO_180 | DMDO_270) << 8) | ((BYTE)m_iRotate);
  //     return DISP_CHANGE_SUCCESSFUL;
   }
  
   return DynRotate(DMDO_90);

#endif //ROTATE & ROTATE
 
 return 0;
}

LONG S3C2410DISP::DynRotate(int angle)
{
 GPESurfRotate *pSurf = (GPESurfRotate *)m_pPrimarySurface;

  m_iRotate = angle;

  switch(m_iRotate)
 {
 case DMDO_0:
 case DMDO_180:
    m_nScreenHeight = m_nScreenHeightSave;
    m_nScreenWidth = m_nScreenWidthSave;
    break;
  case DMDO_90:
  case DMDO_270:
    m_nScreenHeight = m_nScreenWidthSave;
    m_nScreenWidth = m_nScreenHeightSave;
    break;
 }

  m_pMode->width = m_nScreenWidth;
  m_pMode->height = m_nScreenHeight;
  pSurf->SetRotation(m_nScreenWidth, m_nScreenHeight, angle);

  return DISP_CHANGE_SUCCESSFUL;
}
====觸控式螢幕部分====

關於x或者y軸對稱
tchpdd.cpp(D:/WINCE500/PLATFORM/SMDK2410/DRIVERS/TOUCHP/) #define  INVERSE_X
#define  INVERSE_Y
注:體現在函式Touch_CoordinateConversion()中 #ifdef INVERSE_X
*px = TOUCH_X*4 - 1 - *px;
#endif

#ifdef  INVERSE_Y
*py = TOUCH_Y*4 - 1 - *py;
#endif
x 和y 的座標的對調
tchpdd.cpp(D:/WINCE500/PLATFORM/SMDK2410/DRIVERS/TOUCHP/)
函式Touch_CoordinateConversion()中
#if 1 // x y座標對調
  temp = *px;
  *px = *py;
  *py = temp;
#endif大小移植不一樣(例如640*480的bsp要跑在320*240的LCD+觸控式螢幕上)

修改  #define LCD_TYPE  TFT240_320體現在
#if ( LCD_TYPE == TFT640_480 )
  #define TOUCH_MAX_X 1000
  #define TOUCH_MIN_X 30
  #define TOUCH_MAX_Y 980
  #define TOUCH_MIN_Y 30

  #define TOUCH_X  640
  #define TOUCH_Y  480
#else

   #define TOUCH_MAX_X 922//922//955 //950
  #define TOUCH_MIN_X 75//75//100 //90
  #define TOUCH_MAX_Y 940//940//925 //960
  #define TOUCH_MIN_Y 40//40//70 //50
  
  #define TOUCH_X  240
  #define TOUCH_Y  320
#endif
修改登錄檔 (特別重要,千萬別忽視,否則觸控式螢幕變化一點規律也沒有,找問題還真難)
platform.reg(D:/WINCE500/PLATFORM/SMDK2410/FILES/)
修改
 [HKEY_LOCAL_MACHINE/HARDWARE/DEVICEMAP/TOUCH]
 "MaxCalError"=dword:7
; portrait
"CalibrationData"="1267,927 239,1679 251,143 2311,143 2311,1691"
; @CESYSGEN ENDIF CE_MODULES_POINTER
; @CESYSGEN IF CE_MODULES_DISPLAY

 [HKEY_LOCAL_MACHINE/HARDWARE/DEVICEMAP/TOUCH]
 "MaxCalError"=dword:7
; portrait
; "CalibrationData"="1267,927 239,1679 251,143 2311,143 2311,1691"
; @CESYSGEN ENDIF CE_MODULES_POINTER
; @CESYSGEN IF CE_MODULES_DISPLAY