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

相关文章

韦季李输入法_输入法和鼠标的深度融合

在数字化输入的新纪元,传统键盘输入方式正悄然进化。以往,面对实体键盘,我们常需目光游离于屏幕与键盘之间,以确认指尖下的精准位置。而屏幕键盘虽直观可见,却常因占据屏幕空间,迫使我们在操作与视野间做出妥协,频繁调整布局以兼顾输入与界面浏览。 幸而,韦季李输入法的横空出世,彻底颠覆了这一现状。它不仅对输入界面进行了革命性的重构,更巧妙地将鼠标这一传统外设融入其中,开创了一种前所未有的交互体验。 想象

Unity3D自带Mouse Look鼠标视角代码解析。

Unity3D自带Mouse Look鼠标视角代码解析。 代码块 代码块语法遵循标准markdown代码,例如: using UnityEngine;using System.Collections;/// MouseLook rotates the transform based on the mouse delta./// Minimum and Maximum values can

简单的角色响应鼠标而移动

actor类 //处理移动距离,核心是找到角色坐标在世界坐标的向量的投影(x,y,z),然后在世界坐标中合成,此CC是在地面行走,所以Y轴投影始终置为0; using UnityEngine; using System.Collections; public class actor : MonoBehaviour { public float speed=0.1f; CharacterCo

Usb Audio Device Descriptor(10) Hid Device

对于 Standard Interface Descriptor, 当 bInterfaceClass=0x03时,即为HID设备。Standard Interface Descriptor如下 struct usb_standard_interface_descriptor{U8 bLength; /*Size of this descriptor in bytes*/U8 bDescrip

JavaScript练手小技巧:利用鼠标滚轮控制图片轮播

近日,在浏览网站的时候,发现了一个有意思的效果:一个图片轮播,通过上下滚动鼠标滚轮控制图片的上下切换。 于是就有了自己做一个的想法,顺带复习下鼠标滚轮事件。 鼠标滚轮事件,参考这篇文章:鼠标滚轮事件-CSDN博客 一、HTML和CSS 无论怎么样的滚动,首先要制作图片轮播的结构和样式。 HTML: <div class="box" id="box"><ul class="list" i

鼠标移入移出,样式修改,显示隐藏提示消息

重要的有三点: 1.a标签中的ishow是自己定义的属性,自己输入值 2.a:hover表示鼠标移上去时, 3.a:hover:after{content:attr(ishow)}表示鼠标移上去后,显示提示消息 <!DOCTYPE html> <html> <head lang="en">     <meta charset="UTF-8">     <title>实践题 </

elementUI table 给表头添加气泡显示(鼠标悬浮显示注释)

elementUI table 给表头添加气泡显示(鼠标悬浮显示注释) 前言:文档显示:(使用插槽,我看看到底是怎么个事儿)文档代码:修改后的效果:页面效果: 前言: 公司出现这样的需求,产品要求给表格的表头部分字段添加解释说明,让用户知道这个字段的详细含义。之前倒是没有遇到过类似的问题,并不清楚怎么添加,于是去看element UI 组件文档。 element UI 文档

cygwin 安装后,添加到鼠标右键

Cygwin右键菜单快速启动 原: http://blog.csdn.net/u011512437/article/details/53156638 将Cygwin添加到右键菜单 步骤 以管理员身份运行Cygwin,执行chere -i -t mintty如果看到-bash: chere: 命令未找到(如下图),则需要安装新组建,转到下一章节 如果看到Shell default

【高效办公】三、两台电脑共享鼠标、键盘和文件,两台电脑当一个用的神操作!barrier

1.下载 ubuntu:sudo apt install barrierwindows:https://github.com/debauchee/barrier/releases-下载 : 2.4.0-Assets-BarrierSetup-2.4.0-release.exe  2.运行 ubuntu:sudo apt install barrierwindows:https://gith

ToDesk远程连接Ubuntu 2022.04,鼠标动不了,Windows自带的远程桌面连接也连不上,TightVNC Viewer也连不上的解决办法

折腾一天终于解决了一个ToDesk远程鼠标动不了,Windows自带的远程桌面连接也连不上,TightVNC Viewer也没搞定,最后在向日葵远程控制软件文档得到的启发,原来是Ubuntu2022的显示通信协议改成了Wayland,修改/etc/gdm3/custom.conf里面把原来注释去掉,改为 WaylandEnable=false 这样就改成X11 Xorg了,然后 sudo s