From 4ebd27002a344b017276dc70796435a8e718f46a Mon Sep 17 00:00:00 2001 From: listofoptions <39714365+listofoptions@users.noreply.github.com> Date: Mon, 26 Nov 2018 12:53:49 -0500 Subject: [PATCH] Keyboard: 5291 firmware to replace the existing soarers controller firmware (#4483) * compiles but is not working * still testing 5291 * compiles but is not working * still testing 5291 * fixed a but in the layout (reversed key order in row) * compiles but is not working * still testing 5291 * fixed a but in the layout (reversed key order in row) * fixed some issues * doumentation needed * doumentation needed * documentation needed * documentation needed * Update readme.md documentation * Update readme.md i dislike markdown <_> * merge preperation --- keyboards/converter/ibm_5291/config.h | 42 +++ keyboards/converter/ibm_5291/ibm_5291.c | 3 + keyboards/converter/ibm_5291/ibm_5291.h | 69 +++++ keyboards/converter/ibm_5291/info.json | 6 + .../ibm_5291/keymaps/default/keymap.c | 233 ++++++++++++++ .../keymaps/kbdbabel_doc_ibm5291_kbd.pdf | Bin 0 -> 13054 bytes keyboards/converter/ibm_5291/matrix.c | 284 ++++++++++++++++++ keyboards/converter/ibm_5291/matrix.csv | 96 ++++++ keyboards/converter/ibm_5291/readme.md | 70 +++++ keyboards/converter/ibm_5291/rules.mk | 72 +++++ 10 files changed, 875 insertions(+) create mode 100644 keyboards/converter/ibm_5291/config.h create mode 100644 keyboards/converter/ibm_5291/ibm_5291.c create mode 100644 keyboards/converter/ibm_5291/ibm_5291.h create mode 100644 keyboards/converter/ibm_5291/info.json create mode 100644 keyboards/converter/ibm_5291/keymaps/default/keymap.c create mode 100644 keyboards/converter/ibm_5291/keymaps/kbdbabel_doc_ibm5291_kbd.pdf create mode 100644 keyboards/converter/ibm_5291/matrix.c create mode 100644 keyboards/converter/ibm_5291/matrix.csv create mode 100644 keyboards/converter/ibm_5291/readme.md create mode 100644 keyboards/converter/ibm_5291/rules.mk diff --git a/keyboards/converter/ibm_5291/config.h b/keyboards/converter/ibm_5291/config.h new file mode 100644 index 0000000000..5c9ca1e4a9 --- /dev/null +++ b/keyboards/converter/ibm_5291/config.h @@ -0,0 +1,42 @@ +/* +Copyright 2018 listofoptions + +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 . +*/ + +#pragma once + +#include "config_common.h" + +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 1 +#define MANUFACTURER QMK +#define PRODUCT 5291 keyboard converter +#define DESCRIPTION 5291 keyboard converter + +#define MATRIX_ROWS 24 +#define MATRIX_COLS 4 + +#define MATRIX_ROW_PINS {B2, B3, B4, B5, B6} +#define MATRIX_COL_PINS {B0, B1} +#define MATRIX_DATA_PIN D0 +#define MATRIX_STROBE_PIN D1 +#define LED_PIN D6 + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 0 + + diff --git a/keyboards/converter/ibm_5291/ibm_5291.c b/keyboards/converter/ibm_5291/ibm_5291.c new file mode 100644 index 0000000000..9b937a545a --- /dev/null +++ b/keyboards/converter/ibm_5291/ibm_5291.c @@ -0,0 +1,3 @@ +#include "ibm_5291.h" +#include +#include "quantum.h" \ No newline at end of file diff --git a/keyboards/converter/ibm_5291/ibm_5291.h b/keyboards/converter/ibm_5291/ibm_5291.h new file mode 100644 index 0000000000..aa1b403242 --- /dev/null +++ b/keyboards/converter/ibm_5291/ibm_5291.h @@ -0,0 +1,69 @@ +/* +Copyright 2018 listofoptions + +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 . +*/ + +#pragma once + +#include "quantum.h" + +/* + * ,-------. ,--------------------------------------------------------------------------. + * | F1| F2| |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| BS |NumLck |ScrLck | + * |-------| |--------------------------------------------------------------------------| + * | F3| F4| | Tab | Q| W| E| R| T| Y| U| I| O| P| [| ] | | 7| 8| 9| -| + * |-------| |------------------------------------------------------|Ent|---------------| + * | F5| F6| | Ctrl | A| S| D| F| G| H| J| K| L| ;| '| `| | 4| 5| 6| | + * |-------| |----------------------------------------------------------------------| | + * | F7| F8| |Shif| \| Z| X| C| V| B| N| M| ,| .| /|Shift|PrS| 1| 2| 3| +| + * |-------| |----------------------------------------------------------------------| | + * | F9|F10| | Alt | Space |CapsLck| 0 | . | | + * `-------' `--------------------------------------------------------------------------' +*/ + +#define LAYOUT_5291( \ + KEY_F1,KEY_F2, KEY_ESC, KEY_1, KEY_2,KEY_3,KEY_4,KEY_5,KEY_6,KEY_7,KEY_8,KEY_9, KEY_0, KEY_MIN, KEY_EQU, KEY_BACK, KEY_NLOCK, KEY_SLOCK, \ + KEY_F3,KEY_F4, KEY_TAB, KEY_Q, KEY_W,KEY_E,KEY_R,KEY_T,KEY_Y,KEY_U,KEY_I,KEY_O, KEY_P, KEY_LBRC,KEY_RBRC, KEY_PAD7,KEY_PAD8, KEY_PAD9,KEY_PMIN, \ + KEY_F5,KEY_F6, KEY_LCTR,KEY_A, KEY_S,KEY_D,KEY_F,KEY_G,KEY_H,KEY_J,KEY_K,KEY_L, KEY_SEMI,KEY_QUOT,KEY_TICK, KEY_ENTR,KEY_PAD4,KEY_PAD5, KEY_PAD6, \ + KEY_F7,KEY_F8, KEY_LSFS,KEY_BSLS,KEY_Z,KEY_X,KEY_C,KEY_V,KEY_B,KEY_N,KEY_M,KEY_COMM,KEY_DOT, KEY_SLS,KEY_RSFS, KEY_PAST,KEY_PAD1,KEY_PAD2, KEY_PAD3,KEY_PPLS, \ + KEY_F9,KEY_F10, KEY_LALT, KEY_SPACE, KEY_CLOCK, KEY_PAD0, KEY_PDOT \ +) \ +{ {KEY_Z, KEY_S, KEY_W, KEY_3 }\ +, {KEY_X, KEY_D, KEY_E, KEY_4 }\ +, {KEY_C, KEY_F, KEY_R, KEY_5 }\ +, {KEY_V, KEY_G, KEY_T, KEY_6 }\ +, {KEY_B, KEY_H, KEY_Y, KEY_7 }\ +, {KEY_N, KEY_J, KEY_U, KEY_8 }\ +, {KEY_PAD2, KEY_PAD5,KEY_PAD8,KEY_NLOCK }\ +, {KEY_M, KEY_K, KEY_I, KEY_9 }\ +, {KEY_COMM, KEY_L, KEY_O, KEY_0 }\ +, {KEY_DOT, KEY_SEMI,KEY_P, KEY_MIN }\ +, {KEY_SLS, KEY_QUOT,KEY_LBRC,KEY_EQU }\ +, {KEY_SPACE, KEY_RSFS,KEY_TICK,KEY_RBRC }\ +, {KEY_CLOCK, KEY_PAST,KEY_ENTR,KEY_BACK }\ +, {KEY_PAD0, KEY_PAD1,KEY_PAD4,KEY_PAD7 }\ +, {KEY_PPLS, KC_NO, KEY_PMIN,KEY_SLOCK }\ +, {KEY_PDOT, KEY_PAD3,KEY_PAD6,KEY_PAD9 }\ +, {KEY_BSLS, KEY_A, KEY_Q, KEY_2 }\ +, {KEY_LALT, KC_NO, KC_NO, KEY_1 }\ +, {KEY_F7, KEY_F5, KEY_F3, KEY_F1 }\ +, {KEY_F8, KEY_F6, KEY_F4, KEY_F2 }\ +, {KC_F10, KC_NO, KC_NO, KC_NO }\ +, {KC_F9, KC_NO, KC_NO, KC_NO }\ +, {KEY_LSFS, KEY_LCTR,KEY_TAB, KEY_ESC }\ +, {KC_NO, KC_NO, KC_NO, KC_NO }\ +} + +#define LAYOUT LAYOUT_5291 \ No newline at end of file diff --git a/keyboards/converter/ibm_5291/info.json b/keyboards/converter/ibm_5291/info.json new file mode 100644 index 0000000000..080a16336e --- /dev/null +++ b/keyboards/converter/ibm_5291/info.json @@ -0,0 +1,6 @@ +{ + "keyboard_name": "IBM 5291", + "keyboard_folder": "converter/5291", + "url": "https://deskthority.net/wiki/IBM_Model_F#IBM_5291_Keyboard", + "maintainer": "listofoptions", +} diff --git a/keyboards/converter/ibm_5291/keymaps/default/keymap.c b/keyboards/converter/ibm_5291/keymaps/default/keymap.c new file mode 100644 index 0000000000..9b286c887d --- /dev/null +++ b/keyboards/converter/ibm_5291/keymaps/default/keymap.c @@ -0,0 +1,233 @@ +/* +Copyright 2018 listofoptions + +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 . +*/ + +#include QMK_KEYBOARD_H +/* +enum xt_keycodes + { XT_PAST = SAFE_RANGE // XT pad asterisk / print screen + , XT_SLCK // XT scroll lock / break + , XT_F6 // F6 / app key + , XT_F5 // F5 / gui + , XT_F9 // F9 / F11 + , XT_F10 // F10 / F12 + } ; + +static bool shift_pressed = false , + alt_pressed = false , + ctrl_pressed = false , + xt_pscr_pressed = false , + xt_brk_pressed = false , + xt_app_pressed = false , + xt_gui_pressed = false , + xt_lout_pressed = false , + xt_f11_pressed = false , + xt_f12_pressed = false ; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case KC_LSFT: + case KC_RSFT: + if (record->event.pressed) { + shift_pressed = true ; + } else { + shift_pressed = false ; + } + return true; + break; + + case KC_LALT: + if (record->event.pressed) { + alt_pressed = true ; + } else { + alt_pressed = false ; + } + return true; + break; + + case KC_LCTL: + if (record->event.pressed) { + ctrl_pressed = true ; + } else { + ctrl_pressed = false ; + } + return true; + break; + + case XT_PAST: + if (record->event.pressed) { + if (shift_pressed) { + xt_pscr_pressed = true ; + register_code(KC_PSCR); + } else { + register_code(KC_PAST); + } + } else { + if (xt_pscr_pressed) { + xt_pscr_pressed = false ; + unregister_code(KC_PSCR); + } else { + unregister_code(KC_PAST); + } + } + return false; + break; + + case XT_SLCK: + if (record->event.pressed) { + if (ctrl_pressed) { + xt_brk_pressed = true ; + register_code(KC_BRK); + } else { + register_code(KC_SLCK); + } + } else { + if (xt_brk_pressed) { + xt_brk_pressed = false ; + unregister_code(KC_BRK); + } else { + unregister_code(KC_SLCK); + } + } + return false; + break; + + case XT_F6: + if (record->event.pressed) { + if (shift_pressed) { + xt_app_pressed = true ; + register_code(KC_APP); + } else { + register_code(KC_F6); + } + } else { + if (xt_app_pressed) { + xt_app_pressed = false ; + unregister_code(KC_APP); + } else { + unregister_code(KC_F6); + } + } + return false; + break; + + case XT_F5: + if (record->event.pressed) { + if (shift_pressed) { + xt_gui_pressed = true ; + register_code(KC_LGUI); + } else if (ctrl_pressed) { + xt_lout_pressed = true ; + register_code (KC_LGUI) ; + register_code (KC_L) ; + } else { + register_code(KC_F5); + } + } else { + if (xt_gui_pressed) { + xt_gui_pressed = false ; + unregister_code(KC_LGUI); + } else if (xt_lout_pressed) { + xt_lout_pressed = false ; + unregister_code (KC_LGUI) ; + unregister_code (KC_L) ; + } else { + unregister_code(KC_F5); + } + } + return false; + break; + + case XT_F9: + if (record->event.pressed) { + if (shift_pressed) { + xt_f11_pressed = true ; + register_code(KC_F11); + } else { + register_code(KC_F9); + } + } else { + if (xt_f11_pressed) { + xt_f11_pressed = false ; + unregister_code(KC_F11); + } else { + unregister_code(KC_F9); + } + } + return false; + break; + + case XT_F10: + if (record->event.pressed) { + if (shift_pressed) { + xt_f12_pressed = true ; + register_code(KC_F12); + } else { + register_code(KC_F10); + } + } else { + if (xt_f12_pressed) { + xt_f12_pressed = false ; + unregister_code(KC_F12); + } else { + unregister_code(KC_F10); + } + } + return false; + break; + + default: + return true; + break; + } + + return true; +} +*/ + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +// default layout is the standard XT layout +/* + * ,-------. ,--------------------------------------------------------------------------. + * | F1| F2| |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| BS |NumLck |ScrLck | + * |-------| |--------------------------------------------------------------------------| + * | F3| F4| | Tab | Q| W| E| R| T| Y| U| I| O| P| [| ] | | 7| 8| 9| -| + * |-------| |------------------------------------------------------|Ent|---------------| + * | F5| F6| | Ctrl | A| S| D| F| G| H| J| K| L| ;| '| `| | 4| 5| 6| | + * |-------| |----------------------------------------------------------------------| | + * | F7| F8| |Shif| \| Z| X| C| V| B| N| M| ,| .| /|Shift| *| 1| 2| 3| +| + * |-------| |----------------------------------------------------------------------| | + * | F9|F10| | Alt | Space |CapsLck| 0 | . | | + * `-------' `--------------------------------------------------------------------------' +*/ +/* + [0] = LAYOUT ( + KC_F1,KC_F2, KC_ESC, 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, XT_SLCK, + KC_F3,KC_F4, 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, + XT_F5,XT_F6, KC_LCTL,KC_A, KC_S,KC_D,KC_F,KC_G,KC_H,KC_J,KC_K,KC_L, KC_SCLN,KC_QUOT,KC_GRV, KC_ENT, KC_P4,KC_P5, KC_P6, + KC_F7,KC_F8, KC_LSFT,KC_BSLS,KC_Z,KC_X,KC_C,KC_V,KC_B,KC_N,KC_M,KC_COMM,KC_DOT, KC_SLSH,KC_RSFT,XT_PAST,KC_P1,KC_P2, KC_P3, KC_PPLS, + XT_F9,XT_F10,KC_LALT, KC_SPACE, KC_CAPS, KC_P0, KC_PDOT + ) +*/ + [0] = LAYOUT ( + KC_F1,KC_F2, KC_ESC, 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_SLCK, + KC_F3,KC_F4, 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_F5,KC_F6, KC_LCTL,KC_A, KC_S,KC_D,KC_F,KC_G,KC_H,KC_J,KC_K,KC_L, KC_SCLN,KC_QUOT,KC_GRV, KC_ENT, KC_P4,KC_P5, KC_P6, + KC_F7,KC_F8, KC_LSFT,KC_BSLS,KC_Z,KC_X,KC_C,KC_V,KC_B,KC_N,KC_M,KC_COMM,KC_DOT, KC_SLSH,KC_RSFT,KC_PAST,KC_P1,KC_P2, KC_P3, KC_PPLS, + KC_F9,KC_F10,KC_LALT, KC_SPACE, KC_CAPS, KC_P0, KC_PDOT + ) +} ; + diff --git a/keyboards/converter/ibm_5291/keymaps/kbdbabel_doc_ibm5291_kbd.pdf b/keyboards/converter/ibm_5291/keymaps/kbdbabel_doc_ibm5291_kbd.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3560598f02b8bacc12ef9426875a5b7076e32eab GIT binary patch literal 13054 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 Ks_N?R#svWCe-j@7 literal 0 HcmV?d00001 diff --git a/keyboards/converter/ibm_5291/matrix.c b/keyboards/converter/ibm_5291/matrix.c new file mode 100644 index 0000000000..58f6e37b65 --- /dev/null +++ b/keyboards/converter/ibm_5291/matrix.c @@ -0,0 +1,284 @@ +/* +Copyright 2018 listofoptions + +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 . +*/ + +#include +#include +#include +#if defined(__AVR__) +#include +#endif +#include + +#include "wait.h" +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" +#include "timer.h" + +#include "config.h" + + +#ifndef DEBOUNCING_DELAY +# define DEBOUNCING_DELAY 5 +#endif + +#define print_matrix_header() print("\nr/c 01234567\n") +#define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row)) +#define matrix_bitpop(i) bitpop(matrix[i]) +#define ROW_SHIFTER ((uint8_t)1) +#define check_bit(var,pos) ((var) & (1<<(pos))) + +#define NUM_ROW_PINS 5 +#define NUM_COL_PINS 2 + +static const uint8_t row_pins [NUM_ROW_PINS] = MATRIX_ROW_PINS ; +static const uint8_t col_pins [NUM_ROW_PINS] = MATRIX_COL_PINS ; + +#if ( DEBOUNCING_DELAY > 0 ) +static uint16_t debouncing_time ; +static bool debouncing = false ; +#endif + +static uint8_t matrix [MATRIX_ROWS] = {0}; + +#if ( DEBOUNCING_DELAY > 0 ) +static uint8_t matrix_debounce [MATRIX_ROWS] = {0}; +#endif + +static +inline +void toggle_led(void) { + uint8_t pin = LED_PIN ; + _SFR_IO8((pin >> 4) + 2) ^= _BV(pin & 0xF); +} + +static +inline +void init_led(void) { + uint8_t pin = LED_PIN ; + _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT + _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW +} + +static +inline +void init_data(void) { + uint8_t pin = MATRIX_DATA_PIN ; + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // LO +} + +static +inline +void init_strobe(void) { + uint8_t pin = MATRIX_STROBE_PIN ; + _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI +} + +static +inline +void init_rows(void) { + for ( uint8_t i = 0 ; i < NUM_ROW_PINS; ++i ) { + uint8_t pin = row_pins[i]; + _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT + _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW + } +} + +static +inline +void init_cols(void) { + for ( uint8_t i = 0 ; i < NUM_COL_PINS; ++i ) { + uint8_t pin = col_pins[i]; + _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT + _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW + } +} + +static +inline +void select_row(uint8_t current_row) { + for ( uint8_t i = 0 ; i < NUM_ROW_PINS; ++i ) { + uint8_t pin = row_pins[i] ; + if ( check_bit( current_row, i ) ) { + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + } else { + _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW + } + } + wait_us(30) ; +} + +static +inline +void select_col(uint8_t current_col) { + for ( uint8_t i = 0 ; i < NUM_COL_PINS; ++i ) { + uint8_t pin = col_pins[i] ; + if ( check_bit( current_col, i ) ) { + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + } else { + _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW + } + } + wait_us(30) ; +} + +static +inline +uint8_t matrix_strobe(uint8_t col_index) { + uint8_t strobe_pin = MATRIX_STROBE_PIN ; + uint8_t data_pin = MATRIX_DATA_PIN ; + + // set strobe pin low + _SFR_IO8((strobe_pin >> 4) + 2) &= ~_BV(strobe_pin & 0xF); + + wait_us(30) ; + + // read data + uint8_t data = (_SFR_IO8(data_pin >> 4) & _BV(data_pin & 0xF)) ; + + // set strobe pin hi + _SFR_IO8((strobe_pin >> 4) + 2) |= _BV(strobe_pin & 0xF); + + uint8_t out = data ? (1 << col_index) : 0 ; + return out ; +} + +static +bool matrix_read(uint8_t current_matrix[], uint8_t current_row) { + // Store last value of row prior to reading + uint8_t last_row_value = current_matrix[current_row]; + + // Clear data in matrix row + current_matrix[current_row] = 0; + + select_row(current_row); + + // For each col... + for(uint8_t col_index = 0; col_index < MATRIX_COLS; ++col_index) { + + select_col(col_index) ; + + // strobe the matrix + // Populate the matrix row with the state of the data pin + current_matrix[current_row] |= matrix_strobe(col_index) ; + } + + bool test = last_row_value != current_matrix[current_row] ; + return test ; +} + +__attribute__ ((weak)) +void matrix_init_quantum(void) { + matrix_init_kb(); +} + +__attribute__ ((weak)) +void matrix_scan_quantum(void) { + matrix_scan_kb(); +} + +__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) { +} + +inline +uint8_t matrix_rows(void) { + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) { + return MATRIX_COLS; +} + +inline +uint8_t matrix_get_row(uint8_t row) { + return matrix[row]; +} + +void matrix_init(void) { + init_led() ; + init_rows() ; + init_cols() ; + init_data() ; + init_strobe() ; + + // initialize matrix state: all keys off + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + matrix[i] = 0; +# if (DEBOUNCING_DELAY > 0) + matrix_debounce [i] = 0; +# endif + } + + matrix_init_quantum() ; +} + +uint8_t matrix_scan(void) { + for ( uint8_t current_row = 0; current_row < MATRIX_ROWS; ++current_row ) { +# if (DEBOUNCING_DELAY > 0) + bool matrix_changed = matrix_read(matrix_debounce, current_row); + + if (matrix_changed) { + debouncing = true ; + debouncing_time = timer_read(); + } + +# else + matrix_read(matrix, current_row); +# endif + } + +# if (DEBOUNCING_DELAY > 0) + if (debouncing && (timer_elapsed(debouncing_time) > DEBOUNCING_DELAY)) { + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + matrix[i] = matrix_debounce[i]; + } + debouncing = false; + } +# endif + + matrix_scan_quantum(); + return 1; +} + +void matrix_print(void) { + print_matrix_header(); + + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + phex(row); print(": "); + print_matrix_row(row); + print("\n"); + } +} diff --git a/keyboards/converter/ibm_5291/matrix.csv b/keyboards/converter/ibm_5291/matrix.csv new file mode 100644 index 0000000000..40462c2143 --- /dev/null +++ b/keyboards/converter/ibm_5291/matrix.csv @@ -0,0 +1,96 @@ +0,Z +1,S +2,W +3,3 +4,X +5,D +6,E +7,4 +8,C +9,F +10,R +11,5 +12,V +13,G +14,T +15,6 +16,B +17,H +18,Y +19,7 +20,N +21,J +22,U +23,8 +24,PAD_2 +25,PAD_5 +26,PAD_8 +27,NUM_LOCK +28,M +29,K +30,I +31,9 +32,COMMA +33,L +34,O +35,0 +36,PERIOD +37,SEMICOLON +38,P +39,MINUS +40,SLASH +41,QUOTE +42,LEFT_BRACE +43,EQUAL +44,SPACE +45,RSHIFT +46,BACK_QUOTE +47,RIGHT_BRACE +48,CAPS_LOCK +49,PAD_ASTERIX +50,ENTER +51,BACKSPACE +52,PAD_0 +53,PAD_1 +54,PAD_4 +55,PAD_7 +56,PAD_PLUS +57,UNASSIGNED +58,PAD_MINUS +59,SCROLL_LOCK +60,PAD_PERIOD +61,PAD_3 +62,PAD_6 +63,PAD_9 +64,BACKSLASH +65,A +66,Q +67,2 +68,LALT +69,UNASSIGNED +70,UNASSIGNED +71,1 +72,F7 +73,F5 +74,F3 +75,F1 +76,F8 +77,F6 +78,F4 +79,F2 +80,F10 +81,UNASSIGNED +82,UNASSIGNED +83,UNASSIGNED +84,F9 +85,UNASSIGNED +86,UNASSIGNED +87,UNASSIGNED +88,LSHIFT +89,LCTRL +90,TAB +91,ESC +92,UNASSIGNED +93,UNASSIGNED +94,UNASSIGNED +95,UNASSIGNED diff --git a/keyboards/converter/ibm_5291/readme.md b/keyboards/converter/ibm_5291/readme.md new file mode 100644 index 0000000000..06ae2e994e --- /dev/null +++ b/keyboards/converter/ibm_5291/readme.md @@ -0,0 +1,70 @@ +# IBM 5291 keyboard converter + +![5291](https://deskthority.net/wiki/IBM_Model_F#IBM_5291_Keyboard) + +A converter for the eponymous keyboard. + +Keyboard Maintainer: [Listofoptions](https://github.com/listofoptions) +Hardware Supported: IBM 5291, Teensy 2.0 + +Make example for this keyboard (after setting up your build environment): + + make converter/ibm_5291:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + + +the pinout is as follows: + +IBM−5291−Cable to Pinhead−14 + +| pin | description +----|------------------------ +1 | GND +2 | NC +3 | GND +4 | GN) +5 | +5V +6 | D0 +7 | D1 +8 | D2 +9 | D3 +10| D4 +11| D5 +12| D6 +13| Strobe +14| Out + +the pins on this connector are organized ![here](https://geekhack.org/index.php?action=dlattach;topic=48950.0;attach=36759;image) + +IBM−5291−2 Cable with DB15M connector + +| pin | description +----|------------- +|1,2,3 | GND +|4 | +5V +|5 | D0 +|6 | D1 +|7 | D2 +|8 | D3 +|9 | D4 +|10 | D5 +|11 | D6 +|12 | Strobe +|13 | Out +|14 | PE +|15 | NC + +the above connector is actually numbered so it should be easier to determine +where the needed connections are. + +to connect to the teensy, the following are pins are needed (if you should choose not set your own): +* PB0 -> PB6 are connected to D0 -> D6 +* +5V is connected to the corresponding teensy pin +* gnd is as well, only one of the gnd pins needs to be connected though. +* strobe is connected to pin PD1 +* data is connected to PD0 +* PE does not need to be connected to anything, but it could also be connected to gnd + +sources: + http://www.retrocomputing.eu/documents/5291_MaintenanceLibrary.pdf diff --git a/keyboards/converter/ibm_5291/rules.mk b/keyboards/converter/ibm_5291/rules.mk new file mode 100644 index 0000000000..ca0c850c0b --- /dev/null +++ b/keyboards/converter/ibm_5291/rules.mk @@ -0,0 +1,72 @@ +# MCU name +#MCU = at90usb1287 +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 + +# +# 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 = halfkay + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = no # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. +API_SYSEX_ENABLE = no +SPLIT_KEYBOARD = no +WAIT_FOR_USB = yes + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +LAYOUTS_HAS_RGB = NO + +CUSTOM_MATRIX = yes +SRC = matrix.c \ No newline at end of file