6173|7

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

STM32F103USB实现双接口(Keypad+Mouse)的问题!! [复制链接]

利用STM USB固件库 单独实现多端点HID传输、Mouse 或Keypad均没有任何问题!
在实现双接口设备时总线挂起!!!!!
/* USB Configuration Descriptor */如下
/*   All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */

const u8 CustomHID_ConfigDescriptor[CUSTOMHID_SIZ_CONFIG_DESC] =
  {
    0x09,                                                                             /* bLength: Configuation Descriptor size */
    USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */
    CUSTOMHID_SIZ_CONFIG_DESC,                      /* wTotalLength: Bytes returned */
    0x00,
    0x02,         /* bNumInterfaces: 2 interface */
    0x01,         /* bConfigurationValue: Configuration value */
    0x00,         /* iConfiguration: Index of string descriptor describing the configuration*/
    0x80,         /* bmAttributes: Bus powered */
    0x32,         /* MaxPower 100 mA: this current is used for detecting Vbus */
   
    /************** Descriptor of Custom HID mouse  interface ****************/
    /* 09 */
    0x09,         /* bLength: Interface Descriptor size */
    USB_INTERFACE_DESCRIPTOR_TYPE,/* bDescriptorType: Interface descriptor type */
    0x00,         /* bInterfaceNumber: Number of Interface */
    0x00,         /* bAlternateSetting: Alternate setting */
    0x02,         /* bNumEndpoints */
    0x03,         /* bInterfaceClass: HID */
    0x01,         /* bInterfaceSubClass : 1=BOOT, 0=no boot */
    0x02,         /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */
    0,            /* iInterface: Index of string descriptor */
    /******************** Descriptor of Custom HID HID ********************/
    /* 18 */
    0x09,         /* bLength: HID Descriptor size */
    HID_DESCRIPTOR_TYPE, /* bDescriptorType: HID */
    0x10,         /* bcdHID: HID Class Spec release number */
    0x01,
    0x00,         /* bCountryCode: Hardware target country */
    0x01,         /* bNumDescriptors: Number of HID class descriptors to follow */
    0x22,         /* bDescriptorType */
    CUSTOMHID_SIZ_REPORT_Mouse_DESC,/* wItemLength: Total length of Report descriptor */
    0x00,
    /******************** Descriptor of Custom HID Mouse endpoints ******************/
    /* 27 */
    0x07,          /* bLength: Endpoint Descriptor size */
    USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */
    0x81,          /* bEndpointAddress: Endpoint Address (IN) */
    0x03,          /* bmAttributes: Interrupt endpoint */
    0x05,          /* wMaxPacketSize: 5 Bytes max */
    0x00,
    0x0A,          /* bInterval: Polling Interval (10 ms) */
    /* 34 */
   /************** Descriptor of Custom HIDKeypad  interface ****************/
    0x09,         /* bLength: Interface Descriptor size */
    USB_INTERFACE_DESCRIPTOR_TYPE,/* bDescriptorType: Interface descriptor type */
    0x01,         /* bInterfaceNumber: Number of Interface */
    0x00,         /* bAlternateSetting: Alternate setting */
    0x01,         /* bNumEndpoints */
    0x03,         /* bInterfaceClass: HID */
    0x01,         /* bInterfaceSubClass : 1=BOOT, 0=no boot */
    0x01,         /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */
    0,            /* iInterface: Index of string descriptor */
    /******************** Descriptor of Custom HID HID ********************/
    /* 43 */
    0x09,         /* bLength: HID Descriptor size */
    HID_DESCRIPTOR_TYPE, /* bDescriptorType: HID */
    0x10,         /* bcdHID: HID Class Spec release number */
    0x01,
    0x00,         /* bCountryCode: Hardware target country */
    0x01,         /* bNumDescriptors: Number of HID class descriptors to follow */
    0x22,         /* bDescriptorType */
    CUSTOMHID_SIZ_REPORT_Keypad_DESC,/* wItemLength: Total length of Report descriptor */
    0x00,
    /******************** Descriptor of Custom HID endpoints ******************/
    /* 52*/
    0x07,          /* bLength: Endpoint Descriptor size */
    USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */
    0x82,          /* bEndpointAddress: Endpoint Address (IN) */
    0x03,          /* bmAttributes: Interrupt endpoint */
    0x08,          /* wMaxPacketSize: 8 Bytes max */
    0x00,
    0x0a,          /* bInterval: Polling Interval (10 ms) */
    /*59 */
  }; /* CustomHID_ConfigDescriptor */
