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