92 lines
2.7 KiB
Python
92 lines
2.7 KiB
Python
|
|
#
|
||
|
|
# Import UniTAP module.
|
||
|
|
#
|
||
|
|
|
||
|
|
import UniTAP
|
||
|
|
import time
|
||
|
|
|
||
|
|
#
|
||
|
|
# To initialize UniTAP library wrapper user should create UniTAP.TsiLib() object.
|
||
|
|
#
|
||
|
|
lUniTAP = UniTAP.TsiLib()
|
||
|
|
|
||
|
|
#
|
||
|
|
# For opening device, please, put serial number of the device as 8 symbol str or put index of device.
|
||
|
|
#
|
||
|
|
# dev = lUniTAP.open("NNNNNNNN")
|
||
|
|
dev = lUniTAP.open(0)
|
||
|
|
|
||
|
|
# After opening device as in UCD Console device role should be selected.
|
||
|
|
|
||
|
|
role = dev.select_role(UniTAP.dev.UCD400.DPSourceDPSink)
|
||
|
|
# role = dev.select_role(UniTAP.dev.UCD500.DPSourceDPSink)
|
||
|
|
|
||
|
|
timing_manager = role.dptx.pg.timing_manager
|
||
|
|
|
||
|
|
color_mode = UniTAP.ColorInfo()
|
||
|
|
color_mode.color_format = UniTAP.ColorInfo.ColorFormat.CF_RGB
|
||
|
|
color_mode.bpc = 8
|
||
|
|
color_mode.colorimetry = UniTAP.ColorInfo.Colorimetry.CM_sRGB
|
||
|
|
|
||
|
|
timings = [timing_manager.get_cta(16),
|
||
|
|
timing_manager.get_cta(12),
|
||
|
|
timing_manager.get_cta(1),
|
||
|
|
timing_manager.get_cta(19)]
|
||
|
|
|
||
|
|
# Also, possible to select timing with using functions: 'get_dmt', 'get_cvt', 'get_by_list_index', 'get_all'
|
||
|
|
|
||
|
|
# Print all available timings
|
||
|
|
print(timing_manager.print_all())
|
||
|
|
|
||
|
|
#
|
||
|
|
# If you want to select pattern, you need to use enum 'VideoPattern' from UniTAP.
|
||
|
|
# Like this: UniTAP.VideoPattern.ColorRamp
|
||
|
|
#
|
||
|
|
|
||
|
|
# Iterate for each available streams
|
||
|
|
for i in range(role.dptx.pg.max_stream_count):
|
||
|
|
video_mode = UniTAP.VideoMode(timing=timings[i], color_info=color_mode)
|
||
|
|
role.dptx.pg[i].set_vm(vm=video_mode)
|
||
|
|
role.dptx.pg[i].set_pattern(pattern=UniTAP.VideoPattern.ColorRamp if i == 0 else UniTAP.VideoPattern.SolidGreen)
|
||
|
|
role.dptx.pg[i].apply()
|
||
|
|
res_app = role.dptx.pg[i].status().error
|
||
|
|
print(f"Stream {i} - Apply {res_app.__str__()}")
|
||
|
|
|
||
|
|
#
|
||
|
|
# After configure Pattern Generators, MST should be enabled in link module as well as selected
|
||
|
|
# stream count
|
||
|
|
#
|
||
|
|
|
||
|
|
cfg = role.dptx.link.config.get()
|
||
|
|
cfg.mst = True
|
||
|
|
cfg.mst_stream_count = 4
|
||
|
|
role.dptx.link.config.set(cfg)
|
||
|
|
role.dptx.link.start_link_training()
|
||
|
|
|
||
|
|
cfg = role.dprx.link.capabilities.link_caps_status()
|
||
|
|
cfg.mst = True
|
||
|
|
cfg.dp_128_132_bitrates = None
|
||
|
|
cfg.override_10g = None
|
||
|
|
role.dprx.link.capabilities.set(cfg)
|
||
|
|
role.dprx.link.hpd_pulse()
|
||
|
|
#
|
||
|
|
# Just random sleep, to be sure that Sink get video
|
||
|
|
#
|
||
|
|
time.sleep(2)
|
||
|
|
|
||
|
|
for i in range(role.dptx.pg.max_stream_count):
|
||
|
|
res = role.dprx.link.status.stream(i).video_mode.timing == timings[i]
|
||
|
|
print(f'Stream {i}\n'
|
||
|
|
f'Reference timing: {timings[i]}. '
|
||
|
|
f'Received timing RX: {role.dprx.link.status.stream(i).video_mode.timing}.\n'
|
||
|
|
f'Result: {res}')
|
||
|
|
|
||
|
|
#
|
||
|
|
# Since the 3.5 version, TsiLib and TSIDevice objects have the option to be closed earlier.
|
||
|
|
# TSIDevice can be closed with the TsiLib method close(). TsiLib can be closed with cleanup().
|
||
|
|
# Clean up will close all opened devices and block ability to open any devices
|
||
|
|
# with same TsiLib object.
|
||
|
|
#
|
||
|
|
lUniTAP.close(dev)
|
||
|
|
|
||
|
|
lUniTAP.cleanup()
|