mtk做tp参数兼容下发(安卓12-安卓14)

mtk同一款tp用两种参数下发,系统上用setting控制

系统先写好UI控件做下发

1.vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values/strings.xml
+	 
+	 <string name="stylus_toughened_mode">Toughened film Mode</string>
+     <string name="stylus_common_mode">Normal Model</string>
+	 <string name="touchpa

2.vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values/arrays.xml

+	<string-array name="touchpanel_mode_array">
+	   <item>@string/stylus_toughened_mode</item>
+	   <item>@string/stylus_common_mode</item>
+   </string-array>
+
+   <string-array name="touchpanel_mode_value">
+	   <item>0</item>
+	   <item>1</item>
+   </string-array>

3.vendor/mediatek/proprietary/packages/apps/MtkSettings/res/xml/system_dashboard_fragment.xml
+	<ListPreference
+        android:key="touchpanel_mode"
+        android:title="@string/touchpanel_mode_title"
+		android:order="-249"
+		android:dialogTitle="@string/touchpanel_mode_title"
+		android:entries="@array/touchpanel_mode_array"
+		android:entryValues="@array/touchpanel_mode_value"
+		settings:controller="com.android.settings.touchpanel.TouchPanelModePreferenceController"/>

4.vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/touchpanel/TouchPanelModePreferenceController.java

