~ruther/qmk_firmware

e6f4173aecaedabe3b2550340321520f45227c7f — zvecr 6 years ago eda924d
Refactor cospad to current standards and enable support for backlight keycodes (#5582)

M keyboards/cospad/config.h => keyboards/cospad/config.h +26 -24
@@ 15,8 15,7 @@ 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
#pragma once

#include "config_common.h"



@@ 32,42 31,43 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
#define MATRIX_ROWS 6
#define MATRIX_COLS 4

// ROWS: Top to bottom, COLS: Left to right

/*
 * Keyboard Matrix Assignments
 *
 * Change this to how you wired your keyboard
 * COLS: AVR pins used for columns, left to right
 * ROWS: AVR pins used for rows, top to bottom
 * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
 *                  ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
 *
*/
#define MATRIX_ROW_PINS { D0, D1, D2, D3, D4, D5 }
#define MATRIX_COL_PINS { F0, F1, E6, C7 }
#define UNUSED_PINS

#define BACKLIGHT_PIN F7

/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW

/* define if matrix has ghost */
//#define MATRIX_HAS_GHOST
/* Backlight configuration */
#define BACKLIGHT_PIN F7
#define BACKLIGHT_LEVELS 1

/* Underlight configuration */
#define RGB_DI_PIN F6
#define RGBLED_NUM 4
#define RGBLIGHT_ANIMATIONS

/* Set 0 if debouncing isn't needed */
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCING_DELAY 5

/* define if matrix has ghost (lacks anti-ghosting diodes) */
//#define MATRIX_HAS_GHOST

/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
//#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE

/* Backlight configuration
 */
#define BACKLIGHT_LEVELS 4

/* Underlight configuration
 */

#define RGB_DI_PIN F6
#define RGBLIGHT_ANIMATIONS
#define RGBLED_NUM 4     // Number of LEDs
#define RGBLIGHT_HUE_STEP 10
#define RGBLIGHT_SAT_STEP 17
#define RGBLIGHT_VAL_STEP 17

/*
 * Feature disable options
 *  These options are also useful to firmware size reduction.


@@ 86,4 86,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION

#endif
/* Bootmagic Lite key configuration */
// #define BOOTMAGIC_LITE_ROW 0
// #define BOOTMAGIC_LITE_COLUMN 0

M keyboards/cospad/cospad.c => keyboards/cospad/cospad.c +26 -30
@@ 1,37 1,33 @@
    
/* Copyright 2019
 *
 * 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 "cospad.h"
#include "led.h"

extern inline void cospad_bl_led_on(void);
extern inline void cospad_bl_led_off(void);
extern inline void cospad_bl_led_togg(void);
#ifdef BACKLIGHT_ENABLE

void matrix_init_kb(void) {
	// put your keyboard start-up code here
	// runs once when the firmware starts up
	matrix_init_user();
	led_init_ports();
};

void matrix_scan_kb(void) {
	// put your looping keyboard code here
	// runs every cycle (a lot)
	matrix_scan_user();
};
void backlight_init_ports(void) {
  setPinOutput(F7);
}

void led_init_ports(void) {
    // * Set our LED pins as output
    DDRB |= (1<<2);
    DDRF |= (1<<7);
    // * Setting BL LEDs to init as off
    PORTF |= (1<<7);
void backlight_set(uint8_t level) {
  writePin(F7, !!level);
}

void led_set_kb(uint8_t usb_led) {
    if (usb_led & (1<<USB_LED_NUM_LOCK)) {
        // Turn numlock on
        PORTB &= ~(1<<2);
    } else {
        // Turn numlock off
        PORTB |= (1<<2);
    }    
void backlight_task(void) {
    // do nothing - as default implementation of software PWM does not work
}

#endif //BACKLIGHT_ENABLE

M keyboards/cospad/cospad.h => keyboards/cospad/cospad.h +67 -59
@@ 1,10 1,32 @@
#ifndef COSPAD_H
#define COSPAD_H

/* Copyright 2019
 *
 * 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"
#define ___ KC_NO

// readability
#define XXX KC_NO
/* This a shortcut to help you visually see your layout.
 *
 * The first section contains all of the arguments representing the physical
 * layout of the board and position of the keys.
 *
 * The second converts the arguments into a two-dimensional array which
 * represents the switch matrix.
 */

/* COSPAD ortho matrix layout
   * ,-------------------.


@@ 21,40 43,6 @@
   * | 50 | 51 | 52 | 53 |
   * `-------------------'
 */

/* COSPAD gamepad matrix layout
   * ,-------------------.
   * | 00 | 01 | 02 | 03 |
   * |----|----|----|----|
   * | 10 | 11 | 12 | 13 |
   * |----|----|----|----|
   * | 20 | 21 | 22 |    |
   * |----|----|----| 23 |
   * | 30 | 31 | 32 |    |
   * |----|----|----|----|
   * | 40 | 41 | 42 | 43 |
   * |----|----|----|----|
   * | 50 | 51 | 52 | 53 |
   * `-------------------'
 */

/* COSPAD numpad matrix layout
   * ,-------------------.
   * | 00 | 01 | 02 | 03 |
   * |----|----|----|----|
   * | 10 | 11 | 12 | 13 |
   * |----|----|----|----|
   * | 20 | 21 | 22 |    |
   * |----|----|----| 23 |
   * | 30 | 31 | 32 |    |
   * |----|----|----|----|
   * | 40 | 41 | 42 |    |
   * |----|----|----| 43 |
   * |    50   | 52 |    |
   * `-------------------'
 */
// The first section contains all of the arguments
// The second converts the arguments into a two-dimensional array
#define LAYOUT_ortho_6x4( \
	k00, k01, k02, k03, \
	k10, k11, k12, k13, \


@@ 72,6 60,21 @@
	{k50, k51, k52, k53}  \
}

/* COSPAD gamepad matrix layout
   * ,-------------------.
   * | 00 | 01 | 02 | 03 |
   * |----|----|----|----|
   * | 10 | 11 | 12 | 13 |
   * |----|----|----|----|
   * | 20 | 21 | 22 |    |
   * |----|----|----| 23 |
   * | 30 | 31 | 32 |    |
   * |----|----|----|----|
   * | 40 | 41 | 42 | 43 |
   * |----|----|----|----|
   * | 50 | 51 | 52 | 53 |
   * `-------------------'
 */
#define LAYOUT_gamepad_6x4( \
	k00, k01, k02, k03, \
	k10, k11, k12, k13, \


@@ 84,11 87,26 @@
	{k00, k01, k02, k03},   \
	{k10, k11, k12, k13},   \
	{k20, k21, k22, k23},   \
	{k30, k31, k32, KC_NO}, \
	{k30, k31, k32, ___}, \
	{k40, k41, k42, k43},   \
	{k50, k51, k52, k53}    \
}

/* COSPAD numpad matrix layout
   * ,-------------------.
   * | 00 | 01 | 02 | 03 |
   * |----|----|----|----|
   * | 10 | 11 | 12 | 13 |
   * |----|----|----|----|
   * | 20 | 21 | 22 |    |
   * |----|----|----| 23 |
   * | 30 | 31 | 32 |    |
   * |----|----|----|----|
   * | 40 | 41 | 42 |    |
   * |----|----|----| 43 |
   * |    50   | 52 |    |
   * `-------------------'
 */
#define LAYOUT_numpad_6x4( \
	k00, k01, k02, k03,  \
	k10, k11, k12, k13,  \


@@ 98,25 116,15 @@
	k50,      k52, k43   \
) \
{ \
	{k00, k01,   k02, k03},   \
	{k10, k11,   k12, k13},   \
	{k20, k21,   k22, k23},   \
	{k30, k31,   k32, KC_NO}, \
	{k40, k41,   k42, k43},   \
	{k50, KC_NO, k52, KC_NO}  \
	{k00, k01, k02, k03},   \
	{k10, k11, k12, k13},   \
	{k20, k21, k22, k23},   \
	{k30, k31, k32, ___}, \
	{k40, k41, k42, k43},   \
	{k50, ___, k52, ___}  \
}
void matrix_init_user(void);
void matrix_scan_user(void);

inline void cospad_bl_led_on(void)	{ PORTF &= ~(1<<7); }
inline void cospad_bl_led_off(void)	{ PORTF |= (1<<7); }

