触摸屏校准值,在Android/内核中是如何完成的?

发布于 2024-12-05 04:24:09 字数 516 浏览 0 评论 0原文

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

I'm porting Android Gingerbread to my custom board (with a Samsung S5PV210 processor). I have a touch screen with an ESC7000 chip. I found a driver in /kernel/drivers/input/touchscreen/usbtouchscreen.c . It almost worked but the bit range, order and byte ordering was not good in the USB packets. I modified the code to get the right RAW position (used printk on console to see it) and now it almost works. My data range from xmin, ymin to xmax, ymax is 420,430 to 3650, 3650 while in theory, it should be 0,0 to 4095,4095. That is not surprising since a capacitive touch needs calibration. This is a simple calibration like y=mx+b for each axis (simple linear calibration). I looked around in the drivers and I can't figure out where the calibration is processed. It has to be programmable since it's unit dependent and is to be calibrated for each unit one time in system production. I want to do it clean like other Android device. Anybody knows where the calibration information is stored in an Android system? Where is the code doing the compensation calculation. Any web search about that gives information about people wanting to recalibrate their phone. So it's useless for me.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

树深时见影 2024-12-12 04:24:09

请查看以下帖子:https://groups.google.com /forum/#!msg/rowboat/jlbwnmCIDg0/makHFil31pQJ

在 EVM 上,我们传递校准值(或者说硬编码值)
从驱动程序到用户的 Xmin/max、Ymin/max 和 XY 分辨率)
空间。

这里处理原始事件frameworks/base/libs/ui/InputReader.cpp

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

如果我错了请纠正我,据我所知Android手机没有机制可以做
从用户空间进行校准。这是Android中的一种标准
手机从驱动程序本身发送校准值。

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

Have a look at the following thread: https://groups.google.com/forum/#!msg/rowboat/jlbwnmCIDg0/makHFil31pQJ

On EVMs we pass the calibrated values(or let us say hardcoded values
for Xmin/max, Ymin/max and XY resolution) from the driver to the user
space.

Raw events are handled here frameworks/base/libs/ui/InputReader.cpp

SingleTouchInputMapper::process(const RawEvent* rawEvent) will process
raw events for a Single touch device. ABS_X and ABS_Y are the values
passed from driver and these are the absolute coordinates in our
case as I told you in my earlier mail.

Correct me if I'm wrong, afaik Android phones have no mechanism to do
calibration from user space. It is a sort of standard in Android
phones to send the calibrated values from driver itself.

What I suggest is, use tslib to calibrate and let it store values in /etc/pointercal. In SingleTouchInputMapper::sync(nsecs_t when) calculate the absolute coordinates by parsing the values from /etc/pointercal file.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文