usb2-鼠标里的hid

2024-01-21 19:18
文章标签 鼠标 hid usb2

本文主要是介绍usb2-鼠标里的hid,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

hid spec 下载:
http://www.usb.org/developers/hidpage#Class_Definitions
hid usage table 下载
http://www.usb.org/developers/hidpage#HID_Usage

mouse设备和主机的hid规范,每次中断传输,mouse发给pc 4个字节的数据data,含义如下

      data[0] --|--bit7: 1 表示 Y 坐标的变化量超出-256 ~ 255的范围,0表示没有溢出|--bit6: 1 表示 X 坐标的变化量超出-256 ~ 255的范围,0表示没有溢出|--bit5: Y 坐标变化的符号位,1表示负数,即鼠标向下移动|--bit4: X 坐标变化的符号位,1表示负数,即鼠标向左移动|--bit3: 恒为1|--bit2: 1表示中键按下|--bit1: 1表示右键按下|--bit0: 1表示左键按下data[1] -- X坐标变化量,与data的bit4组成9位符号数,负数表示向左移,正数表右移。用补码表示变化量data[2] -- Y坐标变化量,与data的bit5组成9位符号数,负数表示向下移,正数表上移。用补码表示变化量data[3] -- 滚轮变化。
//refer to http://group.ednchina.com/93/54358.aspx
所以在

①host side
主机侧usb鼠标驱动linux/drivers/hid/usbhid/usbmouse.c的urb中断函数usb_mouse_irq中,有如下代码
        input_report_key(dev, BTN_LEFT,   data[0] & 0x01);  input_report_key(dev, BTN_RIGHT,  data[0] & 0x02);  input_report_key(dev, BTN_MIDDLE, data[0] & 0x04);  input_report_rel(dev, REL_X,     data[1]);input_report_rel(dev, REL_Y,     data[2]);input_report_rel(dev, REL_WHEEL, data[3]); 
以此第2行为例:data[0] 是单片机发来的数据,
假如data[0]=2,则data[0] & 0x02=1。所以驱动会将BTN_RIGHT的按下状态发送到usbcore,usbcore给driver event ,driver event再将数据按照一定格式写入设备文件。
假如data[0]<>2,则data[0] & 0x02<>1。所以驱动将BTN_RIGHT的释放状态发送出去。

