【python5】闭包/装饰器,

文章目录

  • 1.闭包和装饰器:函数里return就是闭包
  • 2.解析eeprom:如下是二进制文件,C8是一个字节
  • 3.json/configparser/optparse:json.dumps(将字典转化为字符串,将json信息写进文件),json.loads(将字符串转化为字典)
  • 4.map:[]列表 , ()元组 , {}集合 , {a:b}字典。for else中break后不走else
  • 5.walk/split/getattr/bin:bin转为二进制0b...
  • 6.sol/mmc:emmc_info_cmd = "mmc cid read /sys/block/mmcblk0/device",size_cmd = "cat /sys/block/mmcblk0/size"
  • 5.gpio/pcie:lspci,re.compile


1.闭包和装饰器:函数里return就是闭包

在这里插入图片描述
如下打印第一行是:我在~。
在这里插入图片描述
在这里插入图片描述

2.解析eeprom:如下是二进制文件,C8是一个字节

在这里插入图片描述
在这里插入图片描述
如下5x4+4+2x4=32。
在这里插入图片描述

# tlv_tool.py
#!/usr/bin/env python3
# -*- encoding: utf-8 -*-
import sys
import struct
import os
import time
import json
import subprocess
import binascii
from os.path import dirname, abspath# a.py
# import json, os
# print(json.__file__) # /usr/lib/python3.8/json/__init__.py
# print(os.path.abspath(__file__)) # /home/y/utool/a.py
# print(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) # /home/ysys.path.append(dirname(dirname(abspath(__file__))))  #当前tlv_tool.py文件所在绝对路径的文件夹的上级文件夹
Project_path = dirname(abspath(__file__))  #获取所在路径文件夹
Conf_path = '{}/tlv_conf.json'.format(Project_path)def ParseJson(filename=Conf_path):with open(filename, 'r') as f:jdata = json.load(f)return jdata
tlv_json = ParseJson()
tlv_reg_path = tlv_json['tlv_reg_path']
tlv_eeprom_path = tlv_json['tlv_eeprom_path']def run_command(cmd):proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)out, err = proc.communicate()if err and proc.returncode != 0:return errreturn out.decode()# def write_reg(fpath, reg, data):
#     if os.getcwd() != fpath:
#         if os.path.exists(fpath) == False or os.chdir(fpath) == False:
#             return 'file Not exists or file Not accessible'
#     if run_command('echo {} {} > setreg'.format(reg, data)) != 0:
#         return 'write fail'
#     return 0# def read_reg(fpath, reg):
#     if os.getcwd() != fpath:
#         if os.path.exists(fpath) == False or os.chdir(fpath) == False:
#             return 'file Not exists or file Not accessible'
#     if run_command('echo {} > getreg'.format(reg)) != '':
#         return 'echo reg fail'
#     return run_command('cat getreg').strip()def crc2hex(crc):return '0x{:0>8X}'.format(binascii.crc32(crc))    #取crc32的八位数据 %x返回16进制,摘要算法def unlock_tlv_eeprom(path,reg,data = '0x0'):   # unlock_tlv_eeprom(tlv_reg_path,'0x06')  #0x06寄存器eeprom写保护if os.getcwd() != path:if os.path.exists(path) == False or os.chdir(path) == False:return 'file Not exists or file Not accessible'if run_command('echo {} {} > setreg'.format(reg, data)) != 0:return 'write fail'if run_command('echo {} > getreg'.format(reg)) != '':return 'echo reg fail'output =  run_command('cat getreg').strip()print("set reg {} value: {}".format(reg,output))if output == data:print('Unlock tlv eeprom success!')  # 0x0return Trueprint('Unlock tlv eeprom fail!')return Falsedef tlv_read_eeprom(path,length=None,offset=None):  # tlv_read_eeprom(tlv_eeprom_path,length)with open('{}eeprom'.format(path),mode = 'rb') as f:return f.read(length)def tlv_read_length():with open('{}eeprom'.format(tlv_eeprom_path),mode = 'rb') as f:'''tlv_header_length = char[8] + u8 + u16'''tlv_header_length = 11tlv_signature , tlv_version , tlv_totallen = struct.unpack("!8sBH", f.read(tlv_header_length))  #读11字节return tlv_header_length + tlv_totallendef tlv_dump(args):  #读出eeprom信息写到tlv_dump.bin文件length = tlv_read_length()data = tlv_read_eeprom(tlv_eeprom_path,length)try:file_name = args[2]except IndexError:file_name = 'tlv_dump.bin'with open(file_name,mode = 'wb') as f:# print(data)# print(len(data))f.write(data) f.flush()    print("Dump tlv data finish!")tlv_type_dirt = {0x21 : 'Product Name', 0x22 : 'Part Number',   0x23 : 'Serial Number', 0x24 : 'Base MAC Address', 0x25 : 'Manufacture Date',0x26 : 'Device Version', 0x27 : 'Label Revision', 0x28 : 'Platform Name', 0x29 : 'ONIE Version', 0x2A : 'MAC Address Size', 0x2B : 'Manufacturer', 0x2C : 'Country Code',0x2D : 'Vendor Name',0x2E : 'Diag Version',0x2F : 'Service Tag',0xFD : 'Vendor Extension',0xFE : 'CRC-32'
}def tlv_write(args):with open(args[2],mode = 'rb') as f:data = f.read()if unlock_tlv_eeprom(tlv_reg_path,'0x06'):with open('{}eeprom'.format(tlv_eeprom_path),mode = 'rb+') as f:f.write(data)f.flush()print("Write tlv data finish!")def tlv_read(args):if len(args) == 3 and '.bin' in args[2]:path = args[2]else:path = '{}eeprom'.format(tlv_eeprom_path)with open(path,mode = 'rb') as f:'''tlv_header_length = char[8] + u8 + u16'''tlv_header_length = 11tlv_signature , tlv_version , tlv_totallen = struct.unpack("!8sBH", f.read(tlv_header_length))print("TlvInfo Header:")print("    Id String    : {}".format(tlv_signature.decode().strip()))print("    Version      : {}".format(tlv_version))print("    Total Length : {}".format(tlv_totallen))'''data_header_length = u8 + u8'''print("TLV Name         Code Len  Value")print("--------------------------------")data_header_length = 2length_cnt = 0stored_crc = Nonewhile length_cnt < tlv_totallen :data_type , data_length = struct.unpack("!BB", f.read(data_header_length))length_cnt += data_header_length + data_lengthif (data_type in tlv_type_dirt.keys()):passelse:continueif tlv_type_dirt[data_type] == 'Base MAC Address':if data_length == 6:mac0,mac1,mac2,mac3,mac4,mac5 = struct.unpack('!BBBBBB', f.read(data_length))data = "{:0>2X}:{:0>2X}:{:0>2X}:{:0>2X}:{:0>2X}:{:0>2X}".format(mac0,mac1,mac2,mac3,mac4,mac5)else:print('Base MAC Address Error Length {}!'.format(data_length))exitelif tlv_type_dirt[data_type] == 'Device Version':if data_length == 1:data = struct.unpack('!B', f.read(data_length))data = data[0]else:print('Device Version Error Length {}!'.format(data_length))exitelif tlv_type_dirt[data_type] == 'MAC Address Size':if data_length == 2:byte0,byte1 = struct.unpack('!BB', f.read(data_length))data = (byte0 << 8) | byte1else:print('MAC Address Size Error Length {}!'.format(data_length))exitelif tlv_type_dirt[data_type] == 'Vendor Extension':if data_length > 0:vendor_cmd = '!'for index in range(data_length):vendor_cmd += "B"byte_tuple = struct.unpack(vendor_cmd, f.read(data_length))data = ''for byte in byte_tuple:data += '0x{:0>2X} '.format(byte)else:data = 'NULL'elif tlv_type_dirt[data_type] == 'CRC-32':if data_length == 4:crc0,crc1,crc2,crc3 = struct.unpack('!BBBB', f.read(data_length))data = "0x{:0>2X}{:0>2X}{:0>2X}{:0>2X}".format(crc0,crc1,crc2,crc3)stored_crc = eval(data)else:print('CRC Error Length {}!'.format(data_length))exitelse:if data_length > 0:data = struct.unpack('!{}s'.format(data_length), f.read(data_length))data = data[0].decode().strip()else:# data = None# data = ''data = 'NULL'print("{:<16} 0x{:x} {:>3} : {}".format(tlv_type_dirt[data_type],data_type,data_length,data))if stored_crc != None:f.seek(0,0)crc_data = f.read(tlv_header_length + tlv_totallen - 4)# print(crc_data)calc_crc = eval(crc2hex(crc_data))if calc_crc == stored_crc:print('Checksum is valid')else:print('Checksum is invalid')else:print('No Checksum Data')def tlv_update(args):try:file_name = args[2]except IndexError:file_name = Nonetlv_data = tlv_json['tlv_data']'''tlv_header_length = char[8] + u8 + u16'''tlv_signature = tlv_json['tlv_signature'].encode()if len(tlv_signature) > 8:print('tlv signature length out off range !!!')exitwhile len(tlv_signature) < 8:tlv_signature += b'\x00'tlv_version = tlv_json['tlv_version'].to_bytes(1,'big')tlv_totallen = 0x00data_list = []      #一般都在for上面定义一个空列表for item in tlv_type_dirt:title = tlv_type_dirt[item].replace(' ','_')if (title in tlv_data.keys()):passelse:if tlv_type_dirt[item] == 'Manufacture Date':passelse:continueif tlv_type_dirt[item] == 'Base MAC Address':mac_list = tlv_data[title].split(':')mac_code = b''for mac_item in mac_list:mac_code += eval('0x{}'.format(mac_item)).to_bytes(1,'big')data = mac_codeelif tlv_type_dirt[item] == 'Manufacture Date':data = time.strftime("%d-%m-%Y %H:%M:%S", time.localtime()).encode()elif tlv_type_dirt[item] == 'Device Version':data = tlv_data[title].to_bytes(1,'big')elif tlv_type_dirt[item] == 'MAC Address Size':data = tlv_data[title].to_bytes(2,'big')elif tlv_type_dirt[item] == 'Vendor Extension':vendor_list = tlv_data[title].split()vendor_code = b''for vendor_item in vendor_list:vendor_code += eval(vendor_item).to_bytes(1,'big')data = vendor_codeelse:data = tlv_data[title]if data != 'None' and data != '':data = data.encode()else:data = b''type_code = item.to_bytes(1,'big')len_code = len(data).to_bytes(1,'big')data_str = type_code + len_code + datadata_list.append(data_str)  ##################for item in data_list:tlv_totallen += len(item)'''tlv_totallen add crc data str length'''tlv_totallen = (tlv_totallen + 6).to_bytes(2,'big')tlv_final_data = tlv_signature + tlv_version + tlv_totallenfor data_item in data_list:tlv_final_data += data_item'''add crc data header and length'''tlv_final_data += (0xFE).to_bytes(1,'big') + (0x04).to_bytes(1,'big')'''add crc data'''crc_data = eval(crc2hex(tlv_final_data)).to_bytes(4,'big')tlv_final_data += crc_data# print(tlv_final_data)if file_name == None:if unlock_tlv_eeprom(tlv_reg_path,'0x84'):with open('{}eeprom'.format(tlv_eeprom_path),mode = 'rb+') as f:f.write(tlv_final_data)f.flush()print("update tlv data finish!")else:with open(file_name,mode = 'wb') as f:f.write(tlv_final_data) f.flush()print("update tlv data bin finish!")def read_help(args):print('usage: {} [OPTIONS]'.format(args[0]))print('Options are:')print('     -w      --write      write tlv bin to eeprom')print('     -d      --dump       dump tlv bin from eeprom')print('     -r      --read       read  tlv data from eeprom')print('     -u      --update     update tlv data to eeprom or create new tlv bin')print('     -h      --help       Display this help text and exit')print('Example:')print('             --write  <bin name>')print('             --dump   <bin name>')print('             --update <bin name>')print('                  just create tlv bin , but not update tlv data')print('             --update')print('                  just update tlv data , but not create tlv bin')print('             --read')op = {'--write'  : tlv_write,'--dump'   : tlv_dump,'--read'   : tlv_read,'--update' : tlv_update,'--help'   : read_help,'-w'       : tlv_write,'-d'       : tlv_dump,'-r'       : tlv_read,'-u'       : tlv_update,'-h'       : read_help,
}if __name__ == '__main__':if len(sys.argv) == 1:read_help(sys.argv)else:        op.get(sys.argv[1], read_help)(sys.argv)
// tlv_conf.json
{"tlv_reg_path" : "/sys/bus/platform/devices/hq_switch/cpld_lc/","tlv_eeprom_path" : "/sys/bus/i2c/devices/0-0056/","tlv_signature": "TlvInfo","tlv_version": 1, "tlv_data": {"Product_Name":     "ZSR551", "Part_Number":      "ZSR551",   "Serial_Number":    "SN number", "Base_MAC_Address": "00:E0:EC:00:00:00", "Device_Version":   1, "Label_Revision":   "ZSR551", "Platform_Name":    "x86_64-ZSR551-r0", "ONIE_Version":     "0.0.1", "MAC_Address_Size": 260, "Manufacturer":     "None", "Country_Code":     "CHN","Vendor_Name":      "None","Diag_Version":     "1.4.0","Service_Tag":      "LB","Vendor_Extension": "0x00 0x00 0x00"}
}

在这里插入图片描述

3.json/configparser/optparse:json.dumps(将字典转化为字符串,将json信息写进文件),json.loads(将字符串转化为字典)

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import json# dict1 = {"age": "12"}                                                      # <type 'dict'>
# json_info = json.dumps(dict1)     
# print("通过json.dumps()函数处理:json_info的类型:"+str(type(json_info)))  # <type 'str'>
# print(json_info)                                                           # {"age": "12"}json_info = '{"age": "12"}' 									    # <type 'str'>
dict1 = json.loads(json_info)    
print("通过json.loads()函数处理:dict1的类型:"+str(type(dict1)))   # <type 'dict'>
print(dict1)         											    # {u'age': u'12'}  # u:unicode中文显示# json_info = "{'age': '12'}"
# file = open('1.json','w') 
# json.dump(json_info,file)   #生成1.json里面内容为 "{'age': '12'}"

在这里插入图片描述
在这里插入图片描述
win下.ini多。
在这里插入图片描述
在这里插入图片描述

# coding=UTF-8<code>
import os
import jsondef d():info_list = ['a','b','c','d','e','f','g','h','i']split_list = [info_list[i:i+4] for i in range(0, len(info_list), 4)]print(split_list)  # [['a', 'b', 'c', 'd'], ['e', 'f', 'g', 'h'], ['i']]x = set('runoob')print(x)   # set(['b', 'r', 'u', 'o', 'n'])print(len(x)) # 5i2clist={'2':'port 1 SFP','3':'port 2 SFP','4':'port 3 SFP','5':'port 4 SFP'
}
def e():for i in i2clist:print(i) # 3 2 5 4def search_dir_by_name(name, dir):result = []try:files = os.listdir(dir)for file in files:if name in file:result.append(os.path.join(dir, file))except Exception as e:passreturn resultdir = "/sys/block/"
spect = "sd"
ssdpath = []
# /sys/block/sd*   remove=1  sda  fdisk | grep sda 有/dev/sda , 没有的话只有sda, 拼接/dev/sda
if __name__ == '__main__':result = search_dir_by_name(spect, dir)#print(result)    #['/sys/block/sdd', '/sys/block/sdb', '/sys/block/sde', '/sys/block/sdc', '/sys/block/sda']for item in result:with open(os.path.join(item, "removable"), 'r') as fd:#print(item)  # /sys/block/sde#print(os.path.join(item, "removable"))  # /sys/block/sde/removable#print(fd.read()) #0或1  # SyntaxError: Non-ASCII character '\xe6' 加#coding=UTF-8<code>value = fd.read()if value.strip() == "0":  # found ssd  #去除1ssd_disk = "/dev/" + os.path.basename(item)  #ssd_disk:/dev/sda .../dev/sddssdpath.append(ssd_disk)

4.map:[]列表 , ()元组 , {}集合 , {a:b}字典。for else中break后不走else

python中None,False,空字符串"",0,空列表[],空字典{},空元组()都相当于False。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
cpu和switch连着,中间有一个nic卡(mellanox或e810),switch连着外面的光模块。fpga一端连着cpu,一端连着switch,fpga的eeprom存指令控制switch。

前面板前36个是loopback(光模块插DAC线或光纤,lookpack内部TX和RX接在一起),37-64网口是fpga和nic卡, 6162->mellax 100G(100G无4个lan), e810 25G。traffic:外部loocpack,cpu发包,cpu收包。
fpga 100g : cpu - fpga - switch - loopback - switch - fpga。
fpga 25g : fpga - switch。layout只fpga,1个fpga有8个pcie设备(pf),1个pcie设备有16个通道。

如下25G有4个lan。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
def stop_all(self, bdf_lst, bar, port, channel) 。如下self. 默认第一个参数有self。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.walk/split/getattr/bin:bin转为二进制0b…

# b.py
import os
import json
import sysdef seek_file(path, name):fullpath = Nonefor root, dirs, files in os.walk(path):if name in files:fullpath = '{0}/{1}'.format(root, name)breakreturn fullpathif len(sys.argv)==3:print(sys.argv[1],sys.argv[2])path=seek_file(sys.argv[1],sys.argv[2])print(path)
else:print(len(sys.argv),'err')root@bmc-oob:~# python b.py /sys/bus/i2c/devices/26-0048 in3_input
/sys/bus/i2c/devices/26-0048 in3_input
/sys/bus/i2c/devices/26-0048/hwmon/hwmon4/in3_input

在这里插入图片描述

def get_baseboard_sku():try:proc = subprocess.Popen([IPMITOOL_PATH, "raw", "0x3a", "0x10", "9", "0x1a", "1", "0x12"],stdout=subprocess.PIPE,shell=False,stderr=subprocess.STDOUT) # proc返回20stdout = proc.communicate()[0]   # b' 20\n'proc.wait()sku_str = stdout.decode()  # 20sku_bin = bin(int("0x" + sku_str.strip(), 16))[-5:]    # 0x20(十六进制 )= 32(十进制 ),bin(32) = 0b100000sku_dict = {"00001" : "ns35x","00010" : "ns34x","00100" : "ns33x","01000" : "ns32x","10000" : "ns31x"}sku = sku_dict.get(sku_bin, "")except OSError as e:raise OSError("Cannot detect platform")return sku

6.sol/mmc:emmc_info_cmd = “mmc cid read /sys/block/mmcblk0/device”,size_cmd = “cat /sys/block/mmcblk0/size”

def check_bmc_sol_test(self, also_print_console=False):self.logger.log_info("[RUN SOL TEST]:", also_print_console)expect_list = ['yes/no','password:','Password:','localhost login:','bmc-oob login:','bmc-oob. login:','root@bmc-oob:~#','root@localhost:~#',]remote = pit_util_common.remote(self.logger, self.fail_reason, self.bmc_login["usrname"],self.bmc_login["ip"], self.bmc_login["password"])ret = remote.connect(also_print_console)if ret != E.OK:return retoutput = remote.command("sol.sh", time=10, expect_list=['-----------------------------------'])self.logger.log_info(output, also_print_console)output1 = remote.command('\x15\x12\x14\x32', current=True, expect_list=expect_list)self.logger.log_info(output1, also_print_console)output2 = remote.command('\r\n', current=True, expect_list=expect_list)self.logger.log_info(output2, also_print_console)if "localhost login" in output1 or "localhost login" in output2:self.logger.log_info("Switch to CPU Pass ", also_print_console)else:ret = E.EFAILself.fail_reason.append("Switch to CPU Fail")remote.disconnect()return retoutput1 = remote.command('\x15\x12\x14\x33', current=True, expect_list=expect_list)self.logger.log_info(output1, also_print_console)output2 = remote.command('\r\n', current=True, expect_list=expect_list)self.logger.log_info(output2, also_print_console)if "bmc-oob" in output1 or "bmc-oob" in output2:self.logger.log_info("Switch to BMC Pass ", also_print_console)ret = E.OKelse:ret = E.EFAILself.fail_reason.append("Switch to BMC Fail")remote.disconnect()if ret != E.OK:self.logger.log_err("FAIL!", also_print_console)else:self.logger.log_info("PASS.", also_print_console)return retdef bmc_ping_cpu_test(self, also_print_console=False):count = 5ping_cmd = "ping %s -c %d | grep received" % (self.bmc_login["ip"], count)status, output = run_command(ping_cmd)self.logger.log_info(output, also_print_console)if output.find(" 0% packet loss") > 0:ret = E.OKelse:self.fail_reason.append("cpu ping server lost packages")ret = E.EMGMT11002return retbmc_ddr_name_cmd = "cat /proc/meminfo | awk '{print $1}'"
bmc_emmc_show_cmd = "fdisk -l | grep /dev/mmcblk0"
bmc_emmc_stress_test_cmd = "touch /var/log/emmc.test ; \echo '==emmc read stress test==' ; \(time dd if=/dev/mmcblk0 of=/dev/null bs=1M count=10 && sync) >> /var/log/emmc.log ; echo ' ' ; \echo '==emmc write stress test==' ; \(time dd if=/dev/zero of=/var/log/emmc.test bs=1M count=10 && sync) >> /var/log/emmc.log ; \rm /var/log/emmc.test"def str_to_hex(self, s):    # 把字符串转化为对应的16进制串return ' '.join([hex(ord(c)).replace('0x', '') for c in s])def hex_to_str(self, s):return ''.join([chr(i) for i in [int(b, 16) for b in s.split(' ')]])# def str2bin(s):   # bin二进制
#     return ' '.join([bin(ord(c)).replace('0b', '') for c in s])# def bin2str(s):
#     return ''.join([chr(i) for i in [int(b, 2) for b in s.split(' ')]])def replace_char(self, string, char, index):string = list(string)string[index] = charreturn ''.join(string)def modify_profile(self, also_print_console=True):ret, Before_mac = self.get_mac_address_from_tlv_eeprom(also_print_console)if ret != E.OK:return retAfter_mac = Before_mac    # 00E0EC000000for i in range(11, -1, -1): # 从11到0 (竖着打印) , 12个(相当于索引)last = After_mac[i]  # 从右向左单个遍历if last == "F":After_mac = self.replace_char(After_mac, "0", i)continueelse:last = self.str_to_hex(last)  # 字符0转为ascii码48,再转为十六进制0x30即30last = int(last) + int(self.offset["offset"]["bmc_offset"])last = str(last)last = self.hex_to_str(last)  # 函数里有split,所以last必须为str类型After_mac = self.replace_char(After_mac, last, i) # After_mac = "EFFFFFFFFFFF" , 因为下行break,只打印出一行F00000000000breaksign = 0os.chdir(self.hwsku_path)with open('fru.ini', 'r') as f:lines = []for line in f.readlines():if line != '\n':lines.append(line)f.close()with open('fru.ini', 'w') as f:for line in lines:if "bmc_base_mac_address=" in line:if sign == 1:f.write('%s' % line)continueline = "bmc_base_mac_address="+After_macf.write('%s\n' %line)sign = 1else:f.write('%s' %line)return After_mac

5.gpio/pcie:lspci,re.compile

    # "gpio":{#     "gpio504":{           			    # cpu的gpio504#         "pin":"GPIO8",                    # cpld的gpio8#         "net":"CTC7132_CPLD_JTAG_EN"      # cpld的gpio8的备注作用:使能#     },#     "gpio505":{#         "pin":"GPIO9",#         "net":"CTC7132_CPLD_JTAG_TCK_R"    # 时钟#     },#     "gpio506":{#         "pin":"GPIO10",#         "net":"CTC7132_CPLD_JTAG_TMS_R"#     },#     "gpio507":{#         "pin":"GPIO11",#         "net":"CTC7132_CPLD_JTAG_TDI_R"    # 数据输入#     },#     "gpio508":{#         "pin":"GPIO12",#         "net":"CTC7132_CPLD_JTAG_TDO"      # 数据输出#     }# }self.gpio_map = self.platform_cfg_json['gpio']def _read_gpio_pin_value(self, gpio_value_file):value = -1try:with open(gpio_value_file, "r") as f:value = f.read()except IOError as e:self.logger.log_err(str(e))return valuedef gpio_pin_check(self, also_print_console=True):if not self.gpio_map:err = "gpio conf is null!"self.fail_reason.append(err)self.logger.log_err(err, also_print_console)return E.EEXISTself.logger.log_info("[GPIO PIN CHECK]:", also_print_console)header = ["GPIO", "Pin", "Net", "Status"]status_tbl = []ret = E.OKfor gpio, desc in self.gpio_map.items():if not os.path.exists("/sys/class/gpio/{}".format(gpio)):run_command("echo {} > /sys/class/gpio/export".format(gpio.split("gpio")[1]))# find . -name export# echo 505 > export , gpio文件夹下显示gpio505文件夹 , echo 505 > unexport , gpio505文件夹消失pin_name = desc['pin']net_name = desc['net']gpio_value_file = os.path.join("/sys/class/gpio", gpio, "value")   # gpio_value_file : /sys/class/gpio/gpio504/valuevalue = self._read_gpio_pin_value(gpio_value_file)if value < 0:ret = E.EGPIO13001status = "Not_OK"err = "{} read failed!".format(gpio)self.fail_reason.append(err)else:status = "OK"status_tbl.append([gpio, pin_name, net_name, status])
# root@localhost:~# lspci -nnn -s 07:00.0    (07:00.0是fpga的bus号,fpga是pcie设备)
# 07:00.0 Memory controller [0580]: Xilinx Corporation Device [10ee:7021]# root@localhost:~# lspci -vvv -s 07:00.0    (devmem 0xfb800000 8)
# Region 0: Memory at fb800000 (32-bit, non-prefetchable) [size=4M]"pcie":{"X552":{"width":"x1","speed":"2.5GT/s","num":4}
},
"fpga":{ "FPGA1":{"num":1,  "path":"/sys/bus/platform/devices/hq_switch/FPGA","register":"scratch"}
},
"fpga_info":{"fpga_test_count": 3
},GLOBAL_VALUE1 = '0x5A'
GLOBAL_VALUE2 = '0xA5'
class PCIETC(TestCaseCommon):  #同 lpc_tcdef __init__(self, index, logger, platform_cfg_file, case_cfg_file=None):MODULE_NAME = "pcie_tc"TestCaseCommon.__init__(self, index, MODULE_NAME,logger, platform_cfg_file, case_cfg_file)self.pcie_devices = None         # defaultself.fpga_devices = None         # defaulttry:if self.platform_cfg_json and 'pcie' in self.platform_cfg_json.keys():self.pcie_devices = self.platform_cfg_json['pcie']if self.platform_cfg_json and 'fpga' in self.platform_cfg_json.keys():self.fpga_devices = self.platform_cfg_json['fpga']if self.platform_cfg_json and "fpga_info" in self.platform_cfg_json.keys():self.fpga_info = self.platform_cfg_json["fpga_info"]except Exception as e:self.logger.log_err(str(e), True)def _get_bus_dev_func(self, device):bus_dev_func = []ret, out = run_command("lspci | grep {}".format(device))for line in out.splitlines():if re.search("[0-9a-f]{2}\:[0-9a-f]{2}\.[0-9a-f]{1}", line):bus_dev_func.append(re.findall("[0-9a-f]{2}\:[0-9a-f]{2}\.[0-9a-f]{1}", line)[0])else:bus_dev_func.append(None)return bus_dev_funcdef _get_device_conf(self, busid):ret, output = run_command("lspci -s {} -vvv | grep -i LnkSta | grep Speed".format(busid))if ret or output == '':return '', ''else:speed = output.strip(" \t\n").split(',')[0].split('Speed')[1].strip()width = output.strip(" \t\n").split(',')[1].split('Width')[1].strip()return speed, widthdef check_pcie_device(self, also_print_console=False):header = ['Device', 'Bus', 'Width', 'Speed']ret = E.OKstatus_tbl = []if self.pcie_devices:for device in self.pcie_devices.keys():conf_width = self.pcie_devices[device]["width"]conf_speed = self.pcie_devices[device]["speed"]dev_num = int(self.pcie_devices[device]["num"])busid_list = self._get_bus_dev_func(device)if not busid_list:self.fail_reason.append("{} not found".format(device))ret = E.EPCI9001status_tbl.append([device, 'None', 'None', 'None'])else:if len(busid_list) != dev_num:self.logger.log_err("{} number expect {}, real {}".format(device, dev_num, len(busid_list)))self.fail_reason.append("{} number mismatch".format(device))ret = E.EPCI9001for busid in busid_list:speed, width = self._get_device_conf(busid)  ########if conf_width != width:self.fail_reason.append("{} width not matched".format(device))ret = E.EPCI9005if conf_speed != speed:self.fail_reason.append("{} speed not matched".format(device))ret = E.EPCI9004status_tbl.append([device, busid, width, speed])def fpga_device_rw_test(self, also_print_console=False):self.logger.log_info("[FPGA RW TEST]:", also_print_console)ret = E.OKif self.fpga_devices:for device in self.fpga_devices.keys():try:device_conf = self.fpga_devices.get(device)driver_path = device_conf['path']reg_file = os.path.join(driver_path, device_conf['register'])with open(reg_file, 'w') as f:f.write(GLOBAL_VALUE1)with open(reg_file, 'r') as f:value = f.read().strip()self.logger.log_info("{} write {}, read {}".format(device, GLOBAL_VALUE1, value), also_print_console)if int(value, 16) != int(GLOBAL_VALUE1, 16):ret = E.EPCI9003self.fail_reason.append("{} rw fail".format(device))with open(reg_file, 'w') as f:f.write(GLOBAL_VALUE2)with open(reg_file, 'r') as f:value = f.read().strip()self.logger.log_info("{} write {}, read {}".format(device, GLOBAL_VALUE2, value), also_print_console)if int(value, 16) != int(GLOBAL_VALUE2, 16):ret = E.EPCI9003self.fail_reason.append("{} rw fail".format(device))except Exception as e:self.logger.log_err(str(e), True)self.fail_reason.append(str(e))ret = E.EPCI9002def run_test(self, *argv):ret = self.check_pcie_device(True)if ret != E.OK:return retfor i in range(self.fpga_info["fpga_test_count"]):ret = self.fpga_device_rw_test(True)if ret != E.OK:self.logger.log_err("pcie r/w loop {} failed!".format(i + 1), True)return retreturn ret
ethtool 网卡名 :查看网卡速率,全双工
ethtool -s ethX [speed 10|100|1000] [duplex half|full]  [autoneg on|off]        
设置网口速率     10/100/1000M      设置网口半/全双工    设置网口是否自协商test_help_list = ["Please check if psu status is correct","1.correct","2.wrong",]
for item in self.test_help_list:self.logger.log_info(item, True)
choice = str(input("Please input 1 or 2: "))
value = re.compile(r'^[-+]?[0-9]+$')
result = value.match(choice)
if result:if int(choice) == 1:elif int(choice) == 2:else:def search_speed(self, speed):time.sleep(5)sta, out = run_command("ethtool eth0")pattern = "\s+Speed: (.*)\s+"result = re.findall(pattern, out)[0]if result != speed:return Falseelse:return Truedef rj45_led_test(self, also_print_console=False):ret = E.EFAILself.logger.log_info("[RJ45 LED BLINK TEST]:", also_print_console)speed_list = ["10", "100", "1000"]for speed in speed_list:cmd = "ethtool -s eth0 autoneg off speed {} duplex full"if speed == "1000":cmd = "ethtool -s eth0 autoneg on speed {} duplex full".format(speed)else:cmd = "ethtool -s eth0 autoneg off speed {} duplex full".format(speed)run_command(cmd)if not self.search_speed("{}Mb/s".format(speed)):ret = E.EFAILself.fail_reason("set eth0 speed fail.")self.logger.log_err("FAIL.", also_print_console)return retself.logger.log_info("current eth0 speed is {}Mb/s, start ping test...".format(speed), also_print_console)run_command("ping -c 20 -I eth0 {}".format(self.external_ip))choice = input("please confirm rj45 led whether blink(1 is pass, 2 is fail):")if int(choice) == 2:ret = E.ELED14010self.fail_reason.append("rj45 led fault")self.logger.log_err("FAIL.", also_print_console)return retelif int(choice) == 1:continue

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2779886.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

