首先电阻屏为什么需要校准,这是电气方面的知识,我也不懂,这里就不说了,这里主要讲讲自己在项目中是怎么通过应用程序来实现校准的,好记性不如烂笔头这里有一篇讲解触摸屏校准原理和优化的文章,道客巴巴上的,先看看了解怎么做
触摸屏校准原理与优化
在ts_calibrator.c中,首先会检测有没有校准文件,如果没有需要重新生成,如果存在该文件就读出该文件中的数据并写入到驱动中生效(这个文件我们也可以自己生成并写入比较准确的数据,这样子开机的时候就不用校准)
通过一系列文章的了解,认识到要想真正做到实现校准,就必须能够更新android系统中的转换参数文件,看一些文章的介绍,不知道是因为版本或者平台,总感觉和我的系统版本不一样,该有的文件都找不到,这里我使用的是freescale53,android2.3.7平台
系统烧写后第一次启动的时候会有一个需要实现校准的过程,是在一个进程中做到的,文件目录system/core/ts_calibrator,分析这个文件主要分为检查文件,校准读取,画十字,计算并写入驱动:
首先在init.rc文件中我们能够会执行ts_calibrator进程,并在这里处于阻塞状态,等待用户触击屏幕
on boot
# basic network init
ifup lo
hostname localhost
domainname localdomain
mkdir /data/system 0775 system system
exec /sbin/ts_calibrator
在ts_calibrator.c中,首先会检测有没有校准文件,如果没有需要重新生成,如果存在该文件就读出该文件中的数据并写入到驱动中生效(这个文件我们也可以自己生成并写入比较准确的数据,这样子开机的时候就不用校准)
property_get("ro.calibration", runme, "");
if (runme[0] != '1')
return 0;
/* open log */
log_fd = open(log, O_WRONLY | O_CREAT | O_TRUNC);
if (check_conf())
do_calib = 0;
/* check conf file */
if (stat(cf_file, &s) == 0) {
/* conf file already existed */
cf_fd = open(cf_file, O_RDWR);
if (cf_fd >= 0) {
buffer = calloc(1, s.st_size + 1);
read(cf_fd, buffer, s.st_size);
ret = sscanf(buffer, "%d\n%d\n%d\n%d\n%d\n%d\n%d",
&data[0], &data[1], &data[2],
&data[3], &data[4], &data[5],
&data[6]);
if (ret == 7) {
free(buffer);
/* write to driver */
write_conf(data);
close(cf_fd);
return 1;
}
log_write("Failed to get datas from conf file: %d\n", ret);
free(buffer);
close(cf_fd);
}//else可以做自己的处理
}
校准读取:系统采用3点校准,连续三次读取触摸点的物理坐标,其中显示屏的坐标是已知的
static void get_input(int *px, int *py)
{
int rd, i;
struct input_event ev[64];
int step = 0;
while (1) {
/* read ts input 这里会一直读取,知道松手跳出循环*/
rd = read(ts_fd, ev, sizeof(struct input_event) * 64);
if (rd < (int) sizeof(struct input_event)) {
log_