aboutsummaryrefslogtreecommitdiff
path: root/tmk_core/protocol
diff options
context:
space:
mode:
authorNick Brassel <nick@tzarc.org>2021-09-12 11:46:39 +1000
committerGitHub <noreply@github.com>2021-09-12 02:46:39 +0100
commitd0ac03ec8b2af7334ac657dadcf0601d6f3469c0 (patch)
tree2ffed2e10fa77367ef0fe7117f018a86e52137a7 /tmk_core/protocol
parentcf68c6403c1fd53137e9134a1ac7a550a6595d52 (diff)
downloadqmk_firmware-d0ac03ec8b2af7334ac657dadcf0601d6f3469c0.tar.gz
qmk_firmware-d0ac03ec8b2af7334ac657dadcf0601d6f3469c0.zip
Remove unreferenced IBM4704, Sony NEWS, NeXT keyboard code. (#14380)
Diffstat (limited to 'tmk_core/protocol')
-rw-r--r--tmk_core/protocol/ibm4704.c185
-rw-r--r--tmk_core/protocol/ibm4704.h103
-rw-r--r--tmk_core/protocol/news.c161
-rw-r--r--tmk_core/protocol/news.h48
-rw-r--r--tmk_core/protocol/next_kbd.c219
-rw-r--r--tmk_core/protocol/next_kbd.h60
6 files changed, 0 insertions, 776 deletions
diff --git a/tmk_core/protocol/ibm4704.c b/tmk_core/protocol/ibm4704.c
deleted file mode 100644
index a19443976..000000000
--- a/tmk_core/protocol/ibm4704.c
+++ /dev/null
@@ -1,185 +0,0 @@
1/*
2Copyright 2010,2011,2012,2013 Jun WAKO <wakojun@gmail.com>
3*/
4#include <stdbool.h>
5#include <util/delay.h>
6#include "debug.h"
7#include "ring_buffer.h"
8#include "ibm4704.h"
9
10#define WAIT(stat, us, err) \
11 do { \
12 if (!wait_##stat(us)) { \
13 ibm4704_error = err; \
14 goto ERROR; \
15 } \
16 } while (0)
17
18uint8_t ibm4704_error = 0;
19
20void ibm4704_init(void) {
21 inhibit(); // keep keyboard from sending
22 IBM4704_INT_INIT();
23 IBM4704_INT_ON();
24 idle(); // allow keyboard sending
25}
26
27/*
28Host to Keyboard
29----------------
30Data bits are LSB first and Parity is odd. Clock has around 60us high and 30us low part.
31
32 ____ __ __ __ __ __ __ __ __ __ ________
33Clock \______/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
34 ^ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ___
35Data ____|__/ X____X____X____X____X____X____X____X____X____X \___
36 | Start 0 1 2 3 4 5 6 7 P Stop
37 Request by host
38
39Start bit: can be long as 300-350us.
40Request: Host pulls Clock line down to request to send a command.
41Timing: After Request keyboard pull up Data and down Clock line to low for start bit.
42 After request host release Clock line once Data line becomes hi.
43 Host writes a bit while Clock is hi and Keyboard reads while low.
44Stop bit: Host releases or pulls up Data line to hi after 9th clock and waits for keyboard pull down the line to lo.
45*/
46uint8_t ibm4704_send(uint8_t data) {
47 bool parity = true; // odd parity
48 ibm4704_error = 0;
49
50 IBM4704_INT_OFF();
51
52 /* Request to send */
53 idle();
54 clock_lo();
55
56 /* wait for Start bit(Clock:lo/Data:hi) */
57 WAIT(data_hi, 300, 0x30);
58
59 /* Data bit */
60 for (uint8_t i = 0; i < 8; i++) {
61 WAIT(clock_hi, 100, 0x40 + i);
62 if (data & (1 << i)) {
63 parity = !parity;
64 data_hi();
65 } else {
66 data_lo();
67 }
68 WAIT(clock_lo, 100, 0x48 + i);
69 }
70
71 /* Parity bit */
72 WAIT(clock_hi, 100, 0x34);
73 if (parity) {
74 data_hi();
75 } else {
76 data_lo();
77 }
78 WAIT(clock_lo, 100, 0x35);
79
80 /* Stop bit */
81 WAIT(clock_hi, 100, 0x34);
82 data_hi();
83
84 /* End */
85 WAIT(data_lo, 100, 0x36);
86
87 idle();
88 IBM4704_INT_ON();
89 return 0;
90ERROR:
91 idle();
92 if (ibm4704_error > 0x30) {
93 xprintf("S:%02X ", ibm4704_error);
94 }
95 IBM4704_INT_ON();
96 return -1;
97}
98
99/* wait forever to receive data */
100uint8_t ibm4704_recv_response(void) {
101 while (!rbuf_has_data()) {
102 _delay_ms(1);
103 }
104 return rbuf_dequeue();
105}
106
107uint8_t ibm4704_recv(void) {
108 if (rbuf_has_data()) {
109 return rbuf_dequeue();
110 } else {
111 return -1;
112 }
113}
114
115/*
116Keyboard to Host
117----------------
118Data bits are LSB first and Parity is odd. Clock has around 60us high and 30us low part.
119
120 ____ __ __ __ __ __ __ __ __ __ _______
121Clock \_____/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
122 ____ ____ ____ ____ ____ ____ ____ ____ ____ ____
123Data ____/ X____X____X____X____X____X____X____X____X____X________
124 Start 0 1 2 3 4 5 6 7 P Stop
125
126Start bit: can be long as 300-350us.
127Inhibit: Pull Data line down to inhibit keyboard to send.
128Timing: Host reads bit while Clock is hi.(rising edge)
129Stop bit: Keyboard pulls down Data line to lo after 9th clock.
130*/
131ISR(IBM4704_INT_VECT) {
132 static enum { BIT0, BIT1, BIT2, BIT3, BIT4, BIT5, BIT6, BIT7, PARITY, STOP } state = BIT0;
133 // LSB first
134 static uint8_t data = 0;
135 // Odd parity
136 static uint8_t parity = false;
137
138 ibm4704_error = 0;
139
140 switch (state) {
141 case BIT0:
142 case BIT1:
143 case BIT2:
144 case BIT3:
145 case BIT4:
146 case BIT5:
147 case BIT6:
148 case BIT7:
149 data >>= 1;
150 if (data_in()) {
151 data |= 0x80;
152 parity = !parity;
153 }
154 break;
155 case PARITY:
156 if (data_in()) {
157 parity = !parity;
158 }
159 if (!parity) goto ERROR;
160 break;
161 case STOP:
162 // Data:Low
163 WAIT(data_lo, 100, state);
164 if (!rbuf_enqueue(data)) {
165 print("rbuf: full\n");
166 }
167 ibm4704_error = IBM4704_ERR_NONE;
168 goto DONE;
169 break;
170 default:
171 goto ERROR;
172 }
173 state++;
174 goto RETURN;
175ERROR:
176 ibm4704_error = state;
177 while (ibm4704_send(0xFE)) _delay_ms(1); // resend
178 xprintf("R:%02X%02X\n", state, data);
179DONE:
180 state = BIT0;
181 data = 0;
182 parity = false;
183RETURN:
184 return;
185}
diff --git a/tmk_core/protocol/ibm4704.h b/tmk_core/protocol/ibm4704.h
deleted file mode 100644
index 4f88d148b..000000000
--- a/tmk_core/protocol/ibm4704.h
+++ /dev/null
@@ -1,103 +0,0 @@
1/*
2Copyright 2014 Jun WAKO <wakojun@gmail.com>
3*/
4
5#pragma once
6
7#define IBM4704_ERR_NONE 0
8#define IBM4704_ERR_PARITY 0x70
9
10void ibm4704_init(void);
11uint8_t ibm4704_send(uint8_t data);
12uint8_t ibm4704_recv_response(void);
13uint8_t ibm4704_recv(void);
14
15/* Check pin configuration */
16#if !(defined(IBM4704_CLOCK_PORT) && defined(IBM4704_CLOCK_PIN) && defined(IBM4704_CLOCK_DDR) && defined(IBM4704_CLOCK_BIT))
17# error "ibm4704 clock pin configuration is required in config.h"
18#endif
19
20#if !(defined(IBM4704_DATA_PORT) && defined(IBM4704_DATA_PIN) && defined(IBM4704_DATA_DDR) && defined(IBM4704_DATA_BIT))
21# error "ibm4704 data pin configuration is required in config.h"
22#endif
23
24/*--------------------------------------------------------------------
25 * static functions
26 *------------------------------------------------------------------*/
27static inline void clock_lo(void) {
28 IBM4704_CLOCK_PORT &= ~(1 << IBM4704_CLOCK_BIT);
29 IBM4704_CLOCK_DDR |= (1 << IBM4704_CLOCK_BIT);
30}
31static inline void clock_hi(void) {
32 /* input with pull up */
33 IBM4704_CLOCK_DDR &= ~(1 << IBM4704_CLOCK_BIT);
34 IBM4704_CLOCK_PORT |= (1 << IBM4704_CLOCK_BIT);
35}
36static inline bool clock_in(void) {
37 IBM4704_CLOCK_DDR &= ~(1 << IBM4704_CLOCK_BIT);
38 IBM4704_CLOCK_PORT |= (1 << IBM4704_CLOCK_BIT);
39 _delay_us(1);
40 return IBM4704_CLOCK_PIN & (1 << IBM4704_CLOCK_BIT);
41}
42static inline void data_lo(void) {
43 IBM4704_DATA_PORT &= ~(1 << IBM4704_DATA_BIT);
44 IBM4704_DATA_DDR |= (1 << IBM4704_DATA_BIT);
45}
46static inline void data_hi(void) {
47 /* input with pull up */
48 IBM4704_DATA_DDR &= ~(1 << IBM4704_DATA_BIT);
49 IBM4704_DATA_PORT |= (1 << IBM4704_DATA_BIT);
50}
51static inline bool data_in(void) {
52 IBM4704_DATA_DDR &= ~(1 << IBM4704_DATA_BIT);
53 IBM4704_DATA_PORT |= (1 << IBM4704_DATA_BIT);
54 _delay_us(1);
55 return IBM4704_DATA_PIN & (1 << IBM4704_DATA_BIT);
56}
57
58static inline uint16_t wait_clock_lo(uint16_t us) {
59 while (clock_in() && us) {
60 asm("");
61 _delay_us(1);
62 us--;
63 }
64 return us;
65}
66static inline uint16_t wait_clock_hi(uint16_t us) {
67 while (!clock_in() && us) {
68 asm("");
69 _delay_us(1);
70 us--;
71 }
72 return us;
73}
74static inline uint16_t wait_data_lo(uint16_t us) {
75 while (data_in() && us) {
76 asm("");
77 _delay_us(1);
78 us--;
79 }
80 return us;
81}
82static inline uint16_t wait_data_hi(uint16_t us) {
83 while (!data_in() && us) {
84 asm("");
85 _delay_us(1);
86 us--;
87 }
88 return us;
89}
90
91/* idle state that device can send */
92static inline void idle(void) {
93 clock_hi();
94 data_hi();
95}
96
97/* inhibit device to send
98 * keyboard checks Data line on start bit(Data:hi) and it stops sending if Data line is low.
99 */
100static inline void inhibit(void) {
101 clock_hi();
102 data_lo();
103}
diff --git a/tmk_core/protocol/news.c b/tmk_core/protocol/news.c
deleted file mode 100644
index 4463e8dd4..000000000
--- a/tmk_core/protocol/news.c
+++ /dev/null
@@ -1,161 +0,0 @@
1/*
2Copyright 2012 Jun WAKO <wakojun@gmail.com>
3
4This software is licensed with a Modified BSD License.
5All of this is supposed to be Free Software, Open Source, DFSG-free,
6GPL-compatible, and OK to use in both free and proprietary applications.
7Additions and corrections to this file are welcome.
8
9
10Redistribution and use in source and binary forms, with or without
11modification, 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
25THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
26AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
29LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35POSSIBILITY OF SUCH DAMAGE.
36*/
37
38#include <stdbool.h>
39#include <avr/io.h>
40#include <avr/interrupt.h>
41#include "news.h"
42
43void news_init(void) { NEWS_KBD_RX_INIT(); }
44
45// RX ring buffer
46#define RBUF_SIZE 8
47static uint8_t rbuf[RBUF_SIZE];
48static uint8_t rbuf_head = 0;
49static uint8_t rbuf_tail = 0;
50
51uint8_t news_recv(void) {
52 uint8_t data = 0;
53 if (rbuf_head == rbuf_tail) {
54 return 0;
55 }
56
57 data = rbuf[rbuf_tail];
58 rbuf_tail = (rbuf_tail + 1) % RBUF_SIZE;
59 return data;
60}
61
62// USART RX complete interrupt
63ISR(NEWS_KBD_RX_VECT) {
64 uint8_t next = (rbuf_head + 1) % RBUF_SIZE;
65 if (next != rbuf_tail) {
66 rbuf[rbuf_head] = NEWS_KBD_RX_DATA;
67 rbuf_head = next;
68 }
69}
70
71/*
72SONY NEWS Keyboard Protocol
73===========================
74
75Resources
76---------
77 Mouse protocol of NWA-5461(Japanese)
78 http://groups.google.com/group/fj.sys.news/browse_thread/thread/a01b3e3ac6ae5b2d
79
80 SONY NEWS Info(Japanese)
81 http://katsu.watanabe.name/doc/sonynews/
82
83
84Pinouts
85-------
86 EIA 232 male connector from NWP-5461
87 -------------
88 \ 1 2 3 4 5 /
89 \ 6 7 8 9 /
90 ---------
91 1 VCC
92 2 BZ(Speaker)
93 3 Keyboard Data(from keyboard MCU TxD)
94 4 NC
95 5 GND
96 6 Unknown Input(to keyboard MCU RxD via schmitt trigger)
97 7 Mouse Data(from Mouse Ext connector)
98 8 Unknown Input(to Keyboard MCU Input via diode and buffer)
99 9 FG
100 NOTE: Two LED on keyboard are controlled by pin 6,8?
101
102 EIA 232 male connector from NWP-411A
103 -------------
104 \ 1 2 3 4 5 /
105 \ 6 7 8 9 /
106 ---------
107 1 VCC
108 2 BZ(Speaker)
109 3 Keyboard Data(from keyboard MCU TxD)
110 4 NC
111 5 GND
112 6 NC
113 7 Mouse Data(from Mouse Ext connector)
114 8 NC
115 9 FG
116 NOTE: These are just from my guess and not confirmed.
117
118
119Signaling
120---------
121 ~~~~~~~~~~ ____XOO0X111X222X333X444X555X666X777~~~~ ~~~~~~~
122 Idle Start LSB MSB Stop Idle
123
124 Idle: High
125 Start bit: Low
126 Stop bit: High
127 Bit order: LSB first
128
129 Baud rate: 9600
130 Interface: TTL level(5V) UART
131
132 NOTE: This is observed on NWP-5461 with its DIP switch all OFF.
133
134
135Format
136------
137 MSB LSB
138 7 6 5 4 3 2 1 0 bit
139 | | | | | | | |
140 | +-+-+-+-+-+-+-- scan code(00-7F)
141 +---------------- break flag: sets when released
142
143
144Scan Codes
145----------
146 SONY NEWS NWP-5461
147 ,---. ,------------------------, ,------------------------. ,---------.
148 | 7A| | 01 | 02 | 03 | 04 | 05 | | 06 | 07 | 08 | 09 | 0A | | 68 | 69 | ,-----------.
149 `---' `------------------------' `------------------------' `---------' | 64| 65| 52|
150 ,-------------------------------------------------------------. ,---. ,---------------|
151 | 0B| 0C| 0D| 0E| 0F| 10| 11| 12| 13| 14| 15| 16| 17| 18| 19 | | 6A| | 4B| 4C| 4D| 4E|
152 |-------------------------------------------------------------| |---| |---------------|
153 | 1A | 1B| 1C| 1D| 1E| 1F| 20| 21| 22| 23| 24| 25| 26| 27| | | 6B| | 4F| 50| 51| 56|
154 |---------------------------------------------------------' | |---| |---------------|
155 | 28 | 29| 2A| 2B| 2C| 2D| 2E| 2F| 30| 31| 32| 33| 34| 35 | | 6C| | 53| 54| 55| |
156 |-------------------------------------------------------------| |---| |-----------| 5A|
157 | 36 | 37| 38| 39| 3A| 3B| 3C| 3D| 3E| 3F| 40| 41| 42 | | 6D| | 57| 59| 58| |
158 |-------------------------------------------------------------| |---| |---------------|
159 | 43 | 44 | 45 | 46 | 47 | 48| 49| 4A | | 6E| | 66| 5B| 5C| 5D|
160 `-------------------------------------------------------------' `---' `---------------'
161*/
diff --git a/tmk_core/protocol/news.h b/tmk_core/protocol/news.h
deleted file mode 100644
index 327a13856..000000000
--- a/tmk_core/protocol/news.h
+++ /dev/null
@@ -1,48 +0,0 @@
1/*
2Copyright 2012 Jun WAKO <wakojun@gmail.com>
3
4This software is licensed with a Modified BSD License.
5All of this is supposed to be Free Software, Open Source, DFSG-free,
6GPL-compatible, and OK to use in both free and proprietary applications.
7Additions and corrections to this file are welcome.
8
9
10Redistribution and use in source and binary forms, with or without
11modification, 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
25THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
26AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
29LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35POSSIBILITY OF SUCH DAMAGE.
36*/
37
38#pragma once
39
40/*
41 * Primitive PS/2 Library for AVR
42 */
43
44/* host role */
45void news_init(void);
46uint8_t news_recv(void);
47
48/* device role */
diff --git a/tmk_core/protocol/next_kbd.c b/tmk_core/protocol/next_kbd.c
deleted file mode 100644
index 6f118e617..000000000
--- a/tmk_core/protocol/next_kbd.c
+++ /dev/null
@@ -1,219 +0,0 @@
1/*
2
3NeXT non-ADB Keyboard Protocol
4
5Copyright 2013, Benjamin Gould (bgould@github.com)
6
7Based on:
8TMK firmware code Copyright 2011,2012 Jun WAKO <wakojun@gmail.com>
9Arduino code by "Ladyada" Limor Fried (http://ladyada.net/, http://adafruit.com/), released under BSD license
10
11Timing reference thanks to http://m0115.web.fc2.com/ (dead link), http://cfile7.uf.tistory.com/image/14448E464F410BF22380BB
12Pinouts thanks to http://www.68k.org/~degs/nextkeyboard.html
13Keycodes from http://ftp.netbsd.org/pub/NetBSD/NetBSD-release-6/src/sys/arch/next68k/dev/
14
15This software is licensed with a Modified BSD License.
16All of this is supposed to be Free Software, Open Source, DFSG-free,
17GPL-compatible, and OK to use in both free and proprietary applications.
18Additions and corrections to this file are welcome.
19
20Redistribution and use in source and binary forms, with or without
21modification, are permitted provided that the following conditions are met:
22
23* Redistributions of source code must retain the above copyright
24 notice, this list of conditions and the following disclaimer.
25
26* Redistributions in binary form must reproduce the above copyright
27 notice, this list of conditions and the following disclaimer in
28 the documentation and/or other materials provided with the
29 distribution.
30
31* Neither the name of the copyright holders nor the names of
32 contributors may be used to endorse or promote products derived
33 from this software without specific prior written permission.
34
35THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
36AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
37IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
38ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
39LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
40CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
41SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
42INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
43CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
44ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
45POSSIBILITY OF SUCH DAMAGE.
46
47*/
48
49#include <stdint.h>
50#include <stdbool.h>
51#include <util/atomic.h>
52#include <util/delay.h>
53#include "next_kbd.h"
54#include "debug.h"
55
56static inline void out_lo(void);
57static inline void out_hi(void);
58static inline void query(void);
59static inline void reset(void);
60static inline uint32_t response(void);
61
62/* The keyboard sends signal with 50us pulse width on OUT line
63 * while it seems to miss the 50us pulse on In line.
64 * next_kbd_set_leds() often fails to sync LED status with 50us
65 * but it works well with 51us(+1us) on TMK converter(ATMeaga32u2) at least.
66 * TODO: test on Teensy and Pro Micro configuration
67 */
68#define out_hi_delay(intervals) \
69 do { \
70 out_hi(); \
71 _delay_us((NEXT_KBD_TIMING + 1) * intervals); \
72 } while (0);
73#define out_lo_delay(intervals) \
74 do { \
75 out_lo(); \
76 _delay_us((NEXT_KBD_TIMING + 1) * intervals); \
77 } while (0);
78#define query_delay(intervals) \
79 do { \
80 query(); \
81 _delay_us((NEXT_KBD_TIMING + 1) * intervals); \
82 } while (0);
83#define reset_delay(intervals) \
84 do { \
85 reset(); \
86 _delay_us((NEXT_KBD_TIMING + 1) * intervals); \
87 } while (0);
88
89void next_kbd_init(void) {
90 out_hi();
91 NEXT_KBD_IN_DDR &= ~(1 << NEXT_KBD_IN_BIT); // KBD_IN to input
92 NEXT_KBD_IN_PORT |= (1 << NEXT_KBD_IN_BIT); // KBD_IN pull up
93
94 query_delay(5);
95 reset_delay(8);
96
97 query_delay(5);
98 reset_delay(8);
99}
100
101void next_kbd_set_leds(bool left, bool right) {
102 cli();
103 out_lo_delay(9);
104
105 out_hi_delay(3);
106 out_lo_delay(1);
107
108 if (left) {
109 out_hi_delay(1);
110 } else {
111 out_lo_delay(1);
112 }
113
114 if (right) {
115 out_hi_delay(1);
116 } else {
117 out_lo_delay(1);
118 }
119
120 out_lo_delay(7);
121 out_hi();
122 sei();
123}
124
125#define NEXT_KBD_READ (NEXT_KBD_IN_PIN & (1 << NEXT_KBD_IN_BIT))
126uint32_t next_kbd_recv(void) {
127 // First check to make sure that the keyboard is actually connected;
128 // if not, just return
129 // TODO: reflect the status of the keyboard in a return code
130 if (!NEXT_KBD_READ) {
131 sei();
132 return 0;
133 }
134
135 query();
136 uint32_t resp = response();
137
138 return resp;
139}
140
141static inline uint32_t response(void) {
142 cli();
143
144 // try a 5ms read; this should be called after the query method has
145 // been run so if a key is pressed we should get a response within
146 // 5ms; if not then send a reset and exit
147 uint8_t i = 0;
148 uint32_t data = 0;
149 uint16_t reset_timeout = 50000;
150 while (NEXT_KBD_READ && reset_timeout) {
151 asm("");
152 _delay_us(1);
153 reset_timeout--;
154 }
155 if (!reset_timeout) {
156 reset();
157 sei();
158 return 0;
159 }
160 _delay_us(NEXT_KBD_TIMING / 2);
161 for (; i < 22; i++) {
162 if (NEXT_KBD_READ) {
163 data |= ((uint32_t)1 << i);
164 /* Note:
165 * My testing with the ATmega32u4 showed that there might
166 * something wrong with the timing here; by the end of the
167 * second data byte some of the modifiers can get bumped out
168 * to the next bit over if we just cycle through the data
169 * based on the expected interval. There is a bit (i = 10)
170 * in the middle of the data that is always on followed by
171 * one that is always off - so we'll use that to reset our
172 * timing in case we've gotten ahead of the keyboard;
173 */
174 if (i == 10) {
175 i++;
176 while (NEXT_KBD_READ)
177 ;
178 _delay_us(NEXT_KBD_TIMING / 2);
179 }
180 } else {
181 /* redundant - but I don't want to remove if it might screw
182 * up the timing
183 */
184 data |= ((uint32_t)0 << i);
185 }
186 _delay_us(NEXT_KBD_TIMING);
187 }
188
189 sei();
190
191 return data;
192}
193
194static inline void out_lo(void) {
195 NEXT_KBD_OUT_PORT &= ~(1 << NEXT_KBD_OUT_BIT);
196 NEXT_KBD_OUT_DDR |= (1 << NEXT_KBD_OUT_BIT);
197}
198
199static inline void out_hi(void) {
200 /* input with pull up */
201 NEXT_KBD_OUT_DDR &= ~(1 << NEXT_KBD_OUT_BIT);
202 NEXT_KBD_OUT_PORT |= (1 << NEXT_KBD_OUT_BIT);
203}
204
205static inline void query(void) {
206 out_lo_delay(5);
207 out_hi_delay(1);
208 out_lo_delay(3);
209 out_hi();
210}
211
212static inline void reset(void) {
213 out_lo_delay(1);
214 out_hi_delay(4);
215 out_lo_delay(1);
216 out_hi_delay(6);
217 out_lo_delay(10);
218 out_hi();
219}
diff --git a/tmk_core/protocol/next_kbd.h b/tmk_core/protocol/next_kbd.h
deleted file mode 100644
index 1249ebf39..000000000
--- a/tmk_core/protocol/next_kbd.h
+++ /dev/null
@@ -1,60 +0,0 @@
1/*
2NeXT non-ADB Keyboard Protocol
3
4Copyright 2013, Benjamin Gould (bgould@github.com)
5
6Based on:
7TMK firmware code Copyright 2011,2012 Jun WAKO <wakojun@gmail.com>
8Arduino code by "Ladyada" Limor Fried (http://ladyada.net/, http://adafruit.com/), released under BSD license
9
10Timing reference thanks to http://m0115.web.fc2.com/ (dead link), http://cfile7.uf.tistory.com/image/14448E464F410BF22380BB
11Pinouts thanks to http://www.68k.org/~degs/nextkeyboard.html
12Keycodes from http://ftp.netbsd.org/pub/NetBSD/NetBSD-release-6/src/sys/arch/next68k/dev/
13
14This software is licensed with a Modified BSD License.
15All of this is supposed to be Free Software, Open Source, DFSG-free,
16GPL-compatible, and OK to use in both free and proprietary applications.
17Additions and corrections to this file are welcome.
18
19Redistribution and use in source and binary forms, with or without
20modification, are permitted provided that the following conditions are met:
21
22* Redistributions of source code must retain the above copyright
23 notice, this list of conditions and the following disclaimer.
24
25* Redistributions in binary form must reproduce the above copyright
26 notice, this list of conditions and the following disclaimer in
27 the documentation and/or other materials provided with the
28 distribution.
29
30* Neither the name of the copyright holders nor the names of
31 contributors may be used to endorse or promote products derived
32 from this software without specific prior written permission.
33
34THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
35AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
36IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
37ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
38LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
39CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
40SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
41INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
42CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
43ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
44POSSIBILITY OF SUCH DAMAGE.
45
46*/
47
48#pragma once
49
50#include <stdbool.h>
51
52#define NEXT_KBD_KMBUS_IDLE 0x300600
53#define NEXT_KBD_TIMING 50
54
55extern uint8_t next_kbd_error;
56
57/* host role */
58void next_kbd_init(void);
59void next_kbd_set_leds(bool left, bool right);
60uint32_t next_kbd_recv(void);