Библиотека LUFA (раннее название MyUSB) версия 101122
Парсер дескриптора конфигурации

Defines

#define EP_TYPE_MASK   0x03
#define DESCRIPTOR_PCAST(DescriptorPtr, Type)   ((Type*)(DescriptorPtr))
#define DESCRIPTOR_CAST(DescriptorPtr, Type)   (*DESCRIPTOR_PCAST(DescriptorPtr, Type))
#define DESCRIPTOR_TYPE(DescriptorPtr)   DESCRIPTOR_PCAST(DescriptorPtr, USB_Descriptor_Header_t)->Type
#define DESCRIPTOR_SIZE(DescriptorPtr)   DESCRIPTOR_PCAST(DescriptorPtr, USB_Descriptor_Header_t)->Size

Typedefs

typedef uint8_t(* ConfigComparatorPtr_t )(void *)

Enumerations

enum  USB_Host_GetConfigDescriptor_ErrorCodes_t {
  HOST_GETCONFIG_Successful = 0,
  HOST_GETCONFIG_DeviceDisconnect = 1,
  HOST_GETCONFIG_PipeError = 2,
  HOST_GETCONFIG_SetupStalled = 3,
  HOST_GETCONFIG_SoftwareTimeOut = 4,
  HOST_GETCONFIG_BuffOverflow = 5,
  HOST_GETCONFIG_InvalidData = 6
}
enum  DSearch_Return_ErrorCodes_t {
  DESCRIPTOR_SEARCH_Found = 0,
  DESCRIPTOR_SEARCH_Fail = 1,
  DESCRIPTOR_SEARCH_NotFound = 2
}
enum  DSearch_Comp_Return_ErrorCodes_t {
  DESCRIPTOR_SEARCH_COMP_Found = 0,
  DESCRIPTOR_SEARCH_COMP_Fail = 1,
  DESCRIPTOR_SEARCH_COMP_EndOfDescriptor = 2
}

Functions

uint8_t USB_Host_GetDeviceConfigDescriptor (uint8_t ConfigNumber, uint16_t *const ConfigSizePtr, void *BufferPtr, uint16_t BufferSize) ATTR_NON_NULL_PTR_ARG(2) ATTR_NON_NULL_PTR_ARG(3)
void USB_GetNextDescriptorOfType (uint16_t *const BytesRem, void **const CurrConfigLoc, const uint8_t Type) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2)
void USB_GetNextDescriptorOfTypeBefore (uint16_t *const BytesRem, void **const CurrConfigLoc, const uint8_t Type, const uint8_t BeforeType) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2)
void USB_GetNextDescriptorOfTypeAfter (uint16_t *const BytesRem, void **const CurrConfigLoc, const uint8_t Type, const uint8_t AfterType) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2)
uint8_t USB_GetNextDescriptorComp (uint16_t *const BytesRem, void **const CurrConfigLoc, ConfigComparatorPtr_t const ComparatorRoutine)
static void USB_GetNextDescriptor (uint16_t *const BytesRem, void **CurrConfigLoc) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2)

Detailed Description

Функции, макросы, переменные, перечисления и типы, связанные с парсингом дескрипторов конфигурации.


Define Documentation

#define DESCRIPTOR_CAST (   DescriptorPtr,
  Type 
)    (*DESCRIPTOR_PCAST(DescriptorPtr, Type))

Преобразует указатель на дескриптор внутри дескриптора конфигурации в указанный тип дескриптора (как фактический экземпляр структуры, а не как указатель на структуру).

Пример использования:

  uint8_t* CurrDescriptor = &ConfigDescriptor[0]; // указание на заголовок конфигурации
  USB_Descriptor_Configuration_Header_t ConfigHeader = DESCRIPTOR_CAST(CurrDescriptor,
                                                       USB_Descriptor_Configuration_Header_t);

  // Теперь можно получить доступ к элементам структуры заголовка через . оператор
#define DESCRIPTOR_PCAST (   DescriptorPtr,
  Type 
)    ((Type*)(DescriptorPtr))

