1.1.0版本
This commit is contained in:
340
UniTAP/dev/ports/modules/pdc/pdc_capabilities.py
Normal file
340
UniTAP/dev/ports/modules/pdc/pdc_capabilities.py
Normal file
@@ -0,0 +1,340 @@
|
||||
from .pdc_io import PDCPortIO, PDCControlCommand, HWControlCommand
|
||||
from .pdc_types import PdcDeviceRole, CCPullUp, DRPTryMode, USB3Mode, PowerRole
|
||||
from .pdc_utils import support_or_not
|
||||
|
||||
|
||||
class PcdCapsStatus:
|
||||
|
||||
"""
|
||||
Class `PcdCapsStatus` contains information about PDC capabilities.
|
||||
- Get initial device role `initial_role`, type `PdcDeviceRole`.
|
||||
- Get data device role `data_role`, type `PdcDeviceRole`.
|
||||
- Get power device role `power_role`, type `PowerRole`.
|
||||
- Get Cable Control Pull Up `cc_pull_up`, type `CCPullUp`.
|
||||
- Get current behavior, DRP try mode `behavior`, type `DRPTryMode`.
|
||||
- Get state of PR Swap `pr_swap`, type `bool`.
|
||||
- Get state of DR Swap `dr_swap`, type `bool`.
|
||||
- Get state of FR Swap `fr_swap`, type `bool`.
|
||||
- Get state of VCONN Swap `vconn_swap`, type `bool`.
|
||||
- Get state of Debug accessory `debug_accessory`, type `bool`.
|
||||
- Get state of Audio accessory `audio_accessory`, type `bool`.
|
||||
"""
|
||||
|
||||
def __init__(self, pdc_io: PDCPortIO):
|
||||
self.__io = pdc_io
|
||||
|
||||
def initial_role(self) -> PdcDeviceRole:
|
||||
"""
|
||||
Returns current initial role.
|
||||
|
||||
Returns:
|
||||
object of `PdcDeviceRole` type
|
||||
"""
|
||||
return PdcDeviceRole(self.__io.read_pdc_state().dev_role)
|
||||
|
||||
def data_role(self) -> PdcDeviceRole:
|
||||
"""
|
||||
Returns current data role.
|
||||
|
||||
Returns:
|
||||
object of `PdcDeviceRole` type
|
||||
"""
|
||||
return PdcDeviceRole(self.__io.read_pdc_status().data_role)
|
||||
|
||||
def power_role(self) -> PowerRole:
|
||||
"""
|
||||
Returns current power role.
|
||||
|
||||
Returns:
|
||||
object of `PowerRole` type
|
||||
"""
|
||||
return PowerRole(self.__io.read_pdc_status().power_role)
|
||||
|
||||
def cc_pull_up(self) -> CCPullUp:
|
||||
"""
|
||||
Returns current cable control pull up.
|
||||
|
||||
Returns:
|
||||
object of `CCPullUp` type
|
||||
"""
|
||||
return CCPullUp(self.__io.read_pdc_state().cc_pull_up)
|
||||
|
||||
def behavior(self) -> DRPTryMode:
|
||||
"""
|
||||
Returns current behavior of DPR mode.
|
||||
|
||||
Returns:
|
||||
object of `DRPTryMode` type
|
||||
"""
|
||||
return DRPTryMode(self.__io.read_pdc_state().drp_try_mode)
|
||||
|
||||
def pr_swap(self) -> bool:
|
||||
"""
|
||||
Returns current state of PR Swap.
|
||||
|
||||
Returns:
|
||||
object of `bool` type
|
||||
"""
|
||||
return bool(self.__io.read_pdc_state().pr_swap_en)
|
||||
|
||||
def dr_swap(self) -> bool:
|
||||
"""
|
||||
Returns current state of DR Swap.
|
||||
|
||||
Returns:
|
||||
object of `bool` type
|
||||
"""
|
||||
return bool(self.__io.read_pdc_state().dr_swap_en)
|
||||
|
||||
def fr_swap(self) -> bool:
|
||||
"""
|
||||
Returns current state of FR Swap.
|
||||
|
||||
Returns:
|
||||
object of `bool` type
|
||||
"""
|
||||
return bool(self.__io.read_pdc_state().fr_swap_en)
|
||||
|
||||
def vconn_swap(self) -> bool:
|
||||
"""
|
||||
Returns current state of VCONN Swap.
|
||||
|
||||
Returns:
|
||||
object of `bool` type
|
||||
"""
|
||||
return bool(self.__io.read_pdc_state().vconn_swap_en)
|
||||
|
||||
def debug_accessory(self) -> bool:
|
||||
"""
|
||||
Returns current state of Debug accessory.
|
||||
|
||||
Returns:
|
||||
object of `bool` type
|
||||
"""
|
||||
return bool(self.__io.read_pdc_state().dbg_accessory)
|
||||
|
||||
def audio_accessory(self) -> bool:
|
||||
"""
|
||||
Returns current state of Audio accessory.
|
||||
|
||||
Returns:
|
||||
object of `bool` type
|
||||
"""
|
||||
return bool(self.__io.read_pdc_state().aud_accessory)
|
||||
|
||||
def __str__(self):
|
||||
status = self.__io.read_pdc_state()
|
||||
return f"PDC Capabilities:\n" \
|
||||
f"Initial role: {PdcDeviceRole(status.dev_role).name}\n" \
|
||||
f"Power role: {self.power_role().name}\n" \
|
||||
f"Data role: {self.data_role().name}\n" \
|
||||
f"CC Pull-Up: {CCPullUp(status.cc_pull_up).name}\n" \
|
||||
f"Try behavior: {DRPTryMode(status.drp_try_mode).name}\n" \
|
||||
f"PR Swap enabled: {support_or_not(status.pr_swap_en)}\n" \
|
||||
f"DR Swap enabled: {support_or_not(status.dr_swap_en)}\n" \
|
||||
f"FR Swap enabled: {support_or_not(status.fr_swap_en)}\n" \
|
||||
f"VCONN Swap enabled: {support_or_not(status.vconn_swap_en)}\n" \
|
||||
f"Debug accessory enabled: {support_or_not(status.dbg_accessory)}\n" \
|
||||
f"Audio accessory enabled: {support_or_not(status.aud_accessory)}\n"
|
||||
|
||||
|
||||
class PcdCapsStatus340(PcdCapsStatus):
|
||||
|
||||
"""
|
||||
Class `PcdCapsStatus340` inherited of class`PcdCapsStatus` allows working with PDC.
|
||||
Class `PcdCapsStatus340` has all the `PcdCapsStatus` functionality.
|
||||
- Get state of USB 2.0 mode `usb20_mode`, type `bool`.
|
||||
- Get state of UCd 3.0 mode `usb30_mode`, type `USB3Mode`.
|
||||
"""
|
||||
|
||||
def __init__(self, pdc_io: PDCPortIO):
|
||||
super().__init__(pdc_io)
|
||||
|
||||
def usb20_mode(self) -> bool:
|
||||
"""
|
||||
Returns current state of USB 2.0 mode.
|
||||
|
||||
Returns:
|
||||
object of `bool` type
|
||||
"""
|
||||
return bool(self.__io.read_pdc_state().usb2_enabled)
|
||||
|
||||
def usb30_mode(self) -> USB3Mode:
|
||||
"""
|
||||
Returns current state of USB 3.0 mode.
|
||||
|
||||
Returns:
|
||||
object of `USB3Mode` type
|
||||
"""
|
||||
return USB3Mode(self.__io.read_pdc_state().usb30_mode)
|
||||
|
||||
def __str__(self):
|
||||
status = self.__io.read_pdc_state()
|
||||
return f"PDC Capabilities:" \
|
||||
f"Initial role: {PdcDeviceRole(status.dev_role).name}\n" \
|
||||
f"CC Pull-Up: {CCPullUp(status.cc_pull_up).name}\n" \
|
||||
f"Try behavior: {DRPTryMode(status.drp_try_mode).name}\n" \
|
||||
f"USB 2 enabled: {support_or_not(status.usb2_enabled)}\n" \
|
||||
f"USB 3: {USB3Mode(status.usb30_mode).name}\n" \
|
||||
f"PR Swap enabled: {support_or_not(status.pr_swap_en)}\n" \
|
||||
f"DR Swap enabled: {support_or_not(status.dr_swap_en)}\n" \
|
||||
f"FR Swap enabled: {support_or_not(status.fr_swap_en)}\n" \
|
||||
f"VCONN Swap enabled: {support_or_not(status.vconn_swap_en)}\n" \
|
||||
f"Debug accessory enabled: {support_or_not(status.dbg_accessory)}\n" \
|
||||
f"Audio accessory enabled: {support_or_not(status.aud_accessory)}\n"
|
||||
|
||||
|
||||
class PdcCapabilities:
|
||||
|
||||
"""
|
||||
Class `PdcCapabilities` allows controlling PDC capabilities.
|
||||
- Set device initial role `set_initial_role`.
|
||||
- Enable/Disable PR Swap `enable_pr_swap`.
|
||||
- Enable/Disable DR Swap `enable_dr_swap`.
|
||||
- Enable/Disable FR Swap `enable_fr_swap`.
|
||||
- Enable/Disable VCONN Swap `enable_vconn_swap`.
|
||||
- Set CC Pull Up `cc_pull_up`.
|
||||
- Set DPR try mode behavior `try_behavior`.
|
||||
- Enable/Disable Debug accessory `enable_debug_accessory`.
|
||||
- Enable/Disable Audio accessory `enable_audio_accessory`.
|
||||
"""
|
||||
|
||||
__device_role = {PdcDeviceRole.DFP: PDCControlCommand.SetDataRoleDFP,
|
||||
PdcDeviceRole.UFP: PDCControlCommand.SetDataRoleUFP,
|
||||
PdcDeviceRole.DRP: PDCControlCommand.SetDataRoleDRP}
|
||||
|
||||
__cc_pull_up = {CCPullUp.Current_05_09A: PDCControlCommand.PullCCLineToDefault,
|
||||
CCPullUp.Current_1_5A: PDCControlCommand.PullCCLineTo1_5A,
|
||||
CCPullUp.Current_3A: PDCControlCommand.PullCCLineTo3_0A}
|
||||
|
||||
__behavior = {DRPTryMode.PureDRP: PDCControlCommand.SetDataRoleDRP,
|
||||
DRPTryMode.DRP_try_SNK: PDCControlCommand.SetDataRoleDRP_SNK_Support,
|
||||
DRPTryMode.DRP_try_SRC: PDCControlCommand.SetDataRoleDRP_SRC_Support}
|
||||
|
||||
def __init__(self, pdc_io: PDCPortIO):
|
||||
self.__io = pdc_io
|
||||
self.__status = PcdCapsStatus(self.__io)
|
||||
|
||||
@property
|
||||
def status(self) -> PcdCapsStatus:
|
||||
"""
|
||||
Returns current PDC Capabilities status.
|
||||
|
||||
Returns:
|
||||
object of `PcdCapsStatus` type
|
||||
"""
|
||||
return self.__status
|
||||
|
||||
def set_initial_role(self, role: PdcDeviceRole):
|
||||
"""
|
||||
Set device initial role.
|
||||
|
||||
Args:
|
||||
role (`PdcDeviceRole`)
|
||||
"""
|
||||
self.__io.write_pdc_command(self.__device_role.get(role))
|
||||
|
||||
def enable_pr_swap(self, enable: bool):
|
||||
"""
|
||||
Enable/Disable PR Swap.
|
||||
|
||||
Args:
|
||||
enable (`bool`)
|
||||
"""
|
||||
self.__io.write_pdc_command(PDCControlCommand.EnablePRSwap if enable else PDCControlCommand.DisablePRSwap)
|
||||
|
||||
def enable_dr_swap(self, enable: bool):
|
||||
"""
|
||||
Enable/Disable DR Swap.
|
||||
|
||||
Args:
|
||||
enable (`bool`)
|
||||
"""
|
||||
self.__io.write_pdc_command(PDCControlCommand.EnableDRSwap if enable else PDCControlCommand.DisableDRSwap)
|
||||
|
||||
def enable_fr_swap(self, enable: bool):
|
||||
"""
|
||||
Enable/Disable FR Swap.
|
||||
|
||||
Args:
|
||||
enable (`bool`)
|
||||
"""
|
||||
self.__io.write_pdc_command(PDCControlCommand.EnableFRSwap if enable else PDCControlCommand.DisableFRSwap)
|
||||
|
||||
def enable_vconn_swap(self, enable: bool):
|
||||
"""
|
||||
Enable/Disable VCONN Swap.
|
||||
|
||||
Args:
|
||||
enable (`bool`)
|
||||
"""
|
||||
self.__io.write_pdc_command(PDCControlCommand.EnableVconnSwap if enable else PDCControlCommand.DisableVconnSwap)
|
||||
|
||||
def cc_pull_up(self, cc_pull_up: CCPullUp):
|
||||
"""
|
||||
Set Cable Control Pull Up.
|
||||
|
||||
Args:
|
||||
cc_pull_up (`CCPullUp`)
|
||||
"""
|
||||
self.__io.write_pdc_command(self.__cc_pull_up.get(cc_pull_up))
|
||||
|
||||
def try_behavior(self, behavior: DRPTryMode):
|
||||
"""
|
||||
Set DRP try mode behavior.
|
||||
|
||||
Args:
|
||||
behavior (`DRPTryMode`)
|
||||
"""
|
||||
self.__io.write_pdc_command(self.__behavior.get(behavior))
|
||||
|
||||
def enable_debug_accessory(self, enable: bool):
|
||||
"""
|
||||
Enable/Disable Debug Accessory.
|
||||
|
||||
Args:
|
||||
enable (`bool`)
|
||||
"""
|
||||
self.__io.write_pdc_command(PDCControlCommand.EnableDebugAccessorySupport if enable else
|
||||
PDCControlCommand.EnableDebugAccessorySupport)
|
||||
|
||||
def enable_audio_accessory(self, enable: bool):
|
||||
"""
|
||||
Enable/Disable Audio Accessory.
|
||||
|
||||
Args:
|
||||
enable (`bool`)
|
||||
"""
|
||||
self.__io.write_pdc_command(PDCControlCommand.EnableAudioAccessorySupport if enable else
|
||||
PDCControlCommand.DisableAudioAccessorySupport)
|
||||
|
||||
|
||||
class PdcCapabilities340(PdcCapabilities):
|
||||
|
||||
"""
|
||||
Class `PdcCapabilities340` inherited of class`PdcCapabilities` allows working with PDC.
|
||||
Class `PdcCapabilities340` has all the `PdcCapabilities` functionality.
|
||||
- Enable/Disable USB 2.0 bypass `usb_2_bypass_function`.
|
||||
- Enable/Disable USB 3.0 bypass `usb_3_bypass_function`.
|
||||
"""
|
||||
|
||||
def __init__(self, pdc_io: PDCPortIO):
|
||||
super().__init__(pdc_io)
|
||||
|
||||
def usb_2_bypass_function(self, enable: bool):
|
||||
"""
|
||||
Enable/Disable USB 2.0 bypass.
|
||||
|
||||
Args:
|
||||
enable (`bool`)
|
||||
"""
|
||||
self.__io.write_hw_command(HWControlCommand.Enable20PHY if enable else HWControlCommand.Disable20PHY)
|
||||
|
||||
def usb_3_bypass_function(self, enable: bool):
|
||||
"""
|
||||
Enable/Disable USB 3.0 bypass.
|
||||
|
||||
Args:
|
||||
enable (`bool`)
|
||||
"""
|
||||
self.__io.write_hw_command(HWControlCommand.Enable30PHY if enable else HWControlCommand.Disable30PHY)
|
||||
Reference in New Issue
Block a user