
    :)dirL                     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/esp32p4/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                       _        rdn|                                }|dk    rdnd }t          j        d|j         d|dz  dd           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 )Ni,  zesp32p4_v3.0zLoading eFuses for z vd   z.1fz...)revisionzESP32-P4z8Expected the 'esp' param for ESP32-P4 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>W   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>]   s)    WWW5z))$66WWWr   c                 F    g | ]}t                               |          S r   rN   rQ   s     r   r(   z&EspEfuses.__init__.<locals>.<listcomp>^   s6     
 
 
05JtU++
 
 
r   c                 F    g | ]}t                               |          S r   rN   rQ   s     r   r(   z&EspEfuses.__init__.<locals>.<listcomp>b   s9        ""4//  r   r   c                 F    g | ]}t                               |          S r   rN   rQ   s     r   r(   z&EspEfuses.__init__.<locals>.<listcomp>h   9           &&tU33     r   c                 F    g | ]}t                               |          S r   rN   rQ   s     r   r(   z&EspEfuses.__init__.<locals>.<listcomp>l   s6       49
""4//  r   )r   r   r   rI   get_chip_revisionr   print	CHIP_NAMEr   Fieldsr   r/   get_burn_block_data_namesBURN_BLOCK_DATA_NAMESget_blocks_for_keysBLOCKS_FOR_KEYSesptool
FatalError_espget_security_infoBLOCKSblocksget_coding_scheme_warningsEFUSESefuses	KEYBLOCKSBLOCK2_CALIBRATION_EFUSESget_block_versionCALC)r   esprL   debugdo_not_confirmextend_efuse_tablechip_revisionrevision_filerG   -GET_SECURITY_INFO_FLAG_SECURE_DOWNLOAD_ENABLEr   s   ` `       r   r   zEspEfuses.__init__;   s    	lE>CUVVV'))+H1F1F1H1H*73*>*>D	UUU9LUUUUVVV'(:]SSS(	%)[%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>s   s'      *P*Pq1
?*P*P*P*P*P*Pr   Fc              3   $   K   | ]
}|k    V  d S rv   r   rw   s     r   ry   z(EspEfuses.__getitem__.<locals>.<genexpr>w   s8       / /$%Z/ / / / / /r   c                 F    g | ]}t                               |          S r   rN   rQ   s     r   r(   z)EspEfuses.__getitem__.<locals>.<listcomp>z   rV   r   Tc              3   $   K   | ]
}|k    V  d S rv   r   rw   s     r   ry   z(EspEfuses.__getitem__.<locals>.<genexpr>   s'      .T.T1qJ.T.T.T.T.T.Tr   )rh   nameany	alt_namesr[   rj   KeyError)r   rx   e
new_fieldsrR   s   ``   r   __getitem__zEspEfuses.__getitem__p   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 rv   )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)rn   z{:27} 0x{:08x}EFUSE_RD_RS_ERR0_REGEFUSE_RD_RS_ERR1_REG)
r   rY   re   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 rv   )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_programrf   r   rK   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`   ra   )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`   ra   rb   secure_download_modereconnect_chipr   rY   rJ   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                 h    |                                  }|dk    rt          j        d|           dS )z'Set timing registers for burning efuses(   z+The eFuse supports only xtal=40M (xtal was N)get_crystal_freqr`   ra   )r   apb_freqs     r   r   zEspEfuses.set_efuse_timing   sE     ((**r>>$HhHH   >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].)re   idr   r   posreversed	overwriter   count
num_errorsfailr/   BLOCK_ERRORSr   r   rY   rn   r   )r   r   old_addr_reg	reg_valueret_failrK   r:   wordaddr_regerr_num_maskerr_num_offsfail_bits   `           r   rf   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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   rf   r   r@   rA   s   @r   rC   rC   6   s         3 3 3 3 3 3j  *8 8 8
 
 
  
< < <! ! !
 
 
  * * *X  # # # #J      r   rC   c                   $    e Zd Zed             ZdS )rO   c                     	 t          t          t          t          t          d                    |j        t                    | |          S )N)mac
keypurposet_sensoradc_tpwafer)EfuseMacFieldEfuseKeyPurposeFieldEfuseTempSensorEfuseAdcPointCalibration
EfuseWaferrJ   
class_typerO   )r   rR   s     r   rP   zEfuseField.convert  sG    , .'.
 
 #e

+
+FE; ; 	;r   N)r=   r>   r?   staticmethodrP   r   r   r   rO   rO     s-        ; ; \; ; ;r   rO   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_MAJOR_HIr   WAFER_VERSION_MAJOR_LOr	   )r   rJ   bit_len)r   r!   hi_bitslo_bitss       r   rJ   zEfuseWafer.get)  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          )NBurning z is not supported)r`   ra   r}   )r   	new_values     r   savezEfuseWafer.save0  s!     !HDI!H!H!HIIIr   NT)r=   r>   r?   rJ   r   r   r   r   r   r   (  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   rJ   zEfuseTempSensor.get5  sA    ""9--!H#bb!U122Y^#c))r   Nr   r=   r>   r?   rJ   r   r   r   r   r   4  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   rJ   zEfuseAdcPointCalibration.get<  sF    	""9--!H#bb!U122Y^#i//r   Nr   r   r   r   r   r   r   ;  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          | j        dk    rdnd}|                    d          |dz
  k    rt          j        d| d          |                    dd	                              d
d          d         }|                                 r|                    d
d          d         n|}t          |          |dz  k    rt          j        d| d|dz   d          t          j	        |          }|                                 s7t           j
                            |d          dz  rt          j        d          |S )Nz1Required MAC Address in AA:CD:EF:01:02:03 format!	MAC_EUI64      :r   zMAC Address needs to be a z1-byte hexadecimal format separated by colons (:)!r    r   r	   z-byte hexadecimal number (z hexadecimal characters)!z!Custom MAC must be a unicast MAC!)r`   ra   r}   r   replacesplitis_field_calculatedr-   binascii	unhexlifyr   byte)r   new_value_str	num_byteshexadbindatas        r   check_formatzEfuseMacField.check_formatD  s    $C   k11AAq	s##y1}44$+Y + + +   %%c2..44S!<<Q?*.*B*B*D*DOC##A&&%u::Q&&$=Y = =M= = =  
 $U++'')) 	N |  !,,t3 N()LMMM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_errorsrK   )r   errsr   outputs       r   checkzEfuseMacField.check`  sb    [11$*==
d1999HTZHHTHHHHHFFFV|c!!r   Tc                 0   | j         dk    r|                     |          d d d         }n| j         dk    r|                     |          }n| j         dk    rp| j        d                             |                                          }| j        d                             |          }|                    |d           |j        }n|                     |          }d                    t          j	        |d          | 
                                g          S )	N
