⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sl811.h

📁 用AT91SAM7S64以IO的方式控制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 + -