
    ;)di$                       d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	ddl
mZ ddlmZ ddlmZmZmZmZmZmZ ddlmZmZmZmZ ddlmZmZmZmZmZmZ 	 d dl Z n## e!$ r  ej"        dej#         d	            w xY w	 d
e j$        v rde j$        v r e!d          n# e%$ r Y nw xY w	 d dl&m'c m(Z( n@# e!$ r#  ej"        de j)         dej#         d            e*$ r ej+        dk    rdZ(n Y nw xY w e            \  Z,Z-e,d         Z,e,.                    dd          Z/e,.                    dd          Z0e,.                    de0dz            Z1e,.                    dd          Z2e,.                    dd          Z3e,.                    dd          Z4e,.                    dd          Z5e,.                    d d!          Z6e,.                    d"d#          Z7e,8                    d$d%          Z9e,8                    d&d          Z:e,8                    d'd          Z;d( Z<d) Z=d* Z>d+ Z? G d, d-          Z@ G d. d/          ZA G d0 d1          ZBd2 ZC G d3 d4          ZDdS )5    N   )load_config_file)log)ClassicResetCustomResetDEFAULT_RESET_DELAY	HardResetUSBJTAGSerialResetUnixTightReset)
FatalErrorNotImplementedInROMErrorNotSupportedErrorUnsupportedCommandError)byteget_key_from_valuehexifymask_to_shiftpad_tostrip_chip_namezPySerial is not installed for z8. Check the documentation for installation instructions.serializationdeserializationa  esptool depends on pySerial, but there is a conflict with a currently installed package named 'serial'.
You may work around this by 'pip uninstall serial; pip install pyserial' but this may break other installed Python software that depends on 'serial'.
There is no good fix for this right now, apart from configuring virtualenvs. See https://github.com/espressif/esptool/issues/269#issuecomment-385298196 for discussion of the underlying issue(s).zThe installed version (zD) of pySerial appears to be too old for esptool (Python interpreter z9). Check the documentation for installation instructions.darwinesptooltimeout   chip_erase_timeoutx   max_timeout   sync_timeoutg?md5_timeout_per_mb   erase_region_timeout_per_mb   erase_write_timeout_per_mb(   mem_end_rom_timeout皙?serial_write_timeout
   connect_attempts   write_block_attemptsopen_port_attemptsc                 :    | |dz  z  }|t           k     rt           S |S )z'Scales timeouts which are size-specific    .A)DEFAULT_TIMEOUT)seconds_per_mb
size_bytesresults      U/var/www/menimich/repos/protonApp/venv/lib/python3.11/site-packages/esptool/loader.pytimeout_per_mbr6   t   s'    zC/0FM    c                       fd}|S )at  
    Decorator implementation that wraps a check around an ESPLoader
    bootloader function to check if it's supported.

    This is used to capture the multidimensional differences in
    functionality between the ESP8266 & ESP32 (and later chips) ROM loaders, and the
    software stub that runs on these. Not possible to do this cleanly
    via inheritance alone.
    c                  Z    | d         } |          r | i |S t          |          )Nr   r   )argskwargsobj
check_funcfuncs      r5   innerz'check_supported_function.<locals>.inner   sA    1g:c?? 	64((((*3555r7    )r?   r>   r@   s   `` r5   check_supported_functionrB   |   s)    6 6 6 6 6 6 Lr7   c                 $    t          | d           S )zCAttribute for a function only supported in the software stub loaderc                     | j         S N)IS_STUBos    r5   <lambda>z$stub_function_only.<locals>.<lambda>   s    AI r7   rB   r?   s    r5   stub_function_onlyrL      s    #D*=*=>>>r7   c                 $    t          | d           S )zMAttribute for a function only supported by stubs or ESP32 and later chips ROMc                 "    | j         p| j        dvS )N)ESP8266)rF   	CHIP_NAMErG   s    r5   rI   z.stub_and_esp32_function_only.<locals>.<lambda>   s    	CQ[%C r7   rJ   rK   s    r5   stub_and_esp32_function_onlyrQ      s    #CC  r7   c                       e Zd Zej                            ej                            e          dd          ZdgZ	d Z
d Zed             ZdS )StubFlashertargetsstub_flasher1c                     |j                             |          }t          |                     ||j                            5 }t          j        |          }d d d            n# 1 swxY w Y   t          j        |d                   | _	        |d         | _
        |d         | _        	 t          j        |d                   | _        |d         | _        n# t          $ r d | _        d | _        Y nw xY w|                    d          | _        d S )Ntext
text_startentrydata
data_start	bss_start)
STUB_CLASSstub_json_nameopen_get_json_pathrP   jsonloadbase64	b64decoderX   rY   rZ   r[   r\   KeyErrorgetr]   )selftarget	json_name	json_filestubs        r5   __init__zStubFlasher.__init__   s8   %44V<<	$%%i1ABBCC 	(y9Y''D	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( $T&\22	|,']
	#(f66DI"<0DOO 	# 	# 	#DI"DOOO	# +..s$   A$$A(+A(),C C10C1c                 >   t          | j                  D ]v\  }}t          j                            | j        ||          }t          j                            |          r,|r&t          j        d| j        d          d| d           |c S wt          d| d          )NzStub version r   z doesn't exist, using z insteadzStub flasher JSON file for z not found.)
	enumerateSTUB_SUBDIRSospathjoinSTUB_DIRexistsr   warningFileNotFoundError)rh   rj   	chip_nameisubdir	json_paths         r5   ra   zStubFlasher._get_json_path   s    "4#455 	 	IAvT]FIFFIw~~i(( ! K2(9!(< 2 2!'2 2 2  
 !   ! $DiDDD  r7   c                     |g| _         d S rE   )rp   )clsrz   s     r5   set_stub_subdirzStubFlasher.set_stub_subdir   s    "8r7   N)__name__
__module____qualname__rq   rr   rs   dirname__file__rt   rp   rm   ra   classmethodr~   rA   r7   r5   rS   rS      sy        w||BGOOH55y.QQH5L/ / /&    $ $ [$ $ $r7   rS   c                      e Zd ZU dZdZdZdZed          dz  ed<   dZ	edz  ed<   dZ
edz  ed<   dZdZedz  ed	<   d
Zeed<   dZdZi dddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5ZdZd6Zd7Zd8Zd9Zd:Zd;Zd<ZdZd=Zd>Zd?Zd@Zd
ZdZ dZ!dAZ"dBdCdDdEdFdGdHZ#dZ$d(Z%i Z&e'ee(f         edI<   dZ)eedfdJZ*dK Z+dL Z,e-dM             Z.dN Z/dO Z0dP Z1ddQZ2e3efdR            Z4ddSd
de5fdTZ6ddSd
d
e5fdUZ7dV Z8dW Z9dX Z:ddZZ;d[ Z<d\ Z=dYe>ddfd]Z?d^ Z@e5fd_ZAddaZBdb ZCdc ZDdd ZEddeZFddfZGe5fdgZHe5fdhZIde5fdiZJddjZKddkZLdl ZMddmZNdn ZOdo ZPdp ZQdq ZRdr ZSds ZTdt ZUdu ZVdv ZWdw ZXdx ZYdy ZZdz Z[d{ Z\d| Z]d} Z^d~ Z_d Z`d Zaebd             Zcebd             Zdddeedz  dd fdZfegd             Zhege5fd            Ziegde5fd            Zjegd             Zkegd             Zlemd             Znemd             ZodepfdZqddepfdZrd Zsd Zt	 	 	 	 	 ddZud ZvddZwddZxd ZyddZzd Z{d Z|dS )	ESPLoadera  Base class providing access to ESP ROM & software stub bootloaders.
    Subclasses provide ESP8266 & ESP32 Family specific functionality.

    Don't instantiate this base class directly, either instantiate a subclass or
    call cmds.detect_chip() which will interrogate the chip and return the
    appropriate subclass instance. You can also use a context manager as
    "with detect_chip() as esp:" to ensure the serial port is closed when done.

    zEspressif deviceFNr^   BOOTLOADER_IMAGEIMAGE_CHIP_IDTMAGIC_VALUEr   UF2_FAMILY_IDz/dev/ttyUSB0FLASH_BEGINr   
FLASH_DATAr   	FLASH_END   	MEM_BEGIN   MEM_END   MEM_DATAr,   SYNCr"   	WRITE_REG	   READ_REGr*   SPI_SET_PARAMS   
SPI_ATTACH   READ_FLASH_SLOW   CHANGE_BAUDRATE   FLASH_DEFL_BEGIN   FLASH_DEFL_DATA   FLASH_DEFL_END   SPI_FLASH_MD5                     )GET_SECURITY_INFOERASE_FLASHERASE_REGION
READ_FLASHRUN_USER_CODEFLASH_ENCRYPT_DATAi                 ix  `i  @i i   @i  0@i  zESP32-S3(beta2)zESP32-S3(beta3)zESP32-C6(beta)zESP32-H2(beta1)zESP32-H2(beta2)zESP32-C5(beta3))r   r   r,   r*   r   r   KEY_PURPOSESc           	         d| _         d| _        ddddd| _        t          |t                    rf	 t          j        |dd          | _        t          j	        dk    rd| j        _
        d| j        _        | j                                         n# t
          j        j        $ r}t          j        dt          j                  dgt          j        d	t          j                  d
