123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483 |
- /* raydium_driver.h
- *
- * Raydium TouchScreen driver.
- *
- * Copyright (c) 2021 Raydium tech Ltd.
- *
- * 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.
- *
- */
- #ifndef __LINUX_RAYDIUM_H
- #define __LINUX_RAYDIUM_H
- #define RAYDIUM_NAME "raydium_ts"
- #define COORDS_ARR_SIZE 4
- #define I2C_VTG_MIN_UV 1800000
- #define I2C_VTG_MAX_UV 1800000
- #ifdef VDD_ANALOG_ENABLE
- #define VTG_MIN_UV 2800000
- #define VTG_MAX_UV 2800000
- #endif
- #define RAD_MAIN_VERSION 0x01
- #define RAD_MINOR_VERSION 0x01
- #define RAD_CUSTOMER_VERSION 0x0100
- #if defined(CONFIG_TOUCHSCREEN_RM_TS)
- /* IC timing control arguments */
- #define RAYDIUM_POWERON_DELAY_USEC 500
- #define RAYDIUM_RESET_INTERVAL_MSEC 5
- #define RAYDIUM_RESET_RESTORE_USEC 200
- #define RAYDIUM_RESET_DELAY_MSEC 100
- #define RAYDIUM_RESET_INTERVAL_10MSEC 10
- /* I2C bus slave address(ID) */
- #define RAYDIUM_I2C_EID (0x5A)
- #define RAYDIUM_I2C_NID (0x39)
- #define RAYDIUM_I2C_PDA_CMD 0x66
- /* I2C R/W configuration literal */
- #define RAYDIUM_I2C_WRITE I2C_SMBUS_WRITE
- #define RAYDIUM_I2C_READ I2C_SMBUS_READ
- #define SYN_I2C_RETRY_TIMES 1
- #define MAX_WRITE_PACKET_SIZE 128
- #define MAX_READ_PACKET_SIZE 128
- /* PDA address and bit definition*/
- #define RAD_READ_FT_DATA_CMD 0x2000019C
- /* 1byte, disable:0x00 ; enable:0x20*/
- #define RAD_GESTURE_STATE_CMD 0x200005F4
- #define RAD_GESTURE_DISABLE 0x00
- #define RAD_GESTURE_ENABLE 0x20
- /* 4bytes, [0]:ready ; [1]:type ; [2]:direction*/
- #define RAD_GESTURE_RESULT_CMD 0x200005F0
- #define RAD_ENABLE_PDA2 0x04
- #define RAD_ENABLE_SI2 0x02
- /* PDA literal */
- #define MASK_8BIT 0xFF
- #define RAD_I2C_PDA_ADDRESS_LENGTH 4
- #define PDA_MODE 0x01
- #define PDA2_MODE 0x02
- #define RAD_I2C_PDA_MODE_DISABLE 0x00
- #define RAD_I2C_PDA_MODE_ENABLE 0x80
- /* Using byte mode due to data might be not word-aligment */
- #define RAD_I2C_PDA_MODE_WORD_MODE 0x40
- #define RAD_I2C_PDA_2_MODE_DISABLE 0x20
- #define I2C_PDA2_BYTE_MODE 0x03
- #define I2C_PDA2_WORD_MODE 0x43
- #define RAD_PALM_DISABLE 0x00
- #define RAD_PALM_ENABLE 0x01
- #define RAD_WAKE_UP 0x02
- #define RAYDIUM_TEST_FW 0x80
- #define RAYDIUM_TEST_PARA 0x40
- #define RAYDIUM_BOOTLOADER 0x20
- #define RAYDIUM_FIRMWARE 0x10
- #define RAYDIUM_PARA 0x08
- #define RAYDIUM_COMP 0x04
- #define RAYDIUM_BASELINE 0x02
- #define RAYDIUM_INIT 0x01
- #define FAIL 0
- #define ERROR -1
- #define SUCCESS 1
- #define DISABLE 0
- #define ENABLE 1
- /* PDA2 setting */
- /* Page 0 ~ Page A */
- #define MAX_PAGE_AMOUNT 11
- /* PDA2 address and setting definition*/
- #define RAYDIUM_PDA2_TCH_RPT_STATUS_ADDR 0x00 /* only in Page 0 */
- #define RAYDIUM_PDA2_TCH_RPT_ADDR 0x01 /* only in Page 0 */
- #define RAYDIUM_PDA2_HOST_CMD_ADDR 0x02 /* only in Page 0 */
- #define RAYDIUM_PDA2_PALM_AREA_ADDR 0x03 /* only in Page 0 */
- #define RAYDIUM_PDA2_GESTURE_RPT_ADDR 0x04 /* only in Page 0 */
- #define RAYDIUM_PDA2_PALM_STATUS_ADDR 0x05 /* only in Page 0 */
- #define RAYDIUM_PDA2_FW_VERSION_ADDR 0x06 /* only in Page 0 */
- #define RAYDIUM_PDA2_PANEL_VERSION_ADDR 0x07 /* only in Page 0 */
- #define RAYDIUM_PDA2_DISPLAY_INFO_ADDR 0x08 /* only in Page 0 */
- #define RAYDIUM_PDA2_PDA_CFG_ADDR 0x09 /* only in Page 0 */
- #define RAYDIUM_PDA2_RAWDATA_ADDR 0x0B /* only in Page 0 */
- /* Page 0 ~ Page 9 will be directed to Page 0 */
- #define RAYDIUM_PDA2_PAGE_ADDR 0x0A
- #define RAYDIUM_PDA2_PAGE_0 0x00
- /* temporary switch to PDA once */
- #define RAYDIUM_PDA2_ENABLE_PDA 0x0A
- /* permanently switch to PDA mode */
- #define RAYDIUM_PDA2_2_PDA (MAX_PAGE_AMOUNT + 2)
- /* Raydium host cmd */
- #define RAYDIUM_HOST_CMD_NO_OP 0x00
- #define RAYDIUM_HOST_CMD_PWR_SLEEP 0x30
- #define RAYDIUM_HOST_CMD_DISPLAY_MODE 0x33
- #define RAYDIUM_HOST_CMD_CALIBRATION 0x5C
- #define RAYDIUM_HOST_CMD_TP_MODE 0x60
- #define RAYDIUM_HOST_CMD_FT_MODE 0x61
- /* Raydium Register define */
- #define RAYDIUM_PDA_BOOTVERSION 0x00000080
- #define RAYDIUM_PDA_FIRMWAREADDR 0x00000800
- #define RAYDIUM_PDA_PARAADDR 0x00007B00
- #define RAYDIUM_PDA_FIRMWARELENGTH 0x00007300
- #define RAYDIUM_PDA_PARALENGTH 0x00000178
- #define RAYDIUM_PDA_CRCLENGTH 0x00007474
- #define RAYDIUM_PDA_SYNCDATA 0x20000200
- #define RAYDIUM_PDA_BOOTENG1 0x20000204
- #define RAYDIUM_PDA_BOOTENG2 0x20000208
- #define RAYDIUM_PDA_BOOTENG3 0x2000020C
- #define RAYDIUM_PDA_BOOTENG4 0x20000210
- #define RAYDIUM_PDA_BOOTSTATE 0x20000214
- #define RAYDIUM_PDA_BOOTMODE 0x20000218
- #define RAYDIUM_PDA_BLKEN 0x40000000
- #define RAYDIUM_PDA_BLKRST 0x40000004
- #define RAYDIUM_PDA_MISCIER 0x40000014
- #define RAYDIUM_PDA_I2CENG 0x50000610
- #define RAYDIUM_PDA_FLASHPRO 0x50000624
- #define RAYDIUM_PDA_I2CREG 0x50000628
- #define RAYDIUM_PDA_PRAMLOCK 0x50000900
- #define RAYDIUM_PDA_PRAMTYPE 0x50000904
- #define RAYDIUM_PDA_PRAMADDR 0x50000908
- #define RAYDIUM_PDA_PRAMLENGTH 0x5000090C
- #define RAYDIUM_PDA_FLHADDR 0x50000910
- #define RAYDIUM_PDA_FLHCTL 0x50000914
- #define RAYDIUM_PDA_BOOTREG 0x50000918
- #define RAYDIUM_PDA_FLKEY1 0x50000934
- #define RAYDIUM_PDA_FLKEY2 0x50000938
- #define RAYDIUM_PDA_FLDATA 0x5000093C
- #define RAYDIUM_PDA_PRGCHKSUMENG 0x5000094C
- #define RAYDIUM_PDA_PRGCHKSUMADDR 0x50000974
- #define RAYDIUM_PDA_PRGCHKSUMRESULT 0x50000978
- #define RAYDIUM_CHK_I2C_CMD 0x500009BC
- #define RAYDIUM_REG_GPIO_DEGLITCH 0x50000E1C
- #define I2CTB_LOCK (0x00000001<<6)
- #define BOTLR_LOCK (0x00000001<<5)
- #define USEFW_LOCK (0x00000001<<4)
- #define CONFIG_LOCK (0x00000001<<3)
- #define COMP_LOCK (0x00000001<<2)
- #define BASEL_LOCK (0x00000001<<1)
- #define INICO_LOCK (0x00000001<<0)
- /* ['h5000_0904], [32'h0000_0000], Program RAM store type, PRAM_STORE_TYPE */
- #define BOTLR_AREA (0x00000001<<5)
- #define USEFW_AREA (0x00000001<<4)
- #define CONFIG_AREA (0x00000001<<3)
- #define COMP_AREA (0x00000001<<2)
- #define BASEL_AREA (0x00000001<<1)
- #define INICO_AREA (0x00000001<<0)
- /* PDA2 literal */
- /* entry byte + target page byte */
- #define RAYDIUM_I2C_PDA2_PAGE_LENGTH 2
- /* Touch report */
- #define MAX_TOUCH_NUM 2
- #define MAX_REPORT_PACKET_SIZE 35
- #define MAX_TCH_STATUS_PACKET_SIZE 4
- #define PRESS_MAX 0xFFFF
- #define WIDTH_MAX 0xFFFF
- #define BYTE_SHIFT 8
- #define TOUCH_PRESS 0
- #define TOUCH_RELEASE 1
- #define TOUCH_MOVE 2
- #define TOUCH_COVER 3
- #define TOUCH_SHORTCLICK 4
- /* FW update literal */
- #define RAYDIUM_FW_BIN_PATH_LENGTH 256
- #define RAD_BOOT_3X_SIZE 0x800
- #define RAD_INIT_3X_SIZE 0x80
- #define RAD_FW_3X_SIZE 0x7300
- #define RAD_PARA_3X_SIZE 0x174
- #define RAD_TESTFW_3X_SIZE (RAD_FW_3X_SIZE + RAD_PARA_3X_SIZE + 4)
- #define RAD_ALLFW_3X_SIZE 0xF170
- #define RAD_CMD_UPDATE_BIN 0x80
- #define RAD_CMD_UPDATE_END 0x81
- #define RAD_CMD_BURN_FINISH 0x82
- /* FT APK literal */
- #define RAD_HOST_CMD_POS 0x00
- #define RAD_FT_CMD_POS 0x01
- #define RAD_FT_CMD_LENGTH 0x02
- /* FT APK data type */
- #define RAYDIUM_FT_UPDATE 0x00
- /*Raydium system flag*/
- #define INT_FLAG 0x01
- #define ENG_MODE 0x02
- #define NORMAL_MODE 0x00
- /* define display mode */
- #define ACTIVE_MODE 0x00
- #define AMBIENT_MODE 0x01
- #define SLEEP_MODE 0x02
- /* Enable sysfs */
- #define CONFIG_RM_SYSFS_DEBUG
- /* Gesture switch */
- #define GESTURE_EN
- /* Enable FW update */
- #define FW_UPDATE_EN
- /* #define FW_MAPPING_EN */
- #define MSM_NEW_VER
- /* enable ESD */
- /* #define ESD_SOLUTION_EN */
- #define RAD_SELFTEST
- #define PARA_FW_VERSION_OFFSET 4
- #define ENABLE_FW_LOADER 1
- #define FW_NAME "RM6D030_v0.1.bin"
- #define PINCTRL_STATE_ACTIVE "pmx_ts_active"
- #define PINCTRL_STATE_SUSPEND "pmx_ts_suspend"
- #define PINCTRL_STATE_RELEASE "pmx_ts_release"
- /* Power Management Macros Enablement */
- #ifndef CONFIG_PM
- #define CONFIG_PM
- #endif
- #ifndef CONFIG_DRM
- #define CONFIG_DRM
- #endif
- #if IS_ENABLED(CONFIG_QCOM_PANEL_EVENT_NOTIFIER)
- #define CONFIG_PANEL_NOTIFIER
- #endif
- #include <linux/device.h>
- #include <linux/fb.h>
- #include <linux/notifier.h>
- #ifdef CONFIG_HAS_EARLYSUSPEND
- #include <linux/earlysuspend.h>
- #elif defined(CONFIG_DRM) || defined(CONFIG_PANEL_NOTIFIER)
- #include <drm/drm_panel.h>
- #endif
- extern uint32_t slate_ack_resp;
- enum raydium_fb_state {
- FB_ON,
- FB_OFF,
- };
- struct raydium_ts_data {
- unsigned int irq;
- unsigned int irq_gpio;
- unsigned int rst_gpio;
- unsigned int x_max;
- unsigned int y_max;
- unsigned int x_pos[2];
- unsigned int y_pos[2];
- unsigned int pressure;
- unsigned int is_suspend;
- unsigned int is_sleep;
- #ifdef GESTURE_EN
- unsigned int is_palm;
- #endif
- unsigned char u8_max_touchs;
- struct i2c_client *client;
- struct input_dev *input_dev;
- struct mutex lock;
- struct work_struct work;
- struct workqueue_struct *workqueue;
- struct irq_desc *irq_desc;
- bool irq_enabled;
- bool irq_wake;
- #if defined(CONFIG_PANEL_NOTIFIER)
- struct panel_event_notifier_entry *entry;
- int blank;
- enum raydium_fb_state fb_state;
- #elif defined(CONFIG_FB) || defined(CONFIG_DRM) || defined(CONFIG_PANEL_NOTIFIER)
- struct notifier_block fb_notif;
- int blank;
- enum raydium_fb_state fb_state;
- #elif defined(CONFIG_HAS_EARLYSUSPEND)
- struct early_suspend early_suspend;
- #endif /*end of CONFIG_FB*/
- /*struct regulator *vdd;*/
- #ifdef VDD_ANALOG_ENABLE
- struct regulator *vdd;
- #endif
- struct regulator *vcc_i2c;
- unsigned int fw_version;
- unsigned short id;
- char *vcc_name;
- #ifdef MSM_NEW_VER
- struct pinctrl *ts_pinctrl;
- struct pinctrl_state *pinctrl_state_active;
- struct pinctrl_state *pinctrl_state_suspend;
- struct pinctrl_state *pinctrl_state_release;
- #endif /*end of MSM_NEW_VER*/
- bool touch_offload;
- };
- struct raydium_platform_data {
- char *vdd_name;
- int irq_gpio_number;
- int reset_gpio_number;
- int x_max;
- int y_max;
- };
- struct raydium_ts_platform_data {
- char *name;
- u32 irqflags;
- u32 irq_gpio;
- u32 irq_gpio_flags;
- u32 reset_gpio;
- u32 reset_gpio_flags;
- u32 x_max;
- u32 y_max;
- u32 x_min;
- u32 y_min;
- u32 hard_rst_dly;
- u32 soft_rst_dly;
- u32 num_max_touches;
- u32 fw_id;
- struct drm_panel *active_panel;
- };
- /* TODO: Using struct+memcpy instead of array+offset*/
- enum raydium_pt_report_status {
- POS_SEQ = 0,/*1:touch, 0:no touch*/
- POS_PT_AMOUNT,
- POS_GES_STATUS,
- POS_FW_STATE,
- };
- enum raydium_pt_report_idx {
- POS_PT_ID = 0,
- POS_X_L,
- POS_X_H,
- POS_Y_L,
- POS_Y_H,
- POS_PRESSURE_L,
- POS_PRESSURE_H,
- POS_WX_L,
- POS_WX_H,
- POS_WY_L,
- POS_WY_H,
- LEN_PT = 11
- };
- enum raydium_log_level {
- LOG_NONE = 0,
- LOG_ALERT,
- LOG_ERR,
- LOG_WARNING,
- LOG_INFO,
- LOG_DEBUG = 5
- };
- extern int raydium_read_touchdata(unsigned char *tp_status, unsigned char *buf);
- extern int raydium_mem_table_setting(void);
- extern int wait_fw_state(struct i2c_client *client, unsigned int u32_addr,
- unsigned int u32_state, unsigned long u32_delay_us,
- unsigned short u16_retry);
- extern int wait_irq_state(struct i2c_client *client,
- unsigned int u32_retry_time,
- unsigned int u32_delay_us);
- extern void raydium_irq_control(bool enable);
- extern int raydium_i2c_mode_control(struct i2c_client *client,
- unsigned char u8_mode);
- extern int raydium_i2c_pda_read(struct i2c_client *client,
- unsigned int u32_addr, unsigned char *u8_r_data,
- unsigned short u16_length);
- extern int raydium_i2c_pda_write(struct i2c_client *client,
- unsigned int u32_addr, unsigned char *u8_w_data,
- unsigned short u16_length);
- extern int handle_i2c_pda_write(struct i2c_client *client,
- unsigned int u32_addr, unsigned char *u8_w_data,
- unsigned short u16_length);
- extern int handle_i2c_pda_read(struct i2c_client *client,
- unsigned int u32_addr, unsigned char *u8_r_data,
- unsigned short u16_length);
- extern int raydium_i2c_pda2_read(struct i2c_client *client,
- unsigned char u8_addr,
- unsigned char *u8_r_data,
- unsigned short u16_length);
- extern int raydium_i2c_pda2_write(struct i2c_client *client,
- unsigned char u8_addr,
- unsigned char *u8_w_data,
- unsigned short u16_length);
- extern int raydium_i2c_pda2_set_page(struct i2c_client *client,
- unsigned int is_suspend,
- unsigned char u8_page);
- extern int raydium_i2c_write_pda_via_pda2(struct i2c_client *client,
- unsigned int u32_addr, unsigned char *u8_w_data,
- unsigned short u16_length);
- extern int raydium_i2c_read_pda_via_pda2(struct i2c_client *client,
- unsigned int u32_addr, unsigned char *u8_r_data,
- unsigned short u16_length);
- extern unsigned char raydium_disable_i2c_deglitch(void);
- extern unsigned char raydium_selftest_stop_mcu(struct i2c_client *client);
- extern int raydium_burn_comp(struct i2c_client *client);
- extern int raydium_burn_fw(struct i2c_client *client);
- extern int raydium_load_test_fw(struct i2c_client *client);
- extern int raydium_fw_update_init(unsigned short u16_i2c_data);
- extern int raydium_fw_update_check(unsigned int u32_check_version);
- extern int raydium_i2c_pda_set_address(unsigned int u32_address,
- unsigned char u8_mode);
- extern void raydium_mem_table_init(unsigned short u16_id);
- extern int raydium_id_init(unsigned char u8_type);
- #ifdef RAD_SELFTEST
- extern int raydium_do_selftest(struct raydium_ts_data *ts);
- #endif
- int raydium_esd_check(void);
- extern struct attribute *raydium_attributes[];
- extern const struct attribute_group raydium_attr_group;
- extern unsigned char g_u8_raydium_flag;
- extern unsigned char g_u8_addr;
- extern unsigned char g_u8_i2c_mode;
- extern unsigned char g_u8_upgrade_type;
- extern unsigned char g_u8_raw_data_type;
- extern unsigned int g_u32_raw_data_len; /* 128 bytes*/
- extern unsigned int g_u32_length;
- extern unsigned long g_u32_addr;
- extern unsigned char *g_rad_fw_image, *g_rad_init_image;
- extern unsigned char *g_rad_boot_image, *g_rad_para_image;
- extern unsigned char *g_rad_testfw_image, *g_rad_testpara_image;
- extern unsigned char g_u8_table_setting, g_u8_table_init;
- extern unsigned int g_u32_driver_version;
- extern unsigned char g_u8_resetflag;
- extern struct raydium_ts_data *g_raydium_ts;
- extern unsigned char g_u8_log_level;
- #define LOGD(a, fmt, ...) {\
- if (a <= g_u8_log_level) {\
- pr_info(pr_fmt(fmt), ##__VA_ARGS__);\
- } \
- }
- #endif
- #endif /*__LINUX_RAYDIUM_H*/
|