288 lines
8.3 KiB
C
288 lines
8.3 KiB
C
|
/*
|
|||
|
* 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 (0–15) */
|
|||
|
#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
|