Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d3f9f2be authored by Fei Mao's avatar Fei Mao
Browse files

input: touchscreen: hxchipset: enable firmware auto-update



Enable the firmware auto-update, so we can upgrade it to
the latest one from vendor.

Change-Id: Iecc6288665e423f7279427fc8d545a0d830b697e
Signed-off-by: default avatarFei Mao <feim1@codeaurora.org>
parent 3424e1d3
Loading
Loading
Loading
Loading
+42 −65
Original line number Diff line number Diff line
@@ -47,29 +47,23 @@ struct himax_target_report_data *g_target_report_data;

static int HX_TOUCH_INFO_POINT_CNT;

unsigned long FW_VER_MAJ_FLASH_ADDR;
unsigned long FW_VER_MIN_FLASH_ADDR;
unsigned long CFG_VER_MAJ_FLASH_ADDR;
unsigned long CFG_VER_MIN_FLASH_ADDR;
unsigned long CID_VER_MAJ_FLASH_ADDR;
unsigned long CID_VER_MIN_FLASH_ADDR;

unsigned long FW_VER_MAJ_FLASH_LENG;
unsigned long FW_VER_MIN_FLASH_LENG;
unsigned long CFG_VER_MAJ_FLASH_LENG;
unsigned long CFG_VER_MIN_FLASH_LENG;
unsigned long CID_VER_MAJ_FLASH_LENG;
unsigned long CID_VER_MIN_FLASH_LENG;
/* Himax: Set FW and CFG Flash Address */
#define FW_VER_MAJ_FLASH_ADDR  0x00C005
#define FW_VER_MIN_FLASH_ADDR  0x00C006
#define CFG_VER_MAJ_FLASH_ADDR 0x00C100
#define CFG_VER_MIN_FLASH_ADDR 0x00C101
#define CID_VER_MAJ_FLASH_ADDR 0x00C002
#define CID_VER_MIN_FLASH_ADDR 0x00C003

#define FW_VER_MAJ_FLASH_LENG  1
#define FW_VER_MIN_FLASH_LENG  1
#define CFG_VER_MAJ_FLASH_LENG 1
#define CFG_VER_MIN_FLASH_LENG 1
#define CID_VER_MAJ_FLASH_LENG 1
#define CID_VER_MIN_FLASH_LENG 1

unsigned long FW_CFG_VER_FLASH_ADDR;

#ifdef HX_AUTO_UPDATE_FW
	int g_i_FW_VER = 0;
	int g_i_CFG_VER = 0;
	int g_i_CID_MAJ = 0; /* GUEST ID */
	int g_i_CID_MIN = 0; /* VER for GUEST */
#endif

unsigned char IC_CHECKSUM;

#ifdef HX_ESD_RECOVERY
@@ -513,25 +507,32 @@ static int i_update_FW(void)
	int upgrade_times = 0;
	unsigned char *ImageBuffer = NULL;
	int fullFileLength = 0;
	uint8_t ret = 0, result = 0;
	int ret = 0, result = 0;
	uint32_t i_FW_VER = 0, i_CFG_VER = 0;

	himax_int_enable(0);

	I("file name = %s\n", i_CTPM_firmware_name);
	ret = request_firmware(&i_CTPM_FW, i_CTPM_firmware_name, private_ts->dev);
	if (ret < 0) {
		E("%s,fail in line%d error code=%d\n", __func__, __LINE__, ret);
	D("file name = %s\n", i_CTPM_firmware_name);
	if (request_firmware(&i_CTPM_FW, i_CTPM_firmware_name,
		private_ts->dev)) {
		I("%s: no firmware file\n", __func__);
		return OPEN_FILE_FAIL;
	}

	if (i_CTPM_FW != NULL) {
	fullFileLength = i_CTPM_FW->size;
	ImageBuffer = (unsigned char *)i_CTPM_FW->data;
	} else {
		I("%s: i_CTPM_FW = NULL\n", __func__);
		return OPEN_FILE_FAIL;

	i_FW_VER = (ImageBuffer[FW_VER_MAJ_FLASH_ADDR] << 8)
			| ImageBuffer[FW_VER_MIN_FLASH_ADDR];
	i_CFG_VER = (ImageBuffer[CFG_VER_MAJ_FLASH_ADDR] << 8)
			| ImageBuffer[CFG_VER_MIN_FLASH_ADDR];

	if ((ic_data->vendor_fw_ver >= i_FW_VER)
		&& (ic_data->vendor_config_ver >= i_CFG_VER)) {
		D("FW_VER 0x%x, CFG_VER 0x%x\n", i_FW_VER, i_CFG_VER);
		release_firmware(i_CTPM_FW);
		return 0;
	}

	himax_int_enable(0);
update_retry:

	if (fullFileLength == FW_SIZE_32k)
@@ -559,7 +560,7 @@ static int i_update_FW(void)
		g_core_fp.fp_read_FW_ver();
		g_core_fp.fp_touch_information();
		result = 1;/* upgrade success */
		I("%s: TP upgrade OK\n", __func__);
		D("%s: TP upgrade OK\n", __func__);
	}

#ifdef HX_RST_PIN_FUNC
@@ -1888,15 +1889,14 @@ static const struct t_cable_status_notifier himax_cable_status_handler = {
#endif

#ifdef HX_AUTO_UPDATE_FW
static void himax_update_register(struct work_struct *work)
void himax_update_register(struct work_struct *work)
{
	I(" %s in", __func__);
	D(" %s in", __func__);

	if (i_update_FW() <= 0)
		I("FW =NOT UPDATE=\n");
		D("FW =NOT UPDATE=\n");
	else
		I("Have new FW =UPDATE=\n");

		D("Have new FW =UPDATE=\n");
}
#endif

@@ -2009,29 +2009,11 @@ int himax_chip_common_init(void)
	if (pdata->virtual_key)
		ts->button = pdata->virtual_key;

#ifdef HX_AUTO_UPDATE_FW
	auto_update_flag = (!g_core_fp.fp_calculateChecksum(false));
	auto_update_flag |= g_core_fp.fp_flash_lastdata_check();
	if (auto_update_flag)
		goto FW_force_upgrade;
#endif
	g_core_fp.fp_read_FW_ver();

#ifdef HX_AUTO_UPDATE_FW
FW_force_upgrade:
	auto_update_flag |= ((ic_data->vendor_fw_ver < g_i_FW_VER) || (ic_data->vendor_config_ver < g_i_CFG_VER));
	/* Not sure to do */
	/* auto_update_flag |= ((ic_data->vendor_cid_maj_ver != g_i_CID_MAJ) || (ic_data->vendor_cid_min_ver < g_i_CID_MIN)); */
	if (auto_update_flag) {
		ts->himax_update_wq = create_singlethread_workqueue("HMX_update_request");
		if (!ts->himax_update_wq) {
			E(" allocate syn_update_wq failed\n");
			err = -ENOMEM;
			goto err_update_wq_failed;
		}
		INIT_DELAYED_WORK(&ts->work_update, himax_update_register);
		queue_delayed_work(ts->himax_update_wq, &ts->work_update, msecs_to_jiffies(2000));
	}
	queue_delayed_work(ts->himax_update_wq, &ts->work_update,
		msecs_to_jiffies(2000));
#endif
#ifdef HX_ZERO_FLASH
	auto_update_flag = true;
@@ -2136,12 +2118,7 @@ int himax_chip_common_init(void)
		E(" %s: debug initial failed!\n", __func__);
#endif

#if defined(HX_AUTO_UPDATE_FW) || defined(HX_ZERO_FLASH)

	if (auto_update_flag)
		himax_int_enable(0);

#endif
	return 0;
err_register_interrupt_failed:
remove_proc_entry(HIMAX_PROC_TOUCH_FOLDER, NULL);
@@ -2162,7 +2139,7 @@ remove_proc_entry(HIMAX_PROC_TOUCH_FOLDER, NULL);
		cancel_delayed_work_sync(&ts->work_update);
		destroy_workqueue(ts->himax_update_wq);
	}
err_update_wq_failed:

#endif

error_ic_detect_failed:
+3 −9
Original line number Diff line number Diff line
@@ -66,7 +66,7 @@
#define HX_RST_PIN_FUNC
#define HX_RESUME_SEND_CMD
#define HX_ESD_RECOVERY
/*#define HX_AUTO_UPDATE_FW*/
#define HX_AUTO_UPDATE_FW
/*#define HX_SMART_WAKEUP*/
/*#define HX_GESTURE_TRACK*/
/*#define HX_HIGH_SENSE*/
@@ -439,14 +439,6 @@ extern struct himax_core_fp g_core_fp;
extern struct himax_debug *debug_data;
extern uint8_t HX_PROC_SEND_FLAG;

#ifdef HX_AUTO_UPDATE_FW
extern int g_i_FW_VER;
extern int g_i_CFG_VER;
extern int g_i_CID_MAJ; /* GUEST ID */
extern int g_i_CID_MIN; /* VER for GUEST */
extern unsigned char i_CTPM_FW[];
#endif

extern unsigned long FW_VER_MAJ_FLASH_ADDR;
extern unsigned long FW_VER_MIN_FLASH_ADDR;
extern unsigned long CFG_VER_MAJ_FLASH_ADDR;
@@ -496,5 +488,7 @@ extern struct himax_target_report_data *g_target_report_data;
extern int himax_report_data(struct himax_ts_data *ts, int ts_path, int ts_status);
/* ts_work about end */

void himax_update_register(struct work_struct *work);

#endif
+0 −20
Original line number Diff line number Diff line
@@ -188,26 +188,6 @@ static void hx83112_chip_init(void)
	private_ts->chip_cell_type = CHIP_IS_IN_CELL;
	D("%s:IC cell type = %d\n",  __func__,  private_ts->chip_cell_type);
	IC_CHECKSUM = HX_TP_BIN_CHECKSUM_CRC;
	/* Himax: Set FW and CFG Flash Address */
	FW_VER_MAJ_FLASH_ADDR  = 49157;  /* 0x00C005 */
	FW_VER_MAJ_FLASH_LENG  = 1;
	FW_VER_MIN_FLASH_ADDR  = 49158;  /* 0x00C006 */
	FW_VER_MIN_FLASH_LENG  = 1;
	CFG_VER_MAJ_FLASH_ADDR = 49408;  /* 0x00C100 */
	CFG_VER_MAJ_FLASH_LENG = 1;
	CFG_VER_MIN_FLASH_ADDR = 49409;  /* 0x00C101 */
	CFG_VER_MIN_FLASH_LENG = 1;
	CID_VER_MAJ_FLASH_ADDR = 49154;  /* 0x00C002 */
	CID_VER_MAJ_FLASH_LENG = 1;
	CID_VER_MIN_FLASH_ADDR = 49155;  /* 0x00C003 */
	CID_VER_MIN_FLASH_LENG = 1;

#ifdef HX_AUTO_UPDATE_FW
	g_i_FW_VER = (i_CTPM_FW[FW_VER_MAJ_FLASH_ADDR] << 8) | i_CTPM_FW[FW_VER_MIN_FLASH_ADDR];
	g_i_CFG_VER = (i_CTPM_FW[CFG_VER_MAJ_FLASH_ADDR] << 8) | i_CTPM_FW[CFG_VER_MIN_FLASH_ADDR];
	g_i_CID_MAJ = i_CTPM_FW[CID_VER_MAJ_FLASH_ADDR];
	g_i_CID_MIN = i_CTPM_FW[CID_VER_MIN_FLASH_ADDR];
#endif
}

#ifdef CONFIG_CHIP_DTCFG
+9 −0
Original line number Diff line number Diff line
@@ -822,6 +822,15 @@ int himax_chip_common_probe(struct i2c_client *client, const struct i2c_device_i
		goto err_fb_notify_reg_failed;
#endif

#ifdef HX_AUTO_UPDATE_FW
	ts->himax_update_wq =
		create_singlethread_workqueue("HMX_update_request");
	if (!ts->himax_update_wq) {
		E(" allocate syn_update_wq failed\n");
		goto err_fb_notify_reg_failed;
	}
	INIT_DELAYED_WORK(&ts->work_update, himax_update_register);
#endif
	return ret;

err_fb_notify_reg_failed: