int ist30xx_set_cmcs_cmd(struct i2c_client *client, CMCS_INFO *cmcs)
{
	int ret;
	u32 val;

	val = (u32)(cmcs->cmd.base_screen | (cmcs->cmd.mode << 16));
	ret = ist30xx_write_cmd(client, cmcs->addr.base_screen, val);
	if (ret) return ret;
	tsp_verb("Baseline screen(0x%08x): 0x%08x\n", cmcs->addr.base_screen, val);

	val = (u32)cmcs->cmd.base_key;
	ret = ist30xx_write_cmd(client, cmcs->addr.base_key, val);
	if (ret) return ret;
	tsp_verb("Baseline key(0x%08x): 0x%08x\n", cmcs->addr.base_key, val);

	val = cmcs->cmd.start_cp_cm | (cmcs->cmd.start_cp_cs << 16);
	ret = ist30xx_write_cmd(client, cmcs->addr.start_cp, val);
	if (ret) return ret;
	tsp_verb("StartCP(0x%08x): 0x%08x\n", cmcs->addr.start_cp, val);

	val = cmcs->cmd.vcmp_cm | (cmcs->cmd.vcmp_cs << 16);
	ret = ist30xx_write_cmd(client, cmcs->addr.vcmp, val);
	if (ret) return ret;
	tsp_verb("VCMP(0x%08x): 0x%08x\n", cmcs->addr.vcmp, val);

	return 0;
}
Exemple #2
0
int ist30xx_cmd_run_device(struct i2c_client *client)
{
	int ret = -EIO;
	u32 val = 0x00C80001;
	ist30xx_reset();
	ret = ist30xx_write_cmd(client, CMD_RUN_DEVICE, 0);
       msleep(10);  
	ret = ist30xx_write_cmd(client, CMD_ZVALUE_MODE, val);
	msleep(10);

	return ret;
}
int ist30xx_set_cmcs_sensor(struct i2c_client *client, CMCS_INFO *cmcs,
			    u32 *buf32)
{
	int i, ret;
	int len;
	u32 waddr;
	u32 *tmp32;

	tsp_verb("%08x %08x %08x %08x\n", buf32[0], buf32[1], buf32[2], buf32[3]);

	waddr = cmcs->addr.sensor1;
	len = cmcs->sensor1_size / IST30XX_DATA_LEN;

	for (i = 0; i < len; i++) {
		ret = ist30xx_write_cmd(client, waddr, *buf32++);
		if (ret)
			return ret;

		waddr += IST30XX_DATA_LEN;
	}

	tmp32 = buf32;
	tsp_verb("%08x %08x %08x %08x\n", tmp32[0], tmp32[1], tmp32[2], tmp32[3]);

	waddr = cmcs->addr.sensor2;
	len = (cmcs->sensor2_size - 0x10) / IST30XX_DATA_LEN;

	for (i = 0; i < len; i++) {
		ret = ist30xx_write_cmd(client, waddr, *buf32++);
		if (ret)
			return ret;

		waddr += IST30XX_DATA_LEN;
	}
	buf32 += (0x10 / IST30XX_DATA_LEN);

	tmp32 = buf32;
	tsp_verb("%08x %08x %08x %08x\n", tmp32[0], tmp32[1], tmp32[2], tmp32[3]);

	waddr = cmcs->addr.sensor3;
	len = cmcs->sensor3_size / IST30XX_DATA_LEN;

	for (i = 0; i < len; i++) {
		ret = ist30xx_write_cmd(client, waddr, *buf32++);
		if (ret)
			return ret;

		waddr += IST30XX_DATA_LEN;
	}

	return 0;
}
Exemple #4
0
int ist30xx_cmd_start_scan(struct i2c_client *client)
{
	int ret;
	u32 val = 0x00C80001;	
	
	ret = ist30xx_write_cmd(client, CMD_ZVALUE_MODE, 0x00C80001);
	if (ret) 
		return ret;

	get_zvalue_mode = true;

	ret = ist30xx_write_cmd(client, CMD_START_SCAN, 0);
	msleep(100);

	return ret;
}
ssize_t factory_tkey_zvalue_store(struct device *dev,
				  struct device_attribute *attr, const char *buf, size_t size)
{
	int ret;
	int cmd = 0;
	u32 val = 0;

