Merge remote-tracking branch 'origin/master' into develop

master
QMK Bot 2021-07-22 06:40:15 +00:00
commit a2d94371c6
14 changed files with 594 additions and 0 deletions

View File

@ -0,0 +1,29 @@
/* Copyright 2021 James R. Maynard III <jaymaynard@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/>.
*/
#pragma once
// place overrides below
// Blackpill pin assignments: reversed the rows from the Teensy version for easier PCB layout
// DO NOT USE the following pins: A9 (has pulldown on it), A11/A12 (USB lines), B2 (external pulldown)
// C13 has an LED, and C13/C14/C15 are best used as inputs (with DIODE_DIRECTION set to ROW2COL, the
// rows are inputs). Note that every usable I/O pin is used.
#define MATRIX_COL_PINS { B0, B1, B10, B12, B13, B14, B15, A8, A7, A10, A6, A5, A15, B3, B4, B5, B6, B7, B8, B9 }
#define MATRIX_ROW_PINS { C13, C14, C15, A0, A1, A2, A3, A4 }
// The BlackPill version is version 2
#define DEVICE_VER 0x0002

View File

@ -0,0 +1,2 @@
# BlackPill controller for m122-3270
This directory contains the BlackPill-specific definitions for the M122-3270 keyboard.

View File

@ -0,0 +1,7 @@
# Overrides for the Blackpill version
# MCU name
MCU = STM32F411
# Bootloader selection
BOOTLOADER = stm32-dfu

View File

@ -0,0 +1,71 @@
/* Copyright 2021 James R. Maynard III <jaymaynard@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/>.
*/
#pragma once
#include "config_common.h"
#define VENDOR_ID 0x1209
#define PRODUCT_ID 0x3270
// DEVICE_VER is defined in each variant's config.h file
#define MANUFACTURER IBM
#define PRODUCT Model M PC/3270 122 key
// Both controllers draw 100 mA or less
#define USB_MAX_POWER_CONSUMPTION 100
/* key matrix size */
#define MATRIX_ROWS 8
#define MATRIX_COLS 20
/*
* Keyboard Matrix Assignments
*
* Change this to how you wired your keyboard
* DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
*
*/
#define UNUSED_PINS
/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION ROW2COL
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCE 15
/* If defined, GRAVE_ESC will always act as ESC when CTRL is held.
* This is userful for the Windows task manager shortcut (ctrl+shift+esc).
*/
// #define GRAVE_ESC_CTRL_OVERRIDE
/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/
/* disable debug print */
//#define NO_DEBUG
/* disable print */
//#define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION

View File

