STM32的USB例程JoyStickMouse改成自定义HID设备
简介
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设备相关推荐
- STM32的USB例程JoyStickMouse代码分析
https://blog.csdn.net/niepangu/article/details/45081081 本帖最后由 追风 于 2010-12-4 17:30 编辑 一.USB的"Jo ...
- Android 9.0 10.0 USB鼠标右键改成返回键
1.概述 在10.0系统Tv设备开发中,USB鼠标通过usb口来控制设备也是常见的问题,可是原生的系统 鼠标右键不是返回键 根据客户需要修改成右键就需要跟代码了, 功能分析: InputReader ...
- USB自定义HID设备实现-STM32
该文档使用USB固件库,在其基础上进行了自己的定制,完成了一个USB-HID设备,首先是usb_desc.c文件,里面存放了usb各种描述符的存在 #include "usb_desc.h& ...
- STM32配置CH375B成HID Host模式读取自定义HID设备的数据 ——STM32端口初始化
最近产品需要一个USB主机测试治具,所以需要做一个USB HOST去读取HID设备的数据,由于以前也没做过USB方面的项目,对这一块也不是很熟悉,因此遇到了很多困难,所幸的是经过两天半的努力,最终完成 ...
- STM32 USB复合设备,USB键盘+自定义HID设备
上面是我的微信和QQ群,欢迎新朋友的加入. 最近研究USB复合设备 主要是把键盘和电脑音量控制两个东西给合并成一个设备 首先要知道的一点的是,不论是键盘.鼠标.或者这个标准的HID用户控制设备,本质都 ...
- USB自定义HID设备实现-LPC1768
首先在之前鼠标的基础上修改设备描述符 #include "usbdesc.h" //usb标准设备描述符 const U8 USB_DeviceDescriptor[] = { U ...
- STM32配置CH375B成HID Host模式读取自定义HID设备的数据 ——STM32配置CH375B接口函数
接着上一篇上传,这个是STM32配置CH375B时用到的接口函数 头文件: #ifndef __BSP_CH375_H__ #define __BSP_CH375_H__#include " ...
- stm32——自定义HID设备
一.开发环境 硬件平台:stm32f767 软件平台:keil5,cubmx 二.cubemx创建工程 1.配置RCC 2.USB_OTG_FS,选择Device_Only模式 3.Middlewar ...
- stm32f103 usb 修改成自定义复合设备教程
单片机型号 STM32F103C8T6 软件 KEIL5 将现有的 HID设备 改成 有HID设备和 鼠标(或者键盘)的复合设备 HID设备 使用端点1和端点2 键盘 (或者鼠标)使用端点 ...
最新文章
- C_Imap 邮件的imap
- Pycharm安装pip pip安装第三方模块
- VHDL+Verilog良好的代码编写风格(转载)
- 一招让你彻底掌握C语言中运用宏以及#与##的妙用
- Value Investment
- 机器学习实战之logistic回归分类
- java实现map和object互转
- MySQL 基础 ———— 连接查询
- 【转载】早点长大的飞秋
- Redis工作笔记-Set类型
- Java NIO零拷贝
- (92)如何解决信号高扇出问题,例如复位信号
- Odoo10参考系列--Odoo指导方针
- 【mysql】在Linux中通过yum安装MySQL数据库,可以实现远程登录数据库
- 在java中关于封装性的说法中错误的是_java题库2
- Let 's watch TV
- 软件工程--概要设计
- 微信小程序英语学习平台+后台管理系统
- 二进制转十进制c++语言数组,C++实现读入二进制数并转换为十进制输出
- 攻防世界Web新手区题解(超详细)
热门文章
- 初学Springboot使用MyBatis-Plus出现Invalid bound statement (not found)的解决
- Java项目使用Redis缓存数据
- navicat,mysql导出er图,ER图
- php session 超时设置,php如何使用session 超时设置?
- 解读Datasheet系列:W25Q80DV(华邦 SPI Flash)
- web前端期末大作业——餐品后台管理系统(html+css+javascript)
- Dreamweaver 1 网页制作
- Matlab绘制垂直的直线图
- 若依框架---分页功能
- windows server2012无法安装IIS,提示:安装一个或多个角色、角色服务或功能失败