Bootloader para ESP8266

Projeto de um bootloader para ESP8266 totalmente open source.

Quando você faz o download da SDK para esp8266 da Espressif, o bootloader disponibilizado é apenas no formato binário (boot_v1.7.bin) no qual impossibilita qualquer tipo de otimização.


O objetivo do nosso bootloader é apenas checar e carregar um dos dois binários na flash, no qual carregará primeiro o binário no endereço 0x81000, se não conseguir tentará carregar o binário no endereço 0x01000, se as duas tentativas falharem, então ficará em um loop piscando um led configurado no GPIO14.


O código fonte está bem comentado, então não vi a necessidade de descrever todos os detalhes do funcionamento, ate mesmo por que é pouco código.

Objetivo do Bootloader para ESP8266

Para que possamos ter um bootloader simples, rápido e costumável, esse bootloader foi criado com o objetivo principal era padronizar alguns produtos da Bintechnology, no qual segue a seguinte estrutura:


Quando o ESP8266 inicializar o nosso bootloader vai sempre tentar carregar a aplicação APP2 (0x81000) que é a aplicação normal (nosso caso MODBUS/MQTT) com as funcionalidades do produto, onde que alterando uma flag que fica armazenada na RAM do RTC que por sua vez não é zerado quando for executado um Reset via software, então após Reset o nosso bootloader vai verificar essa flag setada pelo APP2 e vai carregar o APP1 (0x01000) que tem o proposito apenas de atualizar firmware (FOTA) através de uma aplicação Windows que carregar o novo firmware no endereço 0x81000, ou seja, atualizando o APP2, se acaso a atualização falhar e a placa for reiniciada o nosso bootloader não conseguirá carregar o APP2, e por isso carregará novamente o APP1 e ficará nesse modo até que o novo firmware no endereço 0x81000 for carregado com sucesso.

Processo de boot do esp8266

Quando o esp8266 é alimentado um firmware em ROM verifica os GPIO0, GPIO2, e GPIO15 e decide como inicializará:

  • GPIO0=0,GPIO2=1,GPIO15=0 -> boot pela UART, modo atualização de firmware;
  • GPIO0=1,GPIO2=1,GPIO15=0 -> boot pela FLASH, carregará o nosso bootloader;

Existem outros modos, mas não são necessários mencionar.

Como o firmware em ROM carrega o nosso bootloader

Após os GPIOs devidamente configurados para dar boot pela flash, o firmware em ROM verificará os primeiros 8bytes da flash endereço 0x00000 onde é necessário que exista um cabeçalho em um formato especifico da Espressif, por isso o nosso binário de bootloader que estará nesse endereço precisa obedecer esse formato no qual será descrito a seguir:

Bootloader para ESP8266

É importante mencionar que existe um pino especial para inicializar um modo de teste GPIO1 (UART TX), esse pino nunca pode ser inicializado com algum tipo de pulldown, senão o esp8266 entrará no modo "chip_test_mode"

Requisitos

toolchain xtensa-lx106-elf (v4.8.2)
não precisa da SDK para compilar o projeto

dados do cabeçalho:
flash_mode = 0:QIO
flash_clk_div = 0:80m/2
flash_size_map = 2:1024 KB (512 KB + 512 KB)

Observação

 As duas aplicações APP1 e APP2 são baseadas na SDK 3.0.0.
Além do cabeçalho do bootloader cada aplicação tem seu próprio cabeçalho
Nesse caso é importante lembrar que flash_size_map=2 faz com que APP2 seja
no endereço 0x81000, no arquivo main.c do bootloader você pode alterar esse endereço se acaso você utilizar outro tamanho de flash.


Outra coisa importante é que a partir da SDK 3.0.0 é necessário configurar
a tabela de partições através da função "void ICACHE_FLASH_ATTR user_pre_init(void)"
e dentro dela chamar system_partition_table_regist(esp_patition_table,
sizeof(esp_patition_table)/sizeof(esp_patition_table[0]),
FLASH_SIZE_8M_MAP_512_512))


Todos os detalhes estão nas documentações da SDK

Você encontra o codigo fonte do bootloader no meu Gitihub: https://github.com/ezequieldonhauser/ESP8266_BOOTLOADER

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Software » Bootloader para ESP8266
Talvez você goste:

Nenhum resultado encontrado.

Comentários:

4
Deixe um comentário

avatar
2 Comentários
2 Respostas
0 Seguidores
 
Discussão de maior alcance
Discussão mais quente
3 Autores de comentários
IgorCesar AugustoEzequiel Donhauser Comentários recentes
  Notificações  
recentes antigos mais votados
Notificar
Igor
Visitante
Igor

Parabéns pelo conteúdo, realmente impressionante

Cesar Augusto
Visitante
CESAR A BONADIO

Olá Ezequiel, parabéns pela publicação

fiquei com uma dúvida sobre o o cabeçalho, lá aparecem 4 bytes de flags mas você lista 5 flags
E9 (fixo)
02 (numero de partições)
Mas ai aparecem esses 3 flags
flash_mode = 0:QIO
flash_clk_div = 0:80m/2
flash_size_map = 2:1024 KB (512 KB + 512 KB)
Como essas 3 informações compõem os outros dois bytes (00 00)

Obrigado

Cesar Augusto
Visitante
CESAR A BONADIO

Perfeito, muito obrigado e novamente parabéns pelo artigo
[]s

Séries

Menu