Преглед изворни кода

add consumer control to hid_composite examples

both no OS and freeRTOS
hathach пре 5 година
родитељ
комит
3d95835f22

+ 26 - 2
examples/device/hid_composite/src/main.c

@@ -133,7 +133,7 @@ void hid_task(void)
       // no button, right + down, no scroll pan
       tud_hid_mouse_report(REPORT_ID_MOUSE, 0x00, delta, delta, 0, 0);
 
-      // delay a bit before attempt to send keyboard report
+      // delay a bit before sending keyboard report
       board_delay(10);
     }
   }
@@ -158,9 +158,33 @@ void hid_task(void)
       if (has_key) tud_hid_keyboard_report(REPORT_ID_KEYBOARD, 0, NULL);
       has_key = false;
     }
+
+    // delay a bit before sending consumer report
+    board_delay(10);
   }
-}
 
+  /*------------- Consume Control -------------*/
+  if ( tud_hid_ready() )
+  {
+    // use to avoid send multiple consecutive zero report
+    static bool has_consumer_key = false;
+
+    if ( btn )
+    {
+      // volume down
+      uint16_t volume_down = HID_USAGE_CONSUMER_VOLUME_DECREMENT;
+      tud_hid_report(REPORT_ID_CONSUMER_CONTROL, &volume_down, 2);
+
+      has_consumer_key = true;
+    }else
+    {
+      // send empty key report (release key) if previously has key pressed
+      uint16_t empty_key = 0;
+      if (has_consumer_key) tud_hid_report(REPORT_ID_CONSUMER_CONTROL, &empty_key, 2);
+      has_consumer_key = false;
+    }
+  }
+}
 
 // Invoked when received GET_REPORT control request
 // Application must fill buffer report's content and return its length.

+ 3 - 2
examples/device/hid_composite/src/usb_descriptors.c

@@ -73,8 +73,9 @@ uint8_t const * tud_descriptor_device_cb(void)
 
 uint8_t const desc_hid_report[] =
 {
-  TUD_HID_REPORT_DESC_KEYBOARD( HID_REPORT_ID(REPORT_ID_KEYBOARD) ),
-  TUD_HID_REPORT_DESC_MOUSE   ( HID_REPORT_ID(REPORT_ID_MOUSE) )
+  TUD_HID_REPORT_DESC_KEYBOARD( HID_REPORT_ID(REPORT_ID_KEYBOARD         )),
+  TUD_HID_REPORT_DESC_MOUSE   ( HID_REPORT_ID(REPORT_ID_MOUSE            )),
+  TUD_HID_REPORT_DESC_CONSUMER( HID_REPORT_ID(REPORT_ID_CONSUMER_CONTROL ))
 };
 
 // Invoked when received GET HID REPORT DESCRIPTOR

+ 2 - 1
examples/device/hid_composite/src/usb_descriptors.h

@@ -28,7 +28,8 @@
 enum
 {
   REPORT_ID_KEYBOARD = 1,
-  REPORT_ID_MOUSE
+  REPORT_ID_MOUSE,
+  REPORT_ID_CONSUMER_CONTROL,
 };
 
 #endif /* USB_DESCRIPTORS_H_ */

+ 26 - 1
examples/device/hid_composite_freertos/src/main.c

@@ -192,7 +192,7 @@ void hid_task(void* param)
         // no button, right + down, no scroll pan
         tud_hid_mouse_report(REPORT_ID_MOUSE, 0x00, delta, delta, 0, 0);
 
-        // delay a bit before attempt to send keyboard report
+        // delay a bit before sending keyboard report
         vTaskDelay(pdMS_TO_TICKS(10));
       }
     }
@@ -217,6 +217,31 @@ void hid_task(void* param)
         if (has_key) tud_hid_keyboard_report(REPORT_ID_KEYBOARD, 0, NULL);
         has_key = false;
       }
+
+      // delay a bit before sending consumer report
+      vTaskDelay(pdMS_TO_TICKS(10));
+    }
+
+    /*------------- Consume Control -------------*/
+    if ( tud_hid_ready() )
+    {
+      // use to avoid send multiple consecutive zero report
+      static bool has_consumer_key = false;
+
+      if ( btn )
+      {
+        // volume down
+        uint16_t volume_down = HID_USAGE_CONSUMER_VOLUME_DECREMENT;
+        tud_hid_report(REPORT_ID_CONSUMER_CONTROL, &volume_down, 2);
+
+        has_consumer_key = true;
+      }else
+      {
+        // send empty key report (release key) if previously has key pressed
+        uint16_t empty_key = 0;
+        if (has_consumer_key) tud_hid_report(REPORT_ID_CONSUMER_CONTROL, &empty_key, 2);
+        has_consumer_key = false;
+      }
     }
   }
 }

+ 2 - 1
examples/device/hid_composite_freertos/src/usb_descriptors.c

@@ -74,7 +74,8 @@ uint8_t const * tud_descriptor_device_cb(void)
 uint8_t const desc_hid_report[] =
 {
   TUD_HID_REPORT_DESC_KEYBOARD( HID_REPORT_ID(REPORT_ID_KEYBOARD) ),
-  TUD_HID_REPORT_DESC_MOUSE   ( HID_REPORT_ID(REPORT_ID_MOUSE) )
+  TUD_HID_REPORT_DESC_MOUSE   ( HID_REPORT_ID(REPORT_ID_MOUSE) ),
+  TUD_HID_REPORT_DESC_CONSUMER( HID_REPORT_ID(REPORT_ID_CONSUMER_CONTROL ))
 };
 
 // Invoked when received GET HID REPORT DESCRIPTOR

+ 2 - 1
examples/device/hid_composite_freertos/src/usb_descriptors.h

@@ -28,7 +28,8 @@
 enum
 {
   REPORT_ID_KEYBOARD = 1,
-  REPORT_ID_MOUSE
+  REPORT_ID_MOUSE,
+  REPORT_ID_CONSUMER_CONTROL
 };
 
 #endif /* USB_DESCRIPTORS_H_ */

+ 4 - 2
examples/rules.mk

@@ -36,10 +36,12 @@ erase:
 monitor:
 	idf.py -B$(BUILD) -DFAMILY=$(FAMILY) -DBOARD=$(BOARD) $(CMAKE_DEFSYM) monitor
 
+uf2: $(BUILD)/$(PROJECT).uf2
+
 UF2_FAMILY_ID = 0xbfdd4eee
-$(BUILD)/$(PROJECT).uf2: $(BUILD)/$(PROJECT).hex
+$(BUILD)/$(PROJECT).uf2: $(BUILD)/$(PROJECT).bin
 	@echo CREATE $@
-	$(PYTHON) $(TOP)/tools/uf2/utils/uf2conv.py -f $(UF2_FAMILY_ID) -c -o $@ $^
+	$(PYTHON) $(TOP)/tools/uf2/utils/uf2conv.py -f $(UF2_FAMILY_ID) -b 0x0 -c -o $@ $^
 
 else ifeq ($(FAMILY),rp2040)