ESP32 (38) – Factory reset

luca 13/01/2019 3

Negli ultimi due articoli di questo tutorial, vi ho mostrato come aggiornare over the air il firmware in esecuzione nel chip esp32.

A volte è però necessario ritornare al firmware di fabbrica, ovvero quello memorizzato nella flash al momento della programmazione del chip. Molti dispositivi elettronici dispongono di un pulsante o pin che, se premuto per qualche secondo, effettua questo reset:

A10317_image1

In questo articolo vi mostrerò come aggiungere questa possibilità al vostro progetto.

Partizioni

Come spiegato in un precedente articolo, la memoria flash collegata al chip esp32 è suddivisa in diverse partizioni, secondo un layout configurato in fase di programmazione del chip.

Le partizioni che possono contenere un firmware sono di tipo app. La partizione che contiene il firmware memorizzato in fase di programmazione ha il sottotipo factory.

Il framework esp-idf mette a disposizione una funzione per cercare le partizioni all’interno della memoria flash:

#include "esp_partition.h"
[...]
esp_partition_iterator_t esp_partition_find(
  esp_partition_type_t type, esp_partition_subtype_t subtype, const char* label);

E’ possibile indicare alcuni filtri per restringere la ricerca: il tipo (type) di partizione, l’eventuale sottotipo (subtype) e infine una etichetta (label).

Per cercare la partizione che contiene il firmware di fabbrica possiamo quindi scrivere:

esp_partition_iterator_t pi = esp_partition_find(
  ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_APP_FACTORY, NULL);

La funzione restituisce un partition iterator, ovvero un oggetto che consente di scorrere tra le diverse partizioni trovate.

Se la ricerca ha avuto successo, tale oggetto è diverso da NULL ed è possibile ottenere un puntatore alla partizione con la funzione:

const esp_partition_t* esp_partition_get(esp_partition_iterator_t iterator);

Una volta terminato l’uso, è importante rilasciare l’oggetto iterator con:

void esp_partition_iterator_release(esp_partition_iterator_t iterator);

Ottenuta la partizione con il firmware di fabbrica, non rimane che configurarla nuovamente come partizione di boot e riavviare il chip:

if(pi != NULL) {
  const esp_partition_t* factory = esp_partition_get(pi);
  esp_partition_iterator_release(pi);
  if(esp_ota_set_boot_partition(factory) == ESP_OK) esp_restart();	
}

Demo

Nel video seguente (sottotitoli in italiano disponibili), vi mostro come effettuare il factory reset del chip. Nel video spiego inoltre come poter “contare” il numero di secondi in cui un pulsante è premuto per attivare la procedura di reset solo oltre una soglia fissata (3 secondi in questo esempio). Buona visione!

3 Comments »

  1. Germán 13/01/2019 at 12:14 - Reply

    Ciao Luca. I cannot find video link on this post. Anyway I’ve found it on Google. Good job! I didn’t know this function. Thank you

  2. spleen 29/01/2019 at 15:40 - Reply

    hi
    it’s possibile to make a tool like this
    http://handheldsci.com/kb

    with esp32?

    transform a usb keyboard in a bluetooth one

    thanks

    • luca 01/02/2019 at 14:35 - Reply

      not an easy way because of esp32 doesn’t include an hardware usb host controller (needed to connect to usb keyboard/mouse)

Leave A Response »

Questo sito usa i cookie per poterti offrire una migliore esperienza di navigazione maggiori informazioni

Questo sito utilizza i cookie per fonire la migliore esperienza di navigazione possibile. Continuando a utilizzare questo sito senza modificare le impostazioni dei cookie o clicchi su "Accetta" permetti al loro utilizzo.

Chiudi