gg}t          j	                            d          r4|                    t          j        dt          j                  dg           d}|D ]8}|d                             t	          |                    rd|d          d} n9t+          d| d| d|           d}~ww xY w|| _        t-          | j        | j                  | _        |                     |           || _        	 t6          | j        _        dS # t:          $ r d| j        _        Y dS w xY w)a  Base constructor for ESPLoader bootloader interaction

        Don't call this constructor, either instantiate a specific
        ROM class directly, or use cmds.detect_chip(). You can use the with
        statement to ensure the serial port is closed when done.

        This base class has all of the instance methods for bootloader
        functionality supported across various chips & stub
        loaders. Subclasses replace the functions they don't support
        with ones which throw NotImplementedInROMError().

        FN)flash_iduart_nousb_pidsecurity_infoT)	exclusivedo_not_openwin32zErrno 2|FileNotFoundErrorz.Check if the port is correct and ESP connectedzAccess is deniedz-Check if the port is not used by another tasklinuxzPermission deniedz+Try to add user into dialout or uucp group. r   z
Hint: r   
zCould not open z&, the port is busy or doesn't exist.
(z)
)secure_download_modestub_is_disabledcache
isinstancestrserialserial_for_url_portsysplatformrtsdtrr`   
serialutilSerialExceptionrecompile
IGNORECASE
startswithappendsearchr   slip_readertrace_slip_reader_set_port_baudrate_trace_enabledDEFAULT_SERIAL_WRITE_TIMEOUTwrite_timeoutNotImplementedError)rh   portbaudtrace_enabledeport_issueshint_msg
port_issues           r5   rm   zESPLoader.__init__E  sf    %*! % !	
 

 dC   ,	)#2Dd  
 <7**
 &+DJN%*DJN
!!!!$4    
#?OOH
 
#6FFG	 <**733 &&J';R]KKJ   "-  J!!}++CFF33 #?jm#?#?#? !"d " "" "" "  3> DJ'
DJ??
 	%%%+	,'CDJ$$$" 	, 	, 	, (,DJ$$$$	,s+   AB F%C*FFG- -HHc                     | S rE   rA   rh   s    r5   	__enter__zESPLoader.__enter__  s    r7   c                 8    | j                                          d S rE   )r   close)rh   exc_type	exc_value	tracebacks       r5   __exit__zESPLoader.__exit__  s    
r7   c                     | j         j        S rE   )r   r   r   s    r5   serial_portzESPLoader.serial_port  s    zr7   c                 b    	 || j         _        d S # t          $ r t          d| d          w xY w)NzFailed to set baud rate z'. The driver may not support this rate.)r   baudrateOSErrorr   )rh   r   s     r5   r   zESPLoader._set_port_baudrate  sR    	"&DJ 	 	 	X4XXX  	s    .c                 *    t          | j                  S )z'Read a SLIP packet from the serial port)nextr   r   s    r5   readzESPLoader.read  s    D%&&&r7   c                    d|                     dd                               dd          z   dz   }|                     dt          |           dddt          |                      | j                            |           d	S )
z=Write bytes to the serial port while performing SLIP escaping      s   s   zWrite  bytes:<21 N)replacer   lenHexFormatterr   write)rh   packetbufs      r5   r  zESPLoader.write  s     ~~g{33;;G[QQS 	
 	

0s3xx000JJJ|C7H7HJJKKK
r7   c                     | j         r_t          j                    }	 || j        z
  }n# t          $ r d}Y nw xY w|| _        d|dd}t	          j        |rdnd| d|            d S d S )Ng        z TRACE +.3fz  r   r   r   )r   time_last_traceAttributeErrorr   print)rh   messagenewlinenowdeltaprefixs         r5   r   zESPLoader.trace  s     	F)++Cd..!   "D-----FIg-dd2&/D/D7/D/DEEEEE	F 	Fs   
' 66c                     | D ]}||z  }|S )z9Calculate checksum of a blob, as it is defined by the ROMrA   )r[   statebs      r5   checksumzESPLoader.checksum  s#      	 	AQJEEr7   r7   c                      j         j        }t          |t                    }||k    r| j         _        	 |                     dt           j        |           d|ddt          |           d|rdnd d	|d
dt          |           dd           t          j
        dd|t          |          |          |z   }                     |           |s	 ||k    r| j         _        dS dS t          d          D ]}	                                 }
t          |
          dk     r*t          j        d|
dd                   \  }}}}|dk    rS|
dd         }|||k    r||fc ||k    r| j         _        S S t          |d          dk    r:t          |d           j        k    r!d fd	} |d           t#           |          	 ||k    r| j         _        n# ||k    r| j         _        w xY wt%          d          )z$Send a request and read the responseNz--- Cmd z (z#04xz) | data_len z | wait_response r   r   z | timeout r  z | data z ---T)r  s   <BBHId   r"   z<BBHIr(   c                     t          j        |            j        j        }dj        _        j                            d           |j        _                                         dS )a  
                        Actively drain the input buffer by reading data
                        for a specified time. Simple approach for some
                        drivers that have issues with the buffer flushing.

                        Args:
                            buffering_time: Time in seconds to wait for
                            the buffer to fill.
                        gMbP?p   N)r  sleepr   r   r   flush_input)buffering_timeoriginal_timeoutrh   s     r5   drain_input_bufferz-ESPLoader.command.<locals>.drain_input_buffer  sd     
>222+/:+=(-2
* 
/// .>
*((*****r7   zResponse doesn't match request.)r(   )r   r   minMAX_TIMEOUTr   r   ESP_CMDSr   r  structpackr  ranger   unpackr   ROM_INVALID_RECV_MSGr   r   )rh   opr[   chkwait_responser   saved_timeoutnew_timeoutpktretryprespop_retlen_retvalr  s   `               r5   commandzESPLoader.command  s    
*';//-''!,DJ?	3~

P1$-DD P PU P P #D		P PAN<UAATUP P")OP P7CD7I7IP P P !	     k(D"c$iiEEL

