diff options
40 files changed, 1164 insertions, 134 deletions
diff --git a/keyboards/jc65/jc65.c b/keyboards/jc65/jc65.c index 6f51c0d6e6..a4bd868747 100644 --- a/keyboards/jc65/jc65.c +++ b/keyboards/jc65/jc65.c @@ -1,36 +1 @@ #include "jc65.h" - -void matrix_init_kb(void) { - // put your keyboard start-up code here - // runs once when the firmware starts up - - matrix_init_user(); -} - -void matrix_scan_kb(void) { - // put your looping keyboard code here - // runs every cycle (a lot) - - matrix_scan_user(); -} - -bool process_record_kb(uint16_t keycode, keyrecord_t *record) { - // put your per-action keyboard code here - // runs for every action, just before processing by the firmware - - return process_record_user(keycode, record); -} - -void led_set_kb(uint8_t usb_led) { - // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here - if (usb_led & (1<<USB_LED_CAPS_LOCK)) { - // output low - DDRB |= (1<<2); - PORTB &= ~(1<<2); - } else { - // Hi-Z - DDRB &= ~(1<<2); - PORTB &= ~(1<<2); - } - led_set_user(usb_led); -} diff --git a/keyboards/jc65/jc65.h b/keyboards/jc65/jc65.h index 41ec3cf64e..0c047c90ec 100644 --- a/keyboards/jc65/jc65.h +++ b/keyboards/jc65/jc65.h @@ -3,19 +3,12 @@ #include "quantum.h" -#define KEYMAP( \ - K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, \ - K10, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F, \ - K20, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2F, \ - K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K3E, K3F, \ - K40, K41, K43, K44, K46, K48, K4A, K4B, K4C, K4D, K4E, K4F \ -)\ -{\ - {K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F}, \ - {K10, KC_NO, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F}, \ - {K20, KC_NO, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, KC_NO, K2F}, \ - {K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, KC_NO, K3D, K3E, K3F}, \ - {K40, K41, KC_NO, K43, K44, KC_NO, K46, KC_NO, K48, KC_NO, K4A, K4B, K4C, K4D, K4E, K4F}, \ -} +#ifdef KEYBOARD_jc65_v32u4 + #include "v32u4.h" +#endif + +#ifdef KEYBOARD_jc65_v32a + #include "v32a.h" +#endif #endif diff --git a/keyboards/jc65/readme.md b/keyboards/jc65/readme.md index e8955ec53d..c58f68dc09 100644 --- a/keyboards/jc65/readme.md +++ b/keyboards/jc65/readme.md @@ -3,20 +3,12 @@ JC65 ![JC65](https://imgur.com/a/C2oa5) -The JC65 PCB actually has two revisions: A QMK native version, and a PS2AVRGB version. Jchan offered both PCBs as options during the M65-A Round 1 group buy, and were also available choices for the 65% acrylic case group buy. In the near future both PCB versions should be available from keyclack.com when the storefront part opens. +The JC65 PCB actually has two revisions: A QMK native version, and a PS2AVRGB version. Jchan offered both PCBs as options during the M65-A Round 1 group buy and are now currently available on [keyclack.com](https://keyclack.com/) -These docs are for the QMK version of the PCB. [More info on qmk.fm](http://qmk.fm/planck/) +Make example native QMK version (after setting up your build environment): -Keyboard Maintainer: [Ethan Madden](https://github.com/jetpacktuxedo) -Hardware Supported: JC65 rev.qmk -Hardware Availability: [keyclack.com](https://keyclack.com/) + make jc65/v32u4:default -Make example for this keyboard (after setting up your build environment): +Make example ps2avrGB version (after setting up your build environment): - make jc65:default - -Or to make and flash: - - make jc65:default:dfu - -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. + make jc65/v32a:default
\ No newline at end of file diff --git a/keyboards/jc65/rules.mk b/keyboards/jc65/rules.mk index c2c02b6147..050e22e3ca 100644 --- a/keyboards/jc65/rules.mk +++ b/keyboards/jc65/rules.mk @@ -1,68 +1 @@ -# 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 - - -# Boot Section Size in *bytes* -# Teensy halfKay 512 -# Teensy++ halfKay 1024 -# Atmel DFU loader 4096 -# LUFA bootloader 4096 -# USBaspLoader 2048 -OPT_DEFS += -DBOOTLOADER_SIZE=4096 - - -# Build Options -# change yes to no to disable -# -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = no # 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 = yes # Enable keyboard backlight functionality on B7 by default -RGBLIGHT_ENABLE = yes -MIDI_ENABLE = no # MIDI controls -UNICODE_ENABLE = no # Unicode -BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -AUDIO_ENABLE = no # Audio output on port C6 +DEFAULT_FOLDER = jc65/v32u4
\ No newline at end of file diff --git a/keyboards/jc65/v32a/config.h b/keyboards/jc65/v32a/config.h new file mode 100644 index 0000000000..dc6d280f52 --- /dev/null +++ b/keyboards/jc65/v32a/config.h @@ -0,0 +1,46 @@ +/* +Copyright 2017 Luiz Ribeiro <luizribeiro@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/>. +*/ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +#define VENDOR_ID 0x1234 +#define PRODUCT_ID 0x5679 +#define MANUFACTURER winkeyless.kr +#define PRODUCT JC65 PS2AVRGB + +/* matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 16 + +#define NO_BACKLIGHT_CLOCK +#define BACKLIGHT_LEVELS 1 +#define RGBLED_NUM 16 +#define RGBLIGHT_ANIMATIONS +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 +#define RGBLIGHT_EFFECT_KNIGHT_LED_NUM 8 + +#define NO_UART 1 + +/* key combination for command */ +#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) + +#endif diff --git a/keyboards/jc65/v32a/i2c.c b/keyboards/jc65/v32a/i2c.c new file mode 100644 index 0000000000..a4f9521352 --- /dev/null +++ b/keyboards/jc65/v32a/i2c.c @@ -0,0 +1,106 @@ +/* +Copyright 2016 Luiz Ribeiro <luizribeiro@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/>. +*/ + +// Please do not modify this file + +#include <avr/io.h> +#include <util/twi.h> + +#include "i2c.h" + +void i2c_set_bitrate(uint16_t bitrate_khz) { + uint8_t bitrate_div = ((F_CPU / 1000l) / bitrate_khz); + if (bitrate_div >= 16) { + bitrate_div = (bitrate_div - 16) / 2; + } + TWBR = bitrate_div; +} + +void i2c_init(void) { + // set pull-up resistors on I2C bus pins + PORTC |= 0b11; + + i2c_set_bitrate(400); + + // enable TWI (two-wire interface) + TWCR |= (1 << TWEN); + + // enable TWI interrupt and slave address ACK + TWCR |= (1 << TWIE); + TWCR |= (1 << TWEA); +} + +uint8_t i2c_start(uint8_t address) { + // reset TWI control register + TWCR = 0; + + // begin transmission and wait for it to end + TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); + while (!(TWCR & (1<<TWINT))); + + // check if the start condition was successfully transmitted + if ((TWSR & 0xF8) != TW_START) { + return 1; + } + + // transmit address and wait + TWDR = address; + TWCR = (1<<TWINT) | (1<<TWEN); + while (!(TWCR & (1<<TWINT))); + + // check if the device has acknowledged the READ / WRITE mode + uint8_t twst = TW_STATUS & 0xF8; + if ((twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK)) { + return 1; + } + + return 0; +} + +void i2c_stop(void) { + TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); +} + +uint8_t i2c_write(uint8_t data) { + TWDR = data; + + // transmit data and wait + TWCR = (1<<TWINT) | (1<<TWEN); + while (!(TWCR & (1<<TWINT))); + + if ((TWSR & 0xF8) != TW_MT_DATA_ACK) { + return 1; + } + + return 0; +} + +uint8_t i2c_send(uint8_t address, uint8_t *data, uint16_t length) { + if (i2c_start(address)) { + return 1; + } + + for (uint16_t i = 0; i < length; i++) { + if (i2c_write(data[i])) { + return 1; + } + } + + i2c_stop(); + + return 0; +} diff --git a/keyboards/jc65/v32a/i2c.h b/keyboards/jc65/v32a/i2c.h new file mode 100644 index 0000000000..93a69c94da --- /dev/null +++ b/keyboards/jc65/v32a/i2c.h @@ -0,0 +1,27 @@ +/* +Copyright 2016 Luiz Ribeiro <luizribeiro@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/>. +*/ + +// Please do not modify this file + +#ifndef __I2C_H__ +#define __I2C_H__ + +void i2c_init(void); +void i2c_set_bitrate(uint16_t bitrate_khz); +uint8_t i2c_send(uint8_t address, uint8_t *data, uint16_t length); + +#endif diff --git a/keyboards/jc65/v32a/keymaps/default/keymap.c b/keyboards/jc65/v32a/keymaps/default/keymap.c new file mode 100644 index 0000000000..de7a7135af --- /dev/null +++ b/keyboards/jc65/v32a/keymaps/default/keymap.c @@ -0,0 +1,11 @@ +#include "v32a.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = KEYMAP( + KC_GESC, 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_BSLS,KC_BSPC, KC_INS, + 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_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L,KC_SCLN,KC_QUOT,KC_NUHS, KC_ENT,KC_PGUP, + KC_LSFT,KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M,KC_COMM, KC_DOT,KC_SLSH, KC_RSFT, KC_UP,KC_PGDN, + KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT,KC_RGUI,KC_RCTL,KC_LEFT,KC_DOWN,KC_RGHT + ), +}; diff --git a/keyboards/jc65/v32a/keymaps/default/readme.md b/keyboards/jc65/v32a/keymaps/default/readme.md new file mode 100644 index 0000000000..61e55f3ce8 --- /dev/null +++ b/keyboards/jc65/v32a/keymaps/default/readme.md @@ -0,0 +1,10 @@ +Default Keymap +======= + +Default plain keymap with only a base layer. + +Keymap Maintainer: [Jason Barnachea](https://github.com/nautxx) + +Difference from base layout: None. + +Intended usage: Reference layout. diff --git a/keyboards/jc65/v32a/keymaps/default/rules.mk b/keyboards/jc65/v32a/keymaps/default/rules.mk new file mode 100644 index 0000000000..d7463419b4 --- /dev/null +++ b/keyboards/jc65/v32a/keymaps/default/rules.mk @@ -0,0 +1,2 @@ +RGBLIGHT_ENABLE = yes +BACKLIGHT_ENABLE = yes diff --git a/keyboards/jc65/v32a/keymaps/naut/keymap.c b/keyboards/jc65/v32a/keymaps/naut/keymap.c new file mode 100644 index 0000000000..90c5a221be --- /dev/null +++ b/keyboards/jc65/v32a/keymaps/naut/keymap.c @@ -0,0 +1,81 @@ +#include "v32a.h" + +// Define Layers +#define _BASE 0 +#define _FNX 1 +#define _MAC 2 +#define _RGB 3 + +// Define Macros +#define M_PRTS M(0) +#define M_PRTA M(1) +#define M_MSSN M(2) +#define M_APPS M(3) +#define M_SPOT M(4) +#define M_LEFT M(5) +#define M_RGHT M(6) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // Base Layer + [_BASE] = KEYMAP( + 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_BSLS, KC_GRV, KC_INS, + 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_BSPC, KC_DEL, + 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_NO, KC_ENT,KC_PGUP, + KC_LSFT, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M,KC_COMM, KC_DOT,KC_SLSH, KC_RSFT, KC_UP,KC_PGDN, + MO(1),KC_LALT,KC_LGUI, KC_SPC, KC_SPC, KC_SPC, KC_RGUI, KC_NO,KC_RALT,KC_LEFT,KC_DOWN,KC_RGHT + ), + // Fn Layer + [_FNX] = KEYMAP( + KC_TRNS, 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_TRNS,KC_TRNS, TG(3), + KC_CAPS,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, TG(2),KC_VOLU,KC_MPLY, + KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_MRWD,KC_VOLD,KC_MFFD + ), + // Mac Layer + [_MAC] = KEYMAP( + TO(0), KC_F14, KC_F15, M_APPS, M_MSSN, KC_F11, KC_F12,KC_MRWD,KC_MPLY,KC_MFFD,KC_MUTE,KC_VOLD,KC_VOLU,KC_EJCT, KC_NO, KC_NO, + KC_TRNS, M_PRTS, M_PRTA,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, TO(0), M_MSSN,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS, M_SPOT, M_SPOT, M_SPOT, KC_TRNS,KC_TRNS,KC_TRNS, M_LEFT, M_APPS, M_RGHT + ), + // RGB and BL Layer + [_RGB] = KEYMAP( + TO(0), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, TO(0), + KC_NO,RGB_HUD,RGB_HUI, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,BL_TOGG, + KC_NO,RGB_SAD,RGB_SAI, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,RGB_TOG, + KC_NO, KC_NO,RGB_VAD,RGB_VAI, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,RGB_MOD,RGB_RMOD, KC_NO,RGB_M_P,RGB_M_R, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,RGB_M_G,RGB_M_SW + ), +}; + +// The Macros +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { + if (record->event.pressed) { + switch(id) { + case 0: + return MACRO(D(LGUI), D(LSFT), T(3), U(LSFT), U(LGUI), END); //Mac print screen + break; + case 1: + return MACRO(D(LGUI), D(LSFT), T(4), U(LSFT), U(LGUI), END); //Mac print area + break; + case 2: + return MACRO(D(LCTL), T(UP), U(LCTL), END); //Mac mission control + break; + case 3: + return MACRO(D(LCTL), T(DOWN), U(LCTL), END); //Mac applications + break; + case 4: + return MACRO(D(LGUI), T(SPC), U(LGUI), END); //Mac spotlight search + break; + case 5: + return MACRO(D(LCTL), T(LEFT), U(LCTL), END); //Mac mission left + break; + case 6: + return MACRO(D(LGUI), T(RGHT), U(LGUI), END); //Mac mission right + break; + } + } + return MACRO_NONE; +};
\ No newline at end of file diff --git a/keyboards/jc65/v32a/keymaps/naut/readme.md b/keyboards/jc65/v32a/keymaps/naut/readme.md new file mode 100644 index 0000000000..e7d1096666 --- /dev/null +++ b/keyboards/jc65/v32a/keymaps/naut/readme.md @@ -0,0 +1,16 @@ +Naut's Keymap +======= + +Layer 1: HHKB Split backspace, 6.25u space, control on caps, Fn on L-Ctl. + +Layer 2: F Row on numrow, caps on tab, media shortcuts on arrows + +Layer 3: Mac Media buttons on numrow + +Layer 4: RGB control + +Keymap Maintainer: [Jason Barnachea](https://github.com/nautxx) + +Difference from base layout: HHKBish layout. HHKB Fn layer. Mac media layer. RGB control layer. + +Intended usage: Daily driver for keyboard peacocking. diff --git a/keyboards/jc65/v32a/keymaps/naut/rules.mk b/keyboards/jc65/v32a/keymaps/naut/rules.mk new file mode 100644 index 0000000000..d7463419b4 --- /dev/null +++ b/keyboards/jc65/v32a/keymaps/naut/rules.mk @@ -0,0 +1,2 @@ +RGBLIGHT_ENABLE = yes +BACKLIGHT_ENABLE = yes diff --git a/keyboards/jc65/v32a/matrix.c b/keyboards/jc65/v32a/matrix.c new file mode 100644 index 0000000000..57aa36b5ff --- /dev/null +++ b/keyboards/jc65/v32a/matrix.c @@ -0,0 +1,106 @@ +/* +Copyright 2017 Luiz Ribeiro <luizribeiro@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 <avr/io.h> +#include <util/delay.h> + +#include "matrix.h" + +#ifndef DEBOUNCE +#define DEBOUNCE 5 +#endif + +static uint8_t debouncing = DEBOUNCE; + +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +void matrix_init(void) { + // all outputs for rows high + DDRB = 0xFF; + PORTB = 0xFF; + // all inputs for columns + DDRA = 0x00; + DDRC &= ~(0x111111<<2); + DDRD &= ~(1<<PIND7); + // all columns are pulled-up + PORTA = 0xFF; + PORTC |= (0b111111<<2); + PORTD |= (1<<PIND7); + + // initialize matrix state: all keys off + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + matrix[row] = 0x00; + matrix_debouncing[row] = 0x00; + } +} + +void matrix_set_row_status(uint8_t row) { + DDRB = (1 << row); + PORTB = ~(1 << row); +} + +uint8_t bit_reverse(uint8_t x) { + x = ((x >> 1) & 0x55) | ((x << 1) & 0xaa); + x = ((x >> 2) & 0x33) | ((x << 2) & 0xcc); + x = ((x >> 4) & 0x0f) | ((x << 4) & 0xf0); + return x; +} + +uint8_t matrix_scan(void) { + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + matrix_set_row_status(row); + _delay_us(5); + + matrix_row_t cols = ( + // cols 0..7, PORTA 0 -> 7 + (~PINA) & 0xFF + ) | ( + // cols 8..13, PORTC 7 -> 0 + bit_reverse((~PINC) & 0xFF) << 8 + ) | ( + // col 14, PORTD 7 + ((~PIND) & (1 << PIND7)) << 7 + ); + + if (matrix_debouncing[row] != cols) { + matrix_debouncing[row] = cols; + debouncing = DEBOUNCE; + } + } + + if (debouncing) { + if (--debouncing) { + _delay_ms(1); + } else { + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + matrix[i] = matrix_debouncing[i]; + } + } + } + + matrix_scan_user(); + + return 1; +} + +inline matrix_row_t matrix_get_row(uint8_t row) { + return matrix[row]; +} + +void matrix_print(void) { +} diff --git a/keyboards/jc65/v32a/readme.md b/keyboards/jc65/v32a/readme.md new file mode 100644 index 0000000000..976217f108 --- /dev/null +++ b/keyboards/jc65/v32a/readme.md @@ -0,0 +1,24 @@ +JC65 ps2avrGB +======= + +A 65% keyboard with RGB + +Keyboard Maintainer: [Jason Barnachea](https://github.com/nautxx) + +Hardware Supported: JC65 rev.ps2avrgb + +Hardware Availability: [keyclack.com](https://keyclack.com/) + +The JC65 PCB actually has two revisions: A QMK native version, and a PS2AVRGB version. Jchan offered both PCBs as options during the M65-A Round 1 group buy, and were also available choices for the 65% acrylic case group buy. In the near future both PCB versions should be available from keyclack.com when the storefront part opens. + +These docs are for the PS2AVRGB version of the PCB. More info on qmk.fm + +Make example for this keyboard (after setting up your build environment): + + make jc65/v32a:default + +Flash example for this keyboard: + + bootloadHID -r jc65_v32a_default.hex + +See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information.
\ No newline at end of file |