368 lines
9.9 KiB
C
368 lines
9.9 KiB
C
/**@file
|
|
Header file for Touch Panel Driver
|
|
|
|
@copyright
|
|
INTEL CONFIDENTIAL
|
|
Copyright 2013 - 2020 Intel Corporation.
|
|
|
|
The source code contained or described herein and all documents related to the
|
|
source code ("Material") are owned by Intel Corporation or its suppliers or
|
|
licensors. Title to the Material remains with Intel Corporation or its suppliers
|
|
and licensors. The Material may contain trade secrets and proprietary and
|
|
confidential information of Intel Corporation and its suppliers and licensors,
|
|
and is protected by worldwide copyright and trade secret laws and treaty
|
|
provisions. No part of the Material may be used, copied, reproduced, modified,
|
|
published, uploaded, posted, transmitted, distributed, or disclosed in any way
|
|
without Intel's prior express written permission.
|
|
|
|
No license under any patent, copyright, trade secret or other intellectual
|
|
property right is granted to or conferred upon you by disclosure or delivery
|
|
of the Materials, either expressly, by implication, inducement, estoppel or
|
|
otherwise. Any license under such intellectual property rights must be
|
|
express and approved by Intel in writing.
|
|
|
|
Unless otherwise agreed by Intel in writing, you may not remove or alter
|
|
this notice or any other notice embedded in Materials by Intel or
|
|
Intel's suppliers or licensors in any way.
|
|
|
|
This file contains a 'Sample Driver' and is licensed as such under the terms
|
|
of your license agreement with Intel or your vendor. This file may be modified
|
|
by the user, subject to the additional terms of the license agreement.
|
|
|
|
@par Specification Reference:
|
|
|
|
**/
|
|
|
|
#ifndef _EFI_I2C_TOUCH_PANEL_H_
|
|
#define _EFI_I2C_TOUCH_PANEL_H_
|
|
|
|
#include <Uefi.h>
|
|
|
|
//
|
|
// Libraries
|
|
//
|
|
#include <Library/BaseLib.h>
|
|
#include <Library/BaseMemoryLib.h>
|
|
#include <Library/DebugLib.h>
|
|
#include <Library/DevicePathLib.h>
|
|
#include <Library/MemoryAllocationLib.h>
|
|
#include <Library/PcdLib.h>
|
|
#include <Library/UefiBootServicesTableLib.h>
|
|
#include <Library/UefiLib.h>
|
|
#include <Library/UefiRuntimeServicesTableLib.h>
|
|
#include <Library/IoLib.h>
|
|
#include <Library/PerformanceLib.h>
|
|
#include <Library/TimerLib.h>
|
|
|
|
//
|
|
// UEFI Driver Model Protocols
|
|
//
|
|
#include <Protocol/DriverBinding.h>
|
|
#include <Protocol/DriverSupportedEfiVersion.h>
|
|
#include <Protocol/ComponentName2.h>
|
|
#include <Protocol/ComponentName.h>
|
|
|
|
//
|
|
// Consumed Protocols
|
|
//
|
|
#include <Protocol/I2cIo.h>
|
|
|
|
//
|
|
// Produced Protocols
|
|
//
|
|
#include <Protocol/AbsolutePointer.h>
|
|
|
|
#include "Library/HidI2cPlatformSupportLib.h"
|
|
|
|
//
|
|
// Driver Version
|
|
//
|
|
#define TOUCH_DRIVER_VERSION 0x00000000
|
|
#define MAX_HID_COLLECTION 256
|
|
|
|
//
|
|
// Protocol instances
|
|
//
|
|
extern EFI_DRIVER_BINDING_PROTOCOL gTouchPanelDriverDriverBinding;
|
|
extern EFI_COMPONENT_NAME2_PROTOCOL gTouchPanelDriverComponentName2;
|
|
extern EFI_COMPONENT_NAME_PROTOCOL gTouchPanelDriverComponentName;
|
|
|
|
//
|
|
// Include files with function prototypes
|
|
//
|
|
//#include "ComponentName.h"
|
|
//#include "AbsolutePointer.h"
|
|
|
|
|
|
|
|
#define DEBUG_I2C_OPERATION 0x40000000
|
|
//#define DEBUG_ENTRY_EXIT 0x20000000
|
|
#define DEBUG_INT_OUTPUT 0x01000000
|
|
#define DEBUG_ENTRY_EXIT DEBUG_INFO
|
|
|
|
#define TOUCH_SIGNATURE 0x544F4348 //"TOCH"
|
|
#define TOUCH_CONTEXT_FROM_PROTOCOL(a) CR (a, ABSOLUTE_POINTER_DEV, AbsolutePointerProtocol, TOUCH_SIGNATURE)
|
|
typedef struct _EFI_TOUCH_INIT_TAB EFI_TOUCH_INIT_TABLE;
|
|
|
|
typedef struct {
|
|
UINT8 HIDDescLengthLsb;
|
|
UINT8 HIDDescLengthMsb;
|
|
UINT8 BcdVersionLsb;
|
|
UINT8 BcdVersionMsb;
|
|
UINT8 ReportDescRegLengthLsb;
|
|
UINT8 ReportDescRegLengthMsb;
|
|
UINT8 ReportDescRegisterLsb;
|
|
UINT8 ReportDescRegisterMsb;
|
|
UINT8 InputRegisterLsb;
|
|
UINT8 InputRegisterMsb;
|
|
UINT8 MaxInputLengthLsb;
|
|
UINT8 MaxInputLengthMsb;
|
|
UINT8 OutputRegisterLsb;
|
|
UINT8 OutputRegisterMsb;
|
|
UINT8 MaxOutputLengthLsb;
|
|
UINT8 MaxOutputLengthMsb;
|
|
UINT8 CommandRegisterLsb;
|
|
UINT8 CommandRegisterMsb;
|
|
UINT8 DataRegisterLsb;
|
|
UINT8 DataRegisterMsb;
|
|
UINT16 VendorId;
|
|
UINT16 ProductId;
|
|
UINT16 VersionId;
|
|
UINT16 Reserved;
|
|
UINT16 Reserved2;
|
|
} HID_DESC;
|
|
|
|
// dictionary for parsing incoming data from touchpanel
|
|
typedef struct {
|
|
UINT32 LogMaxX; // max and min values for X and Y axes
|
|
UINT32 LogMinX;
|
|
UINT32 LogMaxY;
|
|
UINT32 LogMinY;
|
|
UINT32 BitStartB; // bit positions of Buttons state /X coordinates / Y coordinates in input stream
|
|
UINT32 BitStopB; // bit positions are calculated in pure input data (after cutting Length and reportID)
|
|
UINT32 BitStartX;
|
|
UINT32 BitStopX;
|
|
UINT32 BitStartY;
|
|
UINT32 BitStopY;
|
|
UINT32 BitsTotal; // total number of bits with declared purpose
|
|
BOOLEAN ValidCollection;
|
|
} INPUT_REPORT_COLLECTION;
|
|
|
|
// dictionary for parsing incoming data from touchpanel
|
|
typedef struct {
|
|
UINT32 Id; // ReportID. 0 means panel doesn't send ReportIDs, and it also means there is only 1 format
|
|
UINT32 CollectionCount;
|
|
INPUT_REPORT_COLLECTION Collection[MAX_HID_COLLECTION];
|
|
} INPUT_REPORT_FORMAT;
|
|
|
|
// set of dictionaries for parsing incoming data from touchpanel
|
|
typedef struct {
|
|
UINT32 Quantity; // number of different report formats a panel might send
|
|
UINT32 TouchPanel; // flag to determine if this device is a touchpanel and not e.g. touchpad
|
|
INPUT_REPORT_FORMAT* Report; // a pointer to array of dictionaries for report formats
|
|
} INPUT_REPORT_TABLE;
|
|
|
|
typedef struct {
|
|
UINTN Signature; //needed for CONTEXT_FROM_PROTOCOL
|
|
EFI_I2C_IO_PROTOCOL *I2cIoProtocol; //needed I2cBus or I2cIo
|
|
EFI_ABSOLUTE_POINTER_PROTOCOL AbsolutePointerProtocol;
|
|
EFI_ABSOLUTE_POINTER_STATE State; //storage space for AbsPtr's State
|
|
EFI_ABSOLUTE_POINTER_MODE Mode; //storage for AbsPtr's Mode
|
|
BOOLEAN NewStateAvailable;
|
|
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
|
INPUT_REPORT_TABLE InputReportTable; //dictionary for parsing data from panel into x/y coordinates
|
|
HID_DESC HidDescriptor;
|
|
EFI_HANDLE ControllerHandle;
|
|
HID_I2C_PLATFORM_SUPPORT HidI2cPlatformSupport; //platform-specific functions
|
|
EFI_EVENT PollingEvent;
|
|
|
|
} ABSOLUTE_POINTER_DEV;
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
TouchPanelDriverDriverBindingSupported (
|
|
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
|
IN EFI_HANDLE ControllerHandle,
|
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
|
);
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
TouchPanelDriverDriverBindingStart (
|
|
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
|
IN EFI_HANDLE ControllerHandle,
|
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
|
);
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
TouchPanelDriverDriverBindingStop (
|
|
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
|
IN EFI_HANDLE ControllerHandle,
|
|
IN UINTN NumberOfChildren,
|
|
IN EFI_HANDLE *ChildHandleBuffer OPTIONAL
|
|
);
|
|
|
|
VOID
|
|
EFIAPI
|
|
CheckDataAvailableCallback (
|
|
IN EFI_EVENT Event,
|
|
IN VOID *Context
|
|
);
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
InitDevice (
|
|
IN ABSOLUTE_POINTER_DEV *TouchDev,
|
|
IN EFI_HANDLE ImageHandle
|
|
);
|
|
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *EFI_TOUCH_DEV_RESET) (
|
|
IN ABSOLUTE_POINTER_DEV *TouchDev
|
|
);
|
|
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *EFI_TOUCH_HID_INIT) (
|
|
IN ABSOLUTE_POINTER_DEV *TouchDev
|
|
);
|
|
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *EFI_TOUCH_INT) (
|
|
IN ABSOLUTE_POINTER_DEV *TouchDev,
|
|
IN OUT UINT16 *X,
|
|
IN OUT UINT16 *Y,
|
|
IN OUT UINT16 *Z,
|
|
IN OUT UINT16 *ActiveButtons
|
|
);
|
|
|
|
typedef struct {
|
|
UINT32 ID;
|
|
UINT32 Value;
|
|
} REPORT_DESCRIPTOR_TOKEN;
|
|
|
|
typedef struct {
|
|
UINTN ReportId;
|
|
UINTN MaxX;
|
|
UINTN StartX;
|
|
UINTN StopX;
|
|
UINTN MaxY;
|
|
UINTN StartY;
|
|
UINTN StopY;
|
|
UINTN Button;
|
|
} REPORT_DESCRIPTOR;
|
|
|
|
struct _EFI_TOUCH_INIT_TAB {
|
|
EFI_TOUCH_DEV_RESET Reset;
|
|
EFI_TOUCH_HID_INIT HidInit;
|
|
EFI_TOUCH_INT Int;
|
|
};
|
|
|
|
#define DEFAULT_HID_DESCRIPTOR_LENGTH 0x1E
|
|
|
|
#define USE_PAGE 0x01
|
|
#define DIGITIZER 0x0D
|
|
#define DESKTOP 0x01
|
|
#define USAGE 0x02
|
|
#define TOUCHPANEL 0x04
|
|
#define TIP_SWITCH 0x42
|
|
#define X_AXIS 0x30
|
|
#define Y_AXIS 0x31
|
|
#define REPORT_ID 0x21
|
|
#define LOG_MIN 0x05
|
|
#define LOG_MAX 0x09
|
|
#define REP_SIZE 0x1d
|
|
#define REP_COUNT 0x25
|
|
#define INPUT 0x20
|
|
#define OUTPUT 0x24
|
|
#define COLLECTION 0x28
|
|
#define APPLICATION 0x01
|
|
#define LOGICAL 0x02
|
|
#define END_COLLECTION 0x30
|
|
|
|
#define SET_IDLE 0x05
|
|
#define I2C_HID_LENGTH_PREFIX 2
|
|
|
|
|
|
typedef struct {
|
|
UINT32 ID;
|
|
UINT32 Value;
|
|
} TOKEN;
|
|
|
|
typedef struct {
|
|
UINT32 GlobalUsage;
|
|
UINT32 Usages;
|
|
UINT32 UsageB;
|
|
UINT32 UsageX;
|
|
UINT32 UsageY;
|
|
UINT32 LogMax;
|
|
UINT32 LogMin;
|
|
UINT32 ReportSize;
|
|
UINT32 ReportCount;
|
|
UINT32 GlobalUsageOnStack;
|
|
UINT32 ReportSizeOnStack;
|
|
UINT32 ReportCountOnStack;
|
|
UINT32 TouchPanelUsage;
|
|
INPUT_REPORT_FORMAT TempReport;
|
|
} PARSER_STACK;
|
|
|
|
typedef struct {
|
|
UINT32 B;
|
|
UINT32 X;
|
|
UINT32 Y;
|
|
} TOUCH_OUTPUT;
|
|
|
|
typedef struct {
|
|
UINTN MinX;
|
|
UINTN MaxX;
|
|
UINTN MinY;
|
|
UINTN MaxY;
|
|
} TOUCH_XY_BOUNDARY;
|
|
|
|
UINT16
|
|
GetLength (
|
|
IN UINT8 Lsb,
|
|
IN UINT8 Msb
|
|
);
|
|
|
|
EFI_STATUS
|
|
TouchDevInt (
|
|
IN ABSOLUTE_POINTER_DEV *TouchDev,
|
|
IN OUT UINT16 *X,
|
|
IN OUT UINT16 *Y,
|
|
IN OUT UINT16 *Z,
|
|
IN OUT UINT16 *ActiveButtons
|
|
);
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
TouchDevInit(
|
|
IN ABSOLUTE_POINTER_DEV *TouchDev
|
|
);
|
|
|
|
EFI_STATUS
|
|
ReadInputReportDescriptor (
|
|
IN ABSOLUTE_POINTER_DEV *TouchDev
|
|
);
|
|
|
|
/*
|
|
This function uses dictionaries to parse incoming InputReport and convert it into X/Y coordinates plus Button info.
|
|
*/
|
|
EFI_STATUS
|
|
ParseInput (
|
|
INPUT_REPORT_TABLE ReportTable,
|
|
UINT8 *InputStream,
|
|
TOUCH_OUTPUT *Output,
|
|
TOUCH_XY_BOUNDARY *MinMax
|
|
);
|
|
|
|
EFI_STATUS
|
|
SetInterruptFrequency (
|
|
IN ABSOLUTE_POINTER_DEV *TouchDev
|
|
);
|
|
|
|
#endif
|