Code Monkey home page Code Monkey logo

Comments (6)

xobs avatar xobs commented on June 26, 2024

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

from tomu-quickstart.

Honos2014 avatar Honos2014 commented on June 26, 2024

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

from tomu-quickstart.

xobs avatar xobs commented on June 26, 2024

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

from tomu-quickstart.

Honos2014 avatar Honos2014 commented on June 26, 2024

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?

from tomu-quickstart.

xobs avatar xobs commented on June 26, 2024

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.

from tomu-quickstart.

xobs avatar xobs commented on June 26, 2024

Closed by 334a395

from tomu-quickstart.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.