138 lines
5.2 KiB
ReStructuredText
138 lines
5.2 KiB
ReStructuredText
=======================================
|
|
Python Examples for RAD-Epsilon Devices
|
|
=======================================
|
|
|
|
|
|
|
|
Working with PHY Settings
|
|
=========================
|
|
|
|
.. code-block:: python
|
|
|
|
import sys
|
|
import icsneopy
|
|
|
|
|
|
class PhyStaticInfo:
|
|
|
|
def __init__(self, index, type, switch_port):
|
|
self.index = index
|
|
self.type = type
|
|
self.switch_port = switch_port
|
|
|
|
def __repr__(self):
|
|
return f"{self.switch_port}: Type {self.type} / Index {self.index}"
|
|
|
|
|
|
# Switch Port name to PHY index and PHY type
|
|
RAD_EPSILON_PHY_INFO = {
|
|
"1": PhyStaticInfo(0, "88Q2112", "1"),
|
|
"2": PhyStaticInfo(1, "88Q2112", "2"),
|
|
"3": PhyStaticInfo(2, "88Q2112", "3"),
|
|
"4": PhyStaticInfo(3, "88Q2112", "4"),
|
|
"5": PhyStaticInfo(4, "88Q2112", "5"),
|
|
"6": PhyStaticInfo(5, "88Q2112", "6"),
|
|
"9": PhyStaticInfo(6, "88Q2112", "9"),
|
|
"10": PhyStaticInfo(7, "88Q2112", "10")
|
|
}
|
|
|
|
RAD_EPSILON_XL_PHY_INFO = {
|
|
"A1": PhyStaticInfo(0, "88Q222x", "A1"),
|
|
"A2": PhyStaticInfo(1, "88Q222x", "A2"),
|
|
"A3": PhyStaticInfo(2, "88Q222x", "A3"),
|
|
"A4": PhyStaticInfo(3, "88Q222x", "A4"),
|
|
"A5": PhyStaticInfo(4, "88Q222x", "A5"),
|
|
"A6": PhyStaticInfo(5, "88Q222x", "A6"),
|
|
"A11": PhyStaticInfo(6, "88Q222x", "A11"),
|
|
"A8": PhyStaticInfo(7, "88Q222x", "A8"),
|
|
"B1": PhyStaticInfo(8, "88Q222x", "B1"),
|
|
"B2": PhyStaticInfo(9, "88Q222x", "B2"),
|
|
"B3": PhyStaticInfo(10, "88Q222x", "B3"),
|
|
"B4": PhyStaticInfo(11, "88Q222x", "B4"),
|
|
"B5": PhyStaticInfo(12, "88Q222x", "B5"),
|
|
"B6": PhyStaticInfo(13, "88Q222x", "B6"),
|
|
"B7": PhyStaticInfo(14, "88Q222x", "B7"),
|
|
"B8": PhyStaticInfo(15, "88Q222x", "B8"),
|
|
"A9": PhyStaticInfo(16, "88X3310", "A9"),
|
|
"B9": PhyStaticInfo(17, "88X3310", "B9"),
|
|
}
|
|
|
|
|
|
def find_specific_device(type: icsneopy.DeviceType.Enum, serial: str | None = None) -> icsneopy.Device | None:
|
|
devices = icsneopy.find_all_devices()
|
|
for device in devices:
|
|
device_type = device.get_type().get_device_type()
|
|
if serial: # always find by serial if specified
|
|
if device.get_serial() == serial:
|
|
return device
|
|
elif device_type == type:
|
|
return device
|
|
return None
|
|
|
|
|
|
def find_rad_epsilonxl(serial: str | None = None) -> icsneopy.Device | None:
|
|
return find_specific_device(icsneopy.DeviceType.Enum.RADEpsilonXL, serial)
|
|
|
|
|
|
def find_rad_epsilon(serial: str | None = None) -> icsneopy.Device | None:
|
|
return find_specific_device(icsneopy.DeviceType.Enum.RADEpsilon, serial)
|
|
|
|
|
|
def report_phy_settings(device: icsneopy.Device, phy: PhyStaticInfo) -> bool:
|
|
phy_enable = device.settings.get_phy_enable(phy.index)
|
|
phy_mode = device.settings.get_phy_mode(phy.index)
|
|
phy_speed = device.settings.get_phy_speed(phy.index)
|
|
if phy_enable is None or phy_mode is None or phy_speed is None:
|
|
print(f"failed to get settings for PHY{phy.index} on port {phy.switch_port}")
|
|
print(f"PHY {phy.index} ({phy.type})")
|
|
print(f"\tPort: {phy.switch_port}")
|
|
print(f"\tEnabled: {'TRUE' if phy_enable else 'FALSE'}")
|
|
print(f"\tMode: {phy_mode}")
|
|
print(f"\tSpeed: {phy_speed}")
|
|
return True
|
|
|
|
def configure_phy(device: icsneopy.Device, phy: PhyStaticInfo, enable: bool, mode: int, speed: int) -> bool:
|
|
if not device.settings.set_phy_enable(phy.index, enable):
|
|
print(f"failed to set enable for PHY{phy.index} at port {phy.switch_port}")
|
|
return False
|
|
if not device.settings.set_phy_mode(phy.index, mode):
|
|
print(f"failed to set mode for PHY{phy.index} at port {phy.switch_port}")
|
|
return False
|
|
if not device.settings.set_phy_speed(phy.index, speed):
|
|
print(f"failed to set speed for PHY{phy.index} at port {phy.switch_port}")
|
|
return False
|
|
if not device.settings.apply(True):
|
|
print(f"failed to apply settings")
|
|
print(icsneopy.get_last_error())
|
|
return False
|
|
print(f"Successfully set settings for PHY{phy.index} at port {phy.switch_port}")
|
|
return True
|
|
|
|
|
|
# find the first RAD-EpsilonXL
|
|
device = find_rad_epsilonxl()
|
|
if not device:
|
|
print("failed to find a RAD-EpsilonXL to open")
|
|
sys.exit(-1)
|
|
if not device.open():
|
|
print(f"Failed to open {device.describe()}")
|
|
print(icsneopy.get_last_error())
|
|
sys.exit(-1)
|
|
print(f"Opened {device.describe()}")
|
|
print("Applying default settings")
|
|
if not device.settings.apply_defaults():
|
|
print(icsneopy.get_last_error())
|
|
sys.exit(-1)
|
|
print("Reporting PHY settings")
|
|
for phy in RAD_EPSILON_XL_PHY_INFO.values():
|
|
report_phy_settings(device, phy)
|
|
# Setting Port A1 to Master mode, enabled, 1G speed
|
|
phy = RAD_EPSILON_XL_PHY_INFO["A1"]
|
|
if configure_phy(device, phy, True, icsneopy.Settings.EthernetLinkMode.Master, icsneopy.Settings.EthernetLinkSpeed.Speed1G) and device.settings.refresh(True):
|
|
report_phy_settings(device, phy) # report them back
|
|
else:
|
|
print(icsneopy.get_last_error())
|
|
sys.exit(-1)
|
|
device.close()
|
|
|