Язык: English🇬🇧 | Русский🇷🇺
Этот проект предоставляет комплексный драйвер для ядра Linux и набор инструментов для пульта LG Magic Remote (MR20 и аналогичных). Драйвер обеспечивает полную функциональность пульта, включая назначение кнопок, гироскопическое управление курсором (аэромышь) и прямой доступ к данным IMU (акселерометр и гироскоп). Пакет включает как модуль ядра, так и утилиты на Python для калибровки, тестирования и визуализации.
- kernel/dkms.conf - файл конфигурации DKMS для автоматической сборки модуля ядра
- kernel/lg_magic_main.c - реализация драйвера ядра
- kernel/lg_magic_airmouse.h - заголовочный файл структуры калибровочных значений
- kernel/lg_magic_airmouse.c - реализация калибровки и фильтрации аэромыши
- kernel/Makefile - система сборки для модуля ядра
- 51-lgimu.rules - правило udev для доступа к необработанным данным IMU без прав суперпользователя. Разместить в
/etc/udev/rules.d/при необходимости.
- scripts/lg_magic.py - Низкоуровневый анализатор пакетов. Изначальный инструмент, сохранен для истории
- scripts/calibrate.py - Утилита калибровки IMU
- scripts/convert_calib.py - Конвертер калибровки в бинарный формат для модуля ядра
- scripts/display_imu.py - Утилита визуализации IMU в реальном времени и эмуляция аэромыши
- Поддерживает LG Magic Remote (HID Bluetooth устройство 000f:3412)
- Создает два устройства ввода:
LG Magic Remote- стандартные HID события (кнопки, колесо, аэромышь)LG Magic Remote IMU- сырые данные IMU (акселерометр + гироскоп)
Полная поддержка кнопок включая:
- Включение, цифровые клавиши (0-9), навигационные кнопки (UP/DOWN/LEFT/RIGHT)
- Медиа-управление (PLAY, PAUSE, VOLUME, MUTE)
- Цветные кнопки (RED, GREEN, YELLOW, BLUE)
- Специальные функциональные кнопки (HOME, BACK, SETTINGS, GUIDE)
Требует калибровки перед использованием
- Управление курсором на основе гироскопа
- Настраиваемая чувствительность и порог активации
- Фильтр низких частот для сглаживания движения
- Автоматическое переключение между кнопочным управлением и аэромышью
Функция аэромыши реализована двумя способами:
- Модуль ядра (Рабочий): Встроенная обработка аэромыши с минимальной задержкой, полностью в пространстве ядра
- Python + Uinput (Отладочный): Обработка сырых данных IMU в пользовательском пространстве через
display_imu.py --mouseдля тестирования и проверки калибровки
- Сырые данные акселерометра и гироскопа через evdev
- 6-осевые данные движения (3 оси акселерометра + 3 оси гироскопа)
- Счетчик для синхронизации времени
- Заголовки ядра Linux
- DKMS (Dynamic Kernel Module Support)
- Базовые инструменты сборки (make, gcc)
make
sudo insmod lg_magic.kosudo mkdir /usr/src/lg-magic-1.0
sudo cp * /usr/src/lg-magic-1.0/
sudo dkms add -m lg-magic -v 1.0
sudo dkms build -m lg-magic -v 1.0
sudo dkms install -m lg-magic -v 1.0Драйвер поддерживает некоторые параметры:
# Загрузка с пользовательскими параметрами
sudo modprobe lg_magic airmouse=1 airmouse_threshold=300 imu_evdev=1 debug=2
# Или установка через sysfs после загрузки
echo 1 > /sys/module/lg_magic/parameters/airmouse
echo 500 > /sys/module/lg_magic/parameters/airmouse_threshold
echo 2 > /sys/module/lg_magic/parameters/debugПараметры:
airmouse(0/1): Включить/выключить функциональность аэромышиairmouse_threshold(int): Пороговое значение гироскопа для активации аэромыши (по умолчанию: 300)imu_evdev(0/1): Предоставлять сырые данные IMU как отдельное устройство вводаdebug(0-2): Уровень отладочных сообщений (0=без сообщений, 1=нормальный, 2=подробный)
Драйвер загружает данные калибровки из бинарных файлов через подсистему Linux Firmware:
lg_magic_calib_XX_XX_XX_XX_XX_XX.bin- Индивидуальный калибровочный файл по MAC-адресуlg_magic_calib.bin- Калибровка по умолчанию
- Сбор данных IMU для обеих калибровок:
python3 display_imu.py --csv samples.csv- Вычисление калибровочных значений:
# Калибровка акселерометра (медленно вращайте по всем осям во время сбора данных)
python3 calibrate.py --accel samples.csv calib_accel.json
# Калибровка гироскопа (держите пульт неподвижно во время сбора данных)
python3 calibrate.py --gyro samples.csv calib_gyro.json
# Объединение JSON
Объедините разделы gyro/accel. Настройте коэффициент гироскопа. Выходит за рамки этого проекта, рекомендуемое значение около 0.07- Конвертация в бинарный формат:
python3 convert_calib.py calib.json lg_magic_calib.bin --alpha 0.2 --mouse_k 0.5alpha: Коэффициент фильтра низких частот (0.0-1.0)mouse_k: Множитель чувствительности аэромышиgyro_bias: Значения дрейфа гироскопаgyro_scale: Коэффициенты гироскопа
# Мониторинг HIDRAW пакетов
python3 lg_magic.py# Отображение сырых данных IMU
python3 display_imu.py
# AHRS
python3 display_imu.py --calib calib.json --ahrs
# 3D куб
python3 display_imu.py --calib calib.json --cube
# Аэромышь через uinput
python3 display_imu.py --calib calib.json --mouseИнструменты Python могут создавать виртуальное устройство мыши используя uinput:
# Включение модуля uinput
sudo modprobe uinput
# Запуск аэромыши
python3 display_imu.py --calib calib.json --mouseПульт использует report ID 0xFD (30 байт всего: 1 байт report ID + 29 байт полезной нагрузки). Структура полезной нагрузки:
| Смещение | Размер | Описание | Формат |
|---|---|---|---|
| 0 | 1 | Report ID (0xFD) | uint8_t |
| 1-2 | 2 | Счетчик пакетов | uint16 little-endian |
| 3-4 | 2 | Константа (0xFD00) | uint16 little-endian |
| 5-6 | 2 | Гироскоп X | int16 big-endian |
| 7-8 | 2 | Гироскоп Y | int16 big-endian |
| 9-10 | 2 | Гироскоп Z | int16 big-endian |
| 11-12 | 2 | Акселерометр X | int16 big-endian |
| 13-14 | 2 | Акселерометр Y | int16 big-endian |
| 15-16 | 2 | Акселерометр Z | int16 big-endian |
| 17-18 | 2 | Код кнопки | uint16 big-endian |
| 19 | 1 | Колёсико | int8 |
Другие типы отчетов (0xF9, 0x01) не наблюдались, возможно используются для других функций (например, микрофона)
- Частота дискретизации: ~50Hz (интервалы 20ms)
- Формат данных: 16-битные знаковые значения big-endian
- Система координат: Показана на рисунке
- Данные гироскопа корректируются по дрейфу и масштабируются
- Фильтр низких частот уменьшает высокочастотный шум
- Угловая скорость преобразуется в движение курсора
- Пороговое переключение между кнопочным управлением и аэромышью по угловой скорости. Нажатие кнопок возвращает кнопочный режим.
- Модуль:
/lib/modules/$(uname -r)/kernel/drivers/input/misc/lg_magic.ko - Калибровка:
/lib/firmware/lg_magic_calib.bin - Исходники DKMS:
/usr/src/lg-magic-1.0/
- Протестировано с: LG Magic Remote MR20
- Версии ядра: 4.15+ (тестировалось на 6.11)
- Python: 3.6+
- Зависимости: numpy, scipy, pyqtgraph, python-evdev
Пожалуйста, сообщайте об проблемах и отправляйте pull requests для:
- Поддержки дополнительных устройств
- Улучшения алгоритмов калибровки
- Исправления ошибок и улучшения производительности
GPL v2 - Такая же как у ядра Linux
Copyright © 2025 [Илья Челядин]. Этот проект не аффилирован с LG Electronics.
