sonic-buildimage/platform/broadcom/sonic-platform-modules-brcm-xlr-gts/utils/brcm-xlr-gts-create-eeprom-file.py

106 lines
3.1 KiB
Python
Raw Normal View History

#!/usr/bin/python
# Since the XLR/GTS cards do not have an EEPROM, we create a file which
# will be use like an EEPROM.
import sys
import struct
from ctypes import *
import os
TLV_CODE_PRODUCT_NAME = 0x21
TLV_CODE_SERIAL_NUMBER = 0x23
TLV_CODE_MAC_BASE = 0x24
TLV_CODE_PLATFORM_NAME = 0x28
TLV_CODE_ONIE_VERSION = 0x29
TLV_CODE_MANUF_NAME = 0x2B
TLV_CODE_CRC_32 = 0xFE
def getmac(interface):
try:
mac = open('/sys/class/net/'+interface+'/address').readline()
except:
mac = "00:00:00:00:00:00"
return mac[0:17]
class TLVINFO_HEADER(Structure):
_fields_ = [("signature", c_char*8),
("version", c_ubyte),
("totallen", c_ushort)]
def dump(self):
return struct.pack('8s', self.signature) + \
struct.pack('B', self.version) + \
struct.pack('>H', self.totallen)
class TLVINFO_DATA:
data = [];
def add_tlv_str(self, type, value):
self.data.append(struct.pack('B', type) + struct.pack('B', len(value)) + value.encode())
def add_tlv_mac(self, type, value):
self.data.append(struct.pack('B', type) + struct.pack('B', len(value)))
for v in value:
self.data.append(struct.pack('B', int(v, 16)))
def dump(self):
r = '';
for m in self.data:
r += bytes(m)
return r + struct.pack('B', TLV_CODE_CRC_32) + struct.pack('B', 4)
def crc32(crc, p, len):
crc = 0xffffffff & ~crc
for i in range(len):
crc = crc ^ p[i]
for j in range(8):
crc = (crc >> 1) ^ (0xedb88320 & -(crc & 1))
return 0xffffffff & ~crc
def crc(header, data):
r = '';
for m in header:
r += bytes(m)
for m in data:
r += bytes(m)
c = crc32(0, bytearray(r), len(r))
s = struct.pack('>I', c)
return s
def main():
tlvinfo_header = TLVINFO_HEADER('TlvInfo', 1, 0)
tlvinfo_data = TLVINFO_DATA()
tlvinfo_data.add_tlv_str(TLV_CODE_SERIAL_NUMBER, 'S/N')
onie_machine = os.popen("cat /host/machine.conf | grep 'onie_machine=' | sed 's/onie_machine=//'").read().strip()
if onie_machine == 'bcm_xlr':
tlvinfo_data.add_tlv_str(TLV_CODE_PRODUCT_NAME, 'BCM9COMX2XMC')
else:
tlvinfo_data.add_tlv_str(TLV_CODE_PRODUCT_NAME, 'Unknown')
tlvinfo_data.add_tlv_str(TLV_CODE_MANUF_NAME, 'Broadcom')
eth0_mac_str = getmac('eth0')
eth0_mac = eth0_mac_str.split(':')
tlvinfo_data.add_tlv_mac(TLV_CODE_MAC_BASE, eth0_mac)
brcm_dev = os.popen("lspci | grep -m1 'Ethernet controller: Broadcom ' | grep 'Device' | sed 's/(.*//' | awk '{print $NF}'").read().strip()
if brcm_dev == 'b960':
tlvinfo_data.add_tlv_str(TLV_CODE_PLATFORM_NAME, 'BCM956960K')
onie_version = os.popen("cat /host/machine.conf | grep 'onie_version' | sed 's/onie_version=//'").read().strip()
tlvinfo_data.add_tlv_str(TLV_CODE_ONIE_VERSION, onie_version)
tlvinfo_header.totallen = len(tlvinfo_data.dump())+4;
try:
f = open('/etc/sys_eeprom.bin', 'w+')
f.write(tlvinfo_header.dump())
f.write(tlvinfo_data.dump())
f.write(crc(tlvinfo_header.dump(), tlvinfo_data.dump()))
f.close()
except:
print('Unable to write file /etc/sys_eeprom.bin')
if __name__== "__main__":
main()