Библиотека 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) |
Функции, макросы, переменные, перечисления и типы, связанные с парсингом дескрипторов конфигурации.
#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 uint8_t(* ConfigComparatorPtr_t)(void *) |
Определение типа для функции компаратора дескриптора конфигурации (функция принимает указатель на массив типа void, возвращает значение uint8_t).
Перечисление для кодов возврата USB_GetNextDescriptorComp().
Перечисление для возвращаемых значений функции компаратора дескриптора.
Перечисление для возможных кодов возврата функции USB_Host_GetDeviceConfigDescriptor().
static void USB_GetNextDescriptor | ( | uint16_t *const | BytesRem, |
void ** | CurrConfigLoc | ||
) | [inline, static] |
Пропускает текущий суб-дескриптор внутри дескриптора конфигурации, так что указатель будет указывать на следующий суб-дескриптор. Значение количества оставшихся байт автоматически декрементируется.
[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.
[in,out] | BytesRem | Указатель на int, сохраняющий оставшееся количество байт в дескрипторе конфигурации. |
[in,out] | CurrConfigLoc | Указатель на текущую позицию в дескрипторе конфигурации. |
[in] | ComparatorRoutine | Имя функции компаратора поиска для использования в дескрипторе конфигурации. |
Пример использования:
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 | ||
) |
Пропуск до следующего суб-дескриптора внутри дескриптора конфигурации указанного типа. Значение количества оставшихся байт автоматически декрементируется.
[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 | ||
) |
Пропуск к следующему суб-дескриптору внутри дескриптора конфигурации указанного типа, который должен прибыть после второго дескриптора указанного типа. Оставшееся количество байт автоматически декрементируется.
[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, и происходит выход их функции. Значение количества оставшихся байт автоматически декрементируется.
[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 | ||
) |
Запрашивает в буфер данные дескриптора конфигурации от подключенного устройства через стандартный запрос, включая проверку на валидность и размер, чтобы предотвратить переполнение буфера.
[in] | ConfigNumber | Номер дескриптора конфигурации устройства, который нужно получить (обычно установлен в 1 для устройств с одной конфигурацией). |
[in,out] | ConfigSizePtr | Указатель на uint16_t для сохранения размера полученного дескриптора. |
[out] | BufferPtr | Указатель на буфер для сохранения данных дескриптора конфигурации. |
[out] | BufferSize | Размер выделенного буфера, куда сохраняется дескриптор конфигурации. |