191 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			191 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
| NeXT non-ADB Keyboard USB Converter
 | |
|  
 | |
| 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.
 | |
| 
 | |
| */
 | |
| 
 | |
| #define VENDOR_ID       0xFEED
 | |
| #define PRODUCT_ID      0xBCBC
 | |
| #define DEVICE_VER      0x0500
 | |
| #define MANUFACTURER    t.m.k.
 | |
| #define PRODUCT         NeXT Keyboard to USB converter
 | |
| #define DESCRIPTION     USB converter for NeXT non-ADB Keyboard
 | |
| 
 | |
| /* matrix size */
 | |
| #define MATRIX_ROWS 12  // keycode bit: 3-0
 | |
| #define MATRIX_COLS  8  // keycode bit: 6-4
 | |
| 
 | |
| #define DEBUG_ON_INIT 1
 | |
| 
 | |
| //#define TEENSY_CONFIG 1
 | |
| //#define PRO_MICRO_CONFIG 1
 | |
| #define TMK_CONFIG 1
 | |
| 
 | |
| // comment out if you don't want the keyboard's LEDs to flash upon initialization or pressing shift
 | |
| //#define NEXT_KBD_INIT_FLASH_LEDS
 | |
| //#define NEXT_KBD_SHIFT_FLASH_LEDS
 | |
| 
 | |
| //============= Start of Arduino Pro Micro Configuration ==============
 | |
| #ifdef PRO_MICRO_CONFIG
 | |
| 
 | |
| // this is the debugging LED that flashes when a key is being pressed
 | |
| // comment out in order to disable debugging LED
 | |
| #define NEXT_KBD_LED1_PORT  PORTD
 | |
| #define NEXT_KBD_LED1_PIN   PIND
 | |
| #define NEXT_KBD_LED1_DDR   DDRD
 | |
| #define NEXT_KBD_LED1_BIT   5
 | |
| 
 | |
| #define NEXT_KBD_LED1_ON    NEXT_KBD_LED1_PORT &= ~(1<<NEXT_KBD_LED1_BIT);
 | |
| #define NEXT_KBD_LED1_OFF   NEXT_KBD_LED1_PORT |=  (1<<NEXT_KBD_LED1_BIT);
 | |
| 
 | |
| // reserved for future use
 | |
| #define NEXT_KBD_LED2_PORT  PORTB
 | |
| #define NEXT_KBD_LED2_PIN   PINB
 | |
| #define NEXT_KBD_LED2_DDR   DDRB
 | |
| #define NEXT_KBD_LED2_BIT   6
 | |
| 
 | |
| #define NEXT_KBD_LED2_ON    NEXT_KBD_LED2_PORT &= ~(1<<NEXT_KBD_LED2_BIT);
 | |
| #define NEXT_KBD_LED2_OFF   NEXT_KBD_LED2_PORT |=  (1<<NEXT_KBD_LED2_BIT);
 | |
| 
 | |
| // corresponds to the Keyboard In wire on the NeXT connector
 | |
| // (red wire in NeXT connector) - pin 2 on the Pro Micro
 | |
| #define NEXT_KBD_OUT_PORT  PORTD
 | |
| #define NEXT_KBD_OUT_PIN   PIND
 | |
| #define NEXT_KBD_OUT_DDR   DDRD
 | |
| #define NEXT_KBD_OUT_BIT   1
 | |
| 
 | |
| // corresponds to the Keyboard Out wire on the NeXT connector
 | |
| // (orange wire in NeXT connector) - pin 3 on the Pro Micro
 | |
| #define NEXT_KBD_IN_PORT   PORTD
 | |
| #define NEXT_KBD_IN_PIN    PIND
 | |
| #define NEXT_KBD_IN_DDR    DDRD
 | |
| #define NEXT_KBD_IN_BIT    0
 | |
| 
 | |
| // this pin is an input for the power key on the NeXT keyboard
 | |
| // as the keyboard is powered on this should be normally high;
 | |
| // if it is pulled low it means the power button is being preseed
 | |
| // (yellow wire in NeXT connector) - pin 4 on the Pro Micro
 | |
| #define NEXT_KBD_PWR_PORT  PORTD
 | |
| #define NEXT_KBD_PWR_PIN   PIND
 | |
| #define NEXT_KBD_PWR_DDR   DDRD
 | |
| #define NEXT_KBD_PWR_BIT   4
 | |
| 
 | |
| #endif
 | |
| //============== End of Arduino Pro Micro Configuration ===============
 | |
| 
 | |
| 
 | |
| //================ Start of Teensy 2.0 Configuration =================
 | |
| #ifdef TEENSY_CONFIG
 | |
| 
 | |
| // this is the debugging LED that flashes when a key is being pressed
 | |
| // comment out in order to disable debugging LED
 | |
| #define NEXT_KBD_LED_PORT  PORTD
 | |
| #define NEXT_KBD_LED_PIN   PIND
 | |
| #define NEXT_KBD_LED_DDR   DDRD
 | |
| #define NEXT_KBD_LED_BIT   6
 | |
| 
 | |
| #define NEXT_KBD_LED_ON  NEXT_KBD_LED_PORT |=  (1<<NEXT_KBD_LED_BIT);
 | |
| #define NEXT_KBD_LED_OFF NEXT_KBD_LED_PORT &= ~(1<<NEXT_KBD_LED_BIT);
 | |
| 
 | |
| // corresponds to the Keyboard In wire on the NeXT connector
 | |
| // (red wire in NeXT connector)
 | |
| #define NEXT_KBD_OUT_PORT  PORTB
 | |
| #define NEXT_KBD_OUT_PIN   PINB
 | |
| #define NEXT_KBD_OUT_DDR   DDRB
 | |
| #define NEXT_KBD_OUT_BIT   1
 | |
| 
 | |
| // corresponds to the Keyboard Out wire on the NeXT connector
 | |
| // (orange wire in NeXT connector)
 | |
| #define NEXT_KBD_IN_PORT   PORTB
 | |
| #define NEXT_KBD_IN_PIN    PINB
 | |
| #define NEXT_KBD_IN_DDR    DDRB
 | |
| #define NEXT_KBD_IN_BIT    0
 | |
| 
 | |
| #endif
 | |
| //================= End of Teensy 2.0 Configuration ==================
 | |
| 
 | |
| 
 | |
| //================ Start of TMK converter Configuration =================
 | |
| #ifdef TMK_CONFIG
 | |
| 
 | |
| // this is the debugging LED that flashes when a key is being pressed
 | |
| // comment out in order to disable debugging LED
 | |
| #define NEXT_KBD_LED1_PORT  PORTD
 | |
| #define NEXT_KBD_LED1_PIN   PIND
 | |
| #define NEXT_KBD_LED1_DDR   DDRD
 | |
| #define NEXT_KBD_LED1_BIT   6
 | |
| 
 | |
| #define NEXT_KBD_LED1_ON    NEXT_KBD_LED1_PORT |=  (1<<NEXT_KBD_LED1_BIT);
 | |
| #define NEXT_KBD_LED1_OFF   NEXT_KBD_LED1_PORT &= ~(1<<NEXT_KBD_LED1_BIT);
 | |
| 
 | |
| // corresponds to the Keyboard In wire on the NeXT connector
 | |
| #define NEXT_KBD_OUT_PORT  PORTD
 | |
| #define NEXT_KBD_OUT_PIN   PIND
 | |
| #define NEXT_KBD_OUT_DDR   DDRD
 | |
| #define NEXT_KBD_OUT_BIT   1
 | |
| 
 | |
| // corresponds to the Keyboard Out wire on the NeXT connector
 | |
| #define NEXT_KBD_IN_PORT   PORTD
 | |
| #define NEXT_KBD_IN_PIN    PIND
 | |
| #define NEXT_KBD_IN_DDR    DDRD
 | |
| #define NEXT_KBD_IN_BIT    0
 | |
| 
 | |
| // this pin is an input for the power key on the NeXT keyboard
 | |
| // as the keyboard is powered on this should be normally high;
 | |
| // if it is pulled low it means the power button is being preseed
 | |
| #define NEXT_KBD_PWR_PORT  PORTD
 | |
| #define NEXT_KBD_PWR_PIN   PIND
 | |
| #define NEXT_KBD_PWR_DDR   DDRD
 | |
| #define NEXT_KBD_PWR_BIT   4
 | |
| 
 | |
| #endif
 | |
| //================= End of TMK converter Configuration ==================
 | |
| 
 | |
| /* key combination for command */
 | |
| #define IS_COMMAND() ( \
 | |
|     (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) || \
 | |
|     (keyboard_report->mods == (MOD_BIT(KC_RALT) | MOD_BIT(KC_RALT))) || \
 | |
|     (keyboard_report->mods == (MOD_BIT(KC_RGUI) | MOD_BIT(KC_RGUI)))  \
 | |
| )
 |