diff options
| author | listofoptions <39714365+listofoptions@users.noreply.github.com> | 2018-09-23 21:46:53 -0400 |
|---|---|---|
| committer | Drashna Jaelre <drashna@live.com> | 2018-09-23 18:46:53 -0700 |
| commit | ce057ea47448d0df2a05efa419f61563649a5821 (patch) | |
| tree | 90b1fbbd6ec069b0a8cf939c1d68b9ba64b70208 | |
| parent | 58b9b22670c2c36e8502826349d8f752d8b3ab37 (diff) | |
| download | qmk_firmware-ce057ea47448d0df2a05efa419f61563649a5821.tar.gz qmk_firmware-ce057ea47448d0df2a05efa419f61563649a5821.zip | |
Keyboard: HP 46010A converter (#3967)
* funged git history, restarting
* tested and working (message typed on this)
* updated documentation to include wiring directions
* formatting
* updated matrix and default layout a bit
* getting ready for merge into main repo
* getting ready for merge into main repo v2
* cleaning
* cleaning repo of extranious files
* updated documentation
| -rw-r--r-- | keyboards/converter/hp_46010a/config.h | 35 | ||||
| -rw-r--r-- | keyboards/converter/hp_46010a/hp_46010a.c | 3 | ||||
| -rw-r--r-- | keyboards/converter/hp_46010a/hp_46010a.h | 62 | ||||
| -rw-r--r-- | keyboards/converter/hp_46010a/info.json | 6 | ||||
| -rw-r--r-- | keyboards/converter/hp_46010a/keymaps/default/keymap.c | 45 | ||||
| -rw-r--r-- | keyboards/converter/hp_46010a/matrix.c | 244 | ||||
| -rw-r--r-- | keyboards/converter/hp_46010a/readme.md | 52 | ||||
| -rw-r--r-- | keyboards/converter/hp_46010a/rules.mk | 72 |
8 files changed, 519 insertions, 0 deletions
diff --git a/keyboards/converter/hp_46010a/config.h b/keyboards/converter/hp_46010a/config.h new file mode 100644 index 000000000..f77ed4115 --- /dev/null +++ b/keyboards/converter/hp_46010a/config.h | |||
| @@ -0,0 +1,35 @@ | |||
| 1 | /* | ||
| 2 | Copyright 2018 listofoptions <listofoptions@gmail.com> | ||
| 3 | |||
| 4 | This program is free software: you can redistribute it and/or modify | ||
| 5 | it under the terms of the GNU General Public License as published by | ||
| 6 | the Free Software Foundation, either version 2 of the License, or | ||
| 7 | (at your option) any later version. | ||
| 8 | |||
| 9 | This program is distributed in the hope that it will be useful, | ||
| 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | GNU General Public License for more details. | ||
| 13 | |||
| 14 | You should have received a copy of the GNU General Public License | ||
| 15 | along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
| 16 | */ | ||
| 17 | |||
| 18 | #pragma once | ||
| 19 | |||
| 20 | #include "config_common.h" | ||
| 21 | |||
| 22 | #define VENDOR_ID 0xFEED | ||
| 23 | #define PRODUCT_ID 0x6060 | ||
| 24 | #define DEVICE_VER 1 | ||
| 25 | #define MANUFACTURER QMK | ||
| 26 | #define PRODUCT 46010A keyboard converter | ||
| 27 | #define DESCRIPTION 46010A keyboard converter | ||
| 28 | |||
| 29 | #define MATRIX_ROWS 14 | ||
| 30 | #define MATRIX_COLS 8 | ||
| 31 | |||
| 32 | /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ | ||
| 33 | #define DEBOUNCING_DELAY 5 | ||
| 34 | |||
| 35 | |||
diff --git a/keyboards/converter/hp_46010a/hp_46010a.c b/keyboards/converter/hp_46010a/hp_46010a.c new file mode 100644 index 000000000..915a220f9 --- /dev/null +++ b/keyboards/converter/hp_46010a/hp_46010a.c | |||
| @@ -0,0 +1,3 @@ | |||
| 1 | #include "hp_46010a.h" | ||
| 2 | #include <avr/io.h> | ||
| 3 | #include "quantum.h" \ No newline at end of file | ||
diff --git a/keyboards/converter/hp_46010a/hp_46010a.h b/keyboards/converter/hp_46010a/hp_46010a.h new file mode 100644 index 000000000..db64ce24a --- /dev/null +++ b/keyboards/converter/hp_46010a/hp_46010a.h | |||
| @@ -0,0 +1,62 @@ | |||
| 1 | /* | ||
| 2 | Copyright 2018 listofoptions <listofoptions@gmail.com> | ||
| 3 | |||
| 4 | This program is free software: you can redistribute it and/or modify | ||
| 5 | it under the terms of the GNU General Public License as published by | ||
| 6 | the Free Software Foundation, either version 2 of the License, or | ||
| 7 | (at your option) any later version. | ||
| 8 | |||
| 9 | This program is distributed in the hope that it will be useful, | ||
| 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | GNU General Public License for more details. | ||
| 13 | |||
| 14 | You should have received a copy of the GNU General Public License | ||
| 15 | along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
| 16 | */ | ||
| 17 | |||
| 18 | #pragma once | ||
| 19 | |||
| 20 | #include "quantum.h" | ||
| 21 | |||
| 22 | /* ,---------. ,---------------------------------------------------------. ,---------. ,-------------------. | ||
| 23 | * | res|stop| | f1| f2| f3| f4|menu|user| f5| f6| f7| f8| |clrl|clrd| | | | | | | ||
| 24 | * `---------' `---------------------------------------------------------' `---------' `-------------------' | ||
| 25 | * ,------------------------------------------------------------------------..---------. ,-------------------. | ||
| 26 | * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| +| back||insl|dell| | *| /| +| -| | ||
| 27 | * |------------------------------------------------------------------------||---------| |-------------------| | ||
| 28 | * | tab| q| w| e| r| t| y| u| i| o| p| [| ]| \||insc|delc| | 7| 8| 9|pade| | ||
| 29 | * |------------------------------------------------------------------------||---------| |-------------------| | ||
| 30 | * |caps|ctrl| a| s| d| f| g| h| j| k| l| ;| '| retr|| cur|prev| | 4| 5| 6| ,| | ||
| 31 | * |------------------------------------------------------------------------------------ |-------------------| | ||
| 32 | * |dele|lshf | z| x| c| v| b| n| m| ,| .| /|rshf |sel | up|next| | 1| 2| 3| tab| | ||
| 33 | * |-------------------------------------------------------------------------|---------| |--------------- | | ||
| 34 | * |prnt| |lalt| space |ralt| |left|down|rght| | 0| .| | | ||
| 35 | * `-----------------------------------------------------------------------------------' `-------------------' | ||
| 36 | */ | ||
| 37 | |||
| 38 | #define LAYOUT_HP_46010A( \ | ||
| 39 | KEY_RES, KEY_STOP, KEY_F1, KEY_F2, KEY_F3, KEY_F4,KEY_MENU,KEY_USER, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_CLRL, KEY_CLRD, KEY_B1, KEY_B2, KEY_B3, KEY_B4, \ | ||
| 40 | KEY_GRAV, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0, KEY_MINU, KEY_PLUS, KEY_BACK, KEY_INSL, KEY_DELL, KEY_MULT, KEY_DIV, KEY_ADD, KEY_SUBT, \ | ||
| 41 | KEY_TAB, KEY_Q,KEY_W, KEY_E, KEY_R, KEY_T, KEY_Y, KEY_U, KEY_I, KEY_O, KEY_P, KEY_LBRA, KEY_RBRA, KEY_PIPE, KEY_INSC, KEY_DELC, KEY_P7, KEY_P8, KEY_P9, KEY_PADE, \ | ||
| 42 | KEY_CAPS, KEY_CTRL, KEY_A, KEY_S, KEY_D, KEY_F, KEY_G, KEY_H, KEY_J, KEY_K, KEY_L, KEY_SEMI, KEY_QUOT, KEY_RETR, KEY_CUR, KEY_PREV, KEY_P4, KEY_P5, KEY_P6, KEY_PCOM, \ | ||
| 43 | KEY_DELE, KEY_LSHF, KEY_Z, KEY_X, KEY_C, KEY_V, KEY_B, KEY_N, KEY_M, KEY_COMA, KEY_DOT, KEY_SLAS,KEY_RSHF, KEY_SEL, KEY_UP, KEY_NEXT, KEY_P1, KEY_P2, KEY_P3, KEY_PTAB, \ | ||
| 44 | KEY_PRNT, KEY_LALT, KEY_SPACE , KEY_RALT, KEY_LEFT, KEY_DOWN, KEY_RGHT, KEY_P0, KEY_PDOT \ | ||
| 45 | ) { \ | ||
| 46 | {KEY_USER, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_CLRL, KEY_CLRD, KEY_MENU }, \ | ||
| 47 | {KEY_9, KEY_0, KEY_MINU, KEY_PLUS, KEY_BACK, KEY_INSL, KEY_DELL, KEY_8 }, \ | ||
| 48 | {KEY_O, KEY_P, KEY_LBRA, KEY_RBRA, KEY_PIPE, KEY_INSC, KEY_DELC, KEY_I }, \ | ||
| 49 | {KEY_K, KEY_L, KEY_SEMI, KEY_QUOT, KEY_RETR, KEY_CUR, KEY_PREV, KEY_J }, \ | ||
| 50 | {KEY_COMA, KEY_DOT, KEY_SLAS, KEY_1, KEY_SEL, KEY_UP, KEY_NEXT, KEY_M }, \ | ||
| 51 | {KEY_SPACE, KEY_LALT, KEY_RALT, KC_NO, KEY_LEFT, KEY_DOWN, KEY_RGHT, KC_NO }, \ | ||
| 52 | {KEY_F3, KEY_F2, KEY_F1, KEY_GRAV, KEY_CTRL, KEY_STOP, KEY_G, KEY_F4 }, \ | ||
| 53 | {KEY_6, KEY_5, KEY_4, KEY_3, KEY_CAPS, KEY_RSHF, KEY_LSHF, KEY_7 }, \ | ||
| 54 | {KEY_Y, KEY_T, KEY_R, KEY_E, KEY_W, KEY_Q, KEY_TAB, KEY_U }, \ | ||
| 55 | {KEY_RES, KEY_F, KEY_D, KEY_S, KEY_A, KC_NO, KEY_2, KEY_H }, \ | ||
| 56 | {KEY_P7, KEY_P4, KEY_P8, KEY_P5, KEY_P9, KEY_P6, KEY_PADE, KEY_PCOM }, \ | ||
| 57 | {KEY_MULT, KEY_P1, KEY_DIV, KEY_P2, KEY_PLUS, KEY_P3, KEY_MINU, KEY_PTAB }, \ | ||
| 58 | {KEY_B1, KEY_P0, KEY_B2, KC_NO, KEY_B3, KEY_PDOT, KEY_B4, KC_NO }, \ | ||
| 59 | {KEY_B, KEY_V, KEY_C, KEY_X, KEY_Z, KEY_PRNT, KEY_DELE, KEY_N }, \ | ||
| 60 | } | ||
| 61 | |||
| 62 | #define LAYOUT LAYOUT_HP_46010A | ||
diff --git a/keyboards/converter/hp_46010a/info.json b/keyboards/converter/hp_46010a/info.json new file mode 100644 index 000000000..de68a1228 --- /dev/null +++ b/keyboards/converter/hp_46010a/info.json | |||
| @@ -0,0 +1,6 @@ | |||
| 1 | { | ||
| 2 | "keyboard_name": "HP_46010A", | ||
| 3 | "keyboard_folder": "converter/HP_46010A", | ||
| 4 | "url": "https://deskthority.net/wiki/HP_46010A", | ||
| 5 | "maintainer": "listofoptions", | ||
| 6 | } | ||
diff --git a/keyboards/converter/hp_46010a/keymaps/default/keymap.c b/keyboards/converter/hp_46010a/keymaps/default/keymap.c new file mode 100644 index 000000000..cb65bd422 --- /dev/null +++ b/keyboards/converter/hp_46010a/keymaps/default/keymap.c | |||
| @@ -0,0 +1,45 @@ | |||
| 1 | /* | ||
| 2 | Copyright 2018 listofoptions <listofoptions@gmail.com> | ||
| 3 | |||
| 4 | This program is free software: you can redistribute it and/or modify | ||
| 5 | it under the terms of the GNU General Public License as published by | ||
| 6 | the Free Software Foundation, either version 2 of the License, or | ||
| 7 | (at your option) any later version. | ||
| 8 | |||
| 9 | This program is distributed in the hope that it will be useful, | ||
| 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | GNU General Public License for more details. | ||
| 13 | |||
| 14 | You should have received a copy of the GNU General Public License | ||
| 15 | along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
| 16 | */ | ||
| 17 | |||
| 18 | #include QMK_KEYBOARD_H | ||
| 19 | |||
| 20 | const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||
| 21 | /* ,---------. ,---------------------------------------------------------. ,---------. ,-------------------. | ||
| 22 | * | esc|xxxx| | f1| f2| f3| f4|xxxx|xxxx| f5| f6| f7| f8| |xxxx|xxxx| | f9| f10| f11| f12| | ||
| 23 | * `---------' `---------------------------------------------------------' `---------' `-------------------' | ||
| 24 | * ,------------------------------------------------------------------------..---------. ,-------------------. | ||
| 25 | * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| back||ins |home| | *| /| +| -| | ||
| 26 | * |------------------------------------------------------------------------||---------| |-------------------| | ||
| 27 | * | tab| q| w| e| r| t| y| u| i| o| p| [| ]| \||del | end| | 7| 8| 9|pade| | ||
| 28 | * |------------------------------------------------------------------------||---------| |-------------------| | ||
| 29 | * |caps|ctrl| a| s| d| f| g| h| j| k| l| ;| '| retr||xxxx|pgup| | 4| 5| 6| ,| | ||
| 30 | * |------------------------------------------------------------------------------------ |-------------------| | ||
| 31 | * |del |lsft | z| x| c| v| b| n| m| ,| .| /|rsft | app| up|pgdn| | 1| 2| 3| tab| | ||
| 32 | * |-------------------------------------------------------------------------|---------| |--------------- | | ||
| 33 | * | gui| |lalt| space |ralt| |left|down|rght| | 0| .| | | ||
| 34 | * `-----------------------------------------------------------------------------------' `-------------------' | ||
| 35 | */ | ||
| 36 | |||
| 37 | [0] = LAYOUT( | ||
| 38 | KC_ESC, KC_NO, KC_F1, KC_F2, KC_F3, KC_F4,KC_NO, KC_NO, KC_F5, KC_F6, KC_F7, KC_F8, KC_NO, KC_NO, KC_F9, KC_F10, KC_F11, KC_F12, \ | ||
| 39 | KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQUAL, KC_BSPC, KC_INS, KC_HOME, KC_PAST, KC_PSLS, KC_PPLS, KC_PMNS, \ | ||
| 40 | 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_BSLS, KC_DEL, KC_END, KC_P7, KC_P8, KC_P9, KC_PENT, \ | ||
| 41 | KC_CAPS, 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_ENT, KC_NO, KC_PGUP, KC_P4, KC_P5, KC_P6, KC_PCMM, \ | ||
| 42 | KC_DEL, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH,KC_RSFT, KC_APP, KC_UP, KC_PGDN, KC_P1, KC_P2, KC_P3, KC_TAB, \ | ||
| 43 | KC_LGUI, KC_LALT, KC_SPACE , KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT \ | ||
| 44 | ) | ||
| 45 | } ; \ No newline at end of file | ||
diff --git a/keyboards/converter/hp_46010a/matrix.c b/keyboards/converter/hp_46010a/matrix.c new file mode 100644 index 000000000..2ca7d0357 --- /dev/null +++ b/keyboards/converter/hp_46010a/matrix.c | |||
| @@ -0,0 +1,244 @@ | |||
| 1 | /* | ||
| 2 | Copyright 2018 listofoptions <listofoptions@gmail.com> | ||
| 3 | |||
| 4 | This program is free software: you can redistribute it and/or modify | ||
| 5 | it under the terms of the GNU General Public License as published by | ||
| 6 | the Free Software Foundation, either version 2 of the License, or | ||
| 7 | (at your option) any later version. | ||
| 8 | |||
| 9 | This program is distributed in the hope that it will be useful, | ||
| 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | GNU General Public License for more details. | ||
| 13 | |||
| 14 | You should have received a copy of the GNU General Public License | ||
| 15 | along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
| 16 | */ | ||
| 17 | |||
| 18 | #include <stdint.h> | ||
| 19 | #include <stdbool.h> | ||
| 20 | #include <string.h> | ||
| 21 | #if defined(__AVR__) | ||
| 22 | #include <avr/io.h> | ||
| 23 | #endif | ||
| 24 | #include <util/delay.h> | ||
| 25 | |||
| 26 | #include "wait.h" | ||
| 27 | #include "print.h" | ||
| 28 | #include "debug.h" | ||
| 29 | #include "util.h" | ||
| 30 | #include "matrix.h" | ||
| 31 | #include "timer.h" | ||
| 32 | #include "LUFA/Drivers/Peripheral/SPI.h" | ||
| 33 | |||
| 34 | #include "config.h" | ||
| 35 | |||
| 36 | |||
| 37 | #ifndef DEBOUNCING_DELAY | ||
| 38 | # define DEBOUNCING_DELAY 5 | ||
| 39 | #endif | ||
| 40 | |||
| 41 | #if ( DEBOUNCING_DELAY > 0 ) | ||
| 42 | static uint16_t debouncing_time ; | ||
| 43 | static bool debouncing = false ; | ||
| 44 | #endif | ||
| 45 | |||
| 46 | static uint8_t matrix [MATRIX_ROWS] = {0}; | ||
| 47 | |||
| 48 | #if ( DEBOUNCING_DELAY > 0 ) | ||
| 49 | static uint8_t matrix_debounce_old [MATRIX_ROWS] = {0}; | ||
| 50 | static uint8_t matrix_debounce_new [MATRIX_ROWS] = {0}; | ||
| 51 | #endif | ||
| 52 | |||
| 53 | __attribute__ ((weak)) | ||
| 54 | void matrix_init_quantum(void) { | ||
| 55 | matrix_init_kb(); | ||
| 56 | } | ||
| 57 | |||
| 58 | __attribute__ ((weak)) | ||
| 59 | void matrix_scan_quantum(void) { | ||
| 60 | matrix_scan_kb(); | ||
| 61 | } | ||
| 62 | |||
| 63 | __attribute__ ((weak)) | ||
| 64 | void matrix_init_kb(void) { | ||
| 65 | matrix_init_user(); | ||
| 66 | } | ||
| 67 | |||
| 68 | __attribute__ ((weak)) | ||
| 69 | void matrix_scan_kb(void) { | ||
| 70 | matrix_scan_user(); | ||
| 71 | } | ||
| 72 | |||
| 73 | __attribute__ ((weak)) | ||
| 74 | void matrix_init_user(void) { | ||
| 75 | } | ||
| 76 | |||
| 77 | __attribute__ ((weak)) | ||
| 78 | void matrix_scan_user(void) { | ||
| 79 | } | ||
| 80 | |||
| 81 | // the keyboard's internal wiring is such that the inputs to the logic are | ||
| 82 | // a clock signal, and a reset line. | ||
| 83 | // the output is a single output pin. im bitbanging here, but the SPI controller | ||
| 84 | // would work normally | ||
| 85 | // | ||
| 86 | // the device functions, by using the clock signal to count 128 bits, the lower | ||
| 87 | // 3 bits of this 7 bit counter are tied to a 1-of-8 multiplexer, this forms | ||
| 88 | // the columns. | ||
| 89 | // the upper 4 bits form the rows, and are decoded using bcd to decimal | ||
| 90 | // decoders, so that 14 out of 16 of the outputs are wired to the rows of the | ||
| 91 | // matrix. each switch has a diode, such that the row signal feeds into the | ||
| 92 | // switch, and then into the diode, then into one of the columns into the | ||
| 93 | // matrix. the reset pin can be used to reset the entire counter. | ||
| 94 | |||
| 95 | #define RESET _BV(PB0) | ||
| 96 | #define SCLK _BV(PB1) | ||
| 97 | #define SDATA _BV(PB3) | ||
| 98 | #define LED _BV(PD6) | ||
| 99 | |||
| 100 | inline | ||
| 101 | static | ||
| 102 | void SCLK_increment(void) { | ||
| 103 | PORTB &= ~SCLK ; | ||
| 104 | _delay_us( 4 ) ; // make sure the line is stable | ||
| 105 | PORTB |= SCLK ; | ||
| 106 | _delay_us( 4 ) ; | ||
| 107 | |||
| 108 | return ; | ||
| 109 | } | ||
| 110 | |||
| 111 | inline | ||
| 112 | static | ||
| 113 | void Matrix_Reset(void) { | ||
| 114 | PORTB |= RESET ; | ||
| 115 | _delay_us( 4 ) ; // make sure the line is stable | ||
| 116 | PORTB &= ~RESET ; | ||
| 117 | |||
| 118 | return ; | ||
| 119 | } | ||
| 120 | |||
| 121 | inline | ||
| 122 | static | ||
| 123 | uint8_t Matrix_ReceiveByte (void) { | ||
| 124 | uint8_t received = 0 ; | ||
| 125 | uint8_t temp = 0 ; | ||
| 126 | for ( uint8_t bit = 0; bit < MATRIX_COLS; ++bit ) { | ||
| 127 | // toggle the clock | ||
| 128 | SCLK_increment(); | ||
| 129 | temp = (PINB & SDATA) << 4 ; | ||
| 130 | received |= temp >> bit ; | ||
| 131 | } | ||
| 132 | |||
| 133 | return received ; | ||
| 134 | } | ||
| 135 | |||
| 136 | inline | ||
| 137 | static | ||
| 138 | void Matrix_ThrowByte(void) { | ||
| 139 | // we use MATRIX_COLS - 1 here because that would put us at 7 clocks | ||
| 140 | for ( uint8_t bit = 0; bit < MATRIX_COLS - 1; ++bit ) { | ||
| 141 | // toggle the clock | ||
| 142 | SCLK_increment(); | ||
| 143 | } | ||
| 144 | |||
| 145 | return ; | ||
| 146 | } | ||
| 147 | |||
| 148 | void matrix_init () { | ||
| 149 | // debug_matrix = 1; | ||
| 150 | // PB0 (SS) and PB1 (SCLK) set to outputs | ||
| 151 | DDRB |= RESET | SCLK ; | ||
| 152 | // PB2, is unused, and PB3 is our serial input | ||
| 153 | DDRB &= ~SDATA ; | ||
| 154 | |||
| 155 | // SS is reset for this board, and is active High | ||
| 156 | // SCLK is the serial clock and is active High | ||
| 157 | PORTB &= ~RESET ; | ||
| 158 | PORTB |= SCLK ; | ||
| 159 | |||
| 160 | // led pin | ||
| 161 | DDRD |= LED ; | ||
| 162 | PORTD &= ~LED ; | ||
| 163 | |||
| 164 | matrix_init_quantum(); | ||
| 165 | |||
| 166 | //toggle reset, to put the keyboard logic into a known state | ||
| 167 | Matrix_Reset() ; | ||
| 168 | } | ||
| 169 | |||
| 170 | uint8_t matrix_scan(void) { | ||
| 171 | |||
| 172 | // the first byte of the keyboard's output data can be ignored | ||
| 173 | Matrix_ThrowByte(); | ||
| 174 | |||
| 175 | #if ( DEBOUNCING_DELAY > 0 ) | ||
| 176 | |||
| 177 | for ( uint8_t row = 0 ; row < MATRIX_ROWS ; ++row ) { | ||
| 178 | //transfer old debouncing values | ||
| 179 | matrix_debounce_old[row] = matrix_debounce_new[row] ; | ||
| 180 | // read new key-states in | ||
| 181 | matrix_debounce_new[row] = Matrix_ReceiveByte() ; | ||
| 182 | |||
| 183 | if ( matrix_debounce_new[row] != matrix_debounce_old[row] ) { | ||
| 184 | debouncing = true ; | ||
| 185 | debouncing_time = timer_read() ; | ||
| 186 | } | ||
| 187 | } | ||
| 188 | |||
| 189 | #else | ||
| 190 | // without debouncing we simply just read in the raw matrix | ||
| 191 | for ( uint8_t row = 0 ; row < MATRIX_ROWS ; ++row ) { | ||
| 192 | matrix[row] = Matrix_ReceiveByte ; | ||
| 193 | } | ||
| 194 | #endif | ||
| 195 | |||
| 196 | |||
| 197 | #if ( DEBOUNCING_DELAY > 0 ) | ||
| 198 | if ( debouncing && ( timer_elapsed( debouncing_time ) > DEBOUNCING_DELAY ) ) { | ||
| 199 | |||
| 200 | for ( uint8_t row = 0 ; row < MATRIX_ROWS ; ++row ) { | ||
| 201 | matrix[row] = matrix_debounce_new[row] ; | ||
| 202 | } | ||
| 203 | |||
| 204 | debouncing = false ; | ||
| 205 | } | ||
| 206 | #endif | ||
| 207 | Matrix_Reset() ; | ||
| 208 | |||
| 209 | matrix_scan_quantum() ; | ||
| 210 | return 1; | ||
| 211 | } | ||
| 212 | |||
| 213 | inline | ||
| 214 | uint8_t matrix_get_row( uint8_t row ) { | ||
| 215 | return matrix[row]; | ||
| 216 | } | ||
| 217 | |||
| 218 | void matrix_print(void) | ||
| 219 | { | ||
| 220 | print("\nr/c 01234567\n"); | ||
| 221 | |||
| 222 | for (uint8_t row = 0; row < MATRIX_ROWS; row++) { | ||
| 223 | phex(row); print(": "); | ||
| 224 | print_bin_reverse8(matrix_get_row(row)); | ||
| 225 | print("\n"); | ||
| 226 | } | ||
| 227 | } | ||
| 228 | |||
| 229 | inline | ||
| 230 | uint8_t matrix_rows(void) { | ||
| 231 | return MATRIX_ROWS; | ||
| 232 | } | ||
| 233 | |||
| 234 | inline | ||
| 235 | uint8_t matrix_cols(void) { | ||
| 236 | return MATRIX_COLS; | ||
| 237 | } | ||
| 238 | |||
| 239 | // as an aside, I used the M0110 converter: | ||
| 240 | // tmk_core/common/keyboard.c, quantum/matrix.c, and the project layout of the planck | ||
| 241 | // the online ducmentation starting from : | ||
| 242 | // https://docs.qmk.fm/#/config_options | ||
| 243 | // https://docs.qmk.fm/#/understanding_qmk | ||
| 244 | // and probably a few i forgot.... \ No newline at end of file | ||
diff --git a/keyboards/converter/hp_46010a/readme.md b/keyboards/converter/hp_46010a/readme.md new file mode 100644 index 000000000..2321faa6e --- /dev/null +++ b/keyboards/converter/hp_46010a/readme.md | |||
| @@ -0,0 +1,52 @@ | |||
| 1 | # HP 46010A | ||
| 2 | |||
| 3 |  | ||
| 4 | |||
| 5 | A converter for the eponymous keyboard. | ||
| 6 | |||
| 7 | Keyboard Maintainer: [Listofoptions](https://github.com/listofoptions) | ||
| 8 | Hardware Supported: HP 46010A, Teensy 2.0 | ||
| 9 | |||
| 10 | Make example for this keyboard (after setting up your build environment): | ||
| 11 | |||
| 12 | make converter/HP_46010A:default | ||
| 13 | |||
| 14 | 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). | ||
| 15 | |||
| 16 | to get a matrix created if your board uses a different one (i used the US layout) please see the following gists: | ||
| 17 | for the matrix itself: https://gist.github.com/listofoptions/cdf70d94767e9c6c027741850a24c568 | ||
| 18 | for the program to generate the matrix: https://gist.github.com/listofoptions/d245e370678024edbe5bed8c8ab17999 | ||
| 19 | |||
| 20 | to build the actual converter, you are going to need to either splice into the a connector or, use a multi-meter to buzz/ohm out which wires go where. | ||
| 21 | from the bottom of the pcb the pins are arraged as follows: | ||
| 22 | |||
| 23 | |||
| 24 | 4 5 6 | ||
| 25 | 3 2 1 | ||
| 26 | |||
| 27 | |||
| 28 | connect a six pin modular connector of the 6p6c variaty. | ||
| 29 | then lop off the other end of the cable, striping the wires inside. | ||
| 30 | use the ohm-meter to find the corresponding wire for each pin on the bottom of the pcb | ||
| 31 | |||
| 32 | the pin meanings are as follows: | ||
| 33 | 1 reset | ||
| 34 | 2 no connection | ||
| 35 | 3 vcc | ||
| 36 | 4 data out | ||
| 37 | 5 clock | ||
| 38 | 6 ground | ||
| 39 | |||
| 40 | wire the ground and power pins to ground and 5v power on the teensy (or other avr device of your choice) | ||
| 41 | connect | ||
| 42 | on the teensy the connection is as follows | ||
| 43 | |||
| 44 | |||
| 45 | teensy | HP 46010A | ||
| 46 | ----|----- | ||
| 47 | gnd | gnd (6) | ||
| 48 | vcc | vcc (3) | ||
| 49 | PB0 | reset (1) | ||
| 50 | PB1 | clock (5) | ||
| 51 | PB3 | data out (4) | ||
| 52 | gnd | no connection (2) -- optional | ||
diff --git a/keyboards/converter/hp_46010a/rules.mk b/keyboards/converter/hp_46010a/rules.mk new file mode 100644 index 000000000..ddd2d593b --- /dev/null +++ b/keyboards/converter/hp_46010a/rules.mk | |||
| @@ -0,0 +1,72 @@ | |||
| 1 | # MCU name | ||
| 2 | #MCU = at90usb1287 | ||
| 3 | MCU = atmega32u4 | ||
| 4 | |||
| 5 | # Processor frequency. | ||
| 6 | # This will define a symbol, F_CPU, in all source code files equal to the | ||
| 7 | # processor frequency in Hz. You can then use this symbol in your source code to | ||
| 8 | # calculate timings. Do NOT tack on a 'UL' at the end, this will be done | ||
| 9 | # automatically to create a 32-bit value in your source code. | ||
| 10 | # | ||
| 11 | # This will be an integer division of F_USB below, as it is sourced by | ||
| 12 | # F_USB after it has run through any CPU prescalers. Note that this value | ||
| 13 | # does not *change* the processor frequency - it should merely be updated to | ||
| 14 | # reflect the processor speed set externally so that the code can use accurate | ||
| 15 | # software delays. | ||
| 16 | F_CPU = 16000000 | ||
| 17 | |||
| 18 | # | ||
| 19 | # LUFA specific | ||
| 20 | # | ||
| 21 | # Target architecture (see library "Board Types" documentation). | ||
| 22 | ARCH = AVR8 | ||
| 23 | |||
| 24 | # Input clock frequency. | ||
| 25 | # This will define a symbol, F_USB, in all source code files equal to the | ||
| 26 | # input clock frequency (before any prescaling is performed) in Hz. This value may | ||
| 27 | # differ from F_CPU if prescaling is used on the latter, and is required as the | ||
| 28 | # raw input clock is fed directly to the PLL sections of the AVR for high speed | ||
| 29 | # clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' | ||
| 30 | # at the end, this will be done automatically to create a 32-bit value in your | ||
| 31 | # source code. | ||
| 32 | # | ||
| 33 | # If no clock division is performed on the input clock inside the AVR (via the | ||
| 34 | # CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. | ||
| 35 | F_USB = $(F_CPU) | ||
| 36 | |||
| 37 | # Interrupt driven control endpoint task(+60) | ||
| 38 | OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT | ||
| 39 | |||
| 40 | # Bootloader | ||
| 41 | # This definition is optional, and if your keyboard supports multiple bootloaders of | ||
| 42 | # different sizes, comment this out, and the correct address will be loaded | ||
| 43 | # automatically (+60). See bootloader.mk for all options. | ||
| 44 | BOOTLOADER = halfkay | ||
| 45 | |||
| 46 | # Build Options | ||
| 47 | # change to "no" to disable the options, or define them in the Makefile in | ||
| 48 | # the appropriate keymap folder that will get included automatically | ||
| 49 | # | ||
| 50 | BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) | ||
| 51 | MOUSEKEY_ENABLE = yes # Mouse keys(+4700) | ||
| 52 | EXTRAKEY_ENABLE = yes # Audio control and System control(+450) | ||
| 53 | CONSOLE_ENABLE = yes # Console for debug(+400) | ||
| 54 | COMMAND_ENABLE = no # Commands for debug and configuration | ||
| 55 | NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work | ||
| 56 | BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality | ||
| 57 | MIDI_ENABLE = no # MIDI controls | ||
| 58 | AUDIO_ENABLE = no # Audio output on port C6 | ||
| 59 | UNICODE_ENABLE = no # Unicode | ||
| 60 | BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID | ||
| 61 | RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. | ||
| 62 | API_SYSEX_ENABLE = no | ||
| 63 | SPLIT_KEYBOARD = no | ||
| 64 | WAIT_FOR_USB = yes | ||
| 65 | |||
| 66 | # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE | ||
| 67 | SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend | ||
| 68 | |||
| 69 | LAYOUTS_HAS_RGB = NO | ||
| 70 | |||
| 71 | CUSTOM_MATRIX = yes | ||
| 72 | SRC = matrix.c \ No newline at end of file | ||