inline void cospad_bl_led_togg(void) {
   uint8_t bl_mask = PORTF&(1<<7);
   if (bl_mask) {
      PORTF &= ~(1<<7);
   } else {
      PORTF |= (1<<7);
   }
}
#endif
// Add backwards compatibility for existing keymaps
#define cospad_bl_led_on   backlight_enable
#define cospad_bl_led_off  backlight_disable
#define cospad_bl_led_togg backlight_toggle

M keyboards/cospad/info.json => keyboards/cospad/info.json +52 -24
@@ 7,6 7,7 @@
  "height": 6,
  "layouts": {
    "LAYOUT_numpad_6x4": {
      "key_count": 21,
      "layout": [
        {"label":"Esc", "x":0, "y":0},
        {"label":"Tab", "x":1, "y":0},


@@ 33,35 34,62 @@
    },

    "LAYOUT_gamepad_6x4": {
      "key_count": 23,
      "layout": [
        {"label":"k00", "x":5, "y":0},
        {"label":"k01", "x":5, "y":1},
        {"label":"k02", "x":5, "y":2},
        {"label":"k03", "x":5, "y":3},
        {"label":"k10", "x":4, "y":0},
        {"label":"k11", "x":4, "y":1},
        {"label":"k12", "x":4, "y":2},
        {"label":"k13", "x":4, "y":3},
        {"label":"k20", "x":3, "y":0},
        {"label":"k21", "x":3, "y":1},
        {"label":"k22", "x":3, "y":2},
        {"label":"k30", "x":2, "y":0},
        {"label":"k31", "x":2, "y":1},
        {"label":"k32", "x":2, "y":2},
        {"label":"k23", "x":2, "y":3, "w":2},
        {"label":"k40", "x":1, "y":0},
        {"label":"k41", "x":1, "y":1},
        {"label":"k42", "x":1, "y":2},
        {"label":"k43", "x":1, "y":3},
        {"label":"k50", "x":0, "y":0},
        {"label":"k51", "x":0, "y":1},
        {"label":"k52", "x":0, "y":2},
        {"label":"k53", "x":0, "y":3}
        {"label":"k00", "x":0, "y":0},
        {"label":"k01", "x":1, "y":0},
        {"label":"k02", "x":2, "y":0},
        {"label":"k03", "x":3, "y":0},
        {"label":"k10", "x":0, "y":1},
        {"label":"k11", "x":1, "y":1},
        {"label":"k12", "x":2, "y":1},
        {"label":"k13", "x":3, "y":1},
        {"label":"k20", "x":0, "y":2},
        {"label":"k21", "x":1, "y":2},
        {"label":"k22", "x":2, "y":2},
        {"label":"k30", "x":0, "y":3},
        {"label":"k31", "x":1, "y":3},
        {"label":"k32", "x":2, "y":3},
        {"label":"k23", "x":3, "y":2, "h":2},
        {"label":"k40", "x":0, "y":4},
        {"label":"k41", "x":1, "y":4},
        {"label":"k42", "x":2, "y":4},
        {"label":"k43", "x":3, "y":4},
        {"label":"k50", "x":0, "y":5},
        {"label":"k51", "x":1, "y":5},
        {"label":"k52", "x":2, "y":5},
        {"label":"k53", "x":3, "y":5}
      ]
    },

    "LAYOUT_ortho_6x4": {
      "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"Tab", "x":1, "y":0}, {"label":"Fn", "x":2, "y":0}, {"label":"Back", "x":3, "y":0}, {"label":"Num Lock", "x":0, "y":1}, {"label":"/", "x":1, "y":1}, {"label":"*", "x":2, "y":1}, {"label":"-", "x":3, "y":1}, {"label":"7", "x":0, "y":2}, {"label":"8", "x":1, "y":2}, {"label":"9", "x":2, "y":2}, {"label":"+", "x":3, "y":2}, {"label":"4", "x":0, "y":3}, {"label":"5", "x":1, "y":3}, {"label":"6", "x":2, "y":3}, {"x":3, "y":3}, {"label":"1", "x":0, "y":4}, {"label":"2", "x":1, "y":4}, {"label":"3", "x":2, "y":4}, {"label":"Enter", "x":3, "y":4}, {"label":"0", "x":0, "y":5}, {"x":1, "y":5}, {"label":".", "x":2, "y":5}, {"x":3, "y":5}]
      "key_count": 24,
      "layout": [
        {"label":"k00", "x":0, "y":0},
        {"label":"k01", "x":1, "y":0},
        {"label":"k02", "x":2, "y":0},
        {"label":"k03", "x":3, "y":0},
        {"label":"k10", "x":0, "y":1},
        {"label":"k11", "x":1, "y":1},
        {"label":"k12", "x":2, "y":1},
        {"label":"k13", "x":3, "y":1},
        {"label":"k20", "x":0, "y":2},
        {"label":"k21", "x":1, "y":2},
        {"label":"k22", "x":2, "y":2},
        {"label":"k23", "x":3, "y":2},
        {"label":"k30", "x":0, "y":3},
        {"label":"k31", "x":1, "y":3},
        {"label":"k32", "x":2, "y":3},
        {"label":"k33", "x":3, "y":3},
        {"label":"k40", "x":0, "y":4},
        {"label":"k41", "x":1, "y":4},
        {"label":"k42", "x":2, "y":4},
        {"label":"k43", "x":3, "y":4},
        {"label":"k50", "x":0, "y":5},
        {"label":"k51", "x":1, "y":5},
        {"label":"k52", "x":2, "y":5},
        {"label":"k53", "x":3, "y":5}
      ]
    }
  }
}

M keyboards/cospad/keymaps/default/keymap.c => keyboards/cospad/keymaps/default/keymap.c +50 -70
@@ 1,80 1,60 @@
#include QMK_KEYBOARD_H
#include "led.h"

// Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
// Layer names don't all need to be of the same length, obviously, and you can also skip them
// entirely and just use numbers.
#define _BL 0
#define _FL 1
enum layers {
  _BL = 0,
  _FL
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  /* Keymap _BL: (Base Layer) Default Layer
   * ,-------------------.
   * |Esc |TAB | FN | BS |
   * |----|----|----|----|
   * | NL | /  | *  | -  |
   * |----|----|----|----|
   * | 7  | 8  | 9  |    |
   * |----|----|----| +  |
   * | 4  | 5  | 6  |    |
   * |----|----|----|----|
   * | 1  | 2  | 3  |    |
   * |----|----|----| En |
   * |   0     | .  |    |
   * `-------------------'
   */

[_BL] = LAYOUT_numpad_6x4(
  KC_ESC,   KC_TAB,   MO(_FL),   KC_BSPC, \
  KC_NLCK,  KC_PSLS,  KC_PAST,   KC_PMNS, \
  KC_P7,    KC_P8,    KC_P9,              \
  KC_P4,    KC_P5,    KC_P6,     KC_PPLS, \
  KC_P1,    KC_P2,    KC_P3,              \
  KC_P0,              KC_PDOT,   KC_PENT),
/* Keymap _BL: (Base Layer) Default Layer
 * ,-------------------.
 * |Esc |TAB | FN | BS |
 * |----|----|----|----|
 * | NL | /  | *  | -  |
 * |----|----|----|----|
 * | 7  | 8  | 9  |    |
 * |----|----|----| +  |
 * | 4  | 5  | 6  |    |
 * |----|----|----|----|
 * | 1  | 2  | 3  |    |
 * |----|----|----| En |
 * |   0     | .  |    |
 * `-------------------'
 */
  [_BL] = LAYOUT_numpad_6x4(
    KC_ESC,   KC_TAB,   MO(_FL),   KC_BSPC, \
    KC_NLCK,  KC_PSLS,  KC_PAST,   KC_PMNS, \
    KC_P7,    KC_P8,    KC_P9,              \
    KC_P4,    KC_P5,    KC_P6,     KC_PPLS, \
    KC_P1,    KC_P2,    KC_P3,              \
    KC_P0,              KC_PDOT,   KC_PENT
  ),

  /* Keymap _FL: Function Layer
   * ,-------------------.
   * |RGBT|TAB | FN | BS |
   * |----|----|----|----|
   * |RGBM|RGBP|BTOG| -  |
   * |----|----|----|----|
   * |HUD |HUI |BON |    |
   * |----|----|----| +  |
   * |SAD |SAI |BOFF|    |
   * |----|----|----|----|
   * |VAD |VAS | 3  |    |
   * |----|----|----| En |
   * |   0     |RST |    |
   * `-------------------'
   */
[_FL] = LAYOUT_numpad_6x4(
  RGB_TOG,  KC_TAB,   KC_TRNS,   KC_BSPC, \
  RGB_MOD,  RGB_M_P,  BL_TOGG,   KC_PMNS, \
  RGB_HUD,  RGB_HUI,  BL_ON,              \
  RGB_SAD,  RGB_SAI,  BL_OFF,    KC_PPLS, \
  RGB_VAD,  RGB_VAI,  KC_P3,              \
  KC_P0,              RESET,     KC_PENT),
/* Keymap _FL: Function Layer
 * ,-------------------.
 * |RGBT|    |    |    |
 * |----|----|----|----|
 * |RGBM|RGBP|BTOG|    |
 * |----|----|----|----|
 * |HUD |HUI |BON |    |
 * |----|----|----|    |
 * |SAD |SAI |BOFF|    |
 * |----|----|----|----|
 * |VAD |VAS |BSTP|    |
 * |----|----|----|    |
 * |         |RST |    |
 * `-------------------'
 */
  [_FL] = LAYOUT_numpad_6x4(
    RGB_TOG,  _______,  _______,   _______, \
    RGB_MOD,  RGB_M_P,  BL_TOGG,   _______, \
    RGB_HUD,  RGB_HUI,  BL_ON,              \
    RGB_SAD,  RGB_SAI,  BL_OFF,    _______, \
    RGB_VAD,  RGB_VAI,  BL_STEP,            \
    _______,            RESET,     _______
  ),
};

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
   switch (keycode) {
      case BL_TOGG:
         if (record->event.pressed) {
            cospad_bl_led_togg();
         }
         return false;
      case BL_ON:
         if (record->event.pressed) {
            cospad_bl_led_on();
         }
         return false;
      case BL_OFF:
         if(record->event.pressed) {
            cospad_bl_led_off();
         }
         return false;
      default:
         return true;
   }
}

M keyboards/cospad/rules.mk => keyboards/cospad/rules.mk +29 -14
@@ 1,6 1,5 @@

# MCU name
#MCU = at90usb1287
MCU = atmega32u4

# Processor frequency.


@@ 40,27 39,43 @@ F_USB = $(F_CPU)
OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT


# Bootloader selection
#   Teensy       halfkay
#   Pro Micro    caterina
#   Atmel DFU    atmel-dfu
#   LUFA DFU     lufa-dfu
#   QMK DFU      qmk-dfu
#   atmega32a    bootloadHID
BOOTLOADER = atmel-dfu


# 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
# OPT_DEFS += -DBOOTLOADER_SIZE=4096


# Build Options
#   comment out to disable the options.
#
BOOTMAGIC_ENABLE = no	# Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = no	# 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
NKRO_ENABLE = yes		# USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
RGBLIGHT_ENABLE = yes   # Enable keyboard underlight functionality (+4870)
BACKLIGHT_ENABLE = no  # Enable keyboard backlight functionality (+1150)
MIDI_ENABLE = no 		# MIDI controls
AUDIO_ENABLE = no
UNICODE_ENABLE = no 		# Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
BOOTMAGIC_ENABLE = lite     # Virtual DIP switch configuration(+1000)
MOUSEKEY_ENABLE = no	    # 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
NKRO_ENABLE = yes		    # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE = yes      # Enable keyboard backlight functionality
BACKLIGHT_CUSTOM_DRIVER = yes
RGBLIGHT_ENABLE = yes       # Enable keyboard underlight functionality (+4870)
MIDI_ENABLE = no            # MIDI support (+2400 to 4200, depending on config)
UNICODE_ENABLE = no         # Unicode
BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
AUDIO_ENABLE = no           # Audio output on port C6
FAUXCLICKY_ENABLE = no      # Use buzzer to emulate clicky switches
HD44780_ENABLE = no 		# Enable support for HD44780 based LCDs (+400)


LAYOUTS = numpad_6x4 ortho_6x4