tomu-quickstart icon indicating copy to clipboard operation
tomu-quickstart copied to clipboard

HID Keyboard example?

Open Honos2014 opened this issue 7 years ago • 6 comments

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

Honos2014 avatar Jul 28 '18 14:07 Honos2014

Keyboards and mice are very similar, with two subtle differences:

  1. Keyboards have a lot more keys, and as a result tend to report which key was pressed rather than which keys are pressed, and
  2. Keyboards report keyDown and keyUp separately, whereas mice always report a movement event.

First, you'll have to modify the USB report descriptors.

  1. 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
  1. Update the packet size at https://github.com/im-tomu/tomu-quickstart/blob/master/usb-hid/usb-hid.c#L144 to be 8 bytes

  2. 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}".

xobs avatar Jul 29 '18 01:07 xobs

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

Honos2014 avatar Jul 29 '18 13:07 Honos2014

Neat! Would you like to submit a PR with the keyboard HID example?

xobs avatar Aug 02 '18 02:08 xobs

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?

Honos2014 avatar Aug 04 '18 13:08 Honos2014

The easiest is to probably use the Github flow:

  1. Fork the repository. Click the Fork button up top.
  2. Add it as a remote. git remote add honos https://github.com/Honos2014/tomu-quickstart.git
  3. Commit your change. git commit usb-hid-keyboard/Makefile usb-hid-keyboard/yourfilename.c
  4. Push your change. git push honos master
  5. Open a Pull Request. At the top of https://github.com/Honos2014/tomu-quickstart a new button will appear.

xobs avatar Aug 04 '18 15:08 xobs

Closed by 334a395c964b309225b993435d1203cf65fd9586

xobs avatar Aug 13 '18 20:08 xobs