Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HID Keyboard example? #10

Open
Honos2014 opened this issue Jul 28, 2018 · 6 comments
Open

HID Keyboard example? #10

Honos2014 opened this issue Jul 28, 2018 · 6 comments

Comments

@Honos2014
Copy link

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

@xobs
Copy link
Member

xobs commented Jul 29, 2018

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

@Honos2014
Copy link
Author

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

@xobs
Copy link
Member

xobs commented Aug 2, 2018

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

@Honos2014
Copy link
Author

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?

@xobs
Copy link
Member

xobs commented Aug 4, 2018

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
Copy link
Member

xobs commented Aug 13, 2018

Closed by 334a395

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants