5.USB驱动--五:USB 鼠标中断函数

USB 设备(USB 鼠标)所谓的“中断传输”是指“USB 主机控制器”不断的查询“USB 设备”是否有数据过来

当"USB 主机控制器"来不断的查询“USB 设备 - 鼠标”,有数据后“USB 主机控制器”会
存在 usb_buf 中,然后“USB 主机控制器”产生一个中断.此时“usbmouse_as_key_irq”函数会调用。
内核示例 usbmouse.c 中“usbmouse_as_key_irq()”根据数据判断是哪个按键或左右方向位移。再重新提交“urb”。
自已的代码也按这个思路写:

写个demo,打印鼠标数据,用于分析数据
static void usbmouse_as_key_irq(struct urb *urb)
{
 	int i;
	static int cnt =0;                     //cnt变量用于显示计数,即帧数
	printk("cnt %d :",++cnt);     //打印帧行号
	for(i = 0;i<len;i++){              //一帧有6个字节,未打印完6个字节时for循环
		printk("%02x ",usb_buf[i]);    //打印每个字节,每个字节两位,按16进制,两个字节中间留有空格
	}
	printk("\n");                        //当一帧结束后换行
	usb_submit_urb(mouse_urb, GFP_KERNEL);    //重新提交“urb”。
	}

观察打印数据:
第0字节 第1字节
cnt 10 : 01 00 00 00 00 00
cnt 11 01 01 00 00 00 00 //左键按下
cnt 12 : 01 02 00 00 00 00 //右键按下
cnt 13 : 01 04 00 00 00 00 //中建按下

可观察到每帧有6个字节。

左键按下时,
可观察到第1字节的数据由“00”变为“01”,
因数据是按16进制显示,则第一字节数据是由“0000 0000:”
变为“0000 0001“
则左键按下时,是第1字节的bit[0]有 “0”->“1”

右键按下时,
可观察到第1字节的数据由“00”变为“02”,
因数据是按16进制显示,则第一字节数据是由“0000 0000:”
变为“0000 0010“
则右键按下时,是第1字节的bit[1]有 “0”->“1”

中键按下时,
可观察到第1字节的数据由“00”变为“04”,
因数据是按16进制显示,则第一字节数据是由“0000 0000:”
变为“0000 0100“
则右键按下时,是第1字节的bit[2]有 “0”->“1”
由此可知: USB 鼠标数据含意:

*按键发生变化时,是第一字节data[1]发生了变化
(即代码中的usb_buf[1])   
 * bit0-左键,1-按下,0-松开
 * bit1-右键,1-按下,0-松开
 * bit2-中键,1-按下,0-松开
 */

明白鼠标数据的含义后,在 鼠标中断函数中,将打印鼠标数据的过程改成上报事件。

static void usb_mouse_fn(struct urb *urb)
{
	static unsigned char per_val ;//上一次的数据  的第一字节
	if((per_val & (1<<0)) != (usb_buf[1] & (1<<0)))  //上一次数据的bit[0]不等于这一帧的第1字节 的bit[0]时,则表示左键发生了变化
		{
			input_event(myusb_mouse_dev, EV_KEY, KEY_L, (usb_buf[1]&(1<<0)?1:0));
			input_sync(myusb_mouse_dev);
		}
	
	if((per_val & (1<<1)) != (usb_buf[1] & (1<<1)))     右键--S 发生了变化 bit1
		{
			input_event(myusb_mouse_dev, EV_KEY, KEY_S, (usb_buf[1]&(1<<1)?1:0)) ;
			input_sync(myusb_mouse_dev);
	}
	if((per_val & (1<<2)) != (usb_buf[1] & (1<<2)))        //中键--enter 发生了变化 bit2
		{
			input_event(myusb_mouse_dev, EV_KEY, KEY_ENTER, (usb_buf[1]&(1<<2)?1:0));
			input_sync(myusb_mouse_dev);
	}
	per_val = usb_buf[1];                   //保存这一帧的第1字节,用于与下次数据对比
	usb_submit_urb(mouse_urb, GFP_KERNEL);          //重新提交urb
}

测试:
1.cat /dev/tty1 观察
2. hexdump /dev/input/event0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值