What stacks do you find yourself using when programming USB communications?
Tinyusb seems quite flexible. You can write anything. It seems to have quite a bit of "canned" functionality, too, so if you wanted to write a keyboard host, for example, it's a case of trying to work through one of the demos and adapting it to your needs.
The problem with USB is that there is a lot of assumed knowledge as to how it all works. I only started playing with it recently, and it feels like being parachuted into enemy territory without a map. I wrote some of the basic here: https://medium.com/@oblate_24476/introduction-to-usb-from-a-...