예제 #1
0
static ssize_t epen_firmware_update_store(struct device *dev,
		struct device_attribute *attr, const char *buf, size_t count)
{
	struct wacom_i2c *wac_i2c = dev_get_drvdata(dev);
	u8 *data;
	u8 buf_if;
	int ret;

	buf_if = COM_QUERY;
	data = wac_i2c->wac_feature->data;

	printk(KERN_DEBUG "[E-PEN]:%s:\n", __func__);

	disable_irq(wac_i2c->irq);

	wac_i2c->wac_feature->firm_update_status = 1;

	if (*buf == 'F') {
		printk(KERN_ERR "[E-PEN]: Start firmware flashing (UMS).\n");
		ret = wacom_i2c_load_fw(wac_i2c->client);
		if (ret < 0) {
			printk(KERN_ERR "[E-PEN]: failed to flash firmware.\n");
			goto failure;
		}
	} else if (*buf == 'B') {
		printk(KERN_ERR "[E-PEN]: Start firmware flashing (kernel image).\n");
		ret = wacom_i2c_flash(wac_i2c);
		if (ret < 0) {
			printk(KERN_ERR "[E-PEN]: failed to flash firmware.\n");
			goto failure;
		}
	} else {
		printk(KERN_ERR "[E-PEN]: wrong parameter.\n");
		goto param_err;
	}
	printk(KERN_ERR "[E-PEN]: Finish firmware flashing.\n");

	msleep(800);

	wacom_i2c_query(wac_i2c);

	wac_i2c->wac_feature->firm_update_status = 2;

	enable_irq(wac_i2c->irq);


