基于Freescale Android4.2.2 max11801 的10寸电阻屏校准方法总结
来源:互联网 发布:淘宝口令是什么 编辑:程序博客网 时间:2024/04/30 05:02
作者:zengsym@gmail.com
时间: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.cindex 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.cindex 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.cindex 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.rcindex 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.mkindex 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.mkindex 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* 飞思卡尔 启用触摸屏校准
- 基于Freescale Android4.2.2 max11801 的10寸电阻屏校准方法总结
- 基于Freescale Android4.2.2 max11801 的10寸电阻屏校准方法总结
- Android4.4关于电阻屏调试和校准
- RK3288 10.1寸电阻触摸屏调试与校准软件的运行
- android4.4 电阻触摸校准修改说明
- 友坚android210开发板android4.0系统+7寸电阻屏
- 电阻触摸屏的校准算法
- wince电阻触摸屏的校准问题
- wince2416 3.5寸电阻屏驱动
- 20151031本地编译freescale的i.MX6Q的android4.2.2&android4.4.2 && 全志a80的步骤x1
- Android电阻触摸屏校准
- STM32移植STemWin后使用四点或两点触摸校准(电阻屏校准,电容屏无需校准)
- 三星Android210《7寸电容屏+512内存+android4.0》
- android 电阻单点触摸屏校准
- 四线电阻触摸屏校准
- 基于Freescale的主流芯片HCS08
- 基于模型的开发--freescale--xs
- 上拉电阻下拉电阻的总结
- 类方法、实例方法、静态方法(重要)
- CMOS与TTL电平的区别
- Eclipse快捷键
- vim编辑器学习笔记
- OA 第四天笔记
- 基于Freescale Android4.2.2 max11801 的10寸电阻屏校准方法总结
- Nginx内存池
- 《统计学习方法》学习笔记一
- Git的深入理解与GitHub托管服务的使用
- ant安装、环境变量配置及验证
- OpenStack入门以及一些资料之(二、neutron网络)
- HTML5+CSS3+JS(第二课).HTML5保留的常用元素(二)
- <iostream> 和 <iostream.h>的区别 及 Linux下编译iostream.h的方法
- 学习计划