📄 tchpdd.cpp
字号:
//**********************************************************************
//
// Filename: tchpdd.cpp
//
// Description: Touch panel driver for the ep9312 board.
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Use of this source code is subject to the terms of the Cirrus end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to
// use this source code. For a copy of the EULA, please see the
// LICENSE.RTF on your install media.
//
// Copyright(c) Cirrus Logic Corporation 2003, All Rights Reserved
//
//**********************************************************************
//
//Functions:
//
// TouchDriverCalibrationPointGet
// DdsiTouchPanelGetDeviceCaps
// DdsiTouchPanelSetMode
// DdsiTouchPanelEnable
// DdsiTouchPanelDisable
// DdsiTouchPanelAttach
// DdsiTouchPanelDetach
// DdsiTouchPanelGetPoint
// DdsiTouchPanelPowerHandler
//
#include <windows.h>
#include <types.h>
#include <memory.h>
#include <nkintr.h>
#include <oalintr.h>
#include <tchddsi.h>
#include <hwdefs.h>
#include <clocks.h>
#include <touchscr.h>
#include <ceddk.h>
#include <haluser.h>
#define ZONE_PDD ZONE_6
#define ZONE_POINT ZONE_7
//#define TSSETUP2_DEFAULT (TSSETUP2_UNSIGND | TSSETUP2_S28EN)
#define TSSETUP2_DEFAULT (TSSETUP2_UNSIGND)
//
// The Switch settings.
//
#define SWITCH_DISCHARGE 0x0007fe04
#define SWITCH_DETECT 0x00403604
#define SWITCH_X 0x00081604
#define SWITCH_Y 0x00104601
#define SWITCH_Z1 0x00101601
#define SWITCH_Z2 0x00101608
//
// Calculate the real values later.
//
#define TOUCHPANEL_SAMPLE_RATE_LOW 50
#define TOUCHPANEL_SAMPLE_RATE_HIGH 100
#define SAMPLE_DELAY 5
// The MDD requires a minimum of MIN_CAL_COUNT consecutive samples before
// it will return a calibration coordinate to GWE. This value is defined
// in the PDD so that each OEM can control the behaviour of the touch
// panel and still use the Microsoft supplied MDD. Note that the extern "C"
// is required so that the variable name doesn't get decorated, and
// since we have an initializer the 'extern' is actually ignored and
// space is allocated.
extern "C" const int MIN_CAL_COUNT = 25;
//INT CurrentSampleRateSetting = 0; // Low sample rate setting
#define CALIBRATION_POINTS 5
//
// This is the minimum Z1 Value that is valid. I found that 20 is a good
// numbers.
//
#define MIN_Z1_VALUE 0x50
//
// Registry value names
//
#define REG_VALUE_MIN_INV_PRESSURE TEXT("MinInvPressure")
#define REG_VALUE_MAX_INV_PRESSURE TEXT("MaxInvPressure")
#define REG_VALUE_MAX_CHANGE TEXT("MaxChange")
DWORD gIntrTouch = SYSINTR_TOUCH;
DWORD gIntrTouchChanged = SYSINTR_NOP;
HANDLE ghTouchEvent = 0;
ULONG gulSetup;
BOOL gbInterruptMode;
ULONG gulMinInvPressure; // = 0x1500;
ULONG gulMaxInvPressure; // = 0x5000;
ULONG gulLastX = 0;
ULONG gulLastY = 0;
ULONG gulMaxChange; // = 0x300;
ULONG gulTouchSampleRate = TOUCHPANEL_SAMPLE_RATE_HIGH;
ULONG gulSampleRateID = TPSM_SAMPLERATE_HIGH_ID;
HANDLE ghTimer2Event;
extern "C"
{
extern DWORD gdwTouchIstTimeout;
extern HANDLE hTouchPanelEvent;
};
DWORD ReadRegistryValue(HKEY hKey, PTSTR szValueName, DWORD dwDefault);
//
// Function Declaration.
//
struct TouchStruct
{
ULONG ulX;
ULONG ulY;
ULONG ulZ1;
ULONG ulZ2;
};
static ULONG CalculateInvPressure(TouchStruct *pTouch); //static BOOL IsTouchValid(TouchStruct *pTouch);
ULONG ADCGetData(ULONG ulADCSwitch, ULONG ulSamples, ULONG ulMaxDiff);
static void DischargeScreen(void);
static void GetTouchValues( TouchStruct *pTouch);
static void TouchPollingMode(void);
static void TouchInterruptMode(void);
static void DelayuS(ULONG ulDelay);
//****************************************************************************
//
// DDSI Implementation
//
//
// @DOC EX_TOUCH_DDSI EXTERNAL DRIVERS TOUCH_DRIVER
// @FUNC BOOL | TouchDriverCalibrationPointGet |
//
// Gives a single calibration point.
//
// @XREF
// <l TouchPanelReadCalibrationPoint.TouchPanelReadCalibrationPoint>
// <l TouchPanelSetCalibration.TouchPanelSetCalibration>
// <l TouchPanelReadCalibrationAbort.TouchPanelReadCalibrationAbort>
//
//
// @COMM
//
// This function is called to get a single calibration point, in screen
// coordinates, when the input system is calibrating the touch driver. The
// input system will then draw a target on the screen for the user to press on.
//
// The driver may use the cDisplayX and cDisplayY to compute a coordinate.
// It does not need to remember this computed value internally since it will
// be passed back when the input system has collected all of the points and
// calls <l TouchPanelSetCalibration.TouchPanelSetCalibration>.
//
//****************************************************************************
extern "C" BOOL TouchDriverCalibrationPointGet(TPDC_CALIBRATION_POINT *pTCP)
{
INT32 cDisplayWidth = pTCP->cDisplayWidth;
INT32 cDisplayHeight = pTCP->cDisplayHeight;
int CalibrationRadiusX = cDisplayWidth/10;
int CalibrationRadiusY = cDisplayHeight/10;
switch (pTCP->PointNumber)
{
case 0: // Middle
pTCP->CalibrationX = cDisplayWidth/2;
pTCP->CalibrationY = cDisplayHeight/2;
break;
case 1: // Upper Left
pTCP->CalibrationX = CalibrationRadiusX*2;
pTCP->CalibrationY = CalibrationRadiusY*2;
break;
case 2: // Lower Left
pTCP->CalibrationX = CalibrationRadiusX*2;
pTCP->CalibrationY = cDisplayHeight - CalibrationRadiusY*2;
break;
case 3: // Lower Right
pTCP->CalibrationX = cDisplayWidth - CalibrationRadiusX*2;
pTCP->CalibrationY = cDisplayHeight - CalibrationRadiusY*2;
break;
case 4: // Upper Right
pTCP->CalibrationX = cDisplayWidth - CalibrationRadiusX*2;
pTCP->CalibrationY = CalibrationRadiusY*2;
break;
default:
pTCP->CalibrationX = cDisplayWidth/2;
pTCP->CalibrationY = cDisplayHeight/2;
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
return TRUE;
}
//****************************************************************************
// @doc EX_TOUCH_DDSI EXTERNAL DRIVERS DDSI TOUCH_PANEL
//
// @func ULONG | DdsiTouchPanelGetDeviceCaps |
//
// Queries capabilities about the physical touch panel device.
//
// @parm ULONG | iIndex |
//
// Specifies the capability to query. They are one of the following:
//
// @flag TPDC_SAMPLERATE_ID |
// The sample rate.
// @flag TPDC_CALIBRATIONPOINTS_ID |
// The X and Y coordinates used for calibration.
// @flag TPDC_CALIBRATIONDATA_ID |
// The X and Y coordinates used for calibration mapping.
//
// @parm LPVOID | lpOutput |
// Points to the memory location(s) where the queried information
// will be placed. The format of the memory referenced depends on
// the setting of iIndex. If 0, returns the number of words
// required for the output data.
//
// @rdesc
// The return values is set to the amount of information supplied and depends
// on the setting of the iIndex argument.
//
// @comm
// Implemented in the PDD.
//
//****************************************************************************
extern "C" BOOL DdsiTouchPanelGetDeviceCaps(INT iIndex,LPVOID lpOutput)
{
if (lpOutput == NULL)
{
ERRORMSG(1,(__TEXT("TouchPanelGetDeviceCaps: invalid parameter.\r\n")));
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
switch(iIndex)
{
case TPDC_SAMPLE_RATE_ID:
{
TPDC_SAMPLE_RATE *pTSR = (TPDC_SAMPLE_RATE*)lpOutput;
pTSR->SamplesPerSecondLow = TOUCHPANEL_SAMPLE_RATE_LOW;
pTSR->SamplesPerSecondHigh = TOUCHPANEL_SAMPLE_RATE_HIGH;
pTSR->CurrentSampleRateSetting = (1 - gulSampleRateID);
break;
}
case TPDC_CALIBRATION_POINT_COUNT_ID:
{
TPDC_CALIBRATION_POINT_COUNT *pTCPC = (TPDC_CALIBRATION_POINT_COUNT*)lpOutput;
pTCPC->flags = 0;
pTCPC->cCalibrationPoints = CALIBRATION_POINTS;
break;
}
case TPDC_CALIBRATION_POINT_ID:
return(TouchDriverCalibrationPointGet((TPDC_CALIBRATION_POINT*)lpOutput));
default:
ERRORMSG(1,(__TEXT("TouchPanelGetDeviceCaps: invalid parameter.\r\n")));
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
return TRUE;
}
//****************************************************************************
//
// @doc EX_TOUCH_DDSI EXTERNAL DRIVERS DDSI TOUCH_PANEL
//
// @func BOOL | DdsiTouchPanelSetMode |
// Sets information about the physical touch panel device.
//
// @parm ULONG | iIndex |
// Specifies the mode to set. They are one of the following:
//
// @flag TPSM_SAMPLERATE_HIGH_ID |
// Sets the sample rate to the high rate.
// @flag TPSM_SAMPLERATE_LOW_ID |
// Sets the sample rate to the low rate.
//
// @parm LPVOID | lpInput |
// Points to the memory location(s) where the update information
// resides. The format of the memory referenced depends on the
// Points to the memory location(s) where the queried information
// will be placed.
//
// @rdesc
// If the function succeeds the return value is TRUE, otherwise, it is FALSE.
//
// @comm
// Implemented in the PDD.
//
//****************************************************************************
BOOL DdsiTouchPanelSetMode(INT iIndex,LPVOID lpInput)
{
BOOL ReturnCode = FALSE;
//RETAILMSG(1,(TEXT("DdsiTouchPanelSetMode(0x%x)\r\n"),iIndex));
switch (iIndex)
{
case TPSM_SAMPLERATE_LOW_ID:
gulTouchSampleRate = TOUCHPANEL_SAMPLE_RATE_LOW;
gulSampleRateID = TPSM_SAMPLERATE_LOW_ID;
SetLastError(ERROR_SUCCESS);
ReturnCode = TRUE;
break;
case TPSM_SAMPLERATE_HIGH_ID:
gulTouchSampleRate = TOUCHPANEL_SAMPLE_RATE_HIGH;
gulSampleRateID = TPSM_SAMPLERATE_HIGH_ID;
SetLastError(ERROR_SUCCESS);
ReturnCode = TRUE;
break;
default:
SetLastError(ERROR_INVALID_PARAMETER);
break;
}
return (ReturnCode);
}
//****************************************************************************
//
// @doc EX_TOUCH_DDSI EXTERNAL DRIVERS DDSI TOUCH_PANEL
//
// @func BOOL | DdsiTouchPanelEnable |
// Powers up and initializes the touch panel hardware for operation.
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -