初级会员
- 积分
- 175
- 金钱
- 175
- 注册时间
- 2018-6-18
- 在线时间
- 27 小时
|
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,附图请问这个图该如何理解?
|
最佳答案
查看完整内容[请看2#楼]
1. 那个名字没有关系,只要能正确上报描述符就可以了
2. 键盘需要输出大小写、数字锁定这些LED灯的状态,所以需要Output数据,如果没有Out端点,会利用Set Output Report 请求来发数据
3. SetEPTxValid是为了让端点由NAK状态变成ACK状态,这样主机才能收到数据
4. 关于缓存的问题,我建议你阅读《STM32 USB设备开发指南》的 《4.3节 PMA操作》,此书在 www.tusb.org 下载
如果你想深入理解STM32 USB的工作原理,又觉得官方的 ...
|