@ -0,0 +1,134 @@
{
"keyboard_name": "IBM Model M PC/3270 122 key",
"maintainer": "jmaynard",
"width": 24.75,
"height": 8,
"layouts": {
"LAYOUT": {
"layout": [
{"label":"F13", "x":3.25, "y":0},
{"label":"F14", "x":4.25, "y":0},
{"label":"F15", "x":5.25, "y":0},
{"label":"F16", "x":6.25, "y":0},
{"label":"F17", "x":7.25, "y":0},
{"label":"F18", "x":8.25, "y":0},
{"label":"F19", "x":9.25, "y":0},
{"label":"F20", "x":10.25, "y":0},
{"label":"F21", "x":11.25, "y":0},
{"label":"F22", "x":12.25, "y":0},
{"label":"F23", "x":13.25, "y":0},
{"label":"F24", "x":14.25, "y":0},
{"label":"F1", "x":3.25, "y":1},
{"label":"F2", "x":4.25, "y":1},
{"label":"F3", "x":5.25, "y":1},
{"label":"F4", "x":6.25, "y":1},
{"label":"F5", "x":7.25, "y":1},
{"label":"F6", "x":8.25, "y":1},
{"label":"F7", "x":9.25, "y":1},
{"label":"F8", "x":10.25, "y":1},
{"label":"F9", "x":11.25, "y":1},
{"label":"F10", "x":12.25, "y":1},
{"label":"F11", "x":13.25, "y":1},
{"label":"F12", "x":14.25, "y":1},
{"label":"Esc", "x":0, "y":3},
{"x":1, "y":3},
{"label":"`", "x":2.25, "y":3},
{"label":"1", "x":3.25, "y":3},
{"label":"2", "x":4.25, "y":3},
{"label":"3", "x":5.25, "y":3},
{"label":"4", "x":6.25, "y":3},
{"label":"5", "x":7.25, "y":3},
{"label":"6", "x":8.25, "y":3},
{"label":"7", "x":9.25, "y":3},
{"label":"8", "x":10.25, "y":3},
{"label":"9", "x":11.25, "y":3},
{"label":"0", "x":12.25, "y":3},
{"label":"-", "x":13.25, "y":3},
{"label":"=", "x":14.25, "y":3},
{"label":"Backspace", "x":15.25, "y":3, "w":2},
{"label":"Insert", "x":17.5, "y":3},
{"label":"Home", "x":18.5, "y":3},
{"label":"Page Up", "x":19.5, "y":3},
{"label":"Num Lock", "x":20.75, "y":3},
{"label":"/", "x":21.75, "y":3},
{"label":"*", "x":22.75, "y":3},
{"label":"-", "x":23.75, "y":3},
{"x":0, "y":4},
{"x":1, "y":4},
{"label":"Tab", "x":2.25, "y":4, "w":1.5},
{"label":"Q", "x":3.75, "y":4},
{"label":"W", "x":4.75, "y":4},
{"label":"E", "x":5.75, "y":4},
{"label":"R", "x":6.75, "y":4},
{"label":"T", "x":7.75, "y":4},
{"label":"Y", "x":8.75, "y":4},
{"label":"U", "x":9.75, "y":4},
{"label":"I", "x":10.75, "y":4},
{"label":"O", "x":11.75, "y":4},
{"label":"P", "x":12.75, "y":4},
{"label":"[", "x":13.75, "y":4},
{"label":"]", "x":14.75, "y":4},
{"label":"Enter", "x":16, "y":4, "w":1.25, "h":2},
{"label":"Delete", "x":17.5, "y":4},
{"label":"End", "x":18.5, "y":4},
{"label":"Page Down", "x":19.5, "y":4},
{"label":"7", "x":20.75, "y":4},
{"label":"8", "x":21.75, "y":4},
{"label":"9", "x":22.75, "y":4},
{"label":"+", "x":23.75, "y":4},
{"x":0, "y":5},
{"x":1, "y":5},
{"label":"Caps Lock", "x":2.25, "y":5, "w":1.75},
{"label":"A", "x":4, "y":5},
{"label":"S", "x":5, "y":5},
{"label":"D", "x":6, "y":5},
{"label":"F", "x":7, "y":5},
{"label":"G", "x":8, "y":5},
{"label":"H", "x":9, "y":5},
{"label":"J", "x":10, "y":5},
{"label":"K", "x":11, "y":5},
{"label":"L", "x":12, "y":5},
{"label":";", "x":13, "y":5},
{"label":"'", "x":14, "y":5},
{"label":"#", "x":15, "y":5},
{"label":"Up", "x":18.5, "y":5},
{"label":"4", "x":20.75, "y":5},
{"label":"5", "x":21.75, "y":5},
{"label":"6", "x":22.75, "y":5},
{"x":23.75, "y":5},
{"x":0, "y":6},
{"x":1, "y":6},
{"label":"Shift", "x":2.25, "y":6, "w":1.25},
{"label":"\\", "x":3.5, "y":6},
{"label":"Z", "x":4.5, "y":6},
{"label":"X", "x":5.5, "y":6},
{"label":"C", "x":6.5, "y":6},
{"label":"V", "x":7.5, "y":6},
{"label":"B", "x":8.5, "y":6},
{"label":"N", "x":9.5, "y":6},
{"label":"M", "x":10.5, "y":6},
{"label":",", "x":11.5, "y":6},
{"label":".", "x":12.5, "y":6},
{"label":"/", "x":13.5, "y":6},
{"label":"Shift", "x":14.5, "y":6, "w":2.75},
{"label":"Left", "x":17.5, "y":6},
{"x":18.5, "y":6},
{"label":"Right", "x":19.5, "y":6},
{"label":"1", "x":20.75, "y":6},
{"label":"2", "x":21.75, "y":6},
{"label":"3", "x":22.75, "y":6},
{"label":"Enter", "x":23.75, "y":6, "h":2},
{"x":0, "y":7},
{"x":1, "y":7},
{"label":"Ctrl", "x":2.25, "y":7, "w":1.5},
{"label":"Alt", "x":4.75, "y":7, "w":1.5},
{"x":6.25, "y":7, "w":7},
{"label":"AltGr", "x":13.25, "y":7, "w":1.5},
{"label":"Ctrl", "x":15.75, "y":7, "w":1.5},
{"label":"Down", "x":18.5, "y":7},
{"label":"0", "x":20.75, "y":7, "w":2},
{"label":".", "x":22.75, "y":7}
]
}
}
}