device side
比如一个装备5个按键的单片机,用来模拟鼠标的一些按键和滚轮
k1--BTN_LEFT
k2--REL_WHEEL (+2)
k3--BTN_RIGHT
k4--BTN_MIDDLE
k5--REL_WHEEL (-2)
根据hid规范,定义大小为4个字符的数组
static INT8S MouseData[4] = {0,0,0,0};//typedef signed   char  INT8S;
/*Byte0:keys, Byte1:up-down moving, Byte2:l-r moving, byte3:wheel*/
当单片机
检测到k1键,左键,按下时,令MouseData[0]=1
检测到k3键,右键,按下时,令MouseData[0]=2
检测到k4键,中键,按下时,令MouseData[0]=4
检测到k2键,滚轮上滚,按下时,令MouseData[3]=2
检测到k5键,滚轮下滚,按下时,令MouseData[3]=-2
程序如下
	    switch( KeyScan( ) ){case K1_PRESS://left buttonMouseData[0] = 1;break;case K2_PRESS://wheel frontMouseData[3] = 2;break;case K3_PRESS://Right pressMouseData[0] = 2;break;case K4_PRESS://middle pressMouseData[0] = 4;break;case K5_PRESS://wheel backMouseData[3] = -2;break;case K1_RELEASE:case K3_RELEASE:case K4_RELEASE:break;default:btmp = 0;break;        }
在主机每次中断传输请求时,单片机将MouseData发送给主机, 每次中断传输4个字节,如下
 HID_SendData( (INT8U *)MouseData, 4 );//typedef unsigned char  INT8U;

在mini2440,插入usb鼠标后会自动生成设备文件/dev/input/ event1(event0是触摸屏设备)。假如这个鼠标传输的不是按键的状态,也不是在每次按键按下的时候去传输,而是定时上报adc的数值,那么在主机每次请求中断传输的时候就会得到adc的值而将其写入设备文件。这样可以将此单片机做成一个usb数据采集模块。在host侧,编写应用程序读取/dev/input/event1,就可得到adc数据。当然,没必要非得像鼠标一样按照input模型写驱动和从/dev/input/eventx读数据,可以按照混杂设备写等均可,只要符合hid规范。

这篇关于usb2-鼠标里的hid的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/630569

相关文章

MacOS - ToDesk 无法远程操控鼠标键盘解决方案

问题描述 远程后发现画面显示正常,但是键盘和鼠标的操作没有响应。 原因分析 可能是辅助功能没有勾选ToDesk_Session的权限。 解决方案 系统设置 - 隐私与安全性 - 辅助功能 进去后找到 ToDesk,开关打开,输入系统密码,重启 App 即可!

原生js写数据自动纵向滚动,鼠标移入后停止滚动可手动滚动,鼠标移出转自动

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>滚动页面</title><link rel="stylesheet" href="styles.css"><style>bod

匿名函数和鼠标移入移除事件

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>改变边框</title><style>.def {border: 1px solid #ccc;margin-right: 120px;}.hover {border: 1px solid red;margin-right: 120px;}</style><sc

IE下一个不知道算不算严重的BUG —— 可跟踪用户的系统鼠标位置

IE下的DHTML有各种M$的私有特征,已经是众所周知。其中有个比较有趣就是:event.screenX和event.screenY,可以获得系统级别的鼠标位置坐标。   咋一听,其实也觉得没什么。屏幕上的坐标无非就是:浏览器客户区域里的坐标 + 浏览器窗口坐标 + 客户区偏移,仅此而已。   IE本身就可以通过event和screen对象得到各种屏幕和窗体位置有关的信息。   然而,真

unity 鼠标指示NavMeshAgent移动

本文讲述的是:通过光标点,为NavMeshAgent设置destination,同时在点击处显示图标。 step1 烘焙地形 step2 添加AIThirdPersonController step3 配置canvas 在场景中添加一个canvas,并将它的”Render Mode”设为”world space”将canvas在X轴向旋转90度,这样canvas就会变成水平的

Vue如何实现鼠标悬浮时,展示与隐藏弹窗的功能

如果你需要鼠标在元素和弹窗上时保持弹窗显示,而鼠标离开这两者时隐藏弹窗,你可以使用一个稍微复杂的逻辑来处理鼠标的进入和离开事件。 这通常涉及到延时关闭弹窗,以便给用户足够的时间从元素移动到弹窗上,而不触发弹窗关闭。以下是一个实现的例子:(这个例子简单,效果还非常好) <template><div><!-- 悬停目标元素 --><div @mouseenter="delayedOpen" @mo

openlayers 点击多边形弹框,高亮多边形,自定义属性传递,鼠标悬浮多边形上动态修改鼠标样式

本篇介绍一下使用openlayers点击多边形弹框,高亮多边形,自定义属性传递,鼠标悬浮多边形上动态修改鼠标样式 1 需求 加载天地图,polygon传递自定义属性标悬浮在polygon上,根据自定义属性,动态修改鼠标样式为pointer点击polygon,根据自定义属性,高亮,弹框 2 分析 主要是 openlayers 中 地图事件,overlay等功能的使用 为vectorSou

CSS 修改鼠标图标样式

自定义的鼠标图标,推荐使用ico或cur格式,png也可以。 修改body的设置鼠标样式 body不代表所有html元素。 body{cursor: url(../pic/cursor/Luo\ Tianyi.png), default;width: 100%;height: 100%;} cursor末尾的default:default是默认样式之一,修改样式失败时,使用defaul

实现锚点链接点击tab跳转到指定位置 并且滚动鼠标顶部锚点的样式也跟随变化

实现效果如下  不管是点击还是  滚动鼠标 顶部的样式也会跟随变化 点击会跳转到指定的位置  通过IntersectionObserver 监听是否可见  下面代码可以直接执行到vue的文件  <template><div><ul class="nav"><li v-for="tab in tabs" :key="tab.name" :class="{ active: curren

usb鼠标驱动

Cited from http://blogold.chinaunix.net/u2/88572/showart_1924013.html 参考2.6.14版本中的driver/usb/input/usbmouse.c。鼠标驱动可分为几个部分:驱动加载部分、probe部分、open部分、urb回调函数处理部分。  下文阴影部分为注解。 一、驱动加载部分 static int __i