Ivan Ivanov 83 Ответов: 2

Использование beaglebone black в качестве клавиатурного устройства.


Всем Привет

В настоящее время я работаю над проектом сенсорной клавиатуры, где BBB отображает изображения на экране, получает сенсорные события из сенсорной панели и должен отправлять их на главный компьютер в качестве ключевых событий. Таким образом, BBB должен представить себя как скрытое (клавиатурное) устройство для ПК.

То, что я должен сделать, это написать программу, которая работает на BeagleBone, которая должна делать следующие вещи:
- Берет изображения из своей флэш-памяти и раскладывает их на экране;
- Захватывает выходные данные сенсорной панели и переводит их в соответствующие ключевые события.
- И наконец, он должен подключиться к контроллеру USB-устройства и отправить эти ключевые события на ПК.

Аппаратное обеспечение присутствует. BBB имеет USB On-The-Go, который можно использовать в качестве контроллера USB-устройства. По умолчанию он настроен как USB-устройство Ethernet и устройство массового хранения данных, и эти функции действительно работают.

До сих пор я написал сценарий, который настраивает USB OTG-устройство как HID, но что теперь?!
Я действительно не знаю, как продолжать. Я даже не уверен, что мой сценарий настраивает все так, как должно быть. Примеры (таких скриптов) Я посмотрел оттуда, были несколько устаревшими.

Скрипт заполняет такие данные, как VID и PID, в файлы, созданные configfs, и создает некоторые новые файлы и каталоги в соответствии с примерами, которые я видел. Только последняя команда терпит неудачу: ls: write error: Device or resource busy Именно здесь должен быть упомянут нужный модуль ядра, чтобы configfs загрузил его. Но модуль (usb_f_hid) действительно загружается! Вот я и подумал, что ошибка-это не так уж и важно?!

Я ожидал, что файл устройства появится в /dev после запуска скрипта, поэтому я могу открыть его и начать общаться с контроллером USB-устройства. Но я не смог найти такой файл устройства. он должен быть назван "usb0", но ни одно устройство, зарегистрированное с префиксом "usb", не присутствует до или после запуска скрипта.

В приведенном работает на Debian Linux beaglebone 4.4.14-bone11 #1 Thu Jul 14 08:51:47 EEST 2016 armv7l GNU/Linux

Не могли бы вы указать мне на некоторые ресурсы, которые объясняют процесс использования BBB как HID или что-то в этом роде.

Кроме того, как я могу правильно удалить сетевую функциональность USB?

Заранее большое спасибо.

Что я уже пробовал:

Вот и весь сценарий. Он выполняется следующим образом root.
Configfs уже смонтирован, а модуль libcomposite загружен при запуске, так что мне не нужно делать это в скрипте.
mkdir /sys/kernel/config/usb_gadget/usb_keyboard

mkdir /sys/kernel/config/usb_gadget/usb_keyboard/configs/c.1
mkdir /sys/kernel/config/usb_gadget/usb_keyboard/functions/hid.usb0

echo "1" > /sys/kernel/config/usb_gadget/usb_keyboard/functions/hid.usb0/protocol                 # set the HID protocol
echo "1" > /sys/kernel/config/usb_gadget/usb_keyboard/functions/hid.usb0/subclass                 # set the device subclass
echo "8" > /sys/kernel/config/usb_gadget/usb_keyboard/functions/hid.usb0/report_length            # REPORT_LENGTH = 8  set the byte length of HID reports
cat /home/debian/report_desc.bin > /sys/kernel/config/usb_gadget/usb_keyboard/functions/hid.usb0/report_desc

mkdir /sys/kernel/config/usb_gadget/usb_keyboard/strings/0x409
mkdir /sys/kernel/config/usb_gadget/usb_keyboard/configs/c.1/strings/0x409

echo "0x37f2" > /sys/kernel/config/usb_gadget/usb_keyboard/idVendor
echo "0x0001" > /sys/kernel/config/usb_gadget/usb_keyboard/idProduct
echo "0x03"   > /sys/kernel/config/usb_gadget/usb_keyboard/bDeviceClass

