4

我将Android姜饼移植到我的自定义板(使用三星S5PV210处理器)。我有一个ESC7000芯片的触摸屏。我在/kernel/drivers/input/touchscreen/usbtouchscreen.c中找到了一个驱动程序。它几乎可以工作,但是USB数据包的位范围,顺序和字节顺序都不好。我修改了代码以获得正确的RAW位置(在控制台上使用printk来查看它),现在它几乎可以工作。我的数据范围从xmin,ymin到xmax,ymax是420,430到3650,3650,而理论上应该是0,0到4095,4095。这并不奇怪,因为电容式触摸需要校准。这是一个简单的校准,如每个轴的y = mx + b(简单线性校准)。我环视四周的司机,我无法弄清楚校准处理的地方。它必须是可编程的,因为它依赖于单元,并且要在系统生产中对每个单元进行一次校准。我想像其他Android设备那样干净。任何人都知道校准信息存储在Android系统中的位置?代码在做补偿计算。任何网络搜索都会提供有关要重新校准手机的人的信息。所以对我来说没用。触摸屏校准值,它是如何在Android/Kernel中完成的?

回答

3

看一看以下螺纹:https://groups.google.com/forum/#!msg/rowboat/jlbwnmCIDg0/makHFil31pQJ

在挣值管理系统,我们通过校准值(或让我们说硬编码值 为Xmin时/最大值,YMIN/max和XY分辨率)从司机用户 空间。
...

原始事件都在这里frameworks/base/libs/ui/InputReader.cpp

SingleTouchInputMapper::process(const RawEvent* rawEvent)处理,将处理单个触摸设备 原始事件。 ABS_X和ABS_Y是从驱动程序传递的值 ,这些是我在前一封邮件中告诉过您的情况下的绝对坐标我们的

纠正我,如果我错了,afaik Android手机没有机制做 校准从用户空间。这是Android 手机中的一种标准,用于从驱动程序本身发送校准值。

我的建议是,使用tslib来校准并让它存储在/ etc/pointercal中的值。在SingleTouchInputMapper::sync(nsecs_t when)中,通过解析/ etc/pointercal文件中的值来计算绝对坐标。