Преобразует указатель на дескриптор внутри дескриптора конфигурации в указатель на указанный тип дескриптора.

Пример использования:

  uint8_t* CurrDescriptor = &ConfigDescriptor[0]; // указание на заголовок конфигурации
  USB_Descriptor_Configuration_Header_t* ConfigHeaderPtr = DESCRIPTOR_PCAST(CurrDescriptor,
                                                           USB_Descriptor_Configuration_Header_t);

  // Теперь можно получить доступ к элементам структуры заголовка конфигурации, используя -> косвенный оператор адресации
#define DESCRIPTOR_SIZE (   DescriptorPtr)    DESCRIPTOR_PCAST(DescriptorPtr, USB_Descriptor_Header_t)->Size

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

#define DESCRIPTOR_TYPE (   DescriptorPtr)    DESCRIPTOR_PCAST(DescriptorPtr, USB_Descriptor_Header_t)->Type

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

#define EP_TYPE_MASK   0x03

Маска для определения типа конечной точки из дескриптора конечной точки. Должно быть сравнено с масками EP_TYPE_*, чтобы точно определить тип конечной точки.


Typedef Documentation

typedef uint8_t(* ConfigComparatorPtr_t)(void *)

Определение типа для функции компаратора дескриптора конфигурации (функция принимает указатель на массив типа void, возвращает значение uint8_t).

See also:
USB_GetNextDescriptorComp - там подробности по функции.

Enumeration Type Documentation

Перечисление для кодов возврата USB_GetNextDescriptorComp().

Enumerator:
DESCRIPTOR_SEARCH_COMP_Found 

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

DESCRIPTOR_SEARCH_COMP_Fail 

Функция компаратора вернула Descriptor_Search_Fail.

DESCRIPTOR_SEARCH_COMP_EndOfDescriptor 

Достигнут конец дескриптора конфигурации, но совпадения не найдено.

Перечисление для возвращаемых значений функции компаратора дескриптора.

Enumerator:
DESCRIPTOR_SEARCH_Found 

Текущий дескриптор соответствует критерию компаратора.

DESCRIPTOR_SEARCH_Fail 

Больше нет дескрипторов, соответствующих критерию совпадения, ошибка поиска.

DESCRIPTOR_SEARCH_NotFound 

Текущий дескриптор не соответствует критерию компаратора.

Перечисление для возможных кодов возврата функции USB_Host_GetDeviceConfigDescriptor().

Enumerator:
HOST_GETCONFIG_Successful 

Получение дескриптора конфигурации прошло без ошибок.

HOST_GETCONFIG_DeviceDisconnect 

Подключенное устройство было отключено при получении дескриптора конфигурации.

HOST_GETCONFIG_PipeError 

Произошла ошибка в канале при отправке запроса.

HOST_GETCONFIG_SetupStalled 

Подключенное устройство сделало остановку (stall) запроса по получению дескриптора конфигурации.

HOST_GETCONFIG_SoftwareTimeOut 

Таймаут запроса или передачи данных.

HOST_GETCONFIG_BuffOverflow 

Дескриптор конфигурации устройства слишком велик, чтобы поместиться в выделенный буфер.

HOST_GETCONFIG_InvalidData 

Устройство вернуло неверные данные дескриптора конфигурации.


Function Documentation

static void USB_GetNextDescriptor ( uint16_t *const  BytesRem,
void **  CurrConfigLoc 
) [inline, static]

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

Parameters:
[in,out]BytesRemУказатель на количество байт, оставшихся в дескрипторе конфигурации.
[in,out]CurrConfigLocУказатель на текущий дескриптор внутри дескриптора конфигурации.
uint8_t USB_GetNextDescriptorComp ( uint16_t *const  BytesRem,
void **const  CurrConfigLoc,
ConfigComparatorPtr_t const  ComparatorRoutine 
)

