📄 pm5337_util.tcl
字号:
#*******************************************************************************# MDIOWrite#******************************************************************************proc MDIOWrite { phyaddr reg data} { #enable MDIO wr adm 0xEFC0 0x1000; #set address and register value set value [expr [expr $phyaddr << 8] | $reg]; set value [expr $value | 0x4000] set value [dec2hex $value] wr adm 0xEFC5 $value; #write value to data register wr adm 0xEFC6 $data #set to write command, writing to this register causes packet to be sent out wr adm 0xEFC4 0x0100; return}#*******************************************************************************# MDIORead#******************************************************************************proc MDIORead { phyaddr reg } { #enable MDIO wr adm 0xEFC0 0x1000; #set address and register value set value [expr [expr $phyaddr << 8] | $reg]; set value [expr $value | 0x4000] set value [dec2hex $value] wr adm 0xEFC5 $value; #set to read command, writing to this register causes packet to be sent out wr adm 0xEFC4 0x0200; #read value to data register set data [format "0x%02X" [rd adm 0xEFC6]] puts "$data"; return }#------------------------------------------------------------------------------ # SCRIPT NAME: imask # # DESCRIPTION: This procedure filter a 64-bit value to a 32-bit value using a# programmable 32-bit windows.# # PARAMETERS: input - 0x0000000000000000 to 0xFFFFFFFFFFFFFFFF## msbpos - Window upper bound: 0 to 63## lsbpos - Window lower bound: 0 to 63# # NOTES: The size of the window must be 32-bit. # #------------------------------------------------------------------------------ proc imask {input msbpos lsbpos} { # Check mask size within 32 bit set masksize [expr $msbpos - $lsbpos] if {$masksize > 31 || $masksize < 0} { puts "Error invalid mask size" } # Count the number of hex character set hex_char 1 for {set i 2} {$i <= 17} {incr i} { set input_i [string index $input $i] if {$input_i != ""} { incr hex_char } } # Convert 64 bits input to the mask size if {$hex_char <= 9} { set msb 0x0 set lsb $input } if {$hex_char == 10} { # Assign input HEX value to a separate variable set i2 [string index $input 2] set i3 [string index $input 3] set i4 [string index $input 4] set i5 [string index $input 5 ] set i6 [string index $input 6 ] set i7 [string index $input 7 ] set i8 [string index $input 8 ] set i9 [string index $input 9 ] set i10 [string index $input 10] set lsb "0x$i3$i4$i5$i6$i7$i8$i9$i10" set msb "0x$i2" } if {$hex_char == 11} { # Assign input HEX value to a separate variable set i2 [string index $input 2] set i3 [string index $input 3] set i4 [string index $input 4] set i5 [string index $input 5 ] set i6 [string index $input 6 ] set i7 [string index $input 7 ] set i8 [string index $input 8 ] set i9 [string index $input 9 ] set i10 [string index $input 10] set i11 [string index $input 11] set lsb "0x$i4$i5$i6$i7$i8$i9$i10$i11" set msb "0x$i2$i3" } if {$hex_char == 12} { # Assign input HEX value to a separate variable set i2 [string index $input 2] set i3 [string index $input 3] set i4 [string index $input 4] set i5 [string index $input 5] set i6 [string index $input 6] set i7 [string index $input 7] set i8 [string index $input 8] set i9 [string index $input 9] set i10 [string index $input 10] set i11 [string index $input 11] set i12 [string index $input 12] set lsb "0x$i5$i6$i7$i8$i9$i10$i11$i12" set msb "0x$i2$i3$i4" } if {$hex_char == 13} { # Assign input HEX value to a separate variable set i2 [string index $input 2] set i3 [string index $input 3] set i4 [string index $input 4] set i5 [string index $input 5 ] set i6 [string index $input 6 ] set i7 [string index $input 7 ] set i8 [string index $input 8 ] set i9 [string index $input 9 ] set i10 [string index $input 10] set i11 [string index $input 11] set i12 [string index $input 12] set i13 [string index $input 13] set lsb "0x$i6$i7$i8$i9$i10$i11$i12$i13" set msb "0x$i2$i3$i4$i5" } if {$hex_char == 14} { # Assign input HEX value to a separate variable set i2 [string index $input 2] set i3 [string index $input 3] set i4 [string index $input 4] set i5 [string index $input 5 ] set i6 [string index $input 6 ] set i7 [string index $input 7 ] set i8 [string index $input 8 ] set i9 [string index $input 9 ] set i10 [string index $input 10] set i11 [string index $input 11] set i12 [string index $input 12] set i13 [string index $input 13] set i14 [string index $input 14] set lsb "0x$i7$i8$i9$i10$i11$i12$i13$i14" set msb "0x$i2$i3$i4$i5$i6" } if {$hex_char == 15} { # Assign input HEX value to a separate variable set i2 [string index $input 2] set i3 [string index $input 3] set i4 [string index $input 4] set i5 [string index $input 5 ] set i6 [string index $input 6 ] set i7 [string index $input 7 ] set i8 [string index $input 8 ] set i9 [string index $input 9 ] set i10 [string index $input 10] set i11 [string index $input 11] set i12 [string index $input 12] set i13 [string index $input 13] set i14 [string index $input 14] set i15 [string index $input 15] set lsb "0x$i8$i9$i10$i11$i12$i13$i14$i15" set msb "0x$i2$i3$i4$i5$i6$i7" } if {$hex_char == 16} { # Assign input HEX value to a separate variable set i2 [string index $input 2] set i3 [string index $input 3] set i4 [string index $input 4] set i5 [string index $input 5 ] set i6 [string index $input 6 ] set i7 [string index $input 7 ] set i8 [string index $input 8 ] set i9 [string index $input 9 ] set i10 [string index $input 10] set i11 [string index $input 11] set i12 [string index $input 12] set i13 [string index $input 13] set i14 [string index $input 14] set i15 [string index $input 15] set i16 [string index $input 16] set lsb "0x$i9$i10$i11$i12$i13$i14$i15$i16" set msb "0x$i2$i3$i4$i5$i6$i7$i8" } if {$hex_char == 17} { # Assign input HEX value to a separate variable set i2 [string index $input 2] set i3 [string index $input 3] set i4 [string index $input 4] set i5 [string index $input 5 ] set i6 [string index $input 6 ] set i7 [string index $input 7 ] set i8 [string index $input 8 ] set i9 [string index $input 9 ] set i10 [string index $input 10] set i11 [string index $input 11] set i12 [string index $input 12] set i13 [string index $input 13] set i14 [string index $input 14] set i15 [string index $input 15] set i16 [string index $input 16] set i17 [string index $input 17] set lsb "0x$i10$i11$i12$i13$i14$i15$i16$i17" set msb "0x$i2$i3$i4$i5$i6$i7$i8$i9" } # When the mask in only on the lower 32 bit if {$msbpos <= 31} { set masksize [expr $msbpos - $lsbpos] if {$masksize == 31} { return $lsb } if {$masksize == 30 && $lsbpos == 0} { set mask 0x7FFFFFFF set output [dec2hex [expr $mask & $lsb]] return $output } if {$masksize == 30 && $lsbpos == 1} { set mask 0x7FFFFFFF set lsb [dec2hex [expr $lsb >> 1]] set output [dec2hex [expr $mask & $lsb]] return $output } if {$masksize <= 29} { set mask [dec2hex [expr int(pow(2,$masksize+1)) -1]] set lsb [dec2hex [expr $lsb >> $lsbpos]] set output [dec2hex [expr $mask & $lsb]] return $output } } # When the mask in only on the upper 32 bit if {$msbpos > 31 && $lsbpos > 31} { set masksize [expr $msbpos - $lsbpos] if {$masksize == 31} { return $msb } if {$masksize == 30 & $lsbpos == 32} { set mask 0x7FFFFFFF set output [dec2hex [expr $mask & $msb]] return $output } if {$masksize == 30 & $lsbpos == 33} { set mask 0xFFFFFFFE set msb [dec2hex [expr $msb >> 1 ]] set output [dec2hex [expr ($mask & $msb) >> 1]] return $output } if {$masksize <= 29} { set mask [dec2hex [expr int(pow(2,$masksize+1)) -1]] set msb [dec2hex [expr $msb >> ($lsbpos - 32)]] set output [dec2hex [expr $mask & $msb]] return $output } } # When the mask is across both 32 bits windows if {$msbpos > 31 && $lsbpos <= 31} { set uppermasksize [expr $msbpos - 32] set lowermasksize [expr 31 - $lsbpos ] if {$uppermasksize <= 29} { set uppermask [dec2hex [expr int(pow(2,$uppermasksize+1)) -1]] } if {$uppermasksize == 30} { set uppermask 0x7FFFFFFF } if {$lowermasksize <= 29} { set lowermask [dec2hex [expr int(pow(2,$lowermasksize+1)) -1]] } if {$lowermasksize == 30} { set lowermask 0x7FFFFFFF } set lsb [dec2hex [expr $lsb >> $lsbpos]] set output_msb [dec2hex [expr $uppermask & $msb]] set output_lsb [dec2hex [expr $lowermask & $lsb]] set output [dec2hex [expr ($output_msb << ($lowermasksize +1)) | $output_lsb]] return $output }}#------------------------------------------------------------------------------# PROC NAME: EOS_MSTAT_Counter_Demo## DESCRIPTION: This procedure is a wrapper to a system specific # 'read' function. ## PARAMETERS: devID - This parameter is used to specify the device # under configuration. If devID is -1, this function# is echo on the TCL console.# # iChannel - 0 to 7# # NOTES: ##------------------------------------------------------------------------------proc EOS_MSTAT_Counter_Demo {devID iChannel {clrMacCnt 1}} {# iChannel is 0-based. ### 1 Ensure AUTO PMON transfer and external PMON_I pin are disable ### admwr 0 0x0802 0x11F40 # Initialize counter transfer admwr 0 0xE004 0x0001 after 5 ### 2. MSTAT Counter Status ### puts "MSTAT Counter Status" puts "" admwr 0 0xEE04 0x8000 if {$clrMacCnt == 1} { admwr 0 0xEE03 [format "0x%x" [expr ($iChannel << 4) | 0x2]] } else { admwr 0 0xEE03 [format "0x%x" [expr ($iChannel << 4) | 0x1]] } after 1 set frrxokl_15_0 [admrd 0 0xEE10] set frrxokm_15_0 [admrd 0 0xEE11] puts "FRRXOK_LSB(15:0) = $frrxokl_15_0" puts "FRRXOK_MSB(15:0) = $frrxokm_15_0" puts "" set frtxokl_15_0 [admrd 0 0xEE34] set frtxokm_15_0 [admrd 0 0xEE35] puts "FRTXOK_LSB(15:0) = $frtxokl_15_0" puts "FRTXOK_MSB(15:0) = $frtxokm_15_0" set fcserrl_15_0 [admrd 0 0xEE24] set fcserrm_15_0 [admrd 0 0xEE25] puts "FCSERR_LSB(15:0) = $fcserrl_15_0" puts "FCSERR_MSB(15:0) = $fcserrm_15_0" set l1errl_15_0 [admrd 0 0xEE28] set l1errm_15_0 [admrd 0 0xEE29] set l1errh_7_0 [admrd 0 0xEE2a] puts "L1ERR_LSB(15:0) = $l1errl_15_0" puts "L1ERR_MSB(15:0) = $l1errm_15_0" puts "L1ERR_HSB(7:0) = $l1errh_7_0" set l2errl_15_0 [admrd 0 0xEE2c] set l2errm_15_0 [admrd 0 0xEE2d] set l2errh_7_0 [admrd 0 0xEE2e] puts "L2ERR_LSB(15:0) = $l2errl_15_0" puts "L2ERR_MSB(15:0) = $l2errm_15_0" puts "L2ERR_HSB(7:0) = $l2errh_7_0" ### 3. RXDP Counter Status ### puts "RXDP Counter Status" puts "" # Reading RX_FRM_CNT[31:0] for port/channel 1 set ireg_grp 0x8 #set chan 0x0 set chan $iChannel set iaddr [expr 0xC000 | ($ireg_grp << 5) | $chan] admwr 0 0xE601 $iaddr set rx_frm_cnt_15_0 [admrd 0 0xE602] set rx_frm_cnt_31_16 [admrd 0 0xE603] puts "RX_FRM_CNT (15:0) = $rx_frm_cnt_15_0" puts "RX_FRM_CNT (31:16) = $rx_frm_cnt_31_16" puts "" # Reading DROP_FRM_CNT[31:0] for port/channel 1 set ireg_grp 0xA #set chan 0x0 set chan $iChannel set iaddr [expr 0xC000 | ($ireg_grp << 5) | $chan] admwr 0 0xE601 $iaddr set drop_frm_cnt_15_0 [admrd 0 0xE604] set drop_frm_cnt_31_16 [admrd 0 0xE605] puts "DROP_FRM_CNT (15:0) = $drop_frm_cnt_15_0" puts "DROP_FRM_CNT (31:16) = $drop_frm_cnt_31_16" puts "" ### 4. TXDP Counter Status ### puts "TXDP Status" puts "" # Reading TX_FRM_CNT #admwr 0 0xE719 0x8000 admwr 0 0xE719 [format "0x%x" [expr 0x8000 | $iChannel]] set tx_frm_cnt_15_0 [admrd 0 0xE71D] set tx_frm_cnt_31_16 [admrd 0 0xE71E] puts "TX_FRM_CNT ( 15:0) = $tx_frm_cnt_15_0" puts "TX_FRM_CNT (31:16) = $tx_frm_cnt_31_16" puts "" # Displaying IBUF Counter Status puts "IBUF Status" puts "" #set fifo_ovr_pkt_cnt_15_0 [admrd 0 0xEB42] set iAddr [format "0x%x" [expr 0xEB42 + 2*$iChannel]] set fifo_ovr_pkt_cnt_15_0 [admrd 0 $iAddr] set iAddr [format "0x%x" [expr 0xEB43 + 2*$iChannel]] set fifo_ovr_pkt_cnt_31_16 [admrd 0 $iAddr] puts "FIFO_OVR_PKT_CNT (15:0) = $fifo_ovr_pkt_cnt_15_0" puts "FIFO_OVR_PKT_CNT (31:16) = $fifo_ovr_pkt_cnt_31_16" }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -