HID Firmware修改 (HIDtoUARTExample)

来源:互联网 发布:淘宝面具 编辑:程序博客网 时间:2024/06/06 23:55

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尺寸

 

 

 

0 0
原创粉丝点击