linux模拟usb发包,Linux下USB模拟ps2鼠标驱动

在linu-kernel/drivers/input/mouse/psmouse-base.c是ps2鼠标驱动的主体,如psmouse_reset、psmouse_connect等函数具体实现在此文件之中。

简单地,拿psmouse_reset为例,调用ps2_command()->ps2_sendbyte()->serio_write()来完成对硬件的操作。而serio_write()在已经指定。

static int __devinit i8042_create_aux_port(void)

{

struct serio *serio;

struct i8042_port *port = &i8042_ports[I8042_AUX_PORT_NO];

serio = kzalloc(sizeof(struct serio), GFP_KERNEL);

if (!serio)

return -ENOMEM;

serio->id.type  = SERIO_8042;

serio->write  = i8042_aux_write;

serio->open  = i8042_open;

serio->close  = i8042_close;

serio->start  = i8042_start;

serio->stop  = i8042_stop;

serio->port_data = port;

serio->dev.parent = &i8042_platform_device->dev;

strlcpy(serio->name, "i8042 Aux Port", sizeof(serio->name));

strlcpy(serio->phys, I8042_AUX_PHYS_DESC, sizeof(serio->phys));

port->serio = serio;

return i8042_port_register(port);

i8042_aux_write()会调用i8042_command()来完成对60/64口的操作。

(注意,操作端口前必须disable_keyboard,完成后enable_keyboard)

截取了鼠标初始化的log如下:

60 -> i8042 (command)

47 -> i8042 (parameter)                               //配置8042控制器

d4 -> i8042 (command)                                 //针对鼠标操作

f2 -> i8042 (parameter)                                //getid命令

interrupt: read status (0x3d)

interrupt: read data (0xfa)                            //ACK应答,如果是FE的话,说明返回错误。

但是在LINUX中若使用PS2鼠标驱动,屏蔽掉USB鼠标驱动的话,在某些平台上会出现返回FE的错误,以至于鼠标驱动加载失败,通过DOS下的ctmouse驱动可以看到,psmouse驱动使用int15/c2xx来完成初始化。所以在linux启动的实模式期间,调用int15来实现鼠标驱动初始化工作。

在/arch/i386/boot/setup.S中添加如下代码:

start_of_setup:

+# Fix ULOS mouse BUG

+ pushw %ax

+ pushw %bx

+ pushw %es

+

+ xorw %bx, %bx

+ movw %cs, %ax

+ movw %ax, %es

+ movw $0x0c207, %ax

+ int $0x15

+

+ movw $0x0c200, %ax

+ movw $0x0100, %bx

+ int $0x15

+

+ movb $0xa7, %al

+ outb %al, $0x64   # disable mouse

+ call delay

+

+ popw %es

+ popw %bx

+ popw %ax

# Bootlin depends on this being done early

movw $0x01500, %ax

movb $0x81, %dl

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值