⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pm5337_eos_eapo.tcl

📁 用于EOS芯片的驱动程序, 供参考 参考
💻 TCL
📖 第 1 页 / 共 4 页
字号:
  admwr $devID $addr_0xE869 [expr ($start_pos2 << 6)| [imask $mask2 47 43]] 	  
  # Bit 95 to 64 (IND_DATA2) <- imask2 [42:11]
  admwr $devID $addr_0xE86A [imask $mask2 42 11] 				  
  # Bit 63 to 32 (IND_DATA1) <- mask2[10:0] + startpos1 + mask1[47:32]  
  admwr $devID $addr_0xE86B [expr ([imask $mask2 10 0] << 21)|($start_pos1 << 16)|[imask $mask1 47 32]]   
  # Bit 31 to 0 (IND_DATA0) <- mask1[31:0]
  admwr $devID $addr_0xE86C [imask $mask1 31 0] 				
  
  # b) Write value to indirect address register
  set BUSY_ING 1
  set BUSY_EGR 0
  set RWB 0
  set IND_ADDR [expr 0x000 + ($port * 0x1)]
  set iaddr [expr ($BUSY_ING << 31)|($BUSY_EGR << 30)|($RWB << 29)|$IND_ADDR]
  set iaddr [dec2hex $iaddr]
  admwr $devID $addr_0xE86D $iaddr
  
  #c) Poll BUSY bit until low
  Poll_BUSY_Bit $devID $addr_0xE86D 31
             
}



#------------------------------------------------------------------------------
# SCRIPT NAME:	EOS_T1_Table_Config (Used in EOS_EAPO_Extract_RAM_Example)
#
# DESCRIPTION:	Setup Table 1
#		
# PARAMETERS:   devID - This parameter is used to specify the device 
#                       under configuration
#
#               dir - 0 (Drop direction), 
#                     1 (Add direction)
#
#               index_n - 1 to 15
##
#               value1 - The expected value: 0x000000000000 to 0xFFFFFFFFFFFF
#
#               hfindex1 - 0 (header field 1 is used), 1 (header field 2 is used)
#
#               value2 - The expected value: 0x000000000000 to 0xFFFFFFFFFFFF
#
#               hfindex2 - 0 (header field 1 is used), 1 (header field 2 is used)
#
#------------------------------------------------------------------------------
proc EOS_T1_Table_Config {devID dir index_n hfindex1 value1 hfindex2 value2 } {

  source /usr/lib/cgi-bin/apps/tclscripts/PM5337_util.tcl  
  
  ### Defining address for ingress or egress direction ###
  set addr_0xE803 [dec2hex [expr 0xE803 + ($dir * 0x200)]]
  set addr_0xE804 [dec2hex [expr 0xE804 + ($dir * 0x200)]] 
  set addr_0xE805 [dec2hex [expr 0xE805 + ($dir * 0x200)]]
  set addr_0xE806 [dec2hex [expr 0xE806 + ($dir * 0x200)]]
  set addr_0xE807 [dec2hex [expr 0xE807 + ($dir * 0x200)]]
  set addr_0xE808 [dec2hex [expr 0xE808 + ($dir * 0x200)]]
  set addr_0xE809 [dec2hex [expr 0xE809 + ($dir * 0x200)]]
  set addr_0xE80A [dec2hex [expr 0xE80A + ($dir * 0x200)]]
  set addr_0xE80B [dec2hex [expr 0xE80B + ($dir * 0x200)]]
  
  set addr_0xE869 [dec2hex [expr 0xE869 + ($dir * 0x200)]]
  set addr_0xE86A [dec2hex [expr 0xE86A + ($dir * 0x200)]]
  set addr_0xE86B [dec2hex [expr 0xE86B + ($dir * 0x200)]]
  set addr_0xE86C [dec2hex [expr 0xE86C + ($dir * 0x200)]]
  set addr_0xE86D [dec2hex [expr 0xE86D + ($dir * 0x200)]] 
                  
  ### Configure header filters start position and mask ###
  
  # a) Write value to indirect data register
  
  set T1_F_PORT_SEL_INDEXn_0 0x000
  set T1_F_HF_SEL_INDEXn_0 $hfindex1
  set T1_F_EN_INDEXn_0 0x1
  set T1_F_ALL_PORT_EN_INDEXn_0 0x1
  
  set T1_F_PORT_SEL_INDEXn_1 0x000
  set T1_F_HF_SEL_INDEXn_1 $hfindex2
  set T1_F_EN_INDEXn_1 0x1
  set T1_F_ALL_PORT_EN_INDEXn_1 0x1
    
  # IND_DATA3 (Bit 127 to 96)
  set word [expr ($T1_F_ALL_PORT_EN_INDEXn_1<< 11)|($T1_F_EN_INDEXn_1<<10)|($T1_F_HF_SEL_INDEXn_1<<9)|($T1_F_PORT_SEL_INDEXn_1<<6)|[imask $value2 47 42]]
  admwr $devID $addr_0xE869 $word
  
  # IND_DATA2(Bit 95 to 64)  
  admwr $devID $addr_0xE86A [imask $value2 41 10]  
  
  # IND_DATA1 (Bit 63 to 32)
  set word [expr ([imask $value2 9 0] << 22)|($T1_F_ALL_PORT_EN_INDEXn_0<<21)|($T1_F_EN_INDEXn_0<<20)|($T1_F_HF_SEL_INDEXn_0<<19)|($T1_F_PORT_SEL_INDEXn_0<<16)|[imask $value1 47 32]]
  admwr $devID $addr_0xE86B $word
     
  # IND_DATA0 (Bit 31 to 0)   
  admwr $devID $addr_0xE86C [imask $value1 31 0] 				
  
  # b) Write value to indirect address register
  set BUSY_ING 1
  set BUSY_EGR 0
  set RWB 0
  set IND_ADDR [expr 0x020 + 0x1 * ($index_n - 1) ]
  set iaddr [expr ($BUSY_ING << 31)|($BUSY_EGR << 30)|($RWB << 29)|$IND_ADDR]
  set iaddr [dec2hex $iaddr]
  admwr $devID $addr_0xE86D $iaddr
  
  #c) Poll BUSY bit until low
  Poll_BUSY_Bit $devID $addr_0xE86D 31                  
}

#------------------------------------------------------------------------------
# SCRIPT NAME:	CA_Table_Config (Used in EOS_EAPO_Extract_RAM_Example)
#
# DESCRIPTION:	Setup Consequential Action Table
#		
# PARAMETERS:   
#
#               devID - This parameter is used to specify the device 
#                       under configuration
#
#               dir - 0 (Drop direction), 
#                     1 (Add direction)
#
#               table1index - 0x00 to 0x1D, or 0x1F (for no match)
#
#               table2index - 0x00 to 0x1D, or 0x1F (for no match)
#
#               action - 0x0 Transport
#  			 0x1 Drop
#			 0x2 Send to RAM
#			 0x3 Send only 32 byte to RAM
#			 0x4 Transport and send to RAM
#			 0x5 Transport and send only 32 byte to RAM
#
#  Note: 1) tablenindex should be set to 0x1E when the Table n is not enabled
#
#------------------------------------------------------------------------------

proc CA_Table_Config {devID dir table1index table2index action} {

  set addr_0xE86C [dec2hex [expr 0xE86C + ($dir * 0x200)]]
  set addr_0xE86D [dec2hex [expr 0xE86D + ($dir * 0x200)]] 
  
  set n [dec2hex [expr (($table2index & 0x3)<<5)|$table1index]]
  set m [dec2hex [expr ($table2index >> 2) & 0x7]]
      
  # Write value to indirect address register
  
  admwr $devID $addr_0xE86C [expr $action << (3 * $m)]
  
  set BUSY_ING 1
  set BUSY_EGR 0
  set RWB 0
  set IND_ADDR [expr 0x100 + 0x1 * $n ]
  set iaddr [expr ($BUSY_ING << 31)|($BUSY_EGR << 30)|($RWB << 29)|$IND_ADDR]
  set iaddr [dec2hex $iaddr]
  admwr $devID $addr_0xE86D $iaddr
  
 
}

#------------------------------------------------------------------------------
# SCRIPT NAME:	EAPO_RAM_Rd
#
# DESCRIPTION:	Read content in the extraction RAM
#		
# PARAMETERS:   
#               devID - This parameter is used to specify the device 
#                       under configuration
#
#               dir - 0 (Drop direction), 
#                     1 (Add direction)
#
#               port - 0 to 7
# NOTES: 
#  
#------------------------------------------------------------------------------

proc EAPO_RAM_Rd {{devID 0} {dir 1} {port 0}} {

  if {$dir == 0} {
    set addr [expr 0xE812 + $port]
    set addr2 [expr 0xE82D + $port]
    set addr [dec2hex $addr]
    set addr2 [dec2hex $addr2]
  }  
  if {$dir == 1} {
    set addr [expr 0xEA12 + $port]
    set addr2 [expr 0xEA2D + $port]
    set addr [dec2hex $addr]
    set addr2 [dec2hex $addr2]
  }
  
  # Check if there is an content in RAM 
  set CPU_PEXT_RAMn_PAI_V [admrdb $devID $addr2 $port]
  
  if {$CPU_PEXT_RAMn_PAI_V== 0 } {    
    puts "RAM[expr $port + 1]_Packet_DATA is empty"      
    return
  } 
        
  # Read the first byte of the RAM to determine the packet length
  set first_read [admrd $devID $addr]
  set packetlength [expr (( $first_read >> 16) & 0xFFFF)/4 ]
  
  # Check the extracted packet length
  if {$packetlength == 0 } {    
    # Check for error again
    puts "RAM[expr $port + 1]_Packet_DATA is empty"      
    return
    
  } elseif {$packetlength > 1518} {      
    # Check for error again
    puts "Invalid Packet Length"              
    return
    
  } else {  
    
    set second_read [admrd $devID $addr]
    set third_read [admrd $devID $addr]
    set forth_read [admrd $devID $addr]
            
    puts "Dest Addr (47:39) = [dec2hex [expr $first_read & 0xFF ]]"
    puts "Dest Addr (38:8) = [dec2hex [expr $second_read ]]"
    puts "Dest Addr (7:0) = [dec2hex [expr ($third_read >> 24) & 0xFF]]"
    puts ""
    puts "Source Addr (47:16) = [dec2hex [expr $third_read & 0xFFFFFF]]"
    puts "Source Addr (15:0) = [dec2hex [expr ($forth_read >> 8)& 0xFFFFFF]]"    
    puts ""
    puts "Length/Type = [dec2hex [expr $forth_read & 0xFF]]"    
    puts ""
    puts "Payload and FCS:"
    
    # Calculate if there is any remainer when dividing the packet 
    # lenght by 4
    
    set remainer [expr (($first_read >> 16) & 0xFFFF)%4]    
        
    if {$remainer == 0} {
      for {set i 5} {$i <= $packetlength} {incr i} {    
        puts [admrd $devID $addr]      
      }          
      puts [dec2hex [expr ([admrd $devID $addr]>>0x8) & 0xFFFFFF]]
    }
    if {$remainer == 1} {
      for {set i 5} {$i <= $packetlength} {incr i} {    
        puts [admrd $devID $addr]      
      }          
      puts [admrd $devID $addr]      
    }
    if {$remainer == 2} {
      for {set i 5} {$i <= $packetlength} {incr i} {    
        puts [admrd $devID $addr]      
      }                
      puts [admrd $devID $addr]  
      puts [dec2hex [expr ([admrd $devID $addr]>>0x23) & 0xFF]]          
    }
    if {$remainer == 3} {
      for {set i 5} {$i <= $packetlength} {incr i} {    
        puts [admrd $devID $addr]      
      }                
      puts [admrd $devID $addr]            
      puts [dec2hex [expr ([admrd $devID $addr]>>0x16) & 0xFFFF]]
    }    
  }
} 
  
  

#------------------------------------------------------------------------------
# SCRIPT NAME:	EOS_EAPO_Packet_Ins_Example
#
# DESCRIPTION:	In this example, a packet with Dest MAC = 0x0123456789AB
#               Src MAC = 0x0123456789AB and Length/type/payload = 0x5555
#               is sent once every second
#		
# PARAMETERS:   devID - This parameter is used to specify the device 
#                       under configuration
#
#               dir - 0x0 (Drop), 0x1 (Add)
#
#               port - 0x0 (port 1), ... 0x7 (port 8) 
#
# NOTES: 
#
#     1) When PERIODIC_TRANS is set to 0
#        Use the following procedure to insert the packet manually
#
#	 proc ins {} {  
#  	   admwrb 0 0xE841 16 0
#  	   admwrb 0 0xE841 16 1  
#	 }
#    
#------------------------------------------------------------------------------

proc EOS_EAPO_Packet_Ins_Example {devID dir port} {  
    
  ### Defining address for ingress or egress direction ###
  set addr_0xE83F [dec2hex [expr 0xE83F + ($dir * 0x200)]]
  set addr_0xE840 [dec2hex [expr 0xE840 + ($dir * 0x200)]] 
  set addr_0xE841 [dec2hex [expr 0xE841 + ($dir * 0x200)]]
  set addr_0xE842 [dec2hex [expr 0xE842 + ($dir * 0x200)]] 
  set addr_0xE843 [dec2hex [expr 0xE843 + ($dir * 0x200)]]
        
  
  # 1. Toggle RESET_WR_PTR and set TRANS_PACKET to 0
  admwrb $devID $addr_0xE841 16 0
  admwrb $devID $addr_0xE841 17 1
  admwrb $devID $addr_0xE841 17 0
  
  # 3. Configure Packet Insertion Controller and RAM
  set insert_length 0x40 ;# lenght = 64  
  set port 0x0
  set FCS_CPU_PACKET_COMP 0x1
  set CPU_PACKET_PRIORITY 0x1
  set PERIODIC_TRANS 0x1
  
  if {$dir == 0} {  
    # Drop direction
    set PERIOD_LSB 0x7735940 ;# 1 sec
  }
  if {$dir == 1} {
    # Add direction
    set PERIOD_LSB 0x4A28600 ;# 1 sec
  }
  
  # Write to RAM  
  # Src and Dest MAC Addr = 0x0123456789AB  
  # Define length and port
  set length_port [expr ($insert_length << 16)|($port)]
  admwr $devID $addr_0xE843 $length_port  
  # first write
  admwr $devID $addr_0xE843 0x01234567  
  # second write
  admwr $devID $addr_0xE843 0x89AB0123
  # third write
  admwr $devID $addr_0xE843 0x456789AB
  # Write the rest of the packet
  for {set i 4} {$i <= [expr $insert_length /4]} {incr i} {
    admwr $devID $addr_0xE843 0x55555555
  }
 
  # Trigger write  
  admwr $devID $addr_0xE842 $PERIOD_LSB
  
  set value [dec2hex [expr 0x10000|($FCS_CPU_PACKET_COMP << 13)|($PERIODIC_TRANS << 10)|($CPU_PACKET_PRIORITY << 14)]]
  admwr $devID $addr_0xE841 $value     
  
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -