摘要

我正在尝试将新固件刷新到AMJ40机械键盘。我可以“成功”闪烁十六进制,但键盘会通过恢复其默认行为来响应。

更多详情

这个的基本仓库是AMJ40,我的版本是here

我可以make新的.hex文件,而且似乎一切井井有条,但是当我使用键盘时,它只是具有默认行为。

我只是以为代码中没有任何内容,但是当我按下Reset按钮时,键盘停止工作,并且在make进程发送了reset命令之后,它又可以工作了—与旧版式一样。

这是make dfu的输出

ben@um:~/projects/git/AMJ40/src$ make dfu
dfu-programmer atmega32u4 erase
dfu-programmer atmega32u4 erase
dfu-programmer atmega32u4 flash AMJ40_lufa.hex
Validating...
17124 bytes used (59.72%)
dfu-programmer atmega32u4 reset


我试图将各种组合键保持为suggested here

我也手动尝试过emptying the chip。在这里are the contents of the memory after clearing it

如果我手动重新执行make dfu命令,我将得到相同的行为,即:

dfu-programmer atmega32u4 erase
dfu-programmer atmega32u4 erase
dfu-programmer atmega32u4 flash layout.hex
dfu-programmer atmega32u4 start


我目前正在尝试刷新的键盘映射如下所示:

KEYMAP(
    D,   O,   H,   E,   R,   T,   Y,   U,   I,   P,  A,  A,\
    D,   O,   H,   E,   R,   T,   Y,   J,   K,   L,  A,\
    D,   O,   H,   E,   R,   T,   Y,   M,   A,   A,  A,\
    A,   A,   A,        A,        A,        A,   A,  A),

 KEYMAP(
     F,   R,   U,   S,   T,   R,   A,   T,   E,   P,  A,  A,\
     D,   O,   H,   E,   R,   T,   Y,   J,   K,   L,  A,\
     D,   O,   H,   E,   R,   T,   Y,   M,   A,   A,  A,\
     A,   A,   A,        A,        A,        B,   B,  B),


这个荒谬的键盘映射是要非常清楚它是否在工作。我希望第一行的第二个键在闪烁后会显示O,但它总是会打印Q(就像常规的QWERTY键盘一样)。

怀疑

我看过了,但是在构建过程中某处可能引用了一个文件,该文件覆盖了我的意图。

芯片上可能还存在一些神秘的角落,可将其恢复为以前的设置,但我不知道这种情况会如何发生。

免责声明

这个问题不一定是编程问题,但是还有其他一些dfu-programmer尚未关闭,所以他们让我感到胆大。

最佳答案

我将此问题发布给Geekhack及其用户odd建议:


  键映射位于EEPROM中,因此它在重新启动后仍然存在。 ...此外,QMK固件具有擦除EEPROM十六进制,可用于擦除它。


那就是答案。命令dfu-programmer atmega32u4 erase不会擦除eeprom。为此,您需要用其他东西覆盖它。在这种情况下,其他内容是QMK quantum tools中的.hex文件。

文档中有一个细微的调整,它应该是:

dfu-programmer atmega32u4 flash-eeprom eeprom_reset.hex


但是在我的dfu-programmer版本中

dfu-programmer atmega32u4 flash --eeprom eeprom_reset.hex


我将此添加到我的make进程中。我将上面提到的十六进制文件复制到我的仓库中,然后将tmk_core_custom/rules.mk更改为dfu部分中的以下内容

dfu: $(TARGET).hex
...
    dfu-programmer $(MCU) erase
    dfu-programmer $(MCU) flash-eeprom tools/eeprom_reset.hex # <-add this line
    dfu-programmer $(MCU) erase
    dfu-programmer $(MCU) flash $(TARGET).hex
    dfu-programmer $(MCU) reset


这意味着我现在可以一步一步完成make dfu了。

未来的事情


我已将该行放入tmk_core_custom子模块中。理想情况下,我会找到一种方法使其可以在我的仓库中使用。
鉴于这些芯片的写入次数有限,因此最好先检查是否需要刷新eeprom。


我完全愿意提出建议,以使这个答案更好!

关于c - dfu-programmer声明已完成,但片上未更改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41788455/

10-11 17:04