esp-rs / espflash

Serial flasher utility for Espressif SoCs and modules based on esptool.py
Apache License 2.0
479 stars 116 forks source link

Broken pipe while flashing over USB, on macOS only #171

Closed allison-n-h closed 2 years ago

allison-n-h commented 2 years ago

Trying to test flashing an image using the USB port on an ESP32S3 DevKit-C-1-N8. For larger images (like the wifi station example from the idf), flashing fails about ~75% through the image:

Serial port: /dev/tty.usbmodem14101
Connecting...

Chip type:         ESP32-S3
Crystal frequency: 40MHz
Flash size:        8MB
Features:          WiFi, BLE
MAC address:       7c:df:a1:e2:4a:a8
[00:00:00] ########################################      13/13      segment 0x0
[00:00:00] ########################################       1/1       segment 0x8000
Error: espflash::serial_error

  × Communication error while flashing device
  ├─▶ IO error while using serial port: Broken pipe
  ╰─▶ Broken pipe

This seems to only be an issue with espflash on macOS and using the USB port on the devkit. Using the UART port works as expected, and using the native idf.py flash works as expected. It also seems to occur only 'larger' images - for example, flashing the hello_world example from the IDF completes successfully. Testing this on a Windows 11 machine, we don't see this issue either, so it does seem to be macOS specific.

We did verify we are using the 1.4.1 version of espflash.

MabezDev commented 2 years ago

Can you try using master? We recently merged #169 which should fix this issue.

allison-n-h commented 2 years ago

I seem to get a different failure when using the latest from master:

Connecting...

Chip type:         ESP32-S3
Crystal frequency: 40MHz
Flash size:        8MB
Features:          WiFi, BLE
MAC address:       7c:df:a1:e0:31:3c
Error: espflash::timeout

  × Communication error while flashing device
  ╰─▶ Timeout while running WriteReg command
jessebraham commented 2 years ago

I've unfortunately never seen this error in practice, so I'm a little stumped as to what the issue is. I run macOS as well and have never run into issues flashing the ESP32-S3, although I haven't used it much.

Just out of curiosity, which version of macOS are you running? Also if you're able to share your project (either a repo or a zip file, or whatever is easiest) that would be helpful so I could at least try to reproduce this.

allison-n-h commented 2 years ago

We were seeing this on macOS Monterey 12.1, and trying to flash the app from this esp-idf example: https://github.com/espressif/esp-idf/tree/v4.4/examples/wifi/getting_started/station

MabezDev commented 2 years ago

I can't seem to reproduce this.

Warning: could not detect flash size (FlashID=0x3980C2, SizeID=0x39), defaulting to 4MB

Chip type: ESP32-S3 Crystal frequency: 40MHz Flash size: 4MB Features: WiFi, BLE MAC address: 84:f7:03:80:09:64 [00:00:01] ######################################## 13/13 segment 0x0 [00:00:00] ######################################## 1/1 segment 0x8000 [00:00:37] ######################################## 363/363 segment 0x10000

Flashing has completed!



Perhaps this is a hardware issue?
jessebraham commented 2 years ago

I was also unable to reproduce the problem on my M1 running Monterey, unfortunately.

allison-n-h commented 2 years ago

We tested on two different Intel Macs (one is a MBP 2019, the other is a MBP 2017), and encounter this issue.

mykmelez commented 2 years ago

I wasn't able to reproduce this issue on my ESP32-S3-DevKitC-1-N8R2, so I picked up an ESP32-S3-DevKitC-1-N8 (the same devkit that @allison-n-h is using), and I'm able to reproduce the issue there on my M1 Mac with espflash 1.4.1:

Serial port: /dev/tty.usbmodem1101
Connecting...

Unable to connect, retrying with extra delay...
Unable to connect, retrying with default delay...

Chip type:         ESP32-S3
Crystal frequency: 40MHz
Flash size:        8MB
Features:          WiFi, BLE
MAC address:       f4:12:fa:40:67:14
[00:00:00] ########################################      13/13      segment 0x0
[00:00:00] ########################################       1/1       segment 0x8000
Error: espflash::serial_error

  × Communication error while flashing device
  ├─▶ IO error while using serial port: Broken pipe
  ╰─▶ Broken pipe

I can't reproduce it on espflash 1.5.1 or the current tip of the master branch (d5583ef1e67d025cd515913c0136e5e0f356637f), but that's only because I get a different error there (which is again the same one that @allison-n-h sees on those versions of espflash):

Serial port: /dev/tty.usbmodem1101
Connecting...

Chip type:         ESP32-S3
Crystal frequency: 40MHz
Flash size:        8MB
Features:          WiFi, BLE
MAC address:       f4:12:fa:40:67:14
Error: espflash::timeout

  × Communication error while flashing device
  ╰─▶ Timeout while running WriteReg command
jessebraham commented 2 years ago

Thank you for the additional information! This at least highlights some hardware differences which may be causing these issues. I only have the ESP32-S3-DevKitC-1-N32R8V presently, which may be why I'm unable to reproduce.

Board Flash PSRAM SPI Voltage Status
ESP32-S3-DevKitC-1-N8 8MB Quad 3.3V
ESP32-S3-DevKitC-1-N8R2 8MB Quad 2MB Quad 3.3V
ESP32-S3-DevKitC-1-N32R8V 32MB Octal 8MB Octal 1.8V

Based on the above data it seems possible that somehow the lack of PSRAM is causing this. I will see if I can get some more hardware to verify this, though I'm not sure when I will receive it.

igrr commented 2 years ago

@mykmelez @allison-n-h If you could read the eFuse values from your devkit which exhibits the issue (ESP32-S3-DevKitC-1-N8) and post them here, it would be very helpful.

This can be done using espefuse.py --port /dev/tty.usbmodemNNN summary. espefuse tool is available if you have an ESP-IDF environment set up. It can also be installed from https://github.com/espressif/esptool or PyPI.

igrr commented 2 years ago
  × Communication error while flashing device
  ╰─▶ Timeout while running WriteReg command

@jessebraham Perhaps we could add some more debugging information to see which of the WriteReg commands fails?

mykmelez commented 2 years ago

@mykmelez @allison-n-h If you could read the eFuse values from your devkit which exhibits the issue (ESP32-S3-DevKitC-1-N8) and post them here, it would be very helpful.

Here's the output for my ESP32-S3-DevKitC-1-N8:

> espefuse.py --port /dev/tty.usbmodem11301 summary
Connecting...
Detecting chip type... ESP32-S3
espefuse.py v3.3-dev

=== Run "summary" command ===
EFUSE_NAME (Block) Description  = [Meaningful Value] [Readable/Writeable] (Hex Value)
----------------------------------------------------------------------------------------
Config fuses:
DIS_ICACHE (BLOCK0)                                Disables ICache                                    = False R/W (0b0)
DIS_DCACHE (BLOCK0)                                Disables DCache                                    = False R/W (0b0)
DIS_DOWNLOAD_ICACHE (BLOCK0)                       Disables Icache when SoC is in Download mode       = False R/W (0b0)
DIS_DOWNLOAD_DCACHE (BLOCK0)                       Disables Dcache when SoC is in Download mode       = False R/W (0b0)
DIS_FORCE_DOWNLOAD (BLOCK0)                        Disables forcing chip into Download mode           = False R/W (0b0)
DIS_CAN (BLOCK0)                                   Disables the TWAI Controller hardware              = False R/W (0b0)
DIS_APP_CPU (BLOCK0)                               Disables APP CPU                                   = False R/W (0b0)
FLASH_TPUW (BLOCK0)                                Configures flash startup delay after SoC power-up, = 0 R/W (0x0)
                                                    unit is (ms/2). When the value is 15, delay is 7.
                                                   5 ms                                              
DIS_LEGACY_SPI_BOOT (BLOCK0)                       Disables Legacy SPI boot mode                      = False R/W (0b0)
UART_PRINT_CHANNEL (BLOCK0)                        Selects the default UART for printing boot msg     = UART0 R/W (0b0)
FLASH_ECC_MODE (BLOCK0)                            Configures the ECC mode for SPI flash             
   = 16-byte to 18-byte mode R/W (0b0)
DIS_USB_DOWNLOAD_MODE (BLOCK0)                     Disables USB OTG download feature in UART download = False R/W (0b0)
                                                    boot mode                                        
UART_PRINT_CONTROL (BLOCK0)                        Sets the default UART boot message output mode     = Enabled R/W (0b00)
FLASH_TYPE (BLOCK0)                                Selects SPI flash type                             = 4 data lines R/W (0b0)
FLASH_PAGE_SIZE (BLOCK0)                           Sets the size of flash page                        = 0 R/W (0b00)
FLASH_ECC_EN (BLOCK0)                              Enables ECC in Flash boot mode                     = False R/W (0b0)
FORCE_SEND_RESUME (BLOCK0)                         Forces ROM code to send an SPI flash resume comman = False R/W (0b0)
                                                   d during SPI boot                                 
BLOCK_USR_DATA (BLOCK3)                            User data                                         
   = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R/W 

