180 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			180 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /**
 | |
|  * @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
 | 
