
    :)di9                     \   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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/esp32c2/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_        d S d S )NzESP32-C2z8Expected the 'esp' param for ESP32-C2 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   )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)	r   esprJ   debugdo_not_confirmextend_efuse_tablerE   -GET_SECURITY_INFO_FLAG_SECURE_DOWNLOAD_ENABLEr   s	   ` `     r   r   zEspEfuses.__init__;   sL    	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       -,r   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>m   s'      *P*Pq1
?*P*P*P*P*P*Pr   Fc              3   $   K   | ]
}|k    V  d S rn   r   ro   s     r   rq   z(EspEfuses.__getitem__.<locals>.<genexpr>q   s8       / /$%Z/ / / / / /r   c                 F    g | ]}t                               |          S r   rL   rO   s     r   r(   z)EspEfuses.__getitem__.<locals>.<listcomp>t   rT   r   Tc              3   $   K   | ]
}|k    V  d S rn   r   ro   s     r   rq   z(EspEfuses.__getitem__.<locals>.<genexpr>{   s'      .T.T1qJ.T.T.T.T.T.Tr   )rc   nameany	alt_namesrU   re   KeyError)r   rp   e
new_fieldsrP   s   ``   r   __getitem__zEspEfuses.__getitem__j   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 rn   )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                                       d S )N r   	err__regsT)rh   z{:27} 0x{:08x}EFUSE_RD_RS_ERR_REG)	r   printr`   print_blockerr_bitarrayformatread_regr/   r   r   s    r   print_status_regszEspEfuses.print_status_regs   s    	"A""4;q>#>SW"XXX	##%t}}TY5R'S'S 	
 	
 	
 	
 	
r   c                 ~    |                                   |                                  |                                  d S rn   )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_programra   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                 (   |                                  }|dv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k    rdnd	}|                     | j        j        | j        j        |           d
S )z'Set timing registers for burning efuses)   (   z3The eFuse supports only xtal=26M and 40M (xtal was )   r   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EFUSE_WR_TIM_CONF0_REGEFUSE_TPGM_INACTIVE_M)r   	xtal_freqtpgm_inactive_vals      r   r   zEspEfuses.set_efuse_timing   s&    ))++	H$$$RiRRR   		4di6OQUVVVI($)*G	
 	
 	
 	I,di.JF	
 	
 	
 	I,di.KU	
 	
 	
 $-??CCI,I+	
 	
 	
 	
 	
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_ERR_REG)r&   offsr   s     r   r(   z8EspEfuses.get_coding_scheme_warnings.<locals>.<listcomp>   sC        MM$)"CdQh"NOO  r   r   zuint:32=TNzError(s) in BLOCKz	 [ERRORS: FAIL:])r`   idr   r   posreversed	overwriter   count
num_errorsfailr/   BLOCK_ERRORSr   r   r   rh   r   )r   r   old_addr_reg	reg_valueret_failrI   r:   wordaddr_regerr_num_maskerr_num_offsfail_bits   `           r   ra   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-= 	E E E$/E E7<zE E E   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   ra   r   r@   rA   s   @r   rC   rC   6   s         - - - - - -^  *8 8 8
 
 
  
< < <! ! !
 
 
  * * *X
 
 
6# # # #J      r   rC   c                   $    e Zd Zed             ZdS )rM   c                     	 t          t          t          t          d                    |j        t                    | |          S )N)mac
keypurposet_sensoradc_tp)EfuseMacFieldEfuseKeyPurposeFieldEfuseTempSensorEfuseAdcPointCalibrationrH   
class_typerM   )r   rP   s     r   rN   zEfuseField.convert#  sD    , .'.	
 

 #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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   NT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.get5  sF    	""9--!H#bb!U122Y^#i//r   Nr   r   r   r   r   r   r   4  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!:   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| }nd}d|z   dz   S )Nr   Blockz has ERRORS:r   OK(r   )r   get_block_errorsrI   )r   errsr   outputs       r   checkzEfuseMacField.checkU  s_    [11$*==
d1999GTZGGTGGGGFFFV|c!!r   Tc                     | j         dk    r|                     |          d d d         }n|                     |          }d                    t          j        |d          |                                 g          S )N
CUSTOM_MACr"    r   )ru   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   ru   descriptionr   )ry   	new_values     r   print_fieldz'EfuseMacField.save.<locals>.print_fielde  sQ    IX!&XXQ]XXaoo6G6GXXYXX    r   r  z-Writing Factory MAC address is not supported.)ru   convert_to_bitstringr   saver[   r\   )r   r  r  bitarray_macr   s       r   r  zEfuseMacField.saved  st    	 	 	
 9$$44Y??LKl+++GGLL#####$%TUUUr   r   )r=   r>   r?   r   r  rH   r  r@   rA   s   @r   r   r   <  ss          0" " "? ? ? ?V V V V V V V V Vr   r   c                   F    e Zd Zg dZd eD             Zd eD             ZdS )r   ))USERr   N)XTS_AES_128_KEYr   N)+XTS_AES_128_KEY_DERIVED_FROM_128_EFUSE_BITSr	   N)SECURE_BOOT_DIGEST   DIGESTc                     g | ]
}|d          S )r   r   r&   ru   s     r   r(   zEfuseKeyPurposeField.<listcomp>|  s    :::Ta:::r   c                 6    g | ]}|d          dk    |d         S )r	   r  r   r   r  s     r   r(   zEfuseKeyPurposeField.<listcomp>}  s*    SSSttAw(?R?R47?R?R?Rr   N)r=   r>   r?   KEY_PURPOSESKEY_PURPOSES_NAMEDIGEST_KEY_PURPOSESr   r   r   r   r   r  sK          L ;:\:::SS|SSS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   <module>r&     s     



                V V V V V V V V V V                +   <i i i i i) i i iX; ; ; ; ;+ ; ; ;* * * * *j * * *0 0 0 0 0z 0 0 03V 3V 3V 3V 3VJ 3V 3V 3VlT T T T T: T T T T Tr   