commit ef66920bb28b9f00b11f9935f4b6bc9ca56df54f
parent 4a644c6fa264ce300f982e17f84e5e78c837b1ed
Author: Lukas F. Hartmann <lukas@mntre.com>
Date: Sun, 25 Jul 2021 19:25:46 +0200
trackpad: implement horizontal and hi-res scroll/pan
Diffstat:
3 files changed, 65 insertions(+), 12 deletions(-)
diff --git a/reform2-trackpad-fw/Descriptors.c b/reform2-trackpad-fw/Descriptors.c
@@ -58,6 +58,7 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] =
HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
HID_RI_USAGE(8, 0x02), /* Mouse */
HID_RI_COLLECTION(8, 0x01), /* Application */
+ HID_RI_REPORT_ID(8, 0x01),
HID_RI_USAGE(8, 0x01), /* Pointer */
HID_RI_COLLECTION(8, 0x00), /* Physical */
HID_RI_USAGE_PAGE(8, 0x09), /* Button */
@@ -68,9 +69,11 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] =
HID_RI_REPORT_COUNT(8, 0x03),
HID_RI_REPORT_SIZE(8, 0x01),
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
+
HID_RI_REPORT_COUNT(8, 0x01), // 5 bits padding
HID_RI_REPORT_SIZE(8, 0x05),
HID_RI_INPUT(8, HID_IOF_CONSTANT),
+
HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
HID_RI_USAGE(8, 0x30), /* Usage X */
HID_RI_USAGE(8, 0x31), /* Usage Y */
@@ -80,19 +83,46 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] =
HID_RI_PHYSICAL_MAXIMUM(8, 127),
HID_RI_REPORT_COUNT(8, 0x02),
HID_RI_REPORT_SIZE(8, 0x08),
- //HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
+
+ HID_RI_COLLECTION(8, 0x02), /* Logical */
+ // ---
+ HID_RI_REPORT_ID(8, 0x02),
+ HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
+ HID_RI_USAGE(8, 0x48), /* Usage Resolution Multiplier */
+ HID_RI_LOGICAL_MINIMUM(8, 0),
+ HID_RI_LOGICAL_MAXIMUM(8, 1),
+ HID_RI_PHYSICAL_MINIMUM(8, 1),
+ HID_RI_PHYSICAL_MAXIMUM(8, 12), /* Sensitivity of Wheels */
+ HID_RI_REPORT_COUNT(8, 0x01),
+ HID_RI_REPORT_SIZE(8, 0x08),
+ HID_RI_FEATURE(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
// ---
+ // ---
+ HID_RI_REPORT_ID(8, 0x01),
HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
HID_RI_USAGE(8, 0x38), /* Usage Wheel */
HID_RI_LOGICAL_MINIMUM(8, -127),
HID_RI_LOGICAL_MAXIMUM(8, 127),
+ HID_RI_PHYSICAL_MINIMUM(8, 0),
+ HID_RI_PHYSICAL_MAXIMUM(8, 0),
+ HID_RI_REPORT_COUNT(8, 0x01),
+ HID_RI_REPORT_SIZE(8, 0x08),
+ HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
+ // ---
+ // ---
+ HID_RI_REPORT_ID(8, 0x01),
+ HID_RI_USAGE_PAGE(8, 0x0c), /* Consumer */
+ HID_RI_USAGE(16, 0x238), /* Usage AC Pan, Linear Control */
+ HID_RI_LOGICAL_MINIMUM(8, -127),
+ HID_RI_LOGICAL_MAXIMUM(8, 127),
HID_RI_PHYSICAL_MINIMUM(8, -127),
HID_RI_PHYSICAL_MAXIMUM(8, 127),
HID_RI_REPORT_COUNT(8, 0x01),
- HID_RI_REPORT_SIZE(8, 0x08),
- HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
+ HID_RI_REPORT_SIZE(8, 0x08),
+ HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
// ---
+ HID_RI_END_COLLECTION(0),
HID_RI_END_COLLECTION(0),
HID_RI_END_COLLECTION(0),
};
diff --git a/reform2-trackpad-fw/Descriptors.h b/reform2-trackpad-fw/Descriptors.h
@@ -95,6 +95,12 @@ typedef struct
int8_t X;
int8_t Y;
int8_t Wheel;
+ int8_t Pan;
} ATTR_PACKED USB_WheelMouseReport_Data_t;
+typedef struct
+{
+ int8_t Multiplier;
+} ATTR_PACKED USB_WheelMouseFeatureReport_Data_t;
+
#endif
diff --git a/reform2-trackpad-fw/Mouse.c b/reform2-trackpad-fw/Mouse.c
@@ -115,9 +115,6 @@ USB_ClassInfo_HID_Device_t Mouse_HID_Interface =
},
};
-// LM PD0 input pullup
-// RM PD1 input pullup
-
#define ADDR_SENSOR (0x74<<1)
uint8_t twi_write_reg[1];
@@ -236,13 +233,35 @@ bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDIn
void* ReportData,
uint16_t* const ReportSize)
{
- if (ReportType==HID_REPORT_ITEM_Feature) return false;
+ if (ReportType==HID_REPORT_ITEM_Feature) {
+ if (*ReportID==0) {
+ *ReportID=2;
+ }
+
+ if (*ReportID==2) {
+ USB_WheelMouseFeatureReport_Data_t* FeatureReport = (USB_WheelMouseFeatureReport_Data_t*)ReportData;
+ FeatureReport->Multiplier = 2;
+ *ReportSize = sizeof(USB_WheelMouseFeatureReport_Data_t);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ if (*ReportID==0) {
+ *ReportID=1;
+ }
+
+ if (*ReportID!=1) {
+ return false;
+ }
USB_WheelMouseReport_Data_t* MouseReport = (USB_WheelMouseReport_Data_t*)ReportData;
// note: look for IQS550
MouseReport->Button = 0;
+ MouseReport->Pan = 0;
MouseReport->Wheel = 0;
MouseReport->X = 0;
MouseReport->Y = 0;
@@ -323,11 +342,9 @@ bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDIn
//if (dyy<=-MOTION_CLIP) dyy=-MOTION_CLIP;
if (wheeling) {
- float sgn = 1;
- if (dyy<0) sgn = -1;
- if (dyy>=2 || dyy<=-2) {
- MouseReport->Wheel = (-sgn) * sqrt(sgn*dyy);
- }
+ // horizontal and vertical scrolling
+ MouseReport->Pan = dxx;
+ MouseReport->Wheel = -dyy;
} else {
// normal movement
MouseReport->X = dxx;