CUSTOM_MACr"   MACr   MAC_EXT   r   r   )r}   r,   r   r   copyinsertbytesjoinr   hexifyr  )r   r!   r   mac_exts       r   rJ   zEfuseMacField.geth  s    9$$,,y))$$B$/CCY%,,y))CCY+%%+e$229==BBDDCk),::9EEGJJw###)CC,,y))CxxS#..

=>>>r   c                     d }| j         dk    rD|                     |          } || |           t                                          |           d S t	          j        d| j          d          )Nc           
      ~    t          j        d| j         d| j         d|                                  d|            d S )Nz    - 'z' (z) z -> )r   rY   r}   descriptionr   )r   r   s     r   print_fieldz'EfuseMacField.save.<locals>.print_fieldw  sQ    IX!&XXQ]XXaoo6G6GXXYXX    r   r  r   z is not supported.)r}   convert_to_bitstringr   r   r`   ra   )r   r   r!  bitarray_macr   s       r   r   zEfuseMacField.savev  s    	 	 	
 9$$44Y??LKl+++GGLL##### $%M	%M%M%MNNNr   r   )r=   r>   r?   r  r  rJ   r   r@   rA   s   @r   r   r   C  ss          8" " "? ? ? ?O O O O O O O O Or   r   c                       e Zd ZU dZeeeedz  edz  ef         Zg dZe	e         e
