@@ -388,6 +388,53 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM SharedReport[] = {
388388// Include trackpad dimensions
389389#include "drivers/sensors/navigator_trackpad_common.h"
390390
391+ // PTP finger contact collection macro - reduces duplication for multi-finger support
392+ // Each finger reports: confidence, tip switch, contact ID, X position, Y position
393+ #define PTP_FINGER_COLLECTION \
394+ HID_RI_USAGE(8, 0x22), /* Finger */ \
395+ HID_RI_COLLECTION (8 , 0x00 ), /* Physical */ \
396+ HID_RI_PUSH (0 ), \
397+ HID_RI_LOGICAL_MINIMUM (8 , 0x00 ), \
398+ HID_RI_LOGICAL_MAXIMUM (8 , 0x01 ), \
399+ /* Tip Switch, Confidence (2 bits) */ \
400+ HID_RI_USAGE (8 , 0x47 ), /* Confidence */ \
401+ HID_RI_USAGE (8 , 0x42 ), /* Tip Switch */ \
402+ HID_RI_REPORT_COUNT (8 , 0x02 ), \
403+ HID_RI_REPORT_SIZE (8 , 0x01 ), \
404+ HID_RI_INPUT (8 , HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE ), \
405+ /* Padding (6 bits) */ \
406+ HID_RI_REPORT_SIZE (8 , 0x01 ), \
407+ HID_RI_REPORT_COUNT (8 , 0x06 ), \
408+ HID_RI_INPUT (8 , HID_IOF_CONSTANT ), \
409+ /* Contact identifier (3 bits) */ \
410+ HID_RI_REPORT_COUNT (8 , 0x01 ), \
411+ HID_RI_REPORT_SIZE (8 , 0x03 ), \
412+ HID_RI_LOGICAL_MAXIMUM (8 , 0x05 ), \
413+ HID_RI_USAGE (8 , 0x51 ), /* Contact identifier */ \
414+ HID_RI_INPUT (8 , HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE ), \
415+ /* Padding (5 bits) */ \
416+ HID_RI_REPORT_SIZE (8 , 0x01 ), \
417+ HID_RI_REPORT_COUNT (8 , 0x05 ), \
418+ HID_RI_INPUT (8 , HID_IOF_CONSTANT ), \
419+ /* X/Y Position (4 bytes) */ \
420+ HID_RI_USAGE_PAGE (8 , 0x01 ), /* Generic Desktop */ \
421+ HID_RI_LOGICAL_MINIMUM (8 , 0x0 ), \
422+ HID_RI_LOGICAL_MAXIMUM (16 , TRACKPAD_LOGICAL_MAX ), \
423+ HID_RI_REPORT_SIZE (8 , 16 ), \
424+ HID_RI_UNIT_EXPONENT (8 , 0x0E ), /* -2 */ \
425+ HID_RI_UNIT (8 , 0x11 ), /* CM, English Linear */ \
426+ HID_RI_USAGE (8 , 0x30 ), /* X */ \
427+ HID_RI_PHYSICAL_MINIMUM (8 , 0x0 ), \
428+ HID_RI_PHYSICAL_MAXIMUM (16 , (TRACKPAD_PHYSICAL_WIDTH )), \
429+ HID_RI_REPORT_COUNT (8 , 0x01 ), \
430+ HID_RI_INPUT (8 , HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE ), \
431+ HID_RI_LOGICAL_MAXIMUM (16 , TRACKPAD_LOGICAL_MAX ), \
432+ HID_RI_PHYSICAL_MAXIMUM (16 , (TRACKPAD_PHYSICAL_HEIGHT )), \
433+ HID_RI_USAGE (8 , 0x31 ), /* Y */ \
434+ HID_RI_INPUT (8 , HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE ), \
435+ HID_RI_POP (0 ), \
436+ HID_RI_END_COLLECTION (0 )
437+
391438// Digitizer/Touchpad HID Descriptor
392439const USB_Descriptor_HIDReport_Datatype_t PROGMEM PrecisionTrackpadReport [ ] = {
393440 HID_RI_USAGE_PAGE (8 , 0x0D ), // Digitizers
@@ -397,103 +444,11 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM PrecisionTrackpadReport[] = {
397444 HID_RI_REPORT_ID (8 , 0x01 ),
398445
399446 // Contact 1
400- HID_RI_USAGE (8 , 0x22 ), // Finger
401- HID_RI_COLLECTION (8 , 0x00 ), // Physical
402- HID_RI_PUSH (0 ),
403- HID_RI_LOGICAL_MINIMUM (8 , 0x00 ),
404- HID_RI_LOGICAL_MAXIMUM (8 , 0x01 ),
405- // Tip Switch, Confidence (2 bits)
406- HID_RI_USAGE (8 , 0x47 ), // Confidence
407- HID_RI_USAGE (8 , 0x42 ), // Tip Switch
408- HID_RI_REPORT_COUNT (8 , 0x02 ),
409- HID_RI_REPORT_SIZE (8 , 0x01 ),
410- HID_RI_INPUT (8 , HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE ),
411-
412- // Padding (6 bits)
413- HID_RI_REPORT_SIZE (8 , 0x01 ),
414- HID_RI_REPORT_COUNT (8 , 0x06 ),
415- HID_RI_INPUT (8 , HID_IOF_CONSTANT ),
416-
417- // Contact identifier (3 bits)
418- HID_RI_REPORT_COUNT (8 , 0x01 ),
419- HID_RI_REPORT_SIZE (8 , 0x03 ),
420- HID_RI_LOGICAL_MAXIMUM (8 , 0x05 ),
421- HID_RI_USAGE (8 , 0x51 ), // Contact identifier
422- HID_RI_INPUT (8 , HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE ),
423-
424- // Padding (5 bits)
425- HID_RI_REPORT_SIZE (8 , 0x01 ),
426- HID_RI_REPORT_COUNT (8 , 0x05 ),
427- HID_RI_INPUT (8 , HID_IOF_CONSTANT ),
428-
429- // X/Y Position (4 bytes)
430- HID_RI_USAGE_PAGE (8 , 0x01 ), // Generic Desktop
431- HID_RI_LOGICAL_MINIMUM (8 , 0x0 ),
432- HID_RI_LOGICAL_MAXIMUM (16 , TRACKPAD_LOGICAL_MAX ),
433- HID_RI_REPORT_SIZE (8 , 16 ),
434- HID_RI_UNIT_EXPONENT (8 , 0x0E ), // -2
435- HID_RI_UNIT (8 , 0x11 ), // CM, English Linear
436- HID_RI_USAGE (8 , 0x30 ), // X
437- HID_RI_PHYSICAL_MINIMUM (8 , 0x0 ),
438- HID_RI_PHYSICAL_MAXIMUM (16 , (TRACKPAD_PHYSICAL_WIDTH )),
439- HID_RI_REPORT_COUNT (8 , 0x01 ),
440- HID_RI_INPUT (8 , HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE ),
441- HID_RI_LOGICAL_MAXIMUM (16 , TRACKPAD_LOGICAL_MAX ),
442- HID_RI_PHYSICAL_MAXIMUM (16 , (TRACKPAD_PHYSICAL_HEIGHT )),
443- HID_RI_USAGE (8 , 0x31 ), // Y
444- HID_RI_INPUT (8 , HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE ),
445- HID_RI_POP (0 ),
446- HID_RI_END_COLLECTION (0 ),
447+ PTP_FINGER_COLLECTION ,
447448
448449 // Contact 2
449- HID_RI_USAGE_PAGE (8 , 0x0D ), // Digitizers
450- HID_RI_USAGE (8 , 0x22 ), // Finger
451- HID_RI_COLLECTION (8 , 0x00 ), // Physical
452- HID_RI_PUSH (0 ),
453- HID_RI_LOGICAL_MINIMUM (8 , 0x00 ),
454- HID_RI_LOGICAL_MAXIMUM (8 , 0x01 ),
455- // Tip Switch, Confidence (2 bits)
456- HID_RI_USAGE (8 , 0x47 ), // Confidence
457- HID_RI_USAGE (8 , 0x42 ), // Tip Switch
458- HID_RI_REPORT_COUNT (8 , 0x02 ),
459- HID_RI_REPORT_SIZE (8 , 0x01 ),
460- HID_RI_INPUT (8 , HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE ),
461-
462- // Padding (6 bits)
463- HID_RI_REPORT_SIZE (8 , 0x01 ),
464- HID_RI_REPORT_COUNT (8 , 0x06 ),
465- HID_RI_INPUT (8 , HID_IOF_CONSTANT ),
466-
467- // Contact identifier (3 bits)
468- HID_RI_REPORT_COUNT (8 , 0x01 ),
469- HID_RI_REPORT_SIZE (8 , 0x03 ),
470- HID_RI_LOGICAL_MAXIMUM (8 , 0x05 ),
471- HID_RI_USAGE (8 , 0x51 ), // Contact identifier
472- HID_RI_INPUT (8 , HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE ),
473-
474- // Padding (5 bits)
475- HID_RI_REPORT_SIZE (8 , 0x01 ),
476- HID_RI_REPORT_COUNT (8 , 0x05 ),
477- HID_RI_INPUT (8 , HID_IOF_CONSTANT ),
478-
479- // X/Y Position (4 bytes)
480- HID_RI_USAGE_PAGE (8 , 0x01 ), // Generic Desktop
481- HID_RI_LOGICAL_MINIMUM (8 , 0x0 ),
482- HID_RI_LOGICAL_MAXIMUM (16 , TRACKPAD_LOGICAL_MAX ),
483- HID_RI_REPORT_SIZE (8 , 16 ),
484- HID_RI_UNIT_EXPONENT (8 , 0x0E ), // -2
485- HID_RI_UNIT (8 , 0x11 ), // CM, English Linear
486- HID_RI_USAGE (8 , 0x30 ), // X
487- HID_RI_PHYSICAL_MINIMUM (8 , 0x0 ),
488- HID_RI_PHYSICAL_MAXIMUM (16 , (TRACKPAD_PHYSICAL_WIDTH )),
489- HID_RI_REPORT_COUNT (8 , 0x01 ),
490- HID_RI_INPUT (8 , HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE ),
491- HID_RI_LOGICAL_MAXIMUM (16 , TRACKPAD_LOGICAL_MAX ),
492- HID_RI_PHYSICAL_MAXIMUM (16 , (TRACKPAD_PHYSICAL_HEIGHT )),
493- HID_RI_USAGE (8 , 0x31 ), // Y
494- HID_RI_INPUT (8 , HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE ),
495- HID_RI_POP (0 ),
496- HID_RI_END_COLLECTION (0 ),
450+ HID_RI_USAGE_PAGE (8 , 0x0D ), // Digitizers (reset usage page after Generic Desktop)
451+ PTP_FINGER_COLLECTION ,
497452
498453 // Scan Time and Contact Count
499454 HID_RI_PUSH (0 ),
0 commit comments