summaryrefslogtreecommitdiff
path: root/kvmd/plugins
diff options
context:
space:
mode:
authorMaxim Devaev <[email protected]>2023-08-03 05:47:27 +0300
committerMaxim Devaev <[email protected]>2023-08-03 05:47:27 +0300
commitc96057772c8d845c90ad7429e51689eeffb63d71 (patch)
treec376d9715169b9248aa8b7ef70b8a6506297f982 /kvmd/plugins
parent1a8f98a64f9480c1062225e0fc994ceac4ba346d (diff)
rp2040 hid
Diffstat (limited to 'kvmd/plugins')
-rw-r--r--kvmd/plugins/hid/_mcu/__init__.py8
-rw-r--r--kvmd/plugins/hid/spi.py30
2 files changed, 29 insertions, 9 deletions
diff --git a/kvmd/plugins/hid/_mcu/__init__.py b/kvmd/plugins/hid/_mcu/__init__.py
index 26632553..646e689b 100644
--- a/kvmd/plugins/hid/_mcu/__init__.py
+++ b/kvmd/plugins/hid/_mcu/__init__.py
@@ -108,6 +108,7 @@ class BaseMcuHid(BaseHid, multiprocessing.Process): # pylint: disable=too-many-
reset_pin: int,
reset_inverted: bool,
reset_delay: float,
+ reset_self: bool,
read_retries: int,
common_retries: int,
@@ -126,6 +127,7 @@ class BaseMcuHid(BaseHid, multiprocessing.Process): # pylint: disable=too-many-
self.__phy = phy
self.__gpio = Gpio(gpio_device_path, reset_pin, reset_inverted, reset_delay)
+ self.__reset_self = reset_self
self.__reset_required_event = multiprocessing.Event()
self.__events_queue: "multiprocessing.Queue[BaseEvent]" = multiprocessing.Queue()
@@ -146,6 +148,7 @@ class BaseMcuHid(BaseHid, multiprocessing.Process): # pylint: disable=too-many-
"reset_pin": Option(4, type=valid_gpio_pin_optional),
"reset_inverted": Option(False, type=valid_bool),
"reset_delay": Option(0.1, type=valid_float_f01),
+ "reset_self": Option(False, type=valid_bool),
"read_retries": Option(5, type=valid_int_f1),
"common_retries": Option(5, type=valid_int_f1),
@@ -418,4 +421,7 @@ class BaseMcuHid(BaseHid, multiprocessing.Process): # pylint: disable=too-many-
reset_required = (1 if response[1] & 0b01000000 else 0)
self.__state_flags.update(online=1, busy=reset_required, status=status)
if reset_required:
- self.__reset_required_event.set()
+ if self.__reset_self:
+ time.sleep(1) # Pico перезагружается сам вскоре после ответа
+ else:
+ self.__reset_required_event.set()
diff --git a/kvmd/plugins/hid/spi.py b/kvmd/plugins/hid/spi.py
index e3b44e50..f43f344d 100644
--- a/kvmd/plugins/hid/spi.py
+++ b/kvmd/plugins/hid/spi.py
@@ -100,6 +100,7 @@ class _SpiPhy(BasePhy): # pylint: disable=too-many-instance-attributes
chip: int,
hw_cs: bool,
sw_cs_pin: int,
+ sw_cs_per_byte: bool,
max_freq: int,
block_usec: int,
read_timeout: float,
@@ -110,6 +111,7 @@ class _SpiPhy(BasePhy): # pylint: disable=too-many-instance-attributes
self.__chip = chip
self.__hw_cs = hw_cs
self.__sw_cs_pin = sw_cs_pin
+ self.__sw_cs_per_byte = sw_cs_per_byte
self.__max_freq = max_freq
self.__block_usec = block_usec
self.__read_timeout = read_timeout
@@ -125,7 +127,7 @@ class _SpiPhy(BasePhy): # pylint: disable=too-many-instance-attributes
spi.no_cs = (not self.__hw_cs)
spi.max_speed_hz = self.__max_freq
- def xfer(data: bytes) -> bytes:
+ def inner_xfer(data: bytes) -> bytes:
try:
if sw_cs_line is not None:
sw_cs_line.set_value(0)
@@ -134,6 +136,17 @@ class _SpiPhy(BasePhy): # pylint: disable=too-many-instance-attributes
if sw_cs_line is not None:
sw_cs_line.set_value(1)
+ if self.__sw_cs_per_byte:
+ # Режим для Pico, когда CS должен взводиться для отдельных байтов
+ def xfer(data: bytes) -> bytes:
+ got: list[int] = []
+ for byte in data:
+ got.extend(inner_xfer(byte.to_bytes(1, "big")))
+ return bytes(got)
+ else:
+ # Режим для Arduino, когда CS взводится для целого блока данных
+ xfer = inner_xfer
+
yield _SpiPhyConnection(
xfer=xfer,
read_timeout=self.__read_timeout,
@@ -167,11 +180,12 @@ class Plugin(BaseMcuHid):
@classmethod
def __get_phy_options(cls) -> dict:
return {
- "bus": Option(-1, type=valid_int_f0),
- "chip": Option(-1, type=valid_int_f0),
- "hw_cs": Option(False, type=valid_bool),
- "sw_cs_pin": Option(-1, type=valid_gpio_pin_optional),
- "max_freq": Option(100000, type=valid_int_f1),
- "block_usec": Option(1, type=valid_int_f0),
- "read_timeout": Option(0.5, type=valid_float_f01),
+ "bus": Option(-1, type=valid_int_f0),
+ "chip": Option(-1, type=valid_int_f0),
+ "hw_cs": Option(False, type=valid_bool),
+ "sw_cs_pin": Option(-1, type=valid_gpio_pin_optional),
+ "sw_cs_per_byte": Option(False, type=valid_bool),
+ "max_freq": Option(100000, type=valid_int_f1),
+ "block_usec": Option(1, type=valid_int_f0),
+ "read_timeout": Option(0.5, type=valid_float_f01),
}