~ruther/qmk_firmware

2d15961855460ee098d6890a2b7fa336e25ed522 — joelproko 6 years ago d5f0327
[Keyboard] added custom keyboard (#6141)

* added keyboard_layout_jopr

* making it compile

* #pragma once instead of #ifndef and #define

* renamed and added keymap

renamed old "default" to "modded_white", added new "default" that resembles an ISO 105-key layout

* reordered keyboards/jopr/info.json to match order o layout array

* implemented most suggestions

* fixed missing ;

* fixed bootloader setting for rules.mk

* adopted standard layout matrix naming convention

* "fixed" commented-out code in keymaps

* changes to keymap layers and LEDs

Turns out adding a layer for ROYA-modified keycodes is more trouble than it's worth and works better by just defining a ROYA key.
Also, LEDs were set up incorrectly.
Lastly, implemented SysReq-Warning LED.

* moved forced NumLock code

just in case either it or the CapsLock & ScrlLock update code wouldn't both work otherwise

* rearranged media keycodes

* replaced Shifted keycodes with basic ones

* Apply suggestions from code review

Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>

* implemented suggestions by noroadsleft

* Apply suggestions from code review

Make ISO-Enter QMK Configurator-friendly

Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>

* Update readme.md

* Update keyboards/jopr/info.json

Co-Authored-By: noroadsleft <18669334+noroadsleft@users.noreply.github.com>

* moved keyboard to handwired folder

It was said that personal passion projects belong in there, even if they're not actually handwired

* Update readme.md
A keyboards/handwired/jopr/config.h => keyboards/handwired/jopr/config.h +49 -0
@@ 0,0 1,49 @@
#pragma once

#include "config_common.h"

/* USB Device descriptor parameter */
#define VENDOR_ID       0x4DAE
#define PRODUCT_ID      0x1000
#define DEVICE_VER      0x0001
#define MANUFACTURER    joelproko
#define PRODUCT         jopr-106-Nl2SR-Cl2nL
#define DESCRIPTION     jopr-106 Mechanical Keyboard

/* key matrix size */
#define MATRIX_ROWS 10
#define MATRIX_COLS 11

/* key matrix pins */
#define MATRIX_ROW_PINS { D0, D6, D2, D4, D3, D5, D7, C6, B6, F5 }
#define MATRIX_COL_PINS { B3, B2, B1, B0, F7, E6, F6, B5, C7, B4, D1 }
#define UNUSED_PINS { B7 }

/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW

/* number of backlight levels */
#ifdef BACKLIGHT_PIN
#define BACKLIGHT_LEVELS 0
#endif

/* Set 0 if debouncing isn't needed */
#define DEBOUNCE 5

/* 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
/* #define IS_COMMAND() (get_mods() == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) */
#define NO_ACTION_ONESHOT
#define TAPPING_TOGGLE 3

/*#define RGB_DI_PIN F4*/
#ifdef RGB_DI_PIN
/*#define RGBLIGHT_ANIMATIONS*/
#define RGBLED_NUM 1
#define RGBLIGHT_HUE_STEP 1
#define RGBLIGHT_SAT_STEP 1
#define RGBLIGHT_VAL_STEP 1
#endif

A keyboards/handwired/jopr/info.json => keyboards/handwired/jopr/info.json +562 -0
@@ 0,0 1,562 @@
{
  "keyboard_name": "jopr-106",
  "url": "https://github.com/joelproko/keyboard_layout_jopr",
  "maintainer": "joelproko",
  "width": 22.5,
  "height": 6.25,
  "layouts": {
    "LAYOUT": {
      "key_count": 106,
      "layout": [
        {
          "label": "MX_A0",
          "x": 0,
          "y": 0
        },
        {
          "label": "MX_B0",
          "x": 1.25,
          "y": 0
        },
        {
          "label": "MX_C0",
          "x": 2.25,
          "y": 0
        },
        {
          "label": "MX_D0",
          "x": 3.25,
          "y": 0
        },
        {
          "label": "MX_E0",
          "x": 4.25,
          "y": 0
        },
        {
          "label": "MX_F0",
          "x": 5.5,
          "y": 0
        },
        {
          "label": "MX_G0",
          "x": 6.5,
          "y": 0
        },
        {
          "label": "MX_H0",
          "x": 7.5,
          "y": 0
        },
        {
          "label": "MX_I0",
          "x": 8.5,
          "y": 0
        },
        {
          "label": "MX_J0",
          "x": 9.75,
          "y": 0
        },
        {
          "label": "MX_A6",
          "x": 10.75,
          "y": 0
        },
        {
          "label": "MX_B6",
          "x": 11.75,
          "y": 0
        },
        {
          "label": "MX_C6",
          "x": 12.75,
          "y": 0
        },
        {
          "label": "MX_D6",
          "x": 14,
          "y": 0
        },
        {
          "label": "MX_E6",
          "x": 15.25,
          "y": 0
        },
        {
          "label": "MX_F6",
          "x": 16.25,
          "y": 0
        },
        {
          "label": "MX_G6",
          "x": 17.25,
          "y": 0
        },
        {
          "label": "MX_H6",
          "x": 18.25,
          "y": 0
        },
        {
          "label": "MX_A1",
          "x": 0,
          "y": 1.25
        },
        {
          "label": "MX_B1",
          "x": 1,
          "y": 1.25
        },
        {
          "label": "MX_C1",
          "x": 2,
          "y": 1.25
        },
        {
          "label": "MX_D1",
          "x": 3,
          "y": 1.25
        },
        {
          "label": "MX_E1",
          "x": 4,
          "y": 1.25
        },
        {
          "label": "MX_F1",
          "x": 5,
          "y": 1.25
        },
        {
          "label": "MX_G1",
          "x": 6,
          "y": 1.25
        },
        {
          "label": "MX_H1",
          "x": 7,
          "y": 1.25
        },
        {
          "label": "MX_I1",
          "x": 8,
          "y": 1.25
        },
        {
          "label": "MX_J1",
          "x": 9,
          "y": 1.25
        },
        {
          "label": "MX_A7",
          "x": 10,
          "y": 1.25
        },
        {
          "label": "MX_B7",
          "x": 11,
          "y": 1.25
        },
        {
          "label": "MX_C7",
          "x": 12,
          "y": 1.25
        },
        {
          "label": "MX_D7",
          "x": 13,
          "y": 1.25,
          "w": 2
        },
        {
          "label": "MX_E7",
          "x": 15.25,
          "y": 1.25
        },
        {
          "label": "MX_F7",
          "x": 16.25,
          "y": 1.25
        },
        {
          "label": "MX_G7",
          "x": 17.25,
          "y": 1.25
        },
        {
          "label": "MX_H7",
          "x": 18.25,
          "y": 1.25
        },
        {
          "label": "MX_A2",
          "x": 0,
          "y": 2.25,
          "w": 1.5
        },
        {
          "label": "MX_B2",
          "x": 1.5,
          "y": 2.25
        },
        {
          "label": "MX_C2",
          "x": 2.5,
          "y": 2.25
        },
        {
          "label": "MX_D2",
          "x": 3.5,
          "y": 2.25
        },
        {
          "label": "MX_E2",
          "x": 4.5,
          "y": 2.25
        },
        {
          "label": "MX_F2",
          "x": 5.5,
          "y": 2.25
        },
        {
          "label": "MX_G2",
          "x": 6.5,
          "y": 2.25
        },
        {
          "label": "MX_H2",
          "x": 7.5,
          "y": 2.25
        },
        {
          "label": "MX_I2",
          "x": 8.5,
          "y": 2.25
        },
        {
          "label": "MX_J2",
          "x": 9.5,
          "y": 2.25
        },
        {
          "label": "MX_A8",
          "x": 10.5,
          "y": 2.25
        },
        {
          "label": "MX_B8",
          "x": 11.5,
          "y": 2.25
        },
        {
          "label": "MX_C8",
          "x": 12.5,
          "y": 2.25
        },
        {
          "label": "MX_D8",
          "x": 13.75,
          "y": 2.25,
          "w": 1.25,
          "h": 2
        },
        {
          "label": "MX_E8",
          "x": 15.25,
          "y": 2.25
        },
        {
          "label": "MX_F8",
          "x": 16.25,
          "y": 2.25
        },
        {
          "label": "MX_G8",
          "x": 17.25,
          "y": 2.25
        },
        {
          "label": "MX_H8",
          "x": 18.25,
          "y": 2.25,
          "h": 2
        },
        {
          "label": "MX_A3",
          "x": 0,
          "y": 3.25,
          "w": 1.75
        },
        {
          "label": "MX_B3",
          "x": 1.75,
          "y": 3.25
        },
        {
          "label": "MX_C3",
          "x": 2.75,
          "y": 3.25
        },
        {
          "label": "MX_D3",
          "x": 3.75,
          "y": 3.25
        },
        {
          "label": "MX_E3",
          "x": 4.75,
          "y": 3.25
        },
        {
          "label": "MX_F3",
          "x": 5.75,
          "y": 3.25
        },
        {
          "label": "MX_G3",
          "x": 6.75,
          "y": 3.25
        },
        {
          "label": "MX_H3",
          "x": 7.75,
          "y": 3.25
        },
        {
          "label": "MX_I3",
          "x": 8.75,
          "y": 3.25
        },
        {
          "label": "MX_J3",
          "x": 9.75,
          "y": 3.25
        },
        {
          "label": "MX_A9",
          "x": 10.75,
          "y": 3.25
        },
        {
          "label": "MX_B9",
          "x": 11.75,
          "y": 3.25
        },
        {
          "label": "MX_C9",
          "x": 12.75,
          "y": 3.25
        },
        {
          "label": "MX_E9",
          "x": 15.25,
          "y": 3.25
        },
        {
          "label": "MX_F9",
          "x": 16.25,
          "y": 3.25
        },
        {
          "label": "MX_G9",
          "x": 17.25,
          "y": 3.25
        },
        {
          "label": "MX_H9",
          "x": 19.5,
          "y": 3.25
        },
        {
          "label": "MX_K1",
          "x": 20.5,
          "y": 3.25
        },
        {
          "label": "MX_K0",
          "x": 21.5,
          "y": 3.25
        },
        {
          "label": "MX_A4",
          "x": 0,
          "y": 4.25,
          "w": 1.25
        },
        {
          "label": "MX_B4",
          "x": 1.25,
          "y": 4.25
        },
        {
          "label": "MX_C4",
          "x": 2.25,
          "y": 4.25
        },
        {
          "label": "MX_D4",
          "x": 3.25,
          "y": 4.25
        },
        {
          "label": "MX_E4",
          "x": 4.25,
          "y": 4.25
        },
        {
          "label": "MX_F4",
          "x": 5.25,
          "y": 4.25
        },
        {
          "label": "MX_G4",
          "x": 6.25,
          "y": 4.25
        },
        {
          "label": "MX_H4",
          "x": 7.25,
          "y": 4.25
        },
        {
          "label": "MX_I4",
          "x": 8.25,
          "y": 4.25
        },
        {
          "label": "MX_J4",
          "x": 9.25,
          "y": 4.25
        },
        {
          "label": "MX_I9",
          "x": 10.25,
          "y": 4.25
        },
        {
          "label": "MX_I8",
          "x": 11.25,
          "y": 4.25
        },
        {
          "label": "MX_I7",
          "x": 12.25,
          "y": 4.25,
          "w": 2.75
        },
        {
          "label": "MX_I6",
          "x": 15.25,
          "y": 4.25
        },
        {
          "label": "MX_J9",
          "x": 16.25,
          "y": 4.25
        },
        {
          "label": "MX_J8",
          "x": 17.25,
          "y": 4.25
        },
        {
          "label": "MX_J7",
          "x": 18.25,
          "y": 4.25,
          "h": 2
        },
        {
          "label": "MX_J6",
          "x": 19.5,
          "y": 4.25
        },
        {
          "label": "MX_K3",
          "x": 20.5,
          "y": 4.25
        },
        {
          "label": "MX_K2",
          "x": 21.5,
          "y": 4.25
        },
        {
          "label": "MX_A5",
          "x": 0,
          "y": 5.25,
          "w": 1.25
        },
        {
          "label": "MX_B5",
          "x": 1.25,
          "y": 5.25,
          "w": 1.25
        },
        {
          "label": "MX_C5",
          "x": 2.5,
          "y": 5.25,
          "w": 1.25
        },
        {
          "label": "MX_D5",
          "x": 3.75,
          "y": 5.25,
          "w": 6.25
        },
        {
          "label": "MX_J5",
          "x": 10,
          "y": 5.25,
          "w": 1.25
        },
        {
          "label": "MX_I5",
          "x": 11.25,
          "y": 5.25,
          "w": 1.25
        },
        {
          "label": "MX_K9",
          "x": 12.5,
          "y": 5.25,
          "w": 1.25
        },
        {
          "label": "MX_E5",
          "x": 13.75,
          "y": 5.25,
          "w": 1.25
        },
        {
          "label": "MX_K8",
          "x": 15.25,
          "y": 5.25,
          "w": 2
        },
        {
          "label": "MX_K7",
          "x": 17.25,
          "y": 5.25
        },
        {
          "label": "MX_K6",
          "x": 19.5,
          "y": 5.25
        },
        {
          "label": "MX_K5",
          "x": 20.5,
          "y": 5.25
        },
        {
          "label": "MX_K4",
          "x": 21.5,
          "y": 5.25
        }
      ]
    }
  }
}

A keyboards/handwired/jopr/jopr.c => keyboards/handwired/jopr/jopr.c +11 -0
@@ 0,0 1,11 @@
#include "jopr.h"
void matrix_init_kb(void) {
    matrix_init_user();
    led_init_ports();
};

void led_init_ports(void) {
    setPinOutput(F0);
    setPinOutput(F1);
    setPinOutput(F4);
}
\ No newline at end of file

A keyboards/handwired/jopr/jopr.h => keyboards/handwired/jopr/jopr.h +24 -0
@@ 0,0 1,24 @@
#pragma once

#include "quantum.h"

#define LAYOUT( \
    K000,  K001, K002, K003, K004,  K005, K006, K007, K008,  K009, K600, K601, K602,  K603,  K604, K605, K606, K607, \
    K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K700, K701, K702, K703,      K704, K705, K706, K707, \
    K200,   K201, K202, K203, K204, K205, K206, K207, K208, K209, K800, K801, K802, K803,    K804, K805, K806, K807, \
    K300,    K301, K302, K303, K304, K305, K306, K307, K308, K309, K900, K901, K902,         K904, K905, K906,        K907, K110, K010, \
    K400,  K401, K402, K403, K404, K405, K406, K407, K408, K409, K908, K808, K708,           K608, K909, K809, K709,  K609, K310, K210, \
    K500,  K501,  K502,  K503,                            K509,  K508,  K910,  K504,         K810,       K710,        K610, K510, K410 \
) \
{ \
    { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010 }, \
    { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110 }, \
    { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210 }, \
    { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310 }, \
    { K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410 }, \
    { K500, K501, K502, K503, K504, KC_NO, KC_NO, KC_NO, K508, K509, K510 }, \
    { K600, K601, K602, K603, K604, K605, K606, K607, K608, K609, K610 }, \
    { K700, K701, K702, K703, K704, K705, K706, K707, K708, K709, K710 }, \
    { K800, K801, K802, K803, K804, K805, K806, K807, K808, K809, K810 }, \
    { K900, K901, K902, KC_NO, K904, K905, K906, K907, K908, K909, K910 } \
}

