简介

USB HID类是USB设备的一个标准设备类,包括的设备非常多。HID类设备定义它属于人机交互操作的设备,用于控制计算机操作的一些方面,如USB鼠标、USB键盘、USB游戏操纵杆等。但HID设备类不一定要有人机接口,只要符合HID类别规范的设备都是HID设备。
USB HID设备的一个好处就是操作系统自带了HID类的驱动程序,而用户无需去开发驱动程序,只要使用API系统调用即可完成通信。
STM32F1的JoyStickMouse例程用到了端点1用作鼠标数据输入,要改成能双向通信的自定义HID设备就要增加一个端点用于数据输出,本文用端点1为输入,端点2为输出,包长分别为EP1_MAX_TXSIZE,EP2_MAX_RXSIZE字节,下面是具体操作

1.修改USB描述符,增加一个输出端点

设备描述符可以不用改动

/*设备描述符*/
const uint8_t Joystick_DeviceDescriptor[JOYSTICK_SIZ_DEVICE_DESC] ={0x12,                       /*bLength */                       /*USB设备描述符的长度 固定为12H*/USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/                   /*USB设备描述符的类型值 固定为01H*/0x00,                       /*bcdUSB */                          /*USB版本号*/0x02,                                                                                             /*bcdUSB = 2.00*/0x00,                       /*bDeviceClass*/              /*USB所遵循的标准设备类。0表示设备的接口相互独立,分别属于不同的设备类;1~FEH之间表示USB协议中定义的某个类。03H表示HID类,02H表示CDC类。FFH表示供应商自定义的设备类*/0x00,                       /*bDeviceSubClass*/              /*USB设备所属的标准设备子类 bDeviceClass为0时,该值为0;该值为FFH时,表示供应商自定义的设备子类*/0x00,                       /*bDeviceProtocol*/                   /*采用的设备类协议。该值为FFH时表示设备类协议由供应商自定义*/0x40,                       /*bMaxPacketSize 64*/         /*端点0所支持最大数据包长度(字节),低速为8,全速为8,16,32或64,高速为64*/0x83,                       /*idVendor (0x0483)*/          /*VID*/0x04,0x50,                       /*idProduct = 0x5750*/         /*PID*/0x57,0x00,                       /*bcdDevice rel. 2.00*/ /*设备版本号*/0x02,1,                          /*Index of string descriptor describingmanufacturer */2,                          /*Index of string descriptor describingproduct*/3,                          /*Index of string descriptor describing thedevice serial number */0x01                        /*bNumConfigurations*/    /*USB设备所支持的配置数*/};

下面我们需要把接口描述符的端点数量改为2,然后添加一个端点描述符用于接收数据,再修改描述符数组长度JOYSTICK_SIZ_CONFIG_DESC

 /*配置描述符*/
/*   All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */
const uint8_t Joystick_ConfigDescriptor[JOYSTICK_SIZ_CONFIG_DESC] ={0x09, /* bLength*/                                         /*描述符的长度*/USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType*/       /*USB设备描述符的类型值 固定为02H*/JOYSTICK_SIZ_CONFIG_DESC,    /* wTotalLength*/               /*配置描述符的总长*/0x00,0x01,         /*bNumInterfaces*/                           /*此配置所支持的接口个数*/0x01,         /*bConfigurationValue*/0x00,         /*iConfiguration*/            0xC0,         /*bmAttributes: Self powered */0x32,         /*MaxPower 100mA*//**************接口描述符***************//* 09 */0x09,         /*bLength*/USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType*/ /*USB接口描述符的类型值 固定为04H*/0x00,         /*bInterfaceNumber*/                   /*接口号*/0x00,         /*bAlternateSetting*/                  /*可选设置的索引值*/0x02,         /*bNumEndpoints*/                     /*此接口用的端点数量,由1改为2,端点0不算在内*/0x03,         /*bInterfaceClass*/                  /*HID*/0x00,         /*bInterfaceSubClass : 1=BOOT, 0=no boot*/0x00,         /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/0,            /*iInterface: Index of string descriptor*/  /*******************HID描述符******************//* 18 */0x09,         /*bLength: HID Descriptor size*/HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/            /*USB HID描述符的类型值 固定为21H*/0x10,         /*bcdHID*/                               /*HID版本号*/0x01,0x00,         /*bCountryCode*/                           /*HID设备国家/地区代码*/0x01,         /*bNumDescriptors*/0x22,         /*bDescriptorType*/                                                                                          JOYSTICK_SIZ_REPORT_DESC,/*wItemLength*/            /*HID报告描述符长度,改成修改后的的HID报告描述符长度*/0x00,/*****************端点描述符********************//* 27 */0x07,          /*bLength*/USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/    /*USB端点描述符的类型值 固定为05H*/0x81,          /*bEndpointAddress*/                  /*端点地址及输入输出属性*//*bit7: 输入=1,输出=0;bit0,1,2,3:端点号*/0x03,          /*bmAttributes*/                        /*端点的传输类型属性 bit0~1   00=控制传输、01=同步传输、10=批量传输、11=中断传输*/EP1_MAX_TXSIZE,/*wMaxPacketSize*/                 /*端点收、发的最大包大小,这里改成需要的大小*/0x00,0x1,          /*bInterval*/                            /*定义了该端点被主机的访问周期,此域值对于批量传输和控制传输毫无意义。*//* 34 *//*在这里添加一个新的端点描述符用于接收主机输出的数据*/                                                                                                                      0x07,          /*bLength*/USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/                        0x02,          /*bEndpointAddress*/                     /*端点2 输出*/0x03,          /*bmAttributes*/                           /*中断传输*/EP2_MAX_RXSIZE,        /*wMaxPacketSize*/               /*端点收、发的最大包大小*/0x00,0x1,          /*bInterval*/                                                                                                                                                 /*41*/};

