Skip to content

Commit

Permalink
Merge pull request #305 from mdevaev/master
Browse files Browse the repository at this point in the history
Improved compatibility with Mac
  • Loading branch information
NicoHood authored Jul 14, 2021
2 parents b8c0782 + da54332 commit dd9904c
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 9 deletions.
39 changes: 30 additions & 9 deletions src/SingleReport/BootMouse.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ static const uint8_t _hidReportDescriptorMouse[] PROGMEM = {
0x09, 0x02, /* USAGE (Mouse) */
0xa1, 0x01, /* COLLECTION (Application) */

/* Pointer and Physical are required by Apple Recovery */
0x09, 0x01, /* USAGE (Pointer) */
0xa1, 0x00, /* COLLECTION (Physical) */

/* 8 Buttons */
0x05, 0x09, /* USAGE_PAGE (Button) */
0x19, 0x01, /* USAGE_MINIMUM (Button 1) */
Expand All @@ -51,6 +55,7 @@ static const uint8_t _hidReportDescriptorMouse[] PROGMEM = {
0x81, 0x06, /* INPUT (Data,Var,Rel) */

/* End */
0xc0, /* END_COLLECTION (Physical) */
0xc0 /* END_COLLECTION */
};

Expand All @@ -73,18 +78,24 @@ int BootMouse_::getInterface(uint8_t* interfaceCount)

int BootMouse_::getDescriptor(USBSetup& setup)
{
// Check if this is a HID Class Descriptor request
if (setup.bmRequestType != REQUEST_DEVICETOHOST_STANDARD_INTERFACE) { return 0; }
if (setup.wValueH != HID_REPORT_DESCRIPTOR_TYPE) { return 0; }

// In a HID Class Descriptor wIndex cointains the interface number
if (setup.wIndex != pluggedInterface) { return 0; }

// Reset the protocol on reenumeration. Normally the host should not assume the state of the protocol
// due to the USB specs, but Windows and Linux just assumes its in report mode.
protocol = HID_REPORT_PROTOCOL;
// Check if this is a HID Class Descriptor request
if (setup.bmRequestType != REQUEST_DEVICETOHOST_STANDARD_INTERFACE) { return 0; }

if (setup.wValueH == HID_HID_DESCRIPTOR_TYPE) {
// Apple UEFI wants it
HIDDescDescriptor desc = D_HIDREPORT(sizeof(_hidReportDescriptorMouse));
return USB_SendControl(0, &desc, sizeof(desc));
} else if (setup.wValueH == HID_REPORT_DESCRIPTOR_TYPE) {
// Reset the protocol on reenumeration. Normally the host should not assume the state of the protocol
// due to the USB specs, but Windows and Linux just assumes its in report mode.
protocol = HID_REPORT_PROTOCOL;
return USB_SendControl(TRANSFER_PGM, _hidReportDescriptorMouse, sizeof(_hidReportDescriptorMouse));
}

return USB_SendControl(TRANSFER_PGM, _hidReportDescriptorMouse, sizeof(_hidReportDescriptorMouse));
return 0;
}

bool BootMouse_::setup(USBSetup& setup)
Expand All @@ -103,7 +114,17 @@ bool BootMouse_::setup(USBSetup& setup)
return true;
}
if (request == HID_GET_PROTOCOL) {
// TODO: Send8(protocol);
// TODO improve
#ifdef __AVR__
UEDATX = protocol;
#endif
return true;
}
if (request == HID_GET_IDLE) {
// TODO improve
#ifdef __AVR__
UEDATX = idle;
#endif
return true;
}
}
Expand Down
5 changes: 5 additions & 0 deletions src/SingleReport/SingleAbsoluteMouse.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ static const uint8_t _hidSingleReportDescriptorAbsoluteMouse[] PROGMEM = {
0x09, 0x02, /* USAGE (Mouse) */
0xA1, 0x01, /* COLLECTION (Application) */

/* Pointer and Physical are required by Apple Recovery */
0x09, 0x01, /* USAGE (Pointer) */
0xa1, 0x00, /* COLLECTION (Physical) */

/* 8 Buttons */
0x05, 0x09, /* USAGE_PAGE (Button) */
0x19, 0x01, /* USAGE_MINIMUM (Button 1) */
Expand Down Expand Up @@ -58,6 +62,7 @@ static const uint8_t _hidSingleReportDescriptorAbsoluteMouse[] PROGMEM = {
0x81, 0x06, /* INPUT (Data,Var,Rel) */

/* End */
0xc0, /* END_COLLECTION (Physical) */
0xc0 /* END_COLLECTION */
};

Expand Down

0 comments on commit dd9904c

Please sign in to comment.