~ruther/qmk_firmware

b90ee43f57ac6ecf862f6a25cbce5ececc7a868e — Jack Humbert 10 years ago 0e189b6
files
A keyboard/planck/__avr_gdbinit => keyboard/planck/__avr_gdbinit +6 -0
@@ 0,0 1,6 @@
define reset
SIGNAL SIGHUP
end
file planck_lufa.elf
target remote localhost:4242
break main

A keyboard/planck/extended_keymaps/extended_keymap_charlie.c => keyboard/planck/extended_keymaps/extended_keymap_charlie.c +54 -0
@@ 0,0 1,54 @@
#include "extended_keymap_common.h"

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    [0] = { /* Native */
      {KC_ESC,     KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    FUNC(2)}, 
      {KC_BSPC,    KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT},
     {KC_TAB,     KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT},
      {KC_DEL,     KC_LCTL, KC_NO,   KC_LSFT, KC_LALT, KC_SPC,        KC_NO,   KC_LEFT, KC_DOWN, KC_UP,  KC_RGHT}
},	  
    [1] = { /* QWERTY->PHOTOSHOP */
      {KC_DELETE,  KC_0,    KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    FUNC(1)},
      {KC_O,       KC_G,    KC_S,    KC_U,    KC_T,    FUNC(27),  KC_F21,  KC_F10,  KC_F11,  KC_F7,   KC_F8,   KC_F9},
      {KC_TAB,     FUNC(4), FUNC(5),  FUNC(6),  KC_F1,   FUNC(7),  KC_F18,  KC_F19,  KC_F23,  KC_F20,  KC_F22,  FUNC(9)},
      {KC_COMM,    KC_DOT,  KC_R, FUNC(11), FUNC(3),  KC_SPC,        FUNC(12), KC_F2,   FUNC(8),  KC_F3,   KC_F14}
	  },
    [2] = { /* 2: FUNC(3 PHOTOSHOP */
      {KC_ESC,    FUNC(25), FUNC(26),   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,   KC_NO,   KC_NO,   KC_NO,   KC_NO,   FUNC(19), FUNC(20), FUNC(21)}, 
      {KC_C,       KC_NO,  FUNC(22),  FUNC(5),   KC_NO,   FUNC(23), KC_NO,   KC_NO,   KC_NO,   KC_NO,   FUNC(13), KC_NO},
      {FUNC(14),    FUNC(15), FUNC(16), FUNC(17), FUNC(3),   KC_SPC,        FUNC(18), KC_NO,   KC_NO,   KC_F24,  KC_NO}
	  }
};

const uint16_t PROGMEM fn_actions[] = {
    [1] = ACTION_DEFAULT_LAYER_SET(0),                             // set Qwerty layout
    [2] = ACTION_DEFAULT_LAYER_SET(1),                             // set Photoshop presets
    [3] = ACTION_LAYER_MOMENTARY(2),                                  // Photoshop function layer
 
    [4] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_F9),   // photo folder AHK
    [5] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_I),              // select inverse
    [6] = ACTION_MODS_KEY(MOD_LSFT, KC_M),                         // marquee select
    [7] = ACTION_MODS_KEY(MOD_LALT, KC_BSPC),                      // fill 
    [8] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_X),    // warp
    [9] = ACTION_MODS_KEY(MOD_LCTL | MOD_LALT | MOD_LSFT, KC_F12),  // merge all new layer
    [10] = ACTION_MODS_KEY(MOD_LCTL, KC_MINS),                     // zoom out
    [11] = ACTION_MODS_KEY(MOD_LCTL, KC_H),                        // RBG sliders
    [12] = ACTION_MODS_KEY(MOD_LCTL, KC_S),                        // save
    [13] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_F5),           // layer mask from transparancy 
    [14] = ACTION_MODS_KEY(MOD_LCTL, KC_F2),                     // stroke
    [15] = ACTION_MODS_KEY(MOD_LCTL | MOD_LSFT, KC_F2),                     // stroke layer
    [16] = ACTION_MODS_KEY(MOD_LCTL, KC_0),                      // zoom 0
    [17] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_H),             // HSV sliders
    [18] = ACTION_MODS_KEY(MOD_LCTL | MOD_LSFT, KC_S),         // save as 
    [19] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_F7),  // gaussian blur
    [20] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_F8),  // motion blur
    [21] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_X),            // liquify filter
    [22] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS),                     // prev layer blending
    [23] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_BSPC),             // KC_NOrmal layer blending
    [24] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL),                      // next layer blending
    [25] = ACTION_MODS_KEY(MOD_LCTL, KC_Z),                        // step back
    [26] = ACTION_MODS_KEY(MOD_LCTL, KC_Y),                        // step forward
    [27] = ACTION_MODS_KEY(MOD_LCTL, KC_R),                        // rasterize
     
};

A keyboard/planck/matrix_pcb.c => keyboard/planck/matrix_pcb.c +222 -0
@@ 0,0 1,222 @@
/*
Copyright 2012 Jun Wako 
Generated by planckkeyboard.com (2014 Jack Humbert)

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/>.
*/

/*
 * scan matrix
 */
