133 lines
4.9 KiB
Python
133 lines
4.9 KiB
Python
from UniTAP.libs.lib_tsi.tsi_io import PortIO
|
|
from UniTAP.libs.lib_tsi.tsi import *
|
|
from .pr_types import *
|
|
from .pr_private_types import *
|
|
|
|
|
|
class PanelReplayConfig:
|
|
"""
|
|
Class `PanelReplayConfig` contains information about Panel Replay Configuration.
|
|
- Set configuration object `PrSettings`, function `set`.
|
|
- Get configuration object `PrSettings`, function `get`.
|
|
"""
|
|
|
|
def __init__(self, port_io: PortIO, pg_caps):
|
|
self.__io = port_io
|
|
self.__y_granularity_list = [e for e in YGranularity]
|
|
|
|
self.__mode_list = []
|
|
if pg_caps.flags.panel_replay:
|
|
self.__mode_list.append(PRMode.PR)
|
|
if pg_caps.flags.psr:
|
|
self.__mode_list.append(PRMode.PSR1)
|
|
self.__mode_list.append(PRMode.PSR2)
|
|
|
|
@property
|
|
def pr_caps(self):
|
|
return self.__read_caps()
|
|
|
|
def set(self, config: PrSettings):
|
|
"""
|
|
Write new configuration.
|
|
|
|
Args:
|
|
config (PrSettings).
|
|
"""
|
|
caps = self.pr_caps
|
|
|
|
self.__io.set(TSI_PG_STREAM_SELECT, 0)
|
|
pr_config, _ = self.__read_config()
|
|
|
|
pr_config.early_transport = config.flags.early_transport if caps.pr_flags().early_transport else 0
|
|
pr_config.crc_in_vsc_sdp = config.flags.crc_in_vsc_sdp if caps.pr_flags().crc_sel_update else 0
|
|
pr_config.hpd_irq_as_sdp = config.flags.hpd_irq
|
|
pr_config.hpd_irq_vsc_sdp = config.flags.hpd_irq_vsc_sdp
|
|
pr_config.hpd_irq_rfb = config.flags.hpd_irq_rfb
|
|
pr_config.hpd_irq_crc = config.flags.hpd_irq_crc
|
|
pr_config.self_refresh = config.flags.refresh_rate_unlock
|
|
pr_config.ext_y_granularity = config.flags.ext_y_gran
|
|
pr_config.main_link_on = config.flags.main_link_remain_on
|
|
|
|
if config.flags.y_granularity in self.get_available_y_granularity_values():
|
|
y_gran_value = (caps.pr_flags().y_gran_value & (1 << config.flags.y_granularity.value)) > 0
|
|
pr_config.y_gran_value = 1 << config.flags.y_granularity.value if y_gran_value else 0
|
|
|
|
if config.flags.mode in self.__mode_list:
|
|
pr_config.mode = config.flags.mode.value
|
|
|
|
data = [pr_config.value]
|
|
for item in config.regions:
|
|
region = RegionConfig(0)
|
|
region.value = item
|
|
data.extend(region.value)
|
|
self.__io.set(TSI_PG_PR_CFG, data, data_count=len(data))
|
|
|
|
def get(self) -> PrSettings:
|
|
"""
|
|
Returns current Panel Replay Configuration.
|
|
|
|
Returns:
|
|
object of `PrSettings` type
|
|
"""
|
|
pr_config, pr_regions = self.__read_config()
|
|
pr_settings = PrSettings()
|
|
pr_settings.flags = Flags(early_transport=pr_config.early_transport == 1,
|
|
crc_in_vsc_sdp=pr_config.crc_in_vsc_sdp == 1,
|
|
pr_mode=PRMode(pr_config.mode),
|
|
hpd_irq=pr_config.hpd_irq_as_sdp == 1,
|
|
hpd_irq_vsc_sdp=pr_config.hpd_irq_vsc_sdp == 1,
|
|
hpd_irq_rfb=pr_config.hpd_irq_rfb == 1,
|
|
hpd_irq_crc=pr_config.hpd_irq_crc == 1,
|
|
refresh_rate_unlock=pr_config.self_refresh == 1,
|
|
ext_y_gran=pr_config.ext_y_granularity == 1,
|
|
main_link_remain_on=pr_config.main_link_on == 1)
|
|
|
|
value = pr_config.y_gran_value
|
|
bit_number = 0
|
|
|
|
while value:
|
|
if value & 0x1:
|
|
pr_settings.y_granularity = YGranularity(bit_number)
|
|
break
|
|
bit_number += 1
|
|
value >>= 1
|
|
|
|
pr_settings.regions = pr_regions
|
|
return pr_settings
|
|
|
|
def get_available_y_granularity_values(self) -> List[YGranularity]:
|
|
"""
|
|
Get available values for Y Granularity.
|
|
|
|
Returns:
|
|
list of `YGranularity` type
|
|
"""
|
|
caps = self.pr_caps
|
|
gran_list = []
|
|
|
|
for i, enum_value in enumerate(YGranularity):
|
|
if caps.pr_flags().y_gran_value >> i & 0x1:
|
|
gran_list.append(enum_value)
|
|
|
|
return gran_list
|
|
|
|
def __read_config(self):
|
|
caps = self.pr_caps
|
|
|
|
self.__io.set(TSI_PG_STREAM_SELECT, 0)
|
|
result = self.__io.get(TSI_PG_PR_CFG, c_uint32, caps.calculate_size())[1]
|
|
if not isinstance(result, list):
|
|
result = [0]
|
|
pr_config = PrConfig(result[0])
|
|
pr_regions = []
|
|
for i in range(1, len(result) - 1, 2):
|
|
pr_regions.append(RegionConfig(result[i] & 0xFFFF,
|
|
result[i] >> 16 & 0xFFFF,
|
|
result[i + 1] & 0xFFFF,
|
|
result[i + 1] >> 16 & 0xFFFF))
|
|
return pr_config, pr_regions
|
|
|
|
def __read_caps(self) -> PRCaps:
|
|
self.__io.set(TSI_PG_STREAM_SELECT, 0)
|
|
return self.__io.get(TSI_PG_PR_CAPS_R, PRCaps)[1]
|