
Московский государственный технический университет им. Н.Э. Баумана
Факультет «Робототехника и комплексная автоматизация»
Кафедра «Робототехника»
Драйвер USB многофункционального
устройства URC220 для ОСРВ QNX
Пояснительная записка
Студент ……………………… (Куренев П.Н.) Группа РК10-72
Руководитель проекта ……………………… (Гончаренко К.В.)
Москва
2007
1. Техническое задание
Необходимо разработать для операционной системы реального времени QNXдрайвер устройстваURC220, подключаемого к компьютеру через универсальную последовательную шину (USB).
Также необходимо разработать библиотеку для облегчения написания пользовательских программ на C++, а также описание этой библиотеки и демонстрационные программы.
2. Драйвер
Для многих задач не всегда требуется писать программу непосредственно для микроконтроллера, так как достаточно простого управления с компьютера. Для этого была реализована программа для микроконтроллера, которая принимает команды от компьютера по USBинтерфейсу и управляет всеми периферийными устройствами на плате. Для компьютера создан драйвер и библиотека, которая позволяет легко управлять платой из любой программы подQNX.
Драйвер USBустройстваURC220 реализован в виде исполняемого файла “URCSrv”. Кроме драйвера, программа также является нумератором подключаемых устройств. Выполнена в виде консольного приложения.
Программа URCSrv, выполняет следующие задачи:
- определение факта подключения устройства;
- назначение номера подключённому устройству;
- обработка подключения, установление соединения;
- корректное отключение от устройства;
- предоставление интерфейса для взаимодействия с устройствами пользовательским программам.
2.1 Алгоритм работы
После за пуска, драйвер подключается к USBстекуQNXи назначает функции, которые операционная система вызывает в случае подключения и отключения устройства.
Функция также создаёт объект общего доступа к памяти под именем “/dev/shmem/urc_srv_100”. С помощью этого объекта происходит взаимодействие между драйвером и пользовательскими программами.
После подключения устройства, программа ищет незанятый номер в диапазоне [0; (URC_MAXDEV-1)] (URC_MAXDEV= 127) и присваивает его вновь подключённому устройству. Все дальнейшие обращения к устройству будут производиться по этому номеру (номер является индексом элемента в массиве объектов структур-описателей).
Далее происходит подключение к устройству и считывание его дескрипторов (дескриптор устройства, конфигурации, конечных точек (endpoints)) и проверка их соответствия тем, которые должны быть у устройств, для которых написан этот драйвер. Это вторая проверка, так как ещё при подключении кUSBстеку были заданыVID(VendorID) иPID(ProductID) того устройства, подключение которого нужно обрабатывать.
Затем создаются потоки чтения и записи (pipes) и выделяется память для буфера данных. Теперь устройство готово к работе, поэтому создаётся поток (thread) для обработки команд пользовательского приложения. То есть, кроме основного потока программы создаётся ещё по одному потоку на каждое подключённое устройство.
Рис.1.1 Внешний вид программы URCSrv |
Общая память представляет собой массив из URC_MAXDEVэлементов. Каждый элемент массива – структура. Поля структуры составляют:
- mutexдля распределения доступа к памяти между драйвером и приложениями;
- состояние этого слота подключения;
- данные, отправляемые или принимаемые из устройства;
- команда; которую должен выполнить сервер.
После отключения устройства происходит удаление всех созданных объектов (mutex,pipes, буфер и т.д.) и отсоединение от устройства.
При закрытии программы происходит принудительное отключение от всех подключённых устройств, а также удаление объекта общего доступа к памяти.
Все действия драйвера отображаются в окне программы (см. рис.1.1).