【极海APM32F407 Tiny Board】+2.浅跑个HS HID例程
[复制链接]
本帖最后由 superw 于 2023-6-5 10:17 编辑
本篇将在APM32F407 Tiny Board上跑一下官方SDK里面提供的设备端OTGD_HID_HS2例程,并对例程里面程序执行流程进行简要分析,后续将在该例程上修改,进一步实现一个HID+UAC功能的USB声卡设备。因为APM32F407 Tiny Board上默认预留出来的Type-A和Type-C口都是接到PB14、PB15引脚上,属于OTG HS的差分信号引脚,也可以外接USB接口到PA11、PA12上使用OTG FS差分信号引脚,对应SDK中例程是OTGD_HID、OTGD_HID_Keyboard,使用OTG FS全速接口。
OTGD_HID_HS2例程模拟了一个高速HS HID鼠标,插入PC后,可在设备管理器下看到新增一个HID鼠标设备。对于main函数部分,首先需要注意的是USB_DeviceInit()函数,包括了对USB OTG HS外设寄存器配置,IO配置,设备描述符,配置描述符,字符串描述符,HID类回调函数的声明等等。
USB_DeviceInit()前面是一些老生常谈的用法,对APM32F407 Tiny Board板上串口1,按键外设进行初始化。而USB_DeviceInit()函数里面定义了该USB接口的速度USBD_SPEED_HS、该USB设备的描述符USBD_DESC_HS、该USB设备的HID类操作函数USBD_HID_CLASS、该USB设备当前状态(复位、挂起、连接等等)USB_DevUserHandler,最后将这些在USBD_Init中都赋值给gUsbDeviceHS。这里USB接口速度对于设备端device,可支持高速HS、全速FS;对于主机端host,可支持高速HS、全速FS、低速LS。
通过最后的USBD_HardwareInit初始化USB OTG HS硬件层寄存器、IO接口、开启USB中断等等。再之后对于一个USB设备最重要的过程:枚举,也就是控制传输阶段,主要在中断函数中进行。
对于该中断服务函数USBD_OTG_IsrHandler,其每个中断代表的意思在注释和应用手册27.10.6高速OTG模块中断寄存器中有详细解释,这里不做过多讲解。枚举过程主要在USBD_OutEndpointIsrHandler中进行。
USBD_OutEndpointIsrHandler通过判断当前端点0状态,进一步判断是否是控制传输阶段
最后进入USBD_SetupStage函数中,通过recipient、reqType得到USB请求中的bmRequest字节,通过request获取USB请求中的bRequest字节,通过reqWvalue获取USB请求中的wValue值,该值占两个字节,低字节在前,高字节在后,通过reqWLength获取USB请求中的wLength值,也可以根据该方法获取USB请求中的wIndex值。
下面则通过USB请求判断当前请求的接收者为设备、接口、端点等,当前USB请求属于标准请求、类请求、厂商自定义请求等,当前请求代码是获取描述符、设置地址、设置配置等等。具体实现过程可通过printf+USB分析仪双向验证分析,下面为该OTGD_HID_HS2例程通过USB口插到电脑上,并通过USB分析仪抓到的包。这里有个疑问,正常情况下,我复位芯片后,抓包上应该是复位,然后获取描述符请求,但是抓这个包复位后,跟了三条A3 00 00 00 02 00 04 00,23 01 14 00 02 00 00 00,A3 00 00 00 02 00 04 00请求,不太明白这里是什么原因。
字符串描述符第一个对应序列号字符串描述符,第二个对应语言ID字符串描述符,第三个对应产品字符串描述符,这些描述符均与usbd_descriptor.c文件下所设置描述符一致。
此部分设置完当前HID设备的配置值之后,获取HID描述符,与usbd_descriptor.c文件下所设置描述符一致。
至此,整个HID设备枚举过程结束。设备管理器下可看到多出一个HID 鼠标设备。
测试系统为win11,系统识别出来的HID鼠标,其VID为314B,PID为03E9,均与程序中所设置一样。
最后,关于应用层代码USB_DevUserApplication主要实现了一个通过板上两个按键控制鼠标左右移动的过程。其中涉及到报表描述符的上传过程,可自行根据USB官方协议文档并结合抓包过程学习。
此为鼠标右移过程通过USB口上传给host的报表描述符。
此为鼠标左移过程通过USB口上传给host的报表描述符。
|