Initial System76 Launch 3 keyboard firmware project
Nix flake with devShell providing qmk CLI for firmware development. Custom keymap (copy of default) symlinked into QMK tree on shell entry. Setup: nix develop, then qmk setup system76/qmk_firmware Build: qmk compile -kb system76/launch_3 -km custom Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
result
|
||||
.build/
|
||||
qmk_firmware/
|
||||
27
flake.lock
generated
Normal file
27
flake.lock
generated
Normal file
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"nodes": {
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1773282481,
|
||||
"narHash": "sha256-b/GV2ysM8mKHhinse2wz+uP37epUrSE+sAKXy/xvBY4=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "fe416aaedd397cacb33a610b33d60ff2b431b127",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
||||
62
flake.nix
Normal file
62
flake.nix
Normal file
@@ -0,0 +1,62 @@
|
||||
{
|
||||
description = "System76 Launch 3 keyboard firmware";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||
};
|
||||
|
||||
outputs = { self, nixpkgs }:
|
||||
let
|
||||
supportedSystems = [ "x86_64-linux" "aarch64-linux" ];
|
||||
forAllSystems = nixpkgs.lib.genAttrs supportedSystems;
|
||||
in {
|
||||
devShells = forAllSystems (system:
|
||||
let pkgs = nixpkgs.legacyPackages.${system};
|
||||
in {
|
||||
default = pkgs.mkShell {
|
||||
name = "launch3-firmware";
|
||||
|
||||
packages = [
|
||||
pkgs.qmk
|
||||
pkgs.python3Packages.appdirs
|
||||
];
|
||||
|
||||
shellHook = ''
|
||||
export QMK_HOME="$PWD/qmk_firmware"
|
||||
|
||||
# Symlink tracked keymap into QMK tree
|
||||
if [ -d "$QMK_HOME/keyboards/system76/launch_3" ]; then
|
||||
ln -sfn "$PWD/keymaps/custom" "$QMK_HOME/keyboards/system76/launch_3/keymaps/custom"
|
||||
fi
|
||||
'';
|
||||
};
|
||||
});
|
||||
|
||||
packages = forAllSystems (system:
|
||||
let pkgs = nixpkgs.legacyPackages.${system};
|
||||
in {
|
||||
firmware = pkgs.stdenv.mkDerivation {
|
||||
pname = "launch3-firmware";
|
||||
version = "0.1.0";
|
||||
|
||||
src = ./qmk_firmware;
|
||||
|
||||
nativeBuildInputs = [
|
||||
pkgs.qmk
|
||||
pkgs.python3Packages.appdirs
|
||||
];
|
||||
|
||||
buildPhase = ''
|
||||
export HOME=$(mktemp -d)
|
||||
export QMK_HOME="$PWD"
|
||||
qmk compile -kb system76/launch_3 -km custom
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
mkdir -p $out
|
||||
cp *.uf2 $out/ 2>/dev/null || cp .build/*.uf2 $out/
|
||||
'';
|
||||
};
|
||||
});
|
||||
};
|
||||
}
|
||||
91
keymaps/custom/keymap.c
Normal file
91
keymaps/custom/keymap.c
Normal file
@@ -0,0 +1,91 @@
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
|
||||
/* Layer 0, default layer
|
||||
__________________________________________________________________________________________________________________________________ ________
|
||||
| | | | | | | | | | | | | | || |
|
||||
| ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DELETE || HOME |
|
||||
|________|________|________|________|________|________|________|________|________|________|________|________|________|____________||________|
|
||||
| | | | | | | | | | | | | | || |
|
||||
| ~` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | _ - | = + | BACKSPACE || PGUP |
|
||||
|________|________|________|________|________|________|________|________|________|________|________|________|________|____________||________|
|
||||
| | | | | | | | | | | | [ | ] | || |
|
||||
| TAB | Q | W | E | R | T | Y | U | I | O | P | { | } | | \ || PGDN |
|
||||
|____________|________|________|________|________|________|________|________|________|________|________|________|________|________||________|
|
||||
| | | | | | | | | | | ; | ' | | | |
|
||||
| CAPS | A | S | D | F | G | H | J | K | L | : | " | ENTER | | END |
|
||||
|____________|________|________|________|________|________|________|________|________|________|________|________|____________|___|________|
|
||||
| | | | | | | | | , | . | / | | |
|
||||
| SHIFT | Z | X | C | V | B | N | M | < | > | ? | SHIFT | UP |
|
||||
|________________|________|________|________|________|________|________|________|________|________|________|____________|________|_________
|
||||
| | | | | | | | | | | | | |
|
||||
| CTRL | LALT | FN | LGUI | SPACE | SPACE | RCTRL | RALT | FN | | LEFT | DOWN | RIGHT |
|
||||
|____________|________|_______|________|_________________|_________________|________|________|_____________| |________|________|________|
|
||||
*/
|
||||
|
||||
[0] = 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_HOME,
|
||||
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_PGUP,
|
||||
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_PGDN,
|
||||
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_ENT, KC_END,
|
||||
KC_LSFT, 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_LCTL, KC_LALT, MO(1), KC_LGUI, KC_SPC, KC_SPC, KC_RCTL, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT
|
||||
),
|
||||
|
||||
/* Layer 1, function layer
|
||||
__________________________________________________________________________________________________________________________________ ________
|
||||
| | | | | | | | | | | | | | || PLAY/ |
|
||||
| QK_BOOT | | | | | | | | | | | | | || PAUSE |
|
||||
|________|________|________|________|________|________|________|________|________|________|________|________|________|____________||________|
|
||||
| | | | | | | | | | | LED | LED | LED | || VOLUME |
|
||||
| | | | | | | | | | | TOGGLE | DOWN | UP | || UP |
|
||||
|________|________|________|________|________|________|________|________|________|________|________|________|________|____________||________|
|
||||
| | | | | | | | | | | | | | || VOLUME |
|
||||
|PRINT SCREEN| | | | | | HOME | PGDN | PGUP | END | | | | || DOWN |
|
||||
|____________|________|________|________|________|________|________|________|________|________|________|________|________|________||________|
|
||||
| | | | | | | | | | | | | | | |
|
||||
| | | | | | | LEFT | DOWN | UP | RIGHT | | | | | MUTE |
|
||||
|____________|________|________|________|________|________|________|________|________|________|________|________|____________|___|________|
|
||||
| | | | | | | | | | | | | |
|
||||
| | | | | | | | | | | | | PGUP |
|
||||
|________________|________|________|________|________|________|________|________|________|________|________|____________|________|_________
|
||||
| | | | | | | | | | | | | |
|
||||
| | | | | | | | | | | HOME | PGDN | END |
|
||||
|____________|________|_______|________|_________________|_________________|________|________|_____________| |________|________|________|
|
||||
|
||||
* 'QK_BOOT' resets the controller and puts the board into firmware flashing mode. If this key is hit accidentally, just unplug the board
|
||||
* and plug it back in.
|
||||
*/
|
||||
|
||||
[1] = LAYOUT(
|
||||
QK_BOOT, 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_MPLY,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_TOG, RGB_VAD, RGB_VAI, KC_TRNS, KC_VOLU,
|
||||
KC_PSCR, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_PGUP, KC_END, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE,
|
||||
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_PGUP,
|
||||
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_END
|
||||
),
|
||||
|
||||
[2] = LAYOUT(
|
||||
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, 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, KC_TRNS, KC_TRNS
|
||||
),
|
||||
|
||||
[3] = LAYOUT(
|
||||
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, 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, KC_TRNS, KC_TRNS
|
||||
),
|
||||
};
|
||||
|
||||
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||
return true;
|
||||
}
|
||||
Reference in New Issue
Block a user