Я пишу модуль ядра для определения режима планшета с ноутбука 2-в-1 .
Модуль осуществляет доступ к промышленному вводу-выводу (или датчикам) и нуждается вотключить устройства ввода (например: внутренняя клавиатура и мышь). Я хотел бы сделать это в пространстве ядра для раннего отключения входов (или самих устройств), если ноутбук включен в режиме планшета, избегая пользователей, удаляющих заставку при запуске (например). До сих пор я не нашел способа отключить входы без изменения исходных кодов ядра.
1-я идея:
Без изменения исходного кода ядра моей первой попыткой было:вызовите следующую функцию из linux/input.h
, которая «отключает» данный вход, игнорируя его события:
void input_set_ignore_events(struct input_dev *dev, bool ignored)
Я нашел способ получить устройство struct device *
с его именем, как показано ниже, но яне может найти способ получить указатель struct input_dev *
из struct device *
:
bus_find_device_by_name(&platform_bus_type, NULL, name);
Другая идея заключается в том, чтобы получить внешний доступ к static LIST_HEAD(input_dev_list);
, расположенному в drivers/input/input.c
.
2-я идея:
Не пытайтесь получить доступ к абстракции ввода ядра, вместо этого используйте offline()
и suspend()
функции struct bus_type *
из include/linux/device.h
. Согласно Documentation/ABI/testing/sysfs-devices-online
это может сработать. Я скоро попробую.
Вопросы:
- Можно ли правильно отключить события или входы от любого внешнего модуля?
- Можно ли получить
struct input_dev *
с любого внешнего модуля?
Спасибо за ваше время.