在USB 协议分析仪测试发现在在取得字符串后又一次取得完整ConfigDescriptor 后总线就挂起了!!
实在找到不到原因所,问题还是在于没有完全搞懂USB固件库,请教各位高手指点!!!!
Email :gwb_2@163.com
此帖出自stm32/stm8论坛

最新回复

多谢 lxyppc  对比了一下你的程序,顺利实现了 Keypad+Mouse 功能!! 主要修改了以下二个地方: 1): if ((RequestNo == GET_DESCRIPTOR)       && (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT))       )       //&& (pInformation->USBwIndex0 == 0))   {     if (pInformation->USBwValue1 == REPORT_DESCRIPTOR)       CopyRoutine = CustomHID_GetReportDescriptor;     else if (pInformation->USBwValue1 == HID_DESCRIPTOR_TYPE)       CopyRoutine = CustomHID_GetHIDDescriptor;   } /* End of GET_DESCRIPTOR */ 2); u8 *CustomHID_GetReportDescriptor(u16 Length) {                          u8 wIndex0 = pInformation->USBwIndex0;   if (wIndex0 ==0)    return Standard_GetDescriptorData(Length, &CustomHID_Hid_Mouse_Descriptor);   else    return Standard_GetDescriptorData(Length, &CustomHID_Hid_Keypad_Descriptor); } 下载 (57.22 KB) 2010-6-5 13:03   详情 回复 发表于 2010-6-5 13:03
点赞 关注
 

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
ConfigDescriptor 有问题!!

为什么第1个interface descriptor中bNumEndpoints = 2?
此帖出自stm32/stm8论坛
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
我是[url=space-username-jackguoMCU.html]jackguoMCU[/url]但是没办法登录,只好换一个ID了!!
谢谢版主主的回复,你提到的地方是我贴上来的时候写错了!!

为什么第1个interface descriptor中bNumEndpoints = 2?

应该是interface descriptor中bNumEndpoints = 1
此帖出自stm32/stm8论坛
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

4
 
                                 那么你再好好看看,程序中还有哪里写错的地方。
此帖出自stm32/stm8论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

5
 
唉!!为啥没人帮忙解答呢!!!



期待ST高手指点!!!!
此帖出自stm32/stm8论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

6
 
唉!!为啥没人帮忙解答呢!!!



期待ST高手指点!!!!
发帖时应该是直接从程序中拷贝出来的,这样也能够有错,所以我在4楼才会让你再好好看看,程序中还有哪里写错的地方。

如果要人帮忙,你总要提供足够的信息呀,我们是没有本事仅凭现象而知道根源。
此帖出自stm32/stm8论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

7
 
除了改Descriptor
你还需要更改usb_prop.c中的一些代码

顺便打个广告,下面的工程用一片STM32实现了键盘,鼠标,游戏杆和摄像头
https://bbs.eeworld.com.cn/icview-166274-1-1.html
此帖出自stm32/stm8论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

8
 
多谢 [url=space-username-lxyppc.html]lxyppc[/url]  对比了一下你的程序,顺利实现了 Keypad+Mouse 功能!!
主要修改了以下二个地方:

1):
if ((RequestNo == GET_DESCRIPTOR)
      && (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT))
      )
      //&& (pInformation->USBwIndex0 == 0))
  {
    if (pInformation->USBwValue1 == REPORT_DESCRIPTOR)
      CopyRoutine = CustomHID_GetReportDescriptor;
    else if (pInformation->USBwValue1 == HID_DESCRIPTOR_TYPE)
      CopyRoutine = CustomHID_GetHIDDescriptor;
  } /* End of GET_DESCRIPTOR */

2);
u8 *CustomHID_GetReportDescriptor(u16 Length)
{                       
  u8 wIndex0 = pInformation->USBwIndex0;
  if (wIndex0 ==0)
   return Standard_GetDescriptorData(Length, &CustomHID_Hid_Mouse_Descriptor);
  else
   return Standard_GetDescriptorData(Length, &CustomHID_Hid_Keypad_Descriptor);
} 双接口USB_1.JPG
此帖出自stm32/stm8论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表