qq_58718670 2024-12-13 21:06 采纳率: 0%
浏览 10

Bluenrg-ms是否支持hid 复合设备?

我在使用Bluenrg-ms做ble hid设备时,分别单独实现了键盘和鼠标的功能,但是当我像usb hid 设备一样在report map(也就是报告描述符)中同时加入用report id 区分时,ble 设备不能同时识别,请问如何解

static uint8_t hid_report[] =
{
    
#if use_keybord
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
    0x09, 0x06,                    // USAGE (Keyboard)
    //表示应用集合,必须要以 END_COLLECTION 来结束它,见最后的 END_COLLECTION
    0xa1, 0x01,                    // COLLECTION (Application)
//#if FEATURE_SUPPORT_MULTIMEDIA_KEYBOARD      //复合设备
    0x85, HIDS_KB_REPORT_ID,                    //   REPORT_ID (1)  
//    //他也需要一字节
//#endif
        0x05, 0x07, // USAGE_PAGE (Keyboard)
        // bitmap of modifiers
        0x75, 0x01,         //   Report Size (1),
        0x95, 0x08,         //   Report Count (8),
        0x19, 0xE0,       //   Usage Minimum (224),
        0x29, 0xE7,       //   Usage Maximum (231),
        0x15, 0x00,       //   Logical Minimum (0),
        0x25, 0x01,       //   Logical Maximum (1),
        0x81, 0x02,       //   Input (Data, Variable, Absolute), ;Modifier byte
 
    
        // 1 Reserved byte
    0x95, 0x01,  // REPORT_COUNT (1)
    0x75, 0x08, // REPORT_SIZE (8)
    0x81, 0x01, // INPUT (Cnst,Ary,Abs)
    
        // LEDs for num lock etc
    0x95, 0x05, // REPORT_COUNT (5)
    0x75, 0x01, // REPORT_SIZE (1)
    0x05, 0x08, // USAGE_PAGE (LEDs)

    0x19, 0x01, // USAGE_MINIMUM (Num Lock)
    0x29, 0x05, // USAGE_MAXIMUM (Kana)
    0x91, 0x02, // OUTPUT (Data,Var,Abs)
    
        // Reserved 3 bits
    0x95, 0x01, // REPORT_COUNT (1)
    0x75, 0x03, // REPORT_SIZE (3)
    0x91, 0x03, // OUTPUT (Cnst,Var,Abs)

        /* Slots for 6 keys that can be pressed down at the same time */
    0x95, 0x06, // REPORT_COUNT (6)
    0x75, 0x08, // REPORT_SIZE (8)
    0x15, 0x00, // LOGICAL_MINIMUM (0)
    0x25, 0x65, // LOGICAL_MAXIMUM (101)
    0x05, 0x07, // USAGE_PAGE (Keyboard)
    0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
    0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
    0x81, 0x00, // INPUT (Data,Ary,Abs)
    
    0xC0, // END_COLLECTION
#endif

#if use_mouse

    0x05, 0x01,   // USAGE_PAGE (Generic Desktop)
    0x09, 0x02,   // USAGE (Mouse)
    0xa1, 0x01,   // COLLECTION (Application)
#if FEATURE_SUPPORT_MULTIMEDIA_KEYBOARD      //复合设备
    0x85, HIDS_MM_KB_REPORT_ID,   //   REPORT_ID (2)
#endif
    0x09, 0x01,   //   USAGE (Pointer) 鼠标指针的控制
    0xa1, 0x00,   //   COLLECTION (Physical)

    0x05, 0x09,   //         Usage Page (Buttons)
    0x19, 0x01,   //         Usage Minimum (1)
    0x29, 0x03,   //         Usage Maximum (3)
    0x15, 0x00,   //         Logical Minimum (0)
    0x25, 0x01,   //         Logical Maximum (1)
    0x95, 0x03,   //         Report Count (3) 
    0x75, 0x01,   //         Report Size (1) 
    0x81, 0x02,   //         Input(Data, Variable, Absolute); 3 button bits
    
    0x95, 0x01,   //         Report Count(1)
    0x75, 0x05,   //         Report Size(5)
    0x81, 0x03,   //         Input(Constant);                 5 bit padding
    
    0x75, 0x08,   //         Report Size (8)
    0x95, 0x03,   //         Report Count (3)
    0x05, 0x01,   //         Usage Page (Generic Desktop)
    0x09, 0x30,   //         Usage (X)
    0x09, 0x31,   //         Usage (Y)
    0x09, 0x38,   //         Usage (Wheel)
    0x15, 0x81,   //         Logical Minimum (-127)
    0x25, 0x7F,   //         Logical Maximum (127)
    0x81, 0x06,   //         Input(Data, Variable, Relative); 3 position bytes (X,Y,Wheel)

    0xc0,         //   END_COLLECTION
      0xc0          // END_COLLECTION

#endif

};

  • 写回答

1条回答 默认 最新

  • 关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    在 BLE HID 设备中支持复合设备(即同时支持多种 HID 特性,如键盘和鼠标)是一个复杂的过程,特别是在 BLE 的报告描述符(Report Descriptor)中实现。对于你的具体问题,看上去你的报告描述符包含了键盘和鼠标的复合设备的实现逻辑,但是蓝牙主机通常通过识别特定格式的描述符字段来确定连接的 HID 设备类型。如果主机尝试连接一个复合设备,它必须能够识别并处理报告描述符中的多个 HID 子设备信息。如果 BLE 主设备不处理这个报告描述符的结构方式(尤其是在如何处理报告中嵌入的多条HID服务的信息),它就只会解析报告的一部分并且不会正常工作。在某些情况下,它会连接键盘,在其它情况下则会连接鼠标,而不是复合设备。你的问题是普遍存在的蓝牙 BLE HID 复合设备的一个常见挑战。针对你的问题,这里有一些可能的解决方案:

    1. 确保报告描述符格式正确并且与你的设备硬件匹配。你的描述符结构看起来正确,但它需要根据你的设备和主机进行微调。请确保报告描述符的字段正确反映了你的设备的 HID 描述符和服务。此外,确保报告 ID 的使用是正确的,并且每个服务都有唯一的报告 ID。
    2. 确保主机软件能够识别并处理复合设备报告描述符的结构。有时你需要更进一步的自定义和更新主设备端的软件才能处理你的设备的特殊描述符结构。如果可能的话,尝试使用已知能够处理复合设备的 BLE 主设备进行测试。这可以帮助你确认问题是否出在报告描述符上,还是出在主机设备上。
    3. 如果可能的话,尝试简化你的实现过程。例如,你可以先只实现一个 HID 服务(如键盘或鼠标),然后确保它能够正常工作。然后逐步添加更多的服务直到找到问题的根本原因。这样做可以让你更轻松地识别问题的根本原因并进行修复。因为这种问题常常在复合设备间的复杂性中得到增加,保持简洁通常是一个很好的开始解决问题的方式。对于你当前的问题,一个可能的解决方法是将键盘和鼠标的报告描述符分开实现并独立管理它们的数据流。对于主机来说更简单一点的设计也会使主机更容易理解和管理这些信息。换句话说,使用独立通道来处理键盘和鼠标信息可能是最简单的解决方案。但你需要清楚这不是所有蓝牙主设备都支持的方式,需要根据实际的主设备和具体场景来确定使用哪种方法更适合你当前的应用场景和需求。在 BLE 中实现复杂的 HID 设备可能需要大量的调试和测试工作来完成。希望这些信息对你有所帮助!
    评论

报告相同问题?

问题事件

  • 修改了问题 12月13日
  • 创建了问题 12月13日