Ищет следующий дескриптор в указанном дескрипторе конфигурации, используя предварительно подготовленную функцию компаратора. Подпрограмма автоматически обновляет позицию и количество оставшихся байт дескриптора конфигурации. Если подпрограмма компаратора потерпит неудачу в поиске, указатель дескриптора отступает назад так, чтобы следующий вызов поиска дескриптора начинал искать с дескриптора, вызвавшего ошибку поиска. Такое поведение позволяет использовать другой компаратор сразу после того, как первый компаратор потерпит ошибку, начиная второй поиск от дескриптора, который вызвал ошибку.

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

Note:
Эта функция доступна только в режиме хоста USB.
Parameters:
[in,out]BytesRemУказатель на int, сохраняющий оставшееся количество байт в дескрипторе конфигурации.
[in,out]CurrConfigLocУказатель на текущую позицию в дескрипторе конфигурации.
[in]ComparatorRoutineИмя функции компаратора поиска для использования в дескрипторе конфигурации.
Returns:
значение из перечисления DSearch_Comp_Return_ErrorCodes_t.

Пример использования:

  uint8_t EndpointSearcher(void* CurrentDescriptor); // прототип компаратора

  uint8_t EndpointSearcher(void* CurrentDescriptor)
  {
     if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Endpoint)
         return DESCRIPTOR_SEARCH_Found;
     else
         return DESCRIPTOR_SEARCH_NotFound;
  }

  //...
  // После запроса дескриптора конфигурации:
  if (USB_Host_GetNextDescriptorComp(&BytesRemaining, &CurrentConfigLoc, EndpointSearcher) ==
      Descriptor_Search_Comp_Found)
  {
      // Тут можно производить операции с найденным дескриптором конечной точки
  }
void USB_GetNextDescriptorOfType ( uint16_t *const  BytesRem,
void **const  CurrConfigLoc,
const uint8_t  Type 
)

Пропуск до следующего суб-дескриптора внутри дескриптора конфигурации указанного типа. Значение количества оставшихся байт автоматически декрементируется.

Parameters:
[in,out]BytesRemУказатель на количество байт, оставшихся в дескрипторе конфигурации.
[in,out]CurrConfigLocУказатель на текущий дескриптор внутри дескриптора конфигурации.
[in]TypeЗначение типа дескриптора для поиска.
void USB_GetNextDescriptorOfTypeAfter ( uint16_t *const  BytesRem,
void **const  CurrConfigLoc,
const uint8_t  Type,
const uint8_t  AfterType 
)

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

Parameters:
[in,out]BytesRemУказатель на количество байт, оставшихся в дескрипторе конфигурации.
[in,out]CurrConfigLocУказатель на текущий дескриптор внутри дескриптора конфигурации.
[in]TypeЗначение типа дескриптора для поиска.
[in]AfterTypeЗначение типа дескриптора, которое должно быть достигнуто перед указанным типом дескриптора.
void USB_GetNextDescriptorOfTypeBefore ( uint16_t *const  BytesRem,
void **const  CurrConfigLoc,
const uint8_t  Type,
const uint8_t  BeforeType 
)

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

Parameters:
[in,out]BytesRemУказатель на количество байт, оставшихся в дескрипторе конфигурации.
[in,out]CurrConfigLocУказатель на текущий дескриптор внутри дескриптора конфигурации.
[in]TypeЗначение типа дескриптора для поиска.
[in]BeforeTypeЗначение типа дескриптора, которое не должно быть достигнуто перед указанным типом дескриптора.
uint8_t USB_Host_GetDeviceConfigDescriptor ( uint8_t  ConfigNumber,
uint16_t *const  ConfigSizePtr,
void *  BufferPtr,
uint16_t  BufferSize 
)

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

Parameters:
[in]ConfigNumberНомер дескриптора конфигурации устройства, который нужно получить (обычно установлен в 1 для устройств с одной конфигурацией).
[in,out]ConfigSizePtrУказатель на uint16_t для сохранения размера полученного дескриптора.
[out]BufferPtrУказатель на буфер для сохранения данных дескриптора конфигурации.
[out]BufferSizeРазмер выделенного буфера, куда сохраняется дескриптор конфигурации.
Returns:
значение из перечисления USB_Host_GetConfigDescriptor_ErrorCodes_t.
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines