📄 sl811.h
字号:
#ifndef SL811_H
#define SL811_H
#ifdef SL811_GLOBALS
#define SL811_GLOBALS_EXT
#else
#define SL811_GLOBALS_EXT extern
#endif
#define ISO_BIT 0x10
#define MAX_EP 0x05 // maximum number of endpoints (Ep0 + max of 4 data endpoints)
#define BUFFER_LENGTH 8192 //8192
#define MAX_READ_LENGTH 16384//16384
#define MAX_WRITE_LENGTH 2048//2048
//*****************************************************************************************
// Constant Defines
//*****************************************************************************************
#define TIMEOUT_RETRY 0x06 // Maximum no. of timeout retry during USB xfer
//------------------------------------------------------------------------
// EP0 use for configuration and Vendor Specific command interface
//------------------------------------------------------------------------
#define EP0_Buf 0x10 // define start of EP0 64-byte buffer
#define EP1_Buf 0x40 // define start of EP1 64-byte buffer
/*-------------------------------------------------------------------------
* SL811H Register Control memory map
* --Note:
* --SL11H only has one control register set from 0x00-0x04
* --SL811H has two control register set from 0x00-0x04 and 0x08-0x0c
*------------------------------------------------------------------------*/
#define EP0Control 0x00
#define EP0Address 0x01
#define EP0XferLen 0x02
#define EP0Status 0x03
#define EP0Counter 0x04
#define EP1Control 0x08
#define EP1Address 0x09
#define EP1XferLen 0x0a
#define EP1Status 0x0b
#define EP1Counter 0x0c
#define CtrlReg 0x05
#define IntEna 0x06
// 0x07 is reserved
#define IntStatus 0x0d
#define cDATASet 0x0e
#define cSOFcnt 0x0f // Master=1 Slave=0, D+/D-Pol Swap=1 0=not [0-5] SOF Count
// 0xAE = 1100 1110
// 0xEE = 1110 1110
#define IntMask 0x57 /* Reset|DMA|EP0|EP2|EP1 for IntEna */
#define HostMask 0x47 /* Host request command for IntStatus */
#define ReadMask 0xd7 /* Read mask interrupt for IntStatus */
//Interrupt Status Mask
#define USB_A_DONE 0x01
#define USB_B_DONE 0x02
#define BABBLE_DETECT 0x04
#define INT_RESERVE 0x08
#define SOF_TIMER 0x10
#define INSERT_REMOVE 0x20
#define USB_RESET 0x40
#define USB_DPLUS 0x80
#define INT_CLEAR 0xFF
//EP0 Status Mask
#define EP0_ACK 0x01 // EPxStatus bits mask during a read
#define EP0_ERROR 0x02
#define EP0_TIMEOUT 0x04
#define EP0_SEQUENCE 0x08
#define EP0_SETUP 0x10
#define EP0_OVERFLOW 0x20
#define EP0_NAK 0x40
#define EP0_STALL 0x80
/*-------------------------------------------------------------------------
* SL11H/SL811H definition
*-------------------------------------------------------------------------
*/
// USB-A, USB-B Host Control Register [00H, 08H]
// Pre Reserved
// DatT Dir [1=Trans, 0=Recv]
// SOF Enable
// ISO Arm
#define DATA0_WR 0x07 // 0000 0111 ( Data0 + OUT + Enable + Arm)
#define sDATA0_WR 0x27 // 0010 0111 ( Data0 + SOF + OUT + Enable + Arm)
#define DATA0_RD 0x03 // 0000 0011 ( Data0 + IN + Enable + Arm)
#define sDATA0_RD 0x23 // 0010 0011 ( Data0 + SOF + IN + Enable + Arm)
#define PID_SETUP 0xD0
#define PID_IN 0x90
#define PID_OUT 0x10
typedef struct std_dev_desc { /* Sec9.6.1, Table 9-8, p262 */
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;
}
std_dev_descriptor;
typedef struct std_ep_desc { /* Sec9.6.6, Table 9-13, p269 */
unsigned char bLength;
unsigned char bDescriptorType;
unsigned char bEndpointAddress;
unsigned char bmAttributes;
unsigned short wMaxPacketSize;
unsigned char bInterval;
}
std_endpoint_descriptor;
typedef struct epi
{
unsigned max_packet_size:10; // 端点最大封包
unsigned dev_addr:7; // 设备地址
unsigned ep_num:5; // 端点号
unsigned toggle:1; // DATA0,DATA1
unsigned speed:1; // 传输整速度:全速或低速
unsigned direction:2; // 端点方向
unsigned tr_type:1; // "Async or Iso" for PTD parameter
unsigned transfer_type:3; // Ctrl, Iso, Bulk, Intrr
std_endpoint_descriptor endpoint_descriptor; // 端点描述符
}endpoint_info;
typedef struct dev
{
unsigned char address; // 设备地址
unsigned char speed; //
std_dev_descriptor dev_descriptor; // 设备描述符
std_conf_descriptor conf_descriptor; // 配置描述符
std_interface_descriptor interfacef_descriptor; // 接口描述符
endpoint_info *epi_ptr[ MAX_ENDPOINT_NUM ]; // 端点描述信息指针列表
#ifdef STRING_DESCRIPTOR
unsigned short *string_manufacturer; // 厂商描述符字符串指针
unsigned short *string_product; // 产品描述符字符串指针
unsigned short *string_serialNum; // 设备序列号字符串指针
#endif
void *class_instance_ptr; // 类实例结构指针
unsigned char topology_layer; // 拓朴层,根集线器下的设备为第1层
}device_instance;
typedef struct dev{
INT8U address;
INT8U speed;
std_dev_descriptor dev_descriptor;
std_conf_descriptor conf_descriptor;
std_interface_descriptor interface_descriptor;
endpoint_info epi_info[MAX_ENDPOINT_NUM];
}
typedef struct
{
INT16U wVID, wPID; // Vendor ID and Product ID 生产厂ID和产品ID
INT8U bClass; //
INT8U bNumOfEPs; // actual number endpoint from slave
INT8U iMfg; // Manufacturer ID
INT8U iPdt; // Product ID
INT8U bId1;
INT8U bId2;
INT8U bEPAddr[MAX_EP]; // bit 7 = 1 = use PID_IN,
INT8U bAttr[MAX_EP]; // ISO | Bulk | Interrupt | Control
INT16U wPayLoad[MAX_EP]; // ISO range: 1-1023, Bulk: 1-64, etc
INT16U bInterval[MAX_EP]; // polling interval (for LS)
INT8U bData1[MAX_EP]; // DataToggle value
} USB_DEV;
typedef struct
{
INT8U bmRequest;
INT8U bRequest;
INT16U wValue;
INT16U wIndex;
INT16U wLength;
} SETUP_PKG;
typedef struct
{
INT8U usbaddr;
INT8U endpoint;
INT8U pid;
INT8U wPayload;
INT16U wLen;
INT8U *buffer;
SETUP_PKG setup;
INT8U epbulkin;
INT8U epbulkout;
} PKG;
typedef union __FLAGS
{
struct _FLAGS
{
INT8U SLAVE_IS_ATTACHED;
INT8U SLAVE_REMOVED;
INT8U SLAVE_FOUND; // Slave USB device found
INT8U SLAVE_ENUMERATED; // slave USB device enumeration done
INT8U SLAVE_ONLINE;
INT8U TIMEOUT_ERR; // timeout error during data endpoint transfer
INT8U DATA_STOP; // device unplugged during data transfer
INT8U FULL_SPEED;
INT8U bData1;
INT8U bUartInDone;
INT8U bMassDevice;
} bits;
}FLAGS;
SL811_GLOBALS_EXT FLAGS bFlags;
SL811_GLOBALS_EXT PKG usbstack;
SL811_GLOBALS_EXT USB_DEV uDev; // Multiple USB devices attributes, Max 5 devices
SL811_GLOBALS_EXT INT8U DBUF[BUFFER_LENGTH];
SL811_GLOBALS_EXT INT8U SL811_GetRev(void);
SL811_GLOBALS_EXT void USBReset(void);
SL811_GLOBALS_EXT INT8U usbXfer(void);
SL811_GLOBALS_EXT INT8U ep0Xfer(void);
SL811_GLOBALS_EXT INT8U epBulkSend(INT8U *pBuffer,INT32U len);
SL811_GLOBALS_EXT INT8U epBulkRcv(INT8U *pBuffer,INT32U len);
SL811_GLOBALS_EXT INT8U SetAddress(INT8U addr);
SL811_GLOBALS_EXT INT8U Set_Configuration(void);
SL811_GLOBALS_EXT INT8U EnumUsbDev(INT8U usbaddr);
SL811_GLOBALS_EXT void SL811_Init(void);
SL811_GLOBALS_EXT void check_usb(void);
SL811_GLOBALS_EXT int slave_detect(void);
#ifdef SL811_GLOBALS
#define SL811_GLOBALS_INT
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -