Основные функции и подпрограммы

Программное обеспечение USB

Библиотечные подпрограммы разработаны для использования с компоновщиком. Нет необходимости создавать дополнительные включаемые файлы. Подпрограммы предлагаются упакованными в следующие файлы:

USB_CH9.ASM - обработка всех команд в соответствии с главой 9 спецификации USB.

USB_INTF.ASM - функции интерфейса PutUSB, GetUSB.

USBMACRO.INC - макрокоманды.

USB_DEFS.INC - определения.

USB_INT.ASM -типовая подпрограмма обработки прерывания.

16С765.LKR - сценарий для компоновщика MPLAB.

InitUSB должна вызываться основной программой после включения питания. Она устанавливает таблицу дескрипторов буферов, приводит модуль в состояние включено и готовит устройство к процессу нумерации. При этом разрешается прерывание USB только по команде сброс USB, что предотвращает ответы на какие-либо операции на шине, пока модуль не сброшен. Прерывание RST_USB переводит модуль в заданное по умолчанию состояние, после чего он отвечает на команды по нулевому адресу. Если он получает команду SET_ADDRESS, то переходит к состоянию адресовано и может отвечать на команды по новому адресу.

PutUSB (указатель на буфер, размер буфера, номер оконечной точки) посылает данные к главной ЭВМ. Указатель на блок данных передается в FSR/IRP, размер блока и номер оконечной точки передается в регистре W. Если выходной буфер доступен для оконечной точки, то блок данных копируется в буфер, переворачивается бит DATA 0/1 и устанавливается бит обладания буфером. Если буфер недоступен, т.е. он был предварительно загружен, но главная ЭВМ не запросила его передачу, то в этом случае возвращается код отказа для того, чтобы основная программа могла повторить передачу этого буфера позже.

PutEPn (указатель на буфер, размер буфера) аналогична PutUSB за исключением того, что номер оконечной точки задается в инструкции.

GetUSB (указатель на буфер, номер оконечной точки) возвращает данные, посланные из главной ЭВМ. Если имеется готовый буфер (то есть, данные были получены от главной ЭВМ), то он копируется по заданному адресу, (указатель на буфер в FSF/IRP и номер оконечной точки в регистре W). Если данные не получены, то возвращается код отказа. Таким образом, функции опроса буфера и копирования готовых данных объединены в одну функцию.

GetEPn (указатель на буфер) аналогична GetUSB за исключением того, что номер оконечной точки задается в инструкции.

ServiceUSBInt обрабатывает все прерывания, сгенерированные модулем USB. В первую очередь копируется активный буфер в общую память, что обеспечивает быстрый оборот буферов в двухпортовой памяти, а также позволяет избежать необходимости переключать банки в процессе обработки буфера.

StallUSBEP/UnstallUSBEP устанавливает или очищает бит останова BSTALL в регистре управления оконечной точки. Бит останова указывает главной ЭВМ, что требуется вмешательство пользователя и пока такого вмешательства не будет, попытки связи с оконечной точкой не будут успешными. После вмешательства пользователя функция UnstallUSBEP очистит бит, что позволит возобновить связь. Примером этого может быть отсутствие бумаги в принтере.

SoftDetachUSB очищает бит DEV_ATT приблизительно на 50 мс, электрически отключая устройство от шины, а затем повторно подключает его. Это позволяет главной ЭВМ обнаружить отключение устройства и выполнить процесс нумерации заново.

CheckSleep проверяет бит UIDLE регистра UCTRL, если бит установлен, что указывает на отсутствие на шине каких-либо действий в течение 3 мс, то переводит устройство в режим останова. Режим останова будет продолжаться до пробуждения устройства действиями на шине или другим прерыванием. Эта функция должна выполняться вне программы обработки прерывания, потому что для пробуждения необходимо прерывание, а также потому, что основная программа может быть не готова к останову. Основная программа должна периодически вызывать эту функцию, когда устройство может перейти в режим останова.

Перед переходом в режим останова функция разрешает прерывания, так что устройство будет пробуждено при активизации шины. После обработки прерывания программа будет продолжена с команды после вызова CheckSleep.

Макрокоманда ConfiguredUSB непрерывно опрашивает биты состояния и ожидает пока устройство не будет сконфигурировано главной ЭВМ. Макрокоманда должна использоваться после вызова функции InitUSB.

Фикция SetConfiguration позволяет по команде конфигурирования от главной ЭВМ передавать параметры устройства. Значения параметров устройства хранятся в USB_CURR_CONFIG программного модуля. При вызове этой функции в регистре W передается указатель на новую конфигурацию. Эта функция вызывается из программы обработки прерывания, так что значения параметров устройства должны быть сохранены до того как прерывания будут разрешены.

#define ERRORCOUNTERS - это определение включает текст подпрограммы, позволяющей считать число ошибок, которые происходят с учетом типа ошибок. При этом требуется дополнительное пространство памяти программ и ячейки оперативной памяти для организации счетчиков.

#define FUNCTIONIDS - это определение удобно при отладке. Оно кодирует 6 старших бит регистра USWSTAT, которые показывают какая функция выполняется.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: