# Upgrading AirLift ESP32 Firmware

## Overview

![](https://cdn-learn.adafruit.com/assets/assets/000/081/463/medium800/wireless_adafruit_io_airlift_io.png?1569517697)

If you want to keep the firmware on your ESP32 WiFi-BLE co-processor up-to-date, you'll need to update the firmware on the ESP32.&nbsp;

You're going to to **turn your board into a USB-to-Serial converter** &nbsp;to **flash new firmware to your ESP32&nbsp; -**  **no extra hardware required**!&nbsp;

This process is mostly setup and should take from 10 to 20 minutes.

Warning: 

Info: 

# Why would I update my ESP32's firmware?

Using an ESP32 as a WiFi-BLE co-processor is a way to connect your CircuitPython and Arduino projects to the internet. Having WiFi managed by a separate chip means your code is simpler, you don't have to cache socket data, or compile in & debug an SSL library.&nbsp;

Adafruit ships a variety of products which use the ESP32 as a WiFi-BLE co-processor with a variant of the [Arduino nina-fw core](https://github.com/arduino/nina-fw/). This firmware is programmed to the ESP32 at the Adafruit factory. If you wish to update to a newer version of nina-fw, you'll need to upload it to the ESP32.

**BLE is supported on the ESP32 co-processor only with version NINA\_W102-1.7.1.bin or later of the firmware (released in October 2020). If you want BLE support, it is quite likely you'll need to upgrade.**

**Recent versions of the firmware (versions 3.x.x and up) have a much more complete and newer list of root certificates, which are needed to connect using SSL/TLS/HTTPS. This is another reason to upgrade.**

# Parts
### External ESP32 Co-Processors

If you already have a project which uses a popular microcontroller (like the ATMega328 or ATSAMD51), you can easily add WiFi by using an externally connected ESP32 module.

### Adafruit AirLift – ESP32 WiFi Co-Processor Breakout Board

[Adafruit AirLift – ESP32 WiFi Co-Processor Breakout Board](https://www.adafruit.com/product/4201)
Give your plain ol' microcontroller project a _lift_ with the Adafruit AirLift - a breakout board that lets you use the powerful ESP32 as a WiFi co-processor. You probably have your favorite microcontroller (like the ATmega328 or ATSAMD51), awesome peripherals and lots of libraries....

Out of Stock
[Buy Now](https://www.adafruit.com/product/4201)
[Related Guides to the Product](https://learn.adafruit.com/products/4201/guides)
![Top view of Adafruit AirLift Breakout Board.](https://cdn-shop.adafruit.com/640x480/4201-08.jpg)

### Adafruit AirLift FeatherWing – ESP32 WiFi Co-Processor

[Adafruit AirLift FeatherWing – ESP32 WiFi Co-Processor](https://www.adafruit.com/product/4264)
Give your Feather project a _lift_ with the Adafruit AirLift FeatherWing - a FeatherWing that lets you use the powerful ESP32 as a WiFi co-processor. You probably have your favorite Feather ([like the Feather M4](https://www.adafruit.com/product/3857)) that comes with its own...

In Stock
[Buy Now](https://www.adafruit.com/product/4264)
[Related Guides to the Product](https://learn.adafruit.com/products/4264/guides)
![Angled shot of Adafruit AirLift FeatherWing.](https://cdn-shop.adafruit.com/640x480/4264-07.jpg)

### Adafruit AirLift Shield - ESP32 WiFi Co-Processor

[Adafruit AirLift Shield - ESP32 WiFi Co-Processor](https://www.adafruit.com/product/4285)
Give your Arduino project a _lift_ with the Adafruit AirLift Shield - a shield that lets you use the powerful ESP32 as a WiFi co-processor. You probably have your favorite Arduino-compatible ([like the Metro M4](https://www.adafruit.com/product/3382) or the classic <a...></a...>

In Stock
[Buy Now](https://www.adafruit.com/product/4285)
[Related Guides to the Product](https://learn.adafruit.com/products/4285/guides)
![Angled shot of Wi-Fi co-processor shield PCB.](https://cdn-shop.adafruit.com/640x480/4285-05.jpg)

### Adafruit AirLift Bitsy Add-On – ESP32 WiFi Co-Processor

[Adafruit AirLift Bitsy Add-On – ESP32 WiFi Co-Processor](https://www.adafruit.com/product/4363)
Give your ItsyBitsy project a _lift_ with the Adafruit AirLift Bitsy Add-On - a daughterboard that lets you use the powerful ESP32 as a WiFi co-processor. You probably have your favorite ItsyBitsy ([like the Itsy' M4](https://www.adafruit.com/product/3800)) that comes...

In Stock
[Buy Now](https://www.adafruit.com/product/4363)
[Related Guides to the Product](https://learn.adafruit.com/products/4363/guides)
![Adafruit AirLift Bitsy Add-On – ESP32 WiFi Co-Processor connected to a half sized white breadboard and a OLED with various wording showing on the display. ](https://cdn-shop.adafruit.com/product-videos/640x480/4363-05.jpg)

### ESP32 Co-Processor All-in-One Boards

_Don't want to add extra hardware to your project?_&nbsp;Consider grabbing a board which has an ESP32 WiFi co-processor built-in.

### Adafruit PyPortal - CircuitPython Powered Internet Display

[Adafruit PyPortal - CircuitPython Powered Internet Display](https://www.adafruit.com/product/4116)
 **PyPortal** , our easy-to-use IoT device that allows you to create all the things for the “Internet of Things” in minutes. Make custom touch screen interface GUIs, all open-source, and Python-powered using&nbsp;tinyJSON / APIs to get news, stock, weather, cat photos,...

In Stock
[Buy Now](https://www.adafruit.com/product/4116)
[Related Guides to the Product](https://learn.adafruit.com/products/4116/guides)
![Front view of a Adafruit PyPortal - CircuitPython Powered Internet Display with a pyportal logo image on the display. ](https://cdn-shop.adafruit.com/640x480/4116-00.jpeg)

### Adafruit Metro M4 Express AirLift (WiFi) - Lite

[Adafruit Metro M4 Express AirLift (WiFi) - Lite](https://www.adafruit.com/product/4000)
Give your next project a lift with _AirLift_ - our witty name for the ESP32 co-processor that graces this Metro M4. You already know about the&nbsp; **Adafruit Metro M4** &nbsp;featuring the&nbsp; **Microchip ATSAMD51** , with it's 120MHz Cortex M4 with...

In Stock
[Buy Now](https://www.adafruit.com/product/4000)
[Related Guides to the Product](https://learn.adafruit.com/products/4000/guides)
![Adafruit Metro M4 Airlift Lite dev board with SAMD51 an ESP32 Wifi Co-processor.](https://cdn-shop.adafruit.com/640x480/4000-08.jpg)

### Materials
### Part: USB Cable
quantity: 1
USB cable - USB A to Micro-B - 3 foot long
[USB Cable](https://www.adafruit.com/product/592)

# Upgrading AirLift ESP32 Firmware

## Upgrade All-in-One ESP32 AirLift Firmware

## Upload Passthrough Code

First, you'll need to upload the code below to allow your board to act as a programmer for the ESP32 AirLift module.

**Back up any code and files on your CIRCUITPY drive**. The code will overwrite the drive's contents. You should not end up losing any files on the QSPI flash, but it's a good idea to back them up anyways.&nbsp;

Download the **UF2** file for your board and save it to your computer's Desktop.

[Matrix Portal M4 ESP32 Passthrough TinyUSB 2023-07-30 UF2](https://cdn-learn.adafruit.com/assets/assets/000/123/156/original/MatrixPortal_M4_ESP32_Passthrough_TinyUSB_2023_07_30.uf2?1690759438)
[Metro M4 AirLift ESP32 Passthrough TinyUSB 2023-07-30 UF2](https://cdn-learn.adafruit.com/assets/assets/000/123/158/original/Metro_M4_Airlift_ESP32_Passthrough_TinyUSB_2023_07_30.uf2)
[PyPortal M4 ESP32 Passthrough TinyUSB 2023-07-30 UF2](https://cdn-learn.adafruit.com/assets/assets/000/123/157/original/PyPortal_M4_ESP_32_Passthrough_TinyUSB_2023_07_30.uf2)
To enter bootloader mode, start with your board unplugged from USB. Next, find the reset button on your board. It's a small, black button, and on most of the boards, it will be the only button available.&nbsp;

![](https://cdn-learn.adafruit.com/assets/assets/000/114/178/medium800/wireless_reset_btn.png?1660598320)

Once successful, the RGB LED on the board will flash red and then stay green. A new drive will show up on your computer. The drive will be called **_boardname_BOOT** where _boardname_ is a reference to your specific board. For example, a Feather will have **FEATHERBOOT** and a Trinket will have **TRINKETBOOT** etc.

You will see a new disk drive appear called&nbsp; **_boardname_BOOT**. The board is now in bootloader mode.

![wireless_circuitpython_FeatherBootWindows.png](https://cdn-learn.adafruit.com/assets/assets/000/114/179/medium640/wireless_circuitpython_FeatherBootWindows.png?1660598380)

Find the **.UF2** file you downloaded and drag that file to the new&nbsp;drive on your computer.

![](https://cdn-learn.adafruit.com/assets/assets/000/114/181/medium800/wireless_Screenshot_9_26_19__2_51_PM.png?1660598460)

The board's LED should flash and the drive will disappear. Your board should re-enumerate USB and appear as a COM or Serial port on your computer. Make a note of the serial port by checking the **Device Manager** (Windows) or **typing&nbsp;`ls /dev/cu*`&nbsp;or&nbsp;`/dev/tty*`** &nbsp;(Mac or Linux) **in a terminal.**

![](https://cdn-learn.adafruit.com/assets/assets/000/114/164/medium800/upgrading_airlift_firmware_wireless_fish___Users_brent__fish_.png?1660595322)

![](https://cdn-learn.adafruit.com/assets/assets/000/114/165/medium800/upgrading_airlift_firmware_wireless_fish___Users_brent__fish__%281%29.png?1660595326)

## **Download NINA Firmware**

**Click the link below** &nbsp;to download the latest version of the NINA firmware.&nbsp; **Unzip** &nbsp;it&nbsp; **and save the .bin file to your desktop**.

Info: 

[Download the latest nina-fw .bin file](https://github.com/adafruit/nina-fw/releases/latest)
Next, you'll need to flash the firmware to your ESP32 AirLift module.

If you're using the Google Chrome browser or Microsoft Edge (version 89 or later), you may follow the instructions below for programming using your board.

For advanced users who have **esptool.py** installed, skip to the bottom of the page.

## Upload NINA Firmware

Next, you'll need to upload the new version of NINA firmware to your ESP32 AirLift. To do this, we'll use the web-based implementation of the flasher tool for Espressif chips, ESPTool. You will need to be running Google Chrome or Microsoft Edge (version 89 or later) to follow the steps below.

**Safari and Firefox, etc. are _not_**** &nbsp;supported **because we need Web Serial and only Chrome is supporting it to the level needed.** If you're using an unsupported browser **, you'll need to either switch to Google Chrome or upload NINA firmware using the Python** esptool.py** program from your computer (Scroll down to _Upload NINA Firmware with esptool.py,_)

Warning: 

On your Google Chrome browser, navigate to [https://adafruit.github.io/Adafruit\_WebSerial\_ESPTool/](https://adafruit.github.io/Adafruit_WebSerial_ESPTool/)

Turn _ **on** _ the toggle labeled **No reset for Passthrough updates** :

![Turn on "no reset for passthrough toggle](https://cdn-learn.adafruit.com/assets/assets/000/138/555/medium800/upgrading_airlift_firmware_no-reset-for-passthrough-on.png?1753304041 )

In the top-right corner, select 115200 as the baud rate and click the **Connect** button.

![](https://cdn-learn.adafruit.com/assets/assets/000/114/167/medium800/upgrading_airlift_firmware_baud_web.png?1660597391)

You will get a pop-up asking you to select the board's COM or Serial port.

- If there are a lot of boards and ports appearing in this list and you're not sure what to select - remove all other USB devices so only your board is attached, that way there's no confusion over multiple ports!&nbsp;

Click **Connect**.

![](https://cdn-learn.adafruit.com/assets/assets/000/114/168/medium800/upgrading_airlift_firmware_wireless_Screen_Shot_2022-04-07_at_3.51.37_PM.png?1660597471)

Upon success, you will see that it is connected and will print out a unique MAC address identifying the board.

Once you have successfully connected, a command toolbar will appear at the top of the screen.

![upgrading_airlift_firmware_wireless_Screen_Shot_2022-04-08_at_10.06.42_AM.png](https://cdn-learn.adafruit.com/assets/assets/000/114/169/medium640/upgrading_airlift_firmware_wireless_Screen_Shot_2022-04-08_at_10.06.42_AM.png?1660597522)

Verify that the offset is&nbsp; **0x0** and choose the **NINA\_....bin** file you downloaded above.&nbsp;

Click the **program** button to flash the firmware to your ESP32 AirLift.

![upgrading_airlift_firmware_wireless_Screen_Shot_2022-04-08_at_10.07.54_AM_(1).png](https://cdn-learn.adafruit.com/assets/assets/000/114/171/medium640/upgrading_airlift_firmware_wireless_Screen_Shot_2022-04-08_at_10.07.54_AM_%281%29.png?1660597645)

ESPTool will take a few minutes to write firmware to your device. After it's complete, the progress bar will disappear and the console will print _"To run the new firmware,..."_

Press the Reset button (or, on the RP2040 Pico, unplug your device from USB power) to get out of the ROM bootloader.

![upgrading_airlift_firmware_wireless_Screen_Shot_2022-04-08_at_10.10.03_AM.png](https://cdn-learn.adafruit.com/assets/assets/000/114/172/medium640/upgrading_airlift_firmware_wireless_Screen_Shot_2022-04-08_at_10.10.03_AM.png?1660597719)

![upgrading_airlift_firmware_wireless_Screen_Shot_2022-04-08_at_10.11.20_AM.png](https://cdn-learn.adafruit.com/assets/assets/000/114/173/medium640/upgrading_airlift_firmware_wireless_Screen_Shot_2022-04-08_at_10.11.20_AM.png?1660597747)

# Verify the New Firmware Version

To verify everything is working correctly, we'll load up some CircuitPython code.&nbsp;

**If you were previously using your ESP32 project with CircuitPython** , you'll need to first reinstall CircuitPython firmware for your board. The QSPI flash should have retained its contents. If you don't see anything on the **CIRCUITPY** volume, copy files from the backup you made earlier to **CIRCUITPY**.

To verify the new ESP32 WiFi firmware version is correct, [follow the Connect to WiFi step in this guide](https://learn.adafruit.com/adafruit-pyportal/internet-connect#connect-to-wifi-17-4) and come back here when you've successfully run the code. The REPL output should display the firmware version you flashed.

![](https://cdn-learn.adafruit.com/assets/assets/000/114/174/medium800/upgrading_airlift_firmware_Cursor_and_screen__dev_cu_usbmodem1201__Users_brentrubell_Desktop_github_brentru_Adafruit_MQTT_Library.png?1660597812)

## (Advanced) Upload NINA Firmware with ESPTool.py

For advanced users who have&nbsp; **esptool.py** &nbsp;installed, run the following commands on your command line:

 **If you're using macOS or Linux** - run the following command, replacing `/dev/ttyACM0` with the serial port of your board and&nbsp;`NINA_W102-1.6.0` with the binary file you're flashing to the ESP32.

`esptool.py --port /dev/ttyACM0 --before no_reset --baud 115200 write_flash 0 NINA_W102-1.6.0.bin`

**If you're using Windows** - run the following command, replacing `COM7` with the serial port of your board&nbsp; and&nbsp;`NINA_W102-1.6.0` with the binary file you're flashing to the ESP32

`esptool.py --port COM7 --before no_reset --baud 115200 write_flash 0 NINA_W102-1.6.0.bin`

The command should detect the ESP32 and will take a minute or two to upload the firmware.&nbsp;

- If ESPTool doesn't detect the ESP32, make sure you've uploaded the correct **.UF2** file to the bootloader and are using the correct serial port.

Once the firmware is fully uploaded, press the Reset button (or, on the RP2040 Pico, unplug your device from USB power) to get out of the ROM bootloader mode.

![](https://cdn-learn.adafruit.com/assets/assets/000/114/176/medium800/upgrading_airlift_firmware_wireless_esptool.png?1660598033)

# Upgrading AirLift ESP32 Firmware

## Upgrade External ESP32 AirLift Firmware

## Upgrading AirLift FeatherWing, AirLift Shield or AirLift ItsyWing

External AirLift boards, like the AirLift FeatherWing, AirLift Shield or AirLift ItsyWing, have three optional ESP32 control pins which are not connected by default:

- ESPGPIO0
- ESPRX
- ESPTX

 **Make sure to solder each of these pads together**. You will not be able to upload firmware to your ESP32 if they are not connected.

![wireless_adafruit_products_jumpers.jpeg](https://cdn-learn.adafruit.com/assets/assets/000/114/208/medium640/wireless_adafruit_products_jumpers.jpeg?1660660174)

![wireless_airliftshield.png](https://cdn-learn.adafruit.com/assets/assets/000/114/210/medium640/wireless_airliftshield.png?1660660233)

![wireless_featherwing_pins_(1).png](https://cdn-learn.adafruit.com/assets/assets/000/114/211/medium640/wireless_featherwing_pins_%281%29.png?1660660274)

## Upload Passthrough Code

First, you'll need to upload the code below to allow your board to act as a programmer for the ESP32 AirLift module.

**Back up any code and files on your CIRCUITPY drive**. The code will overwrite the drive's contents. You should not end up losing any files on the QSPI flash, but it's a good idea to back them up anyways.&nbsp;

Download the **UF2** file for your board and save it to your computer's Desktop.

Danger: This section is only for an AirLift FeatherWing with one of the Feathers listed below, an AirLift BitsyWing with an ItsyBitsy M4, or a PyBadge or EdgeBadge. If you are using a different hardware combination - scroll down to the "Upgrading an External AirLift Breakout" section.

[Feather M4 Passthrough UF2](https://github.com/adafruit/Adafruit_Learning_System_Guides/blob/master/Adafruit_ESP32_Arduino_Demos/SerialESPPassthrough/Airlift-Feather-FeatherWing-Passthru.UF2)
[Feather NRF52840 Passthrough UF2](https://github.com/adafruit/Adafruit_Learning_System_Guides/raw/refs/heads/main/Adafruit_ESP32_Arduino_Demos/SerialESPPassthrough/Adafruit-Feather-NRF52840-FeatherWing-Passthru.UF2)
[Adafruit Itsy Bitsy M4 with Airlift BitsyWing Passthrough UF2](https://github.com/adafruit/Adafruit_Learning_System_Guides/raw/refs/heads/main/Adafruit_ESP32_Arduino_Demos/SerialESPPassthrough/Airlift-BitsyWing-FeatherWing-Passthru.UF2)
[PyBadge or EdgeBadge M4 Passthrough UF2](https://github.com/adafruit/Adafruit_Learning_System_Guides/raw/refs/heads/main/Adafruit_ESP32_Arduino_Demos/SerialESPPassthrough/PyBadge%20M4%20with%20AirLift%20Wing%20Passthru.UF2)
Danger: For Feather RP2040 or Pi Pico boards, see [Upgrade AirLift Firmware using RP2040](https://learn.adafruit.com/upgrading-esp32-firmware/upgrade-airlift-firmware-using-rp2040)

To enter bootloader mode, start with your board unplugged from USB. Next, find the reset button on your board. It's a small, black button, and on most of the boards, it will be the only button available.&nbsp;

![](https://cdn-learn.adafruit.com/assets/assets/000/114/212/medium800/wireless_airlift_featherwing_rst.png?1660660413)

 **Tap this button twice to enter the bootloader.** &nbsp;If it doesn't work on the first try, don't be discouraged. The rhythm of the taps needs to be correct and sometimes it takes a few tries.&nbsp; Once successful, the RGB LED on the board will flash red and then stay green. A new drive will show up on your computer. The drive will be called **_boardname_BOOT** where _boardname_ is a reference to your specific board. For example, a Feather will have **FEATHERBOOT** and a Trinket will have **TRINKETBOOT** etc. Going forward, we'll just call the boot drive&nbsp; **BOOT**.

You will see a new disk drive appear called&nbsp; **_boardname_BOOT**. The board is now in bootloader mode.

![wireless_circuitpython_FeatherBootWindows.png](https://cdn-learn.adafruit.com/assets/assets/000/114/213/medium640/wireless_circuitpython_FeatherBootWindows.png?1660660451)

Find the **.UF2** file you downloaded and drag that file to the new&nbsp;drive on your computer.

![](https://cdn-learn.adafruit.com/assets/assets/000/114/214/medium800/wireless_Screenshot_9_26_19__2_51_PM.png?1660660482)

The board's LED should flash and the drive will disappear. Your board should re-enumerate USB and appear as a COM or Serial port on your computer. Make a note of the serial port by checking the **Device Manager** (Windows) or **typing&nbsp;`ls /dev/cu*`&nbsp;or&nbsp;`/dev/tty*`** &nbsp;(Mac or Linux) **in a terminal.**

![](https://cdn-learn.adafruit.com/assets/assets/000/114/164/medium800/upgrading_airlift_firmware_wireless_fish___Users_brent__fish_.png?1660595322)

![](https://cdn-learn.adafruit.com/assets/assets/000/114/165/medium800/upgrading_airlift_firmware_wireless_fish___Users_brent__fish__%281%29.png?1660595326)

## Upgrading an External AirLift Breakout

If you have an AirLift ESP32 Breakout Board or are connecting an AirLift FeatherWing or BitsyWing to some micrcontroller board, you will be turning your existing Arduino-compatible board into a USB-to-Serial-Converter. To do this, you'll need a special Arduino sketch named&nbsp; **SerialESPPassthrough.ino** &nbsp;and **&nbsp;** an Arduino-compatible board with Native USB support such as the Adafruit Metro M4.

The UF2's above are just compiled versions of this sketch for the boards listed above.

### Adafruit AirLift – ESP32 WiFi Co-Processor Breakout Board

[Adafruit AirLift – ESP32 WiFi Co-Processor Breakout Board](https://www.adafruit.com/product/4201)
Give your plain ol' microcontroller project a _lift_ with the Adafruit AirLift - a breakout board that lets you use the powerful ESP32 as a WiFi co-processor. You probably have your favorite microcontroller (like the ATmega328 or ATSAMD51), awesome peripherals and lots of libraries....

Out of Stock
[Buy Now](https://www.adafruit.com/product/4201)
[Related Guides to the Product](https://learn.adafruit.com/products/4201/guides)
![Top view of Adafruit AirLift Breakout Board.](https://cdn-shop.adafruit.com/640x480/4201-08.jpg)

First, make the following connections between the board and the AirLift Breakout:

- **Board Pin 12&nbsp;** to **&nbsp;ESP32\_ResetN**
- **Board Pin 10&nbsp;** to **&nbsp;ESP32 GPIO0**
- **Board TX&nbsp;** to&nbsp; **RXI**
- **Board RX&nbsp;** to **&nbsp;TX0**

Next, download the Arduino sketch below.

https://github.com/adafruit/Adafruit_Learning_System_Guides/blob/main/Adafruit_ESP32_Arduino_Demos/SerialESPPassthrough/SerialESPPassthrough.ino

Unzip the file, and open the&nbsp; **SerialESPPassthrough.ino&nbsp;** file in the Arduino IDE.

**Change the following pin definitions in the sketch to match your wiring:**

```auto
#elif !defined(SPIWIFI_SS)  // if the wifi definition isnt in the board variant
  // Don't change the names of these #define's! they match the variant ones
  #define SerialESP32   Serial1
  #define SPIWIFI       SPI
  #define SPIWIFI_SS    10   // Chip select pin
  #define SPIWIFI_ACK    7   // a.k.a BUSY or READY pin
  #define ESP32_RESETN   5   // Reset pin
  #define ESP32_GPIO0   -1   // Not connected
  #define NEOPIXEL_PIN   8
#endif
```

Using the Arduino IDE,&nbsp; **upload the code to your board** &nbsp;(_Sketch-\>Upload_).

After uploading, the board should enumerate USB and appear as a COM or Serial port on your computer.

Make a note of the serial port by checking the&nbsp; **Device Manager** &nbsp;(Windows) or typing in&nbsp;`ls /dev/cu*`&nbsp;or&nbsp;`/dev/tty*`&nbsp;(Mac or Linux) in a terminal

![](https://cdn-learn.adafruit.com/assets/assets/000/114/215/medium800/wireless_fish___Users_brent__fish_.png?1660660846)

## **Download NINA Firmware**

**Click the link below** &nbsp;to download the latest version of the NINA firmware.&nbsp; **Unzip** &nbsp;it&nbsp; **and save the .bin file to your desktop**.

Info: 

[Download the latest nina-fw .bin file](https://github.com/adafruit/nina-fw/releases/latest)
Next, you'll need to flash the firmware to your ESP32 AirLift module.

If you're using the Google Chrome browser or Microsoft Edge (version 89 or later), you may follow the instructions below for programming using your board.

For advanced users who have **esptool.py** installed, skip to the bottom of the page.

## Upload NINA Firmware

Next, you'll need to upload the new version of NINA firmware to your ESP32 AirLift. To do this, we'll use the web-based implementation of the flasher tool for Espressif chips, ESPTool. You will need to be running Google Chrome or Microsoft Edge (version 89 or later) to follow the steps below.

**Safari and Firefox, etc. are _not_**** &nbsp;supported **because we need Web Serial and only Chrome is supporting it to the level needed.** If you're using an unsupported browser **, you'll need to either switch to Google Chrome or upload NINA firmware using the Python** esptool.py** program from your computer (Scroll down to _Upload NINA Firmware with esptool.py,_)

Warning: 

On your Google Chrome browser, navigate to [https://adafruit.github.io/Adafruit\_WebSerial\_ESPTool/](https://adafruit.github.io/Adafruit_WebSerial_ESPTool/)

Turn _ **on** _ the toggle labeled **No reset for Passthrough updates** :

![Turn on "no reset for passthrough toggle](https://cdn-learn.adafruit.com/assets/assets/000/138/555/medium800/upgrading_airlift_firmware_no-reset-for-passthrough-on.png?1753304041 )

In the top-right corner, select 115200 as the baud rate and click the **Connect** button.

![](https://cdn-learn.adafruit.com/assets/assets/000/114/167/medium800/upgrading_airlift_firmware_baud_web.png?1660597391)

You will get a pop-up asking you to select the board's COM or Serial port.

- If there are a lot of boards and ports appearing in this list and you're not sure what to select - remove all other USB devices so only your board is attached, that way there's no confusion over multiple ports!&nbsp;

Click **Connect**.

![](https://cdn-learn.adafruit.com/assets/assets/000/114/168/medium800/upgrading_airlift_firmware_wireless_Screen_Shot_2022-04-07_at_3.51.37_PM.png?1660597471)

Upon success, you will see that it is connected and will print out a unique MAC address identifying the board.

Once you have successfully connected, a command toolbar will appear at the top of the screen.

![upgrading_airlift_firmware_wireless_Screen_Shot_2022-04-08_at_10.06.42_AM.png](https://cdn-learn.adafruit.com/assets/assets/000/114/169/medium640/upgrading_airlift_firmware_wireless_Screen_Shot_2022-04-08_at_10.06.42_AM.png?1660597522)

Verify that the offset is&nbsp; **0x0** and choose the **NINA\_....bin** file you downloaded above.&nbsp;

Click the **program** button to flash the firmware to your ESP32 AirLift.

![upgrading_airlift_firmware_wireless_Screen_Shot_2022-04-08_at_10.07.54_AM_(1).png](https://cdn-learn.adafruit.com/assets/assets/000/114/171/medium640/upgrading_airlift_firmware_wireless_Screen_Shot_2022-04-08_at_10.07.54_AM_%281%29.png?1660597645)

ESPTool will take a few minutes to write firmware to your device. After it's complete, the progress bar will disappear and the console will print _"To run the new firmware,..."_

Press the Reset button (or, on the RP2040 Pico, unplug your device from USB power) to get out of the ROM bootloader.

![upgrading_airlift_firmware_wireless_Screen_Shot_2022-04-08_at_10.10.03_AM.png](https://cdn-learn.adafruit.com/assets/assets/000/114/172/medium640/upgrading_airlift_firmware_wireless_Screen_Shot_2022-04-08_at_10.10.03_AM.png?1660597719)

![upgrading_airlift_firmware_wireless_Screen_Shot_2022-04-08_at_10.11.20_AM.png](https://cdn-learn.adafruit.com/assets/assets/000/114/173/medium640/upgrading_airlift_firmware_wireless_Screen_Shot_2022-04-08_at_10.11.20_AM.png?1660597747)

# Verify the New Firmware Version

To verify everything is working correctly, we'll load up some CircuitPython code.&nbsp;

**If you were previously using your ESP32 project with CircuitPython** , you'll need to first reinstall CircuitPython firmware for your board. The QSPI flash should have retained its contents. If you don't see anything on the **CIRCUITPY** volume, copy files from the backup you made earlier to **CIRCUITPY**.

To verify the new ESP32 WiFi firmware version is correct, [follow the Connect to WiFi step in this guide](https://learn.adafruit.com/adafruit-pyportal/internet-connect#connect-to-wifi-17-4) and come back here when you've successfully run the code. The REPL output should display the firmware version you flashed.

![](https://cdn-learn.adafruit.com/assets/assets/000/114/174/medium800/upgrading_airlift_firmware_Cursor_and_screen__dev_cu_usbmodem1201__Users_brentrubell_Desktop_github_brentru_Adafruit_MQTT_Library.png?1660597812)

## (Advanced) Upload NINA Firmware with ESPTool.py

For advanced users who have&nbsp; **esptool.py** &nbsp;installed, run the following commands on your command line:

 **If you're using macOS or Linux** - run the following command, replacing `/dev/ttyACM0` with the serial port of your board and&nbsp;`NINA_W102-1.6.0` with the binary file you're flashing to the ESP32.

`esptool.py --port /dev/ttyACM0 --before no_reset --baud 115200 write_flash 0 NINA_W102-1.6.0.bin`

**If you're using Windows** - run the following command, replacing `COM7` with the serial port of your board&nbsp; and&nbsp;`NINA_W102-1.6.0` with the binary file you're flashing to the ESP32

`esptool.py --port COM7 --before no_reset --baud 115200 write_flash 0 NINA_W102-1.6.0.bin`

The command should detect the ESP32 and will take a minute or two to upload the firmware.&nbsp;

- If ESPTool doesn't detect the ESP32, make sure you've uploaded the correct **.UF2** file to the bootloader and are using the correct serial port.

Once the firmware is fully uploaded, press the Reset button (or, on the RP2040 Pico, unplug your device from USB power) to get out of the ROM bootloader mode.

![](https://cdn-learn.adafruit.com/assets/assets/000/114/176/medium800/upgrading_airlift_firmware_wireless_esptool.png?1660598033)

# Upgrading AirLift ESP32 Firmware

## Upgrade AirLift Firmware using RP2040

Externally-connected AirLift FeatherWing and Itsy breakouts have three optional ESP32 control pins which are not connected by default:

- **ESPGPIO0**
- **ESPRX**
- **ESPTX**

 **Make sure to solder each of these pads together**. You will not be able to upload firmware to your ESP32 if they are not connected.

![wireless_featherwing_pins_(1).png](https://cdn-learn.adafruit.com/assets/assets/000/114/217/medium640/wireless_featherwing_pins_%281%29.png?1660661371)

Other AirLift external breakouts have these pins already available.

## Upload Passthrough Code

First, you'll need to upload the code below to allow your board to act as a programmer for the ESP32 AirLift module.

**Back up any code and files on your CIRCUITPY drive**. The code will overwrite the drive's contents. You should not end up losing any files on the QSPI flash, but it's a good idea to back them up anyways.&nbsp;

Download the **UF2** file for your board and save it to your computer's Desktop.

[Feather RP2040 Passthrough UF2](https://github.com/adafruit/Adafruit_Learning_System_Guides/blob/main/Adafruit_ESP32_Arduino_Demos/SerialESPPassthrough/Adafruit-Feather-RP2040-Passthru.uf2)
For Adafruit Feather RP2040, if you are not stacking a FeatherWing AirLift directly, connect these pins together:

- Feather D13 to Airlift CS
- Feather D12 to AirLift RST
- Feather D10 to AirLift GPIO0
- Feather TX to Airlift RX
- Feather RX to AirLift TX

[Raspberry Pi Pico RP2040 Passthrough UF2](https://github.com/adafruit/Adafruit_Learning_System_Guides/blob/main/Adafruit_ESP32_Arduino_Demos/SerialESPPassthrough/Pico-RP2040-Passthru.UF2)
For Raspberry Pi Pico, connect these pins together:

- Pico GPIO13 to Airlift CS
- Pico GPIO16 to AirLift RST
- Pico GPIO9 to AirLift GPIO0
- Pico GPIO0 (TX) to Airlift RX
- Pico GPIO1 (RX) to AirLift TX

To enter bootloader mode, start with your board unplugged from USB. Next, find the reset button on your board. It's a small, black button, and on most of the boards, it will be the only button available.&nbsp;

![](https://cdn-learn.adafruit.com/assets/assets/000/114/218/medium800/wireless_Pasted_Image_3_24_21__5_11_PM.png?1660661512)

To enter bootloader mode, start with your RP2040 board unplugged from USB.

Press and hold the **BOOTSEL**  **button** (highlighted in red in the image of the Feather RP2040, but all RP2040 boards should include this button), continue to hold it while plugging it into USB, and wait for the **RPI-RP2** &nbsp;drive to appear before releasing the button.

You will see a new disk drive appear called&nbsp; **RPI-RP2**. The board is now in bootloader mode.

![wireless_RPI-RP2.png](https://cdn-learn.adafruit.com/assets/assets/000/114/219/medium640/wireless_RPI-RP2.png?1660661575)

Find the **.UF2** file you downloaded and drag that file to the new&nbsp;drive on your computer.

![](https://cdn-learn.adafruit.com/assets/assets/000/114/220/medium800/wireless_Screen_Shot_2021-03-24_at_5_15_41_PM.png?1660661605)

The board's LED should flash and the drive will disappear. Your board should re-enumerate USB and appear as a COM or Serial port on your computer. Make a note of the serial port by checking the **Device Manager** (Windows) or **typing&nbsp;`ls /dev/cu*`&nbsp;or&nbsp;`/dev/tty*`** &nbsp;(Mac or Linux) **in a terminal.**

![](https://cdn-learn.adafruit.com/assets/assets/000/114/164/medium800/upgrading_airlift_firmware_wireless_fish___Users_brent__fish_.png?1660595322)

![](https://cdn-learn.adafruit.com/assets/assets/000/114/165/medium800/upgrading_airlift_firmware_wireless_fish___Users_brent__fish__%281%29.png?1660595326)

## **Download NINA Firmware**

**Click the link below** &nbsp;to download the latest version of the NINA firmware.&nbsp; **Unzip** &nbsp;it&nbsp; **and save the .bin file to your desktop**.

Info: 

[Download the latest nina-fw .bin file](https://github.com/adafruit/nina-fw/releases/latest)
Next, you'll need to flash the firmware to your ESP32 AirLift module.

If you're using the Google Chrome browser or Microsoft Edge (version 89 or later), you may follow the instructions below for programming using your board.

For advanced users who have **esptool.py** installed, skip to the bottom of the page.

## Upload NINA Firmware

Next, you'll need to upload the new version of NINA firmware to your ESP32 AirLift. To do this, we'll use the web-based implementation of the flasher tool for Espressif chips, ESPTool. You will need to be running Google Chrome or Microsoft Edge (version 89 or later) to follow the steps below.

**Safari and Firefox, etc. are _not_**** &nbsp;supported **because we need Web Serial and only Chrome is supporting it to the level needed.** If you're using an unsupported browser **, you'll need to either switch to Google Chrome or upload NINA firmware using the Python** esptool.py** program from your computer (Scroll down to _Upload NINA Firmware with esptool.py,_)

Warning: 

On your Google Chrome browser, navigate to [https://adafruit.github.io/Adafruit\_WebSerial\_ESPTool/](https://adafruit.github.io/Adafruit_WebSerial_ESPTool/)

Turn _ **on** _ the toggle labeled **No reset for Passthrough updates** :

![Turn on "no reset for passthrough toggle](https://cdn-learn.adafruit.com/assets/assets/000/138/555/medium800/upgrading_airlift_firmware_no-reset-for-passthrough-on.png?1753304041 )

In the top-right corner, select 115200 as the baud rate and click the **Connect** button.

![](https://cdn-learn.adafruit.com/assets/assets/000/114/167/medium800/upgrading_airlift_firmware_baud_web.png?1660597391)

You will get a pop-up asking you to select the board's COM or Serial port.

- If there are a lot of boards and ports appearing in this list and you're not sure what to select - remove all other USB devices so only your board is attached, that way there's no confusion over multiple ports!&nbsp;

Click **Connect**.

![](https://cdn-learn.adafruit.com/assets/assets/000/114/168/medium800/upgrading_airlift_firmware_wireless_Screen_Shot_2022-04-07_at_3.51.37_PM.png?1660597471)

Upon success, you will see that it is connected and will print out a unique MAC address identifying the board.

Once you have successfully connected, a command toolbar will appear at the top of the screen.

![upgrading_airlift_firmware_wireless_Screen_Shot_2022-04-08_at_10.06.42_AM.png](https://cdn-learn.adafruit.com/assets/assets/000/114/169/medium640/upgrading_airlift_firmware_wireless_Screen_Shot_2022-04-08_at_10.06.42_AM.png?1660597522)

Verify that the offset is&nbsp; **0x0** and choose the **NINA\_....bin** file you downloaded above.&nbsp;

Click the **program** button to flash the firmware to your ESP32 AirLift.

![upgrading_airlift_firmware_wireless_Screen_Shot_2022-04-08_at_10.07.54_AM_(1).png](https://cdn-learn.adafruit.com/assets/assets/000/114/171/medium640/upgrading_airlift_firmware_wireless_Screen_Shot_2022-04-08_at_10.07.54_AM_%281%29.png?1660597645)

ESPTool will take a few minutes to write firmware to your device. After it's complete, the progress bar will disappear and the console will print _"To run the new firmware,..."_

Press the Reset button (or, on the RP2040 Pico, unplug your device from USB power) to get out of the ROM bootloader.

![upgrading_airlift_firmware_wireless_Screen_Shot_2022-04-08_at_10.10.03_AM.png](https://cdn-learn.adafruit.com/assets/assets/000/114/172/medium640/upgrading_airlift_firmware_wireless_Screen_Shot_2022-04-08_at_10.10.03_AM.png?1660597719)

![upgrading_airlift_firmware_wireless_Screen_Shot_2022-04-08_at_10.11.20_AM.png](https://cdn-learn.adafruit.com/assets/assets/000/114/173/medium640/upgrading_airlift_firmware_wireless_Screen_Shot_2022-04-08_at_10.11.20_AM.png?1660597747)

# Verify the New Firmware Version

To verify everything is working correctly, we'll load up some CircuitPython code.&nbsp;

**If you were previously using your ESP32 project with CircuitPython** , you'll need to first reinstall CircuitPython firmware for your board. The QSPI flash should have retained its contents. If you don't see anything on the **CIRCUITPY** volume, copy files from the backup you made earlier to **CIRCUITPY**.

To verify the new ESP32 WiFi firmware version is correct, [follow the Connect to WiFi step in this guide](https://learn.adafruit.com/adafruit-pyportal/internet-connect#connect-to-wifi-17-4) and come back here when you've successfully run the code. The REPL output should display the firmware version you flashed.

![](https://cdn-learn.adafruit.com/assets/assets/000/114/174/medium800/upgrading_airlift_firmware_Cursor_and_screen__dev_cu_usbmodem1201__Users_brentrubell_Desktop_github_brentru_Adafruit_MQTT_Library.png?1660597812)

## (Advanced) Upload NINA Firmware with ESPTool.py

For advanced users who have&nbsp; **esptool.py** &nbsp;installed, run the following commands on your command line:

 **If you're using macOS or Linux** - run the following command, replacing `/dev/ttyACM0` with the serial port of your board and&nbsp;`NINA_W102-1.6.0` with the binary file you're flashing to the ESP32.

`esptool.py --port /dev/ttyACM0 --before no_reset --baud 115200 write_flash 0 NINA_W102-1.6.0.bin`

**If you're using Windows** - run the following command, replacing `COM7` with the serial port of your board&nbsp; and&nbsp;`NINA_W102-1.6.0` with the binary file you're flashing to the ESP32

`esptool.py --port COM7 --before no_reset --baud 115200 write_flash 0 NINA_W102-1.6.0.bin`

The command should detect the ESP32 and will take a minute or two to upload the firmware.&nbsp;

- If ESPTool doesn't detect the ESP32, make sure you've uploaded the correct **.UF2** file to the bootloader and are using the correct serial port.

Once the firmware is fully uploaded, press the Reset button (or, on the RP2040 Pico, unplug your device from USB power) to get out of the ROM bootloader mode.

![](https://cdn-learn.adafruit.com/assets/assets/000/114/176/medium800/upgrading_airlift_firmware_wireless_esptool.png?1660598033)


## Featured Products

### Adafruit PyPortal - CircuitPython Powered Internet Display

[Adafruit PyPortal - CircuitPython Powered Internet Display](https://www.adafruit.com/product/4116)
 **PyPortal** , our easy-to-use IoT device that allows you to create all the things for the “Internet of Things” in minutes. Make custom touch screen interface GUIs, all open-source, and Python-powered using&nbsp;tinyJSON / APIs to get news, stock, weather, cat photos,...

In Stock
[Buy Now](https://www.adafruit.com/product/4116)
[Related Guides to the Product](https://learn.adafruit.com/products/4116/guides)
### Adafruit AirLift – ESP32 WiFi Co-Processor Breakout Board

[Adafruit AirLift – ESP32 WiFi Co-Processor Breakout Board](https://www.adafruit.com/product/4201)
Give your plain ol' microcontroller project a _lift_ with the Adafruit AirLift - a breakout board that lets you use the powerful ESP32 as a WiFi co-processor. You probably have your favorite microcontroller (like the ATmega328 or ATSAMD51), awesome peripherals and lots of libraries....

Out of Stock
[Buy Now](https://www.adafruit.com/product/4201)
[Related Guides to the Product](https://learn.adafruit.com/products/4201/guides)
### Adafruit Metro M4 Express AirLift (WiFi) - Lite

[Adafruit Metro M4 Express AirLift (WiFi) - Lite](https://www.adafruit.com/product/4000)
Give your next project a lift with _AirLift_ - our witty name for the ESP32 co-processor that graces this Metro M4. You already know about the&nbsp; **Adafruit Metro M4** &nbsp;featuring the&nbsp; **Microchip ATSAMD51** , with it's 120MHz Cortex M4 with...

In Stock
[Buy Now](https://www.adafruit.com/product/4000)
[Related Guides to the Product](https://learn.adafruit.com/products/4000/guides)
### Adafruit AirLift FeatherWing – ESP32 WiFi Co-Processor

[Adafruit AirLift FeatherWing – ESP32 WiFi Co-Processor](https://www.adafruit.com/product/4264)
Give your Feather project a _lift_ with the Adafruit AirLift FeatherWing - a FeatherWing that lets you use the powerful ESP32 as a WiFi co-processor. You probably have your favorite Feather ([like the Feather M4](https://www.adafruit.com/product/3857)) that comes with its own...

In Stock
[Buy Now](https://www.adafruit.com/product/4264)
[Related Guides to the Product](https://learn.adafruit.com/products/4264/guides)
### Adafruit AirLift Bitsy Add-On – ESP32 WiFi Co-Processor

[Adafruit AirLift Bitsy Add-On – ESP32 WiFi Co-Processor](https://www.adafruit.com/product/4363)
Give your ItsyBitsy project a _lift_ with the Adafruit AirLift Bitsy Add-On - a daughterboard that lets you use the powerful ESP32 as a WiFi co-processor. You probably have your favorite ItsyBitsy ([like the Itsy' M4](https://www.adafruit.com/product/3800)) that comes...

In Stock
[Buy Now](https://www.adafruit.com/product/4363)
[Related Guides to the Product](https://learn.adafruit.com/products/4363/guides)
### USB cable - USB A to Micro-B

[USB cable - USB A to Micro-B](https://www.adafruit.com/product/592)
This here is your standard A to micro-B USB cable, for USB 1.1 or 2.0. Perfect for connecting a PC to your Metro, Feather, Raspberry Pi or other dev-board or microcontroller

Approximately 3 feet / 1 meter long

In Stock
[Buy Now](https://www.adafruit.com/product/592)
[Related Guides to the Product](https://learn.adafruit.com/products/592/guides)

## Related Guides

- [Adafruit PyPortal - IoT for CircuitPython](https://learn.adafruit.com/adafruit-pyportal.md)
- [Adafruit AirLift - ESP32 WiFi Co-Processor Breakout](https://learn.adafruit.com/adafruit-airlift-breakout.md)
- [Adafruit Metro M4 Express AirLift (WiFi)](https://learn.adafruit.com/adafruit-metro-m4-express-airlift-wifi.md)
- [Adafruit AirLift FeatherWing - ESP32 WiFi Co-Processor](https://learn.adafruit.com/adafruit-airlift-featherwing-esp32-wifi-co-processor-featherwing.md)
- [Adafruit Airlift Bitsy Add-On - ESP32 WiFi Co-Processor](https://learn.adafruit.com/adafruit-airlift-bitsy-add-on-esp32-wifi-co-processor.md)
- [Custom Fonts for CircuitPython Displays](https://learn.adafruit.com/custom-fonts-for-pyportal-circuitpython-display.md)
- [CircuitPython Your Own Adventure](https://learn.adafruit.com/circuit-python-your-own-adventure.md)
- [Twin Peaks Light Reactive Picture Frame](https://learn.adafruit.com/twin-peaks-light-reactive-pyportal-picture-frame.md)
- [Discord and Slack Connected Smart Plant with Adafruit IO Actions](https://learn.adafruit.com/discord-and-slack-connected-smart-plant-with-adafruit-io-triggers.md)
- [PyPortal IoT Plant Monitor with Microsoft Azure IoT and CircuitPython](https://learn.adafruit.com/using-microsoft-azure-iot-with-circuitpython.md)
- [Electronic History of the Day with PyPortal](https://learn.adafruit.com/electronic-history-of-the-day-with-pyportal.md)
- [PyPortal Philips Hue Lighting Controller](https://learn.adafruit.com/pyportal-philips-hue-lighting-controller.md)
- [PyPortal Weather Station](https://learn.adafruit.com/pyportal-weather-station.md)
- [PyPortal Thingiverse Viewer](https://learn.adafruit.com/pyportal-thingiverse-viewer.md)
- [CircuitPython Minesweeper Game](https://learn.adafruit.com/circuitpython-pyportal-minesweeper-game.md)
- [MQTT in CircuitPython](https://learn.adafruit.com/mqtt-in-circuitpython.md)
- [PyPortal Alarm Clock](https://learn.adafruit.com/pyportal-alarm-clock.md)
- [Adafruit IO Basics: AirLift](https://learn.adafruit.com/adafruit-io-basics-airlift.md)
- [MagTag Daily Weather Forecast Display](https://learn.adafruit.com/magtag-weather.md)
