JOYSTICK_REPORT_DESCRIPTOR = bytes((
    0x05, 0x01,    # UsagePage(Generic Desktop[0x0001])
    0x09, 0x04,    # UsageId(Joystick[0x0004])
    0xA1, 0x01,    # Collection(Application)
    0x85, 0x01,    #     ReportId(1)
    0x05, 0x09,    #     UsagePage(Button[0x0009])
    0x19, 0x01,    #     UsageIdMin(Button 1[0x0001])
    0x29, 0x05,    #     UsageIdMax(Button 5[0x0005])
    0x15, 0x00,    #     LogicalMinimum(0)
    0x25, 0x01,    #     LogicalMaximum(1)
    0x95, 0x05,    #     ReportCount(5)
    0x75, 0x01,    #     ReportSize(1)
    0x81, 0x02,    #     Input(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
    0x95, 0x01,    #     ReportCount(1)
    0x75, 0x03,    #     ReportSize(3)
    0x81, 0x03,    #     Input(Constant, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
    0xC0,          # EndCollection()
))