3  d m++%2
""" ,+Y s )< )<IIKKq66A::/5}Wae/L/L,vw199u:29$$D m++%2
"" ,C a==A%%$tQ--4;T*T*T+ + + + + +6 '&s+++1$;;;S)<X m++%2
" m++%2
"2222:;;;s   BG +A9G 8AG G/c                    d}|                      ||||          \  }}t          |          ||z   k     rQ|dd         }	|	d         dk    rt          j        d| |	          t          d| dt          |           d          ||||z            }	|	d         dk    rt          j        d| |	          |dk    r
|d|         S |S )z
        Execute a command with 'command', check the result code and throw an appropriate
        FatalError if it fails.

        Returns the "result" of a successful command.
        r   r   r   z
Failed to z. Only got z byte status response.N)r1  r   r   
WithResult)
rh   op_descriptionr%  r[   r&  resp_data_lenr   STATUS_BYTES_LENGTHr0  status_bytess
             r5   check_commandzESPLoader.check_command  s    &   LLT3L@@	T t99}'::::!9L A!## +,I,I,I<XXX B B B #D		B B B   MM<O,OOP ?a'(E^(E(E|TTT1''Jr7   c                 v    | j                                          t          | j         | j                  | _        d S rE   )r   
flushInputr   r   r   r   s    r5   r  zESPLoader.flush_inputR  s2    
'
DJ??r7   c                     |                      | j        d         dt                    \  }}|dk    | _        t	          d          D ]-}|                                  \  }}| xj        |dk    z  c_        .d S )Nr   s$    UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUr3  r   r,   )r1  r  SYNC_TIMEOUTsync_stub_detectedr"  )rh   r0  _s      r5   synczESPLoader.syncV  s    M&!.   
 
Q #&(q 	0 	0A\\^^FC##sax/###	0 	0r7   c                    | j         d         | j         d         S t          t          j        d           d S | j        j        }|                                                    d          st          j        d           d S |                    d          r>t          j	        
                    |          rt          j	                            |          }|g}t          j        dk    r-d|v r)|                    |                    dd                     t          j                    }|D ]#}|j        |v r|j        | j         d<   |j        c S $t          j        d	| d
           d S )Nr   zK
Listing all serial ports is currently not available. Can't get device PID.)com/dev/zK
Device PID identification is only supported on COM and /dev/ serial ports.rC  r   ttycuz"
Failed to get PID of a device on z , using standard reset sequence.)r   
list_portsr   r
  r   r   lowerr   rq   rr   islinkrealpathr   r   r   r   comportsdevicepid)rh   active_portactive_portsportsr,  s        r5   _get_pidzESPLoader._get_pidf  s   :i ,:i((I(   Fjo   ""--.>?? 	I.   F!!'** 	8rw~~k/J/J 	8'**;77K#} <8##(<(< 3 3E4 @ @AAA#%% 	 	Ax<''()
9%u ( 		-+ - - -	
 	
 	
 	
 	
r7   default-resetc                 L   d}d}d}|dk    r|S |dk    r| j         s| j                                          |             | j                                        }| j                            |          }t          j        d|t
          j                  }|.d}|                    d          }	|                    d          du}t          d	          D ]}
	 | 
                                 | j                                         |                                   dS # t          $ r7}t          j        d
dd           t!          j        d           |}Y d}~d}~ww xY w|rFt          d                    |	                    d                              }|rt          d          }|S )zA single connection attemptNFno-reset-no-syncno-resets.   boot:(0x[0-9a-fA-F]+)(.*waiting for download)?Tr   r   r   .r   endflush皙?zEWrong boot mode detected ({})! The chip needs to be in download mode.utf-8zdDownload mode successfully detected, but getting no sync reply: The serial TX path seems to be down.)USES_RFC2217r   reset_input_buffer	inWaitingr   r   r   DOTALLgroupr"  r  flushOutputr@  r   r   r
  r  r  formatdecode)rh   reset_strategymode
last_errorboot_log_detecteddownload_modewaiting
read_bytesr[   	boot_moder?  r   s               r5   _connect_attemptzESPLoader._connect_attempt  s   
! %%%:$ 0
--///N j**,,G11J9A:ry D $(! JJqMM	 $

1T 9q 		 		A  """
&&(((		tt   	#2T2222
4   






  	#99?$$W--: : J  '; 
 s   AD
E"-EEc                 Z    	 fd| j         D             d         S # t          $ r Y dS w xY w)z
        Returns a tuple of (start, end) for the memory map entry with the given name,
        or None if it doesn't exist
        c                 ,    g | ]\  }}}|k    ||fS rA   rA   ).0startrW  nnames       r5   
<listcomp>z/ESPLoader.get_memory_region.<locals>.<listcomp>  s)    UUU_eS!1PT99UCL999r7   r   N)
MEMORY_MAP
IndexError)rh   rq  s    `r5   get_memory_regionzESPLoader.get_memory_region  sL    
	UUUUUUUVWXX 	 	 	44	s    
**c                    t                               d          }|t          | j        |          fS t                               d          }||x}}nt
          }t
          dz   }| j        dk    r:t          j                            dd          	                                dk    rd	x}}|d
k    s| 
                                | j        k    rt          | j                  fS t          j        dk    rq| j        j                            d          sRt          | j        |          t          | j        |          t!          | j        |          t!          | j        |          fS t!          | j        |          t!          | j        |          fS )z
        Constructs a sequence of reset strategies based on the OS,
        used ESP chip, external settings, and environment variables.
        Returns a tuple of one or more reset strategies to be tried sequentially.
        custom_reset_sequenceNreset_delayg      ?ESP32ESPTOOL_ENV_FPGAr   rV   r,   z	usb-resetntzrfc2217:)cfgrg   r   r   getfloatr   rP   rq   environstriprP  USB_JTAG_SERIAL_PIDr
   rq  r   r   r   )rh   rd  cfg_custom_reset_sequencecfg_reset_delaydelayextra_delays         r5   "_construct_reset_strategy_sequencez,ESPLoader._construct_reset_strategy_sequence  sn    %(GG,C$D$D!$0
,EFFHH,,}55&"11EKK'E-3K Ng%%
1266<<>>#EE"##EK ;$--//T5M"M"M&tz2244 7d??4:?#=#=j#I#I?tz511tz;77TZ//TZ55	  U++[11
 	
r7   c                 L   |r|dv rt          j        d| d           | j        j                            d          rd}t          j        d           t          j        ddd	
           d}|                     |          }	 t          |dk    rt          |          nt          j
                    t          j        |                    D ]\  }}|                     ||          }| n t          j        d           n# t          j        d           w xY w|dd}	| j        dk    r| j        j        dk     rd}	| j                                         t!          d|	 d                    | j        |                    |sddlm}
 	 |                                 }|                                 }|d         d         | _        nS# t.          t           f$ r? d}	 |                     t2          j                  }n# t.          $ r d}d	| _        Y nw xY wY nw xY wd}d}|r0| j        s|| j        k    rd	}|
D ]}|j        s||j        k    r|} nnQ|s7| j        s0| j        r|| j        k    rd	}|
D ]}|j        r||j        k    r|} nn|s| j        r| j        dk    rd	}d}|rm|r2|0|rd| dnd|dd}t          j        d| j         d| d           n9t?          |t@                    r|n|j        }t!          d| d | j         d!          | !                                 dS dS )"z8Try connecting repeatedly until successful, or giving up)rT  rS  zPre-connection option "zZ" was selected. Connection may fail if the chip is not in bootloader or flasher stub mode.zsocket:rT  zIt's not possible to reset the chip over a TCP socket. Automatic resetting to bootloader has been disabled, reset the chip manually.zConnecting...r   TrV  Nr   zESP32-C2r   ze
Note: Please set a higher baud rate if ESP32-C2 doesn't connect (at least 115200 Bd is recommended).zFailed to connect to {}: {}zl
For troubleshooting steps visit: https://docs.espressif.com/projects/esptool/en/latest/troubleshooting.htmlr   )ROM_LISTparsed_flagsSECURE_DOWNLOAD_ENABLEFzESP32-S2z(read chip ID )z(read chip magic value z#08xz"This chip doesn't appear to be an r   zY. Probably it is unsupported by this version of esptool. Will attempt to continue anyway.zThis chip is z, not z. Wrong chip argument?)"r   noter   rq  r   r
  r  zipr"  	itertoolscountcyclerk  rP   r   r   r   ra  rT   r  get_chip_idget_security_infor   r   read_regr   CHIP_DETECT_MAGIC_REG_ADDRUSES_MAGIC_VALUEr   r   rv   r   r   _post_connect)rh   rd  attempts	detectingwarningsre  reset_sequencer?  rc  additional_msgr  chip_idsichip_magic_valuedetectedchip_arg_wrongr}   	specifier	chip_types                      r5   connectzESPLoader.connect  s     	 @@@H($ ( ( (   :?%%i00 	DH+   		/r6666
@@FF		%(#+a<<hY_5F5F//& &  !> "22>4HH
%E & IbMMMMCIbMMMM!N~++
0Cf0L0L< 
 J]!] ] ] ^d]cNJ^ ^	    K	!))))))5 **,,++--,.~,>?W,X))+Z8 5 5 55'+}}!<( ($$ / 5 5 5 (,$04D---	55 H"N  &D1 &W@R5R5R!%#  C/ Gs?P4P4P#& &1& .& 3CdFV2V2V!%#  C+ 0@CO0S0S#& &-& Nj00!%%   0 #P33333O7GOOOO 
 KGT^ G G$G G G    %/x$=$=U8CU  %/	 / / / / /        WK	! K	!sC   A(D   D	;G HG98H9HHHHHc                     dS )z
        Additional initialization hook, may be overridden by the chip-specific class.
        Gets called after connect, and after auto-detection.
        NrA   r   s    r5   r  zESPLoader._post_connect{  s	    
 	r7   c                 t    t          j        d|          }|                     d| j        d         ||          S )zRead memory address in target<Izread target memoryr   r3  )r   r!  r9  r  )rh   addrr   r1  s       r5   r  zESPLoader.read_reg  s@    +dD))!! $-
";Wg " 
 
 	
r7       c                     t          j        d||||          }|dk    r |t          j        d| j        dd|          z  }|                     d| j        d         |          S )z!Write to memory address in target<IIIIr   zwrite target memoryr   )r   r!  UART_DATE_REG_ADDRr9  r  )rh   r  valuemaskdelay_usdelay_after_usr1  s          r5   	write_regzESPLoader.write_reg  sr    +gtUD(CCAv{0!Q  G !!!4=#=w
 
 	
r7   c                     t          |          }|                     |          }|| z  }|||z  |z  z  }|                     ||           |S )z
        Update register at 'addr', replace the bits masked out by 'mask'
        with new_val. new_val is shifted left to match the LSB of 'mask'

        Returns just-written value of register.
        )r   r  r  )rh   r  r  new_valshiftr0  s         r5   
update_regzESPLoader.update_reg  sZ     d##mmD!!u5 D((tS!!!
r7   c                    | j         rt          |           }|}||z   }|j        p|j        |j        t	          |j                  z   f|j        |j        t	          |j                  z   ffD ]1\  }}	||	k     r&||k    r t          d|dd|	dd|dd|dd	          2| 	                    d| j
        d         t          j        d||||                    S )	z-Start downloading an application image to RAMzStub flasher is resident at z#010x-z1. Can't load binary at overlapping address range zD. Either change binary loading address, or disable the stub flasher.zenter RAM download moder   r  )rF   rS   r]   r\   r   r[   rY   rX   r   r9  r  r   r!  )
rh   sizeblocks	blocksizeoffsetrl   
load_startload_end
stub_startstub_ends
             r5   	mem_beginzESPLoader.mem_begin  s=    < 	t$$DJ}H N5doOc$)nn4 $/C	NN"BC)  $
H ((X
-B-B$H%@H H.6@H H &UH H /7UH H H   !!%M+&Kvy&AA
 
 	
r7   c                     |                      d| j        d         t          j        dt	          |          |dd          |z   |                     |                    S )zSend a block of an image to RAMzwrite to target RAMr   r  r   )r9  r  r   r!  r   r  )rh   r[   seqs      r5   	mem_blockzESPLoader.mem_block  sV    !!!M*%KTCA66=MM$	
 
 	
r7   c                     | j         rt          nt          }t          j        dt          |dk              |          }	 |                     d| j        d         ||          S # t          $ r | j         r Y dS w xY w)z+Leave download mode and run the application<IIr   zleave RAM download moder   )r[   r   N)	rF   r1   MEM_END_ROM_TIMEOUTr   r!  intr9  r  r   )rh   
entrypointr   r[   s       r5   
mem_finishzESPLoader.mem_finish  s     &*\J//7J{5#jAo"6"6
CC
	%%)i(	 &     	 	 	| DD	s   #A" "A87A8c                    || j         z   dz
  | j         z  }|                     ||          }t          j                    }| j        rt          }nt          t          |          }t          j        d||| j         |          }	| j	        r#| j        s|	t          j        d|rdnd          z  }	| 
                    d| j        d         |	|           |dk    r6| j        s/|r-t          j        dt          j                    |z
  d	d
           |S )z
        Start downloading to Flash (performs an erase)

        Returns number of blocks (of size self.FLASH_WRITE_SIZE) to write.
        r   r  r  r   zenter flash download moder   r3  Took .2fs to erase flash block.)FLASH_WRITE_SIZEget_erase_sizer  rF   r1   r6   ERASE_REGION_TIMEOUT_PER_MBr   r!  SUPPORTS_ENCRYPTED_FLASHr9  r  r   r
  )
rh   r  r  begin_rom_encryptedlogging
num_blocks
erase_sizetr   paramss
             r5   flash_beginzESPLoader.flash_begin  s0    T22Q64;PP
((66
IKK< 	%GG$+T G ZT-BF
 
 ( 	I 	Ifk$-@(GaHHHF'M-(	 	 	
 	
 	
 199T\9g9IJdikkAoJJJJKKKr7   c                 `   t          t          dz
  dd          D ]}	 |                     d| | j        d         t	          j        dt          |          |dd          |z   |                     |          |            d
S # t          $ r  |r| 	                    d| d	           n Y w xY wd
S )z#Write block to flash, retry if failr   z write to target flash after seq r   r  r   r3  z"Block write failed, retrying with z attempts left...N
r"  WRITE_BLOCK_ATTEMPTSr9  r  r   r!  r   r  r   r   rh   r[   r  r   attempts_lefts        r5   flash_blockzESPLoader.flash_block  s   "#7!#;RDD 	 	M""<s<<M,/KTCA>>EMM$''# #         JJJ)6J J J   
  	 	   A!B'B+*B+c                    | j         r| j        s|                     |||          S t          t          dz
  dd          D ]}	 |                     d| | j        d         t          j        dt          |          |dd          |z   | 
                    |          |            d
S # t          $ r  |r|                     d| d	           n Y w xY wd
S )z,Encrypt, write block to flash, retry if failr   r  z*Write encrypted to target flash after seq r   r  r   r3  z,Encrypted block write failed, retrying with  attempts leftN)r  rF   r  r"  r  r9  r  r   r!  r   r  r   r   r  s        r5   flash_encrypt_blockzESPLoader.flash_encrypt_block  s6   ( 	8 	8 ##D#w777"#7!#;RDD 	 	M""FFFM"67KTCA>>EMM$''# #         JJG)6G G G   
  	 	s   A!B&&'CCc                     t          j        dt          |                     }|                     d| j        d         ||           dS )zLeave flash mode and run/rebootr  zleave flash download moder   r3  N)r   r!  r  r9  r  rh   rebootr   r*  s       r5   flash_finishzESPLoader.flash_finish.  sU    k$J00'M+&	 	 	
 	
 	
 	
 	
r7   c                 \    |                      dd           |                     |           dS )zRun application code in flashr   N)r  r  )rh   r  s     r5   runzESPLoader.run9  s4     	A&!!!!!r7   c                 |    |r| j         d         !d}|                     |dd          | j         d<   | j         d         S )z)Read SPI flash manufacturer and device IDr   N   r7      )r   run_spiflash_command)rh   r   SPIFLASH_RDIDs      r5   r   zESPLoader.flash_id?  sH     	W
:.6 M%)%>%>}cSU%V%VDJz"z*%%r7   c                     dS )zFRead flash type bit field from eFuse. Returns 0, 1, None (not present)NrA   r   s    r5   
flash_typezESPLoader.flash_typeF  s    tr7   c                 
   |r| j         d         | j         d         S ddddddd	d
ddddfd}	 |                     d| j        d         dd          }t          j        d|          }d}nK# t
          $ r> |                     d| j        d         dd          }t          j        d|          }d}Y nw xY w|d         |d         |dd         |rdn|d         |rdn|d          ||d                   d}|| j         d<   |S )a5  
        Get security information from the ESP device including flags,
        flash encryption count,
        key purposes, chip ID, and API version.

        The security info command response format according to the ESP32-S3
        documentation:
        - 32 bits flags
        - 1 byte flash_crypt_cnt
        - 7x1 byte key_purposes
        - 32-bit word chip_id (ESP32-S3 and later)
        - 32-bit word eco_version/api_version (ESP32-S3 and later)

        Returns a dictionary with parsed security information and individual
        flag status.
        r   Nr   r   r   r"   r       @         i   r   )SECURE_BOOT_ENSECURE_BOOT_AGGRESSIVE_REVOKEr  SECURE_BOOT_KEY_REVOKE0SECURE_BOOT_KEY_REVOKE1SECURE_BOOT_KEY_REVOKE2SOFT_DIS_JTAGHARD_DIS_JTAGDIS_USBDIS_DOWNLOAD_DCACHEDIS_DOWNLOAD_ICACHEc                 X    i }                                 D ]\  }}| |z  dk    ||<   |S )z3Parse security flags into individual boolean valuesr   )items)flags_valuer  	flag_name	flag_maskSECURITY_INFO_FLAG_MAPs       r5   parse_security_flagsz9ESPLoader.get_security_info.<locals>.parse_security_flagsn  sG    L(>(D(D(F(F I I$	9+6+Bq*HY''r7   zget security infor   r7   r   )r6  z<IBBBBBBBBIIF   z
