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
+ ];
- device/mediatek/mt6789/init.mt6789.usb.rc
- chmod 0666 /sys/devices/platform/soc/11e00000.i2c/i2c-0/0-005d/set_config
- device/mediatek/sepolicy/basic/non_plat/shell.te
- allow shell sysfs:file rw_file_perms;
- 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);
- 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 {
``