Youtube-запись от 2025-05-30: https://youtu.be/U1_JgNiSZs8
- Научиться выдавать микроконтроллер за USB HID устройство
- Конкретно прикидываться клавиатурой
- Научиться отправлять данные с МК
- Видеть «клавиатуру» на стороне Linux
- Вводить данные с «клавиатуры» в компьютер
- Перехватывать данные с «клавиатуры» в приложение
- Написать свой обработчик для такой «клавиатуры»
- Реализовать схему «Ты ему слово, он тебе десять»
- The Lightweight USB Framework for AVRs
- Демо-код реализации именно клавиатуры
Сайта нет, жизни нет, Github есть
-
Используем собственную систему сборки LUFA
-
Что изменить в makefile?
MCU = atmega32u4 F_CPU = 16000000 LUFA_PATH = [тут ваш реальный путь к LUFA]
-
Добавляем цель прошивки для нашего удобства:
DEVICE = /dev/ttyACM0 DRIVER = avrdude ... flash: $(TARGET).hex stty -F $(DEVICE) 1200 sleep 2 $(DRIVER) -v -p $(MCU) -c avr109 -P $(DEVICE) -b 57600 -U flash:w:$<
-
sudo dmesg -wпокажет всё в прямом эфире -
lsusbпоказать все подключённые USB-устройства-vдетали про каждое устройство — в том числе дескрипторы-tсписок устройств в виде дерева -
Давайте найдём не просто USB, а устройство ввода:
for i in /sys/class/input/event*/device/name; do echo -n "$i: "; cat "$i" done
-
Или для начала хотя бы
ls /sys/class/input— все устройства ввода -
Откуда такое богатство? Вспомним, чем занят
/sys
sudo evtestмониторинг устройств вводаcat /dev/input/event5just for fun
Пока ничего не происходит
Хотим менять поведение системы сборки
-
Генератор (и вообще система) документации Doxygen
make doxygenсгенерить документациюdoxygen -uобновить конфигурациюdoxyfile→PAPER_TYPE = a4исправить ошибку с форматом бумаги -
make-файлы в отдельных файлах
$(LUFA_PATH)/Build/DMBS/DMBS/doxygen.mkцели и настройки Doxygen -
Смотреть лучше через нормальный браузер, не
lynxpython3 -m http.server 8080
Задача: сделать clean не таким шумным
Хотим, чтобы он что-нибудь делал
-
Keyboard.cв принципеmain()можно прочесть «здравым смыслом» и эрудицией про поведение USB HID -
Нам явно нужен
CALLBACK_HID_Device_CreateHIDReport() -
А давайте просто уберём условие нажатия кнопки?
-
…и увидим, что ничего не работает
-
Почему?
Оказывается, кнопку нужно ещё и отпускать
-
Что-то нажимается, но мы не рады
Хотим убрать истерику
-
value 2признак повторного нажатия -
вводим три состояния
Loadingflowchart TB wait(Ждём) pressed(Только что нажали) released(Только что отпустили) wait:::w ==> pressed:::p ==> released:::r ==> wait classDef p fill:#FE8019; classDef r fill:#B8BA46; classDef w fill:#FABD2F;
-
ставим таймер
Так себе таймер, если честно
А ещё: реагировать на физическую кнопку — посылать разные коды кнопок — нажимать несколько кнопок одновременно — разобраться в остальном коде — …
