@ -0,0 +1,85 @@ | |||
# Pearl 40% | |||
Pearl 40% is a keyboard designed by Koobaczech. It uses an Atmel | |||
ATMEGA32A MCU. | |||
## Compiling and flashing | |||
These instructions are for building and flashing your Pearl 40% without | |||
Bootmapper Client. | |||
### Requirements | |||
#### Windows | |||
(to be written, help needed) | |||
#### Mac | |||
Apart from regular QMK and AVR dependencies you need to install | |||
`bootloadHID`. You can install it with `homebrew` as follows: | |||
$ brew install --HEAD https://raw.githubusercontent.com/robertgzr/homebrew-tap/master/bootloadhid.rb | |||
If you don't use `homebrew` you can try following the compiling | |||
instructions defined below in the Linux section. | |||
#### Linux | |||
For Linux you require all regular QMK dependencies, but make sure you're | |||
using `gcc-avr` version 4.9 or higher. 4.8 and lower do not contain the | |||
proper definitions for ATMEGA32A MCUs and QMK will fail while attempting | |||
to compile a HEX for Pearl 40%. | |||
E.g. you cannot compile Pearl 40% HEX on a regular Ubuntu 14.04 as | |||
`gcc-avr` version is maxed to 4.8 on it. | |||
Additionally you need an operational `bootloadHID` binary. | |||
You can install `bootloadHID` by taking the following steps: | |||
$ git clone https://github.com/robertgzr/bootloadHID ~/tmp/bootloadHIDsrc | |||
$ cd ~/tmp/bootloadHIDsrc/commandline | |||
$ make VENDORID=0x16c0 PRODUCTID=0x05DF # vid and pid for atmega32a | |||
$ chmod +x bootloadHID && cp bootloadHID /usr/bin/bootloadHID | |||
Running `which bootloadHID` should return `/usr/bin/bootloadHID`. | |||
### Compiling | |||
Enter the QMK root directory and compile a keymap with the following | |||
command: | |||
$ make pearl:<keymap> | |||
where `<keymap>` is a layout directory under the `pearl` directory. | |||
QMK should compile a HEX (called `pearl_<keymap>.hex`) for you, which | |||
you can flash using `bootloadHID`. | |||
### Flashing | |||
To enable Pearl 40% bootloading mode, unplug the keyboard, then plug it | |||
in while holding `Esc` at the same time (the top-leftmost switch on the | |||
PCB, next to the USB connector). Once the board is in bootload mode, | |||
issue the following command (you might require `sudo` to perform the | |||
command): | |||
# assuming we're still in the QMK root dir where you compiled a HEX into | |||
$ bootloadHID -r ./pearl_<keymap>.hex | |||
You should see something similar to | |||
> Page size = <value> | |||
> Device size = <value>; <value> remaining | |||
> Uploading <value> bytes starting at 0 (0x0) | |||
> <value> ... <current value> | |||
where `<current value>` should be slowly increasing as the HEX is being | |||
flashed to the board. If there is some warning about `resource busy` it | |||
should still work OK. | |||
Once done the board underglow should turn red and the new firmware has | |||
been flashed. If you can't type on the board try plugging it in again | |||
(without holding any keys to prevent accidentally setting it into | |||
bootload mode again). |
@ -0,0 +1,5 @@ | |||
root = true | |||
[*.c] | |||
indent_size = 4 | |||
indent_style = space |
@ -0,0 +1,23 @@ | |||
# rask's Pearl 40% | |||
## Layout | |||
The firmware offers five layers: | |||
1. Base layer | |||
2. Base with numbers and symbols (Fn1) | |||
3. Base with F-row and arrows (Fn2) | |||
4. Base with media and RGB controls (Fn3) | |||
5. More nav and utils (Fn2+Fn3, aka NavFn) | |||
![rask's Pearl 40% layout](https://i.imgur.com/gKVQapZ.png) | |||
Base for this firmware copied from jetpacktuxedo's QMK firmware. | |||
--- | |||
## Compiling and flashing | |||
To compile a HEX follow the Pearl 40% instructions. | |||
Flashing instructions also available at Pearl 40% instructions. |
@ -0,0 +1,87 @@ | |||
#include "pearl.h" | |||
#define ____ KC_TRNS | |||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
// BASE LAYER | |||
[0] = KEYMAP( | |||
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, | |||
MO(2), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, | |||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, MO(3), | |||
KC_LCTL, KC_LALT, KC_BSPC, MO(1), MO(1), KC_SPC, KC_RALT, KC_LGUI | |||
), | |||
// BASE LAYER TWO (Fn1) | |||
[1] = KEYMAP( | |||
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_QUOT, KC_BSLS, | |||
____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, KC_RSFT, | |||
____, ____, ____, ____, ____, ____, ____, ____ | |||
), | |||
// FROW LAYER AND ARROWS (Fn2) | |||
[2] = KEYMAP( | |||
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_UP, ____, ____, | |||
____, ____, ____, ____, ____, ____, ____, ____, KC_LEFT, KC_DOWN,KC_RGHT, MO(4), | |||
____, ____, ____, ____, ____, ____, ____, ____ | |||
), | |||
// MEDIA AND RGB (Fn3) | |||
[3] = KEYMAP( | |||
____, ____, ____, ____, ____, ____, ____, ____, ____, KC_MPRV,KC_MPLY, KC_MNXT, KC_DEL, | |||
____, ____, ____, RGB_HUI, RGB_SAI,RGB_VAI,____, ____, ____, ____, ____, ____, | |||
____, RGB_MOD, RGB_TOG, RGB_HUD, RGB_SAD,RGB_VAD,____, ____, ____, ____, ____, ____, | |||
____, ____, ____, ____, ____, ____, ____, ____ | |||
), | |||
// UTIL (Fn1+Fn3) | |||
[4] = KEYMAP( | |||
____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, KC_PSCR, ____, | |||
____, ____, ____, ____, ____, ____, ____, ____, ____, KC_PGUP,____, ____, | |||
____, ____, ____, ____, ____, ____, ____, ____, KC_HOME, KC_PGDN,KC_END, ____, | |||
RESET, ____, ____, ____, ____, ____, ____, ____ | |||
), | |||
}; | |||
/** | |||
* Status LED layer indicators courtesy of jetpacktuxedo's firmware | |||
*/ | |||
uint32_t layer_state_set_kb(uint32_t state) | |||
{ | |||
// if we are on layer 1 | |||
if (state & (1<<1)){ | |||
// light num lock led | |||
PORTD |= (1 << PD0); | |||
} else{ | |||
PORTD &= ~(1 << PD0); | |||
} | |||
// if we are on layer 2 | |||
if (state & (1<<2)){ | |||
// light caps lock led | |||
PORTD |= (1 << PD1); | |||
} else{ | |||
PORTD &= ~(1 << PD1); | |||
} | |||
// if we are on layer 3 | |||
if (state & (1<<3)){ | |||
// light scroll lock led | |||
PORTD |= (1 << PD6); | |||
} else{ | |||
PORTD &= ~(1 << PD6); | |||
} | |||
/* | |||
// if we are on layer 4 | |||
if (state & (1<<4)){ | |||
// light all leds | |||
PORTD |= (1 << PD0); | |||
PORTD |= (1 << PD1); | |||
PORTD |= (1 << PD6); | |||
} else{ | |||
PORTD &= ~(1 << PD0); | |||
PORTD &= ~(1 << PD1); | |||
PORTD &= ~(1 << PD6); | |||
} | |||
*/ | |||
return state; | |||
} |