Efuse fuses:
WR_DIS (BLOCK0)                                    Disables programming of individual eFuses          = 0 R/W (0x00000000)
RD_DIS (BLOCK0)                                    Disables software reading from BLOCK4-10           = 0 R/W (0b0000000)

Identity fuses:
SECURE_VERSION (BLOCK0)                            Secure version (used by ESP-IDF anti-rollback feat = 0 R/W (0x0000)
                                                   ure)                                              
MAC (BLOCK1)                                       Factory MAC Address                               
   = f4:12:fa:40:67:14 (OK) R/W 
WAFER_VERSION (BLOCK1)                             WAFER version                                      = 1 R/W (0b001)
PKG_VERSION (BLOCK1)                               ??? Package version                                = ESP32-S3 R/W (0x0)
BLOCK1_VERSION (BLOCK1)                            ??? BLOCK1 efuse version                           = 1 R/W (0b001)
OPTIONAL_UNIQUE_ID (BLOCK2)                        ??? Optional unique 128-bit ID                    
   = 27 ee 7e 67 b8 78 92 73 f8 60 d5 1e c5 c4 83 f7 R/W 
BLOCK2_VERSION (BLOCK2)                            ??? Version of BLOCK2                              = 7 R/W (0b111)
CUSTOM_MAC (BLOCK3)                                Custom MAC Address                                
   = 00:00:00:00:00:00 (OK) R/W 

Security fuses:
SOFT_DIS_JTAG (BLOCK0)                             Software disables JTAG by programming odd number o = 0 R/W (0b000)
                                                   f 1 bit(s). JTAG can be re-enabled via HMAC periph
                                                   eral                                              
HARD_DIS_JTAG (BLOCK0)                             Hardware disables JTAG permanently                 = False R/W (0b0)
DIS_DOWNLOAD_MANUAL_ENCRYPT (BLOCK0)               Disables flash encryption when in download boot mo = False R/W (0b0)
                                                   des                                               
SPI_BOOT_CRYPT_CNT (BLOCK0)                        Enables encryption and decryption, when an SPI boo = Disable R/W (0b000)
                                                   t mode is set. Enabled when 1 or 3 bits are set,di
                                                   sabled otherwise                                  
SECURE_BOOT_KEY_REVOKE0 (BLOCK0)                   Revokes use of secure boot key digest 0            = False R/W (0b0)
SECURE_BOOT_KEY_REVOKE1 (BLOCK0)                   Revokes use of secure boot key digest 1            = False R/W (0b0)
SECURE_BOOT_KEY_REVOKE2 (BLOCK0)                   Revokes use of secure boot key digest 2            = False R/W (0b0)
KEY_PURPOSE_0 (BLOCK0)                             KEY0 purpose                                       = USER R/W (0x0)
KEY_PURPOSE_1 (BLOCK0)                             KEY1 purpose                                       = USER R/W (0x0)
KEY_PURPOSE_2 (BLOCK0)                             KEY2 purpose                                       = USER R/W (0x0)
KEY_PURPOSE_3 (BLOCK0)                             KEY3 purpose                                       = USER R/W (0x0)
KEY_PURPOSE_4 (BLOCK0)                             KEY4 purpose                                       = USER R/W (0x0)
KEY_PURPOSE_5 (BLOCK0)                             KEY5 purpose                                       = USER R/W (0x0)
SECURE_BOOT_EN (BLOCK0)                            Enables secure boot                                = False R/W (0b0)
SECURE_BOOT_AGGRESSIVE_REVOKE (BLOCK0)             Enables aggressive secure boot key revocation mode = False R/W (0b0)
STRAP_JTAG_SEL (BLOCK0)                            Enable selection between usb_to_jtagor pad_to_jtag = False R/W (0b0)
                                                    through GPIO3                                    
DIS_DOWNLOAD_MODE (BLOCK0)                         Disables all Download boot modes                   = False R/W (0b0)
ENABLE_SECURITY_DOWNLOAD (BLOCK0)                  Enables secure UART download mode (read/write flas = False R/W (0b0)
                                                   h only)                                           
BLOCK_KEY0 (BLOCK4)
  Purpose: USER
               Encryption key0 or user data                      
   = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R/W 
BLOCK_KEY1 (BLOCK5)
  Purpose: USER
               Encryption key1 or user data                      
   = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R/W 
BLOCK_KEY2 (BLOCK6)
  Purpose: USER
               Encryption key2 or user data                      
   = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R/W 
BLOCK_KEY3 (BLOCK7)
  Purpose: USER
               Encryption key3 or user data                      
   = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R/W 
BLOCK_KEY4 (BLOCK8)
  Purpose: USER
               Encryption key4 or user data                      
   = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R/W 
BLOCK_KEY5 (BLOCK9)
  Purpose: USER
               Encryption key5 or user data                      
   = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R/W 
BLOCK_SYS_DATA2 (BLOCK10)                          System data (part 2)                              
   = 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 R/W 

Spi_Pad_Config fuses:
SPI_PAD_CONFIG_CLK (BLOCK1)                        SPI CLK pad                                        = 0 R/W (0b000000)
SPI_PAD_CONFIG_Q (BLOCK1)                          SPI Q (D1) pad                                     = 0 R/W (0b000000)
SPI_PAD_CONFIG_D (BLOCK1)                          SPI D (D0) pad                                     = 0 R/W (0b000000)
SPI_PAD_CONFIG_CS (BLOCK1)                         SPI CS pad                                         = 0 R/W (0b000000)
SPI_PAD_CONFIG_HD (BLOCK1)                         SPI HD (D3) pad                                    = 0 R/W (0b000000)
SPI_PAD_CONFIG_WP (BLOCK1)                         SPI WP (D2) pad                                    = 0 R/W (0b000000)
SPI_PAD_CONFIG_DQS (BLOCK1)                        SPI DQS pad                                        = 0 R/W (0b000000)
SPI_PAD_CONFIG_D4 (BLOCK1)                         SPI D4 pad                                         = 0 R/W (0b000000)
SPI_PAD_CONFIG_D5 (BLOCK1)                         SPI D5 pad                                         = 0 R/W (0b000000)
SPI_PAD_CONFIG_D6 (BLOCK1)                         SPI D6 pad                                         = 0 R/W (0b000000)
SPI_PAD_CONFIG_D7 (BLOCK1)                         SPI D7 pad                                         = 0 R/W (0b000000)

Usb Config fuses:
DIS_USB (BLOCK0)                                   Disables the USB OTG hardware                      = False R/W (0b0)
USB_EXCHG_PINS (BLOCK0)                            Exchanges USB D+ and D- pins                       = False R/W (0b0)
EXT_PHY_ENABLE (BLOCK0)                            Enables external USB PHY                           = False R/W (0b0)
BTLC_GPIO_ENABLE (BLOCK0)                          Enables BTLC GPIO                                  = 0 R/W (0b00)
DIS_USB_JTAG (BLOCK0)                              Disable usb_serial_jtag-to-jtag function           = False R/W (0b0)
DIS_USB_SERIAL_JTAG (BLOCK0)                       Disable usb_serial_jtag module                     = False R/W (0b0)
USB_PHY_SEL (BLOCK0)                               Select internal/external PHY for USB OTGand usb_se = False R/W (0b0)
                                                   rial_jtag                                         

Vdd_Spi Config fuses:
VDD_SPI_XPD (BLOCK0)                               The VDD_SPI regulator is powered on                = False R/W (0b0)
VDD_SPI_TIEH (BLOCK0)                              The VDD_SPI power supply voltage at reset          = Connect to 1.8V LDO R/W (0b0)
VDD_SPI_FORCE (BLOCK0)                             Force using VDD_SPI_XPD and VDD_SPI_TIEH to config = False R/W (0b0)
                                                   ure VDD_SPI LDO                                   
PIN_POWER_SELECTION (BLOCK0)                       Sets default power supply for GPIO33..37           = VDD3P3_CPU R/W (0b0)

Wdt Config fuses:
WDT_DELAY_SEL (BLOCK0)                             Selects RTC WDT timeout threshold at startup       = 0 R/W (0b00)

Flash voltage (VDD_SPI) determined by GPIO45 on reset (GPIO45=High: VDD_SPI pin is powered from internal 1.8V LDO
GPIO45=Low or NC: VDD_SPI pin is powered directly from VDD3P3_RTC_IO via resistor Rspi. Typically this voltage is 3.3 V).
MabezDev commented 2 years ago

I think I found the bug (it was my bad!), could you try out https://github.com/esp-rs/espflash/pull/190 and see if it works?

allison-n-h commented 2 years ago

@MabezDev that fix seemed to work for me!

Serial port: /dev/tty.usbmodem14101
Connecting...

Chip type:         ESP32-S3
Crystal frequency: 40MHz
Flash size:        8MB
Features:          WiFi, BLE
MAC address:       84:f7:03:70:05:b0
[00:00:00] ########################################      13/13      segment 0x0
[00:00:00] ########################################       1/1       segment 0x8000
[00:00:04] ########################################     362/362     segment 0x10000

Flashing has completed!