
    :)diM                     x   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Zd dl	Z	ddl
mZmZmZ ddlmZ ddlmZ  G d	 d
ej                  Z G d dej                  Z G d dej                  Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          ZdS )    N)BitArray)log   )EfuseDefineBlocksEfuseDefineFieldsEfuseDefineRegisters   )base_fields)utilc                   ,     e Zd Zd Zd fd	Zd Z xZS )
EfuseBlockc                     dS )N     selfs    d/var/www/menimich/repos/protonApp/venv/lib/python3.11/site-packages/espefuse/efuse/esp32s2/fields.pylen_of_burn_unitzEfuseBlock.len_of_burn_unit   s	     u    Fc                 x    |                                  t                                          |||           d S )N	skip_read)read_coding_schemesuper__init__)r   parentparamr   	__class__s       r   r   zEfuseBlock.__init__   s:    !!###)<<<<<r   c                    |                      d          d d d         }t          |          |                                 k     r,|                                 t          |          z
  }|d|z  z   }|                                 | j        j        j        k    rIt          j        d          }|	                    d |D                       }t          j        d|          }n+t          j        dd	t          |          d
z  z  z   |          }|S )NF	from_read       c                     g | ]}|S r   r   ).0xs     r   
<listcomp>z2EfuseBlock.apply_coding_scheme.<locals>.<listcomp>,   s    %6%6%6Aa%6%6%6r   z<IIIIIIIIIII<I   )get_rawlenr   get_coding_schemer   REGSCODING_SCHEME_RSreedsoloRSCodecencodestructunpack)r   dataadd_empty_bytesrsencoded_datawordss         r   apply_coding_schemezEfuseBlock.apply_coding_scheme"   s    ||e|,,TTrT2t99t,,...."3355D		AO7_45D!!##t{'7'HHH !"%%B99%6%6%6%6%677LM.,??EE M#D		Q)?"@$GGEr   F)__name__
__module____qualname__r   r   r;   __classcell__r   s   @r   r   r      s[          
= = = = = =      r   r   c                   v     e Zd ZdZ	 	 	 	 d fd	Zd Zd Zd Zd Zd	 Z	d
 Z
d Zd Zd Zd ZddZd Z xZS )	EspEfuseszQ
    Wrapper object to manage the efuse fields in a connected ESP bootloader
    FNc                     t                                          ||||           t                       _        t	          |           _        t           _         j                                         _	         j        
                                 _        |j        dk    rt          j        d|j         d          s: j                                        d         }d}||z  rt          j        d           fd j        j        D              _        s                                   fd j        j        D              _         xj         fd	 j        j        D             z  c_        r( xj         fd
 j        j        D             z  c_        d S                                  dk    r& xj         fd j        j        D             z  c_         xj         fd j        j        D             z  c_        d S )NzESP32-S2z8Expected the 'esp' param for ESP32-S2 chip but got for 'z'.flagsr+   z>Secure Download Mode is enabled. The tool can not read eFuses.c                 d    g | ],}t          j                            |                     -S )r   )r   Blocksget)r&   blockr   skip_connects     r   r(   z&EspEfuses.__init__.<locals>.<listcomp>T   sF     
 
 
 tT[__U33|LLL
 
 
r   c                 F    g | ]}t                               |          S r   
EfuseFieldconvertr&   efuser   s     r   r(   z&EspEfuses.__init__.<locals>.<listcomp>Z   s)    WWW5z))$66WWWr   c                 F    g | ]}t                               |          S r   rL   rO   s     r   r(   z&EspEfuses.__init__.<locals>.<listcomp>[   s6     
 
 
05JtU++
 
 
r   c                 F    g | ]}t                               |          S r   rL   rO   s     r   r(   z&EspEfuses.__init__.<locals>.<listcomp>_   s9        ""4//  r   r   c                 F    g | ]}t                               |          S r   rL   rO   s     r   r(   z&EspEfuses.__init__.<locals>.<listcomp>e   9           &&tU33     r   c                 F    g | ]}t                               |          S r   rL   rO   s     r   r(   z&EspEfuses.__init__.<locals>.<listcomp>i   s6       49
""4//  r   )r   r   r   rG   r   Fieldsr   r/   get_burn_block_data_namesBURN_BLOCK_DATA_NAMESget_blocks_for_keysBLOCKS_FOR_KEYS	CHIP_NAMEesptool
FatalError_espget_security_infoBLOCKSblocksget_coding_scheme_warningsEFUSESefuses	KEYBLOCKSBLOCK2_CALIBRATION_EFUSESget_block_versionCALC)	r   esprJ   debugdo_not_confirmextend_efuse_tablerE   -GET_SECURITY_INFO_FLAG_SECURE_DOWNLOAD_ENABLEr   s	   ` `     r   r   zEspEfuses.__init__;   s    	lE>CUVVV'))'(:;;(	%)[%J%J%L%L"#{>>@@=J&&$\3=\\\    	I//11':E<B9DD (T  
 
 
 
 
+
 
 
  	.++---WWWWDKDVWWW 
 
 
 
9=9N
 
 
 	
  	KK    ![B   KKKK
 %%''1,,        !%!F       KK    =A[=M   KKKKr   c                      j         D ]1}|j        k    s t          fd|j        D                       r|c S 2d} j        j        D ]U}|j        k    s t          fd|j        D                       r( xj          fd j        j        D             z  c_         d}V|r9 j         D ]1}|j        k    s t          fd|j        D                       r|c S 2t          )z*Return the efuse field with the given namec              3   $   K   | ]
}|k    V  d S Nr   r&   r'   
efuse_names     r   	<genexpr>z(EspEfuses.__getitem__.<locals>.<genexpr>p   s'      *P*Pq1
?*P*P*P*P*P*Pr   Fc              3   $   K   | ]
}|k    V  d S rp   r   rq   s     r   rs   z(EspEfuses.__getitem__.<locals>.<genexpr>t   s8       / /$%Z/ / / / / /r   c                 F    g | ]}t                               |          S r   rL   rO   s     r   r(   z)EspEfuses.__getitem__.<locals>.<listcomp>w   rT   r   Tc              3   $   K   | ]
}|k    V  d S rp   r   rq   s     r   rs   z(EspEfuses.__getitem__.<locals>.<genexpr>~   s'      .T.T1qJ.T.T.T.T.T.Tr   )rd   nameany	alt_namesrV   rf   KeyError)r   rr   e
new_fieldsrP   s   ``   r   __getitem__zEspEfuses.__getitem__m   sS    	 	AQV##s*P*P*P*PAK*P*P*P'P'P# $
[: 	" 	"EzZ''3 / / / /)./ / / , ,'         !%!F       "
 	[  ''3.T.T.T.T.T.T.T+T+T'HHH (r   c                 (    | j         j        | _        d S rp   )r/   r0   coding_schemer   s    r   r   zEspEfuses.read_coding_scheme   s    !Y7r   c                    t          j        d           | j        d                             | j        d         j        dd           t          j        d                    d|                     | j        j                                       t          j        d                    d|                     | j        j	                                       d S )	N r   	err__regsT)rj   z{:27} 0x{:08x}EFUSE_RD_RS_ERR0_REGEFUSE_RD_RS_ERR1_REG)
r   printra   print_blockerr_bitarrayformatread_regr/   r   r   r   s    r   print_status_regszEspEfuses.print_status_regs   s    	"A""4;q>#>SW"XXX	##&di6T(U(U 	
 	
 	

 		##&di6T(U(U 	
 	
 	
 	
 	
r   c                 ~    |                                   |                                  |                                  d S rp   )set_efuse_timingclear_pgm_registerswait_efuse_idler   s    r   efuse_controller_setupz EspEfuses.efuse_controller_setup   s>      """r   c                 X    |                      |           |                     d          S )NT)silent)efuse_programrb   r   rI   s     r   write_efuseszEspEfuses.write_efuses   s-    5!!!..d.;;;r   c                     |                                   t          | j        j        | j        j        dz   d          D ]}|                     |d           d S )Nr   r+   r   )r   ranger/   EFUSE_PGM_DATA0_REG	write_reg)r   rs     r   r   zEspEfuses.clear_pgm_registers   sf    I)49+H2+Mq
 
 	! 	!A NN1a    	! 	!r   c                    t          j                     | j        j        z   }t          j                     |k     r~| j        j        | j        j        z  }|                     | j        j                  |z  dk    r(|                     | j        j                  |z  dk    rd S t          j                     |k     ~t          j        d          )Nr   z:Timed out waiting for eFuse controller command to complete)	timer/   EFUSE_BURN_TIMEOUTEFUSE_PGM_CMDEFUSE_READ_CMDr   EFUSE_CMD_REGr\   r]   )r   deadlinecmdss      r   r   zEspEfuses.wait_efuse_idle   s    9;;!==ikkH$$9*TY-EED}}TY455<AA==!899D@AEE F ikkH$$  H
 
 	
r   c                 Z   |                                   |                     | j        j        | j        j                   |                     | j        j        | j        j        |dz  z             |                                   |                                  |                                  d S )Nr	   )	r   r   r/   EFUSE_CONF_REGEFUSE_WRITE_OP_CODEr   r   r   
efuse_readr   s     r   r   zEspEfuses.efuse_program   s    ty/1NOOOty.	0G5TU:0VWWW  """r   c                 \   |                                   |                     | j        j        | j        j                   	 |                     | j        j        | j        j        d           |                                   d S # t          j        $ r | j	        j
        }	 |                     | j	                  | _	        n# t          j        $ r t          j        d           | d                                         sl| d                             d          rPt          j        d           t          j        d           t          j        d	           t          j        d
            w xY wt          j        d           | j	        j
        r|st          j        d           | d                                         sl| d                             d          rPt          j        d           t          j        d           t          j        d	           t          j        d
            w xY w)Ni  )delay_after_uszCan not re-connect to the chip.DIS_DOWNLOAD_MODEFr    ztThis is the correct behavior as we are actually burning DIS_DOWNLOAD_MODE which disables the connection to the chip.zDIS_DOWNLOAD_MODE is enabled.zSuccessful.r   z'Established a connection with the chip.z Secure download mode is enabled.ENABLE_SECURITY_DOWNLOADz:espefuse can not continue to work in Secure download mode.z$ENABLE_SECURITY_DOWNLOAD is enabled.)r   r   r/   r   EFUSE_READ_OP_CODEr   r   r\   r]   r^   secure_download_modereconnect_chipr   r   rH   sysexit)r   secure_download_mode_befores     r   r   zEspEfuses.efuse_read   s9   ty/1MNNN$	NN	')ARV       """""! 	 	 	*.)*H' //	::		%   	;<<</04466 	 4'<##&&	  IW   I=>>>Im,,,HQKKK I?@@@y- 
 6Q 
 	<===67;;==  $.C##&&  IT   IDEEEIm,,,HQKKK?	s'    A B H+B?>H+?B+E**CH+c                    |                                  }| j        j        |         \  }}}}|                     | j        j        | j        j        |           |                     | j        j        | j        j        |           |                     | j        j        | j        j        |           |                     | j        j        | j        j	        |           | j        j
        |         \  }}}|                     | j        j        | j        j        |           |                     | j        j        | j        j        |           |                     | j        j        | j        j        |           | j        j        |         \  }	}
}|                     | j        j        | j        j        |
           |                     | j        j        | j        j        |           dS )z'Set timing registers for burning efusesN)get_crystal_freqr/   #EFUSE_PROGRAMMING_TIMING_PARAMETERS
update_regEFUSE_WR_TIM_CONF1_REGEFUSE_TSUP_A_MEFUSE_WR_TIM_CONF0_REGEFUSE_TPGM_MEFUSE_THP_A_MEFUSE_TPGM_INACTIVE_MVDDQ_TIMING_PARAMETERSEFUSE_DAC_CONF_REGEFUSE_DAC_CLK_DIV_MEFUSE_PWR_ON_NUM_MEFUSE_WR_TIM_CONF2_REGEFUSE_PWR_OFF_NUM_MEFUSE_READING_PARAMETERSEFUSE_RD_TIM_CONF_REGEFUSE_TRD_MEFUSE_THR_A_M)r   apb_freqEFUSE_TSUP_A
EFUSE_TPGMEFUSE_THP_AEFUSE_TPGM_INACTIVEEFUSE_DAC_CLK_DIVEFUSE_PWR_ON_NUMEFUSE_PWR_OFF_NUMEFUSE_TSUR_A	EFUSE_TRDEFUSE_THR_As               r   r   zEspEfuses.set_efuse_timing   s    ((** I9(C	
I,di.F	
 	
 	
 	I,di.Dj	
 	
 	
 	I,di.E{	
 	
 	
 	I,I+	
 	
 	
 I,X6		
I(I)	
 	
 	

 	I,I(	
 	
 	

 	I,I)	
 	
 	
 04y/Q0
,i 	I+TY-BI	
 	
 	
 	I+TY-Dk	
 	
 	
 	
 	
r   c           
          d}d}d} j         D ]F}|j        dk    r fdt          d          D             }d|j        _        t          |          D ],}|j                            t          d|                      -|j                            d          |_	        |j	        dk    |_
        n^ j        j        |j                 \  }}	}
}|	|
|||k    r|}                     |          }|d|z  z  dk    |_
        ||
z	  |	z  |_	        ||j
        z  }|s;|j
        s|j	        r-t          j        d	|j         d
|j	         d|j
         d           H j        s|r|s                                  |S )z3Check if the coding scheme has detected any errors.r   Fc                 Z    g | ]'}                     j        j        |d z  z             (S )r+   )r   r/   EFUSE_RD_REPEAT_ERR0_REG)r&   offsr   s     r   r(   z8EspEfuses.get_coding_scheme_warnings.<locals>.<listcomp>'  sC        MM$)"Dtax"OPP  r      zuint:32=TNr   zError(s) in BLOCKz	 [ERRORS: FAIL:z].)ra   idr   r   posreversed	overwriter   count
num_errorsfailr/   BLOCK_ERRORSr   r   r   rj   r   )r   r   old_addr_reg	reg_valueret_failrI   r:   wordaddr_regerr_num_maskerr_num_offsfail_bits   `           r   rb   z$EspEfuses.get_coding_scheme_warnings   s   	[ 	 	Ex1}}    %a   *+"&$UOO N ND&00:KT:K:K1L1LMMMM#(#5#;#;D#A#A "-2

AEAWHB>,h  '<+?8CS|++#+L $h 7 7I&!x-8A=
$-$=#M 
"H uz U-= 	F F F$/F F7<zF F F   J 	%( 	%F 	%""$$$r   c                     | d                                          dk    rd}|dz  }|dz  }|dz  }|dz  }nD| d                                          dk    rd	}n#| d
                                          dk    rd}nd}|S )NVDD_SPI_FORCEr   z6Flash voltage (VDD_SPI) determined by GPIO45 on reset z<(GPIO45=High: VDD_SPI pin is powered from internal 1.8V LDO
z7GPIO45=Low or NC: VDD_SPI pin is powered directly from z!VDD3P3_RTC_IO via resistor Rspi. z!Typically this voltage is 3.3 V).VDD_SPI_XPDz=Flash voltage (VDD_SPI) internal regulator disabled by efuse.VDD_SPI_TIEHz-Flash voltage (VDD_SPI) set to 1.8V by efuse.z-Flash voltage (VDD_SPI) set to 3.3V by efuse.)rH   )r   outputs     r   summaryzEspEfuses.summaryE  s     $$&&!++MFUUFOOF99F99FF- $$&&!++TFF.!%%''1,,DFFDFr   )FFFNr<   )r=   r>   r?   __doc__r   r}   r   r   r   r   r   r   r   r   r   rb   r   r@   rA   s   @r   rC   rC   6   s         0 0 0 0 0 0d  *8 8 8
 
 
  
< < <! ! !
 
 
  * * *X9
 9
 9
v# # # #J      r   rC   c                   $    e Zd Zed             ZdS )rM   c                     	 t          t          t          t          t          d                    |j        t                    | |          S )N)mac
keypurposet_sensoradc_tpwafer)EfuseMacFieldEfuseKeyPurposeFieldEfuseTempSensorEfuseAdcPointCalibration
EfuseWaferrH   
class_typerM   )r   rP   s     r   rN   zEfuseField.convertV  sG    , .'.
 
 #e

+
+FE; ; 	;r   N)r=   r>   r?   staticmethodrN   r   r   r   rM   rM   U  s-        ; ; \; ; ;r   rM   c                       e Zd ZddZd ZdS )r   Tc                     | j         d                             |          }| j         d         j        dk    sJ | j         d                             |          }| j         d         j        dk    sJ |dz  |z   S )NWAFER_VERSION_MINOR_HIr   WAFER_VERSION_MINOR_LO   )r   rH   bit_len)r   r!   hi_bitslo_bitss       r   rH   zEfuseWafer.getb  s    +67;;IFF{34<AAAA+67;;IFF{34<AAAA1''r   c                 <    t          j        d| j         d          )NzBurning z is not supported)r\   r]   rw   )r   	new_values     r   savezEfuseWafer.savei  s!     !HDI!H!H!HIIIr   NT)r=   r>   r?   rH   r  r   r   r   r   r   a  s<        ( ( ( (J J J J Jr   r   c                       e Zd ZddZdS )r   Tc                 n    |                      |          }|d         rdnd}||dd          j        z  dz  S )Nr   r"   r   g?get_bitstringuint)r   r!   valuesigs       r   rH   zEfuseTempSensor.getn  sA    ""9--!H#bb!U122Y^#c))r   Nr  r=   r>   r?   rH   r   r   r   r   r   m  s(        * * * * * *r   r   c                       e Zd ZddZdS )r   Tc                 r    d}|                      |          }|d         rdnd}||dd          j        z  |z  S )Nr+   r   r"   r   r  )r   r!   	STEP_SIZEr  r  s        r   rH   zEfuseAdcPointCalibration.getu  sF    	""9--!H#bb!U122Y^#i//r   Nr  r  r   r   r   r   r   t  s(        0 0 0 0 0 0r   r   c                   2     e Zd Zd Zd ZddZ fdZ xZS )r   c                    |t          j        d          |                    d          dk    rt          j        d          |                    dd          }t	          |          dk    rt          j        d          t          j        |          }t           j                            |d          d	z  rt          j        d
          |S )Nz1Required MAC Address in AA:CD:EF:01:02:03 format!:r   zLMAC Address needs to be a 6-byte hexadecimal format separated by colons (:)!r   r$   zPMAC Address needs to be a 6-byte hexadecimal number (12 hexadecimal characters)!r   r   z!Custom MAC must be a unicast MAC!)	r\   r]   r   replacer-   binascii	unhexlifyr   byte)r   new_value_strhexadbindatas       r   check_formatzEfuseMacField.check_format}  s     $C   s##q(($+   %%c2..u::$/  
 $U++ <Wa((4/ 	J$%HIIIr   c                     | j                             | j                  \  }}|dk    s|rd| j         d| d| d}nd}d|z   dz   S )	Nr   Blockz has ERRORS:r   .OK())r   get_block_errorsrI   )r   errsr   r   s       r   checkzEfuseMacField.check  sb    [11$*==
d1999HTZHHTHHHHHFFFV|c!!r   Tc                     | j         dk    r|                     |          d d d         }n|                     |          }d                    t          j        |d          |                                 g          S )N
CUSTOM_MACr"    r  )rw   r,   joinr   hexifyr$  )r   r!   r   s      r   rH   zEfuseMacField.get  si    9$$,,y))$$B$/CC,,y))CxxS#..

=>>>r   c                     d }| j         dk    rD|                     |          } || |           t                                          |           d S t	          j        d          )Nc           
      ~    t          j        d| j         d| j         d|                                  d|            d S )Nz    - 'z' (z) z -> )r   r   rw   descriptionr	  )r{   r  s     r   print_fieldz'EfuseMacField.save.<locals>.print_field  sQ    IX!&XXQ]XXaoo6G6GXXYXX    r   r&  z,Writing Factory MAC address is not supported)rw   convert_to_bitstringr   r  r\   r]   )r   r  r-  bitarray_macr   s       r   r  zEfuseMacField.save  sv    	 	 	
 9$$44Y??LKl+++GGLL##### $%STTTr   r  )r=   r>   r?   r  r$  rH   r  r@   rA   s   @r   r   r   |  ss          0" " "? ? ? ?U U U U U U U U Ur   r   c                   p     e Zd Zg dZd eD             Zd eD             Zd Zd Zd Zd
dZ	 fd	Z
 xZS )r   ))USERr   NNno_need_rd_protect)RESERVEDr   NNr2  )XTS_AES_256_KEY_1r	   NReverseneed_rd_protect)XTS_AES_256_KEY_2r   Nr5  r6  )XTS_AES_128_KEYr+   Nr5  r6  )HMAC_DOWN_ALLr   NNr6  )HMAC_DOWN_JTAG   NNr6  )HMAC_DOWN_DIGITAL_SIGNATURE   NNr6  )HMAC_UP   NNr6  )SECURE_BOOT_DIGEST0	   DIGESTNr2  )SECURE_BOOT_DIGEST1
   rB  Nr2  )SECURE_BOOT_DIGEST2   rB  Nr2  )XTS_AES_256_KEYr"   VIRTUALNr2  c                     g | ]
}|d          S )r   r   r&   rw   s     r   r(   zEfuseKeyPurposeField.<listcomp>  s    :::Ta:::r   c                 6    g | ]}|d          dk    |d         S )r	   rB  r   r   rJ  s     r   r(   zEfuseKeyPurposeField.<listcomp>  s*    SSSttAw(?R?R47?R?R?Rr   c                 .   |}| j         D ]%}|d         |k    rt          |d                   } n&|                                r9t          |          d | j         D             vrt	          j        d| d          nt	          j        d| d          |S )Nr   r   c                 6    g | ]}|d          dk    |d          S )r   r   r   )r&   ps     r   r(   z5EfuseKeyPurposeField.check_format.<locals>.<listcomp>  s%    #P#P#PQqtaxxAaDxxxr   'z%' can not be set (value out of range)z' unknown name)KEY_PURPOSESstrisdigitintr\   r]   )r   r  raw_valpurpose_names       r   r  z!EfuseKeyPurposeField.check_format  s       - 	 	LA-//l1o.. 0 ?? 	B7||#P#P$2C#P#P#PPP()[W)[)[)[\\\ Q $%@%@%@%@AAAr   c                 N    | j         D ]}|d         |k    r|d         dk    c S d S )Nr   r   r5  rP  r   new_key_purposekeys      r   need_reversez!EfuseKeyPurposeField.need_reverse  sG    $ 	+ 	+C1v((1v**** )	+ 	+r   c                 N    | j         D ]}|d         |k    r|d         dk    c S d S )Nr   r+   r6  rW  rX  s      r   r6  z$EfuseKeyPurposeField.need_rd_protect  sH    $ 	3 	3C1v((1v!22222 )	3 	3r   Tc                 l    | j         D ]+}|d         |                     |          k    r
|d         c S ,dS )Nr   r   FORBIDDEN_STATE)rP  r,   )r   r!   rN  s      r   rH   zEfuseKeyPurposeField.get  sG    " 	 	Att||I....t /  r   c                     t          |                     t          |                              }t                                          |          S rp   )rS  r  rQ  r   r  )r   r  rT  r   s      r   r  zEfuseKeyPurposeField.save  s:    d''I7788ww||G$$$r   r  )r=   r>   r?   rP  KEY_PURPOSES_NAMEDIGEST_KEY_PURPOSESr  r[  r6  rH   r  r@   rA   s   @r   r   r     s          L" ;:\:::SS|SSS  + + +
3 3 3
! ! ! !% % % % % % % % %r   r   )r  r4   r   r   	bitstringr   esptool.loggerr   r\   r1   mem_definitionr   r   r   r   r
   r   EfuseBlockBaser   EspEfusesBaserC   EfuseFieldBaserM   r   r   r   r   r   r   r   r   <module>rh     s      



                V V V V V V V V V V                +   <\ \ \ \ \) \ \ \~	; 	; 	; 	; 	;+ 	; 	; 	;	J 	J 	J 	J 	J 	J 	J 	J* * * * *j * * *0 0 0 0 0z 0 0 05U 5U 5U 5U 5UJ 5U 5U 5Ur6% 6% 6% 6% 6%: 6% 6% 6% 6% 6%r   