Библиотека LUFA (раннее название MyUSB) версия 101122
Поддержка канала

Modules

 Канал чтения и записи данных
 Обработка пакета канала
 Обработка канала запросов управления

Defines

#define PIPE_CONTROLPIPE   0
#define PIPE_CONTROLPIPE_DEFAULT_SIZE   64
#define PIPE_PIPENUM_MASK   0x07
#define PIPE_TOTAL_PIPES   7
#define PIPE_MAX_SIZE   256
#define PIPE_EPNUM_MASK   0x0F
#define PIPE_EPDIR_MASK   0x80

Functions

static uint8_t Pipe_GetCurrentPipe (void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE
static void Pipe_SelectPipe (const uint8_t PipeNumber) ATTR_ALWAYS_INLINE
static void Pipe_ResetPipe (const uint8_t PipeNumber) ATTR_ALWAYS_INLINE
static void Pipe_EnablePipe (void) ATTR_ALWAYS_INLINE
static void Pipe_DisablePipe (void) ATTR_ALWAYS_INLINE
static bool Pipe_IsEnabled (void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE
static uint8_t Pipe_GetPipeToken (void) ATTR_ALWAYS_INLINE
static void Pipe_SetPipeToken (const uint8_t Token) ATTR_ALWAYS_INLINE
static void Pipe_SetInfiniteINRequests (void) ATTR_ALWAYS_INLINE
static void Pipe_SetFiniteINRequests (const uint8_t TotalINRequests) ATTR_ALWAYS_INLINE
static bool Pipe_IsConfigured (void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE
static uint8_t Pipe_BoundEndpointNumber (void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE
static void Pipe_SetInterruptPeriod (const uint8_t Milliseconds) ATTR_ALWAYS_INLINE
static uint8_t Pipe_GetPipeInterrupts (void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE
static bool Pipe_HasPipeInterrupted (const uint8_t PipeNumber) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE
static void Pipe_Unfreeze (void) ATTR_ALWAYS_INLINE
static void Pipe_Freeze (void) ATTR_ALWAYS_INLINE
static bool Pipe_IsFrozen (void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE
static void Pipe_ClearError (void) ATTR_ALWAYS_INLINE
static bool Pipe_IsError (void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE
static void Pipe_ClearErrorFlags (void) ATTR_ALWAYS_INLINE
static uint8_t Pipe_GetErrorFlags (void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE
bool Pipe_ConfigurePipe (const uint8_t Number, const uint8_t Type, const uint8_t Token, const uint8_t EndpointNumber, const uint16_t Size, const uint8_t Banks)
bool Pipe_IsEndpointBound (const uint8_t EndpointAddress)

Variables

uint8_t USB_ControlPipeSize

Маски флагов ошибки канала

#define PIPE_ERRORFLAG_OVERFLOW   (1 << 6)
#define PIPE_ERRORFLAG_UNDERFLOW   (1 << 5)
#define PIPE_ERRORFLAG_CRC16   (1 << 4)
#define PIPE_ERRORFLAG_TIMEOUT   (1 << 3)
#define PIPE_ERRORFLAG_PID   (1 << 2)
#define PIPE_ERRORFLAG_DATAPID   (1 << 1)
#define PIPE_ERRORFLAG_DATATGL   (1 << 0)

Маски токенов канала

#define PIPE_TOKEN_SETUP   (0 << PTOKEN0)
#define PIPE_TOKEN_IN   (1 << PTOKEN0)
#define PIPE_TOKEN_OUT   (2 << PTOKEN0)

Маски режима банка канала

#define PIPE_BANK_SINGLE   (0 << EPBK0)
#define PIPE_BANK_DOUBLE   (1 << EPBK0)

Detailed Description

Этот модуль содержит функции, макросы и перечисления, относящиеся к поддержке каналов в режиме хоста USB. Содержит как макросы поддержки канала, так и функции обработки прерывания канала и функции передачи/приема данных различных типов.


Define Documentation

#define PIPE_BANK_DOUBLE   (1 << EPBK0)

Маска выбора режима банка для макроса Pipe_ConfigurePipe(). Показывает, что канал должен иметь два банка, которые требуют больше памяти USB FIFO, но в результате быстрее передает, поскольку при обращении одной стороны (хоста AVR или подключеного устройства USB) к одному банку другая сторона может обратиться к другому банку.

#define PIPE_BANK_SINGLE   (0 << EPBK0)

Маска выбора режима банка для макроса Pipe_ConfigurePipe(). Показывает, что канал имеет один банк, который требует меньше памяти USB FIFO, но в результате медленнее передает, поскольку в каждый момент времени к банку канала может получить доступ только одна сторона (хост AVR или подключеное устройство USB).

#define PIPE_CONTROLPIPE   0

Адрес для канала управления по умолчанию, который всегда занимает адрес 0. Этот макрос задан только для удобства, чтобы получить более читаемый код при использовании макросов канала.

#define PIPE_CONTROLPIPE_DEFAULT_SIZE   64

Размер по банка канала управления по умолчанию, пока не изменнено значение Endpoint0Size в дескрипторе устройства на подключенном устройстве.

#define PIPE_EPDIR_MASK   0x80

Маска направления конечной точки, для маскирования адресов конечной точки при получении направления конечной точки сравнением с масками ENDPOINT_DESCRIPTOR_DIR_*.

#define PIPE_EPNUM_MASK   0x0F

Маска номера конечной точки, для маскирования адресов конечной точки при получении числового адреса конечной точки в подключенном устройстве.

#define PIPE_ERRORFLAG_CRC16   (1 << 4)

Маска для Pipe_GetErrorFlags(), показывающая, что в канале произошла ошибка CRC на приеме данных.

#define PIPE_ERRORFLAG_DATAPID   (1 << 1)

Маска для Pipe_GetErrorFlags(), показывающая, что в канале произошла аппаратная ошибка данных PID.

#define PIPE_ERRORFLAG_DATATGL   (1 << 0)

Маска для Pipe_GetErrorFlags(), показывающая, что в канале произошла аппаратная ошибка переключения (toggle) данных.

#define PIPE_ERRORFLAG_OVERFLOW   (1 << 6)

Маска для Pipe_GetErrorFlags(), показывающая, что в канале произошла ошибка переполнения на приеме данных.

#define PIPE_ERRORFLAG_PID   (1 << 2)

Маска для Pipe_GetErrorFlags(), показывающая, что в канале произошла ошибка аппаратного PID.

#define PIPE_ERRORFLAG_TIMEOUT   (1 << 3)

Маска для Pipe_GetErrorFlags(), показывающая, что в канале произошла ошибка аппаратного таймаута.

#define PIPE_ERRORFLAG_UNDERFLOW   (1 << 5)

Маска для Pipe_GetErrorFlags(), показывающая, что в канале произошла ошибка недополнения на приеме данных.

#define PIPE_MAX_SIZE   256

Размер в байтах наибольшего размера банка канала в устройстве. Не все банки на каждой модели AVR поддерживают наибольший возможный размер банка на устройстве; разные номера каналов поддерживают разные максимальные размеры банков. Это значение отражает максимальный возможный размер банка любого канала на выбранной в настоящий момент модели USB AVR.

#define PIPE_PIPENUM_MASK   0x07

Маска номера канала, для маскирования адресов канала, чтобы получить числовой адрес канала в устройстве.

#define PIPE_TOKEN_IN   (1 << PTOKEN0)

Маска токена для Pipe_ConfigurePipe(). Устанавливает канал как токен IN (для каналов, которые не CONTROL), показывающий, что данные по каналу идут от устройства в хост.

#define PIPE_TOKEN_OUT   (2 << PTOKEN0)

Маска токена для Pipe_ConfigurePipe(). Устанавливает канал как токен OUT (для каналов, которые не CONTROL), показывающий, что данные по каналу идут от хоста в устройство.

#define PIPE_TOKEN_SETUP   (0 << PTOKEN0)

Маска токена для Pipe_ConfigurePipe(). Устанавливает канал как токен SETUP (для каналов типа CONTROL), который будет переключать запрос управления на подключенном устройстве, когда данные записываются в канал.

#define PIPE_TOTAL_PIPES   7

Общее количество каналов (включая канал управления по умолчанию по адресу 0), которое можно использовать в устройстве. Различные модели USB AVR поддерживают разное количество каналов, и эта величина отражает максимальное количество каналов для выбранной в настоящий момент модели AVR.


Function Documentation

static uint8_t Pipe_BoundEndpointNumber ( void  ) [inline, static]

Запрашивает номер у конечной точки внутри подключенного устройства, с которой связан выбранный в настоящий момент канал.

Returns:
номер конечной точки с которой связан выбранный в настоящий момент канал.
static void Pipe_ClearError ( void  ) [inline, static]

Очищает главный флаг ошибки канала.

static void Pipe_ClearErrorFlags ( void  ) [inline, static]

Очищает флаги ошибки выбранного в настоящий момент канала, но не очищает главный флаг ошибки канала.

bool Pipe_ConfigurePipe ( const uint8_t  Number,
const uint8_t  Type,
const uint8_t  Token,
const uint8_t  EndpointNumber,
const uint16_t  Size,
const uint8_t  Banks 
)

Конфигурирует канал указанного номера в указанные тип, токен, целевую конечную точку в подключенном устройстве, размер банка и его режим.

Только что сконфигурированные каналы по умолчанию заморожены, и должны быть перед использованием разморожены вызовом Pipe_Unfreeze(). Каналы должны удерживаться замороженными, за исключением ожидания данных от устройства в режиме IN, или отправки данных устройству в режиме OUT. Каналы типа IN также автоматически конфигурируются для приема бесконечного количества запросов IN без автоматической заморозки - это можно отменить вызоваом Pipe_SetFiniteINRequests().

Parameters:
[in]NumberНомер канала для конфигурирования. Должен быть больше 0 и меньше чем PIPE_TOTAL_PIPES.
[in]TypeТип канала для конфигурирования, маска EP_TYPE_*. Не все типы каналов допустимы для устройств USB Low Speed USB - см. спецификацию USB 2.0.
[in]TokenТокен данных канала, либо PIPE_TOKEN_SETUP, либо PIPE_TOKEN_OUT, либо PIPE_TOKEN_IN. Все каналы (за исключением типа Control - управление) однонаправленные - данные могут быть только прочитаны из банка канала или записаны туда, в зависимости от направления канала, но не одновременно в обоих направлениях.
[in]EndpointNumberИндекс конечной точки в подключенном устройстве, с которой должен взаимодействовать канал.
[in]SizeРазмер в байтах банка канала, где сохраняются пакеты перед отправкой в устройство USB device, или после приема их от устройства USB (в зависимости от направления данных в канале). Размер банка должен показывать максимальный размер пакета, который может обработать канал.
[in]BanksКоличество банков для использования с конфигурируемым каналом, маска PIPE_BANK_*. Большее количество банков тратят больше USB DPRAM, но увеличивают быстродействие. Каналы изохронного типа должны иметь как минимум два банка.
Note:
Конечные точки должны конфигурироваться в порядке возрастания, иначе произойдет повреждение банка.

У некоторых моделей USB AVR каналы могут иметь разный макимальный размер пакета, в зависимости от индекса канала - см. даташит выбранного USB AVR, чтобы определить максимальный размер банка для каждого канала.

Канал управления по умолчанию не должен быть сконфигурирован приложением пользователя, так как он автоматически конфигурируется внутри кода библиотеки.

Эта подпрограмма после своего успешного завершения автоматически выбирает указанный канал. В случае ошибки будет выбран канал, который не сконфигурировался.
Returns:
двоичное true, если конфигурация завершилась успешно, иначе false.
static void Pipe_DisablePipe ( void  ) [inline, static]

Запрещает выбранный в настоящий момент канал, после чего через этот канал данные не могут быть отправлены в подключенное устройство USB или приняты от него.

static void Pipe_EnablePipe ( void  ) [inline, static]

Разрешает выбранный в настоящий канал, чтобы данные могли быть отправлены в подключенное устройство USB и приняты из него.

Precondition:
Выбранный в настоящий момент канал должен быть сначала правильно сконфигурирован через Pipe_ConfigurePipe().
static void Pipe_Freeze ( void  ) [inline, static]

Замораживает выбранный канал, что запрещает коммуникацию через него с подключенным устройством.

static uint8_t Pipe_GetCurrentPipe ( void  ) [inline, static]

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

Returns:
индекс выбранного в настоящий момент канала.
static uint8_t Pipe_GetErrorFlags ( void  ) [inline, static]

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

Returns:
маска, состоящая из битов PIPE_ERRORFLAG_*, показывающих, какая ошибка произошла на выбранном канале.
static uint8_t Pipe_GetPipeInterrupts ( void  ) [inline, static]

Возвращает маску, показывающую, какие периоды прерывания канала истекли, показывая, что канал должен быть обслужен.

Returns:
маска, биты которой показывают, какой канал прерывается.
static uint8_t Pipe_GetPipeToken ( void  ) [inline, static]

Получает токен текущего канала, показывающий направление и тип данных канала.

Returns:
токен текущего канала, как маска PIPE_TOKEN_*.
static bool Pipe_HasPipeInterrupted ( const uint8_t  PipeNumber) [inline, static]

Определяет, прерван ли канал с указанным номером (допустимо только с каналами типа INTERRUPT).

Parameters:
[in]PipeNumberиндекс канала, у которого должен быть протестирован флаг прерывания.
Returns:
двоичное true, если указанный канал прерван, иначе false.
static bool Pipe_IsConfigured ( void  ) [inline, static]

Определяет, сконфигурирован ли выбранный в настоящее время канал.

Returns:
двоичное true, если выбранный канал сконфигурирован, иначе false.
static bool Pipe_IsEnabled ( void  ) [inline, static]

Определяет, разрешен ли выбранный в настоящий момент канал, но необязательно он должен быть при этом сконфигурирован.

Returns:
двоичное True, если выбранный в настоящий момент канал разрешен, иначе false.
bool Pipe_IsEndpointBound ( const uint8_t  EndpointAddress)

Определяет, привязана ли к каналу конечная точка устройства с указанным адресом. Если найден канал, который привязан к указанной конечной точке, то он автоматически становится выбранным.

Parameters:
[in]EndpointAddressдля проверки адрес и маска направления конечной точки внутри подключенного устройства.
Returns:
двоичное true, если канал привязан к конечной точке с указанным адресом и в указанном направлении, иначе false.
static bool Pipe_IsError ( void  ) [inline, static]

Определяет, установлен ли главный флаг ошибки выбранного в настоящий момент канала, что показывает некоторую аппаратную ошибку, произошедшую на канале.

See also:
См. макрос Pipe_GetErrorFlags() для информации о получении точного флага ошибки.
Returns:
двоичное true, если на выбранном канале произошла ошибка, иначе false.
static bool Pipe_IsFrozen ( void  ) [inline, static]

Определяет, что выбранный канал заморожен, и не может принять данные.

Returns:
двоичное true, если выбранный канал заморожен, иначе false.
static void Pipe_ResetPipe ( const uint8_t  PipeNumber) [inline, static]

Сбрасывает нужный канал, включая банки и флаги канала.

Parameters:
[in]PipeNumberиндекс канала, который будет сброшен.
static void Pipe_SelectPipe ( const uint8_t  PipeNumber) [inline, static]

Выбирает канал указанного номера. Любые операции с каналом, которые не требуют номера канала, работают с текущим выбранным каналом.

Parameters:
[in]PipeNumberИндекс выбираемого канала.
static void Pipe_SetFiniteINRequests ( const uint8_t  TotalINRequests) [inline, static]

Конфигурирует выбранный в настоящий момент канал, чтобы разрешить каналу принять указанное количество запросов IN, после чего канал автоматически заморозится.

Parameters:
[in]TotalINRequestsобщее количество запросов IN, которое канал может принять перед заморозкой.
static void Pipe_SetInfiniteINRequests ( void  ) [inline, static]

Конфигурирует выбранный в настоящий момент канал, чтобы разрешить любое количество запросов IN.

static void Pipe_SetInterruptPeriod ( const uint8_t  Milliseconds) [inline, static]

Устанавливает период между прерываниями для канала типа INTERRUPT на указанное количество милисекунд.

Parameters:
[in]Millisecondsколичество милисекунд между каждым опросом канала.
static void Pipe_SetPipeToken ( const uint8_t  Token) [inline, static]

Устанавливает токен для выбранного в настоящий момент канала в один из токенов, указанный масками PIPE_TOKEN_*. Может использоваться на каналах типа CONTROL, чтобы разрешить двунаправленные передачи данных во время запросов управления, или на обычных каналах, чтобы разрешить полудуплексную передачу данных на устройство, которое имеет две конечные точки противоположных направлений, разделяющих один и тот же адрес конечной точки в пределах устройства.

Parameters:
[in]Tokenновый токен канала для установки на выбранный канал, как маска PIPE_TOKEN_*.
static void Pipe_Unfreeze ( void  ) [inline, static]

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


Variable Documentation

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

Note:
Эта переменная должна быть обработана как только для чтения в пользовательском приложении, и никогда вручную не изменяться.
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines