Remove unreferenced IBM4704, Sony NEWS, NeXT keyboard code. (#14380)
This commit is contained in:
parent
cf68c6403c
commit
d0ac03ec8b
6 changed files with 0 additions and 776 deletions
|
@ -1,185 +0,0 @@
|
|||
/*
|
||||
Copyright 2010,2011,2012,2013 Jun WAKO <wakojun@gmail.com>
|
||||
*/
|
||||
#include <stdbool.h>
|
||||
#include <util/delay.h>
|
||||
#include "debug.h"
|
||||
#include "ring_buffer.h"
|
||||
#include "ibm4704.h"
|
||||
|
||||
#define WAIT(stat, us, err) \
|
||||
do { \
|
||||
if (!wait_##stat(us)) { \
|
||||
ibm4704_error = err; \
|
||||
goto ERROR; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
uint8_t ibm4704_error = 0;
|
||||
|
||||
void ibm4704_init(void) {
|
||||
inhibit(); // keep keyboard from sending
|
||||
IBM4704_INT_INIT();
|
||||
IBM4704_INT_ON();
|
||||
idle(); // allow keyboard sending
|
||||
}
|
||||
|
||||
/*
|
||||
Host to Keyboard
|
||||
----------------
|
||||
Data bits are LSB first and Parity is odd. Clock has around 60us high and 30us low part.
|
||||
|
||||
____ __ __ __ __ __ __ __ __ __ ________
|
||||
Clock \______/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
|
||||
^ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ___
|
||||
Data ____|__/ X____X____X____X____X____X____X____X____X____X \___
|
||||
| Start 0 1 2 3 4 5 6 7 P Stop
|
||||
Request by host
|
||||
|
||||
Start bit: can be long as 300-350us.
|
||||
Request: Host pulls Clock line down to request to send a command.
|
||||
Timing: After Request keyboard pull up Data and down Clock line to low for start bit.
|
||||
After request host release Clock line once Data line becomes hi.
|
||||
Host writes a bit while Clock is hi and Keyboard reads while low.
|
||||
Stop bit: Host releases or pulls up Data line to hi after 9th clock and waits for keyboard pull down the line to lo.
|
||||
*/
|
||||
uint8_t ibm4704_send(uint8_t data) {
|
||||
bool parity = true; // odd parity
|
||||
ibm4704_error = 0;
|
||||
|
||||
IBM4704_INT_OFF();
|
||||
|
||||
/* Request to send */
|
||||
idle();
|
||||
clock_lo();
|
||||
|
||||
/* wait for Start bit(Clock:lo/Data:hi) */
|
||||
WAIT(data_hi, 300, 0x30);
|
||||
|
||||
/* Data bit */
|
||||
for (uint8_t i = 0; i < 8; i++) {
|
||||
WAIT(clock_hi, 100, 0x40 + i);
|
||||
if (data & (1 << i)) {
|
||||
parity = !parity;
|
||||
data_hi();
|
||||
} else {
|
||||
data_lo();
|
||||
}
|
||||
WAIT(clock_lo, 100, 0x48 + i);
|
||||
}
|
||||
|
||||
/* Parity bit */
|
||||
WAIT(clock_hi, 100, 0x34);
|
||||
if (parity) {
|
||||
data_hi();
|
||||
} else {
|
||||
data_lo();
|
||||
}
|
||||
WAIT(clock_lo, 100, 0x35);
|
||||
|
||||
/* Stop bit */
|
||||
WAIT(clock_hi, 100, 0x34);
|
||||
data_hi();
|
||||
|
||||
/* End */
|
||||
WAIT(data_lo, 100, 0x36);
|
||||
|
||||
idle();
|
||||
IBM4704_INT_ON();
|
||||
return 0;
|
||||
ERROR:
|
||||
idle();
|
||||
if (ibm4704_error > 0x30) {
|
||||
xprintf("S:%02X ", ibm4704_error);
|
||||
}
|
||||
IBM4704_INT_ON();
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* wait forever to receive data */
|
||||
uint8_t ibm4704_recv_response(void) {
|
||||
while (!rbuf_has_data()) {
|
||||
_delay_ms(1);
|
||||
}
|
||||
return rbuf_dequeue();
|
||||
}
|
||||
|
||||
uint8_t ibm4704_recv(void) {
|
||||
if (rbuf_has_data()) {
|
||||
return rbuf_dequeue();
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Keyboard to Host
|
||||
----------------
|
||||
Data bits are LSB first and Parity is odd. Clock has around 60us high and 30us low part.
|
||||
|
||||
____ __ __ __ __ __ __ __ __ __ _______
|
||||
Clock \_____/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/
|
||||
____ ____ ____ ____ ____ ____ ____ ____ ____ ____
|
||||
Data ____/ X____X____X____X____X____X____X____X____X____X________
|
||||
Start 0 1 2 3 4 5 6 7 P Stop
|
||||
|
||||
Start bit: can be long as 300-350us.
|
||||
Inhibit: Pull Data line down to inhibit keyboard to send.
|
||||
Timing: Host reads bit while Clock is hi.(rising edge)
|
||||
Stop bit: Keyboard pulls down Data line to lo after 9th clock.
|
||||
*/
|
||||
ISR(IBM4704_INT_VECT) {
|
||||
static enum { BIT0, BIT1, BIT2, BIT3, BIT4, BIT5, BIT6, BIT7, PARITY, STOP } state = BIT0;
|
||||
// LSB first
|
||||
static uint8_t data = 0;
|
||||
// Odd parity
|
||||
static uint8_t parity = false;
|
||||
|
||||
ibm4704_error = 0;
|
||||
|
||||
switch (state) {
|
||||
case BIT0:
|
||||
case BIT1:
|
||||
case BIT2:
|
||||
case BIT3:
|
||||
case BIT4:
|
||||
case BIT5:
|
||||
case BIT6:
|
||||
case BIT7:
|
||||
data >>= 1;
|
||||
if (data_in()) {
|
||||
data |= 0x80;
|
||||
parity = !parity;
|
||||
}
|
||||
break;
|
||||
case PARITY:
|
||||
if (data_in()) {
|
||||
parity = !parity;
|
||||
}
|
||||
if (!parity) goto ERROR;
|
||||
break;
|
||||
case STOP:
|
||||
// Data:Low
|
||||
WAIT(data_lo, 100, state);
|
||||
if (!rbuf_enqueue(data)) {
|
||||
print("rbuf: full\n");
|
||||
}
|
||||
ibm4704_error = IBM4704_ERR_NONE;
|
||||
goto DONE;
|
||||
break;
|
||||
default:
|
||||
goto ERROR;
|
||||
}
|
||||
state++;
|
||||
goto RETURN;
|
||||
ERROR:
|
||||
ibm4704_error = state;
|
||||
while (ibm4704_send(0xFE)) _delay_ms(1); // resend
|
||||
xprintf("R:%02X%02X\n", state, data);
|
||||
DONE:
|
||||
state = BIT0;
|
||||
data = 0;
|
||||
parity = false;
|
||||
RETURN:
|
||||
return;
|
||||
}
|
|
@ -1,103 +0,0 @@
|
|||
/*
|
||||
Copyright 2014 Jun WAKO <wakojun@gmail.com>
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#define IBM4704_ERR_NONE 0
|
||||
#define IBM4704_ERR_PARITY 0x70
|
||||
|
||||
void ibm4704_init(void);
|
||||
uint8_t ibm4704_send(uint8_t data);
|
||||
uint8_t ibm4704_recv_response(void);
|
||||
uint8_t ibm4704_recv(void);
|
||||
|
||||
/* Check pin configuration */
|
||||
#if !(defined(IBM4704_CLOCK_PORT) && defined(IBM4704_CLOCK_PIN) && defined(IBM4704_CLOCK_DDR) && defined(IBM4704_CLOCK_BIT))
|
||||
# error "ibm4704 clock pin configuration is required in config.h"
|
||||
#endif
|
||||
|
||||
#if !(defined(IBM4704_DATA_PORT) && defined(IBM4704_DATA_PIN) && defined(IBM4704_DATA_DDR) && defined(IBM4704_DATA_BIT))
|
||||
# error "ibm4704 data pin configuration is required in config.h"
|
||||
#endif
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
* static functions
|
||||
*------------------------------------------------------------------*/
|
||||
static inline void clock_lo(void) {
|
||||
IBM4704_CLOCK_PORT &= ~(1 << IBM4704_CLOCK_BIT);
|
||||
IBM4704_CLOCK_DDR |= (1 << IBM4704_CLOCK_BIT);
|
||||
}
|
||||
static inline void clock_hi(void) {
|
||||
/* input with pull up */
|
||||
IBM4704_CLOCK_DDR &= ~(1 << IBM4704_CLOCK_BIT);
|
||||
IBM4704_CLOCK_PORT |= (1 << IBM4704_CLOCK_BIT);
|
||||
}
|
||||
static inline bool clock_in(void) {
|
||||
IBM4704_CLOCK_DDR &= ~(1 << IBM4704_CLOCK_BIT);
|
||||
IBM4704_CLOCK_PORT |= (1 << IBM4704_CLOCK_BIT);
|
||||
_delay_us(1);
|
||||
return IBM4704_CLOCK_PIN & (1 << IBM4704_CLOCK_BIT);
|
||||
}
|
||||
static inline void data_lo(void) {
|
||||
IBM4704_DATA_PORT &= ~(1 << IBM4704_DATA_BIT);
|
||||
IBM4704_DATA_DDR |= (1 << IBM4704_DATA_BIT);
|
||||
}
|
||||
static inline void data_hi(void) {
|
||||
/* input with pull up */
|
||||
IBM4704_DATA_DDR &= ~(1 << IBM4704_DATA_BIT);
|
||||
IBM4704_DATA_PORT |= (1 << IBM4704_DATA_BIT);
|
||||
}
|
||||
static inline bool data_in(void) {
|
||||
IBM4704_DATA_DDR &= ~(1 << IBM4704_DATA_BIT);
|
||||
IBM4704_DATA_PORT |= (1 << IBM4704_DATA_BIT);
|
||||
_delay_us(1);
|
||||
return IBM4704_DATA_PIN & (1 << IBM4704_DATA_BIT);
|
||||
}
|
||||
|
||||
static inline uint16_t wait_clock_lo(uint16_t us) {
|
||||
while (clock_in() && us) {
|
||||
asm("");
|
||||
_delay_us(1);
|
||||
us--;
|
||||
}
|
||||
return us;
|
||||
}
|
||||
static inline uint16_t wait_clock_hi(uint16_t us) {
|
||||
while (!clock_in() && us) {
|
||||
asm("");
|
||||
_delay_us(1);
|
||||
us--;
|
||||
}
|
||||
return us;
|
||||
}
|
||||
static inline uint16_t wait_data_lo(uint16_t us) {
|
||||
while (data_in() && us) {
|
||||
asm("");
|
||||
_delay_us(1);
|
||||
us--;
|
||||
}
|
||||
return us;
|
||||
}
|
||||
static inline uint16_t wait_data_hi(uint16_t us) {
|
||||
while (!data_in() && us) {
|
||||
asm("");
|
||||
_delay_us(1);
|
||||
us--;
|
||||
}
|
||||
return us;
|
||||
}
|
||||
|
||||
/* idle state that device can send */
|
||||
static inline void idle(void) {
|
||||
clock_hi();
|
||||
data_hi();
|
||||
}
|
||||
|
||||
/* inhibit device to send
|
||||
* keyboard checks Data line on start bit(Data:hi) and it stops sending if Data line is low.
|
||||
*/
|
||||
static inline void inhibit(void) {
|
||||
clock_hi();
|
||||
data_lo();
|
||||
}
|
|
@ -1,161 +0,0 @@
|
|||
/*
|
||||
Copyright 2012 Jun WAKO <wakojun@gmail.com>
|
||||
|
||||
This software is licensed with a Modified BSD License.
|
||||
All of this is supposed to be Free Software, Open Source, DFSG-free,
|
||||
GPL-compatible, and OK to use in both free and proprietary applications.
|
||||
Additions and corrections to this file are welcome.
|
||||
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
* Neither the name of the copyright holders nor the names of
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <avr/io.h>
|
||||
#include <avr/interrupt.h>
|
||||
#include "news.h"
|
||||
|
||||
void news_init(void) { NEWS_KBD_RX_INIT(); }
|
||||
|
||||
// RX ring buffer
|
||||
#define RBUF_SIZE 8
|
||||
static uint8_t rbuf[RBUF_SIZE];
|
||||
static uint8_t rbuf_head = 0;
|
||||
static uint8_t rbuf_tail = 0;
|
||||
|
||||
uint8_t news_recv(void) {
|
||||
uint8_t data = 0;
|
||||
if (rbuf_head == rbuf_tail) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
data = rbuf[rbuf_tail];
|
||||
rbuf_tail = (rbuf_tail + 1) % RBUF_SIZE;
|
||||
return data;
|
||||
}
|
||||
|
||||
// USART RX complete interrupt
|
||||
ISR(NEWS_KBD_RX_VECT) {
|
||||
uint8_t next = (rbuf_head + 1) % RBUF_SIZE;
|
||||
if (next != rbuf_tail) {
|
||||
rbuf[rbuf_head] = NEWS_KBD_RX_DATA;
|
||||
rbuf_head = next;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
SONY NEWS Keyboard Protocol
|
||||
===========================
|
||||
|
||||
Resources
|
||||
---------
|
||||
Mouse protocol of NWA-5461(Japanese)
|
||||
http://groups.google.com/group/fj.sys.news/browse_thread/thread/a01b3e3ac6ae5b2d
|
||||
|
||||
SONY NEWS Info(Japanese)
|
||||
http://katsu.watanabe.name/doc/sonynews/
|
||||
|
||||
|
||||
Pinouts
|
||||
-------
|
||||
EIA 232 male connector from NWP-5461
|
||||
-------------
|
||||
\ 1 2 3 4 5 /
|
||||
\ 6 7 8 9 /
|
||||
---------
|
||||
1 VCC
|
||||
2 BZ(Speaker)
|
||||
3 Keyboard Data(from keyboard MCU TxD)
|
||||
4 NC
|
||||
5 GND
|
||||
6 Unknown Input(to keyboard MCU RxD via schmitt trigger)
|
||||
7 Mouse Data(from Mouse Ext connector)
|
||||
8 Unknown Input(to Keyboard MCU Input via diode and buffer)
|
||||
9 FG
|
||||
NOTE: Two LED on keyboard are controlled by pin 6,8?
|
||||
|
||||
EIA 232 male connector from NWP-411A
|
||||
-------------
|
||||
\ 1 2 3 4 5 /
|
||||
\ 6 7 8 9 /
|
||||
---------
|
||||
1 VCC
|
||||
2 BZ(Speaker)
|
||||
3 Keyboard Data(from keyboard MCU TxD)
|
||||
4 NC
|
||||
5 GND
|
||||
6 NC
|
||||
7 Mouse Data(from Mouse Ext connector)
|
||||
8 NC
|
||||
9 FG
|
||||
NOTE: These are just from my guess and not confirmed.
|
||||
|
||||
|
||||
Signaling
|
||||
---------
|
||||
~~~~~~~~~~ ____XOO0X111X222X333X444X555X666X777~~~~ ~~~~~~~
|
||||
Idle Start LSB MSB Stop Idle
|
||||
|
||||
Idle: High
|
||||
Start bit: Low
|
||||
Stop bit: High
|
||||
Bit order: LSB first
|
||||
|
||||
Baud rate: 9600
|
||||
Interface: TTL level(5V) UART
|
||||
|
||||
NOTE: This is observed on NWP-5461 with its DIP switch all OFF.
|
||||
|
||||
|
||||
Format
|
||||
------
|
||||
MSB LSB
|
||||
7 6 5 4 3 2 1 0 bit
|
||||
| | | | | | | |
|
||||
| +-+-+-+-+-+-+-- scan code(00-7F)
|
||||
+---------------- break flag: sets when released
|
||||
|
||||
|
||||
Scan Codes
|
||||
----------
|
||||
SONY NEWS NWP-5461
|
||||
,---. ,------------------------, ,------------------------. ,---------.
|
||||
| 7A| | 01 | 02 | 03 | 04 | 05 | | 06 | 07 | 08 | 09 | 0A | | 68 | 69 | ,-----------.
|
||||
`---' `------------------------' `------------------------' `---------' | 64| 65| 52|
|
||||
,-------------------------------------------------------------. ,---. ,---------------|
|
||||
| 0B| 0C| 0D| 0E| 0F| 10| 11| 12| 13| 14| 15| 16| 17| 18| 19 | | 6A| | 4B| 4C| 4D| 4E|
|
||||
|-------------------------------------------------------------| |---| |---------------|
|
||||
| 1A | 1B| 1C| 1D| 1E| 1F| 20| 21| 22| 23| 24| 25| 26| 27| | | 6B| | 4F| 50| 51| 56|
|
||||
|---------------------------------------------------------' | |---| |---------------|
|
||||
| 28 | 29| 2A| 2B| 2C| 2D| 2E| 2F| 30| 31| 32| 33| 34| 35 | | 6C| | 53| 54| 55| |
|
||||
|-------------------------------------------------------------| |---| |-----------| 5A|
|
||||
| 36 | 37| 38| 39| 3A| 3B| 3C| 3D| 3E| 3F| 40| 41| 42 | | 6D| | 57| 59| 58| |
|
||||
|-------------------------------------------------------------| |---| |---------------|
|
||||
| 43 | 44 | 45 | 46 | 47 | 48| 49| 4A | | 6E| | 66| 5B| 5C| 5D|
|
||||
`-------------------------------------------------------------' `---' `---------------'
|
||||
*/
|
|
@ -1,48 +0,0 @@
|
|||
/*
|
||||
Copyright 2012 Jun WAKO <wakojun@gmail.com>
|
||||
|
||||
This software is licensed with a Modified BSD License.
|
||||
All of this is supposed to be Free Software, Open Source, DFSG-free,
|
||||
GPL-compatible, and OK to use in both free and proprietary applications.
|
||||
Additions and corrections to this file are welcome.
|
||||
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
* Neither the name of the copyright holders nor the names of
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
/*
|
||||
* Primitive PS/2 Library for AVR
|
||||
*/
|
||||
|
||||
/* host role */
|
||||
void news_init(void);
|
||||
uint8_t news_recv(void);
|
||||
|
||||
/* device role */
|
|
@ -1,219 +0,0 @@
|
|||
/*
|
||||
|
||||
NeXT non-ADB Keyboard Protocol
|
||||
|
||||
Copyright 2013, Benjamin Gould (bgould@github.com)
|
||||
|
||||
Based on:
|
||||
TMK firmware code Copyright 2011,2012 Jun WAKO <wakojun@gmail.com>
|
||||
Arduino code by "Ladyada" Limor Fried (http://ladyada.net/, http://adafruit.com/), released under BSD license
|
||||
|
||||
Timing reference thanks to http://m0115.web.fc2.com/ (dead link), http://cfile7.uf.tistory.com/image/14448E464F410BF22380BB
|
||||
Pinouts thanks to http://www.68k.org/~degs/nextkeyboard.html
|
||||
Keycodes from http://ftp.netbsd.org/pub/NetBSD/NetBSD-release-6/src/sys/arch/next68k/dev/
|
||||
|
||||
This software is licensed with a Modified BSD License.
|
||||
All of this is supposed to be Free Software, Open Source, DFSG-free,
|
||||
GPL-compatible, and OK to use in both free and proprietary applications.
|
||||
Additions and corrections to this file are welcome.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
* Neither the name of the copyright holders nor the names of
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <util/atomic.h>
|
||||
#include <util/delay.h>
|
||||
#include "next_kbd.h"
|
||||
#include "debug.h"
|
||||
|
||||
static inline void out_lo(void);
|
||||
static inline void out_hi(void);
|
||||
static inline void query(void);
|
||||
static inline void reset(void);
|
||||
static inline uint32_t response(void);
|
||||
|
||||
/* The keyboard sends signal with 50us pulse width on OUT line
|
||||
* while it seems to miss the 50us pulse on In line.
|
||||
* next_kbd_set_leds() often fails to sync LED status with 50us
|
||||
* but it works well with 51us(+1us) on TMK converter(ATMeaga32u2) at least.
|
||||
* TODO: test on Teensy and Pro Micro configuration
|
||||
*/
|
||||
#define out_hi_delay(intervals) \
|
||||
do { \
|
||||
out_hi(); \
|
||||
_delay_us((NEXT_KBD_TIMING + 1) * intervals); \
|
||||
} while (0);
|
||||
#define out_lo_delay(intervals) \
|
||||
do { \
|
||||
out_lo(); \
|
||||
_delay_us((NEXT_KBD_TIMING + 1) * intervals); \
|
||||
} while (0);
|
||||
#define query_delay(intervals) \
|
||||
do { \
|
||||
query(); \
|
||||
_delay_us((NEXT_KBD_TIMING + 1) * intervals); \
|
||||
} while (0);
|
||||
#define reset_delay(intervals) \
|
||||
do { \
|
||||
reset(); \
|
||||
_delay_us((NEXT_KBD_TIMING + 1) * intervals); \
|
||||
} while (0);
|
||||
|
||||
void next_kbd_init(void) {
|
||||
out_hi();
|
||||
NEXT_KBD_IN_DDR &= ~(1 << NEXT_KBD_IN_BIT); // KBD_IN to input
|
||||
NEXT_KBD_IN_PORT |= (1 << NEXT_KBD_IN_BIT); // KBD_IN pull up
|
||||
|
||||
query_delay(5);
|
||||
reset_delay(8);
|
||||
|
||||
query_delay(5);
|
||||
reset_delay(8);
|
||||
}
|
||||
|
||||
void next_kbd_set_leds(bool left, bool right) {
|
||||
cli();
|
||||
out_lo_delay(9);
|
||||
|
||||
out_hi_delay(3);
|
||||
out_lo_delay(1);
|
||||
|
||||
if (left) {
|
||||
out_hi_delay(1);
|
||||
} else {
|
||||
out_lo_delay(1);
|
||||
}
|
||||
|
||||
if (right) {
|
||||
out_hi_delay(1);
|
||||
} else {
|
||||
out_lo_delay(1);
|
||||
}
|
||||
|
||||
out_lo_delay(7);
|
||||
out_hi();
|
||||
sei();
|
||||
}
|
||||
|
||||
#define NEXT_KBD_READ (NEXT_KBD_IN_PIN & (1 << NEXT_KBD_IN_BIT))
|
||||
uint32_t next_kbd_recv(void) {
|
||||
// First check to make sure that the keyboard is actually connected;
|
||||
// if not, just return
|
||||
// TODO: reflect the status of the keyboard in a return code
|
||||
if (!NEXT_KBD_READ) {
|
||||
sei();
|
||||
return 0;
|
||||
}
|
||||
|
||||
query();
|
||||
uint32_t resp = response();
|
||||
|
||||
return resp;
|
||||
}
|
||||
|
||||
static inline uint32_t response(void) {
|
||||
cli();
|
||||
|
||||
// try a 5ms read; this should be called after the query method has
|
||||
// been run so if a key is pressed we should get a response within
|
||||
// 5ms; if not then send a reset and exit
|
||||
uint8_t i = 0;
|
||||
uint32_t data = 0;
|
||||
uint16_t reset_timeout = 50000;
|
||||
while (NEXT_KBD_READ && reset_timeout) {
|
||||
asm("");
|
||||
_delay_us(1);
|
||||
reset_timeout--;
|
||||
}
|
||||
if (!reset_timeout) {
|
||||
reset();
|
||||
sei();
|
||||
return 0;
|
||||
}
|
||||
_delay_us(NEXT_KBD_TIMING / 2);
|
||||
for (; i < 22; i++) {
|
||||
if (NEXT_KBD_READ) {
|
||||
data |= ((uint32_t)1 << i);
|
||||
/* Note:
|
||||
* My testing with the ATmega32u4 showed that there might
|
||||
* something wrong with the timing here; by the end of the
|
||||
* second data byte some of the modifiers can get bumped out
|
||||
* to the next bit over if we just cycle through the data
|
||||
* based on the expected interval. There is a bit (i = 10)
|
||||
* in the middle of the data that is always on followed by
|
||||
* one that is always off - so we'll use that to reset our
|
||||
* timing in case we've gotten ahead of the keyboard;
|
||||
*/
|
||||
if (i == 10) {
|
||||
i++;
|
||||
while (NEXT_KBD_READ)
|
||||
;
|
||||
_delay_us(NEXT_KBD_TIMING / 2);
|
||||
}
|
||||
} else {
|
||||
/* redundant - but I don't want to remove if it might screw
|
||||
* up the timing
|
||||
*/
|
||||
data |= ((uint32_t)0 << i);
|
||||
}
|
||||
_delay_us(NEXT_KBD_TIMING);
|
||||
}
|
||||
|
||||
sei();
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
static inline void out_lo(void) {
|
||||
NEXT_KBD_OUT_PORT &= ~(1 << NEXT_KBD_OUT_BIT);
|
||||
NEXT_KBD_OUT_DDR |= (1 << NEXT_KBD_OUT_BIT);
|
||||
}
|
||||
|
||||
static inline void out_hi(void) {
|
||||
/* input with pull up */
|
||||
NEXT_KBD_OUT_DDR &= ~(1 << NEXT_KBD_OUT_BIT);
|
||||
NEXT_KBD_OUT_PORT |= (1 << NEXT_KBD_OUT_BIT);
|
||||
}
|
||||
|
||||
static inline void query(void) {
|
||||
out_lo_delay(5);
|
||||
out_hi_delay(1);
|
||||
out_lo_delay(3);
|
||||
out_hi();
|
||||
}
|
||||
|
||||
static inline void reset(void) {
|
||||
out_lo_delay(1);
|
||||
out_hi_delay(4);
|
||||
out_lo_delay(1);
|
||||
out_hi_delay(6);
|
||||
out_lo_delay(10);
|
||||
out_hi();
|
||||
}
|
|
@ -1,60 +0,0 @@
|
|||
/*
|
||||
NeXT non-ADB Keyboard Protocol
|
||||
|
||||
Copyright 2013, Benjamin Gould (bgould@github.com)
|
||||
|
||||
Based on:
|
||||
TMK firmware code Copyright 2011,2012 Jun WAKO <wakojun@gmail.com>
|
||||
Arduino code by "Ladyada" Limor Fried (http://ladyada.net/, http://adafruit.com/), released under BSD license
|
||||
|
||||
Timing reference thanks to http://m0115.web.fc2.com/ (dead link), http://cfile7.uf.tistory.com/image/14448E464F410BF22380BB
|
||||
Pinouts thanks to http://www.68k.org/~degs/nextkeyboard.html
|
||||
Keycodes from http://ftp.netbsd.org/pub/NetBSD/NetBSD-release-6/src/sys/arch/next68k/dev/
|
||||
|
||||
This software is licensed with a Modified BSD License.
|
||||
All of this is supposed to be Free Software, Open Source, DFSG-free,
|
||||
GPL-compatible, and OK to use in both free and proprietary applications.
|
||||
Additions and corrections to this file are welcome.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
|
||||
* Neither the name of the copyright holders nor the names of
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#define NEXT_KBD_KMBUS_IDLE 0x300600
|
||||
#define NEXT_KBD_TIMING 50
|
||||
|
||||
extern uint8_t next_kbd_error;
|
||||
|
||||
/* host role */
|
||||
void next_kbd_init(void);
|
||||
void next_kbd_set_leds(bool left, bool right);
|
||||
uint32_t next_kbd_recv(void);
|
Loading…
Reference in a new issue