echo "71cb32dc0e49d782e9d1"       > /sys/kernel/config/usb_gadget/usb_keyboard/strings/0x409/serialnumber
echo "**** ***** Technology Ltd." > /sys/kernel/config/usb_gadget/usb_keyboard/strings/0x409/manufacturer
echo "*** Keyboard"               > /sys/kernel/config/usb_gadget/usb_keyboard/strings/0x409/product
echo "Custom USB Keyboard"        > /sys/kernel/config/usb_gadget/usb_keyboard/configs/c.1/strings/0x409/configuration
echo "120"                        > /sys/kernel/config/usb_gadget/usb_keyboard/configs/c.1/MaxPower

ln -s /sys/kernel/config/usb_gadget/usb_keyboard/functions/hid.usb0 /sys/kernel/config/usb_gadget/usb_keyboard/configs/c.1

ls /sys/class/udc/ > /sys/kernel/config/usb_gadget/usb_keyboard/UDC #This fails with "ls: write error: Device or resource busy"


Контетнты из /sys/class/udc/ это не то, что они должны быть в соответствии с инструкциями по настройке configfs HID. Там должен быть список модулей, которые нужно загрузить. Вместо этого есть вот это "musb-hdrc.0.auto- симлинк.

Кроме того, я погуглил свой a** off, пытаясь найти еще какую-то информацию по этому вопросу, но ничего не вышло.

2 Ответов

Рейтинг:
2

Jochen Arndt

До сих пор я этого не делал. Так что это может и не помочь.

Насколько я понимаю, /sys/class/udc/ создается / заполняется предыдущими командами скрипта (ранее не существовал или пуст). Так что я подожду некоторое время (sleep) перед доступом к этому каталогу (больше не занят).

Вы также можете сделать последний шаг вручную. То есть выполнить

ls /sys/class/udc/
выберите имя устройства и запишите его в файл UDC с помощью echo.

Если каталог содержит несколько файлов, которые должны быть все использованы, я бы также ожидал, что команда 'ls -1 dir' получит список, разделенный новой строкой.


Ivan Ivanov 83

Спасибо за ваш ответ :)

"Насколько я понимаю, /sys/class/udc/ создается / заполняется предыдущими командами скрипта (ранее не существовал или пуст)"
- Это вполне может быть так. Однако содержимое этого каталога остается неизменным до и после запуска скрипта. Эфирные команды в скрипте не влияют на содержимое или они не настраивают все должным образом.

Я действительно пытался повторить содержимое файла /sys/class/udc/ (а именно hdrc.0.auto) в файл UDC, но каждый раз получаю одну и ту же ошибку. (Это после того, как сценарий будет запущен)

Итак, вы знакомы с программированием BeagleBone, если позволите спросить? :)

Jochen Arndt

Не с ББ, а с Пи. Но оба используют Debian, так что есть много аналогий.

К сожалению, я до сих пор не использовал USB-гаджеты. Так что я на самом деле не знаю, что происходит в деталях. Но вы пишете в /sys/kernel/config/usb_gadget/usb_keyboard/ раньше. Когда вы знаете имя устройства и оно не меняется, вы можете попробовать установить его немного раньше (или попытаться получить доступ к UDC раньше), чтобы узнать, когда оно становится занятым.

Рейтинг:
18

Member 14002991

Я не знаю, нужно ли тебе это еще, но я нашел решение твоей проблемы.

Я только начинаю ... проект где мне нужно сделать то же самое.

BBB настраивает USB-клиенты в /opt/scripts/boot/am335x_evm.sh
И похоже, что после этого вы уже не сможете отключить УДК для того, чтобы установить свой гаджет.

Поэтому я отключил массовое запоминающее устройство и USB-сеть в /etc/default/bb-boot а также прокомментировал 2 строки в /opt/scripts/boot/am335x_evm.sh чтобы отключить ACM (USB Serial).
Убедитесь, что вы подключаетесь через ethernet и знаете IP-адрес до вы перезагружаетесь :-)
После этого вы должны иметь возможность отключить УДК с помощью

cd /sys/kernel/config/usb_gadget/g_multi
echo "" > UDC
и запустите свой сценарий.

Надеюсь, это поможет.


Ivan Ivanov 83

Да редактирование am335x_evm.sh это абсолютно правильный способ настройки гаджетов BBBs. Это дает вам контроль почти над всеми перифериями.