
    :)diF                     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Zd dlm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/esp32c3/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-C3z8Expected the 'esp' param for ESP32-C3 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   d   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
 %%''3..        !%!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 rq   r   rr   s     r   rt   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   rU   r   Tc              3   $   K   | ]
}|k    V  d S rq   r   rr   s     r   rt   z(EspEfuses.__getitem__.<locals>.<genexpr>~   s'      .T.T1qJ.T.T.T.T.T.Tr   )re   nameany	alt_namesrW   rg   KeyError)r   rs   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 rq   )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)rk   z{:27} 0x{:08x}EFUSE_RD_RS_ERR0_REGEFUSE_RD_RS_ERR1_REG)
r   printrb   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 rq   )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_programrc   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$$  I
 
 	
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                    |                                  }|dk    rt          j        d| d          |                     | j        j        | j        j        d           |                     | j        j        | j        j        d           |                     | j        j        | j        j	        d           |                     | j        j
        | j        j        d           dS )z'Set timing registers for burning efuses(   z+The eFuse supports only xtal=40M (xtal was z).   i 0  i  N)get_crystal_freqr]   r^   
update_regr/   EFUSE_DAC_CONF_REGEFUSE_DAC_NUM_MEFUSE_DAC_CLK_DIV_MEFUSE_WR_TIM_CONF1_REGEFUSE_PWR_ON_NUM_MEFUSE_WR_TIM_CONF2_REGEFUSE_PWR_OFF_NUM_M)r   apb_freqs     r   r   zEspEfuses.set_efuse_timing   s     ((**r>>$JhJJJ   		4di6OQUVVVI($)*G	
 	
 	
 	I,di.JF	
 	
 	
 	I,di.KU	
 	
 	
 	
 	
r   c           
      J    d} j         D ]w}|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                 \  }}|d|_
        n$                     |          d|z  z  dk    |_
         j        j        |j                 \  }}	}
|	|
d|_	        n                      |          |
z	  |	z  |_	        ||j
        z  }|s;|j
        s|j	        r-t          j        d	|j         d
|j	         d|j
         d           y j        s|r|s                                  |S )z3Check if the coding scheme has detected any errors.Fr   c                 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].)rb   idr   r   posreversed	overwriter   count
num_errorsfailr/   BLOCK_FAIL_BITr   BLOCK_NUM_ERRORSr   r   rk   r   )r   r   ret_failrI   r:   word
addr_reg_ffail_bit
addr_reg_nnum_masknum_offss   `          r   rc   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

'+y'?'I$
H#!&EJJ!%z!:!:a8m!LPQ!QEJ151KEH1U.
Hh#x'7'(E$$ j11X= (!E$ 
"H uz U-= 	F F F$/F F7<zF F F   J 	%( 	%F 	%""$$$r   c                     dS )Nr   r   r   s    r   summaryzEspEfuses.summary   s    rr   )FFFNr<   )r=   r>   r?   __doc__r   r~   r   r   r   r   r   r   r   r   r   rc   r   r@   rA   s   @r   rC   rC   6   s         0 0 0 0 0 0d  *8 8 8
 
 
  
< < <! ! !
 
 
  * * *X
 
 
(% % % %N      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.convert&  sG    , .'.
 
 #e

+
+FE; ; 	;r   N)r=   r>   r?   staticmethodrN   r   r   r   rM   rM   %  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.get2  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^   rx   )r   	new_values     r   savezEfuseWafer.save9  s!     !IDI!I!I!IJJJr   NT)r=   r>   r?   rH   r   r   r   r   r   r   1  s<        ( ( ( (K K K K K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.get>  sA    ""9--!H#bb!U122Y^#c))r   Nr   r=   r>   r?   rH   r   r   r   r   r   =  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.getE  sF    	""9--!H#bb!U122Y^#i//r   Nr   r   r   r   r   r   r   D  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_formatM  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   outputs       r   checkzEfuseMacField.checke  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   )rx   r,   joinr   hexifyr  )r   r!   r   s      r   rH   zEfuseMacField.getm  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   rx   descriptionr   )r|   r   s     r   print_fieldz'EfuseMacField.save.<locals>.print_fieldu  sQ    IX!&XXQ]XXaoo6G6GXXYXX    r   r  z,Writing Factory MAC address is not supported)rx   convert_to_bitstringr   r   r]   r^   )r   r   r  bitarray_macr   s       r   r   zEfuseMacField.savet  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   L  ss          0" " "? ? ? ?U U U U U U U U Ur   r   c                   v     e Zd Zg dZd eD             Zd eD             Zd Zd Zd ZddZ	d	 Z
 fd
Z xZS )r   )
)USERr   NNno_need_rd_protect)RESERVEDr   NNr  )XTS_AES_128_KEYr+   NReverseneed_rd_protect)HMAC_DOWN_ALLr   NNr"  )HMAC_DOWN_JTAG   NNr"  )HMAC_DOWN_DIGITAL_SIGNATURE   NNr"  )HMAC_UP   NNr"  )SECURE_BOOT_DIGEST0	   DIGESTNr  )SECURE_BOOT_DIGEST1
   r,  Nr  )SECURE_BOOT_DIGEST2   r,  Nr  c                     g | ]
}|d          S )r   r   r&   rx   s     r   r(   zEfuseKeyPurposeField.<listcomp>  s    :::Ta:::r   c                 6    g | ]}|d          dk    |d         S )r	   r,  r   r   r2  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   r!  r8  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+   r"  r?  r@  s      r   r"  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)r8  r,   )r   r!   r6  s      r   rH   zEfuseKeyPurposeField.get  sG    " 	 	Att||I....t /  r   c                 F    | j         D ]}|d         |k    r
|d         c S d S )Nr   r   r?  )r   r<  rB  s      r   get_namezEfuseKeyPurposeField.get_name  s?    $ 	 	C1v  1v !	 	r   c                 L   t          |                     t          |                              }|                     |          }| j        dk    r4|                    d          rt          j        | j         d| d          t                      	                    |          S )NKEY_PURPOSE_5XTS_AESz can not have z< key due to a hardware bug (please see TRM for more details))
r;  r  r9  rH  rx   
startswithr]   r^   r   r   )r   r   r<  str_new_valuer   s       r   r   zEfuseKeyPurposeField.save  s    d''I7788g..9''M,D,DY,O,O'$	  &M  &M  &M  &M  &M  N  N  Nww||G$$$r   r   )r=   r>   r?   r8  KEY_PURPOSES_NAMEDIGEST_KEY_PURPOSESr  rC  r"  rH   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   r]   esptool.loggerr   r1   mem_definitionr   r   r   r   r
   r   EfuseBlockBaser   EspEfusesBaserC   EfuseFieldBaserM   r   r   r   r   r   r   r   r   <module>rV     s      



                V V V V V V V V V V                +   <l l l l l) l l l^	; 	; 	; 	; 	;+ 	; 	; 	;	K 	K 	K 	K 	K 	K 	K 	K* * * * *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;% ;% ;% ;% ;%: ;% ;% ;% ;% ;%r   