每日五道java面试题之java基础篇(六)

第一题&#xff1a;Java 创建对象有哪⼏种⽅式&#xff1f; Java 中有以下四种创建对象的⽅式: new 创建新对象通过反射机制采⽤ clone 机制通过序列化机制 前两者都需要显式地调⽤构造⽅法。对于 clone 机制,需要注意浅拷⻉和深拷⻉的区别&#xff0c;对于序列化机制需要明…

【二叉树】构建销毁二叉树

目录 创建二叉树 整体思路 代码实现 图示理解​ 销毁二叉树 判断二叉树是否是完全二叉树&层序 整体思路 代码实现 图是理解 二叉树的性质 题目 创建二叉树 整体思路 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树遇到#就回退&#xff0c;返回…

CTF--Web安全--SQL注入之Post-Union注入

一、手动POST注入实现绕过 账号密码检测 我们利用sqli-labs/Less-11靶场来进行演示&#xff1a; 我们可以看到一个登录页面 打开Less-11的根目录&#xff0c;我们打开页面的源代码(PHP实现)。 用VS-code打开文件&#xff0c;找到验证登录信息的代码行。 此形式的代码存在POST…

CSS基础---新手入门级详解

CSS:层叠样式表 CSS&#xff08;Cascading Style Sheets,层叠样式表&#xff09;&#xff0c;是一种用来为结构化文档添加样式&#xff08;字体、间距和颜色&#xff09;的计算机语言&#xff0c;css扩展名为.css。 实例: <!DOCTYPE html><html> <head><…

【leetcode热题100】 格雷编码

