Просмотр исходного кода

add test for mouse_open
add hid descriptor for mouse & mouse interface to descriptor_test
refractor extract function hidh_interface_status
fix error with MACRO HID_REPORT_ITEM with zero data size --> redundant semicolon

hathach 13 лет назад
Родитель
Сommit
10c08ab404

+ 25 - 0
tests/test/host/hid/test_hidh_mouse.c

@@ -47,6 +47,10 @@
 
 extern hidh_interface_info_t mouse_data[TUSB_CFG_HOST_DEVICE_MAX];
 hidh_interface_info_t *p_hidh_mouse;
+
+tusb_descriptor_interface_t const *p_mouse_interface_desc = &desc_configuration.mouse_interface;
+tusb_descriptor_endpoint_t  const *p_mouse_endpoint_desc  = &desc_configuration.mouse_endpoint;
+
 uint8_t dev_addr;
 
 void setUp(void)
@@ -77,6 +81,7 @@ void test_mouse_init(void)
   TEST_ASSERT_MEM_ZERO(mouse_data, sizeof(hidh_interface_info_t)*TUSB_CFG_HOST_DEVICE_MAX);
 }
 
+//------------- is supported -------------//
 void test_mouse_is_supported_fail_unplug(void)
 {
   tusbh_device_get_state_IgnoreAndReturn(TUSB_DEVICE_STATE_UNPLUG);
@@ -96,8 +101,28 @@ void test_mouse_is_supported_ok(void)
   TEST_ASSERT_TRUE( tusbh_hid_mouse_is_supported(dev_addr) );
 }
 
+void test_mouse_open_ok(void)
+{
+  uint16_t length=0;
+  pipe_handle_t pipe_hdl = {.dev_addr = dev_addr, .xfer_type = TUSB_XFER_INTERRUPT, .index = 2};
+
+  hidh_init();
+
+  hcd_pipe_open_ExpectAndReturn(dev_addr, p_mouse_endpoint_desc, TUSB_CLASS_HID, pipe_hdl);
+
+  //------------- Code Under TEST -------------//
+  TEST_ASSERT_EQUAL(TUSB_ERROR_NONE, hidh_open_subtask(dev_addr, p_mouse_interface_desc, &length));
 
+  TEST_ASSERT_PIPE_HANDLE(pipe_hdl, p_hidh_mouse->pipe_hdl);
+  TEST_ASSERT_EQUAL(8, p_hidh_mouse->report_size);
+  TEST_ASSERT_EQUAL(sizeof(tusb_descriptor_interface_t) + sizeof(tusb_hid_descriptor_hid_t) + sizeof(tusb_descriptor_endpoint_t),
+                    length);
 
+  tusbh_device_get_state_IgnoreAndReturn(TUSB_DEVICE_STATE_CONFIGURED);
+  TEST_ASSERT_TRUE( tusbh_hid_keyboard_is_supported(dev_addr) );
+  TEST_ASSERT_EQUAL(TUSB_INTERFACE_STATUS_READY, p_hidh_mouse->status);
+
+}
 
 
 

+ 77 - 5
tests/test/support/descriptor_test.c