	return count;

param_err:

failure:
	wac_i2c->wac_feature->firm_update_status = -1;
	enable_irq(wac_i2c->irq);
	return -1;

}
static void wacom_i2c_update_work(struct work_struct *work)
{
	struct wacom_i2c *wac_i2c =
		container_of(work, struct wacom_i2c, update_work);
	u32 fw_ver_ic = wac_i2c->wac_feature->fw_version;
	int ret;
	int retry = 3;

	mutex_lock(&wac_i2c->update_lock);
	wacom_enable_irq(wac_i2c, false);

	printk(KERN_DEBUG"epen:%s\n", __func__);

	if (!wac_i2c->update_info.forced) {
#if defined(CONFIG_SAMSUNG_PRODUCT_SHIP)
		if (fw_ver_ic == fw_ver_file) {
#else
		if (fw_ver_ic >= fw_ver_file) {
#endif
			printk(KERN_DEBUG"epen:pass fw update, ic ver %#x, img ver %#x\n",
					fw_ver_ic, fw_ver_file);
			goto err_update_load_fw;
		}
	}

	wac_i2c->wac_feature->firm_update_status = 1;

	ret = wacom_i2c_load_fw(wac_i2c);
	if (ret < 0) {
		printk(KERN_DEBUG"epen:failed to load fw(%d)\n", ret);
		goto err_update_load_fw;
	}

	while (retry--) {
		ret = wacom_i2c_flash(wac_i2c);
		if (ret) {
			printk(KERN_DEBUG"epen:failed to flash fw(%d)\n", ret);
			continue;
		}
		break;
	}
	if (ret)
		goto err_update_fw;	

	ret = wacom_i2c_query(wac_i2c);
	if (ret < 0) {
		printk(KERN_DEBUG"epen:failed to query to IC(%d)\n", ret);
		goto err_update_fw;
	}

 err_update_fw:
	wacom_i2c_unload_fw(wac_i2c);
 err_update_load_fw:
	wac_i2c->wac_feature->firm_update_status = 2;
	wacom_enable_irq(wac_i2c, true);
	mutex_unlock(&wac_i2c->update_lock);
}

static ssize_t epen_reset_store(struct device *dev,
				struct device_attribute *attr, const char *buf,
				size_t count)
{
	struct wacom_i2c *wac_i2c = dev_get_drvdata(dev);
	int val;

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

	if (val == 1) {
		wacom_enable_irq(wac_i2c, false);

		/* Reset IC */
		wacom_i2c_reset_hw(wac_i2c->wac_pdata);
		/* I2C Test */
		wacom_i2c_query(wac_i2c);

		wacom_enable_irq(wac_i2c, true);

		printk(KERN_DEBUG "epen:%s, result %d\n", __func__,
		       wac_i2c->query_status);
	}

	return count;
}

static ssize_t epen_reset_result_show(struct device *dev,
				      struct device_attribute *attr, char *buf)
{
	struct wacom_i2c *wac_i2c = dev_get_drvdata(dev);

	if (wac_i2c->query_status) {
		printk(KERN_DEBUG "epen:%s, PASS\n", __func__);
		return sprintf(buf, "PASS\n");
	} else {
		printk(KERN_DEBUG "epen:%s, FAIL\n", __func__);
		return sprintf(buf, "FAIL\n");
	}
}

#ifdef WACOM_USE_AVE_TRANSITION
static ssize_t epen_ave_store(struct device *dev,
struct device_attribute *attr,
	const char *buf, size_t count)
{
	int v1, v2, v3, v4, v5;
	int height;

	sscanf(buf, "%d%d%d%d%d%d", &height, &v1, &v2, &v3, &v4, &v5);

	if (height < 0 || height > 2) {
		printk(KERN_DEBUG"epen:Height err %d\n", height);
		return count;
	}

	g_aveLevel_C[height] = v1;
	g_aveLevel_X[height] = v2;
	g_aveLevel_Y[height] = v3;
	g_aveLevel_Trs[height] = v4;
	g_aveLevel_Cor[height] = v5;

	printk(KERN_DEBUG "epen:%s, v1 %d v2 %d v3 %d v4 %d\n", __func__,
		v1, v2, v3, v4);

	return count;
}
예제 #3
0
static ssize_t epen_firmware_update_store(struct device *dev,
					  struct device_attribute *attr,
					  const char *buf, size_t count)
{
	struct wacom_i2c *wac_i2c = dev_get_drvdata(dev);
	int ret = 1;

	disable_irq(wac_i2c->irq);
#ifdef WACOM_PDCT_WORK_AROUND
	disable_irq(wac_i2c->irq_pdct);
#endif

	wac_i2c->wac_feature->firm_update_status = 1;

	printk(KERN_DEBUG "[E-PEN] %s\n", __func__);

	/* F and B are used by Factory app, and R is used when boot */
	switch (*buf) {
#ifdef WACOM_UMS_UPDATE
		/* Block UMS update for MR */
	case 'F':
		printk(KERN_ERR "[E-PEN] Start firmware flashing (UMS).\n");
		ret = wacom_i2c_load_fw(wac_i2c->client);
		break;
#endif
	case 'B':
		printk(KERN_ERR
		       "[E-PEN] Start firmware flashing (kernel image).\n");
#ifdef CONFIG_MACH_Q1_BD
		ret = wacom_i2c_firm_update(wac_i2c);
#else
		ret = wacom_i2c_flash(wac_i2c);
#endif
		break;

#ifdef CONFIG_MACH_Q1_BD
	case 'R':
		/* Q1 board rev 0.3 */
		if (system_rev >= 6) {
			if (wac_i2c->wac_feature->fw_version <
			    Firmware_version_of_file)
				ret = wacom_i2c_firm_update(wac_i2c);
		} else {
			if (wac_i2c->wac_feature->fw_version !=
			    Firmware_version_of_file)
				ret = wacom_i2c_firm_update(wac_i2c);
		}
		if (ret > 0) {
			enable_irq(wac_i2c->irq);
#ifdef WACOM_PDCT_WORK_AROUND
			enable_irq(wac_i2c->irq_pdct);
#endif
			return count;
		}
		break;
#endif

#if defined(CONFIG_MACH_P4NOTE)
	case 'W':
		if (Firmware_version_of_file !=
			wac_i2c->wac_feature->fw_version)
			schedule_work(&wac_i2c->update_work);
		break;
#endif

	default:
		printk(KERN_ERR "[E-PEN] wrong parameter.\n");
		goto param_err;
		break;
	}

	if (ret < 0) {
		printk(KERN_ERR "[E-PEN] failed to flash firmware.\n");
		goto failure;
	}

	printk(KERN_ERR "[E-PEN] Finish firmware flashing.\n");

	msleep(800);
	wacom_i2c_query(wac_i2c);
	wac_i2c->wac_feature->firm_update_status = 2;

	enable_irq(wac_i2c->irq);
#ifdef WACOM_PDCT_WORK_AROUND
	enable_irq(wac_i2c->irq_pdct);
#endif

	return count;

 param_err:

 failure:
	wac_i2c->wac_feature->firm_update_status = -1;
	enable_irq(wac_i2c->irq);
#ifdef WACOM_PDCT_WORK_AROUND
	enable_irq(wac_i2c->irq_pdct);
#endif
	return -1;
}
static ssize_t epen_firmware_update_store(struct device *dev,
		struct device_attribute *attr, const char *buf, size_t count)
{
	struct wacom_i2c *wac_i2c = dev_get_drvdata(dev);
	u8 *data;
	u8 buf_if;
	int ret;

	disable_irq(wac_i2c->irq);
#ifdef WACOM_PDCT_WORK_AROUND
	disable_irq(wac_i2c->irq_pdct);
#endif

	buf_if = COM_QUERY;
	data = wac_i2c->wac_feature->data;
	wac_i2c->wac_feature->firm_update_status = 1;

	if (*buf == 'F') {
		printk(KERN_ERR "[E-PEN]: Start firmware flashing (UMS).\n");
		ret = wacom_i2c_load_fw(wac_i2c->client);
		if (ret < 0) {
			printk(KERN_ERR "[E-PEN]: failed to flash firmware.\n");
			goto failure;
		}
	} else if (*buf == 'B') {
		printk(KERN_ERR "[E-PEN]: Start firmware flashing (kernel image).\n");
#if 0 //#if defined(CONFIG_KOR_MODEL_SHV_E160S) || defined(CONFIG_KOR_MODEL_SHV_E160K) || defined(CONFIG_KOR_MODEL_SHV_E160L)        
       	Binary = Binary_44;
#endif
		ret = wacom_i2c_flash(wac_i2c);
		if (ret < 0) {
			printk(KERN_ERR "[E-PEN]: failed to flash firmware.\n");
			goto failure;
		}
	} else {
		printk(KERN_ERR "[E-PEN]: wrong parameter.\n");
		goto param_err;
	}
	printk(KERN_ERR "[E-PEN]: Finish firmware flashing.\n");

	msleep(800);

	wacom_i2c_query(wac_i2c);

	wac_i2c->wac_feature->firm_update_status = 2;

	enable_irq(wac_i2c->irq);
#ifdef WACOM_PDCT_WORK_AROUND
	enable_irq(wac_i2c->irq_pdct);
#endif

	return count;

param_err:

failure:
	wac_i2c->wac_feature->firm_update_status = -1;
	enable_irq(wac_i2c->irq);
#ifdef WACOM_PDCT_WORK_AROUND
	enable_irq(wac_i2c->irq_pdct);
#endif
	return -1;

}