161 lines
7.8 KiB
C
161 lines
7.8 KiB
C
/*********************************************************************
|
|
* Portions COPYRIGHT 2016 STMicroelectronics *
|
|
* Portions SEGGER Microcontroller GmbH & Co. KG *
|
|
* Solutions for real time microcontroller applications *
|
|
**********************************************************************
|
|
* *
|
|
* (c) 1996 - 2015 SEGGER Microcontroller GmbH & Co. KG *
|
|
* *
|
|
* Internet: www.segger.com Support: support@segger.com *
|
|
* *
|
|
**********************************************************************
|
|
|
|
** emWin V5.32 - Graphical user interface for embedded applications **
|
|
All Intellectual Property rights in the Software belongs to SEGGER.
|
|
emWin is protected by international copyright laws. Knowledge of the
|
|
source code may not be used to write a similar product. This file may
|
|
only be used in accordance with the following terms:
|
|
|
|
The software has been licensed to STMicroelectronics International
|
|
N.V. a Dutch company with a Swiss branch and its headquarters in Plan-
|
|
les-Ouates, Geneva, 39 Chemin du Champ des Filles, Switzerland for the
|
|
purposes of creating libraries for ARM Cortex-M-based 32-bit microcon_
|
|
troller products commercialized by Licensee only, sublicensed and dis_
|
|
tributed under the terms and conditions of the End User License Agree_
|
|
ment supplied by STMicroelectronics International N.V.
|
|
Full source code is available at: www.segger.com
|
|
|
|
We appreciate your understanding and fairness.
|
|
----------------------------------------------------------------------
|
|
File : GUITDRV_ADS7846.h
|
|
Purpose : Touch screen driver include
|
|
----------------------------------------------------------------------
|
|
|
|
Notes
|
|
=====
|
|
(1) The driver needs some function pointer to be filled correctly to be able
|
|
to communicate with the external peripheral correctly. The correct assignment
|
|
of these function pointers is checked during driver configuration.
|
|
|
|
(2) The driver needs some configuration variables filled in to be able to calculate
|
|
the logical screen coordinates from the physical AD values.
|
|
A description of the typical paramaters that have to be known by the driver is
|
|
listed below:
|
|
- Orientation: Orientation of the touch screen if not the same as the physical orientation.
|
|
A or-combination of the defines GUI_SWAP_XY, GUI_MIRROR_X and GUI_MIRROR_Y
|
|
can be used.
|
|
- xLog0 : Logical pixel value of horizontal reference point 0. Typically 0.
|
|
- xLog1 : Logical pixel value of horizontal reference point 1. Typically horizontal screen resolution -1.
|
|
- xPhys0 : Physical AD value of horizontal reference point 0.
|
|
- xPhys1 : Physical AD value of horizontal reference point 1.
|
|
- yLog0 : Logical pixel value of vertical reference point 0. Typically 0.
|
|
- yLog1 : Logical pixel value of vertical reference point 1. Typically vertical screen resolution -1.
|
|
- yPhys0 : Physical AD value of vertical reference point 0.
|
|
- yPhys1 : Physical AD value of vertical reference point 1.
|
|
|
|
(3) If the PENIRQ line of the touch controller is connected to a port of the target hardware
|
|
a touch event can be detected by the driver. Upon polling the driver's exec routine the
|
|
driver can check if a touch event is ready to be sampled by checking the PENIRQ line.
|
|
Without PENIRQ line the driver will always try to sample a touch event even if no touch
|
|
happened which will consume time even if not necessary.
|
|
Without PENIRQ it is the responsibility of the user's pfGetResult() routine to return
|
|
0xFFFF if the measured AD value is out of bounds.
|
|
If both, the PENIRQ and the touch pressure recognition are enabled first the PENIRQ will
|
|
signal that there is a touch event. Afterwards the touch pressure measurement is used to
|
|
confirm that this was a valid touch and the touch had enough pressure to deliver good
|
|
measurements.
|
|
|
|
(4) The touch pressure measurement is activated by setting a value for PressureMin and
|
|
PressureMax .
|
|
To calculate the correct touch pressure the resistance of the X-plate has to be known.
|
|
This can be set via PlateResistanceX [Ohm].
|
|
A touch event that we have measured with a pressure within these thresholds is confirmed
|
|
as valid touch event with good measurment samples.
|
|
If both, the PENIRQ and the touch pressure recognition are enabled first the PENIRQ will
|
|
signal that there is a touch event. Afterwards the touch pressure measurement is used to
|
|
confirm that this was a valid touch and the touch had enough pressure to deliver good
|
|
measurements.
|
|
If no PENIRQ line is connected this measurement takes place everytime the touch event is
|
|
polled regardless if there is a touch event or not as the driver will only know for sure
|
|
after calculating the touch pressure.
|
|
Setting the value for PlateResistanceX to 0 is invalid. The driver will internally use a
|
|
value of 1 instead.
|
|
*/
|
|
|
|
#ifndef GUITDRV_ADS7846_H /* Make sure we only include it once */
|
|
#define GUITDRV_ADS7846_H
|
|
|
|
#include "GUI_Type.h"
|
|
|
|
#if defined(__cplusplus)
|
|
extern "C" { /* Make sure we have C-declarations in C++ programs */
|
|
#endif
|
|
|
|
/*********************************************************************
|
|
*
|
|
* Types
|
|
*
|
|
**********************************************************************
|
|
*/
|
|
|
|
typedef struct {
|
|
//
|
|
// Function pointer (1)
|
|
//
|
|
void (* pfSendCmd) (U8 Data); // Sends a 8-bit command to the peripheral
|
|
U16 (* pfGetResult) (void); // Retrieves the result of the AD conversion. 4 dummy bytes have to be shifted out to the left.
|
|
char (* pfGetBusy) (void); // Retrieves the status of the busy line. 0: Not busy; 1: Busy
|
|
void (* pfSetCS) (char OnOff); // Set chip select line. OnOff == 1 means peripheral selected
|
|
//
|
|
// Configuration (2)
|
|
//
|
|
unsigned Orientation;
|
|
int xLog0;
|
|
int xLog1;
|
|
int xPhys0;
|
|
int xPhys1;
|
|
int yLog0;
|
|
int yLog1;
|
|
int yPhys0;
|
|
int yPhys1;
|
|
//
|
|
// Optional, touch recognition via PENIRQ line (3)
|
|
//
|
|
char (* pfGetPENIRQ) (void); // Retrieves the status of the PENIRQ line to detect a touch event.
|
|
//
|
|
// Optional, touch recognition via touch pressure measurement (4)
|
|
//
|
|
int PressureMin; // Minimum pressure threshold. A measured pressure below this value means we do not have a valid touch event.
|
|
int PressureMax; // Maximum pressure threshold. A measured pressure above this value means we do not have a valid touch event.
|
|
int PlateResistanceX; // Resistance of the X-plate of the touch screen. This value is needed for calculation of the touch pressure.
|
|
} GUITDRV_ADS7846_CONFIG;
|
|
|
|
typedef struct {
|
|
int xPhys; // Last measured x value
|
|
int yPhys; // Last measured y value
|
|
int z1Phys; // Last measured z1 value
|
|
int z2Phys; // Last measured z2 value
|
|
int PENIRQ; // Last sampled PENIRQ state if PENIRQ callback has been set
|
|
int Pressure; // Last measured touch pressure if touch pressure measurement is enabled
|
|
} GUITDRV_ADS7846_LAST_VAL;
|
|
|
|
/*********************************************************************
|
|
*
|
|
* Prototypes
|
|
*
|
|
**********************************************************************
|
|
*/
|
|
|
|
void GUITDRV_ADS7846_Config (GUITDRV_ADS7846_CONFIG * pConfig);
|
|
char GUITDRV_ADS7846_Exec (void);
|
|
void GUITDRV_ADS7846_GetLastVal(GUITDRV_ADS7846_LAST_VAL * p);
|
|
|
|
#if defined(__cplusplus)
|
|
} /* Make sure we have C-declarations in C++ programs */
|
|
#endif
|
|
|
|
|
|
#endif /* GUITDRV_ADS7846_H */
|
|
|
|
/*************************** End of file ****************************/
|