n 位格雷码序列 是一个由 2n 个整数组成的序列&#xff0c;其中&#xff1a; 每个整数都在范围 [0, 2n - 1] 内&#xff08;含 0 和 2n - 1&#xff09;第一个整数是 0一个整数在序列中出现 不超过一次每对 相邻 整数的二进制表示 恰好一位不同 &#xff0c;且第一个 和 最后一…

DVWA靶场下载安装

DVWA介绍 DVWA 一共包含了十个攻击模块&#xff0c;分别是:Brute Force(暴力破解)、Command Injection(命令行注入)、CSRF(跨站请求伪造)、File Inclusion(文件包含)、File Upload(文件上传)、Insecure CAPTCHA (不安全的验证码)、SQL Injection(SQL注入)、SQL Injection Blin…

基于微信小程序的在线课堂的研究与实现,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

书生谱语-全链条开发工具

书生谱语全链条开发体系 包含&#xff1a;数据、模型预训练、模型微调、模型量化部署、模型测评、模型场景应用全链路开发体系 github链接 通用大模型 国内外大语言模型快速发展&#xff0c;涌现了大量的大语言模型以及一批创业公司 深度学习模型的发展 大模型利用多模态优势…

PLC在物联网中位置—承上启下,与上位机下位机的关联。

谈到物联网&#xff0c;就绕不开PLC&#xff0c;本文着重介绍PLC的定义、与单片机的区分&#xff0c;价值、物联网中的位置&#xff0c;以及和上位机、下位机的关联&#xff0c;让友友们对PLC有个全面的认知。 一、什么是PLC PLC是可编程逻辑控制器&#xff08;Programmable L…

ArcGIS学习(七)图片数据矢量化

ArcGIS学习(七)图片数据矢量化 通过上面几个任务的学习,大家应该已经掌握了ArcGIS的基础操作,并且学习了坐标系和地理数据库这两个非常重要且稍微难一些的专题。从这一任务开始,让我们进入到实战案例板块。 首先进入第一个案例一一图片数据矢量化。 我们在平时的工作学…

使用C++从零开始,自己写一个MiniWeb

第一步&#xff1a;新建项目 1、打开VS点击创建新项目 2、选择空项目并点下一步&#xff08;切记不能选错项目类型&#xff09; 3、填写项目名称和路径&#xff0c;点击创建即可 新建好后项目是这样的比较干净 4、右击源文件&#xff0c;点击添加&#xff0c;新建http.cpp文件…

Java的接口

目录 1.接口的概念 2.语法规则 3.接口的使用 4.接口的特性 总结&#xff1a; 5.实现多个接口 6.接口间的继承 1.接口的概念 接口就是公共的行为规范标准&#xff0c;大家在实现时&#xff0c;只要符合规范标准&#xff0c;就可以通用。 在Java中&#xff0c;接口可以看成…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之AlphabetIndexer组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之AlphabetIndexer组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、AlphabetIndexer组件 可以与容器组件联动用于按逻辑结构快速定位容器显…

elasticsearch增删改查

一、数据类型 1、字符串类型 &#xff08;1&#xff09;text &#xff08;2&#xff09;keyword 2、数值类型 &#xff08;1&#xff09;long、integer、short、byte、float、double 3、日期类型 &#xff08;1&#xff09;date 4、布尔类型 &#xff08;1&#xff0…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Blank组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Blank组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Blank组件 空白填充组件&#xff0c;在容器主轴方向上&#xff0c;空白填充组件具…

JavaScript中的for循环和map方法

JavaScript中的for循环和map方法 在JavaScript中&#xff0c;循环是一种常见的编程技巧&#xff0c;用于重复执行一段代码。for循环和map方法都可以用于循环操作&#xff0c;但它们在语法和应用场景上存在一些区别。本文将详细讲解JavaScript中的for循环和map方法&#xff0c;以…

第80讲订单管理功能实现

后端 <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace"com.java1234.mapper.OrderM…

文件上传总结:用原生解决前端文件上传操作(单个,多个,大文件切片)

目录 第一章 前言 第二章 理解文件上传的对象 2.1 如何利用原生实现 2.2 认识理解文件上传的四个对象 2.2.1 file对象 2.2.2 blob对象 2.2.3 formData对象 2.2.4 fileReader对象 2.2.4.1 了解fileReader对象基本属性 2.2.4.2 了解 fileReader对象基本方法 2.2.4.3…

【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏17(附项目源码)

本节最终效果演示 文章目录 本节最终效果演示系列目录前言制作木板UI直接复制和工具一样的即可检查背包是否有指定数量的空插槽 源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第23篇…

Solidworks:平面工程图练习

把草图变成工程图&#xff0c;遇到第一个问题是线宽需要用鼠标选中后再设置线宽和颜色。我觉得应该有一个自动设置现款的功能&#xff0c;不知道有没有&#xff0c;我找了半天也没找到。 另一个问题是&#xff0c;作业代号字体上下颠倒了&#xff0c;不知道这是啥意思。 第三个…