122 lines
3.7 KiB
Python
122 lines
3.7 KiB
Python
|
|
from .link_rx_caps import LinkDisplayPortCaps
|
||
|
|
from .link_rx_status import *
|
||
|
|
from UniTAP.libs.lib_tsi.tsi_io import PortIO
|
||
|
|
from .dp_cable_info import DpCableInfo, CableCapabilitiesEnum
|
||
|
|
from .link_rx_aux_controller import DisplayPortAUXController
|
||
|
|
from UniTAP.dev.ports.modules.dpcd import DPCDRegisters
|
||
|
|
|
||
|
|
|
||
|
|
class LinkDisplayPortRx:
|
||
|
|
"""
|
||
|
|
Class `LinkDisplayPortRx` contains information about DP link.
|
||
|
|
- Read link status `status`.
|
||
|
|
- Configure and read link capabilities `capabilities`.
|
||
|
|
- Make `hpd_pulse`.
|
||
|
|
- Assert/Deassert HPD state `set_assert_state`.
|
||
|
|
- Read and write scrambler seed value `scrambler_seed`.
|
||
|
|
"""
|
||
|
|
def __init__(self, port_io: PortIO, hw_caps: DPRXHWCaps, dpcd: DPCDRegisters):
|
||
|
|
self.__io = port_io
|
||
|
|
self.__HW_CAPS = hw_caps
|
||
|
|
self.__status = LinkDisplayPortStatusSink(port_io, self.__HW_CAPS)
|
||
|
|
self.__capabilities = LinkDisplayPortCaps(port_io, self.__HW_CAPS)
|
||
|
|
self.__cable_info = DpCableInfo(port_io, TSI_DPRX_CABLE_ATTRIBUTES_R)
|
||
|
|
self.__aux_controller = DisplayPortAUXController(port_io, dpcd)
|
||
|
|
|
||
|
|
@property
|
||
|
|
def status(self) -> LinkDisplayPortStatusSink:
|
||
|
|
"""
|
||
|
|
Returns object of class `LinkDisplayPortStatusSink` for working with link status.
|
||
|
|
|
||
|
|
Returns:
|
||
|
|
object of `LinkDisplayPortStatusSink` type
|
||
|
|
"""
|
||
|
|
return self.__status
|
||
|
|
|
||
|
|
@property
|
||
|
|
def capabilities(self) -> LinkDisplayPortCaps:
|
||
|
|
"""
|
||
|
|
Returns object of class `LinkDisplayPortCaps` for working with link capabilities.
|
||
|
|
|
||
|
|
Returns:
|
||
|
|
object of `LinkDisplayPortStatusSink` type
|
||
|
|
"""
|
||
|
|
return self.__capabilities
|
||
|
|
|
||
|
|
@property
|
||
|
|
def aux_controller(self) -> DisplayPortAUXController:
|
||
|
|
"""
|
||
|
|
Returns object of class `DisplayPortAUXController` for working with DP AUX Controller.
|
||
|
|
|
||
|
|
Returns:
|
||
|
|
object of `DisplayPortAUXController` type
|
||
|
|
"""
|
||
|
|
return self.__aux_controller
|
||
|
|
|
||
|
|
def hpd_pulse(self, duration_us: int = 500000):
|
||
|
|
"""
|
||
|
|
Start HPD pulse.
|
||
|
|
|
||
|
|
Args:
|
||
|
|
duration_us (int)
|
||
|
|
"""
|
||
|
|
self.__io.set(TSI_DPRX_HPD_PULSE_W, duration_us, c_int)
|
||
|
|
|
||
|
|
def set_assert_state(self, state: bool):
|
||
|
|
"""
|
||
|
|
Assert/Deassert HPD state.
|
||
|
|
|
||
|
|
Args:
|
||
|
|
state (bool)
|
||
|
|
"""
|
||
|
|
val = 0x1 if state else 0x0
|
||
|
|
self.__io.set(TSI_FORCE_HOT_PLUG_STATE_W, val)
|
||
|
|
|
||
|
|
@property
|
||
|
|
def scrambler_seed(self) -> int:
|
||
|
|
"""
|
||
|
|
Returns scrambler seed value.
|
||
|
|
|
||
|
|
Returns:
|
||
|
|
object of `int` type
|
||
|
|
"""
|
||
|
|
if not self.__HW_CAPS.scrambler_seed:
|
||
|
|
warnings.warn("Scrambler Seed is not supported.")
|
||
|
|
return 0
|
||
|
|
|
||
|
|
return self.__io.get(TSI_DPRX_SCR_SEED, c_uint32)[1]
|
||
|
|
|
||
|
|
@scrambler_seed.setter
|
||
|
|
def scrambler_seed(self, value: int = 0):
|
||
|
|
"""
|
||
|
|
Write new value to scrambler seed
|
||
|
|
|
||
|
|
Args:
|
||
|
|
value (int) - new scrambler seed value
|
||
|
|
"""
|
||
|
|
if value < 0 or value > 65535:
|
||
|
|
raise ValueError(f"Scrambler seed {value} is not available.")
|
||
|
|
|
||
|
|
if self.__HW_CAPS.scrambler_seed:
|
||
|
|
self.__io.set(TSI_DPRX_SCR_SEED, value)
|
||
|
|
else:
|
||
|
|
warnings.warn("Scrambler Seed is not supported.")
|
||
|
|
|
||
|
|
def cable_rx_type(self) -> CableCapabilitiesEnum:
|
||
|
|
"""
|
||
|
|
Get cable type from the RX side.
|
||
|
|
|
||
|
|
Returns:
|
||
|
|
object of `CableCapabilitiesEnum` type
|
||
|
|
"""
|
||
|
|
return self.__cable_info.get_current_port_cable_type()
|
||
|
|
|
||
|
|
def cable_tx_type(self) -> CableCapabilitiesEnum:
|
||
|
|
"""
|
||
|
|
Get cable type from the TX side.
|
||
|
|
|
||
|
|
Returns:
|
||
|
|
object of `CableCapabilitiesEnum` type
|
||
|
|
"""
|
||
|
|
return self.__cable_info.get_another_port_cable_type()
|