View File

@ -0,0 +1,193 @@
/* Copyright 2021 James R. Maynard III <jaymaynard@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/>.
*/
#include QMK_KEYBOARD_H
enum custom_keycodes {
JM_DOT = SAFE_RANGE, // . both shifted and unshifted
JM_COMM, // , both shifted and unshifted
JM_GRLS, // < and > on one key
JM_CBRC, // { and } on one key
JM_CENT, // cent sign and ! on one key
JM_JUMP, // JUMP/PA3,
JM_DEL // Delete
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// PC/3270 layout: PC legends (blue)
[0] = LAYOUT(
KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24,
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_NO, KC_NO, 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_ESC, KC_PGUP, KC_PGDN, KC_NLCK, KC_SLCK, KC_PAST, KC_PSLS,
KC_NO, KC_PAUS, 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_ENT, KC_END, KC_INS, KC_DEL, KC_P7, KC_P8, KC_P9, KC_PPLS,
KC_NO, KC_NO, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS, KC_UP, KC_P4, KC_P5, KC_P6, KC_PMNS,
KC_PSCR, KC_NO, KC_LSFT, JM_GRLS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_LEFT, KC_HOME, KC_RIGHT, KC_P1, KC_P2, KC_P3, KC_PENT,
MO(10), KC_LGUI, KC_LCTL, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_DOWN, KC_P0, KC_PDOT
),
// PC/3270 layout: 3270 legends (black), with x3270 keycodes
[1] = LAYOUT(
A(KC_F1), A(KC_F2), A(KC_F3), A(KC_F4), A(KC_F5), A(KC_F6), A(KC_F7), A(KC_F8), A(KC_F9), A(KC_F10), A(KC_F11), A(KC_F12),
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
A(KC_A), A(KC_C), 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, A(KC_1), A(KC_2), JM_JUMP, KC_NO, KC_NO, KC_PCMM, KC_SPC,
KC_CRSEL, KC_PAUS, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, JM_CENT, KC_BSLS, S(KC_ENT), S(KC_TAB), KC_INS, JM_DEL, KC_P7, KC_P8, KC_P9, KC_TAB,
KC_EXSEL, A(KC_E), KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, JM_CBRC, KC_UP, KC_P4, KC_P5, KC_P6, KC_PMNS,
A(KC_B), C(KC_C), KC_LSFT, JM_GRLS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, JM_COMM, JM_DOT, KC_SLSH, KC_RSFT, KC_LEFT, A(KC_H), KC_RIGHT, KC_P1, KC_P2, KC_P3, KC_PENT,
MO(10), KC_LGUI, A(KC_R), KC_LALT, KC_SPC, KC_RALT, KC_ENT, KC_DOWN, KC_P0, KC_PDOT
),
// Function layer, accessed by the Zoom key
[10] = LAYOUT(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
DF(0), DF(1), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(11), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
// Firmware layer, accessed by the Zoom/Space key pair (hold both down)
[11] = LAYOUT(
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, EEP_RST, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, DEBUG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
};
bool left_shift_down = false;
bool right_shift_down = false;
bool left_alt_down = false;
bool right_alt_down = false;
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_LSHIFT:
if (record->event.pressed) {
left_shift_down = true;
return true;
} else {
left_shift_down = false;
return true;
}
break;
case KC_RSHIFT:
if (record->event.pressed) {
right_shift_down = true;
return true;
} else {
right_shift_down = false;
return true;
}
break;
case KC_LALT:
if (record->event.pressed) {
left_alt_down = true;
return true;
} else {
left_alt_down = false;
return true;
}
break;
case KC_RALT:
if (record->event.pressed) {
right_alt_down = true;
return true;
} else {
right_alt_down = false;
return true;
}
break;
case JM_GRLS:
if (left_shift_down || right_shift_down) {
if(record->event.pressed) {
SEND_STRING(">");
}
return false;
} else {
if(record->event.pressed) {
SEND_STRING("<");
}
return false;
}
break;
case JM_CBRC:
if (left_shift_down || right_shift_down) {
if (record->event.pressed) {
SEND_STRING("}");
}
return false;
} else {
if(record->event.pressed) {
SEND_STRING("{");
}
return false;
}
break;
case JM_CENT:
if (left_shift_down || right_shift_down) {
if (record->event.pressed) {
SEND_STRING("!");
}
return false;
} else {
if (record->event.pressed) {
SEND_STRING("<"); // TODO: what does tn3270 want for a cent sign?
}
return false;
}
break;
case JM_COMM:
if (record->event.pressed){
SEND_STRING(",");
}
return false;
case JM_DOT:
if (record->event.pressed) {
SEND_STRING(".");
}
return false;
case JM_JUMP:
if (record->event.pressed) {
if (left_alt_down || right_alt_down) {
SEND_STRING("3");
}
}
return false;
case JM_DEL:
if (record->event.pressed) {
if (left_alt_down || right_alt_down) {
unregister_code(KC_LALT);
unregister_code(KC_RALT);
tap_code16(C(KC_W));
if (left_alt_down) {
register_code(KC_LALT);
}
if (right_alt_down) {
register_code(KC_RALT);
}
} else {
tap_code16(KC_DEL);
}
}
return false;
}
return true;
}

View File

@ -0,0 +1,23 @@
# Default keymap for m122-3270
This keymap is intended to make the PC/3270 122-key IBM keyboard work as closely as possible to the standard
PC/3270 keyboard's original mapping. Two layers are defined: layer 0 is the PC layout, using the blue legends
on the PC/3270 keys (as shipped by Unicomp; I don't have the original keycaps, and I know there are a few
differences), while layer 1 is the 3270 layout, with keycodes selected to make the x3270 suite do the right
thing with each key as pressed. The idea here is, eventually, to get x3270 and friends to automatically
shift the keyboard to layer 1 when they gain focus.
When layer 0 is active, the PA1 key is Escape, the Reset and Enter keys are Control, and the comma and dot keys
act like normal PC keys (< and >, repectively, when shifted). The Ctrl key (bottom right of the left-side 10-key
cluster) is always the left GUI key. PA2 and Jump/PA3 are PgUp and PgDn, respectively, and the backtab key is
End. The Rule/Home key is Home.
When layer 1 is active, the keys do their labeled functions. The only keys that don't do anything are CrSel,
ExSel, and Jump, though only a few of the alternate functions (on the front of the keys) work: left/right/delete
word and PA3. The rest aren't emulated by x3270. Many of the keys that have function in PC mode will *not* have
that same function in 3270 mode, since x3270 uses different keystrokes to accomplish the same function.
To manually switch to layer 1, hold the Zoom key (the one on the far lower left of the keyboard) and press Clear
(the one at the top right of that same block of 10 keys); to switch back to layer 0, hold the Zoom key and hit
Attn (the one at the top left of that block of 10). Holding the Zoom key and the spacebar gets you to keys that
control QMK itself: Zoom-space-R resets to the bootloader, Zoom-space-E erases the EEPROM (which currently does
nothing), and Zoom-space-D turns the debugger on and off.

View File

@ -0,0 +1,16 @@
/* Copyright 2021 James R. Maynard III
*
* 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/>.
*/
#include "m122_3270.h"

View File