@@ -92,10 +92,10 @@ const uint8_t keyboard_report_descriptor[] = {
       HID_OUTPUT       ( HID_CONSTANT                            ),
 
     HID_USAGE_PAGE (HID_USAGE_PAGE_KEYBOARD),
-      HID_USAGE_MIN    ( 0                                       ),
-      HID_USAGE_MAX    ( 101                                     ),
-      HID_LOGICAL_MIN  ( 0                                       ),
-      HID_LOGICAL_MAX  ( 101                                     ),
+      HID_USAGE_MIN    ( 0                                   ),
+      HID_USAGE_MAX    ( 101                                 ),
+      HID_LOGICAL_MIN  ( 0                                   ),
+      HID_LOGICAL_MAX  ( 101                                 ),
 
       HID_REPORT_COUNT ( 6                                   ),
       HID_REPORT_SIZE  ( 8                                   ),
@@ -103,6 +103,42 @@ const uint8_t keyboard_report_descriptor[] = {
   HID_COLLECTION_END
 };
 
+TUSB_CFG_ATTR_USBRAM ATTR_ALIGNED(4)
+const uint8_t mouse_report_descriptor[] = {
+  HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP     ),
+  HID_USAGE      ( HID_USAGE_DESKTOP_MOUSE    ),
+  HID_COLLECTION ( HID_COLLECTION_APPLICATION ),
+    HID_USAGE      (HID_USAGE_DESKTOP_POINTER),
+
+    HID_COLLECTION ( HID_COLLECTION_PHYSICAL ),
+      HID_USAGE_PAGE  ( HID_USAGE_PAGE_BUTTON ),
+        HID_USAGE_MIN    ( 1                                      ),
+        HID_USAGE_MAX    ( 3                                      ),
+        HID_LOGICAL_MIN  ( 0                                      ),
+        HID_LOGICAL_MAX  ( 1                                      ),
+
+        HID_REPORT_COUNT ( 3                                      ), /* Left, Right and Middle mouse*/
+        HID_REPORT_SIZE  ( 1                                      ),
+        HID_INPUT        ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),
+
+        HID_REPORT_COUNT ( 1                                      ),
+        HID_REPORT_SIZE  ( 5                                      ),
+        HID_INPUT        ( HID_CONSTANT                           ), /* reserved */
+
+      HID_USAGE_PAGE  ( HID_USAGE_PAGE_DESKTOP ),
+        HID_USAGE        ( HID_USAGE_DESKTOP_X                    ),
+        HID_USAGE        ( HID_USAGE_DESKTOP_Y                    ),
+        HID_LOGICAL_MIN  ( 0x81                                   ), /* -127 */
+        HID_LOGICAL_MAX  ( 0x7f                                   ), /* 127  */
+
+        HID_REPORT_COUNT ( 2                                      ), /* X, Y position */
+        HID_REPORT_SIZE  ( 8                                      ),
+        HID_INPUT        ( HID_DATA | HID_VARIABLE | HID_RELATIVE ), /* relative values */
+    HID_COLLECTION_END,
+
+  HID_COLLECTION_END
+};
+
 TUSB_CFG_ATTR_USBRAM ATTR_ALIGNED(4)
 const app_configuration_desc_t desc_configuration =
 {
@@ -120,7 +156,7 @@ const app_configuration_desc_t desc_configuration =
         .bMaxPower           = TUSB_DESC_CONFIG_POWER_MA(100)
     },
 
-    ///// USB HID Keyboard interface
+    //------------- HID Keyboard -------------//
     .keyboard_interface =
     {
         .bLength            = sizeof(tusb_descriptor_interface_t),
@@ -155,5 +191,41 @@ const app_configuration_desc_t desc_configuration =
         .bInterval        = 0x0A
     },
 
+    //------------- HID Mouse -------------//
+    .mouse_interface =
+    {
+        .bLength            = sizeof(tusb_descriptor_interface_t),
+        .bDescriptorType    = TUSB_DESC_INTERFACE,
+        .bInterfaceNumber   = 2,
+        .bAlternateSetting  = 0x00,
+        .bNumEndpoints      = 1,
+        .bInterfaceClass    = TUSB_CLASS_HID,
+        .bInterfaceSubClass = HID_SUBCLASS_BOOT,
+        .bInterfaceProtocol = HID_PROTOCOL_MOUSE,
+        .iInterface         = 0x00
+    },
+
+    .mouse_hid =
+    {
+        .bLength           = sizeof(tusb_hid_descriptor_hid_t),
+        .bDescriptorType   = HID_DESC_HID,
+        .bcdHID            = 0x0111,
+        .bCountryCode      = HID_Local_NotSupported,
+        .bNumDescriptors   = 1,
+        .bReportType       = HID_DESC_REPORT,
+        .wReportLength     = sizeof(mouse_report_descriptor)
+    },
+
+    .mouse_endpoint =
+    {
+        .bLength          = sizeof(tusb_descriptor_endpoint_t),
+        .bDescriptorType  = TUSB_DESC_ENDPOINT,
+        .bEndpointAddress = 0x82,
+        .bmAttributes     = { .xfer = TUSB_XFER_INTERRUPT },
+        .wMaxPacketSize   = 0x08,
+        .bInterval        = 0x0A
+    },
+
+
     .ConfigDescTermination = 0,
 };

+ 5 - 9
tests/test/support/descriptor_test.h

@@ -81,19 +81,15 @@ typedef struct
   tusb_descriptor_endpoint_t                     CDC_DataInEndpoint;
 #endif
 
