Keyboardio Brick Recovery help needed

Hi all,

I was trying to update my keyboard with Chrysalis to v 0.8.2 using the AppImage (Chrysalis-0.8.2.AppImage). Process started well but update froze with the red light over number 4. Computer crash.

I was left with a pretty brick of a keyboard afterwards.

Pressing the prog-key before plugging in brings on the red light and the device is seen by Chrysalis and says I need to re-flash the firmware. Attempting to re-flash firmware in Chrysalis is unsuccessful (takes more than 10 minutes saying updating without the red lights ever flashing on the keyboard).

To get better control over the situation, I’ve setup the arduino IDE with the firmware and tried to install it that way. The log is below.

Any help with next steps to revive this will be very welcome.

Thank you,
J.

Arduino: 1.8.13 (Linux), Board: “Keyboardio Model 01”

/snap/arduino/50/arduino-builder -dump-prefs -logger=machine -hardware /snap/arduino/50/hardware -hardware /home/jsilver/snap/arduino/50/.arduino15/packages -tools /snap/arduino/50/tools-builder -tools /snap/arduino/50/hardware/tools/avr -tools /home/jsilver/snap/arduino/50/.arduino15/packages -built-in-libraries /snap/arduino/50/libraries -libraries /home/jsilver/snap/arduino/current/Arduino/libraries -fqbn=keyboardio:avr:model01 -vid-pid=27C6_5385 -ide-version=10813 -build-path /tmp/arduino_build_13088 -warnings=none -build-cache /tmp/arduino_cache_538489 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avr-gcc.path=/home/jsilver/snap/arduino/50/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7 -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino7.path=/home/jsilver/snap/arduino/50/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7 -prefs=runtime.tools.avrdude.path=/home/jsilver/snap/arduino/50/.arduino15/packages/arduino/tools/avrdude/6.3.0-arduino17 -prefs=runtime.tools.avrdude-6.3.0-arduino17.path=/home/jsilver/snap/arduino/50/.arduino15/packages/arduino/tools/avrdude/6.3.0-arduino17 -prefs=runtime.tools.arduinoOTA.path=/snap/arduino/50/hardware/tools/avr -prefs=runtime.tools.arduinoOTA-1.3.0.path=/snap/arduino/50/hardware/tools/avr -verbose /home/jsilver/snap/arduino/50/.arduino15/packages/keyboardio/hardware/avr/1.99.3/libraries/Model01-Firmware/Model01-Firmware.ino
/snap/arduino/50/arduino-builder -compile -logger=machine -hardware /snap/arduino/50/hardware -hardware /home/jsilver/snap/arduino/50/.arduino15/packages -tools /snap/arduino/50/tools-builder -tools /snap/arduino/50/hardware/tools/avr -tools /home/jsilver/snap/arduino/50/.arduino15/packages -built-in-libraries /snap/arduino/50/libraries -libraries /home/jsilver/snap/arduino/current/Arduino/libraries -fqbn=keyboardio:avr:model01 -vid-pid=27C6_5385 -ide-version=10813 -build-path /tmp/arduino_build_13088 -warnings=none -build-cache /tmp/arduino_cache_538489 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avr-gcc.path=/home/jsilver/snap/arduino/50/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7 -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino7.path=/home/jsilver/snap/arduino/50/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7 -prefs=runtime.tools.avrdude.path=/home/jsilver/snap/arduino/50/.arduino15/packages/arduino/tools/avrdude/6.3.0-arduino17 -prefs=runtime.tools.avrdude-6.3.0-arduino17.path=/home/jsilver/snap/arduino/50/.arduino15/packages/arduino/tools/avrdude/6.3.0-arduino17 -prefs=runtime.tools.arduinoOTA.path=/snap/arduino/50/hardware/tools/avr -prefs=runtime.tools.arduinoOTA-1.3.0.path=/snap/arduino/50/hardware/tools/avr -verbose /home/jsilver/snap/arduino/50/.arduino15/packages/keyboardio/hardware/avr/1.99.3/libraries/Model01-Firmware/Model01-Firmware.ino
Using board ‘model01’ from platform in folder: /home/jsilver/snap/arduino/50/.arduino15/packages/keyboardio/hardware/avr/1.99.3
Using core ‘arduino’ from platform in folder: /snap/arduino/50/hardware/arduino/avr
Detecting libraries used…
/home/jsilver/snap/arduino/50/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-g++ -c -g -Os -w -std=c++14 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Woverloaded-virtual -Wno-unused-parameter -Wno-unused-variable -Wno-ignored-qualifiers -Wno-sized-deallocation -w -x c++ -E -CC -mmcu=atmega32u4 -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_MODEL01 -DARDUINO_ARCH_AVR -DUSB_VID=0x1209 -DUSB_PID=0x2301 “-DUSB_MANUFACTURER=“Keyboardio”” "-DUSB_PRODUCT=“Model 01"” “-DKALEIDOSCOPE_HARDWARE_H=“Kaleidoscope-Hardware-Model01.h”” -DTWI_BUFFER_LENGTH=32 -I/snap/arduino/50/hardware/arduino/avr/cores/arduino -I/home/jsilver/snap/arduino/50/.arduino15/packages/keyboardio/hardware/avr/1.99.3/variants/model01 /tmp/arduino_build_13088/sketch/Model01-Firmware.ino.cpp -o /dev/null -DARDUINO_LIB_DISCOVERY_PHASE
Alternatives for Kaleidoscope.h: [Kaleidoscope@1.99.3]
ResolveLibrary(Kaleidoscope.h)
→ candidates: [Kaleidoscope@1.99.3]

