psmouse驱动程序反向鼠标

时间:2013-09-17 09:22:34

标签: c++ linux driver

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

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

其中接收的数据存储在unsigned char数据中。我发现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轴上反转鼠标。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

它会报告X&amp; Y移动here,并且不应该很难让它相反移动。

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

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