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(关于闪存验证的错误)