然后修改HID报告描述符,用HID Descriptor Tool生成一个就行,改了这个主机就不会把usb设备识别为鼠标了

const uint8_t Joystick_ReportDescriptor[JOYSTICK_SIZ_REPORT_DESC] ={0x05, 0x8c,                         /* USAGE_PAGE (ST Page) */ 0x09, 0x01,                  /* USAGE (Demo Kit) */ 0xa1, 0x01,                      /* COLLECTION (Application) */ // The Input report 0x09,0x03,                       // USAGE ID - Vendor defined 0x15,0x00,                         // LOGICAL_MINIMUM (0) 0x26,0x00, 0xFF,         // LOGICAL_MAXIMUM (255) 0x75,0x08,                         // REPORT_SIZE (8bit) 0x95,EP1_MAX_TXSIZE,  // REPORT_COUNT (4Byte) 0x91,0x02,                      // INtPUT (Data,Var,Abs) // The Output report 0x09,0x04,                        // USAGE ID - Vendor defined 0x15,0x00,                     // LOGICAL_MINIMUM (0) 0x26,0x00,0xFF,          // LOGICAL_MAXIMUM (255) 0x75,0x08,                         // REPORT_SIZE (8bit) 0x95,EP2_MAX_RXSIZE,  // REPORT_COUNT (4Byte) 0x81,0x02,                      // OUTPUT (Data,Var,Abs) 0xc0                                       /* END_COLLECTION */

2.在Joystick_Reset函数中添加端点2初始化代码

 /* Initialize Endpoint 2 */SetEPType(ENDP2, EP_INTERRUPT);                  //端点2为中断端点                                                                  SetEPRxAddr(ENDP2, ENDP2_RXADDR);               //设置接收缓冲区地址SetEPRxCount(ENDP2, EP2_MAX_RXSIZE);         //每次接收EP2_MAX_RXSIZE个字节SetEPRxStatus(ENDP2, EP_RX_VALID);

3.编写端点2的输出回调函数

首先在usb_conf.h文件中把端点数设置为3,然后设置设置端点2接收缓冲区基地址


删除 #define EP2_OUT_Callback NOP_Process 一行

在usb_endp.c中编写端点2输出回调函数
先从缓冲区中读取主机发过来的数据,再把端点2状态设置为VALID

void EP2_OUT_Callback(void)
{u8 *buff;                                                  buff=(u8*)mymalloc(EP2_MAX_RXSIZE);PMAToUserBufferCopy(buff,ENDP2_RXADDR, EP2_MAX_RXSIZE);//从接收缓冲区中读取EP2_MAX_RXSIZE字节数据SetEPRxStatus(ENDP2, EP_RX_VALID);for(u8 i=0;i<EP2_MAX_RXSIZE;i++){printf("RxBuff[%d]=0x%x\n",i,buff[i]);}
}

再修改一下Joystick_Send函数

void Joystick_Send(u8 *buffer,u8 size)
{if(size>EP1_MAX_TXSIZE){return;}/* Copy mouse position info in ENDP1 Tx Packet Memory Area*/USB_SIL_Write(EP1_IN,buffer, EP1_MAX_TXSIZE); /* Enable endpoint for transmission */SetEPTxValid(ENDP1);
}

到这里,修改工作差不多就完成了,下面是收发数据测试

4.完成

主机接收到自定义HID设备发来的数据

用串口打印出收到的数据

STM32的USB例程JoyStickMouse改成自定义HID设备相关推荐

  1. STM32的USB例程JoyStickMouse代码分析

    https://blog.csdn.net/niepangu/article/details/45081081 本帖最后由 追风 于 2010-12-4 17:30 编辑 一.USB的"Jo ...

  2. Android 9.0 10.0 USB鼠标右键改成返回键

    1.概述 在10.0系统Tv设备开发中,USB鼠标通过usb口来控制设备也是常见的问题,可是原生的系统 鼠标右键不是返回键 根据客户需要修改成右键就需要跟代码了, 功能分析: InputReader ...

  3. USB自定义HID设备实现-STM32

    该文档使用USB固件库,在其基础上进行了自己的定制,完成了一个USB-HID设备,首先是usb_desc.c文件,里面存放了usb各种描述符的存在 #include "usb_desc.h& ...

  4. STM32配置CH375B成HID Host模式读取自定义HID设备的数据 ——STM32端口初始化

    最近产品需要一个USB主机测试治具,所以需要做一个USB HOST去读取HID设备的数据,由于以前也没做过USB方面的项目,对这一块也不是很熟悉,因此遇到了很多困难,所幸的是经过两天半的努力,最终完成 ...

  5. STM32 USB复合设备,USB键盘+自定义HID设备

    上面是我的微信和QQ群,欢迎新朋友的加入. 最近研究USB复合设备 主要是把键盘和电脑音量控制两个东西给合并成一个设备 首先要知道的一点的是,不论是键盘.鼠标.或者这个标准的HID用户控制设备,本质都 ...

  6. USB自定义HID设备实现-LPC1768

    首先在之前鼠标的基础上修改设备描述符 #include "usbdesc.h" //usb标准设备描述符 const U8 USB_DeviceDescriptor[] = { U ...

  7. STM32配置CH375B成HID Host模式读取自定义HID设备的数据 ——STM32配置CH375B接口函数

    接着上一篇上传,这个是STM32配置CH375B时用到的接口函数 头文件: #ifndef __BSP_CH375_H__ #define __BSP_CH375_H__#include " ...

  8. stm32——自定义HID设备

    一.开发环境 硬件平台:stm32f767 软件平台:keil5,cubmx 二.cubemx创建工程 1.配置RCC 2.USB_OTG_FS,选择Device_Only模式 3.Middlewar ...

  9. stm32f103 usb 修改成自定义复合设备教程

    单片机型号   STM32F103C8T6 软件  KEIL5 将现有的 HID设备  改成  有HID设备和 鼠标(或者键盘)的复合设备 HID设备  使用端点1和端点2 键盘 (或者鼠标)使用端点 ...

最新文章

  1. C_Imap 邮件的imap
  2. Pycharm安装pip pip安装第三方模块
  3. VHDL+Verilog良好的代码编写风格(转载)
  4. 一招让你彻底掌握C语言中运用宏以及#与##的妙用
  5. Value Investment
  6. 机器学习实战之logistic回归分类
  7. java实现map和object互转
  8. MySQL 基础 ———— 连接查询
  9. 【转载】早点长大的飞秋
  10. Redis工作笔记-Set类型
  11. Java NIO零拷贝
  12. (92)如何解决信号高扇出问题,例如复位信号
  13. Odoo10参考系列--Odoo指导方针
  14. 【mysql】在Linux中通过yum安装MySQL数据库,可以实现远程登录数据库
  15. 在java中关于封装性的说法中错误的是_java题库2
  16. Let 's watch TV
  17. 软件工程--概要设计
  18. 微信小程序英语学习平台+后台管理系统
  19. 二进制转十进制c++语言数组,C++实现读入二进制数并转换为十进制输出
  20. 攻防世界Web新手区题解(超详细)

热门文章

  1. 初学Springboot使用MyBatis-Plus出现Invalid bound statement (not found)的解决
  2. Java项目使用Redis缓存数据
  3. navicat,mysql导出er图,ER图
  4. php session 超时设置,php如何使用session 超时设置?
  5. 解读Datasheet系列:W25Q80DV(华邦 SPI Flash)
  6. web前端期末大作业——餐品后台管理系统(html+css+javascript)
  7. Dreamweaver 1 网页制作
  8. Matlab绘制垂直的直线图
  9. 若依框架---分页功能
  10. windows server2012无法安装IIS,提示:安装一个或多个角色、角色服务或功能失败