HID Firmware修改 (HIDtoUARTExample)之一

参考示例位置:D:\Yifei\Project_Reference\F340_Inforamtion\F340_HID

内有修改文档记录

1.   描述符的修改:

       1.1 配置描述符的修改:

              在配置描述符下的HID描述符中修改HID report描述符的字节大小。修改值改成自己编写的HID report描述符的字节数。

 

       1.2 在配置描述符下的端点描述符中指定使用的端点、类型(输入、输出)及端点的数据长度。

 

       1.3 HID report描述符中定义自己的报告(难)

              上例中分别定义了输入报告(device发送数据给PC)和输出报告(PC发送数据给device)。

              每个报告的REPORT_COUNT项定义每发一次次报告中含有多少个数据(最大不能超过63HID协议每个报告最多64byteREPORT ID也是一个数据,所以最大值为63)。

              每个报告的REPORT SIZE项定义,报告中每个数据的有效位数,如是以byte为单位则这里的值应为8

 

2.   数据发送与接收

       2.1 数据处理修改地方总结

              各单片机有自己的USB处理示例,底层USB ISE的设置、各中断的控制均已提供相关处理函数,所以不必深究底层USB的控制。只要找到数据发送、接收相关的上层函数,并对其内部做相应修改即可。以silicon F340 HIDtoUART示例来说,HID数据发送、接收是在ReportHandler.c文件中。

       2.2 修改地方细节描述

       HID示例中,数据发送与接收是通过调用VectorTableEntry结构体的输入实例对象(IN_VECTORTABLE)和输出实例对象(OUT_VECTORTABLE)的报告处理函数来完成的。

       调用结构体对象的函数是在F3xx_USB0_ReportHandler.c文件里的

       void ReportHandler_IN_ISR(unsigned charR_ID)

       void ReportHandler_OUT(unsigned charR_ID)

       两个函数中完成的

       这两个函数被在USB0_InterruptServiceRoutione.c文件里的底层函数所调用,想了解该芯片USB如何工作可以分析这个文件中的函数工作流程。

 

       上述的voidReportHandler_IN_ISR(unsigned char R_ID)voidReportHandler_OUT(unsigned char R_ID)两个函数不需要修改,分析其内部函数中的内容可见,这两个函数是通过比对ReportID然后调用对应的上层report处理函数来完成数据发送、接收的。在这个示例中,silicon的工程师采用一个自定义的结构体(VectorTableEntry),将ReportIDReport处理函数关联起来.

       IN_VECTORTABLEOUT_VECTORTABLE分别是VectorTableEntry结构体数组,数组个数对应着report描述符中自己定义的report个数。IN_VECTORTABLESizeOUT_VECTORTABLESize宏定义与之对应。

      

       图片示例已经是我自己修改过的,原示例中输入、输出还分别多一个control reportID和处理函数。

 

       前面讲到,底层如何工作及调用相关的函数我们可以不用细究,主要找到数据输入、输出的处理函数即可,本例中输入函数就是IN_Data,输出函数就是OUT_Data。(找寻的方法如前面分析)

       Silicon Lab的示例中,就是更改F3xx_USB0_ReportHandler.c文件里的:

       void IN_Data(void)

       void OUT_Data(void)

       两个函数,这两个函数就是处理要发送的数据和接收到的数据。

       我修改完后的函数如下:

       对比原示例可以了解加深理解。

 

       注意OUT_Data并不是数据发送函数,IN_Data也不是数据接收函数。在应用中我们要根据自己的要求在相应位置发送数据和对接收到的数据进行处理。

一般来说,下位机中数据接收没有单独的函数,这是由USB的传输方式决定的,USB的读写都是由主机发起,从机只是应答,所以下位机中接收数据,由底层硬件的ISE自动完成,然后产生中断,一般示例程序中的USB中断处理函数都会将数据取出,放置到对应的接收buffer中,如本示例Out_Data函数中的OUT_PACKET。所以主要是要找到中断处理接收到数据放置的buffer及该buffer的处理函数(如OUT_PACKET),然后再对接收到数据按自己要求处理与main函数联系起来即可。

      下位机的数据发送一般会有单独的函数,也有对应的发送数据buffer。本例中是SendPacket函数。按示例描述仔细读示例程序,寻找数据发送函数不难。本例中自己修改如下所示,对比原示例可加深理解。

       在HIDtoUart示例中,还将F3xx_USB0_ReportHandler.c中的const VectorTableEntryIN_VECTORTABLE[IN_VECTORTABLESize]做了修改,将IN_VECTORTABLESize由2改到了1,即发送和接收各只要一个report,之前的例子里发送和接收分别有control和data两个report。

 

