OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7035|回复: 2

关于鼠标例程改成USB键盘的一些问题

[复制链接]

13

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2018-6-18
在线时间
27 小时
发表于 2019-2-3 16:39:36 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 redgragon 于 2019-2-3 17:13 编辑

最近小弟希望自己做一个USB键盘玩,参考了战舰板的触控鼠标和网上的一些帖子
站内的关于 KEIL提供的JoystickMouse例程 转化为 USB虚拟键盘
以及CSDN上的STM32 keyboard USB键盘功能的实现
现程序已经可以被电脑成功识别并成功发送'A','Caps'键(其他按键及组合按键等没有尝试)但仍有一些问题想要请教各位大神
1.例程提供的是JoystickMouse而网上提供的是HID_KeyBoard(类似名字)
如例程中有
[mw_shl_code=c,true]/* USB Standard Device Descriptor */
const uint8_t Joystick_DeviceDescriptor[JOYSTICK_SIZ_DEVICE_DESC] =
  {
//省略此处代码
}
  ; /* Joystick_DeviceDescriptor */[/mw_shl_code]
网上参考有
[mw_shl_code=applescript,true]const uint8_t Keyboard_DeviceDescriptor[KEYBOARD_SIZ_DEVICE_DESC] =
{
//省略此处代码
}[/mw_shl_code]
以上两个函数从格式和功能完全一致只是名字不同,想知道这个名字是固定的还是可以自行修改的?修改后是否需要到usb_prop.c中替换注册?

2.关于端点(endpoint)的问题
鼠标只需要一个端点用于上传,键盘需要两个,一个用于上传另一个是用于干什么的?
如果只保留像鼠标那样的一个端点会发生什么问题?

3.每次USB发送后使用SetEPTxValid(ENDP1);这句话的意思是什么?

4.在usb_conf.h中有如下定义
[mw_shl_code=c,true]/* EP0  */
/* rx/tx buffer base address */
#define ENDP0_RXADDR        (0x18)
#define ENDP0_TXADDR        (0x58)

/* EP1  */
/* tx buffer base address */
#define ENDP1_TXADDR        (0x100)[/mw_shl_code]
这是两个端点的缓存地址吗?
键盘另外需要#define ENDP1_RXADDR,这个地方给多少会比较好
上面ENDP0的两个地址又是怎么确定的?

5.4中所定义的
[mw_shl_code=c,true]/* EP0  */
/* rx/tx buffer base address */
#define ENDP0_RXADDR        (0x18)
#define ENDP0_TXADDR        (0x58)[/mw_shl_code]
两个地址间的差值为0x40,而在usb_desc.h中的Joystick_DeviceDescriptor中有如下定义
[mw_shl_code=c,true]/* USB Standard Device Descriptor */
const uint8_t Joystick_DeviceDescriptor[JOYSTICK_SIZ_DEVICE_DESC] =
  {
    0x12,                       /*bLength */
    USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/
    0x00,                       /*bcdUSB */
    0x02,
    0x00,                       /*bDeviceClass*/
    0x00,                       /*bDeviceSubClass*/
    0x00,                       /*bDeviceProtocol*/
    0x08,                       /*bMaxPacketSize 8*/  //此处原定义为0x40
    0x83,                       /*idVendor (0x0483)*/
    0x04,
    0x11,                       /*idProduct = 0x5711*/
    0x57,
    0x00,                       /*bcdDevice rel. 2.00*/
    0x02,
    1,                          /*Index of string descriptor describing
                                                  manufacturer */
    2,                          /*Index of string descriptor describing
                                                 product*/
    3,                          /*Index of string descriptor describing the
                                                 device serial number */
    0x01                        /*bNumConfigurations*/
  }
  ; /* Joystick_DeviceDescriptor */[/mw_shl_code]
以上代码用//注释的地方原来是0x40,不知道和ENDP0_RXADDR与ENDP0_TXADDR之间的0x40有没有必然联系?如果我把Joystick_DeviceDescriptor定义为0x08,上面缓冲区大小能不能或者该不该相应减小?

6.接以上4.5,附图请问这个图该如何理解?
20170113174153454.jpg

最佳答案

查看完整内容[请看2#楼]

1. 那个名字没有关系,只要能正确上报描述符就可以了 2. 键盘需要输出大小写、数字锁定这些LED灯的状态,所以需要Output数据,如果没有Out端点,会利用Set Output Report 请求来发数据 3. SetEPTxValid是为了让端点由NAK状态变成ACK状态,这样主机才能收到数据 4. 关于缓存的问题,我建议你阅读《STM32 USB设备开发指南》的 《4.3节 PMA操作》,此书在 www.tusb.org 下载 如果你想深入理解STM32 USB的工作原理,又觉得官方的 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2019-1-28
在线时间
4 小时
发表于 2019-2-3 16:39:37 | 显示全部楼层
1. 那个名字没有关系,只要能正确上报描述符就可以了
2. 键盘需要输出大小写、数字锁定这些LED灯的状态,所以需要Output数据,如果没有Out端点,会利用Set Output Report 请求来发数据
3. SetEPTxValid是为了让端点由NAK状态变成ACK状态,这样主机才能收到数据
4. 关于缓存的问题,我建议你阅读《STM32 USB设备开发指南》的 《4.3节 PMA操作》,此书在 www.tusb.org 下载

如果你想深入理解STM32 USB的工作原理,又觉得官方的库理解起来很困难,可以试一下这个非官方的STM32 USB库,TeenyUSB
代码地址:code.tusb.org
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2019-9-16
在线时间
2 小时
发表于 2023-2-1 18:19:58 | 显示全部楼层
xtoolbox 发表于 2019-2-3 16:39
1. 那个名字没有关系,只要能正确上报描述符就可以了
2. 键盘需要输出大小写、数字锁定这些LED灯的状态, ...

《STM32 USB设备开发指南》这个指南哪里有
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 19:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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