<IBBBBBBBBTr   r   r*   )flagsflash_crypt_cntkey_purposesr  api_versionr  )r   r9  r  r   r#  r   )rh   r   r  resesp32s2r   r  s         @r5   r  zESPLoader.get_security_infoJ  s   "  	/TZ0<:o..
  &.4'-(.(.(.$$$*$+"
 "
	  	  	  	  	 	$$#12 	 %  C -44CGG 	 	 	$$#12 	 %  C -c22CGGG	 V"1v!H&2ttCF#*744B00Q88
 
 '4
?#s   ;A. .AB65B6c                 \    |                                  d         }|t          d          |S )Nr  z}Security info command does not contain chip ID. This is expected for ESP32-S2 which doesn't support chip ID in security info.)r  r   )rh   r  s     r5   r  zESPLoader.get_chip_id  s;    ((**95?$  
 r7   c                     	 | j         d         %|                     | j                  dz  | j         d<   | j         d         S # t          $ r Y dS w xY w)zb
        Read the UARTDEV_BUF_NO register to get the number of the currently used console
        r   N   )r   r  UARTDEV_BUF_NOr	  r   s    r5   get_uart_nozESPLoader.get_uart_no  sc    
	z)$,(,d6I(J(JT(Q
9%:i(( 	 	 	44	s   >A 
AAc                     dS )z>
        Check if the chip uses USB-Serial/JTAG mode.
        FrA   r   s    r5   uses_usb_jtag_serialzESPLoader.uses_usb_jtag_serial  	     ur7   c                     dS )z6
        Check if the chip uses USB OTG mode.
        FrA   r   s    r5   uses_usb_otgzESPLoader.uses_usb_otg  r  r7   c                 f    |                                  }|                                 }|rdn|rdndS )z
        Get the USB mode of the chip: USB-Serial/JTAG or USB-OTG.
        If the usb_mode is None, external USB-UART is used.
        zUSB-Serial/JTAGzUSB-OTGN)r  r  )rh   usb_jtag_serialusb_otgs      r5   get_usb_modezESPLoader.get_usb_mode  sA    
 3355##%%$3W  g9WSWWr7   c                 Z    |                                  dz  |                                 z   S )Nr  )get_major_chip_versionget_minor_chip_versionr   s    r5   get_chip_revisionzESPLoader.get_chip_revision  s*    **,,s2T5P5P5R5RRRr7   c                     t           rE   r:   r   s    r5   r  z ESPLoader.get_minor_chip_version      &&r7   c                     t           rE   r:   r   s    r5   r  z ESPLoader.get_major_chip_version  r  r7   c                     t           rE   r:   )rh   mac_types     r5   read_maczESPLoader.read_mac  r  r7   c                 "    t          | d          )NzFunction chip_idr   r   s    r5   r  zESPLoader.chip_id      &8999r7   c                     dS NFrA   r   s    r5   get_secure_boot_enabledz!ESPLoader.get_secure_boot_enabled      ur7   c                     dS r(  rA   r   s    r5   get_flash_encryption_enabledz&ESPLoader.get_flash_encryption_enabled  r*  r7   c                     dS r(  rA   r   s    r5   get_encrypted_download_disabledz)ESPLoader.get_encrypted_download_disabled  r*  r7   c                     t           rE   r:   r   s    r5   get_flash_crypt_configz ESPLoader.get_flash_crypt_config  r  r7   c                 "    t          | d          )NzReading flash voltager%  r   s    r5   get_flash_voltagezESPLoader.get_flash_voltage  s    &=>>>r7   c                 "    t          | d          )NzOverriding VDDSDIOr%  )rh   new_voltages     r5   override_vddsdiozESPLoader.override_vddsdio  s    &:;;;r7   c                 "    t          | d          )NzSetting --spi-connectionr%  )rh   spi_connections     r5   check_spi_connectionzESPLoader.check_spi_connection  s    &@AAAr7   c                 "    t          | d          )NzReading chip SPI pad configr%  r   s    r5   get_chip_spi_padszESPLoader.get_chip_spi_pads  s    &CDDDr7   c                 "    t          | d          )NzFlash encryptionr%  r   s    r5   is_flash_encryption_key_validz'ESPLoader.is_flash_encryption_key_valid  r&  r7   c           
          	 | j         |         S # t          $ r@ t          d| dd                    | j                                                              w xY w)NzFlash size 'z7' is not supported by this chip type. Supported sizes: , )FLASH_SIZESrf   r   rs   keysr}   args     r5   parse_flash_size_argzESPLoader.parse_flash_size_arg  s~    	?3'' 	 	 	Hs H H$(IIco.B.B.D.D$E$EH H  	s
    A
Ac           
          |dS 	 | j         |         S # t          $ r@ t          d| dd                    | j                                                              w xY w)Nr   zFlash frequency 'z=' is not supported by this chip type. Supported frequencies: r>  )FLASH_FREQUENCYrf   r   rs   r@  rA  s     r5   parse_flash_freq_argzESPLoader.parse_flash_freq_arg  s    ;1	&s++ 	 	 	RC R R*.))C4G4L4L4N4N*O*OR R  	s
    A
Arl   returnc                 `   t          j                     |t          |           }| j        rGt          j        d           t          j        d           | j        |                     |           n| S | j        dk    o|                                 }t          j        d           |j        |j	        fD ]}|||j        k    r|j
        n|j        }t          |          }|| j        z   dz
  | j        z  }|                     ||| j        |           t          |          D ]4}|| j        z  }|| j        z   }	|                     |||	         |           5t          j        d           |s|                     |j                   n~d}
|                     d	           |                     |
          }|                     |
|j                   |                     | j        d
         t/          j        dd	d	          d           	 |                                 }n# t4          $ r t7          d          w xY w|dk    rt7          d|           |r|                     |
|           t          j        d           t          j        d           | j        |                     |           n| S )NT)finishz8Stub flasher is already running. No upload is necessary.zESP32-S3zUploading stub flasher...r   zRunning stub flasher...i?r   r   r  Fr'  zFailed to start stub flasher. There was no response.
Try increasing timeouts, for more information see: https://docs.espressif.com/projects/esptool/en/latest/esptool/configuration-file.htmls   OHAIz3Failed to start stub flasher. Unexpected response: zStub flasher running.)r   stagerS   r>  r
  r^   rP   r)  rX   r[   rY   r\   r   ESP_RAM_BLOCKr  r"  r  r  rZ   r  r  r1  r  r   r!  r   StopIterationr   )rh   rl   secure_boot_workflowfieldoffslengthr  r  	from_offsto_offs"rom_spiflash_legacy_funcs_read_ptrstored_read_pointerr,  s                r5   run_stubzESPLoader.run_stub  s   	<t$$D" 	RIT""""IPQQQ,0O,G4??4(((TQ Nj(KT-I-I-K-K 	
 		-...i+ 		B 		BE */49*<*<t$/U 4#559d>PPvvt/A4HHH == B BC #d&8 8I'$*<<GNN57):#;SAAAA	+,,,# 	OODJ''''
 2<.OOA"&--0R"S"SNN=tzJJJLL/0E1a((#    			AA 	 	 	h  	 <<VSTVVWWW 	TNN=?RSSS		)***(,(Ctt$$$Ms   H H6c                 X   || j         z   dz
  | j         z  }|| j         z   dz
  | j         z  }t          j                    }| j        r
|}t          }n|| j         z  }t	          t
          |          }t          j        d| d| d           t          j	        d||| j         |          }	| j
        r| j        s|	t          j	        dd          z  }	|                     d| j        d	         |	|
           |dk    r4| j        s-t          j        dt          j                    |z
  dd           |S )z
        Start downloading compressed data to Flash (performs an erase)

        Returns number of blocks (size self.FLASH_WRITE_SIZE) to write.
        r   zCompressed z
 bytes to ...r  r  r   zenter compressed flash moder   r3  r  r  r  )r  r  rF   r1   r6   r  r   r
  r   r!  r  r9  r  )
rh   r  compsizer  r  erase_blocksr  
write_sizer   r  s
             r5   flash_defl_beginzESPLoader.flash_defl_begin@  sj    !66:t?TT
t44q8T=RRIKK< 	  &GG t44  %+Z G 		======>>>ZT-BF
 
 ( 	+ 	+ fk$***F)M,-	 	 	
 	
 	
 199T\9IJdikkAoJJJJKKKr7   c                 `   t          t          dz
  dd          D ]}	 |                     d| | j        d         t	          j        dt          |          |dd          |z   |                     |          |            d