… Compilation Log

/tmp/arduino_build_13088/Model01-Firmware.ino.elf
Sketch uses 25556 bytes (89%) of program storage space. Maximum is 28672 bytes.
Global variables use 1379 bytes (53%) of dynamic memory, leaving 1181 bytes for local variables. Maximum is 2560 bytes.
Forcing reset using 1200bps open/close on port /dev/ttyACM0
PORTS {/dev/ttyACM0, } / {/dev/ttyACM0, } => {}
PORTS {/dev/ttyACM0, } / {/dev/ttyACM0, } => {}
PORTS {/dev/ttyACM0, } / {/dev/ttyACM0, } => {}
PORTS {/dev/ttyACM0, } / {/dev/ttyACM0, } => {}
PORTS {/dev/ttyACM0, } / {/dev/ttyACM0, } => {}
PORTS {/dev/ttyACM0, } / {/dev/ttyACM0, } => {}
PORTS {/dev/ttyACM0, } / {/dev/ttyACM0, } => {}
PORTS {/dev/ttyACM0, } / {/dev/ttyACM0, } => {}
PORTS {/dev/ttyACM0, } / {/dev/ttyACM0, } => {}
PORTS {/dev/ttyACM0, } / {/dev/ttyACM0, } => {}
PORTS {/dev/ttyACM0, } / {/dev/ttyACM0, } => {}
PORTS {/dev/ttyACM0, } / {/dev/ttyACM0, } => {}
PORTS {/dev/ttyACM0, } / {/dev/ttyACM0, } => {}
PORTS {/dev/ttyACM0, } / {/dev/ttyACM0, } => {}
PORTS {/dev/ttyACM0, } / {/dev/ttyACM0, } => {}
PORTS {/dev/ttyACM0, } / {/dev/ttyACM0, } => {}
PORTS {/dev/ttyACM0, } / {/dev/ttyACM0, } => {}
PORTS {/dev/ttyACM0, } / {/dev/ttyACM0, } => {}
PORTS {/dev/ttyACM0, } / {/dev/ttyACM0, } => {}
PORTS {/dev/ttyACM0, } / {/dev/ttyACM0, } => {}
Uploading using selected port: /dev/ttyACM0
/home/jsilver/snap/arduino/50/.arduino15/packages/arduino/tools/avrdude/6.3.0-arduino17/bin/avrdude -C/home/jsilver/snap/arduino/50/.arduino15/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf -v -patmega32u4 -cavr109 -P/dev/ttyACM0 -b57600 -D -Uflash:w:/tmp/arduino_build_13088/Model01-Firmware.ino.hex:i

avrdude: Version 6.3-20190619
Copyright © 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright © 2007-2014 Joerg Wunsch

     System wide configuration file is "/home/jsilver/snap/arduino/50/.arduino15/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf"
     User configuration file is "/home/jsilver/snap/arduino/50/.avrduderc"
     User configuration file does not exist or is not a regular file, skipping

     Using Port                    : /dev/ttyACM0
     Using Programmer              : avr109
     Overriding Baud Rate          : 57600
     AVR Part                      : ATmega32U4
     Chip Erase delay              : 9000 us
     PAGEL                         : PD7
     BS2                           : PA0
     RESET disposition             : dedicated
     RETRY pulse                   : SCK
     serial program mode           : yes
     parallel program mode         : yes
     Timeout                       : 200
     StabDelay                     : 100
     CmdexeDelay                   : 25
     SyncLoops                     : 32
     ByteDelay                     : 0
     PollIndex                     : 3
     PollValue                     : 0x53
     Memory Detail                 :

                              Block Poll               Page                       Polled
       Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
       ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
       eeprom        65    20     4    0 no       1024    4      0  9000  9000 0x00 0x00
       flash         65     6   128    0 yes     32768  128    256  4500  4500 0x00 0x00
       lfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
       hfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
       efuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
       lock           0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
       calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
       signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

     Programmer Type : butterfly
     Description     : Atmel AppNote AVR109 Boot Loader

Connecting to programmer: .avrdude: butterfly_recv(): programmer is not responding

avrdude: butterfly_recv(): programmer is not responding
avrdude: butterfly_recv(): programmer is not responding
avrdude: butterfly_recv(): programmer is not responding
avrdude: butterfly_recv(): programmer is not responding
avrdude: butterfly_recv(): programmer is not responding
Found programmer: Id = “”; type =
Software Version = .; Hardware Version = .
avrdude: butterfly_recv(): programmer is not responding
avrdude: butterfly_recv(): programmer is not responding
avrdude: error: buffered memory access not supported. Maybe it isn’t
a butterfly/AVR109 but a AVR910 device?
avrdude: initialization failed, rc=-1
Double check connections and try again, or use -F to override
this check.

avrdude: butterfly_recv(): programmer is not responding
avrdude: error: programmer did not respond to command: leave prog mode
avrdude: butterfly_recv(): programmer is not responding
avrdude: error: programmer did not respond to command: exit bootloader

avrdude done. Thank you.

the selected serial port
does not exist or your board is not connected

After a few more tinkering, I’ve concluded that the device was wrong, should be ttyACM1 (but that only appears after keyboard is connected and doesn’t stay connected for long).

Unfortunately ttyACM1 has the wrong permissions on creation (root/root). Permissions revert when re-created.

After hacking around the permissions (permission changing script), I can see it and it starts flashing, but seems to not complete before timeout again…

I’m fairly confident this can be brought back to life, it just seems I can’t be fast enough…

I had the same kind of problem with my Atreus (flashing my own firmware), and I got it with Chrysalis by using the pinhole reset button.
To have a good timing, dmesg --follow was a life changer :

  • launch sudo dmesg --follow in a terminal
  • plug the keyboard and look at the connection / disconnection messages (I remember something like 3 or 4 seconds between them)
  • unplug the keyboard and see no message from dmesg : the keyboard has already vanished ! (Ready ?)
  • Load Chrysalis and open the firmware update (Steady ?)
  • Put a finger on the Prog button, re-plug the keyboard and with your third hand, click the button to launch the upload (Go !)
  • Look at the dmesg console : if the keyboard vanish before the upload finish, well… Same player shoot again !

It may takes some attempts to get the good timing, and a second person is a great help too :smile:

Good luck !

Thanks a lot! After a few tries I have now managed to bring it back to life. The dmesg tip to time things was very useful.

1 Like