I am homebuilding a USB driver on STM32. I have managed to get the device to enumerate which is awesome, but only when I disable all the strings (set all ID's to 0). Right now, when I set iManufacturer to 1 in the device descriptor, I am getting this continual bounce back. When I cache all the setup requests, this is what it looks like after a few rounds:
I have absolutely no idea what is wrong. I am getting ZLP's after every packet, I am using the same memory reading and writing techniques as I am for the rest of the driver, but the strings just don't work. I have even verified that the memory is being written correctly. Here is the code for my two strings (0 and 1):
const uint8_t String_0_LANGID[4] =
{
4, 3,
9, 4, // 0x0409 English strings only
};
const uint8_t String_1_ManufacturerID[18] =
{
18, // Length
3, // String descriptor
'a', 0,
'b', 0,
'c', 0,
'd', 0,
'e', 0,
'f', 0,
'g', 0,
'h', 0,
};
Are there hidden rules for what can go in a string? Length? Characters? my VID and PID are both 0x00, 0x00. Thanks!
Edit: I have tried on MacOS and it works fine! Here's the enurmation list:


9, 4to some other language and see if 1033 inwValuechanges (it should). In that way you can check that at least lang descriptor works well. When I was implementing driver, I also included terminating null at end of string (and included it in length)- Not sure if it is mandatory but that is only difference I noticed when briefly looking my code. It is also good idea to test connecting USB device to Linux machine and rundmesglog to see USB enumeration errors.