@@ -0,0 +1,116 @@
+package com.android.settings.touchpanel;
+
+import com.android.settings.core.BasePreferenceController;
+
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+import android.provider.Settings;
+
+import com.android.settings.R;
+
+import android.content.Context;
+import android.util.Log;
+import android.widget.Toast;
+
+import java.io.BufferedWriter;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.BufferedReader;
+import java.io.FileReader;
+
+
+public class TouchPanelModePreferenceController extends BasePreferenceController
+		implements ListPreference.OnPreferenceChangeListener {
+
+	private static final String KEY_TOUCHPANEL_MODE = "touchpanel_mode";
+	private String TP_CONFIG_PATH = "/data/vendor/tp_config_group_id";
+	private Context mContext;
+	protected ListPreference mPreference;
+
+	public TouchPanelModePreferenceController(Context context) {
+		super(context, KEY_TOUCHPANEL_MODE);
+		mContext = context;
+	}
+
+	@Override
+	public int getAvailabilityStatus() {
+		return AVAILABLE;
+	}
+
+	
+	@Override
+	public void displayPreference(PreferenceScreen screen) {
+		super.displayPreference(screen);
+		mPreference = screen.findPreference(getPreferenceKey());
+		String value = read(TP_CONFIG_PATH);
+		mPreference.setValue(value);
+		final int settingsMode = Integer.parseInt((String) value);
+		Log.i("jmh+++", "displayPreference settingsMode = " + settingsMode);	
+		if(0 == settingsMode) {
+			mPreference.setSummary(R.string.stylus_toughened_mode);
+		}else if (1 == settingsMode) {
+			mPreference.setSummary(R.string.stylus_common_mode);
+		}
+	}
+
+	@Override 
+	public boolean onPreferenceChange(Preference preference, Object object) {
+		if (!(preference instanceof ListPreference)) {
+		    return false;
+		}
+
+		final int settingsMode = Integer.parseInt((String) object);
+		Log.i("jmh+++", "settingsMode = " + settingsMode);	
+
+		if(0 == settingsMode) {
+			preference.setSummary(R.string.stylus_toughened_mode);
+			write(TP_CONFIG_PATH, "0");
+		}
+		else if (1 == settingsMode) {
+			preference.setSummary(R.string.stylus_common_mode);
+			write(TP_CONFIG_PATH, "1");
+		}
+
+		Toast.makeText(mContext, "TouchPanel Mode switch successfully,please restart the device.", Toast.LENGTH_SHORT).show();
+
+		return true;
+	}
+
+	private void write(String path, String string) {
+		try {
+			BufferedWriter bw = null;
+			bw = new BufferedWriter(new FileWriter(path));
+			bw.write(string);
+			bw.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+	private String read(String path) {
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(path));
+			String temp=br.readLine();
+			Log.i("jmh+++", "read settingsMode = " + temp);	
+			if ((temp!=null && temp.equals("")) || temp==null){
+				return "0";
+			}
+            return temp;
+        } catch (IOException e) {
+            e.printStackTrace();
+        }finally {
+            if (br!=null){
+                try {
+                    br.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return "0";
+    }
+
+}

驱动层需要配合系统

dts需要添加两套参数

1. kernel-5.10/arch/arm64/boot/dts/mediatek/k6789v1_64.dts
+		goodix,cfg-group1 = [
+			82 B0 04 80 07 0A 45 00 01 08 28 05 50 32 03 05 00 00 00 00 00 
+		];
+		goodix,cfg-group0 = [
+			82 B0 04 80 07 0A 45 00 01 08 28 05 50 32 03 05 00 00 00 00 00
+		];
  1. device/mediatek/mt6789/init.mt6789.usb.rc
  • chmod 0666 /sys/devices/platform/soc/11e00000.i2c/i2c-0/0-005d/set_config
  1. device/mediatek/sepolicy/basic/non_plat/shell.te
  • allow shell sysfs:file rw_file_perms;
  1. kernel-5.10/drivers/input/touchscreen/GT9XX/gt9xx_core.c
+#include <linux/uaccess.h>
+#include <linux/file.h>
 
 /*****************************************************************************
 * add hw info start
@@ -902,7 +905,7 @@ static int gtp_find_valid_cfg_data(struct goodix_ts_data *ts)
 			       &cfg->length, sensor_id);
 	if (ret < 0) {
 		dev_err(&ts->client->dev,
-			"Failed to parse config data form device tree\n");
+			"gt9xx Failed to parse config data form device tree\n");
 		cfg->length = 0;
 		return -EPERM;
 	}
@@ -927,9 +930,9 @@ static int gtp_find_valid_cfg_data(struct goodix_ts_data *ts)
 		return -EPERM;
 	}
 
-	dev_info(&ts->client->dev, "Config group%d used,length: %d\n",
+	pr_err("gt9xx Config group%d used,length: %d\n",
 		 sensor_id, cfg->length);
-
+	pr_info("gt9xx ensor_id=%d,[] gt9xx",sensor_id);
 	return 0;
 }
 
@@ -1297,21 +1300,100 @@ static ssize_t gtp_drv_irq_show(struct device *dev,
 }
 static DEVICE_ATTR(drv_irq, 0664, gtp_drv_irq_show, gtp_drv_irq_store);
 
-static ssize_t gtp_reset_store(struct device *dev,
-		struct device_attribute *attr, const char *buf, size_t count)
+int gtp_set_cfg(struct device *dev, u8 *cfg, int *cfg_len, u8 sid)
 {
-	struct goodix_ts_data *data = dev_get_drvdata(dev);
+	struct device_node *np = dev->of_node;
+	struct property *prop;
+	char cfg_name[18];
+	int ret;
 
-	if ('1' != buf[0]) {
-		dev_err(dev, "Invalid argument for reset\n");
-		return -EINVAL;
+	snprintf(cfg_name, sizeof(cfg_name), "goodix,cfg-group%d", sid);
+	prop = of_find_property(np, cfg_name, cfg_len);
+	if (!prop || !prop->value || *cfg_len == 0 ||
+	    *cfg_len > GTP_CONFIG_MAX_LENGTH) {
+		*cfg_len = 0;
+		dev_err(dev, "gt9xx gtp_set_cfg error!!! ");
+		ret = -EPERM;/* failed */
+	} else {
+		memcpy(cfg, prop->value, *cfg_len);
+		ret = 0;
+		dev_err(dev, "gt9xx gtp_set_cfg OK!!! ");
 	}
 
-	gtp_reset_guitar(data->client, 20);
+	return ret;
+}
+static int gtp_set_cfg_data(struct goodix_ts_data *ts,int sensor_id)
+{
+	int ret = -1;
+	struct goodix_config_data *cfg = &ts->pdata->config;
+
+	/* if defined CONFIG_OF, parse config data from dtsi
+	 * else parse config data form header file.
+	 */
+	cfg->length = 0;
+
+	/* parse config data */
+#ifdef CONFIG_OF
+	dev_dbg(&ts->client->dev, "Get config data from device tree\n");
+	ret = gtp_set_cfg(&ts->client->dev,
+			       &cfg->data[GTP_ADDR_LENGTH],
+			       &cfg->length, sensor_id);
+	if (ret < 0) {
+		dev_err(&ts->client->dev,
+			"gt9xx Failed to parse config data form device tree\n");
+		cfg->length = 0;
+		return -EPERM;
+	}
+#endif
+
+	if (cfg->length < GTP_CONFIG_MIN_LENGTH) {
+		dev_err(&ts->client->dev,
+			"Failed get valid config data with sensor id %d\n",
+			sensor_id);
+		cfg->length = 0;
+		return -EPERM;
+	}
+
+	pr_info("gt9xx gtp_set_cfg_data=%d",sensor_id);
+	return 0;
+}
+static int gtp_power_off(struct goodix_ts_data *ts);
+static int gtp_power_on(struct goodix_ts_data *ts);
+static ssize_t gtp_set_config_store(struct device *dev,
+		struct device_attribute *attr, const char *buf, size_t count)
+{
+	struct goodix_ts_data *ts = dev_get_drvdata(dev);
+
+	switch(buf[0]){
+	case '0':
+		pr_info("gt9xx gtp_set_config_store <0> ");
+		gtp_set_cfg_data(ts,0);
+		gtp_power_off(ts);
+		msleep(GTP_20_DLY_MS);
+		gtp_power_on(ts);
+		msleep(GTP_20_DLY_MS);
+		gtp_reset_guitar(ts->client, 50);
+		msleep(GTP_50_DLY_MS);
+		gtp_send_cfg(ts->client);
+		break;
+	case '1':
+		pr_info("gt9xx gtp_set_config_store <1> ");
+		gtp_set_cfg_data(ts,1);
+		gtp_power_off(ts);
+		msleep(GTP_20_DLY_MS);
+		gtp_power_on(ts);
+		msleep(GTP_20_DLY_MS);
+		gtp_reset_guitar(ts->client, 50);
+		msleep(GTP_50_DLY_MS);
+		gtp_send_cfg(ts->client);
+		break;
+	default:
+		break;
+	}
 
 	return count;
 }
-static DEVICE_ATTR(reset, 0220, NULL, gtp_reset_store);
+static DEVICE_ATTR(set_config, 0664, NULL, gtp_set_config_store);
 
 static struct attribute *gtp_attrs[] = {
 	&dev_attr_workmode.attr,
@@ -1322,7 +1404,7 @@ static struct attribute *gtp_attrs[] = {
 #endif
 
 	&dev_attr_drv_irq.attr,
-	&dev_attr_reset.attr,
+	&dev_attr_set_config.attr,
 	NULL
 };
 
@@ -1801,15 +1883,18 @@ int gtp_parse_dt_cfg(struct device *dev, u8 *cfg, int *cfg_len, u8 sid)
 	char cfg_name[18];
 	int ret;
 	sid = 0;
+
 	snprintf(cfg_name, sizeof(cfg_name), "goodix,cfg-group%d", sid);
 	prop = of_find_property(np, cfg_name, cfg_len);
 	if (!prop || !prop->value || *cfg_len == 0 ||
 	    *cfg_len > GTP_CONFIG_MAX_LENGTH) {
 		*cfg_len = 0;
+		dev_err(dev, "gt9xx gtp_parse_dt_cfg error!!! ");
 		ret = -EPERM;/* failed */
 	} else {
 		memcpy(cfg, prop->value, *cfg_len);
 		ret = 0;
+		dev_err(dev, "gt9xx gtp_parse_dt_cfg OK!!! ");
 	}
 
 	return ret;
@@ -1985,7 +2070,7 @@ static int gtp_probe(struct i2c_client *client, const struct i2c_device_id *id)
 	/* do NOT remove these logs */
 	dev_info(&client->dev, "GTP Driver Version: %s\n", GTP_DRIVER_VERSION);
 	dev_info(&client->dev, "GTP I2C Address: 0x%02x\n", client->addr);
-
+	pr_err("gt9xx gtp_probe\n");
 	i2c_connect_client = client;
 	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
 		dev_err(&client->dev, "Failed check I2C functionality");
@@ -2134,7 +2219,7 @@ static int gtp_probe(struct i2c_client *client, const struct i2c_device_id *id)
 	/* probe init finished */
 	ts->init_done = true;
 	gtp_work_control_enable(ts, true);
-
+	pr_err("gt9xx gtp_probe end\n");
 	hw_module_info_add(&hw_info);
 	return 0;
 
@@ -2623,9 +2708,9 @@ static void __exit gtp_exit(void)
 	i2c_del_driver(&goodix_ts_driver);
 }
 
-module_init(gtp_init);
+late_initcall_sync(gtp_init);
 module_exit(gtp_exit);
 
 MODULE_DESCRIPTION("GT9 serials touch controller Driver");
 MODULE_LICENSE("GPL v2");
-
+MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver);
  1. device/mediatek/sepolicy/base/private/system_server.te
