You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
180 lines
3.9 KiB
C
180 lines
3.9 KiB
C
2 years ago
|
/**
|
||
|
* @file FT5406EE8.c
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
/*********************
|
||
|
* INCLUDES
|
||
|
*********************/
|
||
|
#include "FT5406EE8.h"
|
||
|
#if USE_FT5406EE8
|
||
|
|
||
|
#include <stddef.h>
|
||
|
#include <stdbool.h>
|
||
|
#include LV_DRV_INDEV_INCLUDE
|
||
|
#include LV_DRV_DELAY_INCLUDE
|
||
|
|
||
|
/*********************
|
||
|
* DEFINES
|
||
|
*********************/
|
||
|
|
||
|
#define I2C_WR_BIT 0x00
|
||
|
#define I2C_RD_BIT 0x01
|
||
|
|
||
|
/*DEVICE MODES*/
|
||
|
#define OPERAT_MD 0x00
|
||
|
#define TEST_MD 0x04
|
||
|
#define SYS_INF_MD 0x01
|
||
|
|
||
|
/*OPERATING MODE*/
|
||
|
#define DEVICE_MODE 0x00
|
||
|
#define GEST_ID 0x01
|
||
|
#define TD_STATUS 0x02
|
||
|
|
||
|
#define FT5406EE8_FINGER_MAX 10
|
||
|
|
||
|
/*Register addresses*/
|
||
|
#define FT5406EE8_REG_DEVICE_MODE 0x00
|
||
|
#define FT5406EE8_REG_GEST_ID 0x01
|
||
|
#define FT5406EE8_REG_TD_STATUS 0x02
|
||
|
#define FT5406EE8_REG_YH 0x03
|
||
|
#define FT5406EE8_REG_YL 0x04
|
||
|
#define FT5406EE8_REG_XH 0x05
|
||
|
#define FT5406EE8_REG_XL 0x06
|
||
|
|
||
|
/**********************
|
||
|
* TYPEDEFS
|
||
|
**********************/
|
||
|
|
||
|
/**********************
|
||
|
* STATIC PROTOTYPES
|
||
|
**********************/
|
||
|
|
||
|
static bool ft5406ee8_get_touch_num(void);
|
||
|
static bool ft5406ee8_read_finger1(int16_t * x, int16_t * y);
|
||
|
|
||
|
/**********************
|
||
|
* STATIC VARIABLES
|
||
|
**********************/
|
||
|
|
||
|
/**********************
|
||
|
* MACROS
|
||
|
**********************/
|
||
|
|
||
|
/**********************
|
||
|
* GLOBAL FUNCTIONS
|
||
|
**********************/
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*/
|
||
|
void ft5406ee8_init(void)
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the current position and state of the touchpad
|
||
|
* @param data store the read data here
|
||
|
* @return false: because no ore data to be read
|
||
|
*/
|
||
|
bool ft5406ee8_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
|
||
|
{
|
||
|
static int16_t x_last;
|
||
|
static int16_t y_last;
|
||
|
int16_t x;
|
||
|
int16_t y;
|
||
|
bool valid = true;
|
||
|
|
||
|
valid = ft5406ee8_get_touch_num();
|
||
|
if(valid == true) {
|
||
|
valid = ft5406ee8_read_finger1(&x, &y);
|
||
|
}
|
||
|
|
||
|
if(valid == true) {
|
||
|
x = (uint32_t)((uint32_t)x * 320) / 2048;
|
||
|
y = (uint32_t)((uint32_t)y * 240) / 2048;
|
||
|
|
||
|
|
||
|
x_last = x;
|
||
|
y_last = y;
|
||
|
} else {
|
||
|
x = x_last;
|
||
|
y = y_last;
|
||
|
}
|
||
|
|
||
|
data->point.x = x;
|
||
|
data->point.y = y;
|
||
|
data->state = valid == false ? LV_INDEV_STATE_REL : LV_INDEV_STATE_PR;
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/**********************
|
||
|
* STATIC FUNCTIONS
|
||
|
**********************/
|
||
|
|
||
|
static bool ft5406ee8_get_touch_num(void)
|
||
|
{
|
||
|
bool ok = true;
|
||
|
uint8_t t_num = 0;
|
||
|
|
||
|
LV_DRV_INDEV_I2C_START;
|
||
|
LV_DRV_INDEV_I2C_WR((FT5406EE8_I2C_ADR << 1) | I2C_WR_BIT);
|
||
|
LV_DRV_INDEV_I2C_WR(FT5406EE8_REG_TD_STATUS)
|
||
|
LV_DRV_INDEV_I2C_RESTART;
|
||
|
LV_DRV_INDEV_I2C_WR((FT5406EE8_I2C_ADR << 1) | I2C_RD_BIT);
|
||
|
t_num = LV_DRV_INDEV_I2C_READ(0);
|
||
|
|
||
|
/* Error if not touched or too much finger */
|
||
|
if(t_num > FT5406EE8_FINGER_MAX || t_num == 0) {
|
||
|
ok = false;
|
||
|
}
|
||
|
|
||
|
return ok;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Read the x and y coordinated
|
||
|
* @param x store the x coordinate here
|
||
|
* @param y store the y coordinate here
|
||
|
* @return false: not valid point; true: valid point
|
||
|
*/
|
||
|
static bool ft5406ee8_read_finger1(int16_t * x, int16_t * y)
|
||
|
{
|
||
|
uint8_t temp_xH = 0;
|
||
|
uint8_t temp_xL = 0;
|
||
|
uint8_t temp_yH = 0;
|
||
|
uint8_t temp_yL = 0;
|
||
|
|
||
|
/*Read Y High and low byte*/
|
||
|
LV_DRV_INDEV_I2C_START;
|
||
|
LV_DRV_INDEV_I2C_WR((FT5406EE8_I2C_ADR << 1) | I2C_WR_BIT);
|
||
|
LV_DRV_INDEV_I2C_WR(FT5406EE8_REG_YH)
|
||
|
LV_DRV_INDEV_I2C_RESTART;
|
||
|
LV_DRV_INDEV_I2C_WR((FT5406EE8_I2C_ADR << 1) | I2C_RD_BIT);
|
||
|
temp_yH = LV_DRV_INDEV_I2C_READ(1);
|
||
|
temp_yL = LV_DRV_INDEV_I2C_READ(1);
|
||
|
|
||
|
/*The upper two bit must be 2 on valid press*/
|
||
|
if(((temp_yH >> 6) & 0xFF) != 2) {
|
||
|
(void) LV_DRV_INDEV_I2C_READ(0); /*Dummy read to close read sequence*/
|
||
|
*x = 0;
|
||
|
*y = 0;
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/*Read X High and low byte*/
|
||
|
temp_xH = LV_DRV_INDEV_I2C_READ(1);
|
||
|
temp_xL = LV_DRV_INDEV_I2C_READ(0);
|
||
|
|
||
|
/*Save the result*/
|
||
|
*x = (temp_xH & 0x0F) << 8;
|
||
|
*x += temp_xL;
|
||
|
*y = (temp_yH & 0x0F) << 8;
|
||
|
*y += temp_yL;
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
#endif
|