精华内容
下载资源
问答
  • 用STM32做的一个USB 模拟发送按键到PC上 当GPIO按下的时候 模拟指定的字符发上来,模拟游戏按下的动作
  • CH372 模拟HID键盘按键

    热门讨论 2011-11-21 14:52:39
    使用51单片机驱动CH372实现USB HID模拟键盘发送数据
  • 使用STM32 USB HID功能模拟键盘 程序使用的是外部中断触发发送模拟按键,(按下F12, 4秒后松开),方式可以自己修改触 发,和按下的按键,以及是直接松开按键还是稍后松开按键
  • FPGA+USB68013 HID键盘模拟 通过FPGA来模拟键盘 在硬件平台上已实现,altera环境,verilog语言
  • hid键盘代码

    2013-07-14 10:33:54
    hid键盘代码,利用ch372模块和51单片机模拟计算机键盘
  • 扫描枪模拟键盘模式输入数据,从而无法区分键盘人工输入数据和扫描枪的数据,造成数据混乱。使用HID接口模式调用WindowsAPI读取的方式由于受到不同操作系统有不同情况的问题,难以解决问题。因此采用键盘钩子区分...
  • 转载 linux usb gadget hid configfs https://wiki.tizen.org/USB/Linux_USB_Layers/Configfs_Composite_Gadget/Usage_eq._to_g_hid.ko USB/Linux USB Layers/Configfs Composite Gadget/Usage eq. to g hid.ko &...

    转载 linux usb gadget hid configfs

    https://wiki.tizen.org/USB/Linux_USB_Layers/Configfs_Composite_Gadget/Usage_eq._to_g_hid.ko

    USB/Linux USB Layers/Configfs Composite Gadget/Usage eq. to g hid.ko

    USB‎ | Linux USB Layers/Configfs Composite Gadget

    Contents

     [hide

    Owner

    • Andrzej Pietrasiewicz <andrzej.p (at) samsung.com> (KERNEL)

    Code change log

    v1

    Guide

    This series aims at integrating configfs into hid, the way it has been done for acm, ncm, ecm, eem, ecm subset, rndis, obex, phonet,

    mass_storage, FunctionFS, loopback, sourcesink, uac1, uac2 and uvc. The hid function driver needs some data from userspace, which cannot

    be known in advance, so it must be passed somehow to the kernel.

    So far passing this data has been done in a rather tricky way: another (proablby out-of-tree) kernel module is required to provide

    fake platform device(s), for which the g_hid happens to be a platform driver. The platform devices contain in their platform_data

    the data to be passed to the hid function, and during platform drivers's probe the data is passed.

    With configfs passing of the said data is straightforward: there is a report_desc attribute in hid function's directory, to which the

    data is just written.

     

    BACKWARD COMPATIBILITY

    Please note that the old g_hid.ko is still available and works.

     

    USING THE NEW "GADGET"

    Please refer to this post:

    http://www.spinics.net/lists/linux-usb/msg76388.html

    for general information from Sebastian on how to use configfs-based gadgets (*).

    With configfs the procedure is as follows, compared to the information mentioned above (*):

    instead of mkdir functions/acm.ttyS1 do
    
    mkdir functions/hid.<instance name>
    
    e.g. mkdir functions/hid.usb0.
    

    In the hid.usb0 directory there will be the following attributes:

    	protocol	- HID protocol to use
    	report_desc	- data to be used in HID reports, except data 	passed with /dev/hidg<X>
    	report_length	- HID report length
    	subclass	- HID subclass to use
    

    For a keyboard protocol and subclass are 1, report_length is 8, while the report_desc is:

    $ hd my_report_desc
    00000000  05 01 09 06 a1 01 05 07  19 e0 29 e7 15 00 25 01  |..........)...%.|
    00000010  75 01 95 08 81 02 95 01  75 08 81 03 95 05 75 01  |u.......u.....u.|
    00000020  05 08 19 01 29 05 91 02  95 01 75 03 91 03 95 06  |....).....u.....|
    00000030  75 08 15 00 25 65 05 07  19 00 29 65 81 00 c0     |u...%e....)e...|
    0000003f
    

    Such a sequence of bytes can be stored to the attribute with echo:

    $ echo -ne \\x05\\x01\\x09\\x06\\xa1.....
    

    Below is a script which creates a hid gadget:

    $ modprobe libcomposite
    $ mount none cfg -t configfs
    $ mkdir cfg/usb_gadget/g1
    $ cd cfg/usb_gadget/g1
    $ mkdir configs/c.1
    $ mkdir functions/hid.usb0
    $ echo 1 > functions/hid.usb0/protocol
    $ echo 1 > functions/hid.usb0/subclass
    $ echo 8 > functions/hid.usb0/report_length
    $ cat my_report_desc > functions/hid.usb0/report_desc
    $ mkdir strings/0x409
    $ mkdir configs/c.1/strings/0x409
    $ echo 0xa4ac > idProduct
    $ echo 0x0525 > idVendor
    $ echo serial > strings/0x409/serialnumber
    $ echo manufacturer > strings/0x409/manufacturer
    $ echo HID Gadget > strings/0x409/product
    $ echo "Conf 1" > configs/c.1/strings/0x409/configuration
    $ echo 120 > configs/c.1/MaxPower
    $ ln -s functions/hid.usb0 configs/c.1
    $ echo 12480000.hsotg > UDC # choose your UDC from /sys/class/udc/*
    

    TESTING THE FUNCTIONS

    gadget)

    - create the gadget

    - connect the gadget to a host, preferably not the one used to control the gadget

    - run a program which writes to /dev/hidg<N>, e.g.

    a userspace program found in Documentation/usb/gadget_hid.txt:

    $ ./hid_gadget_test /dev/hidg0 keyboard
    

    host) - observe the keystrokes from the gadget

    展开全文
  • 调试模拟键盘鼠标花了我接近一周的时间,到处查找资料,结果东平西凑。靠上厕所的灵感,终于调通了, 主要注意的是绝对值坐标和相对坐标的表达不一样 最后在这里找到了答案,感谢21ic tanganrong 大虾的无私奉献,...

    调试模拟键盘鼠标花了我接近一周的时间,到处查找资料,结果东平西凑。靠上厕所的灵感,终于调通了,

    主要注意的是绝对值坐标和相对坐标的表达不一样

    最后在这里找到了答案,感谢21ic tanganrong 大虾的无私奉献,特作记录

    https://bbs.21ic.com/icview-175531-1-1.html

    详细解析

    https://blog.csdn.net/pig10086/article/details/71438990

    /*hid descriptor for a mouse*/

    static struct hidg_func_descriptor kvm_mouse_data = {

    .subclass = 0, /*NO SubClass*/

    .protocol = 2, /*Mouse*/

    .report_length = 6, //绝对值是6, 相对值是4不然打死调不通,实际很简单。但是没有全面了解协议是很难发现这些细节的

    .report_desc_length = 126,//62,//104,

    .report_desc={

    #if 0

    #else

    0x05, 0x01, // USAGE_PAGE (Generic Desktop)

    0x09, 0x02, // USAGE (Mouse)

    0xa1, 0x01, // COLLECTION (Application)

    0x09, 0x01, // USAGE (Pointer)

    0xa1, 0x00, // COLLECTION (Physical)

    0x85, 0x01, // REPORT_ID (1)

    0x05, 0x09, // USAGE_PAGE (Button)

    0x19, 0x01, // USAGE_MINIMUM (Button 1)

    0x29, 0x03, // USAGE_MAXIMUM (Button 3)

    0x15, 0x00, // LOGICAL_MINIMUM (0)

    0x25, 0x01, // LOGICAL_MAXIMUM (1)

    0x75, 0x01, // REPORT_SIZE (1)

    0x95, 0x03, // REPORT_COUNT (3)

    0x81, 0x02, // INPUT (Data,Var,Abs)

    0x75, 0x05, // REPORT_SIZE (5)

    0x95, 0x01, // REPORT_COUNT (1)

    0x81, 0x01, // INPUT (Cnst,Ary,Abs)

    0x05, 0x01, // USAGE_PAGE (Generic Desktop)

    0x09, 0x30, // USAGE (X)

    0x09, 0x31, // USAGE (Y)

    0x15, 0x81, // LOGICAL_MINIMUM (-127)

    0x25, 0x7f, // LOGICAL_MAXIMUM (127)

    0x75, 0x08, // REPORT_SIZE (8)

    0x95, 0x02, // REPORT_COUNT (2)

    0x81, 0x06, // INPUT (Data,Var,Rel)

    0xc0, // END_COLLECTION

    0xc0, // END_COLLECTION

    0x05, 0x01, // USAGE_PAGE (Generic Desktop)

    0x09, 0x02, // USAGE (Mouse)

    0xa1, 0x01, // COLLECTION (Application)

    0x09, 0x01, // USAGE (Pointer)

    0xa1, 0x00, // COLLECTION (Physical)

    0x85, 0x02, // REPORT_ID (2)

    0x05, 0x09, // USAGE_PAGE (Button)

    0x19, 0x01, // USAGE_MINIMUM (Button 1)

    0x29, 0x03, // USAGE_MAXIMUM (Button 3)

    0x15, 0x00, // LOGICAL_MINIMUM (0)

    0x25, 0x01, // LOGICAL_MAXIMUM (1)

    0x75, 0x01, // REPORT_SIZE (1)

    0x95, 0x03, // REPORT_COUNT (3)

    0x81, 0x02, // INPUT (Data,Var,Abs)

    0x75, 0x01, // REPORT_SIZE (1)

    0x95, 0x05, // REPORT_COUNT (5)

    0x81, 0x03, // INPUT (Cnst,Var,Abs)

    0x05, 0x01, // USAGE_PAGE (Generic Desktop)

    0x09, 0x30, // USAGE (X)

    0x15, 0x00, // LOGICAL_MINIMUM (0)

    0x26, 0xff, 0x7f, // LOGICAL_MAXIMUM (32767)

    0x35, 0x00, // PHYSICAL_MINIMUM (0)

    0x46, 0xff, 0x7f, // PHYSICAL_MAXIMUM (32767)

    0x75, 0x10, // REPORT_SIZE (16)

    0x95, 0x01, // REPORT_COUNT (1)

    0x81, 0x02, // INPUT (Data,Var,Abs)

    0x09, 0x31, // USAGE (Y)

    0x15, 0x00, // LOGICAL_MINIMUM (0)

    0x26, 0xff, 0x7f, // LOGICAL_MAXIMUM (32767)

    0x35, 0x00, // PHYSICAL_MINIMUM (0)

    0x46, 0xff, 0x7f, // PHYSICAL_MAXIMUM (32767)

    0x75, 0x10, // REPORT_SIZE (16)

    0x95, 0x01, // REPORT_COUNT (1)

    0x81, 0x02, // INPUT (Data,Var,Abs)

    0xc0, // END_COLLECTION

    0xc0 // END_COLLECTION

     

    #endif

    }

    };

     

    复合键盘鼠标

     
    1. //该报告描述符号由HID Descriptor tool生成
    2. code ] = {
    3.  
    4. //-------------键盘部分报告描述符----------------
    5. //表示用途页为通用桌面设备
    6. 0x05, 0x01, // USAGE_PAGE (Generic Desktop)
    7.  
    8. //表示用途为键盘
    9. 0x09, 0x06, // USAGE (Keyboard)
    10.  
    11. //表示应用集合,必须要以END_COLLECTION来结束它,见最后的END_COLLECTION
    12. 0xa1, 0x01, // COLLECTION (Application)
    13.  
    14. //报告ID(报告ID 0是保留的)
    15. 0x85, 0x01, //Report ID (1)
    16.  
    17. //表示用途页为按键
    18. 0x05, 0x07, // USAGE_PAGE (Keyboard)
    19.  
    20. //用途最小值,这里为左ctrl键
    21. 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
    22. //用途最大值,这里为右GUI键,即window键
    23. 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
    24. //逻辑最小值为0
    25. 0x15, 0x00, // LOGICAL_MINIMUM (0)
    26. //逻辑最大值为1
    27. 0x25, 0x01, // LOGICAL_MAXIMUM (1)
    28. //报告大小(即这个字段的宽度)为1bit,所以前面的逻辑最小值为0,逻辑最大值为1
    29. 0x75, 0x01, // REPORT_SIZE (1)
    30. //报告的个数为8,即总共有8个bits
    31. 0x95, 0x08, // REPORT_COUNT (8)
    32. //输入用,变量,值,绝对值。像键盘这类一般报告绝对值,
    33. //而鼠标移动这样的则报告相对值,表示鼠标移动多少
    34. 0x81, 0x02, // INPUT (Data,Var,Abs)
    35. //上面这这几项描述了一个输入用的字段,总共为8个bits,每个bit表示一个按键
    36. //分别从左ctrl键到右GUI键。这8个bits刚好构成一个字节,它位于报告的第一个字节。
    37. //它的最低位,即bit-0对应着左ctrl键,如果返回的数据该位为1,则表示左ctrl键被按下,
    38. //否则,左ctrl键没有按下。最高位,即bit-7表示右GUI键的按下情况。中间的几个位,
    39. //需要根据HID协议中规定的用途页表(HID Usage Tables)来确定。这里通常用来表示
    40. //特殊键,例如ctrl,shift,del键等
    41.  
    42. //这样的数据段个数为1
    43. 0x95, 0x01, // REPORT_COUNT (1)
    44. //每个段长度为8bits
    45. 0x75, 0x08, // REPORT_SIZE (8)
    46. //输入用,常量,值,绝对值
    47. 0x81, 0x03, // INPUT (Cnst,Var,Abs)
    48.  
    49. //上面这8个bit是常量,设备必须返回0
    50.  
    51. //这样的数据段个数为5
    52. 0x95, 0x05, // REPORT_COUNT (5)
    53. //每个段大小为1bit
    54. 0x75, 0x01, // REPORT_SIZE (1)
    55. //用途是LED,即用来控制键盘上的LED用的,因此下面会说明它是输出用
    56. 0x05, 0x08, // USAGE_PAGE (LEDs)
    57. //用途最小值是Num Lock,即数字键锁定灯
    58. 0x19, 0x01, // USAGE_MINIMUM (Num Lock)
    59. //用途最大值是Kana,这个是什么灯我也不清楚^_^
    60. 0x29, 0x05, // USAGE_MAXIMUM (Kana)
    61. //如前面所说,这个字段是输出用的,用来控制LED。变量,值,绝对值。
    62. //1表示灯亮,0表示灯灭
    63. 0x91, 0x02, // OUTPUT (Data,Var,Abs)
    64.  
    65. //这样的数据段个数为1
    66. 0x95, 0x01, // REPORT_COUNT (1)
    67. //每个段大小为3bits
    68. 0x75, 0x03, // REPORT_SIZE (3)
    69. //输出用,常量,值,绝对
    70. 0x91, 0x03, // OUTPUT (Cnst,Var,Abs)
    71. //由于要按字节对齐,而前面控制LED的只用了5个bit,
    72. //所以后面需要附加3个不用bit,设置为常量。
    73.  
    74. //报告个数为6
    75. 0x95, 0x06, // REPORT_COUNT (6)
    76. //每个段大小为8bits
    77. 0x75, 0x08, // REPORT_SIZE (8)
    78. //逻辑最小值0
    79. 0x15, 0x00, // LOGICAL_MINIMUM (0)
    80. //逻辑最大值255
    81. 0x25, 0xFF, // LOGICAL_MAXIMUM (255)
    82. //用途页为按键
    83. 0x05, 0x07, // USAGE_PAGE (Keyboard)
    84. //使用最小值为0
    85. 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
    86. //使用最大值为0x65
    87. 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
    88. //输入用,变量,数组,绝对值
    89. 0x81, 0x00, // INPUT (Data,Ary,Abs)
    90. //以上定义了6个8bit宽的数组,每个8bit(即一个字节)用来表示一个按键,所以可以同时
    91. //有6个按键按下。没有按键按下时,全部返回0。如果按下的键太多,导致键盘扫描系统
    92. //无法区分按键时,则全部返回0x01,即6个0x01。如果有一个键按下,则这6个字节中的第一
    93. //个字节为相应的键值(具体的值参看HID Usage Tables),如果两个键按下,则第1、2两个
    94. //字节分别为相应的键值,以次类推。
    95.  
    96. //关集合,跟上面的对应
    97. 0xc0 , // END_COLLECTION
    98.  
    99. //-----------------------鼠标部分报告描述符----------------------------
    100. 0x05, 0x01, // USAGE_PAGE (Generic Desktop)
    101. 0x09, 0x02, // USAGE (Mouse)
    102. 0xa1, 0x01, // COLLECTION (Application)
    103. 0x85, 0x02, // 报告ID (2)
    104. 0x09, 0x01, // USAGE (Pointer)
    105. 0xa1, 0x00, // COLLECTION (Physical)
    106. 0x05, 0x09, // USAGE_PAGE (Button)
    107. 0x19, 0x01, // USAGE_MINIMUM (Button 1)
    108. 0x29, 0x03, // USAGE_MAXIMUM (Button 3)
    109. 0x15, 0x00, // LOGICAL_MINIMUM (0)
    110. 0x25, 0x01, // LOGICAL_MAXIMUM (1)
    111. 0x95, 0x03, // REPORT_COUNT (3)
    112. 0x75, 0x01, // REPORT_SIZE (1)
    113. 0x81, 0x02, // INPUT (Data,Var,Abs)
    114. 0x95, 0x01, // REPORT_COUNT (1)
    115. 0x75, 0x05, // REPORT_SIZE (5)
    116. 0x81, 0x03, // INPUT (Cnst,Var,Abs)
    117. 0x05, 0x01, // USAGE_PAGE (Generic Desktop)
    118. 0x09, 0x30, // USAGE (X)
    119. 0x09, 0x31, // USAGE (Y)
    120. 0x09, 0x38, // USAGE (Wheel)
    121. 0x15, 0x81, // LOGICAL_MINIMUM (-127)
    122. 0x25, 0x7f, // LOGICAL_MAXIMUM (127)
    123. 0x75, 0x08, // REPORT_SIZE (8)
    124. 0x95, 0x03, // REPORT_COUNT (3)
    125. 0x81, 0x06, // INPUT (Data,Var,Rel)
    126. 0xc0, // END_COLLECTION
    127. 0xc0 // END_COLLECTION
    128. };

    0x05, 0x01, // Usage Page (Generic Desktop)

    0x04 代表是 Global 类的 Usage Page 功能,最位 2 位表示带多少个字节的数据,因为只带1 个数据,所以是 1,跟 0x04 组合起来就是 0x05 了。其他名称的意思都差不多,数值可以参照上一章的Generic Item Format

    0x09, 0x02, // Usage (Mouse)

    表示这是一个鼠标, Usage 是为了给对方解析数据时有个参照

    0xA1, 0x01, // Collection (Application)

    0xA1, 0x01 表示 CollectionApplication ; 0xA1, 0x00 表示 Collection Physical.表示下面所包含的是对 Mouse 的解释

    0x85, 0x01, // Report Id (1)

    该报告对应的 ID 是 1

    0x09, 0x01, // Usage (Pointer)

    这是个指针形式

    0xA1, 0x00, // Collection (Physical)

    下面所包含的是对指针的解释

    0x05, 0x09, // Usage Page (Buttons)

    下面定义的是按键

    0x19, 0x01, // Usage Minimum (01) - Button 1

    0x29, 0x03, // Usage Maximum (03) - Button 3

    总共有 3 个按键

    0x15, 0x00, // Logical Minimum (0)

    0x25, 0x01, // Logical Maximum (1)

    按键的值是 0 和 1,表示放开和按下

    0x75, 0x01, // Report Size (1)

    0x95, 0x03, // Report Count (3)

    有 3 个 1 位,即用 3bits 分别对应三个按键

    0x81, 0x02, // Input (Data, Variable,Absolute) - Button states

    将这三个位加入本报告的数据中,这三位是可读写的绝对值

    0x75, 0x05, // Report Size (5)

    0x95, 0x01, // Report Count (1)

    定义 1 个 5 位的数据

    0x81, 0x01, // Input (Constant) - Padding or Reserved bits

    将这个数据添加到本报告的数据中,主要是与前面 3 位组成一个字节,这 5 位是 Constant数据

    0x05, 0x01, // Usage Page (Generic Desktop)

    0x09, 0x30, // Usage (X)

    0x09, 0x31, // Usage (Y)

    0x09, 0x38, // Usage (Wheel)

    下面定义的是 X,Y,Wheel 三个功能

    0x15, 0x81, // Logical Minimum (-127)

    0x25, 0x7F, // Logical Maximum (127)

    X,Y,Wheel 的取值范围是-127~127

    0x75, 0x08, // Report Size (8)

    0x95, 0x03, // Report Count (3)

    用三个字节来表示 x,y,wheel

    0x81, 0x06, // Input (Data, Variable, Relative) - X & Y coordinate

    将这三个字节添加到本报告中

    0xC0, // End Collection

    0xC0, // End Collection

    展开全文
  • 由于在报告描述符中使用了两个Report ID,分别是0x01和0x02,前者是键盘的报告描述符的报告ID,后者是鼠标的报告ID,HID键盘和鼠标发送的数据格式参考文档: ... 根据文档编写键盘和鼠标的发送函数如下: ...

    由于在报告描述符中使用了两个Report ID,分别是0x01和0x02,前者是键盘的报告描述符的报告ID,后者是鼠标的报告ID,HID的键盘和鼠标发送的数据格式参考文档:

    http://linfengdu.blog.163.com/blog/static/1177107320122296942641/

    根据文档编写键盘和鼠标的发送函数如下:

    	typedef enum
    	{
    		KEYBOARD	= 0x01,
    		MOUSE		= 0x02,
    	}Device;
    	
    	#define None_Key	0x00
    	
    	typedef enum
    	{
    		Left_Control	= 0x01,
    		Left_Shift		= 0x02,
    		Left_Alt		= 0x04,
    		Left_GUI		= 0x08,
    		Right_Control	= 0x10,
    		Right_Shift		= 0x20,
    		Right_Alt		= 0x40,
    		Right_GUI		= 0x80,
    	}FunctionKey;
    	
    	typedef enum
    	{
    		Left_Key		= 0x01,
    		Right_Key		= 0x02,
    		Mid_Kry			= 0x04,
    	}MouseKey;
    
    extern u8 EP1BUSY;
    extern u8 HID_SendBuffer[9];
    
    void HID_Send(Device device)
    {
    	HID_SendBuffer[0] = (u8)device;
    	
        /*copy mouse position info in ENDP1 Tx Packet Memory Area*/
        UserToPMABufferCopy(HID_SendBuffer, GetEPTxAddr(ENDP1), 9);
        /* enable endpoint for transmission */
        SetEPTxValid(ENDP1);
    
    	while(EP1BUSY);
    	EP1BUSY = 1;
    
    }
    
    void SendKeyboardData(u8 ctrl_shift,u8 key)
    {
    	HID_SendBuffer[1] = ctrl_shift;
    	HID_SendBuffer[3] = key;
    	HID_Send(KEYBOARD);
    }
    
    void SendMouseData(u8 key,s8 x,s8 y)
    {
    	HID_SendBuffer[1] = key;
    	HID_SendBuffer[2] = (u8)x;
    	HID_SendBuffer[3] = (u8)y;
    	HID_Send(MOUSE);
    }
    
    


    展开全文
  • HID是Human Interface Device的缩写,HID设备是直接与人交互的设备,例如键盘、鼠标与游戏杆等。不过HID设备并不一定要有人机接口,只要符合HID类别规范的设备都是HID设备。交换的数据存储在称为报表或报告(report)...

    HID是Human Interface Device的缩写,HID设备是直接与人交互的设备,例如键盘、鼠标与游戏杆等。不过HID设备并不一定要有人机接口,只要符合HID类别规范的设备都是HID设备。交换的数据存储在称为报表或报告(report)的结构内,设备的固件必须支持HID报表的格式。主机在控制与中断传输中传送与要求报表,来传送与接收数据。报表的格式非常有弹性,可以处理任何类别的数据。设备除了HID接口之外,它可能同时还包含有其他的USB接口。例如影像显示设备可能使用HID接口来做亮度,对比,与更新率的软件控制,而使用传统的影 像接口来传送要显示的数据。USB扩音器可以使用实时传输来播放语音,同时使用HID接口来控制音量,震荡,与低音等。HID接口通常比传统的控制接口来得便宜。USB协议的介绍可以参考网上的教程:

    USB设备枚举过程介绍http://lastnight1034.blog.163.com/blog/static/167118149201211710164820/

    USB设备描述符http://blog.csdn.net/saloon_yuan/article/details/7837492


    使用STM32的USB功能可以实现HID设备的功能,使用的是ST官方的USB库,在官方的例程上可以进行修改。修改设备描述符、配置描述符、接口描述符、HID描述符、端点描述符、字符串描述符,还有就是HID设备专有的报告描述符,以完成特定功能。

    报告以及报告描述符简介参考:http://www.baiheee.com/Documents/081126/081126115257.htm

    USB HID设备是通过报告来给传送数据的,报告有输入报告和输出报告。输入报告是USB设备发送给主机的,例如USB鼠标将鼠标移动和鼠标点击等信息返回给电脑,键盘将按键数据数据返回给电脑等;输出报告是主机发送给USB设备的,例如键盘上的数字键盘锁定灯和大写字母锁定灯等。报告是一个数据包,里面包含的是所要传送的数据。输入报告是通过中断输入端点输入的,而输出报告有点区别,当没有中断输出端点时,可以通过控制输出端点0发送,当有中断输出端点时,通过中断输出端点发出。 
    而报告描述符,是描述一个报告以及报告里面的数据是用来干什么用的。通过它,USB HOST可以分析出报告里面的数据所表示的意思。它通过控制输入端点0返回,主机使用获取报告描述符命令来获取报告描述符,注意这个请求是发送到接口的,而不是到设备。一个报告描述符可以描述多个报告,不同的报告通过报告ID来识别,报告ID在报告最前面,即第一个字节(设备发送的第一个字节数据为报告ID用于
    让主机识别报告的类型以及使用什么报告描述符来解析这个报告。当报告描述符中没有规定报告ID时,报告中就没有ID字段,开始就是数据。更详细的说明请参看USB HID协议。USB报告描述符可以通过使用HID Descriptor tool来生成,这个工具可以网上下载。 

    具体的描述符如下所示:

    /* USB Standard Device Descriptor */
    const u8 Joystick_DeviceDescriptor[JOYSTICK_SIZ_DEVICE_DESC] =
    {
    	0x12,                       /*bLength */
    	USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/
    	0x00,                       /*bcdUSB */
    	0x02,
    	0x00,                       /*bDeviceClass*/
    	0x00,                       /*bDeviceSubClass*/
    	0x00,                       /*bDeviceProtocol*/
    	0x40,                       /*bMaxPacketSize40*/
    	0x34,                       /*idVendor (0x1234)*/
    	0x12,
    	0x21,                       /*idProduct = 0x4321*/
    	0x44,
    	0x00,                       /*bcdDevice rel. 2.00*/
    	0x02,
    	1,                          /*Index of string descriptor describing manufacturer */
    	2,                          /*Index of string descriptor describing product*/
    	3,                          /*Index of string descriptor describing the device serial number */
    	0x01                        /*bNumConfigurations*/
    }; /* Joystick_DeviceDescriptor */
    
    
    const u8 Joystick_ConfigDescriptor[JOYSTICK_SIZ_CONFIG_DESC] =
    {
    	//ÒÔÏÂΪÅäÖÃÃèÊö·û
    	0x09, /* bLength: Configuation Descriptor size */
    	USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */
    	JOYSTICK_SIZ_CONFIG_DESC,
    	/* wTotalLength: Bytes returned */
    	0x00,
    	0x01,         /*bNumInterfaces: 1 interface*/
    	0x01,         /*bConfigurationValue: Configuration value*/
    	0x00,         /*iConfiguration: Index of string descriptor describing the configuration*/
    	0xC0,         /*bmAttributes: self powered */
    	0x32,         /*MaxPower 100 mA: this current is used for detecting Vbus*/
    
    	//ÒÔÏÂΪ½Ó¿ÚÃèÊö·û
    	/************** Descriptor of Joystick Mouse interface ****************/
    	/* 09 */
    	0x09,         /*bLength: Interface Descriptor size*/
    	USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/
    	0x00,         /*bInterfaceNumber: Number of Interface*/
    	0x00,         /*bAlternateSetting: Alternate setting*/
    	0x02,         /*bNumEndpoints*/
    	0x03,         /*bInterfaceClass: HID*/
    	0x01,         /*bInterfaceSubClass : 1=BOOT, 0=no boot*/
    	0x01,         /*bInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/
    	0,            /*iInterface: Index of string descriptor*/
    
    	//ÒÔÏÂΪHIDÃèÊö·û
    	/******************** Descriptor of Joystick Mouse HID ********************/
    	/* 18 */
    	0x09,         /*bLength: HID Descriptor size*/
    	HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/
    	0x00,         /*bcdHID: HID Class Spec release number*/
    	0x01,
    	0x00,         /*bCountryCode: Hardware target country*/
    	0x01,         /*bNumDescriptors: Number of HID class descriptors to follow*/
    	0x22,         /*bDescriptorType*/
    	JOYSTICK_SIZ_REPORT_DESC,/*wItemLength: Total length of Report descriptor*/
    	0x00,
    
    	//ÒÔÏÂΪÊäÈë¶Ëµã1ÃèÊö·û
    	/******************** Descriptor of Joystick Mouse endpoint ********************/
    	/* 27 */
    	0x07,          /*bLength: Endpoint Descriptor size*/
    	USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/
    	0x81,          /*bEndpointAddress: Endpoint Address (IN)*/
    	0x03,          /*bmAttributes: Interrupt endpoint*/
    	0x0A,          /*wMaxPacketSize: 10 Byte max */
    	0x00,
    	0x20,          /*bInterval: Polling Interval (32 ms)*/
    
    	//ÒÔÏÂΪÊä³ö¶Ëµ«1ÃèÊö·û
    	/* 34 */
    	0x07,          /*bLength: Endpoint Descriptor size*/
    	USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/
    	0x01,          /*bEndpointAddress: Endpoint Address (OUT)*/
    	0x03,          /*bmAttributes: Interrupt endpoint*/
    	0x0A,          /*wMaxPacketSize: 10 Byte max */
    	0x00,
    	0x20,          /*bInterval: Polling Interval (32 ms)*/
    	/* 41 */
    }; /* MOUSE_ConfigDescriptor */
    
    const u8 Joystick_ReportDescriptor[JOYSTICK_SIZ_REPORT_DESC] =
    {
    	/************************USB¼üÅ̲¿·Ö±¨¸æÃèÊö·û**********************/
    	/*******************************************************************/
    	0x05, 0x01, // USAGE_PAGE (Generic Desktop)
    	0x09, 0x06, // USAGE (Keyboard)
    	0xa1, 0x01, // COLLECTION (Application)
    	0x85, 0x01, // Report ID (1)
    	0x05, 0x07, // USAGE_PAGE (Keyboard/Keypad)
    	0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
    	0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
    	0x15, 0x00, // LOGICAL_MINIMUM (0)
    	0x25, 0x01, // LOGICAL_MAXIMUM (1)
    	0x95, 0x08, // REPORT_COUNT (8)
    	0x75, 0x01, // REPORT_SIZE (1)
    	0x81, 0x02, // INPUT (Data,Var,Abs)
    	0x95, 0x01, // REPORT_COUNT (1)
    	0x75, 0x08, // REPORT_SIZE (8)
    	0x81, 0x03, // INPUT (Cnst,Var,Abs)
    	0x95, 0x06, // REPORT_COUNT (6)
    	0x75, 0x08, // REPORT_SIZE (8)
    	0x15, 0x00, // LOGICAL_MINIMUM (0)
    	0x25, 0xFF, // LOGICAL_MAXIMUM (255)
    	0x05, 0x07, // USAGE_PAGE (Keyboard/Keypad)
    	0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
    	0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
    	0x81, 0x00, // INPUT (Data,Ary,Abs)
    	0x25, 0x01, // LOGICAL_MAXIMUM (1) 
    	0x95, 0x05, // REPORT_COUNT (5)
    	0x75, 0x01, // REPORT_SIZE (1)
    	0x05, 0x08, // USAGE_PAGE (LEDs)
    	0x19, 0x01, // USAGE_MINIMUM (Num Lock)
    	0x29, 0x05, // USAGE_MAXIMUM (Kana)
    	0x91, 0x02, // OUTPUT (Data,Var,Abs)
    	0x95, 0x01, // REPORT_COUNT (1)		 
    	0x75, 0x03, // REPORT_SIZE (3)
    	//3¸öbitÀ´´Õ³ÉÒ»×Ö½Ú¡£										
    	0x91, 0x03, // OUTPUT (Cnst,Var,Abs)
    	0xc0,		// END_COLLECTION
    
    	/************************USBÊó±ê²¿·Ö±¨¸æÃèÊö·û**********************/
    	/*******************************************************************/
    	0x05, 0x01, // USAGE_PAGE (Generic Desktop)
    	0x09, 0x02, // USAGE (Mouse)
    	0xa1, 0x01, // COLLECTION (Application)
    	0x85, 0x02, // Report ID (2)
    	0x09, 0x01, // USAGE (Pointer)
    	0xa1, 0x00, // COLLECTION (Physical)
    	0x05, 0x09, // USAGE_PAGE (Button)
    	0x19, 0x01, // USAGE_MINIMUM (Button 1)
    	0x29, 0x03, // USAGE_MAXIMUM (Button 3)						  
    	0x15, 0x00, // LOGICAL_MINIMUM (0)
    	0x25, 0x01, // LOGICAL_MAXIMUM (1)
    	0x95, 0x03, // REPORT_COUNT (3)
    	0x75, 0x01, // REPORT_SIZE (1)
    	0x81, 0x02, // INPUT (Data,Var,Abs)
    	0x95, 0x01, // REPORT_COUNT (1)
    	0x75, 0x05, // REPORT_SIZE (5)
    	0x81, 0x03, // INPUT (Cnst,Var,Abs)
    	0x05, 0x01, // USAGE_PAGE (Generic Desktop)
    	0x09, 0x30, // USAGE (X)
    	0x09, 0x31, // USAGE (Y)
    	0x09, 0x38, // USAGE (Wheel)
    	0x15, 0x81, // LOGICAL_MINIMUM (-127)
    	0x25, 0x7f, // LOGICAL_MAXIMUM (127)
    	0x75, 0x08, // REPORT_SIZE (8)
    	0x95, 0x03, // REPORT_COUNT (3)
    	0x81, 0x06, // INPUT (Data,Var,Rel)
    	0xc0,       // END_COLLECTION
    	0xc0        // END_COLLECTION
    };
    
    /* USB String Descriptors (optional) */
    const u8 Joystick_StringLangID[JOYSTICK_SIZ_STRING_LANGID] =
    {
    	JOYSTICK_SIZ_STRING_LANGID,
    	USB_STRING_DESCRIPTOR_TYPE,
    	0x09,
    	0x04
    }; /* LangID = 0x0409: U.S. English */
    
    const u8 Joystick_StringVendor[JOYSTICK_SIZ_STRING_VENDOR] =
    {
    	JOYSTICK_SIZ_STRING_VENDOR, /* Size of Vendor string */
    	USB_STRING_DESCRIPTOR_TYPE,  /* bDescriptorType*/
    	/* Manufacturer: "STMicroelectronics" */
    	'S', 0, 'T', 0, 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'e', 0,
    	'l', 0, 'e', 0, 'c', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0, 'i', 0,
    	'c', 0, 's', 0
    };
    
    const u8 Joystick_StringProduct[JOYSTICK_SIZ_STRING_PRODUCT] =
    {
    	JOYSTICK_SIZ_STRING_PRODUCT,          /* bLength */
    	USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */
    	'S', 0, 'T', 0, 'M', 0, '3', 0, '2', 0, ' ', 0, 'J', 0,
    	'o', 0, 'y', 0, 's', 0, 't', 0, 'i', 0, 'c', 0, 'k', 0
    };
    
    u8 Joystick_StringSerial[JOYSTICK_SIZ_STRING_SERIAL] =
    {
    	JOYSTICK_SIZ_STRING_SERIAL,           /* bLength */
    	USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */
    	'S', 0, 'T', 0, 'M', 0, '3', 0, '2', 0, '1', 0, '0', 0
    };
    


    下面主要介绍一下上面的几个描述符。下图是各个描述符的类型值。

    1、设备描述符DeviceDesciptor

    2、配置描述符ConfigurationDescriptor

    3、接口描述符InterfaceDescriptor

    4、HID描述符HIDDescriptor

    HID设备专有的描述符,用于配置HID设备的属性和报告描述符的大小。

    5、端点描述符EndpointDescriptor

    端点描述符是用于配置端点号以及端点的输入输出。

    6、报告描述符ReportDescriptor

    报告描述符在前文以及介绍地很详细了,他是HID设备专有的描述符,适用于描述传输的数据的格式,用来告诉主机以什么样的方式来解析从机传过来的数据。

    7、字符串描述符StringDescriptor



    展开全文
  • CH375模拟HID类USB键盘

    2011-08-14 15:17:45
    通过USB接口芯片CH375实现模拟HID类USB键盘,通过CH375的外部固件模式,最大的特点是不需要安装驱动,即插即用,并且可连续发送不同数据,g,h,i,j。可以在txt文本中查看。我改进了上传数据的函数,使得此改变传递...
  • 用于制作Raspberry Pi的程序可模拟键盘/鼠标Bluetooth HID客户端。 先决条件 为了运行该程序,必须更新Raspberry Pi,并且必须安装一些依赖项。 通过克隆存储库并从其根文件夹执行以下命令,可以轻松完成所有这些...
  • 去年做USB模拟键盘时花钱请人开发的USB HID KEYBOARD 码值自动生成器源码。生成后的码值复制到MCU固件中,即可实现USB键盘码值的自动发送,可以自动在PC电脑上输入。 好东西啊
  • hid keyboard device...不过万一出现这些状况不要急撒 开开机输入密码的时候 左下角有一个 键可以调处虚拟键盘 可以用这个键盘输入密码 和修复电脑键盘驱动 整个修复过程只要 鼠标 虚拟键盘  现在开始修复 ...
  • 串口转 HID 键盘鼠标芯片 CH9329

    千次阅读 2019-03-05 09:48:13
    CH9329 是一款串口转标准 USB HID 设备(键盘、鼠标、自定义 HID)芯片,根据不同的工作模式, 在电脑上可被识别为标准的 USB 键盘设备、USB 鼠标设备或自定义 HID 类设备。该芯片接收客户端发送过来的串口数据,...
  • USB描述符包括设备描述符(DeviceDescriptor)、配置描述符(ConfigDescriptor)、HID报告描述符(CustomHID_ReportDescriptor)、字符串描述符。 1.设备描述符--基本固定,不需要怎么修改。一般复合设备和非复合设备要...
  • usb hid gadget模拟鼠标键盘

    万次阅读 热门讨论 2014-11-19 15:34:17
    以下所有的内容我是参考内核文档来的,位置:lichee/linux-3.3/Documentation/usb/gadget_hid.txt 1、修改lichee/linux-3.3/drivers/usb/gadget/hid.c文件 添加内容如下: #include #include ...
  • USB HID键盘----按键代码
  • 旋转编码器通过模拟USB HID键盘将击键发送到主机。 编码器上的每个单槽旋转都会发送一个按键: X轴编码器发送LEFT_ARROW表示逆时针方向,而RIGHT_ARROW表示顺时针方向旋转。 Y轴编码器发送UP_ARROW表示逆时针方向...
  • Raspberry-Pi-Zero-Rubber-Ducky-Duckberry-Pi:10英镑的橡皮小鸭USB HID模拟键盘并自动输入键的USB设备
  • 一个基于Arduino Micro Pro / ATMega32u4的简单外部小键盘模拟HID键盘,旨在与Open Broadcaster Studio(OBS)一起使用。 它有什么作用? 它使用键盘上通常找不到的外部键盘F13-F22进行仿真。 想法是将OBS宏/...
  • 二、USB 鼠标HID更改成键盘HID步骤 1、使用STM32CubeMX生成鼠标HID模版,并且进行修改 2、修改HID的接口描述符与报文描述符 3、修改USBD_HID_Setup函数 4、添加以及修改键盘报文描述符(注意!) 三、调试过程中...
  • 这是一个 Little 小程序,它通过虚拟键盘捕获 MIDI 音符并将其转换为 xwax hid 控制键击。 它需要 libasound2-dev 包进行编译。 gcc -o xwaxm2h xwaxm2h.c -lasound -Wall 在编译之前,您可以在 config.h 文件中...
  • CH552-HID 键盘 鼠标

    2021-02-05 13:57:31
    一、准备 硬件,CH554 EVK ...关于HID键盘和鼠标的定义 通讯格式 程序参考 void HIDValueHandle() { UINT8 i; i = getkey( ); printf( "%c", (UINT8)i ); switch(i) { //鼠标数据上传示例 case 'L':
  • CH552 USB HID键盘

    2021-07-23 13:02:56
    目前正在客制化一个小键盘,计划8月中旬在咸鱼上售卖,功能包括: 1. 蓝牙有线双模,蓝牙5.0(nrf52810),低功耗模式 2. 按键+旋钮 3. 自定义按键,可设置组合键和多媒体键,专用软件设置 4. WS2812灯效
  • STM32 keyboard USB HID键盘功能的实现

    万次阅读 2018-11-11 17:02:05
    参考地址:https://blog.csdn.net/a65135793/article/details/80287250 相关文章 ·1、STM32完成USB_Keyboard的实验总结----...     下面编写下USB键盘的程序,依然在CustomHID工程上修改。 依旧...
  • 1.HID键盘,一个接口,两个端点4(IN)和端点4(OUT)用于PC接收USB设备发送的键值和USB接收PC发送的数据(比如亮大小写和Num Lock的灯)。 2.VCP虚拟串口,两个接口,三个端点,端点1(IN),端点2(IN),端点3(OUT)。 从...
  • STM32实现一个HID键盘

    万次阅读 多人点赞 2019-02-20 16:20:15
    1.HID通信的实现 2.使用USB外设 3.使用HID设备 4.配置时钟 5.USB中断放低点 6.生成代码,替换配置描述符 /* USB HID device Configuration Descriptor */ __ALIGN_BEGIN static uint8_t USBD_HID_...
  • 基于HID协议的串口蓝牙键盘鼠标设计 下载到的资料,资源共享嘛。呵呵。 本论文首先分析和研究了蓝牙核心协议,然后重点分析了基于蓝牙HID高端应用 模式的实现,用软件实现了基于HID协议的HCI、逻辑链路控制适配...
  • 仅通过蓝牙HID将安卓9.0模拟成鼠标和键盘

    万次阅读 多人点赞 2020-04-06 22:27:13
    一直以来就有一种想法,就是自己写一个APP将安卓手机模拟成鼠标/键盘,应急的时候可以用来代替鼠标/键盘。之前也在国内外的网站上找了各种方案,但是这些方案不是很好,直到谷歌发布的API28后终于有了很好的解决方案...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,498
精华内容 999
关键字:

hid模拟键盘