OPENDROP V2.0 FIRMWARE BACKUP & RESTORE COM O AVRDUDE
Breve visão geral
OpenDrop-v2.0-Firmware_avrdude_guide (este artigo em PDF, recomendado!)
opendrop2.0_firmware (para OpenDrop V2.0 como ZIP)
Este documento & blog post é para pessoas que:
- quer obter um entendimento básico para o uso do avrdude com uma placa Sparkfun Pro Micro (ou compatível)
- (ATmega32U4 5V, 16 MHz)
- Obtenha arquivos de firmware para o OpenDrop v2.0 (quatro botões de pressão) - o firmware NÃO é compatível com versões mais recentes do OpenDrop (v2.1 com joystick) - por favor use o download do GitHub para compilar e carregar o Firmware você mesmo.
- não têm medo de sujar as mãos com coisas de linha de comando sob Linux (e suportarão as consequências - não somos responsáveis por você quebrar dispositivos seguindo este guia! Tenha cuidado e verifique os comandos - a diferença entre ler (r) e escrever (w) é literalmente apenas uma letra)
Tive de reparar um Arduino partido numa das nossas unidades OpenDrop V2.0 (com quatro botões de pressão). No repositório oficial do GitHub ( -> https://github.com/GaudiLabs/OpenDrop ), o download lhe dará o código para o OpenDrop v2.1 (com um joystick). Portanto, eu considerei que a solução mais fácil seria fazer backup do firmware de outro dispositivo OpenDrop v2.0, e copiá-lo para o novo Arduino.
Usei avrdude numa unidade Raspberry Pi para fazer o backup do firmware, e escrevi-o no novo Arduino. O backup requer vários passos, e colocar o Arduino no estado adequado (também necessário para a leitura!).
Armadilhas que eu encontrei
- verifique se o seu cabo USB inclui cablagem para dados - o primeiro cabo que tentei só alimentará o Arduino, mas não aparecerá nos dispositivos USB.
- Copiar & colar códigos de linha de comando da maioria dos blogs pode renderizar alguns caracteres de forma errada - considere o uso do documento PDF que eu forneço deste post, para garantir que o código seja inserido corretamente
Criação e compreensão básica
O OpenDrop v2.0 é accionado por um dispositivo Arduino, que é compatível com a placa Sparkfun Pro Micro. (Por exemplo, Deekrobot Pro Micro)
- ATmega32U4 (5V, 16 MHz)
- porta microUSB integrada para alimentação e programação
O avrdude é usado para ler e escrever ficheiros de firmware e definições de / para o Arduino.
Eu uso um Raspberry Pi, já que somos um revendedor aprovado pelo Raspberry Pi & eu me sinto confortável em usar a linha de comando Linux sobre Windows.
Instalação do avrdude:
sudo apt-get install avrdude
Localização do porto a utilizar com o avrdude
Desligue a fonte de alimentação da OpenDrop, se esta estivesse ligada à corrente.
Conecte o cabo microUSB do Arduino no Arduino, e no Raspberry Pi. O dispositivo irá apitar.
Certifique-se de que o Arduino aparece como um dispositivo USB:
/home/pi# lsusb
Autocarro 001 Dispositivo 005: ID 2341:8037 Arduino SA
Autocarro 001 Dispositivo 004: ID 0424:7800 Standard Microsystems Corp.
Autocarro 001 Dispositivo 003: ID 0424:2514 Standard Microsystems Corp. Hub USB 2.0
Autocarro 001 Dispositivo 002: ID 0424:2514 Standard Microsystems Corp. Hub USB 2.0
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Se a entrada Arduino SA NÃO aparecer, verifique novamente o seu cabo USB: alguns cabos só transmitem energia, não dados. A propósito, este também foi o erro pelo qual eu não pude usar o Arduino IDE no Windows com este dispositivo - eu estava tentando um cabo USB errado primeiro!
Encontre a porta, que a Sparkfun Pro Micro utiliza:
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
Você está procurando por algo como /dev/ttyACM0, ou /dev/ttyUSB0
No meu caso foi /dev/ttyACM0
Esta porta só estará presente, quando o dispositivo estiver ligado à corrente. Para garantir que você tenha a porta correta, você pode tentar listar com o OpenDrop sendo conectado, e o OpenDrop sendo desconectado (microUSB -> USB no Pi). Compare as saídas. Assumo que será /dev/ttyACM0 também para você.
Criar diretório para backup
Nós nos tornaremos o super usuário, criaremos o diretório para os arquivos de backup, e mudaremos para ele:
sudo su
mkdir /home/pi/opendrop2.0_bak
cd /home/pi/opendrop2.0_bak
Usando o avrdude
O botão reset (Importante, não pule esta parte)
Para o avrdude funcionar, a SparkFun Pro Micro tem de estar no estado correcto do sistema. Para colocar o SparkFun Pro Micro no estado correto do sistema, você deve pressionar o botão reset (rotulado RST) rapidamente duas vezes um após o outro. O dispositivo emitirá um bip, e o LED começará a piscar.
Você deve executar o comando avrdude imediatamente após fazer isso, pois o dispositivo voltará ao estado normal após um curto intervalo de tempo.
Para cada comando que executei, pressionei o botão RST duas vezes depois um do outro. Provavelmente os comandos poderiam ser combinados em um script shell; como eu gosto de usar cautela para não tijolo os dispositivos usando a linha de comando errada, eu pulei através do processo manualmente.
Se você não usar o botão RST, como eu já disse, você receberá erros do avrdude como:
Conectando-se ao programador: .avrdude: butterfly_recv(): programador não está respondendo
Apoio Firmare: Leitura - visão geral
Vamos fazer marcha atrás.
- flash
- eeprom
- hfuse
- lfuse
- efuse
Ref: https://www.hackster.io/rayburne/avr-firmware-duplicator (Cuidado, as configurações do avrdude aqui não estão corretas para o OpenDrop / Sparkfun Pro Micro).
Cópia de Segurança de Firmware: Os comandos
Se ainda não estiver pronto, mude para o diretório que você preparou para os arquivos de backup do Firmware, e torne-se o super usuário (root). Não tenho a certeza se o avrdude vai funcionar fora da caixa sem permissões de root - experimente se quiser.
Certifique-se de que utiliza a porta certa (muito provavelmente /dev/ttyACM0). Certifique-se de que você tem a letra "r" após o alvo de leitura. r como em leitura; uma letra w usaria seu arquivo de destino como fonte, para sobrescrever seu Arduino Flash - sem aviso de segurança!
A letra r após o nome do arquivo de backup especifica o tipo de saída, é importante acertar isso para a operação de restauração posterior. Se você estiver curioso, leia a página manpage aqui: https://www.nongnu.org/avrdude/user-manual/avrdude_4.html
-p especifica a plataforma
-c o programador
-P o porto
-U especifica a operação (fonte/target:mode:target/source:file_mode)
Aqui está, então, o primeiro comando a usar, e é a saída:
avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U flash:r:flash_backup_file_od2.0.hex:r
Conectando-se ao programador: .
Programador encontrado: Id = "CATERIN"; tipo = S
Versão de Software = 1.0; Não é fornecida Versão de Hardware.
O programador suporta o incremento de endereços automáticos.
O programador suporta acesso à memória buffer com buffersize=128 bytes.
O programador suporta os seguintes dispositivos:
Código do dispositivo: 0x44
Avrdude: Dispositivo AVR inicializado e pronto para aceitar instruções
Leitura | ################################################## | 100% 0.00s
Avrdude: Assinatura do dispositivo = 0x1e9587 (provavelmente m32u4)
avrdude: memória flash de leitura:
Leitura | ################################################## | 100% 0.64s
avrdude: escrevendo o arquivo de saída "flash_backup_file_od2.0.hex".
avrdude: safemode: Fusíveis OK (E:CB, H:D8, L:FF)
Avrdude feito. Obrigado.
Aqui está o segundo comando. A propósito, você pode mudar os nomes dos arquivos (neste caso o bit eeprom_backup_file_od2.0.hex):
avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U eeprom:r:eeprom_backup_file_od2.0.hex:r
Conectando-se ao programador: .
Programador encontrado: Id = "CATERIN"; tipo = S
Versão de Software = 1.0; Não é fornecida Versão de Hardware.
O programador suporta o incremento de endereços automáticos.
O programador suporta acesso à memória buffer com buffersize=128 bytes.
O programador suporta os seguintes dispositivos:
Código do dispositivo: 0x44
Avrdude: Dispositivo AVR inicializado e pronto para aceitar instruções
Leitura | ################################################## | 100% 0.00s
Avrdude: Assinatura do dispositivo = 0x1e9587 (provavelmente m32u4)
avrdude: leitura da memória eeprom:
Leitura | ################################################## | 100% 1.76s
avrdude: escrevendo o arquivo de saída "eeprom_backup_file_od2.0.hex".
avrdude: safemode: Fusíveis OK (E:CB, H:D8, L:FF)
Avrdude feito. Obrigado.
Depois vamos fazer backup de três tipos diferentes de fusíveis. Aqui está o primeiro:
avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U hfuse:r:hfuse_backup_file_od2.0.hex:r
Conectando-se ao programador: .
Programador encontrado: Id = "CATERIN"; tipo = S
Versão de Software = 1.0; Não é fornecida Versão de Hardware.
O programador suporta o incremento de endereços automáticos.
O programador suporta acesso à memória buffer com buffersize=128 bytes.
O programador suporta os seguintes dispositivos:
Código do dispositivo: 0x44
Avrdude: Dispositivo AVR inicializado e pronto para aceitar instruções
Leitura | ################################################## | 100% 0.00s
Avrdude: Assinatura do dispositivo = 0x1e9587 (provavelmente m32u4)
avrdude: leitura da memória hfuse:
Leitura | ################################################## | 100% 0.00s
avrdude: escrevendo o arquivo de saída "hfuse_backup_file_od2.0.hex".
avrdude: safemode: Fusíveis OK (E:CB, H:D8, L:FF)
Avrdude feito. Obrigado.
agora o rastilho:
avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U lfuse:r:lfuse_backup_file_od2.0.hex:r
Conectando-se ao programador: .
Programador encontrado: Id = "CATERIN"; tipo = S
Versão de Software = 1.0; Não é fornecida Versão de Hardware.
O programador suporta o incremento de endereços automáticos.
O programador suporta acesso à memória buffer com buffersize=128 bytes.
O programador suporta os seguintes dispositivos:
Código do dispositivo: 0x44
Avrdude: Dispositivo AVR inicializado e pronto para aceitar instruções
Leitura | ################################################## | 100% 0.00s
Avrdude: Assinatura do dispositivo = 0x1e9587 (provavelmente m32u4)
avrdude: leitura da memória do fusível:
Leitura | ################################################## | 100% 0.00s
avrdude: escrevendo o arquivo de saída "lfuse_backup_file_od2.0.hex".
avrdude: safemode: Fusíveis OK (E:CB, H:D8, L:FF)
Avrdude feito. Obrigado.
Agora o último comando, o efusível:
avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U efuse:r:efuse_backup_file_od2.0.hex:r
Conectando-se ao programador: .
Programador encontrado: Id = "CATERIN"; tipo = S
Versão de Software = 1.0; Não é fornecida Versão de Hardware.
O programador suporta o incremento de endereços automáticos.
O programador suporta acesso à memória buffer com buffersize=128 bytes.
O programador suporta os seguintes dispositivos:
Código do dispositivo: 0x44
Avrdude: Dispositivo AVR inicializado e pronto para aceitar instruções
Leitura | ################################################## | 100% 0.00s
Avrdude: Assinatura do dispositivo = 0x1e9587 (provavelmente m32u4)
avrdude: leitura da memória efuse:
Leitura | ################################################## | 100% 0.00s
avrdude: escrevendo o arquivo de saída "efuse_backup_file_od2.0.hex".
avrdude: safemode: Fusíveis OK (E:CB, H:D8, L:FF)
Avrdude feito. Obrigado.
Lembre-se de que você precisa pressionar o botão RST duas vezes antes de cada operação! É não necessário para desconectar o Arduino do Raspberry Pi após a execução da operação RST.
Criação de um ficheiro ZIP
você pode criar um arquivo ZIP usando o seguinte comando (substitua os caminhos conforme apropriado):
sudo zip -r /home/pi/opendrop2.0_bak.zip /home/pi/opendrop2.0_bak
Restaurando o firmware
Se você precisar restaurar o firmware, use os seguintes comandos. Mais uma vez, não se esqueça de carregar duas vezes no botão RST antes de cada comando!
Execute os comandos a partir do diretório correto como root. Certifique-se de que você tem a letra "w" para escrever no microcontrolador (Arduino, neste caso).
Escreva o arquivo flash:
avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U flash:w:flash_backup_file_od2.0.hex
Conectando-se ao programador: .
Programador encontrado: Id = "CATERIN"; tipo = S
Versão de Software = 1.0; Não é fornecida Versão de Hardware.
O programador suporta o incremento de endereços automáticos.
O programador suporta acesso à memória buffer com buffersize=128 bytes.
O programador suporta os seguintes dispositivos:
Código do dispositivo: 0x44
Avrdude: Dispositivo AVR inicializado e pronto para aceitar instruções
Leitura | ################################################## | 100% 0.00s
Avrdude: Assinatura do dispositivo = 0x1e9587 (provavelmente m32u4)
Avrdude: NOTA: a memória "flash" foi especificada, será executado um ciclo de apagamento
Para desactivar esta funcionalidade, especifique a opção -D.
avrdude: apagar o chip
avrdude: lendo arquivo de entrada "flash_backup_file_od2.0.hex".
avrdude: flash de escrita (32604 bytes):
Escrever | ################################################## | 100% 2.98s
avrdude: 32604 bytes de flash escrito
avrdude: verificando a memória flash contra flash_backup_file_od2.0.hex:
avrdude: carregar dados flash a partir do arquivo de entrada flash_backup_file_od2.0.hex:
avrdude: ficheiro de entrada flash_backup_file_od2.0.hex contém 32604 bytes
avrdude: leitura de dados on-chip flash:
Leitura | ################################################## | 100% 0.76s
avrdude: verificando ...
avrdude: erro de verificação, primeiro descasamento em byte 0x7000
0x55 != 0x5f
avrdude: erro de verificação; desajuste de conteúdo
avrdude: safemode: Fusíveis OK (E:CB, H:D8, L:FF)
Avrdude feito. Obrigado.
Nota: Eu tentei escrever várias vezes, variando ligeiramente o comando. Em cada tentativa eu recebi o erro de verificação; o firmware funciona bem, no entanto - minha pesquisa superficial mostrou que está relacionado a alguma fiação da periferia do microcontrolador - ele foi inserido no OpenDrop enquanto eu estava fazendo o backup e a restauração. Eu decidi que os resultados falam por si mesmos, e passei para a restauração das outras partes. Seus resultados podem variar aqui. Sem garantias dadas!
Restaurem o eeprom:
avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U eeprom:w:eeprom_backup_file_od2.0.hex
Conectando-se ao programador: .
Programador encontrado: Id = "CATERIN"; tipo = S
Versão de Software = 1.0; Não é fornecida Versão de Hardware.
O programador suporta o incremento de endereços automáticos.
O programador suporta acesso à memória buffer com buffersize=128 bytes.
O programador suporta os seguintes dispositivos:
Código do dispositivo: 0x44
Avrdude: Dispositivo AVR inicializado e pronto para aceitar instruções
Leitura | ################################################## | 100% 0.00s
Avrdude: Assinatura do dispositivo = 0x1e9587 (provavelmente m32u4)
avrdude: lendo arquivo de entrada "eeprom_backup_file_od2.0.hex"
avrdude: arquivo de entrada eeprom_backup_file_od2.0.hex auto detectado como binário bruto
avrdude: escrevendo eeprom (1024 bytes):
Escrever | ################################################## | 100% 3.44s
avrdude: 1024 bytes de eeprom escrito
avrdude: verificando a memória eeprom contra eeprom_backup_file_od2.0.hex:
avrdude: carregar dados eeprom dados do arquivo de entrada eeprom_backup_file_od2.0.hex:
avrdude: arquivo de entrada eeprom_backup_file_od2.0.hex auto detectado como binário bruto
avrdude: ficheiro de entrada eeprom_backup_file_od2.0.hex contém 1024 bytes
avrdude: leitura de dados on-chip eeprom:
Leitura | ################################################## | 100% 1.76s
avrdude: verificando ...
avrdude: 1024 bytes de eeprom verificados
avrdude: safemode: Fusíveis OK (E:CB, H:D8, L:FF)
Avrdude feito. Obrigado.
Restaurar os fusíveis (Nota: Eu li algo sobre alguns fusíveis serem apenas reinicializáveis por um programador de 12 V. YMMV).
Primeiro rastilho:
avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U hfuse:w:hfuse_backup_file_od2.0.hex
Conectando-se ao programador: .
Programador encontrado: Id = "CATERIN"; tipo = S
Versão de Software = 1.0; Não é fornecida Versão de Hardware.
O programador suporta o incremento de endereços automáticos.
O programador suporta acesso à memória buffer com buffersize=128 bytes.
O programador suporta os seguintes dispositivos:
Código do dispositivo: 0x44
Avrdude: Dispositivo AVR inicializado e pronto para aceitar instruções
Leitura | ################################################## | 100% 0.00s
Avrdude: Assinatura do dispositivo = 0x1e9587 (provavelmente m32u4)
avrdude: lendo arquivo de entrada "hfuse_backup_file_od2.0.hex"
avrdude: arquivo de entrada hfuse_backup_file_od2.0.hex auto detectado como binário bruto
avrdude: escrevendo hfuse (1 bytes):
Escrevendo | | 0% 0.00s ***failed;
Escrever | ################################################## | 100% 0.00s
avrdude: 1 bytes de hfuse escrito
avrdude: verificando a memória hfuse contra hfuse_backup_file_od2.0.hex:
avrdude: carregar dados hfuse dados do arquivo de entrada hfuse_backup_file_od2.0.hex:
avrdude: arquivo de entrada hfuse_backup_file_od2.0.hex auto detectado como binário bruto
avrdude: ficheiro de entrada hfuse_backup_file_od2.0.hex contém 1 bytes
avrdude: leitura de dados hfusíveis no chip:
Leitura | ################################################## | 100% 0.00s
avrdude: verificando ...
avrdude: 1 bytes de hfuse verificado
avrdude: safemode: Fusíveis OK (E:CB, H:D8, L:FF)
Avrdude feito. Obrigado.
agora rastilho:
avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U lfuse:w:lfuse_backup_file_od2.0.hex
Conectando-se ao programador: .
Programador encontrado: Id = "CATERIN"; tipo = S
Versão de Software = 1.0; Não é fornecida Versão de Hardware.
O programador suporta o incremento de endereços automáticos.
O programador suporta acesso à memória buffer com buffersize=128 bytes.
O programador suporta os seguintes dispositivos:
Código do dispositivo: 0x44
Avrdude: Dispositivo AVR inicializado e pronto para aceitar instruções
Leitura | ################################################## | 100% 0.00s
Avrdude: Assinatura do dispositivo = 0x1e9587 (provavelmente m32u4)
avrdude: leitura do ficheiro de entrada "lfuse_backup_file_od2.0.hex".
avrdude: ficheiro de entrada lfuse_backup_file_od2.0.hex auto detectado como binário bruto
avrdude: escrever lfuse (1 bytes):
Escrevendo | | 0% 0.00s ***failed;
Escrever | ################################################## | 100% 0.00s
avrdude: 1 bytes de lfuse escrito
avrdude: verificando a memória lfuse contra lfuse_backup_file_od2.0.hex:
avrdude: carregar dados lfuse dados do arquivo de entrada lfuse_backup_file_od2.0.hex:
avrdude: ficheiro de entrada lfuse_backup_file_od2.0.hex auto detectado como binário bruto
avrdude: ficheiro de entrada lfuse_backup_file_od2.0.hex contém 1 bytes
avrdude: leitura de dados no chip lfuse:
Leitura | ################################################## | 100% 0.00s
avrdude: verificando ...
avrdude: 1 bytes de lfuse verificado
avrdude: safemode: Fusíveis OK (E:CB, H:D8, L:FF)
Avrdude feito. Obrigado.
agora efuse:
avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U efuse:w:efuse_backup_file_od2.0.hex
Conectando-se ao programador: .
Programador encontrado: Id = "CATERIN"; tipo = S
Versão de Software = 1.0; Não é fornecida Versão de Hardware.
O programador suporta o incremento de endereços automáticos.
O programador suporta acesso à memória buffer com buffersize=128 bytes.
O programador suporta os seguintes dispositivos:
Código do dispositivo: 0x44
Avrdude: Dispositivo AVR inicializado e pronto para aceitar instruções
Leitura | ################################################## | 100% 0.00s
Avrdude: Assinatura do dispositivo = 0x1e9587 (provavelmente m32u4)
avrdude: leitura do ficheiro de entrada "efuse_backup_file_od2.0.hex"
avrdude: arquivo de entrada efuse_backup_file_od2.0.hex auto detectado como binário bruto
avrdude: efuse de escrita (1 bytes):
Escrevendo | | 0% 0.00s ***failed;
Escrever | ################################################## | 100% 0.00s
avrdude: 1 bytes de efuse escrito
avrdude: verificando a memória efuse contra efuse_backup_file_od2.0.hex:
avrdude: carregar dados efuse dados do arquivo de entrada efuse_backup_file_od2.0.hex:
avrdude: arquivo de entrada efuse_backup_file_od2.0.hex auto detectado como binário bruto
avrdude: ficheiro de entrada efuse_backup_file_od2.0.hex contém 1 bytes
avrdude: leitura de dados do efusível no chip:
Leitura | ################################################## | 100% 0.00s
avrdude: verificando ...
avrdude: 1 bytes de efuse verificado
avrdude: safemode: Fusíveis OK (E:CB, H:D8, L:FF)
Avrdude feito. Obrigado.
É isso mesmo - o firmware foi restaurado. Você pode desconectar o OpenDrop / SparkFun Pro Micro do seu Raspberry Pi agora.
Links e referências úteis
- 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 (comando avrdude para outros alvos!)
- https://learn.sparkfun.com/tutorials/pro-micro–fio-v3-hookup-guide/introduction
- https://www.hackster.io/rayburne/avr-firmware-duplicator (comando avrdude para outros alvos!)
- https://forum.arduino.cc/index.php?topic=453997.0 (relativo ao erro com verificação do flash)