You need to change few others things to make it work as a gamepad. In usbd_hid_core.c you need to change :
0x02, //nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse
to the 0x00 value.
Other thing, the report descriptor has to be changed, this is mine for a 3-buttons 2-axis gamepad, (you can change it to add button or anything else with the HIDtool) :
__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END =
{
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x05, // USAGE (Game Pad)
0xA1, 0x01, // COLLECTION (Application)
0xA1, 0x00, // COLLECTION (Physical)
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x01, // USAGE_MINIMUM (Button 1)
0x29, 0x03, // USAGE_MAXIMUM (Button 3)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x03, // REPORT_COUNT (3)
0x75, 0x01, // REPORT_SIZE (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x05, // REPORT_SIZE (5)
0x81, 0x07, // INPUT (Cnst,Var,Rel)
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x30, // USAGE (X)
0x09, 0x31, // USAGE (Y)
0x15, 0x81, // LOGICAL_MINIMUM (-127)
0x25, 0x7F, // LOGICAL_MAXIMUM (127)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x02, // REPORT_COUNT (2)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xC0, 0xC0 // END_COLLECTION x2
};
The size of the report descriptor has changed so modify it in usbd_hid_core.c :
#define HID_MOUSE_REPORT_DESC_SIZE 48
Now the gamepad would be recognized. You only need to send a 3 bytes report (the first for the button, et the two others for the axis).
For a test you could do it by using this code in stm32xx_it.c :
static uint8_t *USBD_HID_GetPos (void)
{
static uint8_t HID_Buffer[3] = {0};
static int8_t val_abs_x=0;
static uint8_t sens_x=0;
HID_Buffer[1] = 0;
HID_Buffer[2] = 0;
// X move
if (val_abs_x > 120)
{
sens_x = 0; // --
HID_Buffer[0]=0;
}
else if (val_abs_x < -120)
{
sens_x = 1; // ++
HID_Buffer[0]=1;
}
if (sens_x == 1)
val_abs_x = val_abs_x + 3;
else
val_abs_x = val_abs_x - 3;
HID_Buffer[1] = val_abs_x;
HID_Buffer[2] = 0;
return HID_Buffer;
}
Anf finally change the line (in the same file) :
USBD_HID_SendReport (&USB_OTG_dev, buf, 4);
to :
USBD_HID_SendReport (&USB_OTG_dev, buf, 3);
This should work well on the STM32f4 discovery board. If not try change the PID by adding 1 (like 0x5711) in usbd_desc.c).
The main problem of your divider is that it consumes pretty high current.
In general, the oscilloscope (or any other voltmeter type device) needs to has as higher input impedance as possible.
As a rule the input impedance should be 10MOhm and even higher.
Although, the high resistance needs some frequency compensation in order to divide all frequencies by the same coefficient.
If your signal source is powerful enough and can handle such low impedance without affecting the signal properties, then no problem to use your divider.
Anyway, using voltage dividing probe (10x) that contains high impedance, frequency compensated divider, can save you a lot of troubles and to increase the accuracy of your measurements.
Best Answer
Don't ground the data lines. They are above ground. Beyond Logic says
You need to connect scope ground to USB ground. Otherwise you're killing one of the signals and the differential receiver will not detect the required phase reversal.
With scope connected to ground a single channel scope can monitor either D+ or D-. A dual channel scope can monitor both and you should see the phase inversion when data is transmitted.