* [bug#66217] [PATCH 00/22] Add ErgoDox firmware packages
@ 2023-09-26 18:59 Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 01/22] gnu: make-avr-toolchain: Add a #:xgcc argument Maxim Cournoyer
` (21 more replies)
0 siblings, 22 replies; 23+ messages in thread
From: Maxim Cournoyer @ 2023-09-26 18:59 UTC (permalink / raw)
To: 66217; +Cc: Maxim Cournoyer
This series add various ErgoDox keyboards (AVR-based)
firmware packages. I've tested them with a newly built ErgoDox keyboard (from
a 2014 kit!). The make-qmk-firmware procedure should be easy to extend to
support more keyboards, if someone is interested in doing so.
Maxim Cournoyer (22):
gnu: make-avr-toolchain: Add a #:xgcc argument.
gnu: qmk: Style.
gnu: qmk: Avoid propagating inputs.
gnu: qmk: Use GCC 8 for the AVR toolchain.
gnu: qmk: Add many missing inputs and add more commands to PATH.
gnu: Add lufa.
gnu: embedded: Do not use a prefix on the (gnu packages base) module.
gnu: Add qmk-firmware-ergodox-ez-default.
gnu: Add qmk-firmware-ergodox-ez-dvorak-42-key.
gnu: Add qmk-udev-rules.
gnu: Add qmk-firmware-ergodox-ez-hacker-dvorak.
gnu: Add qmk-firmware-ergodox-ez-dvorak.
gnu: Add qmk-firmware-ergodox-ez-dvorak-emacs.
gnu: Add qmk-firmware-ergodox-ez-dvorak-emacs-software.
gnu: Add ergodox-firmware-colemak-jc-mod.
gnu: Add ergodox-firmware-colemak-symbol-mod.
gnu: Add ergodox-firmware-dvorak-kinesis-mod.
gnu: Add ergodox-firmware-qwerty-kinesis-mod.
gnu: Add ergodox-firmware-workman-p-kinesis-mod.
gnu: teensy-loader-cli: Use gexps.
gnu: teensy-loader-cli: Fix license.
gnu: Add teensy-udev-rules.
gnu/local.mk | 3 +
gnu/packages/avr-xyz.scm | 83 +
gnu/packages/avr.scm | 212 +--
gnu/packages/embedded.scm | 8 +-
gnu/packages/firmware.scm | 378 ++++-
gnu/packages/flashing-tools.scm | 64 +-
.../ergodox-firmware-fix-json-target.patch | 1405 +++++++++++++++++
.../patches/ergodox-firmware-fix-numpad.patch | 18 +
.../qmk-firmware-fix-hacker-dvorak.patch | 15 +
9 files changed, 2061 insertions(+), 125 deletions(-)
create mode 100644 gnu/packages/patches/ergodox-firmware-fix-json-target.patch
create mode 100644 gnu/packages/patches/ergodox-firmware-fix-numpad.patch
create mode 100644 gnu/packages/patches/qmk-firmware-fix-hacker-dvorak.patch
base-commit: 06dc36ffb7cde821a4762b299d1c95b3788ba110
--
2.41.0
^ permalink raw reply [flat|nested] 23+ messages in thread
* [bug#66217] [PATCH 01/22] gnu: make-avr-toolchain: Add a #:xgcc argument.
2023-09-26 18:59 [bug#66217] [PATCH 00/22] Add ErgoDox firmware packages Maxim Cournoyer
@ 2023-09-26 19:04 ` Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 02/22] gnu: qmk: Style Maxim Cournoyer
` (20 subsequent siblings)
21 siblings, 0 replies; 23+ messages in thread
From: Maxim Cournoyer @ 2023-09-26 19:04 UTC (permalink / raw)
To: 66217; +Cc: Maxim Cournoyer
This allows generating an AVR toolchain for any version of GCC.
* gnu/packages/avr.scm (make-avr-gcc): Add a #:xgcc argument; use memoize
instead of mlambda.
(make-avr-libc): Likewise. Provide it to the 'make-avr-gcc' call.
(make-avr-toolchain): Add a #:xgcc argument; use memoize instead of mlambda.
Provide the xgcc argument to the 'make-avr-libc' and 'make-avr-gcc'
procedures.
---
gnu/packages/avr.scm | 212 ++++++++++++++++++++++---------------------
1 file changed, 110 insertions(+), 102 deletions(-)
diff --git a/gnu/packages/avr.scm b/gnu/packages/avr.scm
index bc583ddff3b..a66abbbd3ad 100644
--- a/gnu/packages/avr.scm
+++ b/gnu/packages/avr.scm
@@ -6,6 +6,7 @@
;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
;;; Copyright © 2020 Marius Bakke <mbakke@fastmail.com>
;;; Copyright © 2020 Arun Isaac <arunisaac@systemreboot.net>
+;;; Copyright © 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -58,115 +59,122 @@ (define make-avr-binutils
(inherit (cross-binutils "avr"))
(name "avr-binutils"))))
-(define make-avr-gcc
- (mlambda ()
- (let ((xgcc (cross-gcc "avr" #:xbinutils (make-avr-binutils))))
- (package
- (inherit xgcc)
- (name "avr-gcc")
- (arguments
- (substitute-keyword-arguments (package-arguments xgcc)
- ((#:phases phases)
- #~(modify-phases #$phases
- (add-after 'set-paths 'augment-CPLUS_INCLUDE_PATH
- (lambda* (#:key inputs #:allow-other-keys)
- (let ((gcc (assoc-ref inputs "gcc")))
- ;; Remove the default compiler from CPLUS_INCLUDE_PATH
- ;; to prevent header conflict with the GCC from
- ;; native-inputs.
- (setenv "CPLUS_INCLUDE_PATH"
- (string-join
- (delete (string-append gcc "/include/c++")
- (string-split (getenv "CPLUS_INCLUDE_PATH")
- #\:))
- ":"))
- (format #t
- "environment variable `CPLUS_INCLUDE_PATH' \
+(define* (make-avr-gcc/implementation #:key (xgcc gcc))
+ "Return a XGCC-base cross-compiler for the AVR target."
+ (let ((xgcc (cross-gcc "avr" #:xgcc xgcc #:xbinutils (make-avr-binutils))))
+ (package
+ (inherit xgcc)
+ (name "avr-gcc")
+ (arguments
+ (substitute-keyword-arguments (package-arguments xgcc)
+ ((#:phases phases)
+ #~(modify-phases #$phases
+ (add-after 'set-paths 'augment-CPLUS_INCLUDE_PATH
+ (lambda* (#:key inputs #:allow-other-keys)
+ (let ((gcc (assoc-ref inputs "gcc")))
+ ;; Remove the default compiler from CPLUS_INCLUDE_PATH
+ ;; to prevent header conflict with the GCC from
+ ;; native-inputs.
+ (setenv "CPLUS_INCLUDE_PATH"
+ (string-join
+ (delete (string-append gcc "/include/c++")
+ (string-split (getenv "CPLUS_INCLUDE_PATH")
+ #\:))
+ ":"))
+ (format #t
+ "environment variable `CPLUS_INCLUDE_PATH' \
changed to ~a~%"
- (getenv "CPLUS_INCLUDE_PATH")))))
- ;; Without a working multilib build, the resulting GCC lacks
- ;; support for nearly every AVR chip.
- (add-after 'unpack 'fix-genmultilib
- (lambda _
- ;; patch-shebang doesn't work here because there are
- ;; actually several scripts inside this script, each with
- ;; a #!/bin/sh that needs patching.
- (substitute* "gcc/genmultilib"
- (("#!/bin/sh") (string-append "#!" (which "sh"))))))))
- ((#:configure-flags flags)
- #~(delete "--disable-multilib" #$flags))))
- (native-search-paths
- (list (search-path-specification
- (variable "CROSS_C_INCLUDE_PATH")
- (files '("avr/include")))
- (search-path-specification
- (variable "CROSS_CPLUS_INCLUDE_PATH")
- (files '("avr/include")))
- (search-path-specification
- (variable "CROSS_OBJC_INCLUDE_PATH")
- (files '("avr/include")))
- (search-path-specification
- (variable "CROSS_OBJCPLUS_INCLUDE_PATH")
- (files '("avr/include")))
- (search-path-specification
- (variable "CROSS_LIBRARY_PATH")
- (files '("avr/lib")))))
- (native-inputs
- `(("gcc" ,gcc)
- ,@(package-native-inputs xgcc)))))))
+ (getenv "CPLUS_INCLUDE_PATH")))))
+ ;; Without a working multilib build, the resulting GCC lacks
+ ;; support for nearly every AVR chip.
+ (add-after 'unpack 'fix-genmultilib
+ (lambda _
+ ;; patch-shebang doesn't work here because there are
+ ;; actually several scripts inside this script, each with
+ ;; a #!/bin/sh that needs patching.
+ (substitute* "gcc/genmultilib"
+ (("#!/bin/sh") (string-append "#!" (which "sh"))))))))
+ ((#:configure-flags flags)
+ #~(delete "--disable-multilib" #$flags))))
+ (native-search-paths
+ (list (search-path-specification
+ (variable "CROSS_C_INCLUDE_PATH")
+ (files '("avr/include")))
+ (search-path-specification
+ (variable "CROSS_CPLUS_INCLUDE_PATH")
+ (files '("avr/include")))
+ (search-path-specification
+ (variable "CROSS_OBJC_INCLUDE_PATH")
+ (files '("avr/include")))
+ (search-path-specification
+ (variable "CROSS_OBJCPLUS_INCLUDE_PATH")
+ (files '("avr/include")))
+ (search-path-specification
+ (variable "CROSS_LIBRARY_PATH")
+ (files '("avr/lib")))))
+ (native-inputs
+ `(("gcc" ,gcc)
+ ,@(package-native-inputs xgcc))))))
+
+(define make-avr-gcc
+ (memoize make-avr-gcc/implementation))
+
+(define* (make-avr-libc/implementation #:key (xgcc gcc))
+ (package
+ (name "avr-libc")
+ (version "2.0.0")
+ (source (origin
+ (method url-fetch)
+ (uri (string-append "mirror://savannah//avr-libc/avr-libc-"
+ version ".tar.bz2"))
+ (sha256
+ (base32
+ "15svr2fx8j6prql2il2fc0ppwlv50rpmyckaxx38d3gxxv97zpdj"))))
+ (build-system gnu-build-system)
+ (arguments
+ '(#:out-of-source? #t
+ #:configure-flags '("--host=avr")))
+ (native-inputs `(("avr-binutils" ,(make-avr-binutils))
+ ("avr-gcc" ,(make-avr-gcc #:xgcc xgcc))))
+ (home-page "https://www.nongnu.org/avr-libc/")
+ (synopsis "The AVR C Library")
+ (description
+ "AVR Libc is a project whose goal is to provide a high quality C library
+for use with GCC on Atmel AVR microcontrollers.")
+ (license
+ (license:non-copyleft "http://www.nongnu.org/avr-libc/LICENSE.txt"))))
(define make-avr-libc
- (mlambda ()
- (package
- (name "avr-libc")
- (version "2.0.0")
- (source (origin
- (method url-fetch)
- (uri (string-append "mirror://savannah//avr-libc/avr-libc-"
- version ".tar.bz2"))
- (sha256
- (base32
- "15svr2fx8j6prql2il2fc0ppwlv50rpmyckaxx38d3gxxv97zpdj"))))
- (build-system gnu-build-system)
- (arguments
- '(#:out-of-source? #t
- #:configure-flags '("--host=avr")))
- (native-inputs `(("avr-binutils" ,(make-avr-binutils))
- ("avr-gcc" ,(make-avr-gcc))))
- (home-page "https://www.nongnu.org/avr-libc/")
- (synopsis "The AVR C Library")
- (description
- "AVR Libc is a project whose goal is to provide a high quality C
-library for use with GCC on Atmel AVR microcontrollers.")
- (license
- (license:non-copyleft "http://www.nongnu.org/avr-libc/LICENSE.txt")))))
+ (memoize make-avr-libc/implementation))
-(define make-avr-toolchain
- (mlambda ()
- (let ((avr-binutils (make-avr-binutils))
- (avr-libc (make-avr-libc))
- (avr-gcc (make-avr-gcc)))
- ;; avr-libc checks the compiler version and passes "--enable-device-lib"
- ;; for avr-gcc > 5.1.0. It wouldn't install the library for atmega32u4
- ;; etc if we didn't use the corret avr-gcc.
- (package
- (name "avr-toolchain")
- (version (package-version avr-gcc))
- (source #f)
- (build-system trivial-build-system)
- (arguments '(#:builder (begin (mkdir %output) #t)))
- (propagated-inputs
- `(("avrdude" ,avrdude)
- ("binutils" ,avr-binutils)
- ("gcc" ,avr-gcc)
- ("libc" ,avr-libc)))
- (synopsis "Complete GCC tool chain for AVR microcontroller development")
- (description "This package provides a complete GCC tool chain for AVR
+(define* (make-avr-toolchain/implementation #:key (xgcc gcc))
+ (let ((avr-binutils (make-avr-binutils))
+ (avr-libc (make-avr-libc #:xgcc xgcc))
+ (avr-gcc (make-avr-gcc #:xgcc xgcc)))
+ ;; avr-libc checks the compiler version and passes "--enable-device-lib"
+ ;; for avr-gcc > 5.1.0. It wouldn't install the library for atmega32u4
+ ;; etc if we didn't use the corret avr-gcc.
+ (package
+ (name "avr-toolchain")
+ (version (package-version avr-gcc))
+ (source #f)
+ (build-system trivial-build-system)
+ (arguments '(#:builder (begin (mkdir %output) #t)))
+ (propagated-inputs
+ `(("avrdude" ,avrdude)
+ ("binutils" ,avr-binutils)
+ ("gcc" ,avr-gcc)
+ ("libc" ,avr-libc)))
+ (synopsis "Complete GCC tool chain for AVR microcontroller development")
+ (description "This package provides a complete GCC tool chain for AVR
microcontroller development. This includes the GCC AVR cross compiler and
avrdude for firmware flashing. The supported programming languages are C and
C++.")
- (home-page (package-home-page avr-libc))
- (license (package-license avr-gcc))))))
+ (home-page (package-home-page avr-libc))
+ (license (package-license avr-gcc)))))
+
+(define make-avr-toolchain
+ (memoize make-avr-toolchain/implementation))
(define-public microscheme
(package
--
2.41.0
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [bug#66217] [PATCH 02/22] gnu: qmk: Style.
2023-09-26 18:59 [bug#66217] [PATCH 00/22] Add ErgoDox firmware packages Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 01/22] gnu: make-avr-toolchain: Add a #:xgcc argument Maxim Cournoyer
@ 2023-09-26 19:04 ` Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 03/22] gnu: qmk: Avoid propagating inputs Maxim Cournoyer
` (19 subsequent siblings)
21 siblings, 0 replies; 23+ messages in thread
From: Maxim Cournoyer @ 2023-09-26 19:04 UTC (permalink / raw)
To: 66217; +Cc: Maxim Cournoyer, Efraim Flashner, Vagrant Cascadian
* gnu/packages/firmware.scm (qmk): Apply 'guix style' changes.
---
gnu/packages/firmware.scm | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/gnu/packages/firmware.scm b/gnu/packages/firmware.scm
index 08fe8311dce..dcae0d510b5 100644
--- a/gnu/packages/firmware.scm
+++ b/gnu/packages/firmware.scm
@@ -1223,10 +1223,17 @@ (define-public qmk
(base32
"1619q9v90740dbg8xpzqlhwcasz42xj737803aiip8qc3a7zhwgq"))))
(build-system pyproject-build-system)
- (arguments (list #:tests? #f)) ;; No tests.
- (propagated-inputs (list python-dotty-dict python-hid python-hjson
- python-jsonschema python-milc python-pillow
- python-pygments python-pyserial python-pyusb))
+ (arguments
+ (list #:tests? #f)) ;No tests.
+ (propagated-inputs (list python-dotty-dict
+ python-hid
+ python-hjson
+ python-jsonschema
+ python-milc
+ python-pillow
+ python-pygments
+ python-pyserial
+ python-pyusb))
(home-page "https://qmk.fm")
(synopsis "Command line utility to manage QMK keyboard firmwares")
(description "This package provides a program to help users work with
--
2.41.0
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [bug#66217] [PATCH 03/22] gnu: qmk: Avoid propagating inputs.
2023-09-26 18:59 [bug#66217] [PATCH 00/22] Add ErgoDox firmware packages Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 01/22] gnu: make-avr-toolchain: Add a #:xgcc argument Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 02/22] gnu: qmk: Style Maxim Cournoyer
@ 2023-09-26 19:04 ` Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 04/22] gnu: qmk: Use GCC 8 for the AVR toolchain Maxim Cournoyer
` (18 subsequent siblings)
21 siblings, 0 replies; 23+ messages in thread
From: Maxim Cournoyer @ 2023-09-26 19:04 UTC (permalink / raw)
To: 66217; +Cc: Maxim Cournoyer, Efraim Flashner, Vagrant Cascadian
* gnu/packages/firmware.scm (qmk):
[arguments]: New modules and phases arguments.
[propagated-inputs]: Turn into...
[inputs]: ... this. Add coreutils-minimal, sed and util-linux.
[description]: Expound.
---
gnu/packages/firmware.scm | 71 ++++++++++++++++++++++++++++++++-------
1 file changed, 59 insertions(+), 12 deletions(-)
diff --git a/gnu/packages/firmware.scm b/gnu/packages/firmware.scm
index dcae0d510b5..499920160a8 100644
--- a/gnu/packages/firmware.scm
+++ b/gnu/packages/firmware.scm
@@ -33,6 +33,7 @@ (define-module (gnu packages firmware)
#:use-module (guix gexp)
#:use-module (guix utils)
#:use-module (guix git-download)
+ #:use-module (guix build-system copy)
#:use-module (guix build-system gnu)
#:use-module (guix build-system meson)
#:use-module (guix build-system python)
@@ -40,6 +41,8 @@ (define-module (gnu packages firmware)
#:use-module (guix build-system trivial)
#:use-module (gnu packages)
#:use-module (gnu packages admin)
+ #:use-module (gnu packages autotools)
+ #:use-module (gnu packages avr)
#:use-module (gnu packages assembly)
#:use-module (gnu packages backup)
#:use-module (gnu packages base)
@@ -52,6 +55,7 @@ (define-module (gnu packages firmware)
#:use-module (gnu packages curl)
#:use-module (gnu packages efi)
#:use-module (gnu packages elf)
+ #:use-module (gnu packages flashing-tools)
#:use-module (gnu packages flex)
#:use-module (gnu packages gcc)
#:use-module (gnu packages gettext)
@@ -1212,6 +1216,11 @@ (define-public crust-pinebook
(define-public crust-pine64-plus
(make-crust-package "pine64_plus"))
+\f
+;;;
+;;; QMK Firmware.
+;;;
+
(define-public qmk
(package
(name "qmk")
@@ -1224,18 +1233,56 @@ (define-public qmk
"1619q9v90740dbg8xpzqlhwcasz42xj737803aiip8qc3a7zhwgq"))))
(build-system pyproject-build-system)
(arguments
- (list #:tests? #f)) ;No tests.
- (propagated-inputs (list python-dotty-dict
- python-hid
- python-hjson
- python-jsonschema
- python-milc
- python-pillow
- python-pygments
- python-pyserial
- python-pyusb))
+ (list
+ #:tests? #f ;no tests
+ #:modules '((guix build pyproject-build-system)
+ (guix build utils)
+ (srfi srfi-26))
+ #:phases
+ #~(modify-phases %standard-phases
+ (add-after 'wrap 'wrap-path
+ (lambda* (#:key inputs outputs #:allow-other-keys)
+ (wrap-program (search-input-file outputs "bin/qmk")
+ `("PATH" prefix
+ ,(map (compose dirname
+ (cut search-input-file inputs <>))
+ '("bin/avr-gcc"
+ "bin/avrdude"
+ "bin/dfu-programmer"
+ "bin/git"
+ ;; TODO: Remove after git is wrapped with these.
+ "bin/basename"
+ "bin/sed"
+ "bin/uname")))))))))
+ ;; The inputs are not propagated since qmk is to be used strictly as a
+ ;; command.
+ (inputs
+ (list (make-avr-toolchain)
+ avrdude
+ dfu-programmer
+ git-minimal ;for the clone action
+ python-dotty-dict
+ python-hid
+ python-hjson
+ python-jsonschema
+ python-milc
+ python-pillow
+ python-pygments
+ python-pyserial
+ python-pyusb
+ ;; These are added to workaround faults in our git package (see
+ ;; bug#65924).
+ coreutils-minimal
+ sed
+ util-linux))
(home-page "https://qmk.fm")
(synopsis "Command line utility to manage QMK keyboard firmwares")
- (description "This package provides a program to help users work with
-@acronym{QMK, Quantum Mechanical Keyboard} firmwares.")
+ (description "The QMK CLI provides a @acronym{CLI, command line interface}
+based program to help users work with the QMK firmware, which can be used for
+multiple custom keyboards such as Planck, ErgoDox, Corne and others.
+
+This @acronym{CLI} program is mainly used for building the QMK firmware, but
+also has some other convenience utilities. It is highly recommended to
+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)))
--
2.41.0
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [bug#66217] [PATCH 04/22] gnu: qmk: Use GCC 8 for the AVR toolchain.
2023-09-26 18:59 [bug#66217] [PATCH 00/22] Add ErgoDox firmware packages Maxim Cournoyer
` (2 preceding siblings ...)
2023-09-26 19:04 ` [bug#66217] [PATCH 03/22] gnu: qmk: Avoid propagating inputs Maxim Cournoyer
@ 2023-09-26 19:04 ` Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 05/22] gnu: qmk: Add many missing inputs and add more commands to PATH Maxim Cournoyer
` (17 subsequent siblings)
21 siblings, 0 replies; 23+ messages in thread
From: Maxim Cournoyer @ 2023-09-26 19:04 UTC (permalink / raw)
To: 66217; +Cc: Maxim Cournoyer, Efraim Flashner, Vagrant Cascadian
* gnu/packages/firmware.scm (qmk) [inputs]: Specify 'gcc-8' as the #:xgcc
argument to the 'make-avr-toolchain' procedure.
---
gnu/packages/firmware.scm | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/gnu/packages/firmware.scm b/gnu/packages/firmware.scm
index 499920160a8..c1f6c8ea5e2 100644
--- a/gnu/packages/firmware.scm
+++ b/gnu/packages/firmware.scm
@@ -1257,7 +1257,9 @@ (define-public qmk
;; The inputs are not propagated since qmk is to be used strictly as a
;; command.
(inputs
- (list (make-avr-toolchain)
+ ;; The 'qmk setup' command advises to use GCC at version 8, and there are
+ ;; compilation errors in some firmware otherwise.
+ (list (make-avr-toolchain #:xgcc gcc-8)
avrdude
dfu-programmer
git-minimal ;for the clone action
--
2.41.0
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [bug#66217] [PATCH 05/22] gnu: qmk: Add many missing inputs and add more commands to PATH.
2023-09-26 18:59 [bug#66217] [PATCH 00/22] Add ErgoDox firmware packages Maxim Cournoyer
` (3 preceding siblings ...)
2023-09-26 19:04 ` [bug#66217] [PATCH 04/22] gnu: qmk: Use GCC 8 for the AVR toolchain Maxim Cournoyer
@ 2023-09-26 19:04 ` Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 06/22] gnu: Add lufa Maxim Cournoyer
` (16 subsequent siblings)
21 siblings, 0 replies; 23+ messages in thread
From: Maxim Cournoyer @ 2023-09-26 19:04 UTC (permalink / raw)
To: 66217; +Cc: Maxim Cournoyer, Efraim Flashner, Vagrant Cascadian
* gnu/packages/firmware.scm (qmk) [inputs]: Add bash-minimal, dfu-util,
diffutils, gawk, gnu-make, grep and python.
[arguments]: Add them to PATH in the wrapper in the wrap-path phase. Also
capture avr-ar in the PATH. Add CROSS_C_INCLUDE_PATH and
CROSS_LIBRARY_PATH to the wrapper.
---
gnu/packages/firmware.scm | 24 ++++++++++++++++++++++--
1 file changed, 22 insertions(+), 2 deletions(-)
diff --git a/gnu/packages/firmware.scm b/gnu/packages/firmware.scm
index c1f6c8ea5e2..1957fb8aac4 100644
--- a/gnu/packages/firmware.scm
+++ b/gnu/packages/firmware.scm
@@ -57,6 +57,7 @@ (define-module (gnu packages firmware)
#:use-module (gnu packages elf)
#:use-module (gnu packages flashing-tools)
#:use-module (gnu packages flex)
+ #:use-module (gnu packages gawk)
#:use-module (gnu packages gcc)
#:use-module (gnu packages gettext)
#:use-module (gnu packages glib)
@@ -1241,19 +1242,31 @@ (define-public qmk
#:phases
#~(modify-phases %standard-phases
(add-after 'wrap 'wrap-path
+ ;; Wrap all the tools needed for the 'setup' and 'compile' actions
+ ;; (tested with the 'ergodox_ez' keyboard).
(lambda* (#:key inputs outputs #:allow-other-keys)
(wrap-program (search-input-file outputs "bin/qmk")
`("PATH" prefix
,(map (compose dirname
(cut search-input-file inputs <>))
- '("bin/avr-gcc"
+ '("bin/avr-ar"
+ "bin/avr-gcc"
"bin/avrdude"
+ "bin/awk"
+ "bin/cmp"
"bin/dfu-programmer"
+ "bin/dfu-util"
"bin/git"
+ "bin/grep"
+ "bin/make"
+ "bin/python3"
+ "bin/sh"
;; TODO: Remove after git is wrapped with these.
"bin/basename"
"bin/sed"
- "bin/uname")))))))))
+ "bin/uname")))
+ `("CROSS_C_INCLUDE_PATH" = (,(getenv "CROSS_C_INCLUDE_PATH")))
+ `("CROSS_LIBRARY_PATH" = (,(getenv "CROSS_LIBRARY_PATH")))))))))
;; The inputs are not propagated since qmk is to be used strictly as a
;; command.
(inputs
@@ -1261,8 +1274,15 @@ (define-public qmk
;; compilation errors in some firmware otherwise.
(list (make-avr-toolchain #:xgcc gcc-8)
avrdude
+ bash-minimal
dfu-programmer
+ dfu-util
+ diffutils
git-minimal ;for the clone action
+ gawk
+ gnu-make
+ grep
+ python
python-dotty-dict
python-hid
python-hjson
--
2.41.0
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [bug#66217] [PATCH 06/22] gnu: Add lufa.
2023-09-26 18:59 [bug#66217] [PATCH 00/22] Add ErgoDox firmware packages Maxim Cournoyer
` (4 preceding siblings ...)
2023-09-26 19:04 ` [bug#66217] [PATCH 05/22] gnu: qmk: Add many missing inputs and add more commands to PATH Maxim Cournoyer
@ 2023-09-26 19:04 ` Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 07/22] gnu: embedded: Do not use a prefix on the (gnu packages base) module Maxim Cournoyer
` (15 subsequent siblings)
21 siblings, 0 replies; 23+ messages in thread
From: Maxim Cournoyer @ 2023-09-26 19:04 UTC (permalink / raw)
To: 66217; +Cc: Maxim Cournoyer
* gnu/packages/avr-xyz.scm (lufa): New variable.
---
gnu/packages/avr-xyz.scm | 83 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 83 insertions(+)
diff --git a/gnu/packages/avr-xyz.scm b/gnu/packages/avr-xyz.scm
index e8844b8d438..e0db2e3a0c7 100644
--- a/gnu/packages/avr-xyz.scm
+++ b/gnu/packages/avr-xyz.scm
@@ -1,5 +1,6 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2022 Artyom V. Poptsov <poptsov.artyom@gmail.com>
+;;; Copyright © 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -29,6 +30,7 @@ (define-module (gnu packages avr-xyz)
#:use-module (gnu packages base)
#:use-module (gnu packages bash)
#:use-module (gnu packages avr)
+ #:use-module (gnu packages documentation)
#:use-module (gnu packages elf)
#:use-module (gnu packages gl)
#:use-module (gnu packages pkg-config)
@@ -95,3 +97,84 @@ (define-public simavr
in the emulated code using an @code{.elf} section. You can also load
multipart HEX files.")
(license license:gpl3)))
+
+(define-public lufa
+ (package
+ (name "lufa")
+ (version "210130")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/abcminiuser/lufa")
+ (commit (string-append "LUFA-" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "0ylr7qsiikcy827k18zj1vdzf0kb8hb0gjmifd75y8krkhhar49g"))))
+ (outputs '("bootloaders" "demos" "projects" "doc"))
+ (build-system gnu-build-system)
+ (arguments
+ ;; There are tests, but even LUFA's own CI doesn't run them (they are
+ ;; only built).
+ (list
+ #:tests? #f
+ #:modules '((guix build gnu-build-system)
+ (guix build utils)
+ (ice-9 match)
+ (srfi srfi-26))
+ #:make-flags
+ #~(list (string-append "SHELL="(search-input-file %build-inputs
+ "bin/sh")))
+ #:phases #~(modify-phases %standard-phases
+ (delete 'configure)
+ (add-before 'build 'build-documentation
+ (lambda* (#:key make-flags #:allow-other-keys)
+ (apply invoke "make" "-j" (number->string
+ (or (parallel-job-count)
+ 1))
+ "doxygen"
+ ;; Ignore errors (see:
+ ;; https://github.com/abcminiuser/lufa/issues/90).
+ "-i"
+ make-flags)))
+ (replace 'install
+ ;; There is no default install target as the library is
+ ;; intended to be integrated in source form in a
+ ;; project. Install the example projects and demos
+ ;; binaries as well as the documentation.
+ (lambda _
+ (let ((doc (string-append #$output:doc
+ "/share/doc/lufa/"))
+ (html-dirs (find-files "." "^html$"
+ #:directories? #t)))
+ (for-each (cut install-file <> #$output:bootloaders)
+ (find-files "Bootloaders" "\\.hex$"))
+ (for-each (cut install-file <> #$output:demos)
+ (find-files "Demos" "\\.hex$"))
+ (for-each (cut install-file <> #$output:projects)
+ (find-files "Projects" "\\.hex$"))
+ ;; Install Doxygen generated HTML documentation.
+ (for-each
+ (lambda (html)
+ (let* ((suffix "Documentation/html")
+ (l (string-length suffix))
+ (dest (string-append
+ doc
+ (string-drop
+ (if (string-suffix? suffix html)
+ (string-drop-right html l)
+ (error "unexpected path" html))
+ 1)))) ;drop leading "."
+ (mkdir-p dest)
+ (copy-recursively html dest)))
+ html-dirs)))))))
+ (native-inputs (list doxygen (make-avr-toolchain)))
+ (home-page "https://www.lufa-lib.org/")
+ (synopsis "Lightweight USB Framework for AVRs")
+ (description "UFA is a simple to use, lightweight framework which sits
+atop the hardware USB controller in specific AVR microcontroller models, and
+allows for the quick and easy creation of complex USB devices and hosts. This
+package contains the user-submitted projects and bootloaders for use with
+compatible microcontroller models, as well as the demos and the
+documentation.")
+ (license license:expat))) ;see LUFA/License.txt
--
2.41.0
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [bug#66217] [PATCH 07/22] gnu: embedded: Do not use a prefix on the (gnu packages base) module.
2023-09-26 18:59 [bug#66217] [PATCH 00/22] Add ErgoDox firmware packages Maxim Cournoyer
` (5 preceding siblings ...)
2023-09-26 19:04 ` [bug#66217] [PATCH 06/22] gnu: Add lufa Maxim Cournoyer
@ 2023-09-26 19:04 ` Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 08/22] gnu: Add qmk-firmware-ergodox-ez-default Maxim Cournoyer
` (14 subsequent siblings)
21 siblings, 0 replies; 23+ messages in thread
From: Maxim Cournoyer @ 2023-09-26 19:04 UTC (permalink / raw)
To: 66217; +Cc: Maxim Cournoyer
This can in some cases hide the real error with errors such as:
error: base:which: unbound variable
* gnu/packages/embedded.scm (openocd) [native-inputs]: Replace base:which with
which.
(binutils-vc4): Likewise.
(python-libmpsse): Likewise.
---
gnu/packages/embedded.scm | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/gnu/packages/embedded.scm b/gnu/packages/embedded.scm
index 46a9a3a70a8..aca3cbade87 100644
--- a/gnu/packages/embedded.scm
+++ b/gnu/packages/embedded.scm
@@ -46,7 +46,7 @@ (define-module (gnu packages embedded)
#:use-module (gnu packages)
#:use-module (gnu packages admin)
#:use-module (gnu packages autotools)
- #:use-module ((gnu packages base) #:prefix base:)
+ #:use-module (gnu packages base)
#:use-module (gnu packages bison)
#:use-module (gnu packages boost)
#:use-module (gnu packages check)
@@ -672,7 +672,7 @@ (define-public openocd
(list autoconf
automake
libtool
- base:which
+ which
pkg-config
texinfo))
(inputs
@@ -1152,7 +1152,7 @@ (define-public binutils-vc4
("flex" ,flex)
("bison" ,bison)
("guile-1.8" ,guile-1.8)
- ("which" ,base:which)))
+ ("which" ,which)))
(synopsis "Binutils for VC4")
(description "This package provides @code{binutils} for VideoCore IV,
the Raspberry Pi chip.")
@@ -1241,7 +1241,7 @@ (define-public python-libmpsse
(inputs
(list libftdi python))
(native-inputs
- (list pkg-config swig base:which))
+ (list pkg-config swig which))
(arguments
`(#:tests? #f ; No tests exist.
#:parallel-build? #f ; Would be buggy.
--
2.41.0
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [bug#66217] [PATCH 08/22] gnu: Add qmk-firmware-ergodox-ez-default.
2023-09-26 18:59 [bug#66217] [PATCH 00/22] Add ErgoDox firmware packages Maxim Cournoyer
` (6 preceding siblings ...)
2023-09-26 19:04 ` [bug#66217] [PATCH 07/22] gnu: embedded: Do not use a prefix on the (gnu packages base) module Maxim Cournoyer
@ 2023-09-26 19:04 ` Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 09/22] gnu: Add qmk-firmware-ergodox-ez-dvorak-42-key Maxim Cournoyer
` (13 subsequent siblings)
21 siblings, 0 replies; 23+ messages in thread
From: Maxim Cournoyer @ 2023-09-26 19:04 UTC (permalink / raw)
To: 66217; +Cc: Maxim Cournoyer, Efraim Flashner, Vagrant Cascadian
* gnu/packages/firmware.scm (make-qmk-firmware/implementation)
(make-qmk-firmware): New procedures.
(qmk-firmware-ergodox-ez-default): New variable.
---
gnu/packages/firmware.scm | 126 +++++++++++++++++++++++++++++++++++++-
1 file changed, 125 insertions(+), 1 deletion(-)
diff --git a/gnu/packages/firmware.scm b/gnu/packages/firmware.scm
index 1957fb8aac4..7220177eadb 100644
--- a/gnu/packages/firmware.scm
+++ b/gnu/packages/firmware.scm
@@ -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,122 @@ (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 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 (find-files ".build" "\\.hex$")
+ (()
+ (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."))
--
2.41.0
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [bug#66217] [PATCH 09/22] gnu: Add qmk-firmware-ergodox-ez-dvorak-42-key.
2023-09-26 18:59 [bug#66217] [PATCH 00/22] Add ErgoDox firmware packages Maxim Cournoyer
` (7 preceding siblings ...)
2023-09-26 19:04 ` [bug#66217] [PATCH 08/22] gnu: Add qmk-firmware-ergodox-ez-default Maxim Cournoyer
@ 2023-09-26 19:04 ` Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 10/22] gnu: Add qmk-udev-rules Maxim Cournoyer
` (12 subsequent siblings)
21 siblings, 0 replies; 23+ messages in thread
From: Maxim Cournoyer @ 2023-09-26 19:04 UTC (permalink / raw)
To: 66217; +Cc: Maxim Cournoyer, Efraim Flashner, Vagrant Cascadian
* gnu/packages/firmware.scm (qmk-firmware-ergodox-ez-dvorak-42-key): New variable.
---
gnu/packages/firmware.scm | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/gnu/packages/firmware.scm b/gnu/packages/firmware.scm
index 7220177eadb..79ef0416b3d 100644
--- a/gnu/packages/firmware.scm
+++ b/gnu/packages/firmware.scm
@@ -1432,3 +1432,14 @@ (define-public qmk-firmware-ergodox-ez-default
keymap definition, or the
@url{https://configure.ergodox-ez.com/ergodox-ez/layouts/JwwW/latest/0,
ErgoDox EZ Configurator} page."))
+
+(define-public qmk-firmware-ergodox-ez-dvorak-42-key
+ (make-qmk-firmware "ergodox_ez" "dvorak_42_key" #:description "\
+This is a Dvorak-based layout for the ErgoDox EZ. Its basic key layout is
+similar to the Atreus @samp{dvorak_42_key} layout; in fact this layout was
+created for seamless switching between the ErgoDox EZ and Atreus keyboards.
+On the base layer, the keys that don't exist on the Atreus are mapped to MEH
+shortcuts and can be interpreted by your window managher. This layout only
+makes use of the 42 keys that the Atreus also has for the main functionality.
+See the @file{keyboards/atreus/keymaps/dvorak_42_key/keymap.c} source file for
+the keymap definition."))
--
2.41.0
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [bug#66217] [PATCH 10/22] gnu: Add qmk-udev-rules.
2023-09-26 18:59 [bug#66217] [PATCH 00/22] Add ErgoDox firmware packages Maxim Cournoyer
` (8 preceding siblings ...)
2023-09-26 19:04 ` [bug#66217] [PATCH 09/22] gnu: Add qmk-firmware-ergodox-ez-dvorak-42-key Maxim Cournoyer
@ 2023-09-26 19:04 ` Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 11/22] gnu: Add qmk-firmware-ergodox-ez-hacker-dvorak Maxim Cournoyer
` (11 subsequent siblings)
21 siblings, 0 replies; 23+ messages in thread
From: Maxim Cournoyer @ 2023-09-26 19:04 UTC (permalink / raw)
To: 66217; +Cc: Maxim Cournoyer, Efraim Flashner, Vagrant Cascadian
* gnu/packages/firmware.scm (qmk-udev-rules): New variable.
---
gnu/packages/firmware.scm | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/gnu/packages/firmware.scm b/gnu/packages/firmware.scm
index 79ef0416b3d..22be7ee62dd 100644
--- a/gnu/packages/firmware.scm
+++ b/gnu/packages/firmware.scm
@@ -1443,3 +1443,21 @@ (define-public qmk-firmware-ergodox-ez-dvorak-42-key
makes use of the 42 keys that the Atreus also has for the main functionality.
See the @file{keyboards/atreus/keymaps/dvorak_42_key/keymap.c} source file for
the keymap definition."))
+
+(define-public qmk-udev-rules
+ (package
+ (inherit qmk-firmware-ergodox-ez-default)
+ (name "qmk-udev-rules")
+ (build-system copy-build-system)
+ (arguments
+ '(#:install-plan '(("./util/udev" "lib/udev/rules.d"
+ #:include-regexp ("rules$")))))
+ (native-inputs '())
+ (inputs '())
+ (propagated-inputs '())
+ (synopsis "Udev rules for QMK Firmware")
+ (description
+ "This package provides a set of udev rules to specify the proper
+privileges for flashing QMK compatible devices without needing root. The
+rules require the group @code{plugdev} to be added to each user that needs
+this.")))
--
2.41.0
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [bug#66217] [PATCH 11/22] gnu: Add qmk-firmware-ergodox-ez-hacker-dvorak.
2023-09-26 18:59 [bug#66217] [PATCH 00/22] Add ErgoDox firmware packages Maxim Cournoyer
` (9 preceding siblings ...)
2023-09-26 19:04 ` [bug#66217] [PATCH 10/22] gnu: Add qmk-udev-rules Maxim Cournoyer
@ 2023-09-26 19:04 ` Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 12/22] gnu: Add qmk-firmware-ergodox-ez-dvorak Maxim Cournoyer
` (10 subsequent siblings)
21 siblings, 0 replies; 23+ messages in thread
From: Maxim Cournoyer @ 2023-09-26 19:04 UTC (permalink / raw)
To: 66217; +Cc: Maxim Cournoyer, Efraim Flashner, Vagrant Cascadian
* gnu/packages/firmware.scm (qmk-firmware-ergodox-ez-hacker-dvorak): New
variable.
* gnu/packages/patches/qmk-firmware-fix-hacker-dvorak.patch: New file.
* gnu/local.mk (dist_patch_DATA): Register it.
---
gnu/local.mk | 1 +
gnu/packages/firmware.scm | 25 ++++++++++++++++++-
.../qmk-firmware-fix-hacker-dvorak.patch | 15 +++++++++++
3 files changed, 40 insertions(+), 1 deletion(-)
create mode 100644 gnu/packages/patches/qmk-firmware-fix-hacker-dvorak.patch
diff --git a/gnu/local.mk b/gnu/local.mk
index bfa816d717c..c04c4196cdf 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1893,6 +1893,7 @@ dist_patch_DATA = \
%D%/packages/patches/quagga-reproducible-build.patch \
%D%/packages/patches/quickswitch-fix-dmenu-check.patch \
%D%/packages/patches/quilt-grep-compat.patch \
+ %D%/packages/patches/qmk-firmware-fix-hacker-dvorak.patch \
%D%/packages/patches/qtwayland-dont-recreate-callbacks.patch \
%D%/packages/patches/qtwayland-cleanup-callbacks.patch \
%D%/packages/patches/ragel-char-signedness.patch \
diff --git a/gnu/packages/firmware.scm b/gnu/packages/firmware.scm
index 22be7ee62dd..6a488d672ff 100644
--- a/gnu/packages/firmware.scm
+++ b/gnu/packages/firmware.scm
@@ -1340,7 +1340,9 @@ (define* (make-qmk-firmware/implementation keyboard keymap
(file-name (git-file-name "qmk-firmware" version))
(sha256
(base32
- "0s1lcnv7cddpn768p7mrc5bkxhx0ba5p77ya007dnkbk36c33d0w"))))
+ "0s1lcnv7cddpn768p7mrc5bkxhx0ba5p77ya007dnkbk36c33d0w"))
+ (patches
+ (search-patches "qmk-firmware-fix-hacker-dvorak.patch"))))
(build-system gnu-build-system)
(arguments
(list
@@ -1444,6 +1446,27 @@ (define-public qmk-firmware-ergodox-ez-dvorak-42-key
See the @file{keyboards/atreus/keymaps/dvorak_42_key/keymap.c} source file for
the keymap definition."))
+(define-public qmk-firmware-ergodox-ez-hacker-dvorak
+ (make-qmk-firmware "ergodox_ez" "hacker_dvorak" #:description "\
+This is a Dvorak layout for the ErgoDox EZ. It is inspired by the
+@url{https://www.kaufmann.no/roland/dvorak, Programmer Dvorak}. The operating
+system keyboard layout should be set to US for this keymap to function
+normally. It defines 10 layers:
+@enumerate
+@item Dvorak
+@item Querty
+@item Gaming
+@item Arrows
+@item Mouse
+@item Numpad
+@item Hyper Fn
+@item Media Fn
+@item Meh Fn
+@item Meh Fn +
+@end enumerate
+The complete keymap can be inspected at the ErgoDox EZ Configurator web site:
+@url{https://configure.ergodox-ez.com/ergodox-ez/layouts/Wadz/latest/0}."))
+
(define-public qmk-udev-rules
(package
(inherit qmk-firmware-ergodox-ez-default)
diff --git a/gnu/packages/patches/qmk-firmware-fix-hacker-dvorak.patch b/gnu/packages/patches/qmk-firmware-fix-hacker-dvorak.patch
new file mode 100644
index 00000000000..69e68cc8e12
--- /dev/null
+++ b/gnu/packages/patches/qmk-firmware-fix-hacker-dvorak.patch
@@ -0,0 +1,15 @@
+Submitted upstream: https://github.com/qmk/qmk_firmware/pull/22102
+
+diff --git a/keyboards/ergodox_ez/keymaps/hacker_dvorak/user/layer_set_state_user.c b/keyboards/ergodox_ez/keymaps/hacker_dvorak/user/layer_set_state_user.c
+index bd4fd10ad1..5ce5f5298f 100644
+--- a/keyboards/ergodox_ez/keymaps/hacker_dvorak/user/layer_set_state_user.c
++++ b/keyboards/ergodox_ez/keymaps/hacker_dvorak/user/layer_set_state_user.c
+@@ -4,7 +4,7 @@ layer_state_t layer_state_set_user(layer_state_t state) {
+
+ switch (layer) {
+ case DVORAK:
+- rgblight_sethsv_noeeprom(GREEN);
++ rgblight_sethsv_noeeprom(HSV_GREEN);
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
+
+ if (PLOVER_MODE) {
--
2.41.0
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [bug#66217] [PATCH 12/22] gnu: Add qmk-firmware-ergodox-ez-dvorak.
2023-09-26 18:59 [bug#66217] [PATCH 00/22] Add ErgoDox firmware packages Maxim Cournoyer
` (10 preceding siblings ...)
2023-09-26 19:04 ` [bug#66217] [PATCH 11/22] gnu: Add qmk-firmware-ergodox-ez-hacker-dvorak Maxim Cournoyer
@ 2023-09-26 19:04 ` Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 13/22] gnu: Add qmk-firmware-ergodox-ez-dvorak-emacs Maxim Cournoyer
` (9 subsequent siblings)
21 siblings, 0 replies; 23+ messages in thread
From: Maxim Cournoyer @ 2023-09-26 19:04 UTC (permalink / raw)
To: 66217; +Cc: Maxim Cournoyer, Efraim Flashner, Vagrant Cascadian
* gnu/packages/firmware.scm (qmk-firmware-ergodox-ez-dvorak): New variable.
---
gnu/packages/firmware.scm | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/gnu/packages/firmware.scm b/gnu/packages/firmware.scm
index 6a488d672ff..ecbab94eda5 100644
--- a/gnu/packages/firmware.scm
+++ b/gnu/packages/firmware.scm
@@ -1467,6 +1467,14 @@ (define-public qmk-firmware-ergodox-ez-hacker-dvorak
The complete keymap can be inspected at the ErgoDox EZ Configurator web site:
@url{https://configure.ergodox-ez.com/ergodox-ez/layouts/Wadz/latest/0}."))
+(define-public qmk-firmware-ergodox-ez-dvorak
+ (make-qmk-firmware
+ "ergodox_ez" "dvorak" #:description
+ "This is a rather plain Dvorak layout for the ErgoDox EZ, containing
+function and symbols on layer 1 and media and and mouse keys on layer 2. See
+the @file{layouts/community/ergodox/dvorak/keymap.c} source file for the
+keymap definition."))
+
(define-public qmk-udev-rules
(package
(inherit qmk-firmware-ergodox-ez-default)
--
2.41.0
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [bug#66217] [PATCH 13/22] gnu: Add qmk-firmware-ergodox-ez-dvorak-emacs.
2023-09-26 18:59 [bug#66217] [PATCH 00/22] Add ErgoDox firmware packages Maxim Cournoyer
` (11 preceding siblings ...)
2023-09-26 19:04 ` [bug#66217] [PATCH 12/22] gnu: Add qmk-firmware-ergodox-ez-dvorak Maxim Cournoyer
@ 2023-09-26 19:04 ` Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 14/22] gnu: Add qmk-firmware-ergodox-ez-dvorak-emacs-software Maxim Cournoyer
` (8 subsequent siblings)
21 siblings, 0 replies; 23+ messages in thread
From: Maxim Cournoyer @ 2023-09-26 19:04 UTC (permalink / raw)
To: 66217; +Cc: Maxim Cournoyer, Efraim Flashner, Vagrant Cascadian
* gnu/packages/firmware.scm (qmk-firmware-ergodox-ez-dvorak-emacs): New variable.
---
gnu/packages/firmware.scm | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/gnu/packages/firmware.scm b/gnu/packages/firmware.scm
index ecbab94eda5..19dc12a8fce 100644
--- a/gnu/packages/firmware.scm
+++ b/gnu/packages/firmware.scm
@@ -1475,6 +1475,15 @@ (define-public qmk-firmware-ergodox-ez-dvorak
the @file{layouts/community/ergodox/dvorak/keymap.c} source file for the
keymap definition."))
+(define-public qmk-firmware-ergodox-ez-dvorak-emacs
+ (make-qmk-firmware
+ "ergodox_ez" "dvorak_emacs" #:description
+ "This is a Dvorak-based keymap optimized for Emacs usage, with the
+frequently used Control and Meta (Alt) keys mapped to the thumb buttons. It
+contains a single extra layer that includes function and multimedia keys. A
+graphical representation of the keymap is available in the
+@file{layouts/community/ergodox/dvorak_emacs/readme.md} source file."))
+
(define-public qmk-udev-rules
(package
(inherit qmk-firmware-ergodox-ez-default)
--
2.41.0
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [bug#66217] [PATCH 14/22] gnu: Add qmk-firmware-ergodox-ez-dvorak-emacs-software.
2023-09-26 18:59 [bug#66217] [PATCH 00/22] Add ErgoDox firmware packages Maxim Cournoyer
` (12 preceding siblings ...)
2023-09-26 19:04 ` [bug#66217] [PATCH 13/22] gnu: Add qmk-firmware-ergodox-ez-dvorak-emacs Maxim Cournoyer
@ 2023-09-26 19:04 ` Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 15/22] gnu: Add ergodox-firmware-colemak-jc-mod Maxim Cournoyer
` (7 subsequent siblings)
21 siblings, 0 replies; 23+ messages in thread
From: Maxim Cournoyer @ 2023-09-26 19:04 UTC (permalink / raw)
To: 66217; +Cc: Maxim Cournoyer, Efraim Flashner, Vagrant Cascadian
* gnu/packages/firmware.scm
(qmk-firmware-ergodox-ez-dvorak-emacs-software): New variable.
---
gnu/packages/firmware.scm | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/gnu/packages/firmware.scm b/gnu/packages/firmware.scm
index 19dc12a8fce..a7428df8129 100644
--- a/gnu/packages/firmware.scm
+++ b/gnu/packages/firmware.scm
@@ -1484,6 +1484,14 @@ (define-public qmk-firmware-ergodox-ez-dvorak-emacs
graphical representation of the keymap is available in the
@file{layouts/community/ergodox/dvorak_emacs/readme.md} source file."))
+(define-public qmk-firmware-ergodox-ez-dvorak-emacs-software
+ (make-qmk-firmware
+ "ergodox_ez" "dvorak_emacs_software" #:description
+ "This is the same layout as that of the
+@code{qmk-firmware-ergodox-ez-dvorak-emacs}, but designed to be used with a
+Dvorak-configured operating system (instead of a US QWERTY one, which is the
+default assumption for QMK firmware keymaps)."))
+
(define-public qmk-udev-rules
(package
(inherit qmk-firmware-ergodox-ez-default)
--
2.41.0
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [bug#66217] [PATCH 15/22] gnu: Add ergodox-firmware-colemak-jc-mod.
2023-09-26 18:59 [bug#66217] [PATCH 00/22] Add ErgoDox firmware packages Maxim Cournoyer
` (13 preceding siblings ...)
2023-09-26 19:04 ` [bug#66217] [PATCH 14/22] gnu: Add qmk-firmware-ergodox-ez-dvorak-emacs-software Maxim Cournoyer
@ 2023-09-26 19:04 ` Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 16/22] gnu: Add ergodox-firmware-colemak-symbol-mod Maxim Cournoyer
` (6 subsequent siblings)
21 siblings, 0 replies; 23+ messages in thread
From: Maxim Cournoyer @ 2023-09-26 19:04 UTC (permalink / raw)
To: 66217; +Cc: Maxim Cournoyer, Efraim Flashner, Vagrant Cascadian
* gnu/packages/firmware.scm (make-ergodox-firmware): New procedure
(ergodox-firmware-colemak-jc-mod): New variable.
* gnu/packages/patches/ergodox-firmware-fix-json-target.patch: New file.
* gnu/packages/patches/ergodox-firmware-fix-numpad.patch: Likewise.
* gnu/local.mk (dist_patch_DATA): Register them.
---
gnu/local.mk | 2 +
gnu/packages/firmware.scm | 77 +-
.../ergodox-firmware-fix-json-target.patch | 1405 +++++++++++++++++
.../patches/ergodox-firmware-fix-numpad.patch | 18 +
4 files changed, 1501 insertions(+), 1 deletion(-)
create mode 100644 gnu/packages/patches/ergodox-firmware-fix-json-target.patch
create mode 100644 gnu/packages/patches/ergodox-firmware-fix-numpad.patch
diff --git a/gnu/local.mk b/gnu/local.mk
index c04c4196cdf..052e6f2013c 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1120,6 +1120,8 @@ dist_patch_DATA = \
%D%/packages/patches/enblend-enfuse-reproducible.patch \
%D%/packages/patches/enjarify-setup-py.patch \
%D%/packages/patches/enlightenment-fix-setuid-path.patch \
+ %D%/packages/patches/ergodox-firmware-fix-json-target.patch \
+ %D%/packages/patches/ergodox-firmware-fix-numpad.patch \
%D%/packages/patches/erlang-man-path.patch \
%D%/packages/patches/esmini-no-clutter-log.patch \
%D%/packages/patches/esmini-use-pkgconfig.patch \
diff --git a/gnu/packages/firmware.scm b/gnu/packages/firmware.scm
index a7428df8129..a901ae46944 100644
--- a/gnu/packages/firmware.scm
+++ b/gnu/packages/firmware.scm
@@ -85,7 +85,8 @@ (define-module (gnu packages firmware)
#:use-module (ice-9 format)
#:use-module (ice-9 match)
- #:export (make-qmk-firmware))
+ #:export (make-ergodox-firmware
+ make-qmk-firmware))
(define-public ath9k-htc-firmware
(package
@@ -1222,6 +1223,80 @@ (define-public crust-pinebook
(define-public crust-pine64-plus
(make-crust-package "pine64_plus"))
+\f
+;;;
+;;; ErgoDox firmware.
+;;;
+
+(define* (make-ergodox-firmware/implementation layout #:key override.c
+ override.h)
+ "Return an ergodox-firmware package for LAYOUT, optionally using OVERRIDE.C,
+a C source file-like object to override LAYOUT which may be accompanied by
+OVERRIDE.H, to also override the corresponding layout include file."
+ (let ((revision "0")
+ (commit "89b7e2bfdafb2a87e0248846d5c95cc5e9a27858"))
+ (package
+ (name (string-append "ergodox-firmware-" layout))
+ (version (git-version "1" revision commit))
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/benblazak/ergodox-firmware")
+ (commit commit)))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "1z28frxyb21nz90frycrpsbxjp09374wawayvjphnwc8njlvkkpy"))
+ (patches
+ (search-patches "ergodox-firmware-fix-json-target.patch"
+ "ergodox-firmware-fix-numpad.patch"))))
+ (build-system gnu-build-system)
+ (arguments
+ (list
+ #:tests? #f ;no test suite
+ #:make-flags
+ #~(list (string-append "LAYOUT=" #$layout)
+ ;; Simplify the output directory name.
+ "ROOT=output")
+ #:phases
+ #~(modify-phases %standard-phases
+ (add-after 'unpack 'copy-override-files
+ (lambda _
+ (when #$override.c
+ (copy-file #$override.c
+ (format #f "src/keyboard/ergodox/layout/~a.c"
+ #$layout)))
+ (when #$override.h
+ (copy-file #$override.h
+ (format #f "src/keyboard/ergodox/layout/~a.h"
+ #$layout)))))
+ ;; The Makefile-based build system lacks configure
+ ;; and install targets.
+ (delete 'configure)
+ (replace 'install
+ (lambda _
+ (with-directory-excursion "output"
+ (install-file "firmware.hex" #$output)
+ (install-file "firmware.eep" #$output)
+ (install-file "firmware--layout.html" #$output)))))))
+ (native-inputs (list (make-avr-toolchain) python))
+ (home-page "https://www.ergodox.io")
+ (synopsis "Firmware for the ErgoDox keyboard")
+ (description (format #f "This package contains the original firmware for
+the ErgoDox keyboard, built using the ~a layout (as defined in the
+@file{src/keyboard/ergodox/layout/~@*~a.c} source file). It contains the
+@file{firmware.hex} and the @file{firmware.eep} files, which can be loaded to
+a target using the @code{teensy-loader-cli} package as well as a
+@file{firmware--layout.html} file, useful to easily visualize the
+corresponding layout." layout))
+ (license license:expat))))
+
+(define make-ergodox-firmware
+ (memoize make-ergodox-firmware/implementation))
+
+(define-public ergodox-firmware-colemak-jc-mod
+ (make-ergodox-firmware "colemak-jc-mod"))
+
\f
;;;
;;; QMK Firmware.
diff --git a/gnu/packages/patches/ergodox-firmware-fix-json-target.patch b/gnu/packages/patches/ergodox-firmware-fix-json-target.patch
new file mode 100644
index 00000000000..52da4e2497d
--- /dev/null
+++ b/gnu/packages/patches/ergodox-firmware-fix-json-target.patch
@@ -0,0 +1,1405 @@
+Submitted upstream:
+<https://github.com/benblazak/ergodox-firmware/pull/99>
+<https://github.com/benblazak/ergodox-firmware/pull/98>
+
+diff --git a/build-scripts/gen-layout.py b/build-scripts/gen-layout.py
+index fd5e54c..251a463 100755
+--- a/build-scripts/gen-layout.py
++++ b/build-scripts/gen-layout.py
+@@ -22,8 +22,10 @@ import sys
+
+ # -----------------------------------------------------------------------------
+
+-class Namespace():
+- pass
++
++class Namespace:
++ pass
++
+
+ template = Namespace()
+ doc = Namespace()
+@@ -31,45 +33,45 @@ info = Namespace()
+
+ # -----------------------------------------------------------------------------
+
++
+ def main():
+- arg_parser = argparse.ArgumentParser(
+- description = "Generate a picture of the firmware's "
+- + "keyboard layout" )
++ arg_parser = argparse.ArgumentParser(
++ description="Generate a picture of the firmware's " + "keyboard layout"
++ )
+
+- arg_parser.add_argument(
+- '--ui-info-file',
+- required = True )
++ arg_parser.add_argument("--ui-info-file", required=True)
+
+- args = arg_parser.parse_args(sys.argv[1:])
++ args = arg_parser.parse_args(sys.argv[1:])
+
+- # constant file paths
+- args.template_svg_file = './build-scripts/gen_layout/template.svg'
+- args.template_js_file = './build-scripts/gen_layout/template.js'
++ # constant file paths
++ args.template_svg_file = "./build-scripts/gen_layout/template.svg"
++ args.template_js_file = "./build-scripts/gen_layout/template.js"
+
+- # normalize paths
+- args.ui_info_file = os.path.abspath(args.ui_info_file)
+- args.template_svg_file = os.path.abspath(args.template_svg_file)
+- args.template_js_file = os.path.abspath(args.template_js_file)
++ # normalize paths
++ args.ui_info_file = os.path.abspath(args.ui_info_file)
++ args.template_svg_file = os.path.abspath(args.template_svg_file)
++ args.template_js_file = os.path.abspath(args.template_js_file)
+
+- # set vars
+- doc.main = '' # to store the html document we're generating
+- template.svg = open(args.template_svg_file).read()
+- template.js = open(args.template_js_file).read()
+- info.all = json.loads(open(args.ui_info_file).read())
++ # set vars
++ doc.main = "" # to store the html document we're generating
++ template.svg = open(args.template_svg_file).read()
++ template.js = open(args.template_js_file).read()
++ info.all = json.loads(open(args.ui_info_file).read())
+
+- info.matrix_positions = info.all['mappings']['matrix-positions']
+- info.matrix_layout = info.all['mappings']['matrix-layout']
++ info.matrix_positions = info.all["mappings"]["matrix-positions"]
++ info.matrix_layout = info.all["mappings"]["matrix-layout"]
+
+- # prefix
+- doc.prefix = ("""
++ # prefix
++ doc.prefix = (
++ """
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
+ <html>
+
+ <head>
+ <script>
+ """
+-+ template.js +
+-""" </script>
++ + template.js
++ + """ </script>
+ </head>
+
+ <body>
+@@ -78,9 +80,13 @@ def main():
+
+ <ul>
+ <li>git commit date:
+- <code>""" + info.all['miscellaneous']['git-commit-date'] + """</code></li>
++ <code>"""
++ + info.all["miscellaneous"]["git-commit-date"]
++ + """</code></li>
+ <li>git commit id:
+- <code>""" + info.all['miscellaneous']['git-commit-id'] + """</code></li>
++ <code>"""
++ + info.all["miscellaneous"]["git-commit-id"]
++ + """</code></li>
+ </ul>
+
+ <h2>Notes</h2>
+@@ -123,301 +129,293 @@ def main():
+
+ <br>
+
+-""")[1:-1]
++"""
++ )[1:-1]
+
+- # suffix
+- doc.suffix = ("""
++ # suffix
++ doc.suffix = (
++ """
+ </body>
+ </html>
+
+-""")[1:-1]
+-
+- # substitute into template
+- # -------
+- # note: this is not general enough to handle any possible layout well, at
+- # the moment. but it should handle more standard ones well. (hopefully
+- # minor) modifications may be necessary on a case by case basis
+- # -------
+- layer_number = -1
+- for (layout, layer) in zip( info.matrix_layout,
+- range(len(info.matrix_layout))):
+- layer_number += 1
+- svg = template.svg
+- for (name, (code, press, release)) \
+- in zip(info.matrix_positions, layout):
+- replace = ''
+- if press == 'kbfun_transparent':
+- replace = ''
+- elif press == 'kbfun_shift_press_release':
+- replace = 'sh ' + keycode_to_string.get(code, '[n/a]')
+- elif press == 'kbfun_jump_to_bootloader':
+- replace = '[btldr]'
+- elif press == 'NULL' and release == 'NULL':
+- replace = '(null)'
+- elif re.search(r'numpad', press+release):
+- replace = '[num]'
+- elif re.search(r'layer', press+release):
+- replace = 'la ' + re.findall(r'\d+', press+release)[0] + ' '
+- if re.search(r'push', press+release):
+- replace += '+'
+- if re.search(r'pop', press+release):
+- replace += '-'
+- replace += ' ' + str(code)
+- else:
+- replace = keycode_to_string.get(code, '[n/a]')
+-
+- svg = re.sub(
+- '>'+name+'<', '>'+replace+'<', svg )
+- svg = re.sub(
+- r"\('(" + name + r".*)'\)",
+- r"('\1', " + str(layer) + r")",
+- svg )
+-
+- doc.main += '<h2>Layer ' + str(layer_number) + '</h2>\n' + svg
+-
+- # change the font size
+- doc.main = re.sub(r'22.5px', '15px', doc.main)
+-
+- print(doc.prefix + doc.main + doc.suffix)
++"""
++ )[1:-1]
++
++ # substitute into template
++ # -------
++ # note: this is not general enough to handle any possible layout well, at
++ # the moment. but it should handle more standard ones well. (hopefully
++ # minor) modifications may be necessary on a case by case basis
++ # -------
++ layer_number = -1
++ for (layout, layer) in zip(
++ info.matrix_layout, range(len(info.matrix_layout))
++ ):
++ layer_number += 1
++ svg = template.svg
++ for (name, (code, press, release)) in zip(
++ info.matrix_positions, layout
++ ):
++ replace = ""
++ if press == "kbfun_transparent":
++ replace = ""
++ elif press == "kbfun_shift_press_release":
++ replace = "sh " + keycode_to_string.get(code, "[n/a]")
++ elif press == "kbfun_jump_to_bootloader":
++ replace = "[btldr]"
++ elif press == "NULL" and release == "NULL":
++ replace = "(null)"
++ elif re.search(r"numpad", press + release):
++ replace = "[num]"
++ elif re.search(r"layer", press + release):
++ replace = "la " + re.findall(r"\d+", press + release)[0] + " "
++ if re.search(r"push", press + release):
++ replace += "+"
++ if re.search(r"pop", press + release):
++ replace += "-"
++ replace += " " + str(code)
++ else:
++ replace = keycode_to_string.get(code, "[n/a]")
++
++ svg = re.sub(">" + name + "<", ">" + replace + "<", svg)
++ svg = re.sub(
++ r"\('(" + name + r".*)'\)", r"('\1', " + str(layer) + r")", svg
++ )
++
++ doc.main += "<h2>Layer " + str(layer_number) + "</h2>\n" + svg
++
++ # change the font size
++ doc.main = re.sub(r"22.5px", "15px", doc.main)
++
++ print(doc.prefix + doc.main + doc.suffix)
++
+
+ # -----------------------------------------------------------------------------
+ # -----------------------------------------------------------------------------
+
+ keycode_to_string = {
+- 0x01: "Error", # ErrorRollOver
+- 0x02: "POSTFail",
+- 0x03: "Error", # ErrorUndefined
+- 0x04: "a A",
+- 0x05: "b B",
+- 0x06: "c C",
+- 0x07: "d D",
+- 0x08: "e E",
+- 0x09: "f F",
+- 0x0A: "g G",
+- 0x0B: "h H",
+- 0x0C: "i I",
+- 0x0D: "j J",
+- 0x0E: "k K",
+- 0x0F: "l L",
+- 0x10: "m M",
+- 0x11: "n N",
+- 0x12: "o O",
+- 0x13: "p P",
+- 0x14: "q Q",
+- 0x15: "r R",
+- 0x16: "s S",
+- 0x17: "t T",
+- 0x18: "u U",
+- 0x19: "v V",
+- 0x1A: "w W",
+- 0x1B: "x X",
+- 0x1C: "y Y",
+- 0x1D: "z Z",
+- 0x1E: "1 !",
+- 0x1F: "2 @",
+- 0x20: "3 #",
+- 0x21: "4 $",
+- 0x22: "5 %",
+- 0x23: "6 ^",
+- 0x24: "7 &",
+- 0x25: "8 *",
+- 0x26: "9 (",
+- 0x27: "0 )",
+- 0x28: "Return",
+- 0x29: "Esc",
+- 0x2A: "Backspace",
+- 0x2B: "Tab",
+- 0x2C: "Space",
+- 0x2D: "- _",
+- 0x2E: "= +",
+- 0x2F: "[ {",
+- 0x30: "] }",
+- 0x31: "\ |",
+- 0x32: "# ~",
+- 0x33: "; :",
+- 0x34: "\' \"",
+- 0x35: "` ~",
+- 0x36: ", <",
+- 0x37: ". >",
+- 0x38: "/ ?",
+- 0x39: "Caps",
+- 0x3A: "F1",
+- 0x3B: "F2",
+- 0x3C: "F3",
+- 0x3D: "F4",
+- 0x3E: "F5",
+- 0x3F: "F6",
+- 0x40: "F7",
+- 0x41: "F8",
+- 0x42: "F9",
+- 0x43: "F10",
+- 0x44: "F11",
+- 0x45: "F12",
+- 0x46: "PrintScreen",
+- 0x47: "ScrollLock",
+- 0x48: "Pause",
+- 0x49: "Ins", # Insert
+- 0x4A: "Hm", # Home
+- 0x4B: "Pg\u2191", # up arrow
+- 0x4C: "Delete",
+- 0x4D: "End",
+- 0x4E: "Pg\u2193", # down arrow
+- 0x4F: "\u2192", # right arrow
+- 0x50: "\u2190", # left arrow
+- 0x51: "\u2193", # down arrow
+- 0x52: "\u2191", # up arrow
+-
+- 0x53: "Num",
+- 0x54: "/",
+- 0x55: "*",
+- 0x56: "-",
+- 0x57: "+",
+- 0x58: "Enter",
+- 0x59: "1 End",
+- 0x5A: "2 \u2193", # down arrow
+- 0x5B: "3 Pg\u2193", # down arrow
+- 0x5C: "4 \u2190", # left arrow
+- 0x5D: "5",
+- 0x5E: "6 \u2192", # right arrow
+- 0x5F: "7 Hm", # Home
+- 0x60: "8 \u2191", # up arrow
+- 0x61: "9 Pg\u2191", # up arrow
+- 0x62: "0 Ins", # Insert
+- 0x63: ". Del",
+-
+- 0x64: "\ |",
+- 0x65: "App",
+- 0x66: "Power",
+-
+- 0x67: "=",
+-
+- 0x68: "F13",
+- 0x69: "F14",
+- 0x6A: "F15",
+- 0x6B: "F16",
+- 0x6C: "F17",
+- 0x6D: "F18",
+- 0x6E: "F19",
+- 0x6F: "F20",
+- 0x70: "F21",
+- 0x71: "F22",
+- 0x72: "F23",
+- 0x73: "F24",
+- 0x74: "Exec",
+- 0x75: "Help",
+- 0x76: "Menu",
+- 0x77: "Select",
+- 0x78: "Stop",
+- 0x79: "Again",
+- 0x7A: "Undo",
+- 0x7B: "Cut",
+- 0x7C: "Copy",
+- 0x7D: "Paste",
+- 0x7E: "Find",
+- 0x7F: "Mute",
+- 0x80: "VolUp",
+- 0x81: "VolDown",
+- 0x82: "LockingCapsLock",
+- 0x83: "LockingNumLock",
+- 0x84: "LockingScrollLock",
+-
+- 0x85: ",",
+- 0x86: "=",
+-
+- 0x87: "Int1",
+- 0x88: "Int2",
+- 0x89: "Int3",
+- 0x8A: "Int4",
+- 0x8B: "Int5",
+- 0x8C: "Int6",
+- 0x8D: "Int7",
+- 0x8E: "Int8",
+- 0x8F: "Int9",
+- 0x90: "LANG1",
+- 0x91: "LANG2",
+- 0x92: "LANG3",
+- 0x93: "LANG4",
+- 0x94: "LANG5",
+- 0x95: "LANG6",
+- 0x96: "LANG7",
+- 0x97: "LANG8",
+- 0x98: "LANG9",
+- 0x99: "AlternateErase",
+- 0x9A: "SysReq_Attention",
+- 0x9B: "Cancel",
+- 0x9C: "Clear",
+- 0x9D: "Prior",
+- 0x9E: "Return",
+- 0x9F: "Separator",
+- 0xA0: "Out",
+- 0xA1: "Oper",
+- 0xA2: "Clear_Again",
+- 0xA3: "CrSel_Props",
+- 0xA4: "ExSel",
+-
+- 0xB0: "00",
+- 0xB1: "000",
+-
+- 0xB2: "Thousands_Sep",
+- 0xB3: "Decimal_Sep",
+- 0xB4: "$",
+- 0xB5: "Currency_Subunit",
+-
+- 0xB6: "(",
+- 0xB7: ")",
+- 0xB8: "{",
+- 0xB9: "}",
+-
+- 0xBA: "Tab",
+- 0xBB: "Backspace",
+- 0xBC: "A",
+- 0xBD: "B",
+- 0xBE: "C",
+- 0xBF: "D",
+- 0xC0: "E",
+- 0xC1: "F",
+- 0xC2: "XOR",
+- 0xC3: "^",
+- 0xC4: "%",
+- 0xC5: "<",
+- 0xC6: ">",
+- 0xC7: "&",
+- 0xC8: "&&",
+- 0xC9: "|",
+- 0xCA: "||",
+- 0xCB: ":",
+- 0xCC: "#",
+- 0xCD: "Space",
+- 0xCE: "@",
+- 0xCF: "!",
+- 0xD0: "Mem_Store",
+- 0xD1: "Mem_Recall",
+- 0xD2: "Mem_Clear",
+- 0xD3: "Mem_+",
+- 0xD4: "Mem_-",
+- 0xD5: "Mem_*",
+- 0xD6: "Mem_/",
+- 0xD7: "+-",
+- 0xD8: "Clear",
+- 0xD9: "ClearEntry",
+- 0xDA: "Binary",
+- 0xDB: "Octal",
+- 0xDC: ".",
+- 0xDD: "Hexadecimal",
+-
+- 0xE0: "L-Ctrl",
+- 0xE1: "L-Shift",
+- 0xE2: "L-Alt",
+- 0xE3: "L-GUI",
+- 0xE4: "R-Ctrl",
+- 0xE5: "R-Shift",
+- 0xE6: "R-Alt",
+- 0xE7: "R-GUI",
+- }
++ 0x01: "Error", # ErrorRollOver
++ 0x02: "POSTFail",
++ 0x03: "Error", # ErrorUndefined
++ 0x04: "a A",
++ 0x05: "b B",
++ 0x06: "c C",
++ 0x07: "d D",
++ 0x08: "e E",
++ 0x09: "f F",
++ 0x0A: "g G",
++ 0x0B: "h H",
++ 0x0C: "i I",
++ 0x0D: "j J",
++ 0x0E: "k K",
++ 0x0F: "l L",
++ 0x10: "m M",
++ 0x11: "n N",
++ 0x12: "o O",
++ 0x13: "p P",
++ 0x14: "q Q",
++ 0x15: "r R",
++ 0x16: "s S",
++ 0x17: "t T",
++ 0x18: "u U",
++ 0x19: "v V",
++ 0x1A: "w W",
++ 0x1B: "x X",
++ 0x1C: "y Y",
++ 0x1D: "z Z",
++ 0x1E: "1 !",
++ 0x1F: "2 @",
++ 0x20: "3 #",
++ 0x21: "4 $",
++ 0x22: "5 %",
++ 0x23: "6 ^",
++ 0x24: "7 &",
++ 0x25: "8 *",
++ 0x26: "9 (",
++ 0x27: "0 )",
++ 0x28: "Return",
++ 0x29: "Esc",
++ 0x2A: "Backspace",
++ 0x2B: "Tab",
++ 0x2C: "Space",
++ 0x2D: "- _",
++ 0x2E: "= +",
++ 0x2F: "[ {",
++ 0x30: "] }",
++ 0x31: "\ |",
++ 0x32: "# ~",
++ 0x33: "; :",
++ 0x34: "' \"",
++ 0x35: "` ~",
++ 0x36: ", <",
++ 0x37: ". >",
++ 0x38: "/ ?",
++ 0x39: "Caps",
++ 0x3A: "F1",
++ 0x3B: "F2",
++ 0x3C: "F3",
++ 0x3D: "F4",
++ 0x3E: "F5",
++ 0x3F: "F6",
++ 0x40: "F7",
++ 0x41: "F8",
++ 0x42: "F9",
++ 0x43: "F10",
++ 0x44: "F11",
++ 0x45: "F12",
++ 0x46: "PrintScreen",
++ 0x47: "ScrollLock",
++ 0x48: "Pause",
++ 0x49: "Ins", # Insert
++ 0x4A: "Hm", # Home
++ 0x4B: "Pg\u2191", # up arrow
++ 0x4C: "Delete",
++ 0x4D: "End",
++ 0x4E: "Pg\u2193", # down arrow
++ 0x4F: "\u2192", # right arrow
++ 0x50: "\u2190", # left arrow
++ 0x51: "\u2193", # down arrow
++ 0x52: "\u2191", # up arrow
++ 0x53: "Num",
++ 0x54: "/",
++ 0x55: "*",
++ 0x56: "-",
++ 0x57: "+",
++ 0x58: "Enter",
++ 0x59: "1 End",
++ 0x5A: "2 \u2193", # down arrow
++ 0x5B: "3 Pg\u2193", # down arrow
++ 0x5C: "4 \u2190", # left arrow
++ 0x5D: "5",
++ 0x5E: "6 \u2192", # right arrow
++ 0x5F: "7 Hm", # Home
++ 0x60: "8 \u2191", # up arrow
++ 0x61: "9 Pg\u2191", # up arrow
++ 0x62: "0 Ins", # Insert
++ 0x63: ". Del",
++ 0x64: "\ |",
++ 0x65: "App",
++ 0x66: "Power",
++ 0x67: "=",
++ 0x68: "F13",
++ 0x69: "F14",
++ 0x6A: "F15",
++ 0x6B: "F16",
++ 0x6C: "F17",
++ 0x6D: "F18",
++ 0x6E: "F19",
++ 0x6F: "F20",
++ 0x70: "F21",
++ 0x71: "F22",
++ 0x72: "F23",
++ 0x73: "F24",
++ 0x74: "Exec",
++ 0x75: "Help",
++ 0x76: "Menu",
++ 0x77: "Select",
++ 0x78: "Stop",
++ 0x79: "Again",
++ 0x7A: "Undo",
++ 0x7B: "Cut",
++ 0x7C: "Copy",
++ 0x7D: "Paste",
++ 0x7E: "Find",
++ 0x7F: "Mute",
++ 0x80: "VolUp",
++ 0x81: "VolDown",
++ 0x82: "LockingCapsLock",
++ 0x83: "LockingNumLock",
++ 0x84: "LockingScrollLock",
++ 0x85: ",",
++ 0x86: "=",
++ 0x87: "Int1",
++ 0x88: "Int2",
++ 0x89: "Int3",
++ 0x8A: "Int4",
++ 0x8B: "Int5",
++ 0x8C: "Int6",
++ 0x8D: "Int7",
++ 0x8E: "Int8",
++ 0x8F: "Int9",
++ 0x90: "LANG1",
++ 0x91: "LANG2",
++ 0x92: "LANG3",
++ 0x93: "LANG4",
++ 0x94: "LANG5",
++ 0x95: "LANG6",
++ 0x96: "LANG7",
++ 0x97: "LANG8",
++ 0x98: "LANG9",
++ 0x99: "AlternateErase",
++ 0x9A: "SysReq_Attention",
++ 0x9B: "Cancel",
++ 0x9C: "Clear",
++ 0x9D: "Prior",
++ 0x9E: "Return",
++ 0x9F: "Separator",
++ 0xA0: "Out",
++ 0xA1: "Oper",
++ 0xA2: "Clear_Again",
++ 0xA3: "CrSel_Props",
++ 0xA4: "ExSel",
++ 0xB0: "00",
++ 0xB1: "000",
++ 0xB2: "Thousands_Sep",
++ 0xB3: "Decimal_Sep",
++ 0xB4: "$",
++ 0xB5: "Currency_Subunit",
++ 0xB6: "(",
++ 0xB7: ")",
++ 0xB8: "{",
++ 0xB9: "}",
++ 0xBA: "Tab",
++ 0xBB: "Backspace",
++ 0xBC: "A",
++ 0xBD: "B",
++ 0xBE: "C",
++ 0xBF: "D",
++ 0xC0: "E",
++ 0xC1: "F",
++ 0xC2: "XOR",
++ 0xC3: "^",
++ 0xC4: "%",
++ 0xC5: "<",
++ 0xC6: ">",
++ 0xC7: "&",
++ 0xC8: "&&",
++ 0xC9: "|",
++ 0xCA: "||",
++ 0xCB: ":",
++ 0xCC: "#",
++ 0xCD: "Space",
++ 0xCE: "@",
++ 0xCF: "!",
++ 0xD0: "Mem_Store",
++ 0xD1: "Mem_Recall",
++ 0xD2: "Mem_Clear",
++ 0xD3: "Mem_+",
++ 0xD4: "Mem_-",
++ 0xD5: "Mem_*",
++ 0xD6: "Mem_/",
++ 0xD7: "+-",
++ 0xD8: "Clear",
++ 0xD9: "ClearEntry",
++ 0xDA: "Binary",
++ 0xDB: "Octal",
++ 0xDC: ".",
++ 0xDD: "Hexadecimal",
++ 0xE0: "L-Ctrl",
++ 0xE1: "L-Shift",
++ 0xE2: "L-Alt",
++ 0xE3: "L-GUI",
++ 0xE4: "R-Ctrl",
++ 0xE5: "R-Shift",
++ 0xE6: "R-Alt",
++ 0xE7: "R-GUI",
++}
+
+ # -----------------------------------------------------------------------------
+ # -----------------------------------------------------------------------------
+
+-if __name__ == '__main__':
+- main()
+-
++if __name__ == "__main__":
++ main()
+diff --git a/build-scripts/gen-ui-info.py b/build-scripts/gen-ui-info.py
+index 1c93d32..0fa52e3 100755
+--- a/build-scripts/gen-ui-info.py
++++ b/build-scripts/gen-ui-info.py
+@@ -13,7 +13,16 @@ Depends on:
+ - the project '.map' file (generated by the compiler)
+ """
+
+-_FORMAT_DESCRIPTION = ("""
++import argparse
++import json
++import os
++import pathlib
++import re
++import subprocess
++import sys
++
++_FORMAT_DESCRIPTION = (
++ """
+ /* ----------------------------------------------------------------------------
+ * Version 0
+ * ----------------------------------------------------------------------------
+@@ -31,7 +40,7 @@ var ui_info = {
+ ".meta-data": { // for the JSON file
+ "version": "<number>",
+ "date-generated": "<string>", // format: RFC 3339
+- "description": "<string>",
++ "description": "<string>",
+ },
+ "keyboard-functions": {
+ "<(function name)>": {
+@@ -57,7 +66,7 @@ var ui_info = {
+ "..."
+ },
+ "mappings": {
+- /*
++ /*
+ * The mappings prefixed with 'matrix' have their elements in the same
+ * order as the .hex file (whatever order that is). The mappings
+ * prefixed with 'physical' will have their elements in an order
+@@ -113,365 +122,304 @@ var ui_info = {
+ "number-of-layers": "<number>"
+ }
+ }
+-""")[1:-1]
++"""
++)[1:-1]
+
+ # -----------------------------------------------------------------------------
+
+-import argparse
+-import json
+-import os
+-import re
+-import subprocess
+-import sys
+-
+-# -----------------------------------------------------------------------------
+
+ def gen_static(current_date=None, git_commit_date=None, git_commit_id=None):
+- """Generate static information"""
+-
+- return {
+- '.meta-data': {
+- 'version': 0, # the format version number
+- 'date-generated': current_date,
+- 'description': _FORMAT_DESCRIPTION,
+- },
+- 'miscellaneous': {
+- 'git-commit-date': git_commit_date, # should be passed by makefile
+- 'git-commit-id': git_commit_id, # should be passed by makefile
+- },
+- }
+-
+-def gen_derived(data):
+- return {} # don't really need this info anymore
+-# """
+-# Generate derived information
+-# Should be called last
+-# """
+-# return {
+-# 'miscellaneous': {
+-# 'number-of-layers':
+-# int( data['layout-matrices']['_kb_layout']['length']/(6*14) ),
+-# # because 6*14 is the number of bytes/layer for '_kb_layout'
+-# # (which is a uint8_t matrix)
+-# },
+-# }
+-
+-# -----------------------------------------------------------------------------
++ """Generate static information"""
+
+-def parse_mapfile(map_file_path):
+- return {} # don't really need this info anymore
+-# """Parse the '.map' file"""
+-#
+-# def parse_keyboard_function(f, line):
+-# """Parse keyboard-functions in the '.map' file"""
+-#
+-# search = re.search(r'(0x\S+)\s+(0x\S+)', next(f))
+-# position = int( search.group(1), 16 )
+-# length = int( search.group(2), 16 )
+-#
+-# search = re.search(r'0x\S+\s+(\S+)', next(f))
+-# name = search.group(1)
+-#
+-# return {
+-# 'keyboard-functions': {
+-# name: {
+-# 'position': position,
+-# 'length': length,
+-# },
+-# },
+-# }
+-#
+-# def parse_layout_matrices(f, line):
+-# """Parse layout matrix information in the '.map' file"""
+-#
+-# name = re.search(r'.progmem.data.(_kb_layout\S*)', line).group(1)
+-#
+-# search = re.search(r'(0x\S+)\s+(0x\S+)', next(f))
+-# position = int( search.group(1), 16 )
+-# length = int( search.group(2), 16 )
+-#
+-# return {
+-# 'layout-matrices': {
+-# name: {
+-# 'position': position,
+-# 'length': length,
+-# },
+-# },
+-# }
+-#
+-# # --- parse_mapfile() ---
+-#
+-# # normalize paths
+-# map_file_path = os.path.abspath(map_file_path)
+-# # check paths
+-# if not os.path.exists(map_file_path):
+-# raise ValueError("invalid 'map_file_path' given")
+-#
+-# output = {}
+-#
+-# f = open(map_file_path)
+-#
+-# for line in f:
+-# if re.search(r'^\s*\.text\.kbfun_', line):
+-# dict_merge(output, parse_keyboard_function(f, line))
+-# elif re.search(r'^\s*\.progmem\.data.*layout', line):
+-# dict_merge(output, parse_layout_matrices(f, line))
+-#
+-# return output
++ return {
++ ".meta-data": {
++ "version": 0, # the format version number
++ "date-generated": current_date,
++ "description": _FORMAT_DESCRIPTION,
++ },
++ "miscellaneous": {
++ "git-commit-date": git_commit_date, # should be passed by makefile
++ "git-commit-id": git_commit_id, # should be passed by makefile
++ },
++ }
+
+
+ def find_keyboard_functions(source_code_path):
+- """Parse all files in the source directory"""
+-
+- def read_comments(f, line):
+- """
+- Read in properly formatted multi-line comments
+- - Comments must start with '/*' and end with '*/', each on their own
+- line
+- """
+- comments = ''
+- while(line.strip() != r'*/'):
+- comments += line[2:].strip()+'\n'
+- line = next(f)
+- return comments
+-
+- def parse_comments(comments):
+- """
+- Parse an INI style comment string
+- - Fields begin with '[field-name]', and continue until the next field,
+- or the end of the comment
+- - Fields '[name]', '[description]', and '[note]' are treated specially
+- """
+-
+- def add_field(output, field, value):
+- """Put a field+value pair in 'output', the way we want it, if the
+- pair is valid"""
+-
+- value = value.strip()
+-
+- if field is not None:
+- if field in ('name', 'description'):
+- if field not in output:
+- output[field] = value
+- else:
+- if field == 'note':
+- field = 'notes'
+-
+- if field not in output:
+- output[field] = []
+-
+- output[field] += [value]
+-
+- # --- parse_comments() ---
+-
+- output = {}
+-
+- field = None
+- value = None
+- for line in comments.split('\n'):
+- line = line.strip()
+-
+- if re.search(r'^\[.*\]$', line):
+- add_field(output, field, value)
+- field = line[1:-1]
+- value = None
+-
+- else:
+- if value is None:
+- value = ''
+- if len(value) > 0 and value[-1] == '.':
+- line = ' '+line
+- value += ' '+line
+-
+- add_field(output, field, value)
+-
+- return output
+-
+- def parse_keyboard_function(f, line, comments):
+- """Parse keyboard-functions in the source code"""
+-
+- search = re.search(r'void\s+(kbfun_\S+)\s*\(void\)', line)
+- name = search.group(1)
+-
+- return {
+- 'keyboard-functions': {
+- name: {
+- 'comments': parse_comments(comments),
+- },
+- },
+- }
+-
+- # --- find_keyboard_functions() ---
+-
+- # normalize paths
+- source_code_path = os.path.abspath(source_code_path)
+- # check paths
+- if not os.path.exists(source_code_path):
+- raise ValueError("invalid 'source_code_path' given")
+-
+- output = {}
+-
+- for tup in os.walk(source_code_path):
+- for file_name in tup[2]:
+- # normalize paths
+- file_name = os.path.abspath( os.path.join( tup[0], file_name ) )
+-
+- # ignore non '.c' files
+- if file_name[-2:] != '.c':
+- continue
+-
+- f = open(file_name)
+-
+- comments = ''
+- for line in f:
+- if line.strip() == r'/*':
+- comments = read_comments(f, line)
+- elif re.search(r'void\s+kbfun_\S+\s*\(void\)', line):
+- dict_merge(
+- output,
+- parse_keyboard_function(f, line, comments) )
+-
+- return output
++ """Parse all files in the source directory"""
++
++ def read_comments(f, line):
++ """
++ Read in properly formatted multi-line comments
++ - Comments must start with '/*' and end with '*/', each on their own
++ line
++ """
++ comments = ""
++ while line.strip() != r"*/":
++ comments += line[2:].strip() + "\n"
++ line = next(f)
++ return comments
++
++ def parse_comments(comments):
++ """
++ Parse an INI style comment string
++ - Fields begin with '[field-name]', and continue until the next field,
++ or the end of the comment
++ - Fields '[name]', '[description]', and '[note]' are treated specially
++ """
++
++ def add_field(output, field, value):
++ """Put a field+value pair in 'output', the way we want it, if the
++ pair is valid"""
++
++ value = value.strip()
++
++ if field is not None:
++ if field in ("name", "description"):
++ if field not in output:
++ output[field] = value
++ else:
++ if field == "note":
++ field = "notes"
++
++ if field not in output:
++ output[field] = []
++
++ output[field] += [value]
++
++ # --- parse_comments() ---
++
++ output = {}
++
++ field = None
++ value = None
++ for line in comments.split("\n"):
++ line = line.strip()
++
++ if re.search(r"^\[.*\]$", line):
++ add_field(output, field, value)
++ field = line[1:-1]
++ value = None
++ else:
++ if value is None:
++ value = ""
++ if len(value) > 0 and value[-1] == ".":
++ line = " " + line
++ value += " " + line
++
++ add_field(output, field, value)
++
++ return output
++
++ def parse_keyboard_function(f, line, comments):
++ """Parse keyboard-functions in the source code"""
++
++ search = re.search(r"void\s+(kbfun_\S+)\s*\(void\)", line)
++ name = search.group(1)
++
++ return {
++ "keyboard-functions": {
++ name: {
++ "comments": parse_comments(comments),
++ },
++ },
++ }
++
++ # --- find_keyboard_functions() ---
++
++ # normalize paths
++ source_code_path = os.path.abspath(source_code_path)
++ # check paths
++ if not os.path.exists(source_code_path):
++ raise ValueError("invalid 'source_code_path' given")
++
++ output = {}
++
++ for tup in os.walk(source_code_path):
++ for file_name in tup[2]:
++ # normalize paths
++ file_name = os.path.abspath(os.path.join(tup[0], file_name))
++
++ # ignore non '.c' files
++ if file_name[-2:] != ".c":
++ continue
++
++ f = open(file_name)
++
++ comments = ""
++ for line in f:
++ if line.strip() == r"/*":
++ comments = read_comments(f, line)
++ elif re.search(r"void\s+kbfun_\S+\s*\(void\)", line):
++ dict_merge(
++ output, parse_keyboard_function(f, line, comments)
++ )
++
++ return output
+
+
+ def gen_mappings(matrix_file_path, layout_file_path):
+- # normalize paths
+- matrix_file_path = os.path.abspath(matrix_file_path)
+- layout_file_path = os.path.abspath(layout_file_path)
+-
+- def parse_matrix_file(matrix_file_path):
+- match = re.search( # find the whole 'KB_MATRIX_LAYER' macro
+- r'#define\s+KB_MATRIX_LAYER\s*\(([^)]+)\)[^{]*\{\{([^#]+)\}\}',
+- open(matrix_file_path).read() )
+-
+- return {
+- "mappings": {
+- "physical-positions": re.findall(r'k..', match.group(1)),
+- "matrix-positions": re.findall(r'k..|na', match.group(2)),
+- },
+- }
+-
+- def parse_layout_file(layout_file_path):
+- match = re.findall( # find each whole '_kb_layout*' matrix definition
+- r'(_kb_layout\w*)[^=]*=((?:[^{}]*\{){3}[^=]*(?:[^{}]*\}){3})',
+- subprocess.getoutput("gcc -E '"+layout_file_path+"'") )
+-
+- layout = {}
+- # collect all the values
+- for (name, matrix) in match:
+- layout[name] = [
+- re.findall( # find all numbers and function pointers
+- r'[x0-9A-F]+|&\w+|NULL',
+- re.sub( # replace '((void *) 0)' with 'NULL'
+- r'\(\s*\(\s*void\s*\*\s*\)\s*0\s*\)',
+- 'NULL',
+- el ) )
+- for el in
+- re.findall( # find each whole layer
+- r'(?:[^{}]*\{){2}((?:[^}]|\}\s*,)+)(?:[^{}]*\}){2}',
+- matrix ) ]
+-
+- # make the numbers into actual numbers
+- layout['_kb_layout'] = \
+- [[eval(el) for el in layer] for layer in layout['_kb_layout']]
+- # remove the preceeding '&' from function pointers
+- for matrix in ('_kb_layout_press', '_kb_layout_release'):
+- layout[matrix] = \
+- [ [re.sub(r'&', '', el) for el in layer]
+- for layer in layout[matrix] ]
+-
+- return {
+- "mappings": {
+- "matrix-layout":
+- # group them all properly
+- [ [[c, p, r] for (c, p, r) in zip(code, press, release)]
+- for (code, press, release) in
+- zip( layout['_kb_layout'],
+- layout['_kb_layout_press'],
+- layout['_kb_layout_release'] ) ]
+- },
+- }
+-
+- return dict_merge(
+- parse_matrix_file(matrix_file_path),
+- parse_layout_file(layout_file_path) )
++ # normalize paths
++ matrix_file_path = os.path.abspath(matrix_file_path)
++ layout_file_path = os.path.abspath(layout_file_path)
++ layout_name = pathlib.Path(layout_file_path).with_suffix('').name
++
++ def parse_matrix_file(matrix_file_path):
++ match = re.search( # find the whole 'KB_MATRIX_LAYER' macro
++ r"#define\s+KB_MATRIX_LAYER\s*\(([^)]+)\)[^{]*\{\{([^#]+)\}\}",
++ open(matrix_file_path).read(),
++ )
++
++ return {
++ "mappings": {
++ "physical-positions": re.findall(r"k..", match.group(1)),
++ "matrix-positions": re.findall(r"k..|na", match.group(2)),
++ },
++ }
++
++ def parse_layout_file(layout_file_path):
++ output = subprocess.check_output(
++ ['avr-gcc', f'-DMAKEFILE_KEYBOARD_LAYOUT={layout_name}',
++ '-E', layout_file_path], encoding='UTF-8')
++ match = re.findall( # find each whole '_kb_layout*' matrix definition
++ r"(_kb_layout\w*)[^=]*=((?:[^{}]*\{){3}[^=]*(?:[^{}]*\}){3})",
++ output,
++ )
++
++ layout = {}
++ # collect all the values
++ for (name, matrix) in match:
++ layout[name] = [
++ re.findall( # find all numbers and function pointers
++ r"[x0-9A-F]+|&\w+|NULL",
++ re.sub( # replace '((void *) 0)' with 'NULL'
++ r"\(\s*\(\s*void\s*\*\s*\)\s*0\s*\)", "NULL", el
++ ),
++ )
++ for el in re.findall( # find each whole layer
++ r"(?:[^{}]*\{){2}((?:[^}]|\}\s*,)+)(?:[^{}]*\}){2}", matrix
++ )
++ ]
++
++ # make the numbers into actual numbers
++ layout["_kb_layout"] = [
++ [eval(el) for el in layer] for layer in layout["_kb_layout"]
++ ]
++ # remove the preceeding '&' from function pointers
++ for matrix in ("_kb_layout_press", "_kb_layout_release"):
++ layout[matrix] = [
++ [re.sub(r"&", "", el) for el in layer]
++ for layer in layout[matrix]
++ ]
++
++ return {
++ "mappings": {
++ "matrix-layout":
++ # group them all properly
++ [
++ [[c, p, r] for (c, p, r) in zip(code, press, release)]
++ for (code, press, release) in zip(
++ layout["_kb_layout"],
++ layout["_kb_layout_press"],
++ layout["_kb_layout_release"],
++ )
++ ]
++ },
++ }
++
++ return dict_merge(
++ parse_matrix_file(matrix_file_path),
++ parse_layout_file(layout_file_path),
++ )
+
+
+ # -----------------------------------------------------------------------------
+
++
+ def dict_merge(a, b):
+- """
+- Recursively merge two dictionaries
+- - I was looking around for an easy way to do this, and found something
+- [here]
+- (http://www.xormedia.com/recursively-merge-dictionaries-in-python.html).
+- This is pretty close, but i didn't copy it exactly.
+- """
++ """
++ Recursively merge two dictionaries
++ - I was looking around for an easy way to do this, and found something
++ [here]
++ (http://www.xormedia.com/recursively-merge-dictionaries-in-python.html).
++ This is pretty close, but i didn't copy it exactly.
++ """
++
++ if not isinstance(a, dict) or not isinstance(b, dict):
++ return b
+
+- if not isinstance(a, dict) or not isinstance(b, dict):
+- return b
++ for (key, value) in b.items():
++ if key in a:
++ a[key] = dict_merge(a[key], value)
++ else:
++ a[key] = value
+
+- for (key, value) in b.items():
+- if key in a:
+- a[key] = dict_merge(a[key], value)
+- else:
+- a[key] = value
++ return a
+
+- return a
+
+ # -----------------------------------------------------------------------------
+
++
+ def main():
+- arg_parser = argparse.ArgumentParser(
+- description = 'Generate project data for use with the UI' )
+-
+- arg_parser.add_argument(
+- '--current-date',
+- help = ( "should be in the format rfc-3339 "
+- + "(e.g. 2006-08-07 12:34:56-06:00)" ),
+- required = True )
+- arg_parser.add_argument(
+- '--git-commit-date',
+- help = ( "should be in the format rfc-3339 "
+- + "(e.g. 2006-08-07 12:34:56-06:00)" ),
+- required = True )
+- arg_parser.add_argument(
+- '--git-commit-id',
+- help = "the git commit ID",
+- required = True )
+- arg_parser.add_argument(
+- '--map-file-path',
+- help = "the path to the '.map' file",
+- required = True )
+- arg_parser.add_argument(
+- '--source-code-path',
+- help = "the path to the source code directory",
+- required = True )
+- arg_parser.add_argument(
+- '--matrix-file-path',
+- help = "the path to the matrix file we're using",
+- required = True )
+- arg_parser.add_argument(
+- '--layout-file-path',
+- help = "the path to the layout file we're using",
+- required = True )
+-
+- args = arg_parser.parse_args(sys.argv[1:])
+-
+- output = {}
+- dict_merge( output, gen_static( args.current_date,
+- args.git_commit_date,
+- args.git_commit_id ) )
+- dict_merge(output, parse_mapfile(args.map_file_path))
+- dict_merge(output, find_keyboard_functions(args.source_code_path))
+- dict_merge(output, gen_mappings( args.matrix_file_path,
+- args.layout_file_path ))
+- dict_merge(output, gen_derived(output))
+-
+- print(json.dumps(output, sort_keys=True, indent=4))
++ arg_parser = argparse.ArgumentParser(
++ description="Generate project data for use with the UI"
++ )
++
++ arg_parser.add_argument(
++ "--current-date",
++ help=(
++ "should be in the format rfc-3339 "
++ "(e.g. 2006-08-07 12:34:56-06:00)"
++ ),
++ required=True,
++ )
++ arg_parser.add_argument(
++ "--git-commit-date",
++ help=(
++ "should be in the format rfc-3339 "
++ "(e.g. 2006-08-07 12:34:56-06:00)"
++ ),
++ required=True,
++ )
++ arg_parser.add_argument(
++ "--git-commit-id", help="the git commit ID", required=True
++ )
++ arg_parser.add_argument(
++ "--map-file-path", help="the path to the '.map' file", required=True
++ )
++ arg_parser.add_argument(
++ "--source-code-path",
++ help="the path to the source code directory",
++ required=True,
++ )
++ arg_parser.add_argument(
++ "--matrix-file-path",
++ help="the path to the matrix file we're using",
++ required=True,
++ )
++ arg_parser.add_argument(
++ "--layout-file-path",
++ help="the path to the layout file we're using",
++ required=True,
++ )
++
++ args = arg_parser.parse_args(sys.argv[1:])
++
++ output = {}
++ dict_merge(
++ output,
++ gen_static(
++ args.current_date, args.git_commit_date, args.git_commit_id
++ )
++ )
++ dict_merge(output, find_keyboard_functions(args.source_code_path))
++ dict_merge(
++ output, gen_mappings(args.matrix_file_path, args.layout_file_path)
++ )
++
++ print(json.dumps(output, sort_keys=True, indent=4))
+
+-# -----------------------------------------------------------------------------
+
+-if __name__ == '__main__':
+- main()
++# -----------------------------------------------------------------------------
+
++if __name__ == "__main__":
++ main()
+diff --git a/makefile b/makefile
+index d9fe10c..971ee0e 100644
+--- a/makefile
++++ b/makefile
+@@ -58,24 +58,27 @@ SCRIPTS := build-scripts
+ all: dist
+
+ clean:
+- git clean -dX # remove ignored files and directories
+- -rm -r '$(BUILD)'
++ git clean -fdX # remove ignored files and directories
++ rm -rf '$(BUILD)'
+
+ checkin:
+ -git commit -a
+
+ build-dir:
+- -rm -r '$(BUILD)/$(TARGET)'*
+- -mkdir -p '$(BUILD)/$(TARGET)'
++ rm -rf '$(BUILD)/$(TARGET)'*
++ mkdir -p '$(BUILD)/$(TARGET)'
+
+ firmware:
+ cd src; $(MAKE) LAYOUT=$(LAYOUT) all
+
+-$(ROOT)/firmware.%: firmware
++$(ROOT):
++ mkdir -p '$@'
++
++$(ROOT)/firmware.%: firmware $(ROOT)
+ cp 'src/firmware.$*' '$@'
+
+
+-$(ROOT)/firmware--ui-info.json: $(SCRIPTS)/gen-ui-info.py checkin
++$(ROOT)/firmware--ui-info.json: $(SCRIPTS)/gen-ui-info.py checkin firmware
+ ( ./'$<' \
+ --current-date '$(shell $(DATE_PROG) --rfc-3339 s)' \
+ --git-commit-date '$(GIT_COMMIT_DATE)' \
diff --git a/gnu/packages/patches/ergodox-firmware-fix-numpad.patch b/gnu/packages/patches/ergodox-firmware-fix-numpad.patch
new file mode 100644
index 00000000000..47af9f8398d
--- /dev/null
+++ b/gnu/packages/patches/ergodox-firmware-fix-numpad.patch
@@ -0,0 +1,18 @@
+Submitted upstream: https://github.com/benblazak/ergodox-firmware/pull/100
+
+diff --git a/src/lib/key-functions/public/special.c b/src/lib/key-functions/public/special.c
+index 42aba45..6488137 100644
+--- a/src/lib/key-functions/public/special.c
++++ b/src/lib/key-functions/public/special.c
+@@ -102,9 +102,9 @@ void kbfun_2_keys_capslock_press_release(void) {
+ static uint8_t numpad_layer_id;
+
+ static inline void numpad_toggle_numlock(void) {
+- _kbfun_press_release(true, KEY_LockingNumLock);
++ _kbfun_press_release(true, KEYPAD_NumLock_Clear);
+ usb_keyboard_send();
+- _kbfun_press_release(false, KEY_LockingNumLock);
++ _kbfun_press_release(false, KEYPAD_NumLock_Clear);
+ usb_keyboard_send();
+ }
+
--
2.41.0
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [bug#66217] [PATCH 16/22] gnu: Add ergodox-firmware-colemak-symbol-mod.
2023-09-26 18:59 [bug#66217] [PATCH 00/22] Add ErgoDox firmware packages Maxim Cournoyer
` (14 preceding siblings ...)
2023-09-26 19:04 ` [bug#66217] [PATCH 15/22] gnu: Add ergodox-firmware-colemak-jc-mod Maxim Cournoyer
@ 2023-09-26 19:04 ` Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 17/22] gnu: Add ergodox-firmware-dvorak-kinesis-mod Maxim Cournoyer
` (5 subsequent siblings)
21 siblings, 0 replies; 23+ messages in thread
From: Maxim Cournoyer @ 2023-09-26 19:04 UTC (permalink / raw)
To: 66217; +Cc: Maxim Cournoyer, Efraim Flashner, Vagrant Cascadian
* gnu/packages/firmware.scm (ergodox-firmware-colemak-symbol-mod): New variable.
---
gnu/packages/firmware.scm | 3 +++
1 file changed, 3 insertions(+)
diff --git a/gnu/packages/firmware.scm b/gnu/packages/firmware.scm
index a901ae46944..213f2002403 100644
--- a/gnu/packages/firmware.scm
+++ b/gnu/packages/firmware.scm
@@ -1297,6 +1297,9 @@ (define make-ergodox-firmware
(define-public ergodox-firmware-colemak-jc-mod
(make-ergodox-firmware "colemak-jc-mod"))
+(define-public ergodox-firmware-colemak-symbol-mod
+ (make-ergodox-firmware "colemak-symbol-mod"))
+
\f
;;;
;;; QMK Firmware.
--
2.41.0
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [bug#66217] [PATCH 17/22] gnu: Add ergodox-firmware-dvorak-kinesis-mod.
2023-09-26 18:59 [bug#66217] [PATCH 00/22] Add ErgoDox firmware packages Maxim Cournoyer
` (15 preceding siblings ...)
2023-09-26 19:04 ` [bug#66217] [PATCH 16/22] gnu: Add ergodox-firmware-colemak-symbol-mod Maxim Cournoyer
@ 2023-09-26 19:04 ` Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 18/22] gnu: Add ergodox-firmware-qwerty-kinesis-mod Maxim Cournoyer
` (4 subsequent siblings)
21 siblings, 0 replies; 23+ messages in thread
From: Maxim Cournoyer @ 2023-09-26 19:04 UTC (permalink / raw)
To: 66217; +Cc: Maxim Cournoyer, Efraim Flashner, Vagrant Cascadian
* gnu/packages/firmware.scm (ergodox-firmware-dvorak-kinesis-mod): New variable.
---
gnu/packages/firmware.scm | 3 +++
1 file changed, 3 insertions(+)
diff --git a/gnu/packages/firmware.scm b/gnu/packages/firmware.scm
index 213f2002403..9bab352f704 100644
--- a/gnu/packages/firmware.scm
+++ b/gnu/packages/firmware.scm
@@ -1300,6 +1300,9 @@ (define-public ergodox-firmware-colemak-jc-mod
(define-public ergodox-firmware-colemak-symbol-mod
(make-ergodox-firmware "colemak-symbol-mod"))
+(define-public ergodox-firmware-dvorak-kinesis-mod
+ (make-ergodox-firmware "dvorak-kinesis-mod"))
+
\f
;;;
;;; QMK Firmware.
--
2.41.0
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [bug#66217] [PATCH 18/22] gnu: Add ergodox-firmware-qwerty-kinesis-mod.
2023-09-26 18:59 [bug#66217] [PATCH 00/22] Add ErgoDox firmware packages Maxim Cournoyer
` (16 preceding siblings ...)
2023-09-26 19:04 ` [bug#66217] [PATCH 17/22] gnu: Add ergodox-firmware-dvorak-kinesis-mod Maxim Cournoyer
@ 2023-09-26 19:04 ` Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 19/22] gnu: Add ergodox-firmware-workman-p-kinesis-mod Maxim Cournoyer
` (3 subsequent siblings)
21 siblings, 0 replies; 23+ messages in thread
From: Maxim Cournoyer @ 2023-09-26 19:04 UTC (permalink / raw)
To: 66217; +Cc: Maxim Cournoyer, Efraim Flashner, Vagrant Cascadian
* gnu/packages/firmware.scm (ergodox-firmware-qwerty-kinesis-mod): New variable.
---
gnu/packages/firmware.scm | 3 +++
1 file changed, 3 insertions(+)
diff --git a/gnu/packages/firmware.scm b/gnu/packages/firmware.scm
index 9bab352f704..4f928ec8bce 100644
--- a/gnu/packages/firmware.scm
+++ b/gnu/packages/firmware.scm
@@ -1303,6 +1303,9 @@ (define-public ergodox-firmware-colemak-symbol-mod
(define-public ergodox-firmware-dvorak-kinesis-mod
(make-ergodox-firmware "dvorak-kinesis-mod"))
+(define-public ergodox-firmware-qwerty-kinesis-mod
+ (make-ergodox-firmware "qwerty-kinesis-mod"))
+
\f
;;;
;;; QMK Firmware.
--
2.41.0
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [bug#66217] [PATCH 19/22] gnu: Add ergodox-firmware-workman-p-kinesis-mod.
2023-09-26 18:59 [bug#66217] [PATCH 00/22] Add ErgoDox firmware packages Maxim Cournoyer
` (17 preceding siblings ...)
2023-09-26 19:04 ` [bug#66217] [PATCH 18/22] gnu: Add ergodox-firmware-qwerty-kinesis-mod Maxim Cournoyer
@ 2023-09-26 19:04 ` Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 20/22] gnu: teensy-loader-cli: Use gexps Maxim Cournoyer
` (2 subsequent siblings)
21 siblings, 0 replies; 23+ messages in thread
From: Maxim Cournoyer @ 2023-09-26 19:04 UTC (permalink / raw)
To: 66217; +Cc: Maxim Cournoyer, Efraim Flashner, Vagrant Cascadian
* gnu/packages/firmware.scm (ergodox-firmware-workman-p-kinesis-mod): New variable.
---
gnu/packages/firmware.scm | 3 +++
1 file changed, 3 insertions(+)
diff --git a/gnu/packages/firmware.scm b/gnu/packages/firmware.scm
index 4f928ec8bce..5eb4292ec7d 100644
--- a/gnu/packages/firmware.scm
+++ b/gnu/packages/firmware.scm
@@ -1306,6 +1306,9 @@ (define-public ergodox-firmware-dvorak-kinesis-mod
(define-public ergodox-firmware-qwerty-kinesis-mod
(make-ergodox-firmware "qwerty-kinesis-mod"))
+(define-public ergodox-firmware-workman-p-kinesis-mod
+ (make-ergodox-firmware "workman-p-kinesis-mod"))
+
\f
;;;
;;; QMK Firmware.
--
2.41.0
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [bug#66217] [PATCH 20/22] gnu: teensy-loader-cli: Use gexps.
2023-09-26 18:59 [bug#66217] [PATCH 00/22] Add ErgoDox firmware packages Maxim Cournoyer
` (18 preceding siblings ...)
2023-09-26 19:04 ` [bug#66217] [PATCH 19/22] gnu: Add ergodox-firmware-workman-p-kinesis-mod Maxim Cournoyer
@ 2023-09-26 19:04 ` Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 21/22] gnu: teensy-loader-cli: Fix license Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 22/22] gnu: Add teensy-udev-rules Maxim Cournoyer
21 siblings, 0 replies; 23+ messages in thread
From: Maxim Cournoyer @ 2023-09-26 19:04 UTC (permalink / raw)
To: 66217; +Cc: Maxim Cournoyer
* gnu/packages/flashing-tools.scm (teensy-loader-cli) [arguments]: Use gexps.
---
gnu/packages/flashing-tools.scm | 19 +++++++++----------
1 file changed, 9 insertions(+), 10 deletions(-)
diff --git a/gnu/packages/flashing-tools.scm b/gnu/packages/flashing-tools.scm
index d9f59cd0b7c..a17547cbcd7 100644
--- a/gnu/packages/flashing-tools.scm
+++ b/gnu/packages/flashing-tools.scm
@@ -234,16 +234,15 @@ (define-public teensy-loader-cli
(patches (search-patches "teensy-loader-cli-help.patch"))))
(build-system gnu-build-system)
(arguments
- '(#:tests? #f ;; Makefile has no test target
- #:make-flags (list "CC=gcc" (string-append "PREFIX=" %output))
- #:phases
- (modify-phases %standard-phases
- (delete 'configure)
- (replace 'install
- (lambda* (#:key outputs #:allow-other-keys)
- (let* ((out (assoc-ref outputs "out"))
- (bin (string-append out "/bin")))
- (install-file "teensy_loader_cli" bin)))))))
+ (list
+ #:tests? #f ;; Makefile has no test target
+ #:make-flags #~(list "CC=gcc" (string-append "PREFIX=" #$output))
+ #:phases #~(modify-phases %standard-phases
+ (delete 'configure)
+ (replace 'install
+ (lambda _
+ (install-file "teensy_loader_cli"
+ (string-append #$output "/bin")))))))
(inputs (list libusb-compat)) ;only compatible with libusb 0.1
(synopsis "Command line firmware uploader for Teensy development boards")
(description
--
2.41.0
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [bug#66217] [PATCH 21/22] gnu: teensy-loader-cli: Fix license.
2023-09-26 18:59 [bug#66217] [PATCH 00/22] Add ErgoDox firmware packages Maxim Cournoyer
` (19 preceding siblings ...)
2023-09-26 19:04 ` [bug#66217] [PATCH 20/22] gnu: teensy-loader-cli: Use gexps Maxim Cournoyer
@ 2023-09-26 19:04 ` Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 22/22] gnu: Add teensy-udev-rules Maxim Cournoyer
21 siblings, 0 replies; 23+ messages in thread
From: Maxim Cournoyer @ 2023-09-26 19:04 UTC (permalink / raw)
To: 66217; +Cc: Maxim Cournoyer
* gnu/packages/flashing-tools.scm (teensy-loader-cli) [license]: Adjust to
license:gpl3+.
---
gnu/packages/flashing-tools.scm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gnu/packages/flashing-tools.scm b/gnu/packages/flashing-tools.scm
index a17547cbcd7..5142a993cf9 100644
--- a/gnu/packages/flashing-tools.scm
+++ b/gnu/packages/flashing-tools.scm
@@ -252,7 +252,7 @@ (define-public teensy-loader-cli
You need to add the udev rules to make the Teensy update available for
non-root users.")
(home-page "https://www.pjrc.com/teensy/loader_cli.html")
- (license license:gpl3)))
+ (license license:gpl3+)))
(define-public rkflashtool
(let ((commit "8966c4e277de8148290554aaaa4146a3a84a3c53")
--
2.41.0
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [bug#66217] [PATCH 22/22] gnu: Add teensy-udev-rules.
2023-09-26 18:59 [bug#66217] [PATCH 00/22] Add ErgoDox firmware packages Maxim Cournoyer
` (20 preceding siblings ...)
2023-09-26 19:04 ` [bug#66217] [PATCH 21/22] gnu: teensy-loader-cli: Fix license Maxim Cournoyer
@ 2023-09-26 19:04 ` Maxim Cournoyer
21 siblings, 0 replies; 23+ messages in thread
From: Maxim Cournoyer @ 2023-09-26 19:04 UTC (permalink / raw)
To: 66217; +Cc: Maxim Cournoyer
* gnu/packages/flashing-tools.scm (teensy-udev-rules): New variable.
---
gnu/packages/flashing-tools.scm | 43 ++++++++++++++++++++++++++++++++-
1 file changed, 42 insertions(+), 1 deletion(-)
diff --git a/gnu/packages/flashing-tools.scm b/gnu/packages/flashing-tools.scm
index 5142a993cf9..fb48b2a366c 100644
--- a/gnu/packages/flashing-tools.scm
+++ b/gnu/packages/flashing-tools.scm
@@ -10,6 +10,7 @@
;;; Copyright © 2021 Ricardo Wurmus <rekado@elephly.net>
;;; Copyright © 2021 Mathieu Othacehe <othacehe@gnu.org>
;;; Copyright © 2022 Peter Polidoro <peter@polidoro.io>
+;;; Copyright © 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -35,6 +36,7 @@ (define-module (gnu packages flashing-tools)
#:use-module (guix utils)
#:use-module (gnu packages)
#:use-module (guix build-system cmake)
+ #:use-module (guix build-system copy)
#:use-module (guix build-system gnu)
#:use-module (guix build-system meson)
#:use-module (guix build-system python)
@@ -61,7 +63,8 @@ (define-module (gnu packages flashing-tools)
#:use-module (gnu packages libftdi)
#:use-module (gnu packages pciutils)
#:use-module (gnu packages qt)
- #:use-module (gnu packages tls))
+ #:use-module (gnu packages tls)
+ #:use-module (srfi srfi-26))
(define-public flashrom
(package
@@ -254,6 +257,44 @@ (define-public teensy-loader-cli
(home-page "https://www.pjrc.com/teensy/loader_cli.html")
(license license:gpl3+)))
+(define-public teensy-udev-rules
+ (package
+ (name "teensy-udev-rules")
+ (version "2023-09-13") ;no version whatsoever -- use the current date
+ (source (origin
+ (method url-fetch)
+ (uri "https://www.pjrc.com/teensy/00-teensy.rules")
+ (sha256
+ (base32
+ "1yxczxvwi0s31g7lfa4v13yvvpv6gcsfs7r9mv6y4w9jc1inpx8p"))))
+ (build-system copy-build-system)
+ (arguments
+ (let ((rules-file "lib/udev/rules.d/70-teensy.rules"))
+ (list
+ #:install-plan
+ #~(list `(,#$source #$rules-file))
+ #:phases
+ #~(modify-phases %standard-phases
+ (add-after 'install 'patch-paths
+ (lambda* (#:key inputs #:allow-other-keys)
+ (substitute* (string-append #$output "/" #$rules-file)
+ (("/bin/stty")
+ (search-input-file inputs "bin/stty")))))))))
+ (inputs (list coreutils-minimal))
+ (home-page "https://www.pjrc.com/teensy/loader_cli.html")
+ (synopsis "udev rules for the Teensy family of micro-controllers")
+ (description "This package provides a udev rules file that allows
+unprivileged users communication with the Teensy family of micro-controllers.
+ModemManager (part of NetworkManager) can interfere with USB Serial devices,
+which includes the Teensy. In case of problems, see the @file{.rules} file
+for possible workarounds.")
+ ;; FIXME: The file lacks an explicit license, so the license of
+ ;; teensy-cli-loader is *assumed* to hold (see:
+ ;; https://github.com/PaulStoffregen/teensy_loader_cli/issues/84).
+ (license license:gpl3+)
+ (supported-systems (filter (cut string-suffix? "-linux" <>)
+ %supported-systems))))
+
(define-public rkflashtool
(let ((commit "8966c4e277de8148290554aaaa4146a3a84a3c53")
(revision "1"))
--
2.41.0
^ permalink raw reply related [flat|nested] 23+ messages in thread
end of thread, other threads:[~2023-09-26 20:31 UTC | newest]
Thread overview: 23+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-09-26 18:59 [bug#66217] [PATCH 00/22] Add ErgoDox firmware packages Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 01/22] gnu: make-avr-toolchain: Add a #:xgcc argument Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 02/22] gnu: qmk: Style Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 03/22] gnu: qmk: Avoid propagating inputs Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 04/22] gnu: qmk: Use GCC 8 for the AVR toolchain Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 05/22] gnu: qmk: Add many missing inputs and add more commands to PATH Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 06/22] gnu: Add lufa Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 07/22] gnu: embedded: Do not use a prefix on the (gnu packages base) module Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 08/22] gnu: Add qmk-firmware-ergodox-ez-default Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 09/22] gnu: Add qmk-firmware-ergodox-ez-dvorak-42-key Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 10/22] gnu: Add qmk-udev-rules Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 11/22] gnu: Add qmk-firmware-ergodox-ez-hacker-dvorak Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 12/22] gnu: Add qmk-firmware-ergodox-ez-dvorak Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 13/22] gnu: Add qmk-firmware-ergodox-ez-dvorak-emacs Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 14/22] gnu: Add qmk-firmware-ergodox-ez-dvorak-emacs-software Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 15/22] gnu: Add ergodox-firmware-colemak-jc-mod Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 16/22] gnu: Add ergodox-firmware-colemak-symbol-mod Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 17/22] gnu: Add ergodox-firmware-dvorak-kinesis-mod Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 18/22] gnu: Add ergodox-firmware-qwerty-kinesis-mod Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 19/22] gnu: Add ergodox-firmware-workman-p-kinesis-mod Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 20/22] gnu: teensy-loader-cli: Use gexps Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 21/22] gnu: teensy-loader-cli: Fix license Maxim Cournoyer
2023-09-26 19:04 ` [bug#66217] [PATCH 22/22] gnu: Add teensy-udev-rules Maxim Cournoyer
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/guix.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).