diff options
Diffstat (limited to 'docs/basic_how_keyboards_work.md')
| -rw-r--r-- | docs/basic_how_keyboards_work.md | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/docs/basic_how_keyboards_work.md b/docs/basic_how_keyboards_work.md new file mode 100644 index 000000000..73c3f5c5f --- /dev/null +++ b/docs/basic_how_keyboards_work.md | |||
| @@ -0,0 +1,96 @@ | |||
| 1 | # How keys are registered, and interpreted by computers | ||
| 2 | |||
| 3 | In this file, you can will learn the concepts of how keyboards work over USB, | ||
| 4 | and you'll be able to better understand what you can expect from changing your | ||
| 5 | firmware directly. | ||
| 6 | |||
| 7 | ## Schematic view | ||
| 8 | |||
| 9 | Whenever you type on 1 particular key, here is the chain of actions taking | ||
| 10 | place: | ||
| 11 | |||
| 12 | ``` text | ||
| 13 | +------+ +-----+ +----------+ +----------+ +----+ | ||
| 14 | | User |-------->| Key |------>| Firmware |----->| USB wire |---->| OS | | ||
| 15 | +------+ +-----+ +----------+ +----------+ |----+ | ||
| 16 | ``` | ||
| 17 | |||
| 18 | This scheme is a very simple view of what's going on, and more details follow | ||
| 19 | in the next sections. | ||
| 20 | |||
| 21 | ## 1. You Press a Key | ||
| 22 | |||
| 23 | Whenever you press a key, the firmware of your keyboard can register this event. | ||
| 24 | It can register when the key is pressed, held and released. | ||
| 25 | |||
| 26 | This usually happens with a [periodic scan of key presses with a frequency around 100 hz](https://github.com/benblazak/ergodox-firmware/blob/master/references.md#typical-keyboard-information). | ||
| 27 | This speed often is limited by the mechanical key response time, the protocol | ||
| 28 | to transfer those key presses (here USB HID), and by the software it is used in. | ||
| 29 | |||
| 30 | ## 2. What the Firmware Sends | ||
| 31 | |||
| 32 | The [HID specification](http://www.usb.org/developers/hidpage/Hut1_12v2.pdf) | ||
| 33 | tells what a keyboard can actually send through USB to have a chance to be | ||
| 34 | properly recognised. This includes a pre-defined list of keycodes which are | ||
| 35 | simple numbers from `0x00` to `0xE7`. The firmware assigns a keycode to each | ||
| 36 | key of the keyboard. | ||
| 37 | |||
| 38 | The firmware does not send actually letters or characters, but only keycodes. | ||
| 39 | Thus, by modifying the firmware, you only can modify what keycode is sent over | ||
| 40 | USB for a given key. | ||
| 41 | |||
| 42 | ## 3. What the Operating System Does | ||
| 43 | |||
| 44 | Once the keycode reaches the operating system, a piece of software has to have | ||
| 45 | it match an actual character thanks to a keyboard layout. For example, if your | ||
| 46 | layout is set to QWERTY, a sample of the matching table is as follow: | ||
| 47 | |||
| 48 | ``` text | ||
| 49 | | keycode | character | | ||
| 50 | |---------+-----------| | ||
| 51 | | 0x04 | a/A | | ||
| 52 | | 0x05 | b/B | | ||
| 53 | | 0x06 | c/C | | ||
| 54 | | ... | ... | | ||
| 55 | | 0x1C | y/Y | | ||
| 56 | | 0x1D | z/Z | | ||
| 57 | | ... | ... | | ||
| 58 | |---------+-----------| | ||
| 59 | ``` | ||
| 60 | |||
| 61 | ## Back to the firmware | ||
| 62 | |||
| 63 | As the layout is generally fixed (unless you create your own), the firmware can | ||
| 64 | actually call a keycode by its layout name directly to ease things for you. | ||
| 65 | |||
| 66 | This is exactly what is done here with `KC_A` actually representing `0x04` in | ||
| 67 | QWERTY. The full list can be found in `keycode.txt`. | ||
| 68 | |||
| 69 | ## List of Characters You Can Send | ||
| 70 | |||
| 71 | Putting aside shortcuts, having a limited set of keycodes mapped to a limited | ||
| 72 | layout means that **the list of characters you can assign to a given key only | ||
| 73 | is the ones present in the layout**. | ||
| 74 | |||
| 75 | For example, this means that if you have a QWERTY US layout, and you want to | ||
| 76 | assign 1 key to produce `€` (euro currency symbol), you are unable to do so, | ||
| 77 | because the QWERTY US layout does not have such mapping. You could fix that by | ||
| 78 | using a QWERTY UK layout, or a QWERTY US International. | ||
| 79 | |||
| 80 | You may wonder why a keyboard layout containing all of Unicode is not devised | ||
| 81 | then? The limited number of keycode available through USB simply disallow such | ||
| 82 | a thing. | ||
| 83 | |||
| 84 | ## How to (Maybe) Enter Unicode Characters | ||
| 85 | |||
| 86 | You can have the firmware send *sequences of keys* to use the [software Unicode | ||
| 87 | Input | ||
| 88 | Method](https://en.wikipedia.org/wiki/Unicode_input#Hexadecimal_code_input) of | ||
| 89 | the target operating system, thus effectively entering characters independently | ||
| 90 | of the layout defined in the OS. | ||
| 91 | |||
| 92 | Yet, it does come with multiple disadvantages: | ||
| 93 | |||
| 94 | - Tied to a specific OS a a time (need recompilation when changing OS); | ||
| 95 | - Within a given OS, does not work in all software; | ||
| 96 | - Limited to a subset of Unicode on some systems. | ||