	sscanf(buf, "%d", &cmd);

	DMSG("[TSP] tkey zvalue cmd(%d)\n", cmd);

	val = (cmd > 0 ? 0x00C80001 : 0);

	if (cmd) {
		ist30xx_disable_irq(ts_data);
		ist30xx_cmd_run_device(ts_data->client);
		ist30xx_enable_irq(ts_data);
	}

	ret = ist30xx_write_cmd(ts_data->client, CMD_ZVALUE_MODE, val);
	if (ret) {
		pr_err("[ TSP ] fail, zvalue mode enter(%d)\n", ret);
		return size;
	}

	get_zvalue_mode = (cmd > 0 ? true : false);

	DMSG("[TSP] tkey zvalue val: %x, cmd: %d\n", val, cmd);

	return size;
}
Exemple #6
0
int ist30xx_cmd_update(struct i2c_client *client, int cmd)
{
	int ret = ist30xx_write_cmd(client, cmd, 0);

	msleep(10);

	return ret;
}
Exemple #7
0
int ist30xx_cmd_calibrate(struct i2c_client *client)
{
	int ret = ist30xx_write_cmd(client, CMD_CALIBRATE, 0);

	msleep(100);

	return ret;
}
Exemple #8
0
int ist30xx_cmd_reg(struct i2c_client *client, int cmd)
{
	int ret = ist30xx_write_cmd(client, cmd, 0);

	if (cmd == CMD_ENTER_REG_ACCESS)
		msleep(50);

	return ret;
}
int ist30xx_cmd_update(struct i2c_client *client, int cmd)
{
	u32 val = (cmd == CMD_ENTER_FW_UPDATE ? CMD_FW_UPDATE_MAGIC : 0);
	int ret = ist30xx_write_cmd(client, cmd, val);

	msleep(10);

	return ret;
}
int ist30xx_cmd_calibrate(struct i2c_client *client)
{
	int ret = ist30xx_write_cmd(client, CMD_CALIBRATE, 0);

	DMSG("[ TSP ] %s\n", __func__);

	msleep(100);

	return ret;
}
int ist30xx_cmd_check_calib(struct i2c_client *client)
{
	int ret = ist30xx_write_cmd(client, CMD_CHECK_CALIB, 0);

	DMSG("[ TSP ] %s\n", __func__);

	msleep(20);

	return ret;
}
int ist30xx_cmd_run_device(struct i2c_client *client)
{
	int ret = -EIO;

	ist30xx_reset();
	ret = ist30xx_write_cmd(client, CMD_RUN_DEVICE, 0);
	if (ret) return ret;
       msleep(10);  
	ret = ist30xx_write_cmd(client, CMD_ZVALUE_MODE, 0x00C80001);	// remove after 15mode test

	get_zvalue_mode = true;

#if IST30XX_NOISE_MODE
	get_event_mode = true;
#endif
	msleep(10);			// remove after 15mode test

	return ret;
}
Exemple #13
0
int ist30xx_cmd_run_device(struct i2c_client *client)
{
	int ret = -EIO;

	ist30xx_reset();
	ret = ist30xx_write_cmd(client, CMD_RUN_DEVICE, 0);
	msleep(10);

	return ret;
}
int ist30xx_cmd_check_calib(struct i2c_client *client)
{
    int ret = ist30xx_write_cmd(client, CMD_CHECK_CALIB, 0);

    DMSG("[ TSP ] *** Check Calibration cmd ***\n");

    msleep(20);

    return ret;
}
int ist30xx_get_info(struct ist30xx_data *data)
{
	int ret;
	u32 calib_msg;
	int retry = 0;

	ist30xx_tsp_info.finger_num = IST30XX_MAX_MT_FINGERS;
	mutex_lock(&ist30xx_mutex);
	ist30xx_disable_irq(data);

RETRY :
	ret = ist30xx_write_cmd(data->client, CMD_RUN_DEVICE, 0);

	msleep(50);

	ret = ist30xx_get_ver_info(data);
	if(ret != 0) {
		if(retry++ < 10) {
			tsp_debug("ist30xx_get_info retry : %d \n", retry);
			ist30xx_ts_reset();
			goto RETRY;
		}
	}

	ret = ist30xx_tsp_update_info();
	ret = ist30xx_tkey_update_info();

	ist30xx_print_info();

	ret = ist30xx_read_cmd(ts_data->client, CMD_GET_CALIB_RESULT, &calib_msg);
	if (ret == 0) {
		tsp_info("calib status: 0x%08x\n", calib_msg);
		if ((calib_msg & CALIB_MSG_MASK) != CALIB_MSG_VALID ||
		    CALIB_TO_STATUS(calib_msg) > 0) {
			ist30xx_calibrate(IST30XX_FW_UPDATE_RETRY);

			ist30xx_cmd_run_device(data->client);
		}
	}

	ist30xx_start(ts_data);

#if IST30XX_EVENT_MODE
	ktime_get_ts(&t_event);
#endif

	data->status.calib = 0;

	ist30xx_enable_irq(data);

	mutex_unlock(&ist30xx_mutex);

	return ret;
}
int ist30xx_cmd_start_scan(struct i2c_client *client)
{
	int ret;
	
	ret = ist30xx_write_cmd(client, CMD_ZVALUE_MODE, 0x00C80001);	// remove after 15mode test
	if (ret) return ret;	// remove after 15mode

	msleep(10);	// remove after 15mode test

	get_zvalue_mode = true;

#if IST30XX_NOISE_MODE
	get_event_mode = true;
#endif
	ret = ist30xx_write_cmd(client, CMD_START_SCAN, 0);

	msleep(200);

	return ret;
}
int ist30xx_cmd_check_calib(struct i2c_client *client)
{
	int ret = ist30xx_write_cmd(client, CMD_CHECK_CALIB, 0);

	ist30xx_tracking(TRACK_CMD_CHECK_CALIB);

	tsp_info("*** Check Calibration cmd ***\n");

	msleep(20);

	return ret;
}
int ist30xx_cmd_start_scan(struct i2c_client *client)
{
    int ret;

#if IST30XX_USE_ZVALUE
    ret = ist30xx_write_cmd(client, CMD_ZVALUE_MODE, 0x00C80001);
    if (ret) return ret;

    msleep(10);

    get_zvalue_mode = true;
#endif
#if IST30XX_NOISE_MODE
    get_event_mode = true;
#endif
    ret = ist30xx_write_cmd(client, CMD_START_SCAN, 0);

    msleep(100);

    return ret;
}
int ist30xx_cmd_calibrate(struct i2c_client *client)
{
	int ret = ist30xx_write_cmd(client, CMD_CALIBRATE, 0);

	ist30xx_tracking(TRACK_CMD_CALIB);

	tsp_info("%s\n", __func__);

	msleep(100);

	return ret;
}
int ist30xx_cmd_run_device(struct i2c_client *client, bool is_reset)
{
	int ret = -EIO;

	if (is_reset == true) ist30xx_reset();
	ret = ist30xx_write_cmd(client, CMD_RUN_DEVICE, 0);

	ist30xx_tracking(TRACK_CMD_RUN_DEVICE);

	msleep(10);

	return ret;
}
int ist30xx_cmd_gesture(struct i2c_client *client, int gesture)
{
	int ret = -EIO;

	if (gesture > 3)
		return ret;

	ret = ist30xx_write_cmd(client, CMD_SET_GESTURE_MODE, gesture);

	msleep(10);

	return ret;
}
Exemple #22
0
int ist30xx_cmd_start_scan(struct i2c_client *client)
{
	int ret;

	ret = ist30xx_write_cmd(client, CMD_START_SCAN, 0);

	msleep(100);

#if IST30XX_NOISE_MODE
	ts_data->status.noise_mode = true;
#endif

	return ret;
}
int ist30xx_cmd_start_scan(struct i2c_client *client)
{
	int ret;

	ret = ist30xx_write_cmd(client, CMD_START_SCAN, 0);

	ist30xx_tracking(TRACK_CMD_SCAN);

	msleep(100);

	ts_data->status.noise_mode = true;

	return ret;
}
int ist30xx_cmd_reg(struct i2c_client *client, int cmd)
{
	int ret = ist30xx_write_cmd(client, cmd, 0);

	if (cmd == CMD_ENTER_REG_ACCESS) {
		ist30xx_tracking(TRACK_CMD_ENTER_REG);
		msleep(100);
	} else if (cmd == CMD_EXIT_REG_ACCESS) {
		ist30xx_tracking(TRACK_CMD_EXIT_REG);
		msleep(10);
	}

	return ret;
}
void ist30xx_start(struct ist30xx_data *data)
{
#if IST30XX_DETECT_TA
	if (ist30xx_ta_status > -1) {
		ist30xx_write_cmd(data->client, CMD_SET_TA_MODE, ist30xx_ta_status);

		tsp_info("%s(), ta_mode : %d\n", __func__, ist30xx_ta_status);
	}
#endif

	ist30xx_cmd_start_scan(data->client);

#if IST30XX_EVENT_MODE
	if ((data->status.update != 1) && (data->status.calib != 1))
		ktime_get_ts(&t_event);
#endif
}
int ist30xx_cmd_reg(struct i2c_client *client, int cmd)
{
	int ret = ist30xx_write_cmd(client, cmd, 0);

	if (cmd == CMD_ENTER_REG_ACCESS) {
#if IST30XX_NOISE_MODE
		get_event_mode = false;
#endif
		msleep(50);
	}
#if IST30XX_NOISE_MODE
	else if (cmd == CMD_EXIT_REG_ACCESS) {
		get_event_mode = true;
	}
#endif

	return ret;
}
int ist30xx_get_info(struct ist30xx_data *data)
{
	int ret;
	u32 calib_msg;

	ist30xx_tsp_info.finger_num = IST30XX_MAX_MT_FINGERS;
	mutex_lock(&ist30xx_mutex);
	ist30xx_disable_irq(data);

#if !(IST30XX_INTERNAL_BIN)
	ret = ist30xx_write_cmd(data->client, CMD_RUN_DEVICE, 0);
	if (ret)
		goto get_info_end;
	msleep(10);
	ret = ist30xx_get_ver_info(data);
	if (ret) goto get_info_end;
#endif  // !(IST30XX_INTERNAL_BIN)

#if IST30XX_DEBUG
# if IST30XX_INTERNAL_BIN
	ist30xx_get_tsp_info();
	ist30xx_get_tkey_info();
# else
	ret = ist30xx_tsp_update_info();
	if (ret) goto get_info_end;

	ret = ist30xx_tkey_update_info();
	if (ret) goto get_info_end;
# endif

	ist30xx_print_info();
#endif  // IST30XX_DEBUG

	ret = ist30xx_read_cmd(ts_data->client, CMD_GET_CALIB_RESULT, &calib_msg);
	if (ret == 0) {
		tsp_info("calib status: 0x%08x\n", calib_msg);
		if ((calib_msg & CALIB_MSG_MASK) != CALIB_MSG_VALID ||
		    CALIB_TO_STATUS(calib_msg) > 0) {
			ist30xx_calibrate(IST30XX_FW_UPDATE_RETRY);

			ist30xx_cmd_run_device(data->client);
		}
	}

	ist30xx_start(ts_data);

#if IST30XX_EVENT_MODE
	ktime_get_ts(&t_event);
#endif

	data->status.calib = 0;

#if !(IST30XX_INTERNAL_BIN)
get_info_end:
#endif
	if (ret == 0)
		ist30xx_enable_irq(data);
	else
		printk("[ TSP ] ist30xx_get_info return value : %d\n", ret);
	mutex_unlock(&ist30xx_mutex);

	return ret;
}
int ist30xx_cmcs_test(const u8 *buf, int size)
{
	int ret;
	int len;
	u32 chksum = 0;
	u32 *buf32;
	struct i2c_client *client = (struct i2c_client *)ts_data->client;
	CMCS_INFO *cmcs = (CMCS_INFO *)&ts_cmcs->cmcs;

	tsp_info("*** CM/CS test ***\n");
	tsp_info(" mode: 0x%x, baseline(screen: %d, key: %d)\n",
		 cmcs->cmd.mode, cmcs->cmd.base_screen, cmcs->cmd.base_key);
	tsp_info(" start_cp (cm: %d, cs: %d), vcmp (cm: %d, cs: %d)\n",
		 cmcs->cmd.start_cp_cm, cmcs->cmd.start_cp_cs,
		 cmcs->cmd.vcmp_cm, cmcs->cmd.vcmp_cs);

	ist30xx_disable_irq(ts_data);

	ist30xx_reset(false);

	ret = ist30xx_cmd_reg(client, CMD_ENTER_REG_ACCESS);
	cmcs_next_step(ret);

	/* Set sensor register */
	buf32 = ts_cmcs->buf_sensor;
	ret = ist30xx_set_cmcs_sensor(client, cmcs, buf32);
	cmcs_next_step(ret);

	/* Set command */
	ret = ist30xx_set_cmcs_cmd(client, cmcs);
	cmcs_next_step(ret);

	ret = ist30xx_cmd_reg(client, CMD_EXIT_REG_ACCESS);
	cmcs_next_step(ret);

	/* Load cmcs test code */
	ret = ist30xx_write_cmd(client, CMD_EXEC_MEM_CODE, 0);
	cmcs_next_step(ret);

	buf32 = (u32 *)ts_cmcs->buf_cmcs;
	len = cmcs->cmd.cmcs_size / IST30XX_DATA_LEN;
	tsp_verb("%08x %08x %08x %08x\n", buf32[0], buf32[1], buf32[2], buf32[3]);
	ret = ist30xx_write_buf(client, len, buf32, len);
	cmcs_next_step(ret);

	/* Check checksum */
	ret = ist30xx_read_cmd(client, CMD_DEFAULT, &chksum);
	cmcs_next_step(ret);
	if (chksum != IST30XX_CMCS_LOAD_END)
		goto end;
	tsp_info("CM/CS code ready!!\n");

	/* Check checksum */
	ret = ist30xx_read_cmd(client, CMD_DEFAULT, &chksum);
	cmcs_next_step(ret);
	tsp_info("CM/CS code chksum: %08x, %08x\n", chksum, cmcs->cmcs_chksum);

	ist30xx_enable_irq(ts_data);
	/* Wait CMCS test result */
	if (ist30xx_calib_wait() == 1)
		tsp_info("CM/CS test OK.\n");
	else
		tsp_info("CM/CS test fail.\n");
	ist30xx_disable_irq(ts_data);

	/* Read CM/CS data*/
	if (ENABLE_CM_MODE(cmcs->cmd.mode)) {
		/* Read CM data */
		memset(ts_cmcs_buf->cm, 0, sizeof(ts_cmcs_buf->cm));

		ret = ist30xx_get_cmcs_buf(client, cmcs, ts_cmcs_buf->cm);
		cmcs_next_step(ret);

		ret = ist30xx_apply_cmcs_slope(cmcs, ts_cmcs_buf);
	}

	if (ENABLE_CS_MODE(cmcs->cmd.mode)) {
		/* Read CS0 data */
		memset(ts_cmcs_buf->cs0, 0, sizeof(ts_cmcs_buf->cs0));
		memset(ts_cmcs_buf->cs1, 0, sizeof(ts_cmcs_buf->cs1));

		ret = ist30xx_get_cmcs_buf(client, cmcs, ts_cmcs_buf->cs0);
		cmcs_next_step(ret);

		/* Read CS1 data */
		ret = ist30xx_get_cmcs_buf(client, cmcs, ts_cmcs_buf->cs1);
		cmcs_next_step(ret);
	}

	ist30xx_reset(false);

	ist30xx_start(ts_data);

	cmcs_ready = CMCS_READY;

end:
	if (unlikely(ret)) {
		tsp_warn("CM/CS test Fail!, ret=%d\n", ret);
	} else if (unlikely(chksum != cmcs->cmcs_chksum)) {
		tsp_warn("Error CheckSum: %x(%x)\n", chksum, cmcs->cmcs_chksum);
		ret = -ENOEXEC;
	}

	ist30xx_enable_irq(ts_data);

	return ret;
}