diff options
author | Joel Challis <git@zvecr.com> | 2021-10-20 21:18:49 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-20 21:18:49 +0100 |
commit | d4be4b67a251ecc046d857c5cd00cfb37c394ab7 (patch) | |
tree | 15f6dd05ec293081782a9b42a30e1a81b33b6aa0 /drivers/ps2/ps2.h | |
parent | 5500c428dd41348243e8a1695986b0da070e2ffa (diff) | |
download | qmk_firmware-d4be4b67a251ecc046d857c5cd00cfb37c394ab7.tar.gz qmk_firmware-d4be4b67a251ecc046d857c5cd00cfb37c394ab7.zip |
Relocate PS2 code (#14895)
* Relocate ps2 protocol code
* clang
* Move makefile logic
Diffstat (limited to 'drivers/ps2/ps2.h')
-rw-r--r-- | drivers/ps2/ps2.h | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/drivers/ps2/ps2.h b/drivers/ps2/ps2.h new file mode 100644 index 000000000..f12319285 --- /dev/null +++ b/drivers/ps2/ps2.h | |||
@@ -0,0 +1,139 @@ | |||
1 | /* | ||
2 | Copyright 2010,2011,2012,2013 Jun WAKO <wakojun@gmail.com> | ||
3 | |||
4 | This software is licensed with a Modified BSD License. | ||
5 | All of this is supposed to be Free Software, Open Source, DFSG-free, | ||
6 | GPL-compatible, and OK to use in both free and proprietary applications. | ||
7 | Additions and corrections to this file are welcome. | ||
8 | |||
9 | |||
10 | Redistribution and use in source and binary forms, with or without | ||
11 | modification, are permitted provided that the following conditions are met: | ||
12 | |||
13 | * Redistributions of source code must retain the above copyright | ||
14 | notice, this list of conditions and the following disclaimer. | ||
15 | |||
16 | * Redistributions in binary form must reproduce the above copyright | ||
17 | notice, this list of conditions and the following disclaimer in | ||
18 | the documentation and/or other materials provided with the | ||
19 | distribution. | ||
20 | |||
21 | * Neither the name of the copyright holders nor the names of | ||
22 | contributors may be used to endorse or promote products derived | ||
23 | from this software without specific prior written permission. | ||
24 | |||
25 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||
26 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
27 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
28 | ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | ||
29 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||
30 | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||
31 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||
32 | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||
33 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||
34 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
35 | POSSIBILITY OF SUCH DAMAGE. | ||
36 | */ | ||
37 | |||
38 | #pragma once | ||
39 | |||
40 | #include <stdbool.h> | ||
41 | #include "wait.h" | ||
42 | #include "ps2_io.h" | ||
43 | #include "print.h" | ||
44 | |||
45 | /* | ||
46 | * Primitive PS/2 Library for AVR | ||
47 | * | ||
48 | * PS/2 Resources | ||
49 | * -------------- | ||
50 | * [1] The PS/2 Mouse/Keyboard Protocol | ||
51 | * http://www.computer-engineering.org/ps2protocol/ | ||
52 | * Concise and thorough primer of PS/2 protocol. | ||
53 | * | ||
54 | * [2] Keyboard and Auxiliary Device Controller | ||
55 | * http://www.mcamafia.de/pdf/ibm_hitrc07.pdf | ||
56 | * Signal Timing and Format | ||
57 | * | ||
58 | * [3] Keyboards(101- and 102-key) | ||
59 | * http://www.mcamafia.de/pdf/ibm_hitrc11.pdf | ||
60 | * Keyboard Layout, Scan Code Set, POR, and Commands. | ||
61 | * | ||
62 | * [4] PS/2 Reference Manuals | ||
63 | * http://www.mcamafia.de/pdf/ibm_hitrc07.pdf | ||
64 | * Collection of IBM Personal System/2 documents. | ||
65 | * | ||
66 | * [5] TrackPoint Engineering Specifications for version 3E | ||
67 | * https://web.archive.org/web/20100526161812/http://wwwcssrv.almaden.ibm.com/trackpoint/download.html | ||
68 | */ | ||
69 | #define PS2_ACK 0xFA | ||
70 | #define PS2_RESEND 0xFE | ||
71 | #define PS2_SET_LED 0xED | ||
72 | |||
73 | // TODO: error numbers | ||
74 | #define PS2_ERR_NONE 0 | ||
75 | #define PS2_ERR_STARTBIT1 1 | ||
76 | #define PS2_ERR_STARTBIT2 2 | ||
77 | #define PS2_ERR_STARTBIT3 3 | ||
78 | #define PS2_ERR_PARITY 0x10 | ||
79 | #define PS2_ERR_NODATA 0x20 | ||
80 | |||
81 | #define PS2_LED_SCROLL_LOCK 0 | ||
82 | #define PS2_LED_NUM_LOCK 1 | ||
83 | #define PS2_LED_CAPS_LOCK 2 | ||
84 | |||
85 | extern uint8_t ps2_error; | ||
86 | |||
87 | void ps2_host_init(void); | ||
88 | uint8_t ps2_host_send(uint8_t data); | ||
89 | uint8_t ps2_host_recv_response(void); | ||
90 | uint8_t ps2_host_recv(void); | ||
91 | void ps2_host_set_led(uint8_t usb_led); | ||
92 | |||
93 | /*-------------------------------------------------------------------- | ||
94 | * static functions | ||
95 | *------------------------------------------------------------------*/ | ||
96 | static inline uint16_t wait_clock_lo(uint16_t us) { | ||
97 | while (clock_in() && us) { | ||
98 | asm(""); | ||
99 | wait_us(1); | ||
100 | us--; | ||
101 | } | ||
102 | return us; | ||
103 | } | ||
104 | static inline uint16_t wait_clock_hi(uint16_t us) { | ||
105 | while (!clock_in() && us) { | ||
106 | asm(""); | ||
107 | wait_us(1); | ||
108 | us--; | ||
109 | } | ||
110 | return us; | ||
111 | } | ||
112 | static inline uint16_t wait_data_lo(uint16_t us) { | ||
113 | while (data_in() && us) { | ||
114 | asm(""); | ||
115 | wait_us(1); | ||
116 | us--; | ||
117 | } | ||
118 | return us; | ||
119 | } | ||
120 | static inline uint16_t wait_data_hi(uint16_t us) { | ||
121 | while (!data_in() && us) { | ||
122 | asm(""); | ||
123 | wait_us(1); | ||
124 | us--; | ||
125 | } | ||
126 | return us; | ||
127 | } | ||
128 | |||
129 | /* idle state that device can send */ | ||
130 | static inline void idle(void) { | ||
131 | clock_hi(); | ||
132 | data_hi(); | ||
133 | } | ||
134 | |||
135 | /* inhibit device to send */ | ||
136 | static inline void inhibit(void) { | ||
137 | clock_lo(); | ||
138 | data_hi(); | ||
139 | } | ||