Драйвер USB устройства URC220 для OS QNX (953917), страница 5
Текст из файла (страница 5)
В это время, при подключении и отключении25устройств, ОС вызывает функции callback_insertion() и callback_removal() дляобработки этих событий. Эти функции производят нумерацию устройств ивызывают функции dev_open() и dev_close() для начала и окончания работы сустройством.После нажатия на клавишу, основной поток закрывает все устройства, завершаетработу с USB и удаляет общую память, после чего программа завершается.Рассмотрим подробнее устройство функций dev_open() и dev_close().
Алгоритмработы этих функций показан на рисунке 6.3.Рис.6.3 Работа функций dev_open() и dev_close()Объект dev представляет собой массив, элементами которого являются структурыURC_PARAMETERS, содержащие два поля:1) pipe – объект класса CURCPIPE (реализован в файле “urcpipe.cpp”) дляработы с USB: подключение/отключение от устройства и передача данных;2) thread – идентификатор потока в QNX.Объект shmem – это общая память, представляющая собой массив структурURC_SHARED_MEM, содержащие поля для обмена данными, в том числе объектmutex, служащий для синхронизации доступа к памяти между несколькимипроцессами: сервером и клиентскими программами.Функция dev_open() сначала вызывает функцию open() соответствующего объектаpipe для подключения к устройству, далее инициализирует объект mutex.
Послеэтого создаёт поток, в котором начинает выполняться функция dev_thread().Функция dev_close() выполняет операции, обратные операциям dev_open().Функция dev_thread() представляет собой бесконечный цикл, где постоянно идётпроверка: нужно ли передать данные от клиента к устройству или наоборот. Приэтом обращение к данным как функцией dev_thread(), так и клиентскими26программами, осуществляется синхронно, так как используется mutex. Один изпотоков первым переводит mutex в состояние locked. Далее, когда другой потокпытается обратиться к данным, он зависает до тех пор, пока первый поток невыполнит все операции с данными и не переведёт mutex в состояние unlocked,чтобы к данным мог получить другой поток, который также установит mutex всостояние locked, и так далее. То есть с данными в один момент времени работаеттолько один поток.
Для каждого устройства имеется свой mutex и поток, гдевыполняется dev_thread().Таким образом, во время работы сервера работают сразу несколько потоков:главный (функция main()) в состоянии ожидания плюс по одному потоку накаждое подключенное к компьютеру устройство.Алгоритм работы функции dev_thread() показан на рисунке 6.4.Рис.6.4 Алгоритм работы функции dev_thread()Для обмена данными с устройством используются функции write() и read() объектаpipe. Таким образом, класс CURCPIPE, кроме конструктора и деструктора состоитиз следующих функций.27CURCPIPE::open() - функция открывает устройство,конфигурацию, в случае ошибки возвращает 0.ипроизводитегоCURCPIPE::close() – отключает от устройства.CURCPIPE::bulk_cbf() – функция вызывается операционной системой дляобработки различных событий во время передачи данных.CURCPIPE::wait_io() – после вызова функция ожидает окончания операцииприёма или отправки данных до их завершения или до возникновения ошибки.CURCPIPE::write() – отправляет данные по USB в устройство, вызывает в своёмкоде функцию wait_io(), поэтому функция write() является синхронной функциейотправки данных.CURCPIPE::read() – принимает данные по USB от устройства, вызывает в своёмкоде функцию wait_io(), поэтому функция read() является синхронной функциейприёма данных.6.2 Алгоритм работы клиентских программАлгоритм работы той части клиентских программ, которая отвечает завзаимодействие с устройствами, во многом похож на алгоритм работы функцииdev_thread() и показан на рисунке 6.5Рис.6.5 Алгоритм работы клиентских программ28Здесь сначала идёт подключение к программе внешней памяти, чтобы иметьдоступ к полям массива структур.
Далее идёт получение доступа ксоответствующей ячейке массива через mutex (который также является полемэтой структуры). После этого идёт копирование данных – чтение или запись, азатем разблокировка данных, чтобы к ним мог получить доступ сервер ивыполнить действия для передачи или приёма данных от устройства.Этот алгоритм реализован в классе CURC220, который представляет собойоболочку для программ конечного пользователя, а также имеет специальныйнабор функций, необходимый для удобной работы с устройством.
Описание этихфункций находится в разделе “3.2 Описание функций класса CURC220”.297. Содержание1. Техническое задание ............................................................................... 22. Драйвер..................................................................................................... 32.1 Алгоритм работы ........................................................................................... 33. Библиотека для работы с платой на компьютере ..................................
53.1 Алгоритм работы с библиотекой .................................................................... 53.2 Описание функций класса CURC220............................................................... 54. Применение библиотеки.......................................................................... 94.1 Создание проекта .......................................................................................... 94.2 Пример использования ..................................................................................
94.3 Универсальный пример................................................................................ 135. Устройство шины USB ............................................................................ 165.1 Общие сведения .......................................................................................... 165.2 Версии спецификаций и скорость передачи данных ....................................
165.3 Архитектура................................................................................................. 165.4 Физическая среда ........................................................................................ 175.5 Передача данных......................................................................................... 185.5.1 Состояние шины USB ................................................................................ 185.5.2 Транзакции ............................................................................................... 195.6 Протокол обмена данными .......................................................................... 225.6.1 Управление устройством...........................................................................
225.6.2 Дескрипторы (Descriptors)......................................................................... 226. Реализация ПО для управления URC220............................................... 246.1 Алгоритм работы сервера ............................................................................ 246.2 Алгоритм работы клиентских программ .......................................................
287. Содержание ............................................................................................ 3030.