rt-thread/bsp/phytium/libraries/standalone/drivers/usb/fusb_def.h

288 lines
8.3 KiB
C
Raw Normal View History

/*
* Copyright : (C) 2022 Phytium Information Technology, Inc.
* All Rights Reserved.
*
* This program is OPEN SOURCE software: you can redistribute it and/or modify it
* under the terms of the Phytium Public License as published by the Phytium Technology Co.,Ltd,
* either version 1.0 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the Phytium Public License for more details.
*
*
* FilePath: fusb_def.h
* Date: 2022-02-11 13:33:11
* LastEditTime: 2022-02-18 09:18:24
* Description:  This files is for definition of spec defined USB data structure
*
* Modify History:
* Ver   Who        Date         Changes
* ----- ------     --------    --------------------------------------
* 1.0 Zhugengyu 2022/2/7 init commit
*/
#ifndef DRIVERS_FUSB_DEF_H
#define DRIVERS_FUSB_DEF_H
#ifdef __cplusplus
extern "C"
{
#endif
/***************************** Include Files *********************************/
#include "ftypes.h"
/************************** Constant Definitions *****************************/
typedef enum
{
FUSB_UNKNOWN_SPEED = -1,
FUSB_FULL_SPEED = 0,
FUSB_LOW_SPEED = 1,
FUSB_HIGH_SPEED = 2,
FUSB_SUPER_SPEED = 3,
FUSB_SUPER_SPEED_PLUS = 4,
} FUsbSpeed;
typedef enum
{
FUSB_REQ_HOST_TO_DEVICE = 0,
FUSB_REQ_DEVICE_TO_HOST = 1
} FUsbReqDirection;
typedef enum
{
FUSB_REQ_TYPE_STANDARD = 0,
FUSB_REQ_TYPE_CLASS = 1,
FUSB_REQ_TYPE_VENDOR = 2,
FUSB_REQ_TYPE_RESERVED = 3
} FUsbReqType;
typedef enum
{
FUSB_REQ_RECP_DEV = 0,
FUSB_REQ_RECP_IF = 1,
FUSB_REQ_RECP_EP = 2,
FUSB_REQ_RECP_OTHER = 3
} FUsbReqRecpient;
/* refer to Table 9-5. Descriptor Types in USB spec. for details */
typedef enum
{
FUSB_DESC_TYPE_NONE = 0,
FUSB_DESC_TYPE_DEVICE = 1,
FUSB_DESC_TYPE_CONFIG = 2,
FUSB_DESC_TYPE_STRING = 3,
FUSB_DESC_TYPE_INTERFACE = 4,
FUSB_DESC_TYPE_ENDPOINT = 5,
FUSB_DESC_TYPE_HUB = 41,
FUSB_DESC_TYPE_SUPER_SPEED_HUB = 42
} FUsbDescriptorType;
typedef enum
{
FUSB_GET_STATUS = 0,
FUSB_CLEAR_FEATURE = 1,
FUSB_SET_FEATURE = 3,
FUSB_SET_ADDRESS = 5,
FUSB_GET_DESCRIPTOR = 6,
FUSB_SET_DESCRIPTOR = 7,
FUSB_GET_CONFIGURATION = 8,
FUSB_SET_CONFIGURATION = 9,
FUSB_GET_INTERFACE = 10,
FUSB_SET_INTERFACE = 11,
FUSB_SYNCH_FRAME = 12
} FUsbRequestCode;
typedef enum
{
FUSB_ENDPOINT_HALT = 0,
FUSB_DEVICE_REMOTE_WAKEUP = 1,
FUSB_TEST_MODE = 2
} FUsbFeatureSelectors;
typedef enum
{
FUSB_SETUP,
FUSB_IN,
FUSB_OUT
} FUsbDirection;
typedef enum
{
FUSB_CONTROL_EP = 0,
FUSB_ISOCHRONOUS_EP = 1,
FUSB_BULK_EP = 2,
FUSB_INTERRUPT_EP = 3
} FUsbEpType;
typedef enum
{
FUSB_UNKOWN_DEVICE = 0x0,
FUSB_AUDIO_DEVICE = 0x01,
FUSB_COMM_DEVICE = 0x02,
FUSB_HID_DEVICE = 0x03,
FUSB_PHYSICAL_DEVICE = 0x05,
FUSB_IMAGE_DEVICE = 0x06,
FUSB_PRINTER_DEVICE = 0x07,
FUSB_MASS_STORAGE_DEVICE = 0x08,
FUSB_HUB_DEVICE = 0x09,
} FUsbDevClass; /* definition of device class */
/**************************** Type Definitions *******************************/
/* following data structure is defined according to spec. name their member
may not compliant with code convention */
typedef struct
{
unsigned char bDescLength;
unsigned char bDescriptorType;
unsigned char bNbrPorts; /* Number of downstream facing ports supports */
union
{
struct
{
unsigned long logicalPowerSwitchingMode: 2; /* BIT[1:0] */
unsigned long isCompoundDevice: 1; /* BIT[2] */
unsigned long overcurrentProtectionMode: 2; /* BIT[4:3] */
unsigned long ttThinkTime: 2; /* BIT[6:5] */
unsigned long arePortIndicatorsSupported: 1; /* BIT[7] */
unsigned long: 8;
} __attribute__((packed));
unsigned short wHubCharacteristics;
} __attribute__((packed));
unsigned char bPowerOn2PwrGood; /* in 2 ms intervals */
unsigned char bHubContrCurrent; /* max current requirements */
char DeviceRemovable[]; /* indicates if a port has a removable device attached */
} __attribute__((packed)) FUsbHubDescriptor;
typedef struct
{
unsigned char bLength;
unsigned char bDescriptorType;
unsigned short bcdUSB;
unsigned char bDeviceClass;
unsigned char bDeviceSubClass;
unsigned char bDeviceProtocol;
unsigned char bMaxPacketSize0;
unsigned short idVendor;
unsigned short idProduct;
unsigned short bcdDevice;
unsigned char iManufacturer;
unsigned char iProduct;
unsigned char iSerialNumber;
unsigned char bNumConfigurations;
} __attribute__((packed)) FUsbDeviceDescriptor;
typedef struct
{
unsigned char bLength;
unsigned char bDescriptorType;
unsigned short wTotalLength;
unsigned char bNumInterfaces;
unsigned char bConfigurationValue;
unsigned char iConfiguration;
unsigned char bmAttributes;
#define FUSB_CONFIG_DESC_ATTR_REMOTE_WEAKUP BIT(5) /* 1: remote wakeup feature */
#define FUSB_CONFIG_DESC_ATTR_SELF_POWER BIT(6) /* 1: self-powered 0: bus-powered */
#define FUSB_CONFIG_DESC_ATTR_USB1_COMPATIABLE BIT(7) /* 1: compatibility with USB 1.0 */
unsigned char bMaxPower;
/* configuration descriptor may follow more buffers, need to allocate dynamic memory for all contents */
} __attribute__((packed)) FUsbConfigurationDescriptor;
typedef struct
{
unsigned char bLength;
unsigned char bDescriptorType;
unsigned char bInterfaceNumber;
unsigned char bAlternateSetting;
unsigned char bNumEndpoints;
unsigned char bInterfaceClass;
unsigned char bInterfaceSubClass;
unsigned char bInterfaceProtocol;
unsigned char iInterface;
} __attribute__((packed)) FUsbInterfaceDescriptor;
typedef struct
{
unsigned char bLength;
unsigned char bDescriptorType;
unsigned char bEndpointAddress;
/* Low-speed devices can have a maximum of 3 endpoint, other devices can have 16 (015) */
#define FUSB_EP_DESC_EP_NUM(x) (GENMASK(3, 0) & (x)) /* endpoint number */
#define FUSB_EP_DESC_EP_DIR_IN BIT(7) /* direction, 0: OUT, 1: IN */
unsigned char bmAttributes;
#define FUSB_EP_DESC_TRANS_TYPE(x) (GENMASK(1, 0) & (x))
#define FUSB_EP_DESC_TRANS_CTRL 0b00 /* control */
#define FUSB_EP_DESC_TRANS_ISOC 0b01 /* isochronous */
#define FUSB_EP_DESC_TRANS_BULK 0b10 /* bulk */
#define FUSB_EP_DESC_TRANS_INTR 0b11 /* interrupt */
unsigned short wMaxPacketSize;
#define FUSB_EP_DESC_MAX_PACKET_SZ GENMASK(10, 0)
unsigned char bInterval;
} __attribute__((packed)) FUsbEndpointDescriptor;
typedef union
{
struct
{
u8 len;
u8 type;
} header;
#define FUSB_DESCRIPTOR_HEADER_SIZE 2
FUsbConfigurationDescriptor configuration;
FUsbInterfaceDescriptor interface;
FUsbEndpointDescriptor endpoint;
} __attribute__((packed)) FUsbDescriptor;
typedef struct
{
unsigned char bLength;
unsigned char bDescriptorType;
unsigned short bcdHID;
unsigned char bCountryCode;
unsigned char bNumDescriptors;
unsigned char bReportDescriptorType;
unsigned short wReportDescriptorLength;
} __attribute__((packed)) FUsbHidDescriptor;
typedef struct
{
u8 len; /* Descriptor size in bytes (variable) */
u8 type; /* The constant String (0x03 DESCRIPTOR_STRING) */
u16 string[0]; /* Unicode UTF- 16LE string */
} __attribute__((packed)) FUsbStringDescriptor;
typedef struct
{
union
{
struct
{
FUsbReqRecpient req_recp: 5;
FUsbReqType req_type: 2;
FUsbReqDirection data_dir: 1;
} __attribute__((packed));
unsigned char bmRequestType;
} __attribute__((packed));
unsigned char bRequest;
unsigned short wValue;
unsigned short wIndex;
unsigned short wLength;
} __attribute__((packed)) FUsbDevReq;
/************************** Variable Definitions *****************************/
/***************** Macros (Inline Functions) Definitions *********************/
#define FUSB_DEFAULT_LANG_ID 0x409 /* English */
/************************** Function Prototypes ******************************/
#ifdef __cplusplus
}
#endif
#endif