121 lines
2.9 KiB
C
121 lines
2.9 KiB
C
/*
|
|
* This file is subject to the terms of the GFX License. If a copy of
|
|
* the license was not distributed with this file, you can obtain one at:
|
|
*
|
|
* http://chibios-gfx.com/license.html
|
|
*/
|
|
|
|
/**
|
|
* @file drivers/ginput/touch/STMPE811/ginput_lld_mouse.c
|
|
* @brief GINPUT Touch low level driver source for the STMPE811.
|
|
*
|
|
* @defgroup Mouse Mouse
|
|
* @ingroup GINPUT
|
|
* @{
|
|
*/
|
|
|
|
#include "ch.h"
|
|
#include "hal.h"
|
|
#include "gfx.h"
|
|
|
|
#include "ft5x06.h"
|
|
|
|
#if (GFX_USE_GINPUT && GINPUT_NEED_MOUSE) /*|| defined(__DOXYGEN__)*/
|
|
|
|
#include "ginput/lld/mouse.h"
|
|
|
|
// include board abstraction
|
|
#include "ginput_lld_mouse_board.h"
|
|
|
|
static coord_t x, y, z;
|
|
static uint8_t touched;
|
|
|
|
/**
|
|
* @brief Initialise the mouse/touch.
|
|
*
|
|
* @notapi
|
|
*/
|
|
void ginput_lld_mouse_init(void) {
|
|
init_board();
|
|
|
|
// Init default values. (From NHD-3.5-320240MF-ATXL-CTP-1 datasheet)
|
|
// Valid touching detect threshold
|
|
write_reg(FT5x06_ID_G_THGROUP, 1, 0x16);
|
|
|
|
// valid touching peak detect threshold
|
|
write_reg(FT5x06_ID_G_THPEAK, 1, 0x3C);
|
|
|
|
// Touch focus threshold
|
|
write_reg(FT5x06_ID_G_THCAL, 1, 0xE9);
|
|
|
|
// threshold when there is surface water
|
|
write_reg(FT5x06_ID_G_THWATER, 1, 0x01);
|
|
|
|
// threshold of temperature compensation
|
|
write_reg(FT5x06_ID_G_THTEMP, 1, 0x01);
|
|
|
|
// Touch difference threshold
|
|
write_reg(FT5x06_ID_G_THDIFF, 1, 0xA0);
|
|
|
|
// Delay to enter 'Monitor' status (s)
|
|
write_reg(FT5x06_ID_G_TIME_ENTER_MONITOR, 1, 0x0A);
|
|
|
|
// Period of 'Active' status (ms)
|
|
write_reg(FT5x06_ID_G_PERIODACTIVE, 1, 0x06);
|
|
|
|
// Timer to enter ÔidleÕ when in 'Monitor' (ms)
|
|
write_reg(FT5x06_ID_G_PERIODMONITOR, 1, 0x28);
|
|
}
|
|
|
|
/**
|
|
* @brief Read the mouse/touch position.
|
|
*
|
|
* @param[in] pt A pointer to the structure to fill
|
|
*
|
|
* @note For drivers that don't support returning a position
|
|
* when the touch is up (most touch devices), it should
|
|
* return the previous position with the new Z value.
|
|
* The z value is the pressure for those touch devices
|
|
* that support it (-100 to 100 where > 0 is touched)
|
|
* or, 0 or 100 for those drivers that don't.
|
|
*
|
|
* @notapi
|
|
*/
|
|
void ginput_lld_mouse_get_reading(MouseReading *pt) {
|
|
// Poll to get the touched status
|
|
uint8_t last_touched;
|
|
|
|
last_touched = touched;
|
|
touched = (uint8_t)read_reg(FT5x06_TOUCH_POINTS, 1) & 0x07;
|
|
|
|
// If not touched, return the previous results
|
|
if (touched == 0) {
|
|
pt->x = x;
|
|
pt->y = y;
|
|
pt->z = 0;
|
|
pt->buttons = 0;
|
|
return;
|
|
}
|
|
|
|
/* Get the X, Y, Z values */
|
|
x = (coord_t)(read_reg(FT5x06_TOUCH1_XH, 2) & 0x0fff);
|
|
y = (coord_t)read_reg(FT5x06_TOUCH1_YH, 2);
|
|
z = 100;
|
|
|
|
// Rescale X,Y,Z - X & Y don't need scaling when you are using calibration!
|
|
#if !GINPUT_MOUSE_NEED_CALIBRATION
|
|
x = gdispGetWidth() - x / (4096/gdispGetWidth());
|
|
y = y / (4096/gdispGetHeight());
|
|
#endif
|
|
|
|
// Return the results. ADC gives values from 0 to 2^12 (4096)
|
|
pt->x = x;
|
|
pt->y = y;
|
|
pt->z = z;
|
|
pt->buttons = GINPUT_TOUCH_PRESSED;
|
|
}
|
|
|
|
#endif /* GFX_USE_GINPUT && GINPUT_NEED_MOUSE */
|
|
/** @} */
|
|
|