-#if 1 // || TUSB_CFG_DEVICE_HID_KEYBOARD
-  //Keyboard HID Interface
+  //------------- HID Keyboard -------------//
   tusb_descriptor_interface_t                    keyboard_interface;
   tusb_hid_descriptor_hid_t                      keyboard_hid;
   tusb_descriptor_endpoint_t                     keyboard_endpoint;
-#endif
 
-#if 0 // && TUSB_CFG_DEVICE_HID_MOUSE
-  //Mouse HID Interface
-  tusb_descriptor_interface_t                    HID_MouseInterface;
-  HID_DESCRIPTOR                              HID_MouseHID;
-  tusb_descriptor_endpoint_t                     HID_MouseEndpoint;
-#endif
+  //------------- HID Mouse -------------//
+  tusb_descriptor_interface_t                    mouse_interface;
+  tusb_hid_descriptor_hid_t                      mouse_hid;
+  tusb_descriptor_endpoint_t                     mouse_endpoint;
 
   unsigned char                               ConfigDescTermination;
 } app_configuration_desc_t;

+ 4 - 4
tinyusb/class/hid.h

@@ -192,12 +192,12 @@ enum USB_HID_LOCAL_CODE
 //--------------------------------------------------------------------+
 //------------- ITEM & TAG -------------//
 #define HID_REPORT_DATA_0(data)
-#define HID_REPORT_DATA_1(data) data
-#define HID_REPORT_DATA_2(data) U16_TO_U8S_LE(data)
-#define HID_REPORT_DATA_3(data) U32_TO_U8S_LE(data)
+#define HID_REPORT_DATA_1(data) , data
+#define HID_REPORT_DATA_2(data) , U16_TO_U8S_LE(data)
+#define HID_REPORT_DATA_3(data) , U32_TO_U8S_LE(data)
 
 #define HID_REPORT_ITEM(data, tag, type, size) \
-  ( (tag << 4) | (type << 2) | size), HID_REPORT_DATA_##size(data)
+  ((tag << 4) | (type << 2) | size) HID_REPORT_DATA_##size(data)
 
 #define RI_TYPE_MAIN   0
 #define RI_TYPE_GLOBAL 1

+ 16 - 9
tinyusb/class/hid_host.c

@@ -53,6 +53,19 @@
 //--------------------------------------------------------------------+
 // INTERNAL OBJECT & FUNCTION DECLARATION
 //--------------------------------------------------------------------+
+tusb_interface_status_t hidh_interface_status(uint8_t dev_addr, hidh_interface_info_t *p_hid) ATTR_PURE ATTR_ALWAYS_INLINE;
+tusb_interface_status_t hidh_interface_status(uint8_t dev_addr, hidh_interface_info_t *p_hid)
+{
+  switch( tusbh_device_get_state(dev_addr) )
+  {
+    case TUSB_DEVICE_STATE_UNPLUG:
+    case TUSB_DEVICE_STATE_INVALID_PARAMETER:
+      return TUSB_INTERFACE_STATUS_INVALID_PARA;
+
+    default:
+      return p_hid->status;
+  }
+}
 
 //--------------------------------------------------------------------+
 // KEYBOARD
@@ -94,15 +107,7 @@ tusb_error_t tusbh_hid_keyboard_get_report(uint8_t dev_addr, uint8_t instance_nu
 
 tusb_interface_status_t tusbh_hid_keyboard_status(uint8_t dev_addr, uint8_t instance_num)
 {
-  switch( tusbh_device_get_state(dev_addr) )
-  {
-    case TUSB_DEVICE_STATE_UNPLUG:
-    case TUSB_DEVICE_STATE_INVALID_PARAMETER:
-      return TUSB_INTERFACE_STATUS_INVALID_PARA;
-
-    default:
-      return keyboard_data[dev_addr-1].status;
-  }
+  return hidh_interface_status(dev_addr, &keyboard_data[dev_addr-1]);
 }
 //------------- Internal API -------------//
 static inline tusb_error_t hidh_keyboard_open(uint8_t dev_addr, tusb_descriptor_endpoint_t const *p_endpoint_desc) ATTR_ALWAYS_INLINE;
@@ -160,6 +165,8 @@ tusb_interface_status_t tusbh_hid_mouse_status(uint8_t dev_addr, uint8_t instanc
     default:
       return mouse_data[dev_addr-1].status;
   }*/
+
+  return TUSB_INTERFACE_STATUS_INVALID_PARA;
 }
 
 //------------- Internal API -------------//