USB使用Set Report和Get Report的实现

=============转载著名出处=============

图片看不清的,将图片在独立窗口打开。

首先,从协议中截取这两个标准请求的结构:

Get Report

image.png

Set Report

image.png

以CH554EVT中的CompatibilityHID.C例程为例,处理USB请求的部分:

image.png

因为是HID class特有的请求,所以会放在非标准请求中处理,例程已经将两个请求的case写在代码里面了,此时芯片能够正确应答请求。


其中Get Report的数据阶段方向是Device->Host,所以代码上的实现和标准请求中设备、配置描述符的上传一样,将pDsecr指针指向需要传输的数据,正确的给len赋值长度即可。


Set Report的数据阶段方向是Host->Device,可以看到case 0x09中没有任何实质性的处理,因为OUT事务,作为设备只有等着主机下发,只要我们确保芯片对于EP0上的OUT事务响应状态为ACK就好。

真正处理Set Report的数据阶段在EP0的OUT事务完成中断中:

image.png

可以看到程序默认这个case里面有一些东西,我们只关注框中的if条件。因为所有EP0上的OUT事务,都会进入这里,所以需要加一下判断,当前进入这个case是属于Set Report请求的数据阶段。通过判断SetupReq这个全局变量,看一下定义和使用,不难理清他的工作原理。

此时USB_RX_LEN寄存器的值代表数据阶段的数据长度,数据本身存放在Ep0Buffer数组中,按照长度读取出来就可以了。


只有登录才能回复,可以选择微信账号登录