/*
 * ist40xx_driver.h
 *
 * Copyright (C) 2019, Samsung Electronics Co., Ltd.
 *
 * Imagis touchscreen routines, header file
 */

#ifndef _IST40xx_DRIVER_H_
#define _IST40xx_DRIVER_H_

#include "tuiHal.h"
#include "touch_queue.h"

/* i2c setting */
/* I2C Device info */
#define IST40XX_CHIP_ID          (0x4050)

/* I2C transfer msg number */
#define WRITE_CMD_MSG_LEN        (1)
#define READ_CMD_MSG_LEN         (2)

/* I2C address/Data length */
#define IST40XX_ADDR_LEN         (4)    /* bytes */
#define IST40XX_DATA_LEN         (4)    /* bytes */
#define I2C_MAX_READ_SIZE        (256)  /* bytes */

#define IST40XX_ENABLE           (1)
#define IST40XX_DISABLE          (0)

/* vendor address */
#define IST40XX_HIB_CMD          0xB00B015C
#define IST40XX_TOUCH_INFO       0xB00B0104
#define IST40XX_COORD_SCREEN     0xB80B0108
#define IST40XX_TOUCH_STATUS     0xB00B0100
#define IST40XX_HIB_GESTURE_MSG  0xB00B011C
#define IST40XX_BURST_ACCESS     (1 << 27)
#define IST40XX_BA_ADDR(n)       (n | IST40XX_BURST_ACCESS)

/* Read command register */
#define HCOM_GET_CHIP_ID         0x80000000
#define HCOM_GET_TSP_INFO        0x88000000

/* write command list */
#define HCOM_FW_START            0x0001
#define HCOM_FW_HOLD             0x0002
#define HCOM_SET_SMODE           0x0022
#define HCOM_SET_FOD_ENABLE      0x0024
#define HCOM_SET_JIG_MODE        0x80
#define HCOM_SLEEP_MODE_EN       0x15

/* set_csecial_mode */
#define HCOM_SET_TA_MODE         0x0000
#define HCOM_SET_CALL            0x0001
#define HCOM_SET_COVER           0x0002
#define HCOM_SET_SENSE           0x0003
#define HCOM_SET_EDGE            0x0004
#define HCOM_SET_REJECT_ZONE     0x0005

/* Touch status macro */
#define TOUCH_STATUS_MAGIC       (0x00000075)
#define TOUCH_STATUS_MASK        (0x000000FF)
#define FINGER_ENABLE_MASK       (1 << 20)
#define NOISE_MODE_MASK          (1 << 19)
#define WET_MODE_MASK            (1 << 18)
#define SCAN_CNT_MASK            (0xFFE00000)
#define GET_FINGER_ENABLE(n)     (n & FINGER_ENABLE_MASK)
#define GET_NOISE_MODE(n)        (n & NOISE_MODE_MASK)
#define GET_WET_MODE(n)          (n & WET_MODE_MASK)
#define GET_SCAN_CNT(n)          ((n & SCAN_CNT_MASK) >> 21)
#define TOUCH_STATUS_NORMAL_MODE (0 << 0)
#define TOUCH_STATUS_NOISE_MODE  (1 << 0)
#define TOUCH_STATUS_WET_MODE    (1 << 1)

/* Touch type */
#define TOUCHTYPE_NORMAL         0
#define TOUCHTYPE_HOVER          1
#define TOUCHTYPE_FLIPCOVER      2
#define TOUCHTYPE_GLOVE          3
#define TOUCHTYPE_STYLUS         4
#define TOUCHTYPE_PALM           5
#define TOUCHTYPE_WET            6
#define TOUCHTYPE_PROXIMITY      7
#define TOUCHTYPE_JIG            8
#define TOUCHTYPE_RESERVED       9

////////////////////////////////////////
// Touch Status
////////////////////////////////////////
#define TOUCH_NONE               0
#define TOUCH_PRESS              1
#define TOUCH_RELEASE            2

////////////////////////////////////////
// Coordinate Struct
////////////////////////////////////////
struct stTouchCoord_t{
    uint16_t X:12;
    uint16_t Y:12;
    uint8_t Status:4;
    uint8_t Id:4;
    uint8_t Area:4;
    uint16_t Z:12;
    uint8_t Minor:8;
    uint8_t Major:8;
} __attribute__ ((packed));

typedef union {
	struct {
		uint8_t eid:2;
		uint8_t gtype:4;
		uint8_t sf:2;
		uint8_t gid;
		uint8_t gdata[4];
		uint8_t reserved0;
		uint8_t left_e:6;
		uint8_t reserved1:2;
	} b;
	uint32_t full[4];
} gesture_msg;

struct ist40xx_ts_info {
    bool check_tsp;
    unsigned int max_x;
    unsigned int max_y;
    unsigned int width;
    unsigned int height;
};

extern struct ist40xx_ts_info ist_data;

int ist_driver_init(struct ist40xx_ts_info *tsp_dev);
int ist_driver_release(void);
int ist_irq_process(void);

#endif /* _IST40xx_DRIVER_H_ */
