天天看點

WinCE5.0 SMDK2410 BSP在GEC2410開發闆上的移植(5)-TouchPanel驅動

SMDK2410預設已經把TouchPanel的驅動實作了,在/PUBLIC/COMMON/OAK/CSP/ARM/SAMSUNG/S3C2410X/TOUCH/下,這個驅動不需要再進行修改.這裡隻介紹移植過程,具體的分析以後在寫.

通過EBoot從PB把OS下載下傳到記憶體中運作,然後會發現可以點選,但是坐标不對,我們需要進行觸摸屏坐标的調整.

一.觸摸屏坐标調整

1.在PB File-New Project or File,下添加一個新的空的WCE Application工程Touchadjust,然後在PB Projects目錄下就可以看到新的工程了.

2.建立一個新的cpp檔案touchadjust.cpp,添加代碼為:

#include "stdafx.h"

#include "windows.h"

#include "Pwinuser.h"

int WINAPI WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPTSTR lpCmdLine,

int nCmdShow)

{

// TODO: Place code here.

TouchCalibrate();

return 0;

}

實際上就調用了一個函數TouchCalibrate(),運作這個函數螢幕會出現十字标志讓你觸摸進行坐标的調整.

編譯時需要把StdAfx.h和pwinuser.h拷貝到該工程下.

3.重新生成系統鏡像,下載下傳到開發闆運作,點選Target-Run Program選擇touchadjust.exe運作就可以進行觸摸屏坐标調整了.

或者在左邊的指令行中運作:

Windows CE>s touchadjust

一樣可以運作該程式.

4.調整好了,可以看到點選觸摸屏位置都正确了,為了不用每次系統啟動都要手動調整,我們需要把該坐标值儲存到系統資料庫中.

選擇Tools-Remote Registry Editor,連上裝置後可以看到系統裡的系統資料庫:

找到[HKEY_LOCAL_MACHINE/HARDWARE/DEVICEMAP/TOUCH/CalibrationData],将裡面的坐标值複制下來,拷貝到BSP下的platform.reg檔案中:

[HKEY_LOCAL_MACHINE/HARDWARE/DEVICEMAP/TOUCH]

  "MaxCalError"=dword:7

; portrait

  "CalibrationData"="480,636 866,128 92,131 90,1143 865,1135 "

; Landscape

;   "CalibrationData"="515,503 763,748 258,749 269,255 764,255 "

; @CESYSGEN ENDIF CE_MODULES_POINTER

5.重新Sysgen,以後每次啟動坐标就正确了.

二.修改TouchPanel驅動的路徑

這樣的觸摸屏驅動已經可以正常使用了,但是我想把驅動從CSP目錄下複制到Platform的BSP目錄下,這樣可以進行修改調試,同時又不修改CSP下的代碼.

1.将CSP下的Touch目錄複制到/PLATFORM/GEC2410/SRC/COMMON/S3C2410X/TOUCH/

2.修改上層dir檔案添加該目錄

DIRS=/

 display/

 TOUCH

3./PUBLIC/COMMON/OAK/INC/touch.def到/PLATFORM/GEC2410/SRC/COMMON/S3C2410X/TOUCH/,并改名為s3c2410x_touch.def

4.修改source檔案,将其編譯為dll,原來的source檔案隻編譯成lib,生成dll在/PUBLIC/COMMON/CESYSGEN/makefile中定義,我們把這兩塊内容都集中到現在的source檔案

TARGETNAME=s3c2410x_touch

RELEASETYPE=PLATFORM

TARGETTYPE=DYNLINK

DLLENTRY=TouchPanelDllEntry

PREPROCESSDEFFILE=1

DEFFILE=s3c2410x_touch.def

INCLUDES=../inc

TARGETLIBS= /

    $(_COMMONSDKROOT)/lib/$(_CPUINDPATH)/coredll.lib

SOURCELIBS= /

 $(_COMMONOAKROOT)/lib/$(_CPUINDPATH)/tch_cal.lib /

 $(_COMMONOAKROOT)/lib/$(_CPUINDPATH)/tchmdd.lib /

 $(_COMMONOAKROOT)/lib/$(_CPUINDPATH)/ceddk.lib /

SOURCES=s3c2410x_touch.cpp

5.編譯,你會發現錯誤:

BUILD: [01:0000000041:ERRORE] s3c2410x_touch.def : error LNK2001: unresolved external symbol TouchCreateEvent

BUILD: [01:0000000042:ERRORE] s3c2410x_touch.def : error LNK2001: unresolved external symbol TouchGetFocusWnd

BUILD: [01:0000000043:ERRORE] s3c2410x_touch.def : error LNK2001: unresolved external symbol TouchGetLastTouchFocusWnd

BUILD: [01:0000000044:ERRORE] s3c2410x_touch.def : error LNK2001: unresolved external symbol TouchGetQueuePtr

BUILD: [01:0000000045:ERRORE] s3c2410x_touch.def : error LNK2001: unresolved external symbol TouchGetValue

BUILD: [01:0000000046:ERRORE] s3c2410x_touch.def : error LNK2001: unresolved external symbol TouchRegisterWindow

BUILD: [01:0000000047:ERRORE] s3c2410x_touch.def : error LNK2001: unresolved external symbol TouchReset

BUILD: [01:0000000048:ERRORE] s3c2410x_touch.def : error LNK2001: unresolved external symbol TouchSetValue

BUILD: [01:0000000049:ERRORE] s3c2410x_touch.def : error LNK2001: unresolved external symbol TouchUnregisterWindow

原因是s3c2410x_touch.def裡定義的CESYSGEN下的函數沒有實作,但是在CSP編譯時确沒有錯誤.WCESHELLFE_MODULES_MSTRANSCRIBER或者SHELLW_MODULES_TRANSCRIBER都沒有定義,為什麼這裡編譯确認為其有效,一直沒找到原因.

但是沒有關系注釋掉Touch這些函數名,因為實際并不會使用

LIBRARY  TOUCH

EXPORTS

 STDAPI(TouchPanelGetDeviceCaps, 8);

 STDAPI(TouchPanelEnable,4);

 STDAPI(TouchPanelDisable,0);

 STDAPI(TouchPanelSetMode, 8);

 STDAPI(TouchPanelReadCalibrationPoint, 8);

 STDAPI(TouchPanelReadCalibrationAbort, 0);

 STDAPI(TouchPanelSetCalibration, 20);

 STDAPI(TouchPanelCalibrateAPoint, 16);

 STDAPI(TouchPanelPowerHandler, 4);

; @CESYSGEN IF WCESHELLFE_MODULES_MSTRANSCRIBER || SHELLW_MODULES_TRANSCRIBER

; TouchReset

; TouchRegisterWindow

; TouchUnregisterWindow

; TouchSetValue

; TouchGetValue

; TouchCreateEvent

; TouchGetFocusWnd

; TouchGetLastTouchFocusWnd

; TouchGetQueuePtr

; @CESYSGEN ENDIF 

然後在編譯就OK了.生成新的系統鏡像可以發現使用了是新的touch.dll

繼續閱讀