3.   连续读写时,去掉示例中uart部分后,在中断处理部分还要修改一处:

即将读取到的数据取出后,要把标志位清零。

 

4.   传输buffer大小的修改:

       除了1中所含在描述符定义中修改buffer尺寸大小,还要注意在ReportHandler.c文件下的这两个函数中注意修改buffer尺寸

 

 

 


5. PID & VID的修改



STM32F103C8 Serial(UART) to USB HID Keyboard Mouse Joystick 串口 转 USB键盘;鼠标;手柄 (1) 使用Composite Device 组合(复合)设备 (1.1) 1个Device -> 1个 Configuation -> 3个Interfance (Keyboard & Mouse & Joystick) (1.2) 支持BIOS模式中的操作(使用HID boot模式) 以便兼容在计算器中设定BIOS : (1.2.1) Keyboard Interfance -> HID (boot mode) -> 2个Endpoint(IN_0x81 & OUT_0x01) -> KeyboardReportDescriptor(不使用Report ID) (1.2.2) Mouse Interfance -> HID (boot mode) -> 1个Endpoint(IN_0x82) -> MouseReportDescriptor(不使用Report ID) (1.3) 支持Windows模式中的操作(使用Report ID) : (1.3.1) Multimedia Keyboard Interfance -> HID -> 1个Endpoint(IN_0x85) -> KeyboardReportDescriptor(使用Report ID) (1.3.1.1) Report ID (1) : HID Usage Page 0x0C, MediaKey (1.3.1.2) Report ID (2) : HID Usage Page 0x01, PowerControl (1.3.2) Mouse Interfance -> HID (boot mode) -> 1个Endpoint(IN_0x84) -> MouseReportDescriptor(使用Report ID) (1.3.2.1) Report ID (1) : 相对坐标 (-32768 ~ 32767) (1.3.2.2) Report ID (2) : 绝对坐标 (0 ~ 2048) (1.4) 支持反馈Keyboard_LED灯号: All Off; Num Lock; Caps Lock; Scroll Lock; Compose; Kana (1.5) Joystick Interfance -> HID -> 1个Endpoint(IN_0x83) -> JoyStickReportDescriptor (1.7) 支持GPIO命令, 可控制 12个GPIO 0/1 (hi/low)输出 (1.8) 支持Hardware或Software 插拔(Connect/Disconnect)命令 (1.9) 支持Software Reset命令 (2) 串口接收 命令 (2.1) UART协议: 115200, n, 8, 1 (2.2) 1帧发送字符串格式, 以 '{'开始, '}'结束 ','分隔 共10个10进制数字 例如: {1,2,3,4,5,6,7,8,9,10} (2.3) 第1位 区分 Keyboard(128) 或是 Mouse(64) 或是 Joystick(32) 或是 Control(32) 命令 Control_cmd = 0x10, Joystick_cmd = 0x20, Mouse_cmd = 0x40, MouseHold_cmd = 0x41, AbsMouse_cmd = 0x42, AbsMouseHold_cmd= 0x43, Keyboard_cmd = 0x80, KeyboardHold_cmd= 0x81, MediaKey_cmd = 0x82, MediaKeyHold_cmd= 0x83, Switch_cmd = 0xC0, SwitchHold_cmd = 0xC1 例如: {16, 0,0,0,0,0,0,0,0} --- 发送Control命令 {32, 0,0,0,0,0,0,0,0} --- 发送Joystick命令 {64, 0,0,0,0,0,0,0,0} --- 发送Mouse命令(相对坐标) {65, 0,0,0,0,0,0,0,0} --- 发送Mouse命令(相对坐标)(按住不放) {66, 0,0,0,0,0,0,0,0} --- 发送WinMouse命令(相对坐标/绝对坐标) {67, 0,0,0,0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值