@ -0,0 +1,40 @@
/* Copyright 2021 James R. Maynard III
*
* 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/>.
*/
#pragma once
#include "quantum.h"
// This a shortcut to help you visually see your layout.
// The first section contains all of the arguments
// The second converts the arguments into a two-dimensional array
#define LAYOUT( \
k09, k19, k1A, k29, k39, k3A, k49, k59, k5A, k69, k79, k7A, \
k0A, k0B, k1B, k2A, k2B, k3B, k4A, k4B, k5B, k6A, k6B, k7B, \
k31, k32, k34, k24, k25, k26, k27, k37, k38, k28, k2C, k2D, k2E, k3E, k3C, k3F, k3G, k3H, k2G, k2F, k2H, k2I, k20, \
k21, k41, k42, k44, k45, k46, k47, k57, k58, k48, k4C, k4D, k4E, k5E, k5C, k6F, k1G, k5G, k4G, k4F, k4H, k4I, k40, \
k51, k52, k62, k14, k15, k16, k17, k07, k08, k18, k1C, k1D, k1E, k0E, k6E, k0G, k1F, k1H, k1I, k10, \
k11, k12, k73, k74, k64, k65, k66, k67, k77, k78, k68, k6C, k6D, k7E, k63, k60, k0J, k1J, k61, k6H, k6I, k7J, \
k02, k01, k00, k70, k71, k03, k72, k0F, k7H, k7I \
) \
{ \
{ k00, k01, k02, k03, KC_NO, KC_NO, KC_NO, k07, k08, k09, k0A, k0B, KC_NO, KC_NO, k0E, k0F, k0G, KC_NO, KC_NO, k0J }, \
{ k10, k11, k12, KC_NO, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k1E, k1F, k1G, k1H, k1I, k1J }, \
{ k20, k21, KC_NO, KC_NO, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k2E, k2F, k2G, k2H, k2I, KC_NO }, \
{ KC_NO, k31, k32, KC_NO, k34, KC_NO, KC_NO, k37, k38, k39, k3A, k3B, k3C, KC_NO, k3E, k3F, k3G, k3H, KC_NO, KC_NO }, \
{ k40, k41, k42, KC_NO, k44, k45, k46, k47, k48, k49, k4A, k4B, k4C, k4D, k4E, k4F, k4G, k4H, k4I, KC_NO }, \
{ KC_NO, k51, k52, KC_NO, KC_NO, KC_NO, KC_NO, k57, k58, k59, k5A, k5B, k5C, KC_NO, k5E, KC_NO, k5G, KC_NO, KC_NO, KC_NO }, \
{ k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6A, k6B, k6C, k6D, k6E, k6F, KC_NO, k6H, k6I, KC_NO }, \
{ k70, k71, k72, k73, k74, KC_NO, KC_NO, k77, k78, k79, k7A, k7B, KC_NO, KC_NO, k7E, KC_NO, KC_NO, k7H, k7I, k7J }, \
}

View File

@ -0,0 +1,27 @@
# m122-3270
![IBM Model M 122 key](https://i.imgur.com/Oo3Ozqzh.jpg)
This is a replacement controller for the IBM Model M 122 key terminal keyboard running on a STM32F411 BlackPill, intended
to act as closely to the 3270 keyboard's functioning as possible while still being usable on a PC.
* Keyboard Maintainer: [Jay Maynard](https://github.com/jmaynard)
* Hardware Supported: BlackPill STM32F411, Teensy++ 2.0
* Hardware Availability: [BlackPill](https://www.adafruit.com/product/4877), [Teensy](https://www.pjrc.com/store/teensypp.html)
Make example for this keyboard (after setting up your build environment):
make tronguylabs/m122_3270/blackpill:default
make tronguylabs/m122_3270/teensy:default
See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the
[make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information.
A schematic and Gerber files are publicly available for those wishing to have carrier boards made
professionally instead of handwiring things. The M122 matrix connectors plug right into it. It can
be found at https://github.com/jmaynard/tronguylabs-m122-blackpill .
This is derived from Luke Stanley's handwired/ibm122m keyboard, with my own keymapping and
rework of the I/O for the BlackPill. There's also a version for the Teensy++ 2.0, since that
was my original design and I still use one on one board, even though I switched to the
BlackPill for future-proofing. The Teensy++ 2.0 is not recommended for new designs.

View File

@ -0,0 +1,16 @@
# Build Options
# change yes to no to disable
#
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
MOUSEKEY_ENABLE = yes # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = yes # Console for debug
COMMAND_ENABLE = yes # Commands for debug and configuration
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
NKRO_ENABLE = yes # USB Nkey Rollover
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
BLUETOOTH_ENABLE = no # Enable Bluetooth
AUDIO_ENABLE = no # Audio output

View File

@ -0,0 +1,27 @@
/* Copyright 2021 James R. Maynard III <jaymaynard@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/>.
*/
#pragma once
// place overrides below
// Teensy pin assignments: I'm wiring things a bit more straightforwardly, and
// avoiding the LED on PD6
#define MATRIX_COL_PINS { B5, B6, B7, D0, D1, D2, D3, D4, D5, D7, E0, E1, C0, C1, C2, C3, C4, C5, C6, C7 }
#define MATRIX_ROW_PINS { F0, F1, F2, F3, F4, F5, F6, F7 }
// The Teensy version is version 1
#define DEVICE_VER 0x0001

View File

@ -0,0 +1,2 @@
# Teensy controller for m122-3270
This directory contains the Teensy++ 2.0-specific definitions for the M122-3270 keyboard.

View File

@ -0,0 +1,7 @@
# Overrides for the Teensy version
# MCU name
MCU = at90usb1286
# Bootloader selection
BOOTLOADER = halfkay