【问题标题】:psmouse driver inverse mousepsmouse 驱动反向鼠标
【发布时间】:2013-09-17 09:22:33
【问题描述】:

我只想玩 Ubuntu Linux 下的鼠标驱动程序。我有 psmouse-base.c,我可以编译它并将它加载到内核中。我唯一想做的就是反转鼠标。我找到了这个从鼠标接收数据的函数

psmouse_interrupt(struct serio *serio,unsigned char data, unsigned int flags) 

其中接收到的数据存储在无符号字符数据中。我发现 6 个数据代表每种可能的鼠标状态,因此它接收 6 个数据,然后又收到 6 个数据,但我无法弄清楚这些数据代表什么。如果有人能告诉我答案或告诉我在哪里可以找到描述它的文档,我会很高兴。

我想我找到了一些东西。由于我使用触摸板,我一直收到 6 个字节。我在这里找到了数据的描述:www.synaptics.com/sites/default/files/511-000024-01a.pdf。它可以在第 2 和第 3 页找到。根据本文档,可以在第 4 个字节的第 4 位和第 5 位中找到运动的方向。但是下面的代码什么都不做:

if (psmouse->pktcnt == 3)
{
    data  |= 1 << 4;
    data  |= 1 << 5;
}

我假设我只能在 x 和 y 轴上的一个方向上移动鼠标。

我发现负责我的触摸板的驱动程序是 elentech.c。

x1 = ((packet[1] & 0x0f) << 8) | packet[2]; 
y1 = etd->y_max - (((packet[4] & 0x0f) << 8) | packet[5]);

这些线计算运动。我可以在 x 轴上反转我的触摸板,但这只是运气。我不知道它为什么起作用。下面这行:

psmouse->packet[1] *=-1;
psmouse->packet[2] *=-1;

但是我会假设下一行与前两行做同样的事情,但他们没有:

psmouse->packet[1] ^= 0x80;
psmouse->packet[2] ^= 0x80;

而且我无法在 y 轴上反转鼠标。有什么想法吗?

【问题讨论】:

  • 如果你想改变鼠标移动的方向,你应该修改第一个字节,而不是第三个字节。
  • 那是标准的 ps/2 鼠标,它发送 3 个字节。但对于触摸板来说,情况并非如此。这是第 4 个字节,因为它从 0 开始。

标签: c++ linux driver


【解决方案1】:

您最好修改处理数据包的代码psmouse_process_byte,而不是中断处理程序本身。

它会报告 X&Y 运动here,让它反向移动应该不是很难。

基本上,您需要做的就是反转 XNG/YNG 位(分别为 packet[0] 位 4 和 5)。

这是描述数据包格式的一页: http://www.computer-engineering.org/ps2mouse/ 另一个在这里: http://wiki.osdev.org/Mouse_Input

【讨论】:

  • 感谢您的回答,我明天会尝试,但它可能会起作用。谢谢
  • 我找到了 psmouse_process_byte 和它报告移动的行。我试图修改它,但什么也没发生。在和我注释掉了这两行并且鼠标仍然可以正常工作,那又如何?
  • 也许您的鼠标不是 PS/2 鼠标,而是 USB 鼠标?
  • 是的,很抱歉没有提到我正在使用触摸板:S。但是,如果我删除 psmouse 模块 (rmmod psmouse),我的触摸板将停止工作,所以我确信该驱动程序负责我的触摸板。我已经更新了我的问题。
  • 好吧,恐怕我并不是真正的鼠标在 Linux 中工作方式的专家 - 我知道足够危险,但不足以成为专家。您是否查看过 synaptics 驱动程序的代码 - 例如此处:lxr.linux.no/linux+*/drivers/input/mouse/synaptics.c#L1142(您的驱动程序可能略有不同,但我希望它大致相同)。 Linux 中的驱动程序经常“链接在一起”,因此删除基本驱动程序可能会导致删除驱动程序所依赖的某些部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 2018-08-04
  • 2012-11-29
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
  • 2013-05-05
相关资源
最近更新 更多