使用 CH567 USB 键盘增加支持 HID_SETREPORT
本帖最后由 Zoologist 于 2022-2-26 09:53 编辑从插入USB 键盘开始抓取数据,按笔记本键盘上的按键,测试 Num 从灭到亮,再到灭;测试 Caps 从灭到亮,再到灭。其中的 SET_REPORT 有三个:
1. 是刚插入的时候系统用来通知键盘,告知当前三个 LED 状态的;2. 是NUMLED 从灭到亮,再到灭的动作;3. 是CAPSLED 从灭到亮,再到灭的动作;首先刷上之前的键盘固件,使用逻辑分析仪分析,可以看到,我们之前的设备没有处理SET_REPORT所以会用 STALL 回复:
因此,我们需要响应这个命令。下面是正常情况下,对于一个 SET_REPORT 的通讯:
此外,测试了按USB键盘 CAPS LOCK按键,让灯从灭到亮再灭的过程。可以看出,USB键盘通知系统当前有 CAPS LOCK按键,然后系统再通过 HID_REPORT通知当USB键盘前应该的灯状态来实现的。file:///C:/Users/yanbwang/AppData/Local/Temp/msohtmlclip1/01/clip_image008.png
1. 首先在USB1Dev_EDP0_Setup_Deal函数中运行处理 Setup包的代码// 处理 HID_SET_REPORT
if ((UsbSetupBuf->bRequestType==0x21)&&(SetupReqCode==HID_SET_REPORT))
{
CurrentRequest=HID_SET_REPORT;
printf("SETUP HID_SET_REPORT");
return;
}
2. 接下来在USB1Dev_EDP0_OUT_Deal函数中处理 Endpoint0 OUT 数据 if (CurrentRequest==HID_SET_REPORT)
{
printf("EDP0_OUT HID_SET_REPORT:");
for (i=0; i<len; i++)
{
printf("%X ",UsbEp1OUTBuf);
}
printf("\n");
}
3. 最后在USB1Dev_EDP0_IN_Deal函数中发送0字节 Package
if (CurrentRequest==HID_SET_REPORT)
{
R16_UEP0_T_LEN1 = 0;
R8_UEP0_TX_CTRL1 = UEP_DATA1 | UEP_T_RES_ACK;
printf("EDP0_IN HID_SET_REPORT\n");
CurrentRequest=0;
return;
}
file:///C:/Users/yanbwang/AppData/Local/Temp/msohtmlclip1/01/clip_image009.png最终成功的代码:
file:///C:/Users/yanbwang/AppData/Local/Temp/msohtmlclip1/01/clip_image011.png完整的代码:
file:///C:/Users/yanbwang/AppData/Local/Temp/msohtmlclip1/01/clip_image013.png
页:
[1]