硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6356|回复: 5
收起左侧

[有问必答] Gd32模拟hid键盘,第一次上电时进入了set report中断,但是读不到数据

[复制链接]

14

主题

31

回帖

73

积分

初级会员

积分
73
发表于 2021-3-25 18:22:30 | 显示全部楼层 |阅读模式
各位大神,Gd32f103模拟键盘,想要通过pc端发送的指令控制键盘的指示灯,但是第一次上电时读取不了Pc端发送的set report里的内容,但是后面就能正常读取了,请问一下有经验的大佬指明下方向吗?
回复

使用道具 举报

14

主题

31

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2021-3-25 18:37:29 | 显示全部楼层
上电时是进入了set report中断,但是buf里没有数据,后面再按其他键盘的led灯,Gd模拟的键盘就能正常读取到数据
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107452
QQ
发表于 2021-3-26 09:24:10 | 显示全部楼层
没整过GD32,帮顶下。
回复

使用道具 举报

14

主题

31

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2021-3-30 09:31:39 | 显示全部楼层
现在暂时是上电后发送两次NumLOCK按键同步下状态,但是仔细看的话还是可以看到指示灯的闪烁~
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
QQ
发表于 2021-4-1 14:10:00 | 显示全部楼层
键盘的SetReport请求,类型是output的,后面的req->wLength并不是0,收到Set Report请求之后要让OUT0端点准备好接收数据,将接收buffer地址和长度传递给底层端点传输控制,完了之后要等一个端点0的DATAOUT传输完成中断,才能真正拿到SetReport的数据。
usb_transc *out_transc = &udev->dev.transc_out[0];
uint8_t NumLock_State[2];
.......
case SET_REPORT:
{
//先判断一下是不是键盘那个接口的SetReport请求,再前面的req->wValue的高字节来判断是不是OUTPUT类型.
out_transc->xfer_buf = NumLock_State;
out_transc->remain_len = USB_MIN(req->wLength, 2);
}
break;

完了之后要等OUT0的DATAOUT阶段完成,才是拿到了第一次数据,你说的第一次拿不到数据是因为还没有传输完成就去读NumLock_State了吧。
回复

使用道具 举报

14

主题

31

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2021-6-11 15:30:40 | 显示全部楼层
lousejon 发表于 2021-4-1 14:10
键盘的SetReport请求,类型是output的,后面的req->wLength并不是0,收到Set Report请求之后要让OUT0端点准 ...

谢谢大佬,就是你说的这个问题引起的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-1 15:35 , Processed in 0.227384 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表