summaryrefslogtreecommitdiff
path: root/kvmd/apps/otg/hid
diff options
context:
space:
mode:
Diffstat (limited to 'kvmd/apps/otg/hid')
-rw-r--r--kvmd/apps/otg/hid/__init__.py32
-rw-r--r--kvmd/apps/otg/hid/keyboard.py81
-rw-r--r--kvmd/apps/otg/hid/mouse.py77
3 files changed, 190 insertions, 0 deletions
diff --git a/kvmd/apps/otg/hid/__init__.py b/kvmd/apps/otg/hid/__init__.py
new file mode 100644
index 00000000..e5f34641
--- /dev/null
+++ b/kvmd/apps/otg/hid/__init__.py
@@ -0,0 +1,32 @@
+# ========================================================================== #
+# #
+# KVMD - The main Pi-KVM daemon. #
+# #
+# Copyright (C) 2018 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 dataclasses
+
+
+# =====
[email protected](frozen=True)
+class Hid:
+ protocol: int
+ subclass: int
+ report_length: int
+ report_descriptor: bytes
diff --git a/kvmd/apps/otg/hid/keyboard.py b/kvmd/apps/otg/hid/keyboard.py
new file mode 100644
index 00000000..274406fd
--- /dev/null
+++ b/kvmd/apps/otg/hid/keyboard.py
@@ -0,0 +1,81 @@
+# ========================================================================== #
+# #
+# KVMD - The main Pi-KVM daemon. #
+# #
+# Copyright (C) 2018 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/>. #
+# #
+# ========================================================================== #
+
+
+from . import Hid
+
+
+# =====
+KEYBOARD_HID = Hid(
+ protocol=1,
+ subclass=1,
+
+ report_length=8,
+
+ report_descriptor=bytes([
+ # https://www.kernel.org/doc/Documentation/usb/gadget_hid.txt
+
+ # Keyboard
+ 0x05, 0x01, # USAGE_PAGE (Generic Desktop)
+ 0x09, 0x06, # USAGE (Keyboard)
+ 0xA1, 0x01, # COLLECTION (Application)
+
+ # Modifiers
+ 0x05, 0x07, # USAGE_PAGE (Keyboard)
+ 0x19, 0xE0, # USAGE_MINIMUM (Keyboard LeftControl)
+ 0x29, 0xE7, # USAGE_MAXIMUM (Keyboard Right GUI)
+ 0x15, 0x00, # LOGICAL_MINIMUM (0)
+ 0x25, 0x01, # LOGICAL_MAXIMUM (1)
+ 0x75, 0x01, # REPORT_SIZE (1)
+ 0x95, 0x08, # REPORT_COUNT (8)
+ 0x81, 0x02, # INPUT (Data,Var,Abs)
+
+ # Reserved byte
+ 0x95, 0x01, # REPORT_COUNT (1)
+ 0x75, 0x08, # REPORT_SIZE (8)
+ 0x81, 0x03, # INPUT (Cnst,Var,Abs)
+
+ # LEDs output
+ 0x95, 0x05, # REPORT_COUNT (5)
+ 0x75, 0x01, # REPORT_SIZE (1)
+ 0x05, 0x08, # USAGE_PAGE (LEDs)
+ 0x19, 0x01, # USAGE_MINIMUM (Num Lock)
+ 0x29, 0x05, # USAGE_MAXIMUM (Kana)
+ 0x91, 0x02, # OUTPUT (Data,Var,Abs)
+
+ # Reserved 3 bits in output
+ 0x95, 0x01, # REPORT_COUNT (1)
+ 0x75, 0x03, # REPORT_SIZE (3)
+ 0x91, 0x03, # OUTPUT (Cnst,Var,Abs)
+
+ # 6 keys
+ 0x95, 0x06, # REPORT_COUNT (6)
+ 0x75, 0x08, # REPORT_SIZE (8)
+ 0x15, 0x00, # LOGICAL_MINIMUM (0)
+ 0x25, 0x65, # LOGICAL_MAXIMUM (101)
+ 0x05, 0x07, # USAGE_PAGE (Keyboard)
+ 0x19, 0x00, # USAGE_MINIMUM (Reserved)
+ 0x29, 0x65, # USAGE_MAXIMUM (Keyboard Application)
+ 0x81, 0x00, # INPUT (Data,Ary,Abs)
+
+ 0xC0, # END_COLLECTION
+ ]),
+)
diff --git a/kvmd/apps/otg/hid/mouse.py b/kvmd/apps/otg/hid/mouse.py
new file mode 100644
index 00000000..325d27ef
--- /dev/null
+++ b/kvmd/apps/otg/hid/mouse.py
@@ -0,0 +1,77 @@
+# ========================================================================== #
+# #
+# KVMD - The main Pi-KVM daemon. #
+# #
+# Copyright (C) 2018 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/>. #
+# #
+# ========================================================================== #
+
+
+from . import Hid
+
+
+# =====
+MOUSE_HID = Hid(
+ protocol=0,
+ subclass=0,
+
+ report_length=6,
+
+ report_descriptor=bytes([
+ # https://github.com/NicoHood/HID/blob/0835e6a/src/SingleReport/SingleAbsoluteMouse.cpp
+ # Репорт взят отсюда ^^^, но изменен диапазон значений координат перемещений.
+ # Автор предлагает использовать -32768...32767, но семерка почему-то не хочет работать
+ # с отрицательными значениями координат, как не хочет хавать 65536 и 32768.
+ # Так что мы ей скармливаем диапазон 0...32767, и передаем рукожопам из микрософта привет,
+ # потому что линуксы прекрасно работают с любыми двухбайтовыми диапазонами.
+
+ # Absolute mouse
+ 0x05, 0x01, # USAGE_PAGE (Generic Desktop)
+ 0x09, 0x02, # USAGE (Mouse)
+ 0xA1, 0x01, # COLLECTION (Application)
+
+ # 8 Buttons
+ 0x05, 0x09, # USAGE_PAGE (Button)
+ 0x19, 0x01, # USAGE_MINIMUM (Button 1)
+ 0x29, 0x08, # USAGE_MAXIMUM (Button 8)
+ 0x15, 0x00, # LOGICAL_MINIMUM (0)
+ 0x25, 0x01, # LOGICAL_MAXIMUM (1)
+ 0x95, 0x08, # REPORT_COUNT (8)
+ 0x75, 0x01, # REPORT_SIZE (1)
+ 0x81, 0x02, # INPUT (Data,Var,Abs)
+
+ # X, Y
+ 0x05, 0x01, # USAGE_PAGE (Generic Desktop)
+ 0x09, 0x30, # USAGE (X)
+ 0x09, 0x31, # USAGE (Y)
+ 0x16, 0x00, 0x00, # LOGICAL_MINIMUM (0)
+ 0x26, 0xFF, 0x7F, # LOGICAL_MAXIMUM (32767)
+ 0x75, 0x10, # REPORT_SIZE (16)
+ 0x95, 0x02, # REPORT_COUNT (2)
+ 0x81, 0x02, # INPUT (Data,Var,Abs)
+
+ # Wheel
+ 0x09, 0x38, # USAGE (Wheel)
+ 0x15, 0x81, # LOGICAL_MINIMUM (-127)
+ 0x25, 0x7F, # LOGICAL_MAXIMUM (127)
+ 0x75, 0x08, # REPORT_SIZE (8)
+ 0x95, 0x01, # REPORT_COUNT (1)
+ 0x81, 0x06, # INPUT (Data,Var,Rel)
+
+ # End
+ 0xC0, # END_COLLECTION
+ ]),
+)