更新UCD-API库及文档
This commit is contained in:
@@ -1,9 +1,10 @@
|
||||
import warnings
|
||||
from typing import Optional, Union
|
||||
from ctypes import c_int
|
||||
from typing import Optional, Union, Type
|
||||
import UniTAP.libs.lib_tsi.tsi_types as ci
|
||||
|
||||
from UniTAP.libs.lib_tsi.tsi_io import PortIO, PortProtocol
|
||||
from .types import *
|
||||
from UniTAP.libs.lib_tsi.tsi import c_int
|
||||
|
||||
|
||||
class HdcpSinkStatus:
|
||||
@@ -77,7 +78,7 @@ class HdcpSinkStatus:
|
||||
|
||||
def __read_status(self, mode: HdcpMode) -> int:
|
||||
if mode == HdcpMode.Mode1_4:
|
||||
return self.__io.get(TSI_HDCP_1X_STATUS_R, c_int)[1]
|
||||
return self.__io.get(ci.TSI_HDCP_1X_STATUS_R, c_int)[1]
|
||||
else:
|
||||
return self.__io.get(self.__ci_status_control, c_int)[1]
|
||||
|
||||
@@ -164,7 +165,7 @@ class HdcpSinkConfig:
|
||||
if keys == HdcpSink2XKeys.Production and not self.__caps_2x.production_keys_available:
|
||||
warnings.warn("Production keys is not hw supported. Please, select another keys.")
|
||||
|
||||
self.__io.set(TSI_HDCP_1X_COMMAND_W if hdcp_mode == HdcpMode.Mode1_4 else TSI_HDCP_2X_COMMAND_W, keys.value)
|
||||
self.__io.set(ci.TSI_HDCP_1X_COMMAND_W if hdcp_mode == HdcpMode.Mode1_4 else ci.TSI_HDCP_2X_COMMAND_W, keys.value)
|
||||
|
||||
def __set_capable(self, value: Optional[bool], hdcp_mode: HdcpMode):
|
||||
if value is None:
|
||||
@@ -172,9 +173,10 @@ class HdcpSinkConfig:
|
||||
if not self.__full_check(hdcp_mode):
|
||||
return
|
||||
|
||||
self.__io.set(TSI_HDCP_1X_COMMAND_W if hdcp_mode == HdcpMode.Mode1_4 else TSI_HDCP_2X_COMMAND_W,
|
||||
(H1_SINK_SET_CAPABLE if value else H1_SINK_CLEAR_CAPABLE)
|
||||
if hdcp_mode == HdcpMode.Mode1_4 else (H2_SINK_SET_CAPABLE if value else H2_SINK_CLEAR_CAPABLE))
|
||||
self.__io.set(ci.TSI_HDCP_1X_COMMAND_W if hdcp_mode == HdcpMode.Mode1_4 else ci.TSI_HDCP_2X_COMMAND_W,
|
||||
(ci.H1_SINK_SET_CAPABLE if value else ci.H1_SINK_CLEAR_CAPABLE)
|
||||
if hdcp_mode == HdcpMode.Mode1_4 else (
|
||||
ci.H2_SINK_SET_CAPABLE if value else ci.H2_SINK_CLEAR_CAPABLE))
|
||||
|
||||
def __full_check(self, hdcp_mode: HdcpMode) -> bool:
|
||||
if hdcp_mode == HdcpMode.Unknown:
|
||||
@@ -239,7 +241,7 @@ class HdcpSink:
|
||||
|
||||
def __read_hw_caps(self, mode: HdcpMode, ci_caps_control: int = 0) -> int:
|
||||
if mode == HdcpMode.Mode1_4:
|
||||
return self.__io.get(TSI_HDCP_1X_STATUS_R, c_int)[1]
|
||||
return self.__io.get(ci.TSI_HDCP_1X_STATUS_R, c_int)[1]
|
||||
elif mode == HdcpMode.Mode2_3:
|
||||
return self.__io.get(ci_caps_control, c_int)[1]
|
||||
else:
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
import warnings
|
||||
from typing import Optional, Union
|
||||
from typing import Optional, Union, Type
|
||||
|
||||
from UniTAP.libs.lib_tsi.tsi_io import PortIO, PortProtocol
|
||||
from .types import *
|
||||
from UniTAP.libs.lib_tsi.tsi_private_types import *
|
||||
from ctypes import c_int
|
||||
import UniTAP.libs.lib_tsi.tsi_types as ci
|
||||
import UniTAP.libs.lib_tsi.tsi_private_types as p_ci
|
||||
from ctypes import c_int, c_uint32
|
||||
|
||||
|
||||
class HdcpSourceStatus:
|
||||
@@ -52,10 +53,18 @@ class HdcpSourceStatus:
|
||||
if self.__caps_1x.hw_supported:
|
||||
status_value = self.__read_status(HdcpMode.Mode1_4)
|
||||
status = HdcpStatus.Status1x()
|
||||
|
||||
if (status_value >> 9) & 1:
|
||||
status.keys = HdcpSource1XKeys.Test
|
||||
elif (status_value >> 10) & 1:
|
||||
status.keys = HdcpSource1XKeys.Production
|
||||
else:
|
||||
status.keys = HdcpSource1XKeys.Unload
|
||||
|
||||
status.active = (status_value >> 8) & 1
|
||||
status.keys = HdcpSource1XKeys(((status_value >> 9) & 3) + 0x100)
|
||||
status.capable = ((status_value >> 11) & 1)
|
||||
status.authenticated = ((status_value >> 12) & 1)
|
||||
|
||||
return status
|
||||
else:
|
||||
warnings.warn(f"Not supported 'HDCP 1.4'")
|
||||
@@ -63,23 +72,21 @@ class HdcpSourceStatus:
|
||||
if self.__caps_2x.hw_supported:
|
||||
status_value = self.__read_status(HdcpMode.Mode2_3)
|
||||
status = HdcpStatus.StatusTx2x()
|
||||
if self.__io.protocol() == PortProtocol.HDMI:
|
||||
status.keys = HdcpSource2XKeys.Production if (status_value >> 9) & 1 else HdcpSource2XKeys.Unload
|
||||
|
||||
if (status_value >> 14) & 1:
|
||||
status.keys = HdcpSource2XKeys.TestR1
|
||||
elif (status_value >> 15) & 1:
|
||||
status.keys = HdcpSource2XKeys.TestR2
|
||||
elif (status_value >> 9) & 1:
|
||||
status.keys = HdcpSource2XKeys.Production
|
||||
else:
|
||||
if (status_value >> 14) & 1:
|
||||
status.keys = HdcpSource2XKeys.TestR1
|
||||
elif (status_value >> 15) & 1:
|
||||
status.keys = HdcpSource2XKeys.TestR2
|
||||
elif (status_value >> 9) & 1:
|
||||
status.keys = HdcpSource2XKeys.Production
|
||||
else:
|
||||
status.keys = HdcpSource2XKeys.Unload
|
||||
|
||||
status.km_is_stored = (status_value >> 13) & 1
|
||||
status.try_authenticate = (status_value >> 18) & 1
|
||||
status.try_encrypt = (status_value >> 19) & 1
|
||||
status.content_level = self.__io.get(TSI_HDCP_2X_CFG, c_uint32)[1]
|
||||
status.keys = HdcpSource2XKeys.Unload
|
||||
|
||||
status.km_is_stored = (status_value >> 13) & 1
|
||||
status.try_authenticate = (status_value >> 18) & 1
|
||||
status.try_encrypt = (status_value >> 19) & 1
|
||||
status.content_level = self.__io.get(p_ci.TSI_HDCP_2X_CFG, c_uint32)[1]
|
||||
|
||||
status.active = (status_value >> 8) & 1
|
||||
status.capable = (status_value >> 10) & 1
|
||||
status.authenticated = (status_value >> 12) & 1
|
||||
@@ -90,7 +97,7 @@ class HdcpSourceStatus:
|
||||
|
||||
def __read_status(self, mode: HdcpMode):
|
||||
if mode == HdcpMode.Mode1_4:
|
||||
return self.__io.get(TSI_HDCP_1X_STATUS_R, c_int)[1]
|
||||
return self.__io.get(ci.TSI_HDCP_1X_STATUS_R, c_int)[1]
|
||||
elif mode == HdcpMode.Mode2_3:
|
||||
return self.__io.get(self.__ci_status_control, c_int)[1]
|
||||
else:
|
||||
@@ -172,17 +179,17 @@ class HdcpSourceConfig:
|
||||
if value is None:
|
||||
return
|
||||
if hdcp_mode == HdcpMode.Mode1_4:
|
||||
self.__io.set(TSI_HDCP_1X_COMMAND_W, H1_SOURCE_ENABLE_ENCRYPT if value else H1_SOURCE_DISABLE_ENCRYPT)
|
||||
self.__io.set(ci.TSI_HDCP_1X_COMMAND_W, ci.H1_SOURCE_ENABLE_ENCRYPT if value else ci.H1_SOURCE_DISABLE_ENCRYPT)
|
||||
elif hdcp_mode == HdcpMode.Mode2_3:
|
||||
self.__io.set(TSI_HDCP_2X_COMMAND_W, H2_SOURCE_ENABLE_ENCRYPT if value else H2_SOURCE_DISABLE_ENCRYPT)
|
||||
self.__io.set(ci.TSI_HDCP_2X_COMMAND_W, ci.H2_SOURCE_ENABLE_ENCRYPT if value else ci.H2_SOURCE_DISABLE_ENCRYPT)
|
||||
|
||||
def __set_authenticate(self, value: Optional[bool], hdcp_mode: HdcpMode):
|
||||
if value is None:
|
||||
return
|
||||
if hdcp_mode == HdcpMode.Mode1_4:
|
||||
self.__io.set(TSI_HDCP_1X_COMMAND_W, H1_SOURCE_AUTHENTICATE if value else H1_SOURCE_DE_AUTHENTICATE)
|
||||
self.__io.set(ci.TSI_HDCP_1X_COMMAND_W, ci.H1_SOURCE_AUTHENTICATE if value else ci.H1_SOURCE_DE_AUTHENTICATE)
|
||||
elif hdcp_mode == HdcpMode.Mode2_3:
|
||||
self.__io.set(TSI_HDCP_2X_COMMAND_W, H2_SOURCE_AUTHENTICATE if value else H2_SOURCE_DE_AUTHENTICATE)
|
||||
self.__io.set(ci.TSI_HDCP_2X_COMMAND_W, ci.H2_SOURCE_AUTHENTICATE if value else ci.H2_SOURCE_DE_AUTHENTICATE)
|
||||
|
||||
def __load_keys(self, keys: Optional[Union[HdcpSource1XKeys, HdcpSource2XKeys]], hdcp_mode: HdcpMode):
|
||||
if keys is None:
|
||||
@@ -203,7 +210,7 @@ class HdcpSourceConfig:
|
||||
if keys == HdcpSource2XKeys.Production and not self.__caps_2x.production_keys_available:
|
||||
warnings.warn("Production keys is not hw supported. Please, select another keys.")
|
||||
|
||||
self.__io.set(TSI_HDCP_1X_COMMAND_W if hdcp_mode == HdcpMode.Mode1_4 else TSI_HDCP_2X_COMMAND_W, keys.value)
|
||||
self.__io.set(ci.TSI_HDCP_1X_COMMAND_W if hdcp_mode == HdcpMode.Mode1_4 else ci.TSI_HDCP_2X_COMMAND_W, keys.value)
|
||||
|
||||
def __full_check(self, hdcp_mode: HdcpMode) -> bool:
|
||||
if hdcp_mode == HdcpMode.Unknown:
|
||||
@@ -231,14 +238,14 @@ class HdcpSourceConfig:
|
||||
def __set_store_km(self, value: Optional[bool]):
|
||||
if value is None:
|
||||
return
|
||||
self.__io.set(TSI_HDCP_2X_COMMAND_W, H2_SOURCE_AUTHENTICATE_STORE_KM if value else H2_SOURCE_CLEAR_STORE_KM)
|
||||
self.__io.set(ci.TSI_HDCP_2X_COMMAND_W, ci.H2_SOURCE_AUTHENTICATE_STORE_KM if value else ci.H2_SOURCE_CLEAR_STORE_KM)
|
||||
|
||||
def __set_content_level(self, value: Optional[int]):
|
||||
if value is None:
|
||||
return
|
||||
if value not in [0, 1]:
|
||||
raise ValueError(f"Incorrect input value of 'Content level' - {value}. Must be from range: 0-1")
|
||||
self.__io.set(TSI_HDCP_2X_CFG, value)
|
||||
self.__io.set(p_ci.TSI_HDCP_2X_CFG, value)
|
||||
|
||||
|
||||
class HdcpSource:
|
||||
@@ -280,7 +287,7 @@ class HdcpSource:
|
||||
|
||||
def __read_hw_caps(self, mode: HdcpMode, ci_caps_control: int = 0) -> int:
|
||||
if mode == HdcpMode.Mode1_4:
|
||||
return self.__io.get(TSI_HDCP_1X_STATUS_R, c_int)[1]
|
||||
return self.__io.get(ci.TSI_HDCP_1X_STATUS_R, c_int)[1]
|
||||
elif mode == HdcpMode.Mode2_3:
|
||||
return self.__io.get(ci_caps_control, c_int)[1]
|
||||
else:
|
||||
|
||||
@@ -1,38 +1,37 @@
|
||||
from typing import TypeVar
|
||||
|
||||
from UniTAP.libs.lib_tsi.tsi_types import *
|
||||
import UniTAP.libs.lib_tsi.tsi_types as ci
|
||||
from enum import IntEnum
|
||||
from typing import Type
|
||||
|
||||
|
||||
class HdcpSink1XKeys(IntEnum):
|
||||
Unknown = -1
|
||||
Unload = H1_SINK_UNLOAD_KEYS
|
||||
Test = H1_SINK_LOAD_TEST_KEYS
|
||||
Production = H1_SINK_LOAD_PROD_KEYS
|
||||
Unload = ci.H1_SINK_UNLOAD_KEYS
|
||||
Test = ci.H1_SINK_LOAD_TEST_KEYS
|
||||
Production = ci.H1_SINK_LOAD_PROD_KEYS
|
||||
|
||||
|
||||
class HdcpSink2XKeys(IntEnum):
|
||||
Unknown = -1
|
||||
Unload = H2_SINK_UNLOAD_KEYS
|
||||
Production = H2_SINK_LOAD_PROD_KEYS
|
||||
TestR1 = H2_SINK_LOAD_TEST_KEYS_R1
|
||||
TestR2 = H2_SINK_LOAD_TEST_KEYS_R2
|
||||
Unload = ci.H2_SINK_UNLOAD_KEYS
|
||||
Production = ci.H2_SINK_LOAD_PROD_KEYS
|
||||
TestR1 = ci.H2_SINK_LOAD_TEST_KEYS_R1
|
||||
TestR2 = ci.H2_SINK_LOAD_TEST_KEYS_R2
|
||||
|
||||
|
||||
class HdcpSource1XKeys(IntEnum):
|
||||
Unknown = -1
|
||||
Unload = H1_SOURCE_UNLOAD_KEYS
|
||||
Test = H1_SOURCE_LOAD_TEST_KEYS
|
||||
Production = H1_SOURCE_LOAD_PROD_KEYS
|
||||
Unload = ci.H1_SOURCE_UNLOAD_KEYS
|
||||
Test = ci.H1_SOURCE_LOAD_TEST_KEYS
|
||||
Production = ci.H1_SOURCE_LOAD_PROD_KEYS
|
||||
|
||||
|
||||
class HdcpSource2XKeys(IntEnum):
|
||||
Unknown = -1
|
||||
Unload = H2_SOURCE_UNLOAD_KEYS
|
||||
Production = H2_SOURCE_LOAD_PROD_KEYS
|
||||
TestR1 = H2_SOURCE_LOAD_TEST_KEYS_R1
|
||||
TestR2 = H2_SOURCE_LOAD_TEST_KEYS_R2
|
||||
Unload = ci.H2_SOURCE_UNLOAD_KEYS
|
||||
Production = ci.H2_SOURCE_LOAD_PROD_KEYS
|
||||
TestR1 = ci.H2_SOURCE_LOAD_TEST_KEYS_R1
|
||||
TestR2 = ci.H2_SOURCE_LOAD_TEST_KEYS_R2
|
||||
|
||||
|
||||
class HdcpMode(IntEnum):
|
||||
|
||||
Reference in New Issue
Block a user