d<   g Ze	e         e
d<    eddez            D ]JZed eD             vr:e                    d	e eddd
f           e                    de eddd
f           Ke                    ddez  dz
  ddd
f           e                    ddez  dz
  ddd
f           eez  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   r+   N))USERr   NNno_need_rd_protect)	ECDSA_KEYr   NReverseneed_rd_protect)XTS_AES_256_KEY_1r	   Nr(  r)  )XTS_AES_256_KEY_2   Nr(  r)  )XTS_AES_128_KEYr+   Nr(  r)  )HMAC_DOWN_ALLr   NNr)  )HMAC_DOWN_JTAGr   NNr)  )HMAC_DOWN_DIGITAL_SIGNATURE   NNr)  )HMAC_UPr   NNr)  )SECURE_BOOT_DIGEST0	   DIGESTNr&  )SECURE_BOOT_DIGEST1
   r5  Nr&  )SECURE_BOOT_DIGEST2   r5  Nr&  )KM_INIT_KEYr$   NNr)  )XTS_AES_256_KEYr"   VIRTUALNr&  KEY_PURPOSESCUSTOM_KEY_PURPOSESr   r   c                     g | ]
}|d          S )r   r   r&   ps     r   r(   zEfuseKeyPurposeField.<listcomp>  s    111qad111r   CUSTOM_r&  CUSTOM_DIGEST_r5  
CUSTOM_MAXCUSTOM_DIGEST_MAXc                     g | ]
}|d          S )r   r   r&   r}   s     r   r(   zEfuseKeyPurposeField.<listcomp>  s    :::Ta:::r   c                 6    g | ]}|d          dk    |d         S )r	   r5  r   r   rG  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@  s     r   r(   z5EfuseKeyPurposeField.check_format.<locals>.<listcomp>  s%    #P#P#PQqtaxxAaDxxxr   'z&' can not be set (value out of range).z' unknown name.)r=  strisdigitintr`   ra   )r   r  raw_valpurpose_names       r   r  z!EfuseKeyPurposeField.check_format  s       - 	 	LA-//l1o.. 0 ?? 	C7||#P#P$2C#P#P#PPP()\W)\)\)\]]] Q $%A%A%A%ABBBr   c                 N    | j         D ]}|d         |k    r|d         dk    c S d S )Nr   r,  r(  r=  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)  rR  rS  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)r=  r,   )r   r!   rA  s      r   rJ   zEfuseKeyPurposeField.get  sG    " 	 	Att||I....t /  r   c                 F    | j         D ]}|d         |k    r
|d         c S d S )Nr   r   rR  )r   rO  rU  s      r   get_namezEfuseKeyPurposeField.get_name  s?    $ 	 	C1v  1v !	 	r   c                     t          |                     t          |                              }t                                          |          S rv   )rN  r  rL  r   r   )r   r   rO  r   s      r   r   zEfuseKeyPurposeField.save  s:    d''I7788ww||G$$$r   r   )r=   r>   r?   key_purpose_lentuplerL  rN  KeyPurposeTyper=  list__annotations__r>  r   r   appendKEY_PURPOSES_NAMEDIGEST_KEY_PURPOSESr  rV  r)  rJ   r[  r   r@   rA   s   @r   r   r     s        O3S4ZtS@AN* * *L$~&     13n-222eAqO+,, j j11L11111&&"D$H\']^^^&&(=(=(=r8TSg'hiiiqO/Cq.H$PTVjklll 3a?6Ja5OQY[_auvwww''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   EfuseFieldBaserO   r   r   r   r   r   r   r   r   <module>rk     s2     



                V V V V V V V V V V                +   <c c c c c) c c cL	; 	; 	; 	; 	;+ 	; 	; 	;	J 	J 	J 	J 	J 	J 	J 	J* * * * *j * * *0 0 0 0 0z 0 0 0@O @O @O @O @OJ @O @O @OHE% E% E% E% E%: E% E% E% E% E%r   