opendrop v2.0固件备份和恢复与avrdude的关系

简要概述

OpenDrop-v2.0-Firmware_avrdude_guide (本文为PDF格式,推荐!)

opendrop2.0_firmware (用于OpenDrop V2.0,作为ZIP)

这份文件和博文是为以下人士准备的。

  • 想对avrdude在Sparkfun Pro Micro(或兼容)板上的使用有一个基本了解。
  • (ATmega32U4 5V, 16 MHz)
  • 获取OpenDrop v2.0(四个按钮)的固件文件 - 该固件不兼容较新的OpenDrop版本(带操纵杆的v2.1) - 请使用GitHub下载,自己编译并上传固件。
  • 不怕弄脏自己的手,在Linux下使用命令行的东西(并将承担后果--我们不对你因遵循本指南而破坏设备负责!)。谨慎使用并检查命令--读(r)和写(w)之间的区别实际上只有一个字母)

我不得不在我们的一个OpenDrop V2.0单元(有四个按钮)中修复一个坏掉的Arduino。在官方的GitHub仓库( -> https://github.com/GaudiLabs/OpenDrop ),下载会给你OpenDrop v2.1的代码(有一个操纵杆)。因此,我认为最简单的解决方案是备份另一个OpenDrop v2.0设备的固件,并将其复制到新的Arduino上。

我在Raspberry Pi单元上使用avrdude来备份固件,并将其写入新的Arduino上。备份需要几个步骤,并将Arduino放入适当的状态(也需要阅读!)。

我所遇到的陷阱

  • 检查你的USB电缆是否包括数据的接线 - 我试过的第一条电缆只能给Arduino供电,但它不会显示在USB设备中。
  • 从大多数博客复制和粘贴命令行代码,可能会以错误的方式呈现一些字符 - 考虑使用我提供的这篇文章的PDF文件,以确保正确输入代码。

设置和基本理解

OpenDrop v2.0由Arduino设备驱动,它与Sparkfun Pro Micro板兼容。(例如Deekrobot Pro Micro)

  • ATmega32U4 (5V, 16 MHz)
  • 用于供电和编程的集成微型USB端口

avrdude用于从Arduino读取和写入固件文件和设置。

我使用Raspberry Pi,因为我们是Raspberry Pi批准的经销商,而且我觉得使用Linux命令行比使用Windows更舒服。

安装avrdude。

sudo apt-get install avrdude

找到与avrdude一起使用的端口

从OpenDrop上拔下电源适配器,如果它一直插着的话。

将Arduino的microUSB线插入Arduino,并插入Raspberry Pi。该设备将发出哔哔声。

确保Arduino显示为一个USB设备。

/home/pi# lsusb

总线001设备005。ID 2341:8037 Arduino SA

总线 001 设备 004。ID 0424:7800 Standard Microsystems Corp.

总线001设备003。ID 0424:2514 Standard Microsystems Corp.USB 2.0集线器

总线001设备002。ID 0424:2514 Standard Microsystems Corp.USB 2.0集线器

总线001设备001:ID 1d6b:0002 Linux Foundation 2.0根枢纽

如果Arduino SA条目没有显示出来,请仔细检查你的USB电缆:有些电缆只传输电源,不传输数据。顺便说一下,这也是为什么我不能在Windows上使用Arduino IDE与这个设备的错误 - 我首先尝试了一个错误的USB电缆

找到端口,Sparkfun Pro Micro使用的就是这个端口。

ls /dev/tty*

/dev/tty /dev/tty12 /dev/tty17 /dev/tty21 /dev/tty26 /dev/tty30 /dev/tty35 /dev/tty4 /dev/tty44 /dev/tty49 /dev/tty53 /dev/tty58 /dev/tty62  /dev/ttyACM0

/dev/tty0 /dev/tty13 /dev/tty18 /dev/tty22 /dev/tty27 /dev/tty31 /dev/tty36 /dev/tty40 /dev/tty45 /dev/tty5 /dev/tty54 /dev/tty59 /dev/tty63 /dev/ttyAMA0

/dev/tty1 /dev/tty14 /dev/tty19 /dev/tty23 /dev/tty28 /dev/tty32 /dev/tty37 /dev/tty41 /dev/tty46 /dev/tty50 /dev/tty55 /dev/tty6 /dev/tty7 /dev/ttyprintk

/dev/tty10/dev/tty15/dev/tty2/dev/tty24/dev/tty29/dev/tty33/dev/tty38/dev/tty42/dev/tty47/dev/tty51/dev/tty56/dev/tty60/dev/tty8

/dev/tty11/dev/tty16/dev/tty20/dev/tty25/dev/tty3/dev/tty34/dev/tty39/dev/tty43/dev/tty48/dev/tty52/dev/tty57/dev/tty61/dev/tty9

你要找的是/dev/ttyACM0,或/dev/ttyUSB0这样的东西。

在我的例子中,它是/dev/ttyACM0

这个端口只有在设备被插入时才会出现。为了确保你有正确的端口,你可以尝试在连接OpenDrop和断开OpenDrop的情况下进行测试(MicroUSB -> Pi上的USB)。比较一下输出。我想你的输出应该也是/dev/ttyACM0。

创建用于备份的目录

我们将成为超级用户,创建备份文件的目录,并进入该目录。

伪装

mkdir /home/pi/opendrop2.0_bak

cd /home/pi/opendrop2.0_bak

使用avrdude

重置按钮(重要,不要跳过这部分)。

为了使avrdude工作,SparkFun Pro Micro必须处于正确的系统状态。为了使SparkFun Pro Micro进入正确的系统状态,您必须快速地按下复位按钮(标有RST),两次之后。设备将发出哔哔声,LED灯将开始闪烁。

你必须在这样做之后立即执行avrdude命令,因为设备在短暂的超时之后会回到正常状态。

对于我执行的每一条命令,我都在每条命令之后按了两次RST按钮。也许这些命令可以合并成一个shell脚本;因为我喜欢谨慎地使用,以免使用错误的命令行使设备变脆,所以我手动完成了这个过程。

如果你不像我所概述的那样使用RST按钮,你会从avrdude得到类似的错误。

连接到程序员:.avrdude: butterfly_recv(): 程序员没有回应

Firmare备份。阅读 - 概述

我们将备份

  • 闪光
  • 编码
  • 融合
  • 贷款
  • 易福生

参考:https://www.hackster.io/rayburne/avr-firmware-duplicator(小心,这里的avrdude设置对OpenDrop / Sparkfun Pro Micro来说是不正确的)。

固件备份。这些命令

如果还没有完成,请切换到你为固件备份文件准备的目录,并成为超级用户(root)。我不确定avrdude在没有root权限的情况下是否能开箱工作--如果你想的话可以试试。

确保你使用正确的端口(最可能是/dev/ttyACM0)。 确保你在阅读目标后有字母 "r"。......r表示读取;字母w将使用你的目标文件作为源文件,以覆盖你的Arduino Flash - 没有安全提示!。

备份文件名后面的字母r指定了输出类型,对于以后的恢复操作来说,正确掌握这一点很重要。如果你感到好奇,请阅读这里的手册:https://www.nongnu.org/avrdude/user-manual/avrdude_4.html

-p指定平台

-c程序员

-P 该端口

-U指定操作(源/目标:模式:目标/源:文件_模式)。

那么,这里是要使用的第一个命令,以及它的输出。

avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U flash:r:flash_backup_file_od2.0.hex:r

连接到编程器: 。

发现程序员。Id = "CATERIN"; type = S

    软件版本=1.0;没有给出硬件版本。

程序员支持自动增加地址。

程序员支持缓冲区大小=128字节的缓冲存储器访问。

 

编程器支持以下设备。

    设备代码。0x44

 

avrdude。AVR设备已初始化并准备接受指令

 

阅读|##################################################| 100% 0.00s

 

avrdude。设备签名=0x1e9587(可能是m32u4)。

avrdude:读取闪存。

 

阅读|##################################################| 100% 0.64s

 

avrdude: 写输出文件 "flash_backup_file_od2.0.hex"

 

avrdude: safemode:保险丝正常 (E:CB, H:D8, L:FF)

 

avrdude完成。 谢谢你。

 

这里是第二条命令。顺便说一下,你可以改变文件名(在这种情况下是eeprom_backup_file_od2.0.hex位)。

 

avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U eeprom:r:eeprom_backup_file_od2.0.hex:r

 

连接到编程器: 。

发现程序员。Id = "CATERIN"; type = S

    软件版本=1.0;没有给出硬件版本。

程序员支持自动增加地址。

程序员支持缓冲区大小=128字节的缓冲存储器访问。

 

编程器支持以下设备。

    设备代码。0x44

 

avrdude。AVR设备已初始化并准备接受指令

 

阅读|##################################################| 100% 0.00s

 

avrdude。设备签名=0x1e9587(可能是m32u4)。

avrdude:读取eeprom内存。

 

阅读|##################################################| 100% 1.76s

 

avrdude: 写输出文件 "eeprom_backup_file_od2.0.hex"

 

avrdude: safemode:保险丝正常 (E:CB, H:D8, L:FF)

 

avrdude完成。 谢谢你。

 

然后我们将备份三种不同类型的保险丝。这里是第一种。

 

avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U hfuse:r:hfuse_backup_file_od2.0.hex:r

 

连接到编程器: 。

发现程序员。Id = "CATERIN"; type = S

    软件版本=1.0;没有给出硬件版本。

程序员支持自动增加地址。

程序员支持缓冲区大小=128字节的缓冲存储器访问。

 

编程器支持以下设备。

    设备代码。0x44

 

avrdude。AVR设备已初始化并准备接受指令

 

阅读|##################################################| 100% 0.00s

 

avrdude。设备签名=0x1e9587(可能是m32u4)。

avrdude:读取hfuse内存。

 

阅读|##################################################| 100% 0.00s

 

avrdude: 写输出文件 "hfuse_backup_file_od2.0.hex"

 

avrdude: safemode:保险丝正常 (E:CB, H:D8, L:FF)

 

avrdude完成。 谢谢你。

 

现在是熔断器。

 

avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U lfuse:r:lfuse_backup_file_od2.0.hex:r

 

连接到编程器: 。

发现程序员。Id = "CATERIN"; type = S

    软件版本=1.0;没有给出硬件版本。

程序员支持自动增加地址。

程序员支持缓冲区大小=128字节的缓冲存储器访问。

 

编程器支持以下设备。

    设备代码。0x44

 

avrdude。AVR设备已初始化并准备接受指令

 

阅读|##################################################| 100% 0.00s

 

avrdude。设备签名=0x1e9587(可能是m32u4)。

avrdude: 读取lfuse内存。

 

阅读|##################################################| 100% 0.00s

 

avrdude: 写输出文件 "lfuse_backup_file_od2.0.hex"

 

avrdude: safemode:保险丝正常 (E:CB, H:D8, L:FF)

 

avrdude完成。 谢谢你。

 

现在是最后一个命令,即efuse。

 

avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U efuse:r:efuse_backup_file_od2.0.hex:r

 

连接到编程器: 。

发现程序员。Id = "CATERIN"; type = S

    软件版本=1.0;没有给出硬件版本。

程序员支持自动增加地址。

程序员支持缓冲区大小=128字节的缓冲存储器访问。

 

编程器支持以下设备。

    设备代码。0x44

 

avrdude。AVR设备已初始化并准备接受指令

 

阅读|##################################################| 100% 0.00s

 

avrdude。设备签名=0x1e9587(可能是m32u4)。

avrdude:读取efuse内存。

 

阅读|##################################################| 100% 0.00s

 

avrdude: 写输出文件 "efuse_backup_file_od2.0.hex"

 

avrdude: safemode:保险丝正常 (E:CB, H:D8, L:FF)

 

avrdude完成。 谢谢你。

 

记住,你需要按下RST按钮 两次 在每次操作前,都要进行检查!它是 不是 在执行RST操作后,有必要将Arduino从Raspberry Pi上拔下来。

 

创建一个ZIP文件

你可以使用以下命令创建一个ZIP文件(根据情况替换路径)。

sudo zip -r /home/pi/opendrop2.0_bak.zip /home/pi/opendrop2.0_bak

恢复固件

如果你需要恢复固件,请使用以下命令。同样,不要忘记在每条命令前按两次RST按钮!

在正确的目录下以root身份运行命令。确保你有字母 "w "用于向微控制器(本例中为Arduino)写入。

写入闪存文件。

avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U flash:w:flash_backup_file_od2.0.hex

连接到编程器: 。

发现程序员。Id = "CATERIN"; type = S

    软件版本=1.0;没有给出硬件版本。

程序员支持自动增加地址。

程序员支持缓冲区大小=128字节的缓冲存储器访问。

 

编程器支持以下设备。

    设备代码。0x44

 

avrdude。AVR设备已初始化并准备接受指令

 

阅读|##################################################| 100% 0.00s

 

avrdude。设备签名=0x1e9587(可能是m32u4)。

avrdude。注意:已经指定了 "闪存",将进行一次擦除循环。

         要禁用这个功能,请指定-D选项。

avrdude: 擦除芯片

avrdude:读取输入文件 "flash_backup_file_od2.0.hex"

avrdude: 写入闪存(32604字节)。

 

写作|##################################################| 100% 2.98s

 

avrdude: 写入32604字节的闪存

avrdude: 根据flash_backup_file_od2.0.hex验证闪存。

avrdude: 从输入文件flash_backup_file_od2.0.hex加载数据flash数据。

avrdude: 输入文件flash_backup_file_od2.0.hex包含32604字节

avrdude:读取片上闪存数据。

 

阅读|##################################################| 100% 0.76s

 

avrdude: 正在验证...

avrdude: 验证错误,在字节0x7000处有第一个不匹配。

         0x55 != 0x5f

avrdude: 验证错误;内容不匹配

 

avrdude: safemode:保险丝正常 (E:CB, H:D8, L:FF)

 

avrdude完成。 谢谢你。

 

注意:我试着写了几次,稍微改变了一下命令。在每一次尝试中,我都得到了验证错误;不过,固件工作正常--我的肤浅研究表明,这与微控制器外围的一些接线有关--在我做备份和恢复的时候,它被插入了OpenDrop中。我认为结果是不言而喻的,于是转而进行其他部分的恢复工作。你的结果可能在这里有所不同。不予保证!

 

恢复Eprom。

avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U eeprom:w:eeprom_backup_file_od2.0.hex

 

连接到编程器: 。

发现程序员。Id = "CATERIN"; type = S

    软件版本=1.0;没有给出硬件版本。

程序员支持自动增加地址。

程序员支持缓冲区大小=128字节的缓冲存储器访问。

 

编程器支持以下设备。

    设备代码。0x44

 

avrdude。AVR设备已初始化并准备接受指令

 

阅读|##################################################| 100% 0.00s

 

avrdude。设备签名=0x1e9587(可能是m32u4)。

avrdude:读取输入文件 "eeprom_backup_file_od2.0.hex"

avrdude: 输入文件eeprom_backup_file_od2.0.hex被自动检测为原始二进制文件

avrdude: 写入eeprom(1024字节)。

 

写作|##################################################| 100% 3.44s

 

avrdude: 写入1024字节的eeprom

avrdude: 根据eeprom_backup_file_od2.0.hex验证eeprom内存。

avrdude: 从输入文件eeprom_backup_file_od2.0.hex加载数据eeprom数据。

avrdude: 输入文件eeprom_backup_file_od2.0.hex被自动检测为原始二进制文件

avrdude: 输入文件eeprom_backup_file_od2.0.hex包含1024字节

avrdude:读取片上eeprom数据。

 

阅读|##################################################| 100% 1.76s

 

avrdude: 正在验证...

avrdude: 1024字节的eeprom已被验证

 

avrdude: safemode:保险丝正常 (E:CB, H:D8, L:FF)

 

avrdude完成。 谢谢你。

 

恢复保险丝(注意:我读到一些关于一些保险丝只能由12V的编程器恢复的消息。我也不知道)。

 

第一个hfuse。

avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U hfuse:w:hfuse_backup_file_od2.0.hex

 

连接到编程器: 。

发现程序员。Id = "CATERIN"; type = S

    软件版本=1.0;没有给出硬件版本。

程序员支持自动增加地址。

程序员支持缓冲区大小=128字节的缓冲存储器访问。

 

编程器支持以下设备。

    设备代码。0x44

 

avrdude。AVR设备已初始化并准备接受指令

 

阅读|##################################################| 100% 0.00s

 

avrdude。设备签名=0x1e9587(可能是m32u4)。

avrdude:读取输入文件 "hfuse_backup_file_od2.0.hex"

avrdude: 输入文件hfuse_backup_file_od2.0.hex自动检测为原始二进制文件

avrdude:写hfuse(1字节)。

 

写作 | | 0% 0.00s ***失败了。

写作|##################################################| 100% 0.00s

 

avrdude: 写了1字节的hfuse

avrdude: 根据hfuse_backup_file_od2.0.hex验证hfuse内存。

avrdude: 从输入文件hfuse_backup_file_od2.0.hex加载hfuse数据。

avrdude: 输入文件hfuse_backup_file_od2.0.hex自动检测为原始二进制文件

avrdude: 输入文件hfuse_backup_file_od2.0.hex包含1个字节。

avrdude:读取片上hfuse数据。

 

阅读|##################################################| 100% 0.00s

 

avrdude: 正在验证...

avrdude: 1字节的hfuse已被验证

 

avrdude: safemode:保险丝正常 (E:CB, H:D8, L:FF)

 

avrdude完成。 谢谢你。

 

现在是lfuse。

avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U lfuse:w:lfuse_backup_file_od2.0.hex

 

连接到编程器: 。

发现程序员。Id = "CATERIN"; type = S

    软件版本=1.0;没有给出硬件版本。

程序员支持自动增加地址。

程序员支持缓冲区大小=128字节的缓冲存储器访问。

 

编程器支持以下设备。

    设备代码。0x44

 

avrdude。AVR设备已初始化并准备接受指令

 

阅读|##################################################| 100% 0.00s

 

avrdude。设备签名=0x1e9587(可能是m32u4)。

avrdude:读取输入文件 "lfuse_backup_file_od2.0.hex"

avrdude: 输入文件 lfuse_backup_file_od2.0.hex 被自动检测为原始二进制文件

avrdude:写lfuse(1字节)。

 

写作 | | 0% 0.00s ***失败了。

写作|##################################################| 100% 0.00s

 

avrdude: 写了1字节的lfuse

avrdude: 根据lfuse_backup_file_od2.0.hex来验证lfuse内存。

avrdude: 从输入文件lfuse_backup_file_od2.0.hex加载数据lfuse数据。

avrdude: 输入文件 lfuse_backup_file_od2.0.hex 被自动检测为原始二进制文件

avrdude: 输入文件 lfuse_backup_file_od2.0.hex 包含1个字节

avrdude: 读取芯片上的lfuse数据。

 

阅读|##################################################| 100% 0.00s

 

avrdude: 正在验证...

avrdude: 1字节的lfuse已被验证

 

avrdude: safemode:保险丝正常 (E:CB, H:D8, L:FF)

 

avrdude完成。 谢谢你。

 

现在是efuse。

avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U efuse:w:efuse_backup_file_od2.0.hex

 

连接到编程器: 。

发现程序员。Id = "CATERIN"; type = S

    软件版本=1.0;没有给出硬件版本。

程序员支持自动增加地址。

程序员支持缓冲区大小=128字节的缓冲存储器访问。

 

编程器支持以下设备。

    设备代码。0x44

 

avrdude。AVR设备已初始化并准备接受指令

 

阅读|##################################################| 100% 0.00s

 

avrdude。设备签名=0x1e9587(可能是m32u4)。

avrdude:读取输入文件 "efuse_backup_file_od2.0.hex"

avrdude:输入文件efuse_backup_file_od2.0.hex被自动检测为原始二进制。

avrdude:写efuse(1字节)。

 

写作 | | 0% 0.00s ***失败了。

写作|##################################################| 100% 0.00s

 

avrdude: 写了1字节的efuse

avrdude: 根据efuse_backup_file_od2.0.hex验证efuse内存。

avrdude: 从输入文件efuse_backup_file_od2.0.hex加载efuse数据。

avrdude:输入文件efuse_backup_file_od2.0.hex被自动检测为原始二进制。

avrdude: 输入文件efuse_backup_file_od2.0.hex包含1个字节。

avrdude:读取片上efuse数据。

 

阅读|##################################################| 100% 0.00s

 

avrdude: 正在验证...

avrdude: 1字节的efuse已被验证

 

avrdude: safemode:保险丝正常 (E:CB, H:D8, L:FF)

 

avrdude完成。 谢谢你。

 

就是这样 - 固件已经恢复了。你现在可以从你的Raspberry Pi上拔下OpenDrop / SparkFun Pro Micro。

 

有用的链接和参考资料

  • https://www.nongnu.org/avrdude/user-manual/avrdude_4.html
  • https://askubuntu.com/questions/254835/how-can-i-know-the-usb-port
  • https://forum.arduino.cc/index.php?topic=403201.0 (avrdude命令用于其他目标!)
  • https://learn.sparkfun.com/tutorials/pro-micro–fio-v3-hookup-guide/introduction
  • https://www.hackster.io/rayburne/avr-firmware-duplicator (avrdude命令用于其他目标!)
  • https://forum.arduino.cc/index.php?topic=453997.0(关于闪存验证的错误)