Pico BLE HID
This project uses a Raspberry Pi Pico W microcontroller as a USB human interface device to Bluetooth Low Energy adapter. (YouTube Video)
The Raspberry Pi Pico W acts both as a USB host using TinyUSB and as a BLE device using BTstack. When a USB HID keyboard, mouse, joystick, game controller, or any other input peripheral is plugged into the Pico W, it reads the HID report descriptors on all interfaces, and it combines them into a single report descriptor to be transmitted using the HID over GATT Protocol. Upon receiving an HID input report, it then translates the report ID on the USB host to the appropriate report ID on the BLE GATT service. This allows the Pico W to mimic any USB HID input peripheral over a BLE connection.
In principle, the firmware supports multiple devices plugged into a USB hub. However, there are practical limitations of providing power to all devices through the hub and a limit of 512 bytes for HID report descriptors (i.e. HID report maps) due to the GATT protocol. An alternative approach would be to have multiple GATT services for HID inputs, but this would require a more substantial overhaul of BTstack to accomplish and may not be fully supported by all operating systems.