Новый проект наконец-то вышел на уровень когда требуется сопряжение USB моста микроконтроллерной платки с PC based компьютером верхнего уровня. Основная задача заключается в необходимости читать и записывать данные на борт специализированного USB устройства, причем перед процедурой обмена данными это устройство необходимо сконфигурировать на определенный режим работы.
Для реализации указанной выше задачи я буду использовать Ultimate++. Его установку быстрее и проще вести из PPA репозитория под Ubuntu. Не буду останавливаться на этом, так как исчерпывающее описание процесса установки можно найти на сайте www.ultimatepp.org.
В Linux для взаимодействия с USB устройствами существует библиотека libusb, которая, как следует из описания "Libusb is a suite of user-mode routines for controlling data transfer to and from USB devices on Unix-like systems without the need for kernel-mode drivers", не требует от пользователя написания собственных драйверов режима ядра, что существенно снижает затраты на разработку. Этой библиотекой и буду пользоваться. Но сначала USB устройство необходимо определенным образом сконфигурировать. Делается это с помощью firmware прошивки, которая записывается в устройство с host компьютера. Этот момент рассмотрим подробнее.
Итак, имеется устройство типа EZ-USB, подключенное к host компьютеру Ubuntu 14.04 LTS. Требуется загрузить специфическую прошивку на устройство. Воспользуемся для этого утилитой fxload, являющуюся частью проекта Linux Hotplug Project. В файле README.txt на утилиту кратко упоминается схема загрузки с помощью hotplug скрипта, который запускается на исполнение при подключении EZ-USB на шину USB. Воспользуемся этим. Разобьем задачу на три подзадачи.
Во-первых, необходимо поймать факт подключения на шину USB нового устройства. Во-вторых, определить, что это устройство наше, и в третьих загрузить в устройство прошивку с помощью fxload. Для решения первых двух подзадач воспользуемся udev. Займемся этим.
Как известно, udev слушает netlink-сокет и формирует структурированные события которыми можно пользоваться. В моем случае в каталоге /etc/udev/rules.d я создаю файлик 10-local.rules следующего содержания:
Итак, имеется устройство типа EZ-USB, подключенное к host компьютеру Ubuntu 14.04 LTS. Требуется загрузить специфическую прошивку на устройство. Воспользуемся для этого утилитой fxload, являющуюся частью проекта Linux Hotplug Project. В файле README.txt на утилиту кратко упоминается схема загрузки с помощью hotplug скрипта, который запускается на исполнение при подключении EZ-USB на шину USB. Воспользуемся этим. Разобьем задачу на три подзадачи.
Во-первых, необходимо поймать факт подключения на шину USB нового устройства. Во-вторых, определить, что это устройство наше, и в третьих загрузить в устройство прошивку с помощью fxload. Для решения первых двух подзадач воспользуемся udev. Займемся этим.
Как известно, udev слушает netlink-сокет и формирует структурированные события которыми можно пользоваться. В моем случае в каталоге /etc/udev/rules.d я создаю файлик 10-local.rules следующего содержания:
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="04b4", RUN+="/bin/bash /etc/udev/rules.d/usb4b4add"Комбинация ключей ACTION, SUBSYSTEM, ATTR{idVendor} предписывают udev реагировать на подключение нового устройства от указанного производителя на шине USB, а ключ RUN определяет командный скрипт запускаемый на исполнение по факту появления в системе этого устройства.
Некоторые полезные команды udev:Теперь, когда у нас есть устройство, можно попытаться загрузить в него прошивку... Разбирая fxload обнаружил, что эта утилита в своей работе опирается на usbfs, поддержка которой в ядре 3.19 отключена по умолчанию. В частности, теперь невозможно монтировать
udevadm monitor --env: смотреть в режиме реального времени события
udevadm control --reload: перечитать правила событий
mount -t usbfs none ...Сей факт оказался неожиданным. Народ в интернете предлагает различные обходные пути, но все они похожи на "костыли" и не решают проблемы в корне. А пересобирать ядро с опцией CONFIG_USB_DEVICEFS=y не хочется. Итог - грабли подкрались незаметно :)