#include <stdint.h>
#include <stdbool.h>
#include <avr/io.h>
#include <util/delay.h>
#include "print.h"
#include "debug.h"
#include "util.h"
#include "matrix.h"
#include "backlight.h" // TODO fix this dependency 


#ifndef DEBOUNCE
#   define DEBOUNCE 10
#endif
static uint8_t debouncing = DEBOUNCE;

/* matrix state(1:on, 0:off) */
static matrix_row_t matrix[MATRIX_ROWS];
static matrix_row_t matrix_debouncing[MATRIX_ROWS];

static matrix_row_t read_cols(void);
static void init_cols(void);
static void unselect_rows(void);
static void select_row(uint8_t row);

inline
uint8_t matrix_rows(void)
{
    return MATRIX_ROWS;
}

inline
uint8_t matrix_cols(void)
{
    return MATRIX_COLS;
}

void matrix_init(void)
{
    // To use PORTF disable JTAG with writing JTD bit twice within four cycles.
    MCUCR |= (1<<JTD);
    MCUCR |= (1<<JTD);

    backlight_init_ports();

    // Turn status LED on
    DDRE |= (1<<6);
    PORTE |= (1<<6);
    
    // initialize row and col
    unselect_rows();
    init_cols();

    // initialize matrix state: all keys off
    for (uint8_t i=0; i < MATRIX_ROWS; i++) {
        matrix[i] = 0;
        matrix_debouncing[i] = 0;
    }
}

uint8_t matrix_scan(void)
{
    for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
        select_row(i);
        _delay_us(30);  // without this wait read unstable value.
        matrix_row_t cols = read_cols();
        if (matrix_debouncing[i] != cols) {
            matrix_debouncing[i] = cols;
            if (debouncing) {
                debug("bounce!: "); debug_hex(debouncing); debug("\n");
            }
            debouncing = DEBOUNCE;
        }
        unselect_rows();
    }

    if (debouncing) {
        if (--debouncing) {
            _delay_ms(1);
        } else {
            for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
                matrix[i] = matrix_debouncing[i];
            }
        }
    }

    return 1;
}

bool matrix_is_modified(void)
{
    if (debouncing) return false;
    return true;
}

inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
    return (matrix[row] & ((matrix_row_t)1<col));
}

inline
matrix_row_t matrix_get_row(uint8_t row)
{
    return matrix[row];
}

void matrix_print(void)
{
    print("\nr/c 0123456789ABCDEF\n");
    for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
        phex(row); print(": ");
        pbin_reverse16(matrix_get_row(row));
        print("\n");
    }
}

uint8_t matrix_key_count(void)
{
    uint8_t count = 0;
    for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
        count += bitpop16(matrix[i]);
    }
    return count;
}

//
// Planck PCB Rev 1 Pin Assignments
//
// Column: 0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11
// Pin:    F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7
//

static void init_cols(void)
{
    DDRB &= ~(1<<4 | 1<<0);
    PORTB |= (1<<4 | 1<<0);
    DDRC &= ~(1<<7);
    PORTC |= (1<<7);
    DDRD &= ~(1<<7 | 1<<6 | 1<<4);
    PORTD |= (1<<7 | 1<<6 | 1<<4);
    DDRF &= ~(1<<0 | 1<<1 | 1<<4 | 1<<5 | 1<<6 | 1<<7);
    PORTF |= (1<<0 | 1<<1 | 1<<4 | 1<<5 | 1<<6 | 1<<7);
    
}

static matrix_row_t read_cols(void)
{
  return (PINF&(1<<1) ? 0 : (1<<0)) |
         (PINF&(1<<0) ? 0 : (1<<1)) |
         (PINB&(1<<0) ? 0 : (1<<2)) |
         (PINC&(1<<7) ? 0 : (1<<3)) |
         (PINF&(1<<4) ? 0 : (1<<4)) |
         (PINF&(1<<5) ? 0 : (1<<5)) |
         (PINF&(1<<6) ? 0 : (1<<6)) |
         (PINF&(1<<7) ? 0 : (1<<7)) |
         (PIND&(1<<4) ? 0 : (1<<8)) |
         (PIND&(1<<6) ? 0 : (1<<9)) |
         (PINB&(1<<4) ? 0 : (1<<10)) |
         (PIND&(1<<7) ? 0 : (1<<11));
         
}

static void unselect_rows(void)
{
    DDRB &= ~(1<<5 | 1<<6);
    PORTB |= (1<<5 | 1<<6);
    DDRD &= ~(1<<0 | 1<<5);
    PORTD |= (1<<0 | 1<<5);
    
}

//
// Planck PCB Rev 1 Pin Assignments
//
// Row: 0,  1,  2,  3
// Pin: D0, D5, B5, B6
//

static void select_row(uint8_t row)
{
    switch (row) {
        case 0:
            DDRD  |= (1<<0);
            PORTD &= ~(1<<0);
            break;
        case 1:
            DDRD  |= (1<<5);
            PORTD &= ~(1<<5);
            break;
        case 2:
            DDRB  |= (1<<5);
            PORTB &= ~(1<<5);
            break;
        case 3:
            DDRB  |= (1<<6);
            PORTB &= ~(1<<6);
            break;
        
    }
}
\ No newline at end of file