1.1.0版本
This commit is contained in:
132
UniTAP/dev/ports/modules/panel_replay/pr_config.py
Normal file
132
UniTAP/dev/ports/modules/panel_replay/pr_config.py
Normal file
@@ -0,0 +1,132 @@
|
||||
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]
|
||||
Reference in New Issue
Block a user