Proximity Function
Basic Info
Driver will receive info from FW to control screen brightness。
Driving Code
CONFIG_TOUCHSCREEN_FTS_PSENSOR can be found in focaltech_core.h. It is further implemented in focaltech_core.c. The following shows partial parts of its code.
static struct sensors_classdev __maybe_unused sensors_proximity_cdev = {
.name = "fts-proximity",
.vendor = "FocalTech",
.version = 1,
.handle = SENSORS_PROXIMITY_HANDLE,
.type = SENSOR_TYPE_PROXIMITY,
.max_range = "5.0",
.resolution = "5.0",
.sensor_power = "0.1",
.min_delay = 0,
.fifo_reserved_event_count = 0,
.fifo_max_event_count = 0,
.enabled = 0,
.delay_msec = 200,
.sensors_enable = NULL,
.sensors_poll_delay = NULL,
};
static void fts_psensor_enable(struct fts_ts_data *data, int enable){
unsigned char state;
int ret = -1;
if (data->client == NULL)
return;
fts_read_reg(data->client, FTS_REG_PSENSOR_ENABLE, &state);
if (enable)
state |= FTS_PSENSOR_ENABLE_MASK;
else
state &= ~FTS_PSENSOR_ENABLE_MASK;
ret = fts_write_reg(data->client,FTS_REG_PSENSOR_ENABLE, state);
if (ret < 0)
dev_err(&data->client->dev,"write psensor switch command failed\n");
return;
}
static int fts_psensor_enable_set(struct sensors_classdev *sensors_cdev,unsigned int enable){
struct fts_psensor_platform_data *psensor_pdata = container_of(sensors_cdev,struct fts_psensor_platform_data, ps_cdev);
struct fts_ts_data *data = psensor_pdata->data;
struct input_dev *input_dev = data->psensor_pdat>input_psensor_dev;
mutex_lock(&input_dev->mutex);
fts_psensor_enable(data, enable);
psensor_pdata->tp_psensor_data = FTS_PSENSOR_ORIGINAL_STATE_FAR;
if (enable){
psensor_pdata->tp_psensor_opened = 1;
}else{
psensor_pdata->tp_psensor_opened = 0
}
mutex_unlock(&input_dev->mutex);
return enable;
}
static int fts_read_tp_psensor_data(struct fts_ts_data *data){
unsigned char psensor_status;
char tmp;
int ret = 1;
fts_read_reg(data->client,FTS_REG_PSENSOR_STATUS,&psensor_status);
tmp = data->psensor_pdata->tp_psensor_data;
if (psensor_status == FTS_PSENSOR_STATUS_NEAR){
data->psensor_pdata->tp_psensor_data = FTS_PSENSOR_FAR_TO_NEAR;
}else if (psensor_status == FTS_PSENSOR_STATUS_FAR){
data->psensor_pdata->tp_psensor_data = FTS_PSENSOR_NEAR_TO_FAR;
}
if (tmp != data->psensor_pdata->tp_psensor_data) {
dev_dbg(&data->client->dev,"%s sensor data changed\n",__func__);
ret = 0;
}
return ret;
}