tomu-quickstart
                                
                                 tomu-quickstart copied to clipboard
                                
                                    tomu-quickstart copied to clipboard
                            
                            
                            
                        HID Keyboard example?
Hi, First, Tomu is really impressive.
Now, I'm looking for an example on how to make keys injection. Did I missed it somewhere? Thanks
Keyboards and mice are very similar, with two subtle differences:
- Keyboards have a lot more keys, and as a result tend to report which key was pressed rather than which keys are pressed, and
- Keyboards report keyDown and keyUp separately, whereas mice always report a movement event.
First, you'll have to modify the USB report descriptors.
- Update the HID report descriptor on https://github.com/im-tomu/tomu-quickstart/blob/master/usb-hid/usb-hid.c#L78 and replace it with a Keyboard report.  Report descriptors start with 0x05, 0x01 /* USAGE_PAGE (Generic Desktop) */in case you'd like to play around with other descriptor types. This should be a straight copy-and-paste job. An example I just found was:
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x06, // USAGE (Keyboard)
0xa1, 0x01, // COLLECTION (Application)
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x08, // REPORT_COUNT (8)
0x81, 0x02, // INPUT (Data,Var,Abs) //1 byte
 
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x08, // REPORT_SIZE (8)
0x81, 0x03, // INPUT (Cnst,Var,Abs) //1 byte
 
0x95, 0x06, // REPORT_COUNT (6)
0x75, 0x08, // REPORT_SIZE (8)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x65, // LOGICAL_MAXIMUM (101)
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
0x81, 0x00, // INPUT (Data,Ary,Abs) //6 bytes
 
0xc0 // END_COLLECTION
- 
Update the packet size at https://github.com/im-tomu/tomu-quickstart/blob/master/usb-hid/usb-hid.c#L144 to be 8 bytes 
- 
Change the protocol to "1" for keyboard at https://github.com/im-tomu/tomu-quickstart/blob/master/usb-hid/usb-hid.c#L156 
Next (and finally), you'll need to modify the packet that gets defined at https://github.com/im-tomu/tomu-quickstart/blob/master/usb-hid/usb-hid.c#L240 and sent at https://github.com/im-tomu/tomu-quickstart/blob/master/usb-hid/usb-hid.c#L257. The mouse descriptor is 4 bytes (first byte is the buttons, next byte is X, next byte is Y, next byte is mouse wheel).
The keyboard descriptor is described at https://damogranlabs.com/2018/02/stm32-usb-hid-mouse-keyboard/ but basically to send an "a" you'd write "{0, 0, 4, 0, 0, 0, 0, 0}", and to send a "release key 'a'" you'd write "{0, 0, 0, 0, 0, 0, 0, 0}".
Thank a lot xobs.
Tomu is writing a's now.
In line 217 I also changed the 4 for an 8 (buffer size I suppose) usbd_ep_setup(dev, 0x81, USB_ENDPOINT_ATTR_INTERRUPT, 4, NULL); // previous mouse usbd_ep_setup(dev, 0x81, USB_ENDPOINT_ATTR_INTERRUPT, 8, NULL); // keyboard
Neat! Would you like to submit a PR with the keyboard HID example?
Of course! Thanks. I've created another directory named usb-hid-keyboard and transfer the code in there. But I have never used Git for other purpose than clone... What shall I do now?
The easiest is to probably use the Github flow:
- Fork the repository.  Click the Forkbutton up top.
- Add it as a remote.  git remote add honos https://github.com/Honos2014/tomu-quickstart.git
- Commit your change.  git commit usb-hid-keyboard/Makefile usb-hid-keyboard/yourfilename.c
- Push your change. git push honos master
- Open a Pull Request. At the top of https://github.com/Honos2014/tomu-quickstart a new button will appear.
Closed by 334a395c964b309225b993435d1203cf65fd9586