/*
 * File      : focaltech_ts.h
 * This file is part of RT-Thread RTOS
 * COPYRIGHT (C) 2006 - 2017, RT-Thread Development Team
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Change Logs:
 * Date           Author       Notes
 * 2017-01-01     Urey      first version
 */
#ifndef _FOCALTECH_TS_H_
#define _FOCALTECH_TS_H_

#ifdef __cplusplus
extern "C" {
#endif

#include <stdint.h>

/* -- dirver configure -- */
#define FTS_SLAVE_ADDR                      (0x70 >> 1)
#define CFG_MAX_TOUCH_POINTS                10
#define FTS_PRESS_MAX                       0xFF
#define FTS_PRESS                           0x08
#define FTS_NAME                            "FTS"
#define FTS_INPUT_DEV_NAME                  "focal-touchscreen"
#define FTS_MAX_ID                          0x0F
#define FTS_TOUCH_STEP                      6
#define FTS_TOUCH_X_H_POS                   3
#define FTS_TOUCH_X_L_POS                   4
#define FTS_TOUCH_Y_H_POS                   5
#define FTS_TOUCH_Y_L_POS                   6
#define FTS_TOUCH_XY_POS                    7
#define FTS_TOUCH_MISC                      8
#define FTS_TOUCH_EVENT_POS                 3
#define FTS_TOUCH_ID_POS                    5
#define FT_TOUCH_POINT_NUM                  2
#define POINT_READ_BUF                      (3 + FTS_TOUCH_STEP * CFG_MAX_TOUCH_POINTS)

/*register address*/
#define FTS_REG_CHIP_ID                     0xA3    //chip ID
#define FTS_REG_FW_VER                      0xA6
#define FTS_REG_POINT_RATE                  0x88
#define FTS_REG_THGROUP                     0x80
#define FTS_REG_VENDOR_ID                   0xA8

#define FTS_ENABLE_IRQ                      1
#define FTS_DISABLE_IRQ                     0
#define TPD_MAX_POINTS_2                    2
#define TPD_MAX_POINTS_5                    5
#define TPD_MAXPOINTS_10                    10
#define AUTO_CLB_NEED                       1
#define AUTO_CLB_NONEED                     0

#define TOUCH_SWAP_XY           1
#define TOUCH_SWAP_X            0
#define TOUCH_SWAP_Y            1

struct Upgrade_Info
{
    uint8_t  CHIP_ID;
    uint8_t  FTS_NAME_INFO[20];
    uint8_t  TPD_MAX_POINTS;
    uint8_t  AUTO_CLB;
    uint16_t delay_aa; /*delay of write FTS_UPGRADE_AA */
    uint16_t delay_55; /*delay of write FTS_UPGRADE_55 */
    uint8_t  upgrade_id_1; /*upgrade id 1 */
    uint8_t  upgrade_id_2; /*upgrade id 2 */
    uint16_t delay_readid; /*delay of read id */
    uint16_t delay_earse_flash; /*delay of earse flash*/
};

/* The platform data for the Focaltech focaltech touchscreen driver */
struct fts_platform_data
{
    uint32_t gpio_irq;                                                  /* IRQ port*/
    uint32_t irq_cfg;
    uint32_t gpio_wakeup;                                           /* Wakeup support*/
    uint32_t wakeup_cfg;
    uint32_t gpio_reset;                                                /* Reset support*/
    uint32_t reset_cfg;
    int screen_max_x;
    int screen_max_y;
    int pressure_max;
};

struct fts_event
{
    uint16_t au16_x[CFG_MAX_TOUCH_POINTS];                            /*x coordinate */
    uint16_t au16_y[CFG_MAX_TOUCH_POINTS];                            /*y coordinate */
    uint8_t  au8_touch_event[CFG_MAX_TOUCH_POINTS];                   /*touch event:0 -- down; 1-- contact; 2 -- contact */
    uint8_t  au8_finger_id[CFG_MAX_TOUCH_POINTS];                     /*touch ID */
    uint8_t  au8_finger_weight[CFG_MAX_TOUCH_POINTS];                 /*touch weight */
    uint8_t  pressure[CFG_MAX_TOUCH_POINTS];
    uint8_t  area[CFG_MAX_TOUCH_POINTS];
    uint8_t  touch_point;
    uint8_t  touch_point_num;
};

struct focal_i2c_platform_data
{
    uint16_t version;
    int abs_x_min;
    int abs_x_max;
    int abs_y_min;
    int abs_y_max;
    int intr_gpio;
    int rst_gpio;
};

struct fts_ts_data
{
    uint8_t  addr;
    uint8_t  fw_ver;     //firmware version
    uint32_t x_min,x_max;
    uint32_t y_min,y_max;
    uint32_t init_success;
    struct fts_event event;

    struct rt_i2c_bus_device *i2c_bus;
    struct rt_semaphore     sem;
    int touchs;
};

void fts_ts_interrupt_cb(struct fts_ts_data *fts_ts);
int  fts_ts_probe(struct fts_ts_data *fts_ts,struct rt_i2c_bus_device *i2c_bus, const uint8_t addr);

#ifdef __cplusplus
}
#endif

#endif /* _FOCALTECH_TS_H_ */