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

2019-07-21 05:21发布

本帖最后由 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
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。