@@ -246,3 +246,6 @@ get_prop(system_server, system_mtk_debug_mdlogger_prop)
 
 # emdoor
 allow system_server proc_battery_cmd:file { w_file_perms getattr };
+
+allow system_server vendor_data_file:file {rw_file_perms create};
+allow system_server vendor_data_file:dir rw_dir_perms;

6.frameworks/base/services/core/java/com/android/server/BatteryService.java


+	private String TP_CONFIG_PATH = "/data/vendor/tp_config_group_id";
+	private String TP_CONFIG_PATH_NEW = "/sys/devices/platform/soc/11e00000.i2c/i2c-0/0-005d/set_config";
+
+	private void write(String path, String string) {
+		try {
+			BufferedWriter bw = null;
+			bw = new BufferedWriter(new FileWriter(path));
+			bw.write(string);
+			bw.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+	
+	private void write_new(String path, String string) {
+		try {
+			BufferedWriter bw = null;
+			bw = new BufferedWriter(new FileWriter(path));
+			bw.write(string);
+			bw.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+	private String read(String path) {
+        BufferedReader br = null;
+        try {
+            br = new BufferedReader(new FileReader(path));
+			String temp=br.readLine();
+			Log.i("jmh+++", "read settingsMode = " + temp);	
+			if ((temp!=null && temp.equals("")) || temp==null){
+				return "0";
+			}
+            return temp;
+        } catch (IOException e) {
+            e.printStackTrace();
+        }finally {
+            if (br!=null){
+                try {
+                    br.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return "0";

7.vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/touchpanel/TouchPanelModePreferenceController.java

@@ -26,6 +26,7 @@ public class TouchPanelModePreferenceController extends BasePreferenceController
 
 	private static final String KEY_TOUCHPANEL_MODE = "touchpanel_mode";
 	private String TP_CONFIG_PATH = "/data/vendor/tp_config_group_id";
+	private String TP_CONFIG_PATH_NEW = "/sys/devices/platform/soc/11e00000.i2c/i2c-0/0-005d/set_config";
 	private Context mContext;
 	protected ListPreference mPreference;
 
@@ -67,13 +68,15 @@ public class TouchPanelModePreferenceController extends BasePreferenceController
 		if(0 == settingsMode) {
 			preference.setSummary(R.string.stylus_toughened_mode);
 			write(TP_CONFIG_PATH, "0");
+			write_new(TP_CONFIG_PATH_NEW, "0");
 		}
 		else if (1 == settingsMode) {
 			preference.setSummary(R.string.stylus_common_mode);
 			write(TP_CONFIG_PATH, "1");
+			write_new(TP_CONFIG_PATH_NEW, "1");
 		}
 
-		Toast.makeText(mContext, "TouchPanel Mode switch successfully,please restart the device.", Toast.LENGTH_SHORT).show();
+		//Toast.makeText(mContext, "TouchPanel Mode switch successfully,please restart the device.", Toast.LENGTH_SHORT).show();
 
 		return true;
 	}
@@ -89,6 +92,18 @@ public class TouchPanelModePreferenceController extends BasePreferenceController
 		}
 	}
 
+	
+	private void write_new(String path, String string) {
+		try {
+			BufferedWriter bw = null;
+			bw = new BufferedWriter(new FileWriter(path));
+			bw.write(string);
+			bw.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
 	private String read(String path) {
         BufferedReader br = null;
         try {
   ``
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值