时间:2014-5-6
关键字:Freescale , Android JB , max11801 , 电阻屏 , 校准
当下,在Android4.2.2 上基本全部用的都是电容式的触摸屏了,所以Google和其他定制厂商也陆续在自己的Android版本中去掉了电阻屏校准这部分代码,飞思卡尔的Android 4.2.2也不例外,但在其Android 4.0.4上都还有ts_calibrator的电阻屏校准程序,我们下面的要介绍的方法就是把这个 ts_calibrator 移植到Android 4.2.2 上。
ts_calibrator.zip
max11801_ts.idc
<文件夹下还有相关改动文件的源文件,如果平台相同,可以偷懒哟>
1、 将 ts_calibrator.zip 解包至 “${androidroot}/system/core/” 下。
2、 修改 “${androidroot}/system/core/init/init.c” , 参考如下
diff --git a/system/core/init/init.c b/system/core/init/init.c
index 8a4fc52..483391c 100755
--- a/system/core/init/init.c
+++ b/system/core/init/init.c
@@ -77,6 +77,7 @@ static char bootmode[32];
static char hardware[32];
static unsigned revision = 0;
static char qemu[32];
+static char calibration;
#ifdef HAVE_SELINUX
static int selinux_enabled = 1;
@@ -623,8 +624,12 @@ static void import_kernel_nv(char *name, int for_emulator)
{
char *value = strchr(name, '=');
int name_len = strlen(name);
-
- if (value == 0) return;
+ /* zeng */
+ if (value == 0) {
+ if (!strcmp(name, "calibration"))
+ calibration = 1;
+ return;
+ }
*value++ = 0;
if (name_len == 0) return;
@@ -703,6 +708,11 @@ static void export_kernel_boot_props(void)
property_set("ro.factorytest", "2");
else
property_set("ro.factorytest", "0");
+ /* zeng */
+ if (calibration)
+ property_set("ro.calibration", "1");
+ else
+ property_set("ro.calibration", "0");
}
static void process_kernel_cmdline(void)
3、修改 “${androidroot}/kernel_imx/” 下的文件, 参考如下
diff --git a/kernel_imx/arch/arm/mach-mx6/board-mx6q_sabresd.c b/kernel_imx/arch/arm/mach-mx6/board-mx6q_sabresd.c
index f0d64a8..1946187 100644
--- a/kernel_imx/arch/arm/mach-mx6/board-mx6q_sabresd.c
+++ b/kernel_imx/arch/arm/mach-mx6/board-mx6q_sabresd.c
@@ -201,7 +201,7 @@ static struct clk *sata_clk;
static struct clk *clko;
static int mma8451_position = 3;
static int mag3110_position = 1;
-static int max11801_mode = 1;
+static int max11801_mode = 0;
static int caam_enabled;
extern char *gp_reg_id;
diff --git a/kernel_imx/drivers/input/touchscreen/max11801_ts.c b/kernel_imx/drivers/input/touchscreen/max11801_ts.c
index a1ac2d2..df27d15 100755
--- a/kernel_imx/drivers/input/touchscreen/max11801_ts.c
+++ b/kernel_imx/drivers/input/touchscreen/max11801_ts.c
@@ -108,6 +108,18 @@ struct i2c_client *max11801_client;
unsigned int max11801_workmode;
u8 aux_buf[AUX_BUFSIZE];
+/**
+ * calibration array refers to
+ * (delta_x[0], delta_x[1], delta_x[2], delta_y[0], delta_y[1], delta_y[2], delta).
+ * Which generated by calibration service.
+ * In this driver when we got touch pointer (x', y') from PMIC ADC,
+ * we calculate the display pointer (x,y) by:
+ * x = (delta_x[0] * x' + delta_x[1] * y' + delta_x[2]) / delta;
+ * y = (delta_y[0] * x' + delta_y[1] * y' + delta_y[2]) / delta;
+ */
+static int calibration[7];
+module_param_array(calibration, int, NULL, S_IRUGO | S_IWUSR);
+
static int max11801_dcm_write_command(struct i2c_client *client, int command)
{
return i2c_smbus_write_byte(client, command);
@@ -169,9 +181,28 @@ static int max11801_write_reg(struct i2c_client *client, int addr, int data)
static void calibration_pointer(int *x_orig, int *y_orig)
{
- int y;
+ int x, y;
y = MAX11801_MAX_Y - *y_orig;
*y_orig = y;
+
+ if (calibration[6] != 0) {
+ x = calibration[0] * *x_orig +
+ calibration[1] * *y_orig +
+ calibration[2];
+ x /= calibration[6];
+ if (x < 0)
+ x = 0;
+ y = calibration[3] * *x_orig +
+ calibration[4] * *y_orig +
+ calibration[5];
+ y /= calibration[6];
+ if (y < 0)
+ y = 0;
+ *x_orig = x;
+ *y_orig = y;
+ }
+
+ /* printk("x: %d , y: %d\n", *x_orig, *y_orig); */
}
static irqreturn_t max11801_ts_interrupt(int irq, void *dev_id)
4、拷贝 max11801_ts.idc 到 “${androidroot}/device/fsl/common/input/” , 修改 “${androidroot}/device/fsl/” 下文件,参考如下
diff --git a/device/fsl/imx6/etc/init.rc b/device/fsl/imx6/etc/init.rc
index 41e7995..ac56ad4 100755
--- a/device/fsl/imx6/etc/init.rc
+++ b/device/fsl/imx6/etc/init.rc
@@ -398,6 +398,8 @@ on boot
setprop dalvik.vm.jniopts warnonly
class_start core
+ class_start tscal
+on property:service.calibrate.exit=1
class_start main
on property:sys.boot_completed=1
@@ -544,6 +546,12 @@ service bootanim /system/bin/bootanimation
disabled
oneshot
+service calibrate /system/bin/logwrapper /sbin/ts_calibrator
+ class tscal
+ user root
+ group root
+ oneshot
+
service dbus /system/bin/dbus-daemon --system --nofork
class main
socket dbus stream 660 bluetooth bluetooth
diff --git a/device/fsl/imx6/imx6.mk b/device/fsl/imx6/imx6.mk
index ac0ce25..c5438fb 100644
--- a/device/fsl/imx6/imx6.mk
+++ b/device/fsl/imx6/imx6.mk
@@ -290,6 +290,7 @@ PRODUCT_COPY_FILES += \
device/fsl/common/input/eGalax_Touch_Screen.idc:system/usr/idc/HannStar_P1003_Touchscreen.idc \
device/fsl/common/input/eGalax_Touch_Screen.idc:system/usr/idc/Novatek_NT11003_Touch_Screen.idc \
device/fsl/common/input/CTA_Touch_Screen.idc:system/usr/idc/CTA_Touch_Screen.idc \
+ device/fsl/common/input/max11801_ts.idc:system/usr/idc/max11801_ts.idc \
device/fsl/common/input/Vantron_CB_Keyboard.kl:system/usr/keylayout/gpio-keys.kl \
device/fsl/imx6/etc/init.rc:root/init.rc \
device/fsl/imx6/etc/apns-conf.xml:system/etc/apns-conf.xml \
diff --git a/device/fsl/sabresd_6dq/BoardConfig.mk b/device/fsl/sabresd_6dq/BoardConfig.mk
index 716282b..b73f6fc 100755
--- a/device/fsl/sabresd_6dq/BoardConfig.mk
+++ b/device/fsl/sabresd_6dq/BoardConfig.mk
@@ -93,7 +93,7 @@ $(error "TARGET_USERIMAGES_USE_UBIFS and TARGET_USERIMAGES_USE_EXT4 config open
endif
endif
-BOARD_KERNEL_CMDLINE := console=ttymxc0,115200 init=/init video=mxcfb0:dev=ldb,CLAA070WP03,if=RGB666,fbpix=RGB32 ldb=sep1 video=mxcfb1:off video=mxcfb2:off fbmem=16M fb0base=0x27b00000 vmalloc=400M androidboot.console=ttymxc0 androidboot.hardware=freescale
+BOARD_KERNEL_CMDLINE := calibration console=ttymxc0,115200 init=/init video=mxcfb0:dev=ldb,H101IV024,if=RGB666,fbpix=RGB32 ldb=sep1 video=mxcfb1:off video=mxcfb2:off fbmem=16M fb0base=0x27b00000 vmalloc=400M androidboot.console=ttymxc0 androidboot.hardware=freescale
ifeq ($(TARGET_USERIMAGES_USE_UBIFS),true)
#UBI boot command line.
@@ -117,6 +117,9 @@ NUM_FRAMEBUFFER_SURFACE_BUFFERS := 3
# agan
PREBUILT_3G_MODEM_RIL :=true
+# zeng
+TARGET_TS_CALIBRATION :=true
+TARGET_TS_DEVICE := "max11801_ts"
TARGET_BOOTLOADER_CONFIG := 6q:mx6q_sabresd_android_config 6dl:mx6dl_sabresd_android_config
在 ‘BOARD_KERNEL_CMDLINE ’中添加 ’ calibration ‘可开启ts_calibrator校准程序。
ts_calibrator 校准后生成 /data/system/calibration,同时会拷贝到 /sys/module/max11801_ts/parameters/calibration,其中 /sys/module/max11801_ts/parameters/calibration中的参数又会传递给触摸屏驱动使用。
如下:
drivers/input/touchscreen/max11801_ts.c 修改部分中的module_param_array(calibration,int, NULL, S_IRUGO | S_IWUSR) 引用了/sys/module/max11801_ts/parameters/calibration中的参数。
1、校准时要删除calibration文件
rm /data/system/calibration
2、${androidroot} 为自己的android源码根目录
imx53* 飞思卡尔 启用触摸屏校准