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

📄 pm5337_util.tcl

📁 用于EOS芯片的驱动程序, 供参考 参考
💻 TCL
📖 第 1 页 / 共 2 页
字号:
#*******************************************************************************#  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 + -