289 lines
8.3 KiB
C
289 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 FUSB_DEF_H
|
||
#define FUSB_DEF_H
|
||
|
||
/***************************** Include Files *********************************/
|
||
|
||
#include "ftypes.h"
|
||
|
||
|
||
#ifdef __cplusplus
|
||
extern "C"
|
||
{
|
||
#endif
|
||
|
||
/************************** 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 |