本帖最后由 liao_122 于 2023-8-10 09:49 编辑
#申请原创# 国民技术例程有单独的HID和单独的虚拟串口例程,但没合并的
现在准备在虚拟串口例程的基础上增加HID
1.添加端点
虚拟串口用了3个端点,HID使用一个端点 ,所以增加一个端点4,在usb_conf.h 中添加端点4及对应的地址, USB地址使用区间加在一起不可超过512字节即0x200
2.修改EP_NUM = 最后一端点数+1
3.在 usb_endp.c 中加入HID使用到的端点处理函数,加入后要注释掉 usb_conf.h
中的同样的名字的 callback,以便中断执行时可以执行到需要的功能。
4.修改描述符
由于有两个接口需加入IAD
何为IAD:
接口关联描述符 (Interface Association Descriptor)(IAD),简称IAD,用于描述与同一功能相关联的两个或多个接口。具体IAD介绍自行百度
修改Virtual_Com_Port_DeviceDescriptor[] ,使用IAD,
设备描述符字段 必需的值
bDeviceClass:0xEF
bDeviceSubClass:0x02
bDeviceProtocol:0x01
将 端点数量 bNumInterfaces: 改为3 (共3个接口 CDC 2个 HID一个*)
将第一个IAD加在虚拟串口接口描述符前,
将第二个IAD加在末尾,从HID接口描述符开始 复制到第二个IAD后面,同时将端点修改为端点4,
将HID接口描述符的接口索引 bInterfaceNumber 改为0x02, 从0开始算,HID在02
由于描述符增加HID的多一下,根据增加字节,将VIRTUAL_COM_PORT_SIZ_CONFIG_DESC 值改为115
图
将HID报告描述符全部复制过来,CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] 到usb_desc.c
修改Virtual_Com_Port_Reset() 函数并入CustomHID_Reset()部分端口4的设置
修改Virtual_Com_Port_Data_Setup()函数 并入对应CustomHID_Data_Setup()部分
修改Virtual_Com_Port_NoData_Setup()函数并入CustomHID_NoData_Setup部分
将CustomHID_SetReport_Feature() ,CustomHID_GetReportDescriptor(),CustomHID_GetHIDDescriptor(),CustomHID_SetProtocol(),CustomHID_GetProtocolValue() 拷入到usb_prop.c文件
这几个就不放图了
在usb_prop.c 开始部分拷入CustomHID_Report_Descriptor 和CustomHID_Hid_Descriptor 定义
修改HID描述符定位,将CustomHID_ConfigDescriptor 替换为Virtual_Com_Port_ConfigDescriptor,
在usb.desc.h 中拷入缺失宏定义,和声明,CUSTOMHID_OFF_HID_DESC 改为0x38 (描述符改了,偏移变化了)
修改hw_config.c 拷入Cfg_KeyIO()函数
修改main函数调用Cfg_KeyIO();加入修改HID键值的发送,将端口改为EP4_IN,(由PC7改为了PA4发送)
其他一些缺失声明和变量定义自行拷到对应地方,
至此,合并完成,下载,串口收发数据,发键值,如图
附件为源码
|