S # t          $ r  |r| 	                    d| d	           n Y w xY wd
S )z4Write block to flash, send compressed, retry if failr   r  z)write compressed data to flash after seq r   r  r   r3  z-Compressed block write failed, retrying with r  Nr  r  s        r5   flash_defl_blockzESPLoader.flash_defl_blockj  s
    ##7!#;RDD 	 	M""EEEM"34KTCA>>EMM$''# #         JJG)6G G G   
  	 	r  c                     |s	| j         sdS t          j        dt          |                     }|                     d| j        d         ||           d| _        dS )z*Leave compressed flash mode and run/rebootNr  zleave compressed flash moder   r3  F)rF   r   r!  r  r9  r  in_bootloaderr  s       r5   flash_defl_finishzESPLoader.flash_defl_finish  sv      	dl 	 Fk$J00)M*+	 	 	
 	
 	
 #r7   c                 6   d}d}t          t          |          }|                     d| j        d         t	          j        d||dd          | j        r|n||          }| j        s|                    d          S t          |          	                                S )	Nr  r   zcalculate md5sumr   r  r   )r6  r   rZ  )
r6   MD5_TIMEOUT_PER_MBr9  r  r   r!  rF   rb  r   rG  )rh   r  r  RESP_DATA_LENRESP_DATA_LEN_STUBr   r
  s          r5   flash_md5sumzESPLoader.flash_md5sum  s      !3T::  M/*KtQ2204O,,- ! 
 
 | 	'::g&&&#;;$$&&&r7   c                 l   t          j        d| d           | j        r| j        j        nd}|                     | j        d         t          j        d||                     t          j        d           | 	                    |           t          j        d           |                                  d S )NzChanging baud rate to rX  r   r   r  zChanged.rY  )r   r
  rF   r   r   r1  r  r   r!  r   r  r  r  )rh   r   
second_args      r5   change_baudzESPLoader.change_baud  s    	44444555,0L?TZ((a
M+,fk%z.R.R	
 	
 	
 		*%%%
4r7   c                 V    |                      d| j        d         t                     d S )Nzerase flashr   r3  )r9  r  CHIP_ERASE_TIMEOUTr   s    r5   erase_flashzESPLoader.erase_flash  s:     	4=7AS 	 	
 	
 	
 	
 	
r7   c           	          t          t          |          }|                     d| j        d         t	          j        d||          |           d S )Nzerase regionr   r  r3  )r6   r  r9  r  r   r!  )rh   r  r  r   s       r5   erase_regionzESPLoader.erase_region  sZ     !<dCCM.)Kvt,,	 	 	
 	
 	
 	
 	
r7   c                 ,    t          | | j                  rE   )r   read_flash_slow)rh   r  rQ  progress_fns       r5   rp  zESPLoader.read_flash_slow  s    &tT-ABBBr7   c                 H   | j         s|                     |||          S |                     d| j        d         t	          j        d||| j        d                     d}t          |          |k     rd| j        _	        | 
                                }||z  }t          |          }||k     rBt          |          | j        k     r*t          d| j        dd	t          |          dd
          |                     t	          j        d|                     |r|dz  dk    s||k    r ||||           t          |          |k     t          |          |k    rt          d          | 
                                }t          |          dk    rt          dt          |                     t          |                                          }t          j        |                                                                          }	|	|k    rt          d| d|	           |S )Nz
read flashr   r  r  r7   r   zCorrupt data, expected z#xz bytes but received z bytes.r  r   r   zRead more than expected.r   zExpected digest, got: zDigest mismatch: expected z, got )rF   rp  r9  r  r   r!  FLASH_SECTOR_SIZEr   r   r   r   r   r  r   upperhashlibmd5	hexdigest)
rh   r  rQ  rq  r[   r,  data_lendigest_frameexpected_digestdigests
             r5   
read_flashzESPLoader.read_flash  sH   | 	E''DDD 	M,'K1GLL	
 	
 	
 $ii&  !"DJ		AAID4yyH&  SVVd.D%D%D =d.DJ = =*-a&&<= = =   JJv{422333 641 4 4F8J8JHff555 $ii&   t99v7888yy{{|""Lf\6J6JLLMMM ..4466T"",,..4466_$$L_LLFLL   r7   c                     t          j        d|          }| j        sd}|t          j        d|ddd          z  }|                     d| j        d         |           dS )zSend SPI attach command to enable the SPI flash pins

        ESP8266 ROM does this when you send flash_begin, ESP32 ROM
        has it as a SPI command.
        r  r   BBBBzconfigure SPI flash pinsr   N)r   r!  rF   r9  r  )rh   hspi_argrB  	is_legacys       r5   flash_spi_attachzESPLoader.flash_spi_attach  si     k$))| 	; I6;vy!Q:::C5t}\7RTWXXXXXr7   c                     d}|}d}d}d}d}|                      d| j        d         t          j        d||||||                     d	S )
a>  Tell the ESP bootloader the parameters of the chip

        Corresponds to the "flashchip" data structure that the ROM
        has in RAM.

        'size' is in bytes.

        All other flash parameters are currently hardcoded (on ESP8266
        these are mostly ignored by ROM code, on ESP32 I'm not sure.)
        r   i   r   r  i  zset SPI paramsr   z<IIIIIIN)r9  r  r   r!  )rh   r  fl_id
total_size
block_sizesector_size	page_sizestatus_masks           r5   flash_set_parameterszESPLoader.flash_set_parameters  sv     

	M*+K 	
 	
 	
 	
 	
r7   c                     d}d}d}	d}
d} j         dz   dz   } j        z   } j        z    j        z   } j        z   } j         fd	}n	 fd
}dd}d|dk    rt          d          t          |          dk    rt          d          t          |          dz  }                     |          }                     |          }|}|dk    r||
z  }|dk    r||z  }dk    r||z  }dk    r||	z  } |||            	                    ||            	                    |d|z  |z             dk    r% j
        r|dz
  z  } 	                    ||           |dk    r 	                    |d           n[t          |dd          }t          j        dt          |          dz  z  |          }|}|D ]} 	                    ||           |dz  } 	                                fd} |                                  |          } 	                    ||            	                    ||           |S )a  Run an arbitrary SPI flash command.

        This function uses the "USR_COMMAND" functionality in the ESP
        SPI hardware, rather than the precanned commands supported by
        hardware. So the value of spiflash_command is an actual command
        byte, sent over the wire.

        After writing command byte, writes 'data' to MOSI and then
        reads back 'read_bits' of reply on MISO. Result is a number.
        l        i   @i    i   i   r   r   Nc                 "   
j         z   }
j        z   }| dk    r
                    || dz
             |dk    r
                    ||dz
             d}	dk    r|	dz
  z  }dk    r|dz
  z  z  }|r
                    |           d S d S )Nr   r   )SPI_MOSI_DLEN_OFFSSPI_MISO_DLEN_OFFSr  )	mosi_bits	miso_bitsSPI_MOSI_DLEN_REGSPI_MISO_DLEN_REGr  SPI_USR1_REGSPI_USR_ADDR_LEN_SHIFTaddr_lenbase	dummy_lenrh   s        r5   set_data_lengthsz8ESPLoader.run_spiflash_command.<locals>.set_data_lengthsC  s    $(4+B$B!$(4+B$B!q==NN#4i!mDDDq==NN#4i!mDDDq==Y]*Ea<<hl/EEEE 8NN<777778 8r7   c                     }d}d}| dk    rdn| dz
  }|dk    rdn|dz
  }||z  ||z  z  }dk    r|dz
  z  }
dk    r|
dz
  	z  z  }                     ||           d S )Nr   r"   r   r   )r  )r  r  SPI_DATA_LEN_REGSPI_MOSI_BITLEN_SSPI_MISO_BITLEN_S	mosi_mask	miso_maskr  r  r  r  r  rh   s           r5   r  z8ESPLoader.run_spiflash_command.<locals>.set_data_lengthsT  s    #/ $&!$%!"+q..AA	A	"+q..AA	A	"&77!22 q==Y]*Ea<<hl/EEEE/77777r7   i         r  zHReading more than 32 bits back from a SPI flash operation is unsupportedr  zFWriting more than 64 bytes of data with one SPI command is unsupportedr"   r,       Ic                      t          d          D ]!}                               z  dk    r d S "t          d          )Nr*   r   z$SPI command did not complete in time)r"  r  r   )r?  SPI_CMD_REGSPI_CMD_USRrh   s    r5   	wait_donez1ESPLoader.run_spiflash_command.<locals>.wait_done  sP    2YY  MM+..<BBFF CCDDDr7   )SPI_REG_BASESPI_USR_OFFSSPI_USR1_OFFSSPI_USR2_OFFSSPI_W0_OFFSr  r   r   r  r  SPI_ADDR_REG_MSBr   r   r#  ) rh   spiflash_commandr[   	read_bitsr  r  r  SPI_USR_COMMANDSPI_USR_ADDRSPI_USR_DUMMYSPI_USR_MISOSPI_USR_MOSISPI_ADDR_REGSPI_USR_REGSPI_USR2_REG
SPI_W0_REGr  SPI_USR2_COMMAND_LEN_SHIFT	data_bitsold_spi_usrold_spi_usr2r  wordsnext_regwordr  statusr  r  r  r  r  s    `    ``                    @@@@@r5   r  zESPLoader.run_spiflash_command  sV   * "  Tkd{T..d00d00D,,
 ".8 8 8 8 8 8 8 8 8 8 8"8 8 8 8 8 8 8 8 8   &("!#r>>+   t99r>>X   IIM	mmK00}}\22q==\!Eq==\!Ea<<\!Eq==]"EI...{E***1 ::>NN	
 	
 	
 a<<$ /X.NN<...>>NN:q))))$6**DM#Ta"8$??E!H  x...A{K000	E 	E 	E 	E 	E 	E 	E 		z**{K000|\222r7   c                 :    d}|                      |||dd          S )NZ   r  r"   )r  r  r  r  r  )rh   r  r  
CMD_RDSFDPs       r5   read_spiflash_sfdpzESPLoader.read_spiflash_sfdp  s/    
(()$q ) 
 
 	
r7   c                 ~    d}d}d}d}d}|||gd|         D ]$}||                      |d          |z  z  }|dz  }%|S )zRead up to 24 bits (num_bytes) of SPI flash status register contents
        via RDSR, RDSR2, RDSR3 commands

        Not all SPI flash supports all three commands. The upper 1 or 2
        bytes may be 0xFF.
        r   5      r   r"   )r  r  )rh   	num_bytesSPIFLASH_RDSRSPIFLASH_RDSR2SPIFLASH_RDSR3r  r  cmds           r5   read_statuszESPLoader.read_status  sn     !>>B1Y;O 	 	Cd//q/AAUJJFQJEEr7   c           	         d}d}d}d}d}d}	|r|n|}
|dk    r>|                      |
           |                      |t          j        d|                     |||gd	|         D ]H}|                      |
           |                      |t          j        d
|dz                       |dz  }I|                      |	           dS )a  Write up to 24 bits (num_bytes) of new status register

        num_bytes can be 1, 2 or 3.

        Not all flash supports the additional commands to write the
        second and third byte of the status register. When writing 2
        bytes, esptool also sends a 16-byte WRSR command (as some
        flash types use this instead of WRSR2.)

        If the set_non_volatile flag is set, non-volatile bits will
        be set as well as volatile ones (WREN used instead of WEVSR).

        r   1   r   P   r   r   r   z<Hr   Br  r"   N)r  r   r!  )rh   
new_statusr  set_non_volatileSPIFLASH_WRSRSPIFLASH_WRSR2SPIFLASH_WRSR3SPIFLASH_WEVSRSPIFLASH_WRENSPIFLASH_WRDI
enable_cmdr  s               r5   write_statuszESPLoader.write_status  s     &6J]]N
 >>%%j111%%mV[z5R5RSSS ">>B1Y;O 	 	C%%j111%%c6;sJ<M+N+NOOO1JJ!!-00000r7   c                 
   |                      | j                  | j        z  }| j        j        |z  dz  | j        z  }|dk    rd}n|dk    rd}nd}t          ||z
            dk    rt          j        d|d	d
| d           |S )z
        Figure out the crystal frequency from the UART clock divider

        Returns a normalized value in integer MHz (only values 40 or 26 are supported)
        r0   -   0   !   r&   r  r   zDetected crystal freq r  z+ MHz is quite different to normalized freq z! MHz. Unsupported crystal in use?)	r  UART_CLKDIV_REGUART_CLKDIV_MASKr   r   XTAL_CLK_DIVIDERabsr   rv   )rh   uart_divest_xtal	norm_xtals       r5   get_crystal_freqzESPLoader.get_crystal_freq  s     ==!5669NNJ'(2c9D<QQb==II]]IIIy8#$$q((KPR P P#,P P P  
 r7   c                     t          j        d           t                              d          }| t	          | j        |                       d S  t          | j        |                       d S )NzHard resetting via RTS pin...custom_hard_reset_sequence)r   r
  r|  rg   r   r   r	   )rh   uses_usbcfg_custom_hard_reset_sequences      r5   
hard_resetzESPLoader.hard_reset  sm    	1222),1M)N)N&)5CK
$BCCEEEEE+Idj(++-----r7   c                 L   | j         s1|rd S |                     dd           |                     d           d S |r-|                     dd           |                     d           d S | j        dk    rt	          d          |                     | j        d         d           d S )Nr   FTrO   z5Soft resetting is currently only supported on ESP8266r   rJ  )rF   r  r  rP   r   r1  r  )rh   stay_in_bootloaders     r5   
soft_resetzESPLoader.soft_reset  s    | 	R! )   A&&&!!%(((((! R   A&&&!!$'''''9,, K   T]?;5QQQQQr7   c                 h    t          j        d| j         d           |                                  d S )Nz(Watchdog hard reset is not supported on z(, attempting classic hard reset instead.)r   r  rP   r  r   s    r5   watchdog_resetzESPLoader.watchdog_reset  sF    5t~ 5 5 5	
 	
 	
 	r7   )F)rQ  )r  r   r   )r   )FTTrE   )r7   r   Nr   r   )r   )r   F)}r   r   r   __doc__rP   rF   r^   type__annotations__r   r   r  r  r   r   DEFAULT_PORTr[  r  r$  rL  r  ESP_ROM_BAUDESP_IMAGE_MAGICESP_CHECKSUM_MAGICrs  r  r  r  r  IROM_MAP_STARTIROM_MAP_ENDBOOTLOADER_FLASH_OFFSETr  r>  r  UNSUPPORTED_CHIPSWRITE_FLASH_ATTEMPTSFLASH_ENCRYPTED_WRITE_ALIGNr   dictr   EFUSE_MAX_KEYrm   r   r   propertyr   r   r   r  r   staticmethodr  r1   r1  r9  r  r@  rP  rk  ru  r  DEFAULT_CONNECT_ATTEMPTSr  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r#  r  r)  r,  r.  r0  r2  r5  r8  r:  r<  r   rC  rF  rS   rV  rQ   r\  r^  ra  rf  ri  rL   rl  rn  bytesrp  r|  r  r  r  r  r  r  r  r  r  r  rA   r7   r5   r   r      s          #IG+/J[!D(///$(dTk((( $M3:$$$ "Kt"""M3!LLt 	d 	T	
 	T 	4 	D 	 	T 	D 	$ 	d 	4 	4  	D!" 	4#$ 	$%& 	'* ""9  H@   M L O  #  ",  NL "  %  !   "$#%L$sCx.%%%M(|5 T, T, T, T,l       X  ' ' '  	F 	F 	F 	F /    \ O< O< O< O<h 1 1 1 1f@ @ @0 0 0 $
 $
 $
L4 4 4 4l  (
 (
 (
X )C! C! C! C!J   &5 
 
 
 

 
 
 
  
 
 
:
 
 
   (   @ .=    * 6E    4 #( 	
 	
 	
 	
" " " "& & & &  I I I IV  
 
 
    X X XS S S' ' '' ' '' ' ': : :      ' ' '? ? ?< < <B B BE E E: : :   [ 
 
 [
<N <N[4/ <N; <N <N <N <N| "' ' "!'R "2A    "!* "',o # # # "!# "' ' "!'& "
 
 "!
 
 
 
 
 
 
Ce C C C C% %e % % % %NY Y Y 
 
 
D E E E EN
 
 
   $$1 $1 $1 $1L  <. . . .R R R.    r7   r   c                   &    e Zd ZdZdZdZd Zd ZdS )	StubMixina  
    Mixin class bundling the stub loader-specific properties.
    Not intended for direct instantiation.
    A child class (e.g. ESP32StubLoader) uses multiple inheritance
    to combine this mixin class (StubMixin) with a parent class (e.g. ESP32ROM).
    i @  Tc                     |j         | _         |j        | _        |j        | _        |j        | _        |                                  d S rE   )r   r   r   r   r  )rh   
rom_loaders     r5   rm   zStubMixin.__init__0  sD    $.$C!%
(7%
r7   c                 4    t          | j                  }| dS )Nz.json)r   rP   )rh   rx   s     r5   r_   zStubMixin.stub_json_name7  s     #DN33	""""r7   N)r   r   r   r  r  rF   rm   r_   rA   r7   r5   r  r  %  sI          G  # # # # #r7   r  c              #   v  K   d }d}d}d}	 |                                  }|                     |dk    rdn|          }|dk    r8||rdnd	}nd
}dt          |           d  ||           t          |           |dt          |           dddt	          |                      |D ]}	t          |	g          }	||	dk    rd} |dt	          |                      |                     |                                            }
 |dt	          |
                       |||
z              t          dt          |	           d          |rd}|	dk    r|dz  }|	dk    r|dz  } |dt	          |                      |                     |                                            }
 |dt	          |
                       |||
z              t          dt          |	           d          |	dk    rd}Z|	dk    r% |dt	          |                      |V  d}d}||	z  }.)zGenerator to read SLIP packets from a serial port.
    Yields one full SLIP packet at a time, raises exception on timeout or invalid data.

    Designed to avoid too many calls to serial.read(1), which can bog
    down on slow systems.
    c           	      L   d}d}t          j        d                    d|d|dg          | t           j                  }|ed |                    d	          |                    d
          fD             }t          |          rd|d          nd}d| d}t          |          dS )a  
        Checks the input bytes for panic handler messages.
        Raises a FatalError if Guru Meditation or Fatal Exception is found, as both
        of these are used between different ROM versions.
        Tries to also parse the error cause (e.g. IllegalInstruction).
        s>   G?uru Meditation Error: (?:Core \d panic'ed \(([a-zA-Z ]*)\))?s1   F?atal exception \(\d+\): (?:([a-zA-Z ]*)?.*epc)?r7   s   (?:   |   )Nc                 b    g | ],}|d                     |                    d                    -S )Nz({})rZ  )ra  rb  )rn  ry   s     r5   rr  z=slip_reader.<locals>.detect_panic_handler.<locals>.<listcomp>X  s=       = ahhw//00 ==r7   r   r   r   r   r   zGuru Meditation Error detectedrU  )r   r   rs   r^  r_  r   r   )inputguru_meditationfatal_exceptionr[   causemsgs         r5   detect_panic_handlerz)slip_reader.<locals>.detect_panic_handlerD  s     O 	 P yIIwOPPI
 

  **Q--A7  E
 '*%jj8NaNNNbE;5;;;CS//! r7   NFTr   r   r7   z@Serial data stream stopped: Possible serial noise or corruption.zNo serial data received.z Packet content transfer stopped z
(received z bytes).zRead r   r   r   r   zRead invalid data: z!Remaining data in serial buffer: zInvalid head of packet (0xz'): Possible serial noise or corruption.      r   zInvalid SLIP escape (0xdb, 0xz).zReceived full packet: )r]  r   r   r   r  r  r   )r   trace_functionr  partial_packet	in_escapesuccessful_sliprh  ri  r  r  remaining_datas              r5   r   r   <  s"     " " ": NIO:$..""YYGqLLqqg>>
% '4VV3  9:S00::::N3S//!/s:///PPPl:6N6NPP	
 	
 	
  (	$ (	$Aqc

A%<<%(NN"N#Sj9Q9Q#S#STTT%)YYt~~/?/?%@%@N"N:'77: :   )(n)DEEE$?VAYY ? ? ?    $!	<<"g-NN'\\"g-NN"N#Sj9Q9Q#S#STTT%)YYt~~/?/?%@%@N"N:'77: :   )(n)DEEE$%RVAYY%R%R%RSSSg 		gV^8T8TVVWWW$$$$!%"&!#u:$r7   c                        e Zd ZdZddZd ZdS )r  aJ  
    Wrapper class which takes binary data in its constructor
    and returns a hex string as it's __str__ method.

    This is intended for "lazy formatting" of trace() output
    in hex format. Avoids overhead (significant on slow computers)
    of generating long hex strings even if tracing is disabled.

    Note that this doesn't save any overhead if passed as an
    argument to "%", only when passed to trace()

    If auto_split is set (default), any long line (> 16 bytes) will be
    printed as separately indented lines, with ASCII decoding at the end
    of each line.
    Tc                 "    || _         || _        d S rE   )_s_auto_split)rh   binary_string
auto_splits      r5   rm   zHexFormatter.__init__  s    %r7   c           	         | j         rt          | j                  dk    rd}| j        }t          |          dk    r|d d         }d                    d |                    dd          D                       }|dd          }|dt          |d d         d	          d
dt          |dd          d	          d
d| z  }t          |          dk    |S t          | j        d	          S )Nr   r   r   c              3   b   K   | ]*}|d k    s|t           j        v r|t           j        vr|ndV  +dS )r   rU  N)string	printable
whitespace)rn  cs     r5   	<genexpr>z'HexFormatter.__str__.<locals>.<genexpr>  se       
% 
%  HH !V%5 5 5!6CT:T:T 
 !
% 
% 
% 
% 
% 
%r7   asciir   z
    r"   Fz<16sr   z | )r  r   r  rs   rb  r   )rh   r4   sline
ascii_lines        r5   __str__zHexFormatter.__str__  s%    	*DGr 1 1FAa&&1**"vWW 
% 
% "[[)<<
% 
% 
% 
 

 bccFEVD!He44< E Ed122h..DE E8BE E a&&1**$ M$'5)))r7   Nr  )r   r   r   r  rm   r-  rA   r7   r5   r  r    sA          & & & &* * * * *r7   r  )Erd   ru  r  rb   rq   r   r$  r   r   r  configr   loggerr   resetr   r   r   r	   r
   r   utilr   r   r   r   r   r   r   r   r   r   r   ImportErrorerror
executabler  	TypeErrorserial.tools.list_portstoolsrF  VERSION	Exceptionr   r|  r?  r}  r1   rk  r  r=  rc  r  ERASE_WRITE_TIMEOUT_PER_MBr  r   getintr  r  DEFAULT_OPEN_PORT_ATTEMPTSr6   rB   rL   rQ   rS   r   r  r   r  rA   r7   r5   <module>r=     s          				 				   



  $ $ $ $ $ $                                               
MMMM 
 
 
CI	A 	A 	A 	A   

	&.((->&.-P-Pk:

 

 
	
  	 	 	D	0000000000 
 
 
CI	A&. 	A 	A+.>	A 	A 	A  
 
   
|x 

 	
	 
			Q	)n ,,y!,,\\"6<< ll=*<q*@AA||NC00\\"6:: !ll+H"MM  \\*FKK ll#8#>> "||,BBGG ::&8!<< zz"8!<<  ZZ(<a@@     *? ? ?
  *$ *$ *$ *$ *$ *$ *$ *$ZX X X X X X X Xv2# # # # # # # #.b$ b$ b$J-* -* -* -* -* -* -* -* -* -*s0   "A' ' BB) )B10B15	B? ?:C<;C<