Keyboard: M0110 converter ported from TMK (#3556)
* M0110 Converter Initial Commit Port of the M0110 converter from TMK to QMK * Fixed Typo
This commit is contained in:
		
							parent
							
								
									20e5798e63
								
							
						
					
					
						commit
						329b574831
					
				
					 7 changed files with 530 additions and 0 deletions
				
			
		
							
								
								
									
										51
									
								
								keyboards/converter/m0110_usb/README.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								keyboards/converter/m0110_usb/README.md
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,51 @@
 | 
			
		|||
M0110(A) keyboard converter
 | 
			
		||||
======================================
 | 
			
		||||
This is a port of the original M0110 converter from TMK to QMK. The original converter was designed to work with **ATmega32U2** and **ATmega32U4** based microcontrollers to convert Apple M0110/M0110A keyboards and M0120 numpads to USB. This port has been tested to be compatible with the [**Adafruit Feather 32U4 BLE**](https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### Enabling Bluetooth for the Adafruit Feather 32U4 BLE
 | 
			
		||||
----------------------------------------------------
 | 
			
		||||
Simply add `BLUETOOTH = AdafruitBLE` to your `rules.mk` file. This enables code specifically for the Adafruit Feather 32U4 BLE. If enabled, the device will use the `PRODUCT` and `DESCRIPTION` values from `config.h` for the device name displayed by the Feather on host devices. You can simply change these values to change the device name.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### Pins
 | 
			
		||||
----
 | 
			
		||||
This port utilizes the same pins that the TMK converter used. `PD1` is used for `CLOCK` and `PD0` is used for the `DATA` from the keyboard. These pins can be changed in `config.h`.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### Other important hardware notes from the original TMK converter Readme:
 | 
			
		||||
>### Hardware
 | 
			
		||||
>--------
 | 
			
		||||
>You can buy preassembled [TMK converter] or make yourown with AVR dev board like PJRC [Teensy].
 | 
			
		||||
>
 | 
			
		||||
>Port of the MCU `PD1` is assigned to `CLOCK` line and `PD0` to `DATA` by default, you can change pin configuration with editing `config.h`.
 | 
			
		||||
>
 | 
			
		||||
>[](http://i.imgur.com/yEp2eRi.jpg)
 | 
			
		||||
>
 | 
			
		||||
>#### 4P4C phone handset cable
 | 
			
		||||
>Note that original cable used with Mac is **straight** while phone handset cable is **crossover**.
 | 
			
		||||
>
 | 
			
		||||
><http://en.wikipedia.org/wiki/Modular_connector#4P4C>
 | 
			
		||||
>
 | 
			
		||||
>[Teensy]: http://www.pjrc.com/teensy/
 | 
			
		||||
>[TMK converter]: https://geekhack.org/index.php?topic=72052.0
 | 
			
		||||
>
 | 
			
		||||
>
 | 
			
		||||
>#### Socket Pinout
 | 
			
		||||
>- <http://pinouts.ru/Inputs/MacKeyboard_pinout.shtml>
 | 
			
		||||
>
 | 
			
		||||
>
 | 
			
		||||
>
 | 
			
		||||
>
 | 
			
		||||
>#### Pull-up Resistor
 | 
			
		||||
>You may need pull-up resistors on signal lines(`CLOCK`, `DATA`) in particular when you have long or coiled cable. **1k-10k Ohm** will be OK >for this purpose. In that case the converter may not read signal from keyboard correctly without pull-up resistors.
 | 
			
		||||
>
 | 
			
		||||
 | 
			
		||||
[**View the original TMK converter Readme**](https://github.com/tmk/tmk_keyboard/tree/master/converter/m0110_usb)\
 | 
			
		||||
[**View the original TMK converter Repository**](https://github.com/tmk/tmk_keyboard/tree/master/converter/m0110_usb)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### QMK Port Changelog
 | 
			
		||||
---------
 | 
			
		||||
- 2018/08/01 - Original Release
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										59
									
								
								keyboards/converter/m0110_usb/config.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								keyboards/converter/m0110_usb/config.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,59 @@
 | 
			
		|||
/*
 | 
			
		||||
Copyright 2011,2012 Jun Wako <wakojun@gmail.com>
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 2 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 | 
			
		||||
--------------
 | 
			
		||||
 | 
			
		||||
Ported to QMK by Techsock <info@techsock.com>
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#define VENDOR_ID       0xFEED
 | 
			
		||||
#define PRODUCT_ID      0x0110
 | 
			
		||||
#define DEVICE_VER      0x0101
 | 
			
		||||
#define MANUFACTURER    Apple
 | 
			
		||||
#define PRODUCT         M0110(A)
 | 
			
		||||
#define DESCRIPTION     Converts M0110(A) to USB and/or BT
 | 
			
		||||
 | 
			
		||||
/* matrix size */
 | 
			
		||||
#define MATRIX_ROWS 14
 | 
			
		||||
#define MATRIX_COLS 8
 | 
			
		||||
 | 
			
		||||
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
 | 
			
		||||
#define LOCKING_SUPPORT_ENABLE
 | 
			
		||||
/* Locking resynchronize hack */
 | 
			
		||||
#define LOCKING_RESYNC_ENABLE
 | 
			
		||||
 | 
			
		||||
/* magic key */
 | 
			
		||||
#define IS_COMMAND() ( \
 | 
			
		||||
    keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_LALT) | MOD_BIT(KC_LGUI)) || \
 | 
			
		||||
    keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_LALT) | MOD_BIT(KC_LCTL)) \
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
/* boot magic key */
 | 
			
		||||
#define BOOTMAGIC_KEY_SALT                      KC_M
 | 
			
		||||
 | 
			
		||||
/* ports */
 | 
			
		||||
#define M0110_CLOCK_PORT        PORTD
 | 
			
		||||
#define M0110_CLOCK_PIN         PIND
 | 
			
		||||
#define M0110_CLOCK_DDR         DDRD
 | 
			
		||||
#define M0110_CLOCK_BIT         1
 | 
			
		||||
#define M0110_DATA_PORT         PORTD
 | 
			
		||||
#define M0110_DATA_PIN          PIND
 | 
			
		||||
#define M0110_DATA_DDR          DDRD
 | 
			
		||||
#define M0110_DATA_BIT          0
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										92
									
								
								keyboards/converter/m0110_usb/keymaps/default/keymap.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								keyboards/converter/m0110_usb/keymaps/default/keymap.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,92 @@
 | 
			
		|||
/*
 | 
			
		||||
Copyright 2011,2012,2015 Jun Wako <wakojun@gmail.com>
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 2 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 | 
			
		||||
--------------
 | 
			
		||||
 | 
			
		||||
Ported to QMK by Techsock <info@techsock.com>
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include QMK_KEYBOARD_H
 | 
			
		||||
 | 
			
		||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
			
		||||
 | 
			
		||||
	/* Default:
 | 
			
		||||
	 * M0110                                                       M0120
 | 
			
		||||
	 * ,---------------------------------------------------------. ,---------------.
 | 
			
		||||
	 * |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Backs| |Nlk|  =|  /|  *|
 | 
			
		||||
	 * |---------------------------------------------------------| |---------------|
 | 
			
		||||
	 * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|  \| |  7|  8|  9|  -|
 | 
			
		||||
	 * |---------------------------------------------------------| |---------------|
 | 
			
		||||
	 * |Caps  |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return| |  4|  5|  6|  +|
 | 
			
		||||
	 * |---------------------------------------------------------| |---------------|
 | 
			
		||||
	 * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  .|  /|Shift   | |  1|  2|  3|   |
 | 
			
		||||
	 * `---------------------------------------------------------' |-----------|Ent|
 | 
			
		||||
	 *      |Opt|Mac |         Space               |Fn  |Opt|      |      0|  .|   |
 | 
			
		||||
	 *      `-----------------------------------------------'      `---------------'
 | 
			
		||||
	 * M0110A
 | 
			
		||||
	 * ,---------------------------------------------------------. ,---------------.
 | 
			
		||||
	 * |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Backs| |Nlk|  =|  /|  *|
 | 
			
		||||
	 * |---------------------------------------------------------| |---------------|
 | 
			
		||||
	 * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|   | |  7|  8|  9|  -|
 | 
			
		||||
	 * |-----------------------------------------------------'   | |---------------|
 | 
			
		||||
	 * |Caps  |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return| |  4|  5|  6|  +|
 | 
			
		||||
	 * |---------------------------------------------------------| |---------------|
 | 
			
		||||
	 * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  .|  /|Shft|Up | |  1|  2|  3|   |
 | 
			
		||||
	 * |---------------------------------------------------------| |-----------|Ent|
 | 
			
		||||
	 * |Opt  |Mac    |         Space             |  \|Lft|Rgt|Dn | |      0|  .|   |
 | 
			
		||||
	 * `---------------------------------------------------------' `---------------'
 | 
			
		||||
	 */
 | 
			
		||||
 | 
			
		||||
	[0] = LAYOUT_ansi(
 | 
			
		||||
	       KC_GRV,  KC_1,    KC_2, KC_3, KC_4, KC_5,   KC_6, KC_7, KC_8,    KC_9,   KC_0,             KC_MINS, KC_EQL,  KC_BSPC,  KC_NLCK, KC_EQL, KC_PSLS, KC_PAST, \
 | 
			
		||||
	       KC_TAB,  KC_Q,    KC_W, KC_E, KC_R, KC_T,   KC_Y, KC_U, KC_I,    KC_O,   KC_P,             KC_LBRC, KC_RBRC,           KC_P7,   KC_P8,  KC_P9,   KC_PMNS, \
 | 
			
		||||
	       KC_LCAP, KC_A,    KC_S, KC_D, KC_F, KC_G,   KC_H, KC_J, KC_K,    KC_L,   KC_SCLN,          KC_QUOT,          KC_ENT,   KC_P4,   KC_P5,  KC_P6,   KC_PPLS, \
 | 
			
		||||
	       KC_LSFT, KC_Z,    KC_X, KC_C, KC_V, KC_B,   KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH,                            KC_UP,    KC_P1,   KC_P2,  KC_P3,   KC_PENT, \
 | 
			
		||||
	       KC_LALT, KC_LGUI,                   KC_SPC,                      MO(1),  LT(1, KC_BSLASH), KC_LEFT, KC_RGHT, KC_DOWN,  KC_P0,           KC_PDOT),
 | 
			
		||||
		
 | 
			
		||||
	
 | 
			
		||||
	/* Cursor Layer:
 | 
			
		||||
	 * M0110                                                       M0120
 | 
			
		||||
	 * ,---------------------------------------------------------. ,---------------.
 | 
			
		||||
	 * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delet| |Nlk|  =|  /|  *|
 | 
			
		||||
	 * |---------------------------------------------------------| |---------------|
 | 
			
		||||
	 * |Tab  |Hom| Up|PgU|Rst|   |   |   |Psc|Slk|Pau|Up |INS|   | |  7|  8|  9|  -|
 | 
			
		||||
	 * |---------------------------------------------------------| |---------------|
 | 
			
		||||
	 * |Ctrl  |Lef|Dow|Rig|   |   |   |   |Hom|PgU|Lef|Rig|Return| |  4|  5|  6|  +|
 | 
			
		||||
	 * |---------------------------------------------------------| |---------------|
 | 
			
		||||
	 * |Shift   |End|   |PgD|   |   |   |   |End|PgD|Dow|Shift   | |  1|  2|  3|   |
 | 
			
		||||
	 * `---------------------------------------------------------' |-----------|Ent|
 | 
			
		||||
	 *      |Opt|Mac |         Space               |Fn  |Opt|      |      0|  .|   |
 | 
			
		||||
	 *      `-----------------------------------------------'      `---------------'
 | 
			
		||||
	 * M0110A
 | 
			
		||||
	 * ,---------------------------------------------------------. ,---------------.
 | 
			
		||||
	 * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delet| |Nlk|  =|  /|  *|
 | 
			
		||||
	 * |---------------------------------------------------------| |---------------|
 | 
			
		||||
	 * |Tab  |Hom| Up|PgU|   |   |   |   |Psc|Slk|Pau|Up |INS|   | |  7|  8|  9|  -|
 | 
			
		||||
	 * |-----------------------------------------------------'   | |---------------|
 | 
			
		||||
	 * |Caps  |Lef|Dow|Rig|   |   |   |   |Hom|PgU|Lef|Rig|Return| |  4|  5|  6|  +|
 | 
			
		||||
	 * |---------------------------------------------------------| |---------------|
 | 
			
		||||
	 * |Ctrl    |End|   |PgD|   |   |   |   |End|PgD|Dow|Shft|PgU| |  1|  2|  3|   |
 | 
			
		||||
	 * |---------------------------------------------------------| |-----------|Ent|
 | 
			
		||||
	 * |Opt  |Mac    |         Space             |  \|Hom|End|PgD| |      0|  .|   |
 | 
			
		||||
	 * `---------------------------------------------------------' `---------------'
 | 
			
		||||
	 */
 | 
			
		||||
	
 | 
			
		||||
	[1] = LAYOUT_ansi(
 | 
			
		||||
	       KC_ESC,  KC_F1,   KC_F2,   KC_F3,   KC_F4, KC_F5, KC_F6, KC_F7, KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12, KC_DEL,   KC_NLCK, KC_EQL, KC_PSLS, KC_PAST, \
 | 
			
		||||
		   KC_TAB,  KC_HOME, KC_UP,   KC_PGUP, RESET, KC_NO, KC_NO, KC_NO, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP,   KC_INS,           KC_P7,   KC_P8,  KC_P9,   KC_PMNS, \
 | 
			
		||||
		   KC_LCAP, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO, KC_NO, KC_NO, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT,         KC_ENT,   KC_P4,   KC_P5,  KC_P6,   KC_PPLS, \
 | 
			
		||||
		   KC_LCTL, KC_END,  KC_NO,   KC_PGDN, KC_NO, KC_NO, KC_NO, KC_NO, KC_END,  KC_PGDN, KC_DOWN,                  KC_PGUP,  KC_P1,   KC_P2,  KC_P3,   KC_PENT, \
 | 
			
		||||
	       KC_LALT, KC_LGUI,                          KC_SPC,                       KC_TRNS, KC_TRNS, KC_HOME, KC_END, KC_PGDN,  KC_P0,           KC_PDOT),
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										3
									
								
								keyboards/converter/m0110_usb/m0110_usb.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								keyboards/converter/m0110_usb/m0110_usb.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,3 @@
 | 
			
		|||
#include "m0110_usb.h"
 | 
			
		||||
#include <avr/io.h>
 | 
			
		||||
#include "quantum.h"
 | 
			
		||||
							
								
								
									
										131
									
								
								keyboards/converter/m0110_usb/m0110_usb.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								keyboards/converter/m0110_usb/m0110_usb.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,131 @@
 | 
			
		|||
/*
 | 
			
		||||
Copyright 2011,2012,2014,2015 Jun Wako <wakojun@gmail.com>
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 2 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 | 
			
		||||
--------------
 | 
			
		||||
 | 
			
		||||
Ported to QMK by Techsock <info@techsock.com>
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef M0110_USB_H
 | 
			
		||||
#define M0110_USB_H
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "quantum.h"
 | 
			
		||||
 | 
			
		||||
/* Common layout for M0110 and M0110A
 | 
			
		||||
 * This keymap works with both keyboards. As you can see, the M0110A is 
 | 
			
		||||
 * a superset of M0110 keyboard, only one exception is 'Enter'(34) of M0110
 | 
			
		||||
 * does not exist on the M0110A.
 | 
			
		||||
 *
 | 
			
		||||
 * ,---------------------------------------------------------. ,---------------.
 | 
			
		||||
 * |  `|  1|  2|  3|  4|  5|  6|  7|  8|  9|  0|  -|  =|Backs| |Clr|  =|  /|  *|
 | 
			
		||||
 * |---------------------------------------------------------| |---------------|
 | 
			
		||||
 * |Tab  |  Q|  W|  E|  R|  T|  Y|  U|  I|  O|  P|  [|  ]|   | |  7|  8|  9|  -|
 | 
			
		||||
 * |-----------------------------------------------------'   | |---------------|
 | 
			
		||||
 * |Caps  |  A|  S|  D|  F|  G|  H|  J|  K|  L|  ;|  '|Return| |  4|  5|  6|  +|
 | 
			
		||||
 * |---------------------------------------------------------| |---------------|
 | 
			
		||||
 * |Shift   |  Z|  X|  C|  V|  B|  N|  M|  ,|  ,|  /|Shft|Up | |  1|  2|  3|   |
 | 
			
		||||
 * |---------------------------------------------------------| |-----------|Ent|
 | 
			
		||||
 * |Opt  |Mac    |         Space         |Ent|  \|Lft|Rgt|Dn | |      0|  .|   |
 | 
			
		||||
 * `---------------------------------------------------------' `---------------'
 | 
			
		||||
 *
 | 
			
		||||
 * M0110A scan codes
 | 
			
		||||
 * ,---------------------------------------------------------. ,---------------.
 | 
			
		||||
 * | 32| 12| 13| 14| 15| 17| 16| 1A| 1C| 19| 1D| 1B| 18|   33| | 47| 68| 6D| 62|
 | 
			
		||||
 * |---------------------------------------------------------| |---------------|
 | 
			
		||||
 * |   30| 0C| 0D| 0E| 0F| 11| 10| 20| 22| 1F| 23| 21| 1E|   | | 59| 5B| 5C| 4E|
 | 
			
		||||
 * |-----------------------------------------------------'   | |---------------|
 | 
			
		||||
 * |    39| 00| 01| 02| 03| 05| 04| 26| 28| 25| 29| 27|    24| | 56| 57| 58| 66|
 | 
			
		||||
 * |---------------------------------------------------------| |---------------|
 | 
			
		||||
 * |      38| 06| 07| 08| 09| 0B| 2D| 2E| 2B| 2F| 2C|  38| 4D| | 53| 54| 55|   |
 | 
			
		||||
 * `---------------------------------------------------------' |-----------| 4C|
 | 
			
		||||
 * |   3A|     37|             31            | 2A| 46| 42| 48| |     52| 41|   |
 | 
			
		||||
 * `---------------------------------------------------------' `---------------'
 | 
			
		||||
 *
 | 
			
		||||
 * M0110 + M0120 scan codes
 | 
			
		||||
 * ,---------------------------------------------------------. ,---------------.
 | 
			
		||||
 * | 32| 12| 13| 14| 15| 17| 16| 1A| 1C| 19| 1D| 1B| 18|   33| | 47| 68| 6D| 62|
 | 
			
		||||
 * |---------------------------------------------------------| |---------------|
 | 
			
		||||
 * |   30| 0C| 0D| 0E| 0F| 11| 10| 20| 22| 1F| 23| 21| 1E| 2A| | 59| 5B| 5C| 4E|
 | 
			
		||||
 * |---------------------------------------------------------| |---------------|
 | 
			
		||||
 * |    39| 00| 01| 02| 03| 05| 04| 26| 28| 25| 29| 27|    24| | 56| 57| 58| 66|
 | 
			
		||||
 * |---------------------------------------------------------| |---------------|
 | 
			
		||||
 * |      38| 06| 07| 08| 09| 0B| 2D| 2E| 2B| 2F| 2C|      38| | 53| 54| 55|   |
 | 
			
		||||
 * `---------------------------------------------------------' |-----------| 4C|
 | 
			
		||||
 *      | 3A|  37|             31              |   34| 3A|     |     52| 41|   |
 | 
			
		||||
 *      `------------------------------------------------'     `---------------'
 | 
			
		||||
 * Two right and left keys of 38 and 3A are identical, you cannot discriminate those two.
 | 
			
		||||
 */
 | 
			
		||||
#define LAYOUT_ansi( \
 | 
			
		||||
    K32,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33,  K47,K68,K6D,K62, \
 | 
			
		||||
    K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E,      K59,K5B,K5C,K4E, \
 | 
			
		||||
    K39,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27,    K24,  K56,K57,K58,K66, \
 | 
			
		||||
    K38,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C,        K4D,  K53,K54,K55,K4C, \
 | 
			
		||||
    K3A,K37,            K31,            K34,K2A,K46,K42,K48,  K52,    K41      \
 | 
			
		||||
) { \
 | 
			
		||||
    { K00,    K01,    K02,    K03,    K04,    K05,    K06,    K07   }, \
 | 
			
		||||
    { K08,    K09,    KC_NO,  K0B,    K0C,    K0D,    K0E,    K0F   }, \
 | 
			
		||||
    { K10,    K11,    K12,    K13,    K14,    K15,    K16,    K17   }, \
 | 
			
		||||
    { K18,    K19,    K1A,    K1B,    K1C,    K1D,    K1E,    K1F   }, \
 | 
			
		||||
    { K20,    K21,    K22,    K23,    K24,    K25,    K26,    K27   }, \
 | 
			
		||||
    { K28,    K29,    K2A,    K2B,    K2C,    K2D,    K2E,    K2F   }, \
 | 
			
		||||
    { K30,    K31,    K32,    K33,    K34,    KC_NO,  KC_NO,  K37   }, \
 | 
			
		||||
    { K38,    K39,    K3A,    KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO }, \
 | 
			
		||||
    { KC_NO,  K41,    K42,    KC_NO,  KC_NO,  KC_NO,  K46,    K47   }, \
 | 
			
		||||
    { K48,    KC_NO,  KC_NO,  KC_NO,  K4C,    K4D,    K4E,    KC_NO }, \
 | 
			
		||||
    { KC_NO,  KC_NO,  K52,    K53,    K54,    K55,    K56,    K57   }, \
 | 
			
		||||
    { K58,    K59,    KC_NO,  K5B,    K5C,    KC_NO,  KC_NO,  KC_NO }, \
 | 
			
		||||
    { KC_NO,  KC_NO,  K62,    KC_NO,  KC_NO,  KC_NO,  K66,    KC_NO }, \
 | 
			
		||||
    { K68,    KC_NO,  KC_NO,  KC_NO,  KC_NO,  K6D,    KC_NO,  KC_NO }, \
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* International keyboard layout for M0110 + M0120
 | 
			
		||||
 * https://en.wikipedia.org/wiki/File:Apple_Macintosh_Plus_Keyboard.jpg
 | 
			
		||||
 * Probably International keyboard layout of M0110A doesn't exist.
 | 
			
		||||
 *
 | 
			
		||||
 * M0110 + M0120 scan codes
 | 
			
		||||
 * ,---------------------------------------------------------. ,---------------.
 | 
			
		||||
 * | 32| 12| 13| 14| 15| 17| 16| 1A| 1C| 19| 1D| 1B| 18|   33| | 47| 68| 6D| 62|
 | 
			
		||||
 * |---------------------------------------------------------| |---------------|
 | 
			
		||||
 * |   30| 0C| 0D| 0E| 0F| 11| 10| 20| 22| 1F| 23| 21| 1E| 2A| | 59| 5B| 5C| 4E|
 | 
			
		||||
 * |------------------------------------------------------,  | |---------------|
 | 
			
		||||
 * |    39| 00| 01| 02| 03| 05| 04| 26| 28| 25| 29| 27| 24|  | | 56| 57| 58| 66|
 | 
			
		||||
 * |---------------------------------------------------------| |---------------|
 | 
			
		||||
 * |  38| 06| 07| 08| 09| 0B| 2D| 2E| 2B| 2F| 2C| 0A|      38| | 53| 54| 55|   |
 | 
			
		||||
 * `---------------------------------------------------------' |-----------| 4C|
 | 
			
		||||
 *      | 3A|  37|             34              |   31| 3A|     |     52| 41|   |
 | 
			
		||||
 *      `------------------------------------------------'     `---------------'
 | 
			
		||||
 * Two right and left keys of 38 and 3A are identical, you cannot discriminate those two.
 | 
			
		||||
 */
 | 
			
		||||
#define LAYOUT_iso( \
 | 
			
		||||
    K32,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33,  K47,K68,K6D,K62, \
 | 
			
		||||
    K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E,K2A,  K59,K5B,K5C,K4E, \
 | 
			
		||||
    K39,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27,K24,      K56,K57,K58,K66, \
 | 
			
		||||
    K38,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C,K0A,          K53,K54,K55,K4C, \
 | 
			
		||||
        K3A,K37,            K34,                K31,          K52,    K41      \
 | 
			
		||||
) { \
 | 
			
		||||
    { K00,    K01,    K02,    K03,    K04,    K05,    K06,    K07   }, \
 | 
			
		||||
    { K08,    K09,    K0A,    K0B,    K0C,    K0D,    K0E,    K0F   }, \
 | 
			
		||||
    { K10,    K11,    K12,    K13,    K14,    K15,    K16,    K17   }, \
 | 
			
		||||
    { K18,    K19,    K1A,    K1B,    K1C,    K1D,    K1E,    K1F   }, \
 | 
			
		||||
    { K20,    K21,    K22,    K23,    K24,    K25,    K26,    K27   }, \
 | 
			
		||||
    { K28,    K29,    K2A,    K2B,    K2C,    K2D,    K2E,    K2F   }, \
 | 
			
		||||
    { K30,    K31,    K32,    K33,    K34,    KC_NO,  KC_NO,  K37   }, \
 | 
			
		||||
    { K38,    K39,    K3A,    KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO }, \
 | 
			
		||||
    { KC_NO,  K41,    KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  K47   }, \
 | 
			
		||||
    { KC_NO,  KC_NO,  KC_NO,  KC_NO,  K4C,    KC_NO,  K4E,    KC_NO }, \
 | 
			
		||||
    { KC_NO,  KC_NO,  K52,    K53,    K54,    K55,    K56,    K57   }, \
 | 
			
		||||
    { K58,    K59,    KC_NO,  K5B,    K5C,    KC_NO,  KC_NO,  KC_NO }, \
 | 
			
		||||
    { KC_NO,  KC_NO,  K62,    KC_NO,  KC_NO,  KC_NO,  K66,    KC_NO }, \
 | 
			
		||||
    { K68,    KC_NO,  KC_NO,  KC_NO,  KC_NO,  K6D,    KC_NO,  KC_NO }, \
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										121
									
								
								keyboards/converter/m0110_usb/matrix.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								keyboards/converter/m0110_usb/matrix.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,121 @@
 | 
			
		|||
/*
 | 
			
		||||
Copyright 2011,2012 Jun Wako <wakojun@gmail.com>
 | 
			
		||||
 | 
			
		||||
This program is free software: you can redistribute it and/or modify
 | 
			
		||||
it under the terms of the GNU General Public License as published by
 | 
			
		||||
the Free Software Foundation, either version 2 of the License, or
 | 
			
		||||
(at your option) any later version.
 | 
			
		||||
 | 
			
		||||
This program is distributed in the hope that it will be useful,
 | 
			
		||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
You should have received a copy of the GNU General Public License
 | 
			
		||||
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 | 
			
		||||
--------------
 | 
			
		||||
 | 
			
		||||
Ported to QMK by Techsock <info@techsock.com>
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <avr/io.h>
 | 
			
		||||
#include <util/delay.h>
 | 
			
		||||
#include "print.h"
 | 
			
		||||
#include "util.h"
 | 
			
		||||
#include "debug.h"
 | 
			
		||||
#include "host.h"
 | 
			
		||||
#include "m0110.h"
 | 
			
		||||
#include "matrix.h"
 | 
			
		||||
#include "report.h"
 | 
			
		||||
#include "timer.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define CAPS        0x39
 | 
			
		||||
#define CAPS_BREAK  (CAPS | 0x80)
 | 
			
		||||
#define ROW(key)    ((key)>>3&0x0F)
 | 
			
		||||
#define COL(key)    ((key)&0x07)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static bool is_modified = false;
 | 
			
		||||
 | 
			
		||||
// matrix state buffer(1:on, 0:off)
 | 
			
		||||
static uint8_t *matrix;
 | 
			
		||||
static uint8_t _matrix0[MATRIX_ROWS];
 | 
			
		||||
 | 
			
		||||
static void register_key(uint8_t key);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
__attribute__ ((weak))
 | 
			
		||||
void matrix_init_kb(void) {
 | 
			
		||||
    matrix_init_user();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
__attribute__ ((weak))
 | 
			
		||||
void matrix_scan_kb(void) {
 | 
			
		||||
    matrix_scan_user();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
__attribute__ ((weak))
 | 
			
		||||
void matrix_init_user(void) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
__attribute__ ((weak))
 | 
			
		||||
void matrix_scan_user(void) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void matrix_init(void)
 | 
			
		||||
{
 | 
			
		||||
    m0110_init();
 | 
			
		||||
    // initialize matrix state: all keys off
 | 
			
		||||
    for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix0[i] = 0x00;
 | 
			
		||||
    matrix = _matrix0;
 | 
			
		||||
 | 
			
		||||
	matrix_init_quantum();
 | 
			
		||||
    return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t matrix_scan(void)
 | 
			
		||||
{
 | 
			
		||||
    uint8_t key;
 | 
			
		||||
 | 
			
		||||
    is_modified = false;
 | 
			
		||||
    key = m0110_recv_key();
 | 
			
		||||
 | 
			
		||||
    if (key == M0110_NULL) {
 | 
			
		||||
        return 0;
 | 
			
		||||
    } else if (key == M0110_ERROR) {
 | 
			
		||||
        return 0;
 | 
			
		||||
    } else {
 | 
			
		||||
        is_modified = true;
 | 
			
		||||
        register_key(key);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (debug_enable) {
 | 
			
		||||
        print("["); phex(key); print("]\n");
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    matrix_scan_quantum();
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void matrix_print(void){
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline
 | 
			
		||||
uint8_t matrix_get_row(uint8_t row)
 | 
			
		||||
{
 | 
			
		||||
    return matrix[row];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline
 | 
			
		||||
static void register_key(uint8_t key)
 | 
			
		||||
{
 | 
			
		||||
    if (key&0x80) {
 | 
			
		||||
        matrix[ROW(key)] &= ~(1<<COL(key));
 | 
			
		||||
    } else {
 | 
			
		||||
        matrix[ROW(key)] |=  (1<<COL(key));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										73
									
								
								keyboards/converter/m0110_usb/rules.mk
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								keyboards/converter/m0110_usb/rules.mk
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,73 @@
 | 
			
		|||
# MCU name
 | 
			
		||||
# atmega32u4 	Teensy2.0
 | 
			
		||||
# atemga32u4	TMK Converter rev.1
 | 
			
		||||
# atemga32u2	TMK Converter rev.2
 | 
			
		||||
MCU = atmega32u4
 | 
			
		||||
 | 
			
		||||
# Processor frequency.
 | 
			
		||||
#     This will define a symbol, F_CPU, in all source code files equal to the
 | 
			
		||||
#     processor frequency in Hz. You can then use this symbol in your source code to
 | 
			
		||||
#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
 | 
			
		||||
#     automatically to create a 32-bit value in your source code.
 | 
			
		||||
#
 | 
			
		||||
#     This will be an integer division of F_USB below, as it is sourced by
 | 
			
		||||
#     F_USB after it has run through any CPU prescalers. Note that this value
 | 
			
		||||
#     does not *change* the processor frequency - it should merely be updated to
 | 
			
		||||
#     reflect the processor speed set externally so that the code can use accurate
 | 
			
		||||
#     software delays.
 | 
			
		||||
#
 | 
			
		||||
#F_CPU = 16000000
 | 
			
		||||
F_CPU = 8000000
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# LUFA specific
 | 
			
		||||
#
 | 
			
		||||
# Target architecture (see library "Board Types" documentation).
 | 
			
		||||
ARCH = AVR8
 | 
			
		||||
 | 
			
		||||
# Input clock frequency.
 | 
			
		||||
#     This will define a symbol, F_USB, in all source code files equal to the
 | 
			
		||||
#     input clock frequency (before any prescaling is performed) in Hz. This value may
 | 
			
		||||
#     differ from F_CPU if prescaling is used on the latter, and is required as the
 | 
			
		||||
#     raw input clock is fed directly to the PLL sections of the AVR for high speed
 | 
			
		||||
#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
 | 
			
		||||
#     at the end, this will be done automatically to create a 32-bit value in your
 | 
			
		||||
#     source code.
 | 
			
		||||
#
 | 
			
		||||
#     If no clock division is performed on the input clock inside the AVR (via the
 | 
			
		||||
#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
 | 
			
		||||
F_USB = $(F_CPU)
 | 
			
		||||
 | 
			
		||||
# Interrupt driven control endpoint task(+60)
 | 
			
		||||
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
 | 
			
		||||
 | 
			
		||||
# Bootloader
 | 
			
		||||
#     This definition is optional, and if your keyboard supports multiple bootloaders of
 | 
			
		||||
#     different sizes, comment this out, and the correct address will be loaded 
 | 
			
		||||
#     automatically (+60). See bootloader.mk for all options.
 | 
			
		||||
BOOTLOADER = caterina
 | 
			
		||||
 | 
			
		||||
# Boot Section Size in *bytes*
 | 
			
		||||
#   Teensy halfKay   512
 | 
			
		||||
#   Teensy++ halfKay 1024
 | 
			
		||||
#   Atmel DFU loader 4096	for TMK Converter rev.1/rev.2
 | 
			
		||||
#   LUFA bootloader  4096
 | 
			
		||||
#   USBaspLoader     2048
 | 
			
		||||
 | 
			
		||||
# Build Options
 | 
			
		||||
#   comment out to disable the options.
 | 
			
		||||
#
 | 
			
		||||
BOOTMAGIC_ENABLE	= no			# Virtual DIP switch configuration(+1000)
 | 
			
		||||
MOUSEKEY_ENABLE		= no			# Mouse keys(+4700)
 | 
			
		||||
CONSOLE_ENABLE		= yes			# Console for debug(+400)
 | 
			
		||||
COMMAND_ENABLE		= no  			# Commands for debug and configuration
 | 
			
		||||
SLEEP_LED_ENABLE 	= no  			# Breathing sleep LED during USB suspend
 | 
			
		||||
NKRO_ENABLE 		= no			# USB Nkey Rollover - not yet supported in LUFA
 | 
			
		||||
EXTRAKEY_ENABLE		= yes	
 | 
			
		||||
USB_HID_ENABLE 		= yes
 | 
			
		||||
BACKLIGHT_ENABLE 	= no
 | 
			
		||||
#BLUETOOTH 			= AdafruitBLE   # For Adafruit Feather 32U4 BLE support, uncomment this line
 | 
			
		||||
 | 
			
		||||
CUSTOM_MATRIX = yes
 | 
			
		||||
SRC = matrix.c \
 | 
			
		||||
      m0110.c
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue