~technomancy/menelaus

71e98173e8bc388874d4b2ea8a7092336a88a40c — Phil Hagelberg 6 months ago 22010bb master
Fix reset function.
7 files changed, 32 insertions(+), 21 deletions(-)

M Makefile
M README.md
M keycodes.scm
M menelaus.scm
M multidvorak.scm
M qwerty.scm
M usb_keyboard.c
M Makefile => Makefile +1 -1
@@ 9,7 9,7 @@ build: $(LAYOUT).hex

upload: $(LAYOUT).hex
	@echo "Put your device in bootloader mode now..."
	@echo "Classic Atreus: connect GND pin to RST pin twice in under a secod."
	@echo "Classic Atreus: press reset key (usually fn+esc -> B)."
	@echo "Keyboardio Atreus: press the button on the underside of the board."
	while [ ! -r $(USB) ]; do sleep 1; done; \
	avrdude -p $(MCU) -c avr109 -U flash:w:$(LAYOUT).hex -P $(USB)

M README.md => README.md +5 -3
@@ 46,10 46,12 @@ Some linux-based systems will need a udev rule to grant permissions to
the USB device for uploading firmware. If you get permission denied on
`/dev/ttyACM0` or whatever it is, try running `sudo make udev`.

## Known bugs
## Limitations

The reset function in the firmware has no effect; hard-reset must be
used to flash a new firmware once this is uploaded.
If you use dual-role keys, one-shot modifiers, or mouse keys, you may
be happier with [QMK](https://docs.qmk.fm/) or
[Kaleidoscope](https://github.com/keyboardio/Kaleidoscope). Likewise
if you need more than 6 regular keys and 4 modifiers at once.

## Layout


M keycodes.scm => keycodes.scm +3 -0
@@ 105,3 105,6 @@
(define mod-super (modify 4))

(define (sft keycode) (combo mod-shift keycode)) ; shorthand

;; Enter the bootloader in preparation for flashing.
(define (reset _) (call-c-func "reset"))

M menelaus.scm => menelaus.scm +9 -2
@@ 25,9 25,16 @@
;; steps thru a vector/list with the initial arguments calculated by its
;; non-aux equivalent. The -aux function is never called directly.

;; This file should be loaded by your main layout code; see qwerty.scm
;; This file should be loaded by your main layout file; see qwerty.scm
;; for an example. It assumes that keycodes, layouts, and pinout have already
;; been defined.
;; been defined. In particular, it needs these definitions:

;; * everything in keycodes.scm
;; * momentary-layer: either false (when not active) or a vector of keycodes
;; * current-layer: a vector of keycodes for when momentary-layer is inactive

;; The keycodes in these vectors can be numbers, lists, or procedures;
;; for details see the "Layout lookup" section below.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


M multidvorak.scm => multidvorak.scm +11 -8
@@ 1,10 1,16 @@
;;; This is the multidvorak layout.

;; It will work for the 44-key Atreus 2 or the 42-key Atreus 1.
;; It is written with the assumption that the host OS is set to dvorak mode, so
;; it sends keycodes with the assumption that the OS will apply the dvorak
;; mapping; for instance it sends [ as -, which the OS then turns back into [.
;; There is also a "hard dvorak" layer you can activate when you plug into
;; a computer that isn't set to dvorak in the OS.

;; It will work for the 44-key Keyboardio Atreus or the 42-key Atreus Classic.

(include "keycodes.scm")

;; What are the rows and columns we care about?
;; What are the rows and columns we care about? (Atreus Classic pinout)
(define rows (list 0 1 2 3))
(define columns (list 0 1 2 3 4 5 6 7 8 9 10))



@@ 35,11 41,8 @@
(define (set-layer n)
  (lambda (_) (set! current-layer (vector-ref layers n))))

;; This will reset the board but fails to enter the bootloader for some reason.
(define (reset _) (call-c-func "reset"))

;; On the Atreus 1, we need to expose backtick on the fn layer, but on
;; the Atreus 2 it has its own key, so we put percent there instead.
;; On the Atreus Classic, we need to expose backtick on the fn layer, but on
;; the Keyboardio Atreus it has its own key, so we put percent there instead.
(define backtick-or-percent
  ;; (sft key-5)
  key-backtick)


@@ 123,7 126,7 @@
          key-space fn key-quote key-left-bracket key-enter))

(define hard-dvorak-fn-layer
  (vector (sft key-1) (sft key-2) key-up (sft key-4) (sft key-5) (sft key-6)
  (vector (sft key-1) (sft key-2) key-up (sft key-4) backtick-or-percent (sft key-6)
          key-page-up key-7 key-8 key-9 (sft key-backspace)

          (sft key-3) key-left key-down key-right (sft key-4) 0

M qwerty.scm => qwerty.scm +2 -4
@@ 33,10 33,8 @@
(define (set-layer n)
  (lambda (_) (set! current-layer (vector-ref layers n))))

(define (reset _) (call-c-func "reset"))

;; On the Atreus 1, we need to expose backtick on the fn layer, but on
;; the Atreus 2 it has its own key, so we put percent there instead.
;; On the Atreus Classic, we need to expose backtick on the fn layer, but on
;; the Keyboardio Atreus it has its own key, so we put percent there instead.
(define backtick-or-percent
  ;; (sft key-5)
  key-backtick)

M usb_keyboard.c => usb_keyboard.c +1 -3
@@ 604,9 604,6 @@ ISR(USB_COM_vect)
  UECONX = (1<<STALLRQ) | (1<<EPEN);  // stall
}

// this fails to enter the bootloader.
// it is unknown why the same code fails here but works fine in
// https://github.com/technomancy/atreus-firmware/blob/master/atreus.c#L230
void reset(void) {
  UDCON = 1; USBCON = (1<<FRZCLK); UCSR1B = 0;
  _delay_ms(5);


@@ 616,4 613,5 @@ void reset(void) {
  PORTB = 0; PORTC = 0; PORTD = 0; PORTE = 0; PORTF = 0;
  *(uint16_t *)0x0800 = 0x7777;
  wdt_enable(WDTO_120MS);
  asm volatile("jmp 0x7E00");
};