A keyboards/handwired/jopr/keymaps/default/keymap.c => keyboards/handwired/jopr/keymaps/default/keymap.c +59 -0
@@ 0,0 1,59 @@
#include QMK_KEYBOARD_H

#define _BL 0
#define _FN 1
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

    [_BL] = LAYOUT(
        KC_ESC,    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_DEL,    KC_NO,   KC_CAPS, KC_SLCK, KC_PAUS,
        KC_GRV,  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_PSCR, KC_PSLS, KC_PAST, KC_PMNS,
        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_ENT,        KC_P7,   KC_P8,   KC_P9,   KC_PPLS,
        KC_MHEN,       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_P4,   KC_P5,   KC_P6,              KC_PGUP, KC_INS,  KC_PGDN,
        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_P1,   KC_P2,   KC_P3,   KC_PENT,   KC_HOME, KC_UP,   KC_END,
        KC_LCTL,   KC_LWIN,   KC_LALT,   KC_SPC,                                                KC_RALT, KC_RWIN, LT(_FN,KC_APP),  KC_RCTL,     KC_P0,            KC_PDOT,            KC_LEFT, KC_DOWN, KC_RGHT
    ),
    [_FN] = LAYOUT(
		_______,   _______, _______, _______, _______,   _______, _______, _______, _______,   _______, _______, _______, _______,   _______,   KC_SYSREQ, _______, _______, _______,
		_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,           _______, _______, _______, _______,
		_______,     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,       KC_MSTP, KC_VOLU, _______, _______,
		_______,       _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,              KC_MPRV, KC_MPLY, KC_MNXT,            _______, KC_MUTE, _______,
		_______,   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,                  KC_MUTE, KC_VOLD, _______, _______,   KC_VOLD, KC_MSTP, KC_VOLU,
		_______,   _______,   _______,   _______,                                                 _______,   _______,   _______,   _______,     _______,          _______,            KC_MPRV, KC_MPLY, KC_MNXT
    )
};

void led_set_user(uint8_t usb_led) {

    if (IS_LED_ON(usb_led, USB_LED_CAPS_LOCK)) {
        writePinHigh(F1);
	} else {
        writePinLow(F1);
    }

    if (IS_LED_ON(usb_led, USB_LED_SCROLL_LOCK)) {
        writePinHigh(F0);
	} else {
        writePinLow(F0);
    }
    
    if (!(IS_LED_ON(usb_led, USB_LED_NUM_LOCK))) {
        tap_code(KC_NUMLOCK);
    }
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    static bool sysreq_led = false;
    if (record->event.pressed) {
        if (sysreq_led) {
            sysreq_led = false;
            writePinLow(F4);
        }
        else {
            switch(keycode) {
                case KC_SYSREQ:
                    sysreq_led = true;
                    writePinHigh(F4);
            }
        }
    }
    return true;
}

A keyboards/handwired/jopr/keymaps/modded_white/keymap.c => keyboards/handwired/jopr/keymaps/modded_white/keymap.c +59 -0
@@ 0,0 1,59 @@
#include QMK_KEYBOARD_H

#define _BL 0
#define _FN 1
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

    [_BL] = LAYOUT(
        KC_ESC,    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_DEL,    KC_NO,   KC_CAPS, KC_SLCK, KC_PAUS,
        KC_NUHS, KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_NUBS, KC_SLSH, KC_BSPC,           KC_PSCR, KC_PSLS, KC_PAST, KC_PMNS,
        KC_TAB,      KC_V,    KC_Y,    KC_D,    KC_COMM, KC_QUOT, KC_INT1, KC_J,    KC_M,    KC_L,    KC_U,    KC_LBRC, KC_RBRC, KC_ENT,        KC_P7,   KC_P8,   KC_P9,   KC_PPLS,
        KC_MHEN,       KC_A,    KC_T,    KC_H,    KC_E,    KC_B,    KC_MINS, KC_C,    KC_S,    KC_N,    KC_O,    KC_I,    KC_EQL,               KC_P4,   KC_P5,   KC_P6,              KC_PGUP, KC_INS,  KC_PGDN,
        KC_LSFT,   KC_GRV,  KC_P,    KC_K,    KC_G,    KC_W,    KC_Q,    KC_X,    KC_R,    KC_F,    KC_DOT,  KC_Z,    KC_RSFT,                  KC_P1,   KC_P2,   KC_P3,   KC_PENT,   KC_HOME, KC_UP,   KC_END,
        KC_LCTL,   KC_LWIN,   KC_LALT,   KC_SPC,                                                KC_RALT, KC_RWIN, LT(_FN,KC_APP), KC_RCTL,      KC_P0,            KC_PDOT,            KC_LEFT, KC_DOWN, KC_RGHT
    ),
    [_FN] = LAYOUT(
		_______,   _______, _______, _______, _______,   _______, _______, _______, _______,   _______, _______, _______, _______,   _______,   KC_SYSREQ, _______, _______, _______,
		_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,           _______, _______, _______, _______,
		_______,     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,       KC_MSTP, KC_VOLU, _______, _______,
		_______,       _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,              KC_MPRV, KC_MPLY, KC_MNXT,            _______, KC_MUTE, _______,
		_______,   _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,                  KC_MUTE, KC_VOLD, _______, _______,   KC_VOLD, KC_MSTP, KC_VOLU,
		_______,   _______,   _______,   _______,                                                 _______,   _______,   _______,   _______,     _______,          _______,            KC_MPRV, KC_MPLY, KC_MNXT
    )
};

void led_set_user(uint8_t usb_led) {

    if (IS_LED_ON(usb_led, USB_LED_CAPS_LOCK)) {
        writePinHigh(F1);
	} else {
        writePinLow(F1);
    }

    if (IS_LED_ON(usb_led, USB_LED_SCROLL_LOCK)) {
        writePinHigh(F0);
	} else {
        writePinLow(F0);
    }
    
    if (!(IS_LED_ON(usb_led, USB_LED_NUM_LOCK))) {
        tap_code(KC_NUMLOCK);
    }
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    static bool sysreq_led = false;
    if (record->event.pressed) {
        if (sysreq_led) {
            sysreq_led = false;
            writePinLow(F4);
        }
        else {
            switch(keycode) {
                case KC_SYSREQ:
                    sysreq_led = true;
                    writePinHigh(F4);
            }
        }
    }
    return true;
}
\ No newline at end of file

A keyboards/handwired/jopr/readme.md => keyboards/handwired/jopr/readme.md +17 -0
@@ 0,0 1,17 @@
# jopr-106-Nl2SR-Cl2MH

106-key based on ISO 105-key, NumLock to SysReq, CapsLock to Muhenkan/ROYA, NumLock state forced on

![jopr-106-default](https://raw.githubusercontent.com/joelproko/keyboard_layout_jopr/master/keycode_layout_default.png)  
![jopr-106-modded_white](https://raw.githubusercontent.com/joelproko/keyboard_layout_jopr/master/keycap_layout_modded_white.png)

Inspired by [KeyBored](https://github.com/itractus/KeyBored) and [white_keyboard_layout](https://github.com/mw8/white_keyboard_layout)

Keyboard Maintainer: [joelproko](https://github.com/joelproko)  
Hardware: https://github.com/joelproko/keyboard_layout_jopr

Make example for this keyboard (after setting up your build environment):

    make jopr: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).

A keyboards/handwired/jopr/rules.mk => keyboards/handwired/jopr/rules.mk +63 -0
@@ 0,0 1,63 @@
# MCU name
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 selection
#   Teensy       halfkay
#   Pro Micro    caterina
#   Atmel DFU    atmel-dfu
#   LUFA DFU     lufa-dfu
#   QMK DFU      qmk-dfu
#   atmega32a    bootloadHID
BOOTLOADER = atmel-dfu


# 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
SLEEP_LED_ENABLE = no  # Breathing sleep LED during USB suspend
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 = no  # Enable keyboard backlight functionality
AUDIO_ENABLE = no
UNICODE_ENABLE = yes
RGBLIGHT_ENABLE = no