gnu: Add qmk-firmware-ergodox-ez-default.

* gnu/packages/firmware.scm (make-qmk-firmware/implementation)
(make-qmk-firmware): New procedures.
(qmk-firmware-ergodox-ez-default): New variable.

Series-changes: 2
- Install firmware from root directory, not .build
- Also honor .bin and .uf2 firmware file extensions
This commit is contained in:
Maxim Cournoyer 2023-09-13 13:47:48 -04:00
parent a1ce7487d3
commit 26025fa802
No known key found for this signature in database
GPG key ID: 1260E46482E63562

View file

@ -28,6 +28,7 @@
(define-module (gnu packages firmware)
#:use-module ((guix licenses) #:prefix license:)
#:use-module (guix memoization)
#:use-module (guix packages)
#:use-module (guix download)
#:use-module (guix gexp)
@ -43,6 +44,7 @@ (define-module (gnu packages firmware)
#:use-module (gnu packages admin)
#:use-module (gnu packages autotools)
#:use-module (gnu packages avr)
#:use-module (gnu packages avr-xyz)
#:use-module (gnu packages assembly)
#:use-module (gnu packages backup)
#:use-module (gnu packages base)
@ -80,7 +82,10 @@ (define-module (gnu packages firmware)
#:use-module (gnu packages tls)
#:use-module (gnu packages version-control)
#:use-module (gnu packages xml)
#:use-module (ice-9 match))
#:use-module (ice-9 format)
#:use-module (ice-9 match)
#:export (make-qmk-firmware))
(define-public ath9k-htc-firmware
(package
@ -1308,3 +1313,126 @@ (define-public qmk
install the udev rules provided by the @code{qmk-udev-rules} package to avoid
having to run @command{qmk} as root when flashing the firmware.")
(license license:expat)))
(define* (make-qmk-firmware/implementation keyboard keymap
#:key (description "")
keymap-json
keymap-source-directory)
"Return a package to build the QMK firmware for KEYBOARD with KEYMAP.
Keyboard should be the name of a sub-directory under the @file{keyboards}
directory. For custom keymaps, KEYMAP-JSON, a file-like object of a JSON
representation of KEYMAP as generated by the @url{https://config.qmk.fm/, QMK
Configurator} tool or KEYMAP-SOURCE-DIRECTORY, a file-like object directory
containing the keymap source files files such as @file{keymap.c}, can be
provided."
(package
(name (string-append "qmk-firmware-"
(string-replace-substring keyboard "_" "-") "-"
(string-replace-substring keymap "_" "-")))
;; Note: When updating this package, make sure to also update the commit
;; used for the LUFA submodule in the 'copy-lufa-source' phase below.
(version "0.22.3")
(source (origin
(method git-fetch)
(uri (git-reference
(url "https://github.com/qmk/qmk_firmware")
(commit version)))
(file-name (git-file-name "qmk-firmware" version))
(sha256
(base32
"0s1lcnv7cddpn768p7mrc5bkxhx0ba5p77ya007dnkbk36c33d0w"))))
(build-system gnu-build-system)
(arguments
(list
#:modules '((guix build gnu-build-system)
(guix build utils)
(ice-9 ftw)
(ice-9 match)
(srfi srfi-26))
;; XXX: Running a test target like "test:$keyboard" doesn't seem to run
;; anything and causes the .hex file to be regenerated; leave the tests
;; out for now.
#:tests? #f
#:make-flags
#~(list #$(format #f "~a:~a" keyboard keymap)
(string-append "SHELL=" (search-input-file
%build-inputs "bin/sh")))
#:phases
#~(modify-phases %standard-phases
(replace 'configure
(lambda _
;; Do not attempt to retrieve information from git during the
;; build.
(setenv "SKIP_GIT" "1")))
(add-after 'unpack 'copy-lufa-source
;; QMK carries a custom fork of LUFA as a git submodule; make sure
;; the same commit is used (see:
;; https://github.com/qmk/qmk_firmware/tree/master/lib).
(lambda _
(copy-recursively
#$(let ((commit "549b97320d515bfca2f95c145a67bd13be968faa"))
(origin
(inherit (package-source lufa))
(uri (git-reference
(url "https://github.com/qmk/lufa")
(commit commit)))
(file-name (git-file-name "lufa" commit))
(sha256
(base32
"1rmhm4rxvq8skxqn6vc4n4ly1ak6whj7c386zbsci4pxx548n9h4"))))
"lib/lufa")))
#$@(if keymap-source-directory
#~((add-after 'unpack 'copy-keymap-source-directory
(lambda _
(let ((keymap-dir #$(string-append "keyboards/" keyboard
"/keymaps/" keymap)))
(false-if-exception (delete-file-recursively
keymap-dir))
(copy-recursively #$keymap-source-directory
keymap-dir)))))
#~())
#$@(if keymap-json
#~((replace 'build
(lambda _
(invoke "qmk" "compile" #$keymap-json))))
#~())
(replace 'install
(lambda _
(match (scandir "." (lambda (f)
(false-if-exception
(member (string-take-right f 4)
'(".bin" ".hex" ".uf2")))))
(()
(error "no built binary file found"))
((hex ..1)
(for-each (cut install-file <> #$output) hex))))))))
;; Some of the build tools are required to be on the PATH, as the make
;; files do not always operate through 'qmk'; all of qmk's inputs must
;; thus be made available.
(native-inputs (modify-inputs (package-inputs qmk)
(append qmk)))
(home-page "https://qmk.fm/")
(synopsis "Keyboard firmware for Atmel AVR and Arm USB families")
(description
(format #f "QMK (Quantum Mechanical Keyboard Firmware) is a keyboard
firmware based on the @url{https://github.com/tmk/tmk_keyboard, tmk_keyboard
firmware} with some useful features for Atmel AVR and ARM controllers, and
more specifically, the @url{https://olkb.com/, OLKB product line}, the
@url{https://ergodox-ez.com/, ErgoDox EZ keyboard}, and the
@url{https://clueboard.co/, Clueboard product line}.~@[~%~%~a~]" description))
(license license:gpl2+)))
(define make-qmk-firmware (memoize make-qmk-firmware/implementation))
(define-public qmk-firmware-ergodox-ez-default
(make-qmk-firmware
"ergodox_ez" "default" #:description
"This is the default keymap used on the ErgoDox EZ keyboard. It includes
the novel MEH and Hyper keys pioneered by the ErgoDox EZ, easy to reach
Control/Shift modifiers keys, and two-functions hold keys to access layer 1.
Layer 1 contains function keys, symbols, a numpad as well as brightness keys.
Layer 2 contains multimedia and mouse keys. See the
@file{keyboards/ergodox_ez/keymaps/default/keymap.c} source file for the
keymap definition, or the
@url{https://configure.ergodox-ez.com/ergodox-ez/layouts/JwwW/latest/0,
ErgoDox EZ Configurator} page."))