typedef struct { // FFB: Set Effect Output Report uint8_t reportId; // =1 uint8_t effectBlockIndex; // 1..40 uint8_t effectType; // 1..12 (effect usages: 26,27,30,31,32,33,34,40,41,42,43,28) //milos, total 11, 28 is removed (custom force) uint16_t duration; // 0..65535, exp -3, s uint16_t triggerRepeatInterval; // 0..65535, exp -3, s //milos int16_t gain; // 0..32767 (physical 0..32767) //milos, was 0(0)..(255)10000, uint8_t uint8_t triggerButton; // button ID (0..8) uint8_t enableAxis; // bits: 0=X, 1=Y, 2=DirectionEnable uint16_t direction; // angle (0=0 .. 65535=35999, exp -2, deg) //milos, 16bit uint16_t startDelay; // 0..65535, exp -3, s //milos, uncommented } USB_FFBReport_SetEffect_Output_Data_t; here is PID part of the HID descriptor responsible for managing constant force effect 0x09, 0x73, // USAGE (Set Constant Force Report) 0xA1, 0x02, // COLLECTION (Logical) 0x85, 0x05, // REPORT_ID (05) 0x09, 0x22, // USAGE (Effect Block Index) 0x15, 0x01, // LOGICAL_MINIMUM (01) 0x25, 0x28, // LOGICAL_MAXIMUM (40) 0x35, 0x01, // PHYSICAL_MINIMUM (01) 0x45, 0x28, // PHYSICAL_MAXIMUM (40) 0x75, 0x08, // REPORT_SIZE (08) 0x95, 0x01, // REPORT_COUNT (01) 0x91, 0x02, // OUTPUT (Data,Var,Abs) 0x09, 0x70, // USAGE (Magnitude) 0x16, 0x01, 0x80, // LOGICAL_MINIMUM (-32767) //milos, my original 0x26, 0xFF, 0x7F, // LOGICAL_MAXIMUM (32767) //milos, my original 0x36, 0x01, 0x80, // PHYSICAL_MINIMUM (-32767) //milos, my original 0x46, 0xFF, 0x7F, // PHYSICAL_MAXIMUM (32767) //milos, my original 0x75, 0x10, // REPORT_SIZE (16) 0x95, 0x01, // REPORT_COUNT (01) 0x91, 0x02, // OUTPUT (Data,Var,Abs) 0xC0, // END COLLECTION () here is PID part of the HID descriptor responsible for managing set effect report 0x09, 0x21, // USAGE (Set Effect Output Report) 0xA1, 0x02, // COLLECTION (Logical) 0x85, 0x01, // REPORT_ID (01) 0x09, 0x22, // USAGE (Effect Block Index) 0x15, 0x01, // LOGICAL_MINIMUM (01) 0x25, 0x28, // LOGICAL_MAXIMUM (40) 0x35, 0x01, // PHYSICAL_MINIMUM (01) 0x45, 0x28, // PHYSICAL_MAXIMUM (40) 0x75, 0x08, // REPORT_SIZE (08) 0x95, 0x01, // REPORT_COUNT (01) 0x91, 0x02, // OUTPUT (Data,Var,Abs) 0x09, 0x25, // USAGE (Effect type) 0xA1, 0x02, // COLLECTION (Logical) 0x09, 0x26, // USAGE (ET Constant Force) 0x09, 0x27, // USAGE (ET Ramp) 0x09, 0x30, // USAGE (ET Square) 0x09, 0x31, // USAGE (ET Sine) 0x09, 0x32, // USAGE (ET Triangle) 0x09, 0x33, // USAGE (ET Sawtooth Up) 0x09, 0x34, // USAGE (ET Sawtooth Down) 0x09, 0x40, // USAGE (ET Spring) 0x09, 0x41, // USAGE (ET Damper) 0x09, 0x42, // USAGE (ET Inertia) 0x09, 0x43, // USAGE (ET Friction) //0x09, 0x28, // USAGE (ET Custom Force Data) //milos, removed custom force effect block //0x25, 0x0C, // LOGICAL_MAXIMUM (12) 0x25, 0x0B, // LOGICAL_MAXIMUM (11) //milos, 1 less effect 0x15, 0x01, // LOGICAL_MINIMUM (01) 0x35, 0x01, // PHYSICAL_MINIMUM (01) //0x45, 0x0C, // PHYSICAL_MAXIMUM (12) 0x45, 0x0B, // PHYSICAL_MAXIMUM (11) //milos, 1 less effect 0x75, 0x08, // REPORT_SIZE (08) 0x95, 0x01, // REPORT_COUNT (01) 0x91, 0x00, // OUTPUT (Data) 0xC0, // END COLLECTION () 0x09, 0x50, // USAGE (Duration) 0x09, 0x54, // USAGE (Trigger Repeat Interval) //0x09, 0x51, // USAGE (Sample Period) //milos, commented 0x15, 0x00, // LOGICAL_MINIMUM (00) 0x27, 0xFF, 0xFF, 0x00, 0x00, // LOGICAL_MAXIMUM (65535) 0x35, 0x00, // PHYSICAL_MINIMUM (00) 0x47, 0xFF, 0xFF, 0x00, 0x00, // PHYSICAL_MAXIMUM (65535) 0x66, 0x01, 0x10, // UNIT (SI Lin:Time) 0x55, 0xFD, // UNIT_EXPONENT (-3) 0x75, 0x10, // REPORT_SIZE (16) //0x95, 0x03, // REPORT_COUNT (03) 0x95, 0x02, // REPORT_COUNT (02) //milos 0x91, 0x02, // OUTPUT (Data,Var,Abs) 0x55, 0x00, // UNIT_EXPONENT (00) 0x66, 0x00, 0x00, // UNIT (None) 0x09, 0x52, // USAGE (Gain) 0x15, 0x00, // LOGICAL_MINIMUM (00) //0x26, 0xFF, 0x00, // LOGICAL_MAXIMUM (255) 0x26, 0xFF, 0x7F, // LOGICAL_MAXIMUM (32767) //milos 0x35, 0x00, // PHYSICAL_MINIMUM (00) //0x46, 0x10, 0x27, // PHYSICAL_MAXIMUM (10000) 0x46, 0xFF, 0x7F, // PHYSICAL_MAXIMUM (32767) //milos //0x75, 0x08, // REPORT_SIZE (08) 0x75, 0x10, // REPORT_SIZE (16) //milos 0x95, 0x01, // REPORT_COUNT (01) 0x91, 0x02, // OUTPUT (Data,Var,Abs) 0x09, 0x53, // USAGE (Trigger Button) 0x15, 0x01, // LOGICAL_MINIMUM (01) 0x25, 0x08, // LOGICAL_MAXIMUM (08) 0x35, 0x01, // PHYSICAL_MINIMUM (01) 0x45, 0x08, // PHYSICAL_MAXIMUM (08) 0x75, 0x08, // REPORT_SIZE (08) 0x95, 0x01, // REPORT_COUNT (01) 0x91, 0x02, // OUTPUT (Data,Var,Abs) 0x09, 0x55, // USAGE (Axes Enable) 0xA1, 0x02, // COLLECTION (Logical) 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x30, // USAGE (X) #ifdef NB_FF_AXIS>1 0x09, 0x31, // USAGE (Y) #endif 0x15, 0x00, // LOGICAL_MINIMUM (00) 0x25, 0x01, // LOGICAL_MAXIMUM (01) 0x75, 0x01, // REPORT_SIZE (01) 0x95, NB_FF_AXIS, // REPORT_COUNT (NB_FF_AXIS) 0x91, 0x02, // OUTPUT (Data,Var,Abs) 0xC0, // END COLLECTION () 0x05, 0x0F, // USAGE_PAGE (Physical Interface) 0x09, 0x56, // USAGE (Direction Enable) 0x95, 0x01, // REPORT_COUNT (01) 0x91, 0x02, // OUTPUT (Data,Var,Abs) 0x95, 0x07 - NB_FF_AXIS, // REPORT_COUNT (05 (2 axes) or 06 (1 axes)) seems to be for padding 0x91, 0x03, // OUTPUT (Constant,Var,Abs) 0x09, 0x57, // USAGE (Direction) 0xA1, 0x02, // COLLECTION (Logical) 0x0B, 0x01, 0x00, 0x0A, 0x00, // USAGE (Ordinals:Instance 1) 0x0B, 0x02, 0x00, 0x0A, 0x00, // USAGE (Ordinals:Instance 2) 0x66, 0x14, 0x00, // UNIT (Eng Rot:Angular Pos) 0x55, 0xFE, // UNIT_EXPONENT (-2) //milos, 16bit 0x15, 0x00, // LOGICAL_MINIMUM (00) 0x27, 0xFF, 0xFF, 0x00, 0x00, // LOGICAL_MAXIMUM (65535) //milos, 16bit 0x35, 0x00, // PHYSICAL_MINIMUM (0) 0x47, 0x9F, 0x8C, 0x00, 0x00, // PHYSICAL_MAXIMUM (35999) //milos, 16bit 0x75, 0x10, // REPORT_SIZE (16) //milos, 16bit 0x95, 0x01, // REPORT_COUNT (01) 0x91, 0x02, // OUTPUT (Data,Var,Abs) 0x55, 0x00, // UNIT_EXPONENT (00) 0x66, 0x00, 0x00, // UNIT (None) 0xC0, // END COLLECTION () 0x05, 0x0F, // USAGE_PAGE (Physical Interface) 0x09, 0xA7, // USAGE (Start Delay) //milos, uncommented 0x66, 0x01, 0x10, // UNIT (SI Lin:Time) 0x55, 0xFD, // UNIT_EXPONENT (-3) 0x15, 0x00, // LOGICAL_MINIMUM (00) 0x27, 0xFF, 0xFF, 0x00, 0x00, // LOGICAL_MAXIMUM (65535) 0x35, 0x00, // PHYSICAL_MINIMUM (00) 0x47, 0xFF, 0xFF, 0x00, 0x00, // PHYSICAL_MAXIMUM (65535) 0x75, 0x10, // REPORT_SIZE (16) 0x95, 0x01, // REPORT_COUNT (01) 0x91, 0x02, // OUTPUT (Data,Var,Abs) //milos, uncommented 0x66, 0x00, 0x00, // UNIT (None) 0x55, 0x00, // UNIT_EXPONENT (00) 0xC0, // END COLLECTION ()