summaryrefslogtreecommitdiff
path: root/kvmd/plugins/hid
diff options
context:
space:
mode:
authorMaxim Devaev <[email protected]>2021-08-28 19:01:13 +0300
committerMaxim Devaev <[email protected]>2021-08-28 19:01:13 +0300
commit2db0656df3ecd7c1f4502591c1a734905613e7ec (patch)
tree7ccf1cbd9a2e09ca12710302b6bc8fb3dc6b729e /kvmd/plugins/hid
parent08dad87fea9cd3b5ced5642864c5e8c359e8b1cc (diff)
unified udc code and automatic driver detection
Diffstat (limited to 'kvmd/plugins/hid')
-rw-r--r--kvmd/plugins/hid/otg/__init__.py4
-rw-r--r--kvmd/plugins/hid/otg/device.py10
-rw-r--r--kvmd/plugins/hid/otg/usb.py77
3 files changed, 10 insertions, 81 deletions
diff --git a/kvmd/plugins/hid/otg/__init__.py b/kvmd/plugins/hid/otg/__init__.py
index f4df4c63..b038061a 100644
--- a/kvmd/plugins/hid/otg/__init__.py
+++ b/kvmd/plugins/hid/otg/__init__.py
@@ -28,6 +28,7 @@ from typing import Optional
from typing import Any
from .... import aiomulti
+from .... import usb
from ....yamlconf import Option
@@ -38,7 +39,6 @@ from ....validators.os import valid_abs_path
from .. import BaseHid
-from .usb import UsbDeviceController
from .keyboard import KeyboardProcess
from .mouse import MouseProcess
@@ -56,7 +56,7 @@ class Plugin(BaseHid): # pylint: disable=too-many-instance-attributes
self.__notifier = aiomulti.AioProcessNotifier()
- self.__udc = UsbDeviceController(udc)
+ self.__udc = usb.UsbDeviceController(udc)
win98_fix = mouse.pop("absolute_win98_fix")
common = {
diff --git a/kvmd/plugins/hid/otg/device.py b/kvmd/plugins/hid/otg/device.py
index 95795f1e..2902df47 100644
--- a/kvmd/plugins/hid/otg/device.py
+++ b/kvmd/plugins/hid/otg/device.py
@@ -35,8 +35,8 @@ from ....logging import get_logger
from .... import tools
from .... import aiomulti
from .... import aioproc
+from .... import usb
-from .usb import UsbDeviceController
from .events import BaseEvent
@@ -49,7 +49,7 @@ class BaseDeviceProcess(multiprocessing.Process): # pylint: disable=too-many-in
initial_state: Dict,
notifier: aiomulti.AioProcessNotifier,
- udc: UsbDeviceController,
+ udc: usb.UsbDeviceController,
device_path: str,
select_timeout: float,
@@ -89,6 +89,12 @@ class BaseDeviceProcess(multiprocessing.Process): # pylint: disable=too-many-in
try:
event = self.__events_queue.get(timeout=self.__queue_timeout)
except queue.Empty:
+ # Проблема в том, что устройство может отвечать EAGAIN или ESHUTDOWN,
+ # если оно было отключено физически. См:
+ # - https://github.com/raspberrypi/linux/issues/3870
+ # - https://github.com/raspberrypi/linux/pull/3151
+ # Так что нам нужно проверять состояние контроллера, чтобы не спамить
+ # в устройство и отслеживать его состояние.
if not self.__udc.can_operate():
self.__state_flags.update(online=False)
else:
diff --git a/kvmd/plugins/hid/otg/usb.py b/kvmd/plugins/hid/otg/usb.py
deleted file mode 100644
index e4615669..00000000
--- a/kvmd/plugins/hid/otg/usb.py
+++ /dev/null
@@ -1,77 +0,0 @@
-# ========================================================================== #
-# #
-# KVMD - The main Pi-KVM daemon. #
-# #
-# Copyright (C) 2018-2021 Maxim Devaev <[email protected]> #
-# #
-# This program is free software: you can redistribute it and/or modify #
-# it under the terms of the GNU General Public License as published by #
-# the Free Software Foundation, either version 3 of the License, or #
-# (at your option) any later version. #
-# #
-# This program is distributed in the hope that it will be useful, #
-# but WITHOUT ANY WARRANTY; without even the implied warranty of #
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
-# GNU General Public License for more details. #
-# #
-# You should have received a copy of the GNU General Public License #
-# along with this program. If not, see <https://www.gnu.org/licenses/>. #
-# #
-# ========================================================================== #
-
-
-import os
-
-from ....logging import get_logger
-
-from .... import env
-from .... import tools
-
-
-# =====
-class UsbDeviceController:
- # Проблема в том, что устройство может отвечать EAGAIN или ESHUTDOWN,
- # если оно было отключено физически. См:
- # - https://github.com/raspberrypi/linux/issues/3870
- # - https://github.com/raspberrypi/linux/pull/3151
- # Так что нам нужно проверять состояние контроллера, чтобы не спамить
- # в устройство и отслеживать его состояние.
-
- def __init__(self, udc: str) -> None:
- self.__udc = udc
- self.__state_path = ""
-
- def find(self) -> None:
- logger = get_logger()
-
- path = f"{env.SYSFS_PREFIX}/sys/class/udc"
- try:
- candidates = sorted(os.listdir(path))
- except Exception as err:
- logger.error("Can't list %s: %s: ignored", path, tools.efmt(err))
- return
-
- udc = ""
- if not self.__udc:
- if len(candidates) == 0:
- logger.error("Can't find any UDC: ignored")
- else:
- udc = candidates[0]
- elif self.__udc not in candidates:
- logger.error("Can't find selected UDC: %s: ignored", self.__udc)
- else:
- udc = self.__udc
-
- if udc:
- get_logger().info("Using UDC %s", udc)
- self.__state_path = os.path.join(path, udc, "state")
-
- def can_operate(self) -> bool:
- if self.__state_path:
- try:
- with open(self.__state_path, "r") as state_file:
- # https://www.maxlinear.com/Files/Documents/an213_033111.pdf
- return (state_file.read().strip().lower() == "configured")
- except Exception:
- pass
- return True # При ошибке лучше прикинуться работающим, мало ли что