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

📄 usb.h

📁 USB固件开发源程序,以单片机为核心,转贴的
💻 H
字号:
	///////////////////////////////////////////
	//缩写,IO预定义
	///////////////////////////////////////////
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

#define FALSE   0
#define TRUE    (!FALSE)
#define DISABLE		EA=0
#define ENABLE		EA=1

//由硬件决定的地址映射
#define D12_COMMAND			0x0bf01
#define D12_DATA			0x0bf00

sbit MCU_LED1     = P1^0;
sbit MCU_LED2     = P1^1;
sbit MCU_LED3	  = P1^2;
sbit MCU_LED4	  = P1^3;

	/////////////////////////////////////////////
	//编译开关
	////////////////////////////////////////////
#define NoRam


	////////////////////////////////////////////
	//算术宏
	////////////////////////////////////////////
#define SWAP(x)   ((((x) & 0xFF) << 8) | (((x) >> 8) & 0xFF))
#define MSB(x)    (((x) >> 8) & 0xFF)
#define LSB(x)    ((x) & 0xFF)

	////////////////////////////////////////////
	//常量
	////////////////////////////////////////////
//与PC端程序有关的包头设置
#define HEAD_KEY 				0x00
#define READ_FLASH_FROM			0x01
#define READ_FLASH_FROM2		0xe8	/*这两个要合在一起使用主要用于判断数据请求是否是真正的READFLASH*/

#define READ_FLASH_TO			0x02
#define HEAD_END  				0xee
#define READ_FLASH_STOP			0x03
#define READ_FLASH_FINISH		0x04

//USB 状态值
#define USB_UNOPEN				0x00
#define USB_DEMOSHOW			0x01
#define USB_READER				0x02
#define USB_READFLASH			0x03




////----
//d12ci.c  使用部分
////----
#define D12_NOLAZYCLOCK			0x02
#define D12_CLOCKRUNNING  	    0x04
#define D12_INTERRUPTMODE		0x08
#define D12_SOFTCONNECT			0x10
#define D12_ENDP_NONISO			0x00
#define D12_ENDP_ISOOUT			0x40
#define D12_ENDP_ISOIN			0x80
#define D12_ENDP_ISOIO			0xC0

#define D12_CLOCK_12M			0x03
#define D12_CLOCK_4M			0x0b
#define D12_SETTOONE   		    0x40
#define D12_SOFONLY			    0x80

#define D12_DMASINGLE			0x00
#define D12_BURST_4				0x01
#define D12_BURST_8				0x02
#define D12_BURST_16			0x03
#define D12_DMAENABLE     	    0x04
#define D12_DMA_INTOKEN			0x08
#define D12_AUTOLOAD			0x10

//==============================================
#define D12_NORMALPLUSSOF		0x20
#define D12_ENDP4INTENABLE		0x40
#define D12_ENDP5INTENABLE		0x80	// bug fixed in V2.1

#define D12_INT_ENDP0OUT		0x01
#define D12_INT_ENDP0IN			0x02
#define D12_INT_ENDP1OUT		0x04
#define D12_INT_ENDP1IN			0x08
#define D12_INT_ENDP2OUT		0x10
#define D12_INT_ENDP2IN			0x20
#define D12_INT_BUSRESET		0x40
#define D12_INT_SUSPENDCHANGE	0x80
#define D12_INT_EOT				0x0100

#define D12_SETUPPACKET			0x20

#define D12_BUFFER0FULL			0x20
#define D12_BUFFER1FULL			0x40

#define D12_FULLEMPTY			0x01
#define D12_STALL				0x02





////----
//main.h
////----

#define MAX_ENDPOINTS      (uchar)0x3

//#define EP0_TX_FIFO_SIZE   16
//#define EP0_RX_FIFO_SIZE   16
#define EP0_PACKET_SIZE    16

//#define EP1_TX_FIFO_SIZE   4
//#define EP1_RX_FIFO_SIZE   4
#define EP1_PACKET_SIZE    8

//#define EP2_TX_FIFO_SIZE   64
//#define EP2_RX_FIFO_SIZE   64
#define EP2_PACKET_SIZE    64       //主端点缓冲        


#define USB_IDLE           0
#define USB_TRANSMIT       1
#define USB_RECEIVE        2

#define USB_CLASS_CODE_TEST_CLASS_DEVICE                    0xdc
#define USB_SUBCLASS_CODE_TEST_CLASS_D12                    0xA0
#define USB_PROTOCOL_CODE_TEST_CLASS_D12                    0xB0

#define USB_RECIPIENT            (uchar)0x1F
#define USB_RECIPIENT_DEVICE     (uchar)0x00
#define USB_RECIPIENT_INTERFACE  (uchar)0x01
#define USB_RECIPIENT_ENDPOINT   (uchar)0x02

#define USB_REQUEST_TYPE_MASK    (uchar)0x60
#define USB_STANDARD_REQUEST     (uchar)0x00
//#define USB_CLASS_REQUEST        (uchar)0x20
#define USB_VENDOR_REQUEST       (uchar)0x40

#define USB_REQUEST_MASK         (uchar)0x0F

#define DEVICE_ADDRESS_MASK      0x7F




#define DMA_BUFFER_SIZE		256

#define DMA_IDLE	0
#define DMA_RUNNING	1
#define DMA_PENDING	2

#define SETUP_DMA_REQUEST 		0x0471
#define GET_FIRMWARE_VERSION    0x0472
#define GET_BUFFER_SIZE		    0x0474

////----
//usb100.h
////----
#define MAXIMUM_USB_STRING_LENGTH 255
// values for the bits returned by the USB GET_STATUS command
#define USB_GETSTATUS_SELF_POWERED                0x01
#define USB_GETSTATUS_REMOTE_WAKEUP_ENABLED       0x02


#define USB_DEVICE_DESCRIPTOR_TYPE                0x01
#define USB_CONFIGURATION_DESCRIPTOR_TYPE         0x02
#define USB_STRING_DESCRIPTOR_TYPE                0x03
#define USB_INTERFACE_DESCRIPTOR_TYPE             0x04
#define USB_ENDPOINT_DESCRIPTOR_TYPE              0x05
#define USB_POWER_DESCRIPTOR_TYPE                 0x06

#define USB_DESCRIPTOR_MAKE_TYPE_AND_INDEX(d, i) ((uint)((uint)d<<8 | i))

//
// Values for bmAttributes field of an
// endpoint descriptor
//

#define USB_ENDPOINT_TYPE_MASK                    0x03

#define USB_ENDPOINT_TYPE_CONTROL                 0x00
#define USB_ENDPOINT_TYPE_ISOCHRONOUS             0x01
#define USB_ENDPOINT_TYPE_BULK                    0x02
#define USB_ENDPOINT_TYPE_INTERRUPT               0x03


//
// definitions for bits in the bmAttributes field of a 
// configuration descriptor.
//
#define USB_CONFIG_POWERED_MASK                   0xc0

#define USB_CONFIG_BUS_POWERED                    0x80
#define USB_CONFIG_SELF_POWERED                   0x40
#define USB_CONFIG_REMOTE_WAKEUP                  0x20

//
// Endpoint direction bit, stored in address
//

#define USB_ENDPOINT_DIRECTION_MASK               0x80

// test direction bit in the bEndpointAddress field of
// an endpoint descriptor.
#define USB_ENDPOINT_DIRECTION_OUT(addr)          (!((addr) & USB_ENDPOINT_DIRECTION_MASK))
#define USB_ENDPOINT_DIRECTION_IN(addr)           ((addr) & USB_ENDPOINT_DIRECTION_MASK)

//
// USB defined request codes
// see chapter 9 of the USB 1.0 specifcation for
// more information.
//

// These are the correct values based on the USB 1.0
// specification

#define USB_REQUEST_GET_STATUS                    0x00
#define USB_REQUEST_CLEAR_FEATURE                 0x01

#define USB_REQUEST_SET_FEATURE                   0x03

#define USB_REQUEST_SET_ADDRESS                   0x05
#define USB_REQUEST_GET_DESCRIPTOR                0x06
#define USB_REQUEST_SET_DESCRIPTOR                0x07
#define USB_REQUEST_GET_CONFIGURATION             0x08
#define USB_REQUEST_SET_CONFIGURATION             0x09
#define USB_REQUEST_GET_INTERFACE                 0x0A
#define USB_REQUEST_SET_INTERFACE                 0x0B
#define USB_REQUEST_SYNC_FRAME                    0x0C


//
// defined USB device classes
//


#define USB_DEVICE_CLASS_RESERVED           0x00
#define USB_DEVICE_CLASS_AUDIO              0x01
#define USB_DEVICE_CLASS_COMMUNICATIONS     0x02
#define USB_DEVICE_CLASS_HUMAN_INTERFACE    0x03
#define USB_DEVICE_CLASS_MONITOR            0x04
#define USB_DEVICE_CLASS_PHYSICAL_INTERFACE 0x05
#define USB_DEVICE_CLASS_POWER              0x06
#define USB_DEVICE_CLASS_PRINTER            0x07
#define USB_DEVICE_CLASS_STORAGE            0x08
#define USB_DEVICE_CLASS_HUB                0x09
#define USB_DEVICE_CLASS_VENDOR_SPECIFIC    0xFF

//
// USB defined Feature selectors
//

#define USB_FEATURE_ENDPOINT_STALL          0x0000
#define USB_FEATURE_REMOTE_WAKEUP           0x0001
#define USB_FEATURE_POWER_D0                0x0002
#define USB_FEATURE_POWER_D1                0x0003
#define USB_FEATURE_POWER_D2                0x0004
#define USB_FEATURE_POWER_D3                0x0005
	

////////////////////////////////////////////////
	////结构体与变量定义
	////////////////////////////////////////////////





typedef struct _USB_DEVICE_DESCRIPTOR {
    uchar bLength;
    uchar bDescriptorType;
    uint bcdUSB;
    uchar bDeviceClass;
    uchar bDeviceSubClass;
    uchar bDeviceProtocol;
    uchar bMaxPacketSize0;
    uint idVendor;
    uint idProduct;
    uint bcdDevice;
    uchar iManufacturer;
    uchar iProduct;
    uchar iSerialNumber;
    uchar bNumConfigurations;
} USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR;

typedef struct _USB_ENDPOINT_DESCRIPTOR {
    uchar bLength;
    uchar bDescriptorType;
    uchar bEndpointAddress;
    uchar bmAttributes;
    uint wMaxPacketSize;
    uchar bInterval;
} USB_ENDPOINT_DESCRIPTOR, *PUSB_ENDPOINT_DESCRIPTOR;

//
// values for bmAttributes Field in
// USB_CONFIGURATION_DESCRIPTOR
//

#define BUS_POWERED                           0x80
#define SELF_POWERED                          0x40
#define REMOTE_WAKEUP                         0x20

typedef struct _USB_CONFIGURATION_DESCRIPTOR {
    uchar bLength;
    uchar bDescriptorType;
    uint wTotalLength;
    uchar bNumInterfaces;
    uchar bConfigurationValue;
    uchar iConfiguration;
    uchar bmAttributes;
    uchar MaxPower;
} USB_CONFIGURATION_DESCRIPTOR, *PUSB_CONFIGURATION_DESCRIPTOR;

typedef struct _USB_INTERFACE_DESCRIPTOR {
    uchar bLength;
    uchar bDescriptorType;
    uchar bInterfaceNumber;
    uchar bAlternateSetting;
    uchar bNumEndpoints;
    uchar bInterfaceClass;
    uchar bInterfaceSubClass;
    uchar bInterfaceProtocol;
    uchar iInterface;
} USB_INTERFACE_DESCRIPTOR, *PUSB_INTERFACE_DESCRIPTOR;

typedef struct _USB_STRING_DESCRIPTOR {
    uchar bLength;
    uchar bDescriptorType;
    uchar bString[1];
} USB_STRING_DESCRIPTOR, *PUSB_STRING_DESCRIPTOR;



typedef unsigned char  BOOL;
//演示程序的辅助结构体
typedef struct _demo
{
	uchar key;				//DX按键值
	uchar usb_state;		//usb DEMO程序的当前状态
	ulong read_flash_begin;	//读FLASH起始地址
	ulong read_flash_end;	//读flash结束地址
	ulong main_len;			//主端点收到的数据长度
}USB_DEMO;


//usb通信状态位
typedef union _epp_flags
{
	struct _flags
	{
		uchar timer               	: 1;
		uchar bus_reset           	: 1;
		uchar suspend             	: 1;
		uchar setup_packet  	  	: 1;
		uchar remote_wakeup		   	: 1;
		uchar in_isr		      	: 1;
		uchar control_state			: 2;

		uchar configuration			: 1;
		uchar verbose				: 1;
		uchar ep1_rxdone			: 1;
		uchar read_flash			:1	;//读FLASH标志
		uchar power_down			: 1; // 
		uchar main_rxdone			:1	;//主端点读
		uchar main_txdone			:1	;//主端点写
	} bits;
	unsigned short value;
	
} EPPFLAGS;


typedef struct _device_request
{
	uchar bmRequestType;
	uchar bRequest;
	unsigned short wValue;
	unsigned short wIndex;
	unsigned short wLength;
} DEVICE_REQUEST;

/*
typedef struct _IO_REQUEST {
	unsigned short	uAddressL;
	uchar	bAddressH;
	unsigned short	uSize;
	uchar	bCommand;
} IO_REQUEST, *PIO_REQUEST;
*/
#define MAX_CONTROLDATA_SIZE	8

//控制传输辅助结构体
typedef struct _control_xfer
{
	DEVICE_REQUEST DeviceRequest;
	unsigned short wLength;
	unsigned short wCount;
	uchar * pData;
	uchar dataBuffer[MAX_CONTROLDATA_SIZE];
} CONTROL_XFER;


//
// USB power descriptor added to core specification
//

#define USB_SUPPORT_D0_COMMAND      0x01
#define USB_SUPPORT_D1_COMMAND      0x02
#define USB_SUPPORT_D2_COMMAND      0x04
#define USB_SUPPORT_D3_COMMAND      0x08

#define USB_SUPPORT_D1_WAKEUP       0x10
#define USB_SUPPORT_D2_WAKEUP       0x20

typedef struct _USB_POWER_DESCRIPTOR {
    uchar bLength;
    uchar bDescriptorType;
    uchar bCapabilitiesFlags;
    uint EventNotification;
    uint D1LatencyTime;
    uint D2LatencyTime;
    uint D3LatencyTime;
    uchar PowerUnit;
    uint D0PowerConsumption;
    uint D1PowerConsumption;
    uint D2PowerConsumption;
} USB_POWER_DESCRIPTOR, *PUSB_POWER_DESCRIPTOR;


typedef struct _USB_COMMON_DESCRIPTOR {
    uchar bLength;
    uchar bDescriptorType;
} USB_COMMON_DESCRIPTOR, *PUSB_COMMON_DESCRIPTOR;


//
// Standard USB HUB definitions 
//
// See Chapter 11
//

typedef struct _USB_HUB_DESCRIPTOR {
    uchar        bDescriptorLength;      // Length of this descriptor
    uchar        bDescriptorType;        // Hub configuration type
    uchar        bNumberOfPorts;         // number of ports on this hub
    uint       wHubCharacteristics;    // Hub Charateristics
    uchar        bPowerOnToPowerGood;    // port power on till power good in 2ms
    uchar        bHubControlCurrent;     // max current in mA
    //
    // room for 255 ports power control and removable bitmask
    uchar        bRemoveAndPowerMask[64];
} USB_HUB_DESCRIPTOR, *PUSB_HUB_DESCRIPTOR;


	//////////////////////////////////////////////////
	////			函数声明
	//////////////////////////////////////////////////


//--------
//d12ci.c
//--------
extern void D12_SetEndpointEnable(uchar bEnable);
extern void D12_SetAddressEnable(uchar Address);
extern void D12_SetMode(uchar bConfig, uchar bClkDiv);
extern void D12_SetDMA(uchar bMode);
extern uchar D12_GetDMA(void);
extern unsigned short D12_ReadInterruptRegister(void);
extern uchar D12_SelectEndpoint(uchar bEndp);
extern uchar D12_ReadLastTransactionStatus(uchar bEndp);
extern uchar D12_ReadEndpointStatus(uchar bEndp);
extern void D12_SetEndpointStatus(uchar bEndp, uchar bStalled);
extern void D12_SendResume(void);

extern uchar D12_ReadEndpoint(uchar endp, uchar len, uchar * buf);
extern uchar D12_WriteEndpoint(uchar endp, uchar len, uchar * buf);
extern void D12_WriteEndpointByte(uchar endp, uchar buf);
extern void D12_AcknowledgeEndpoint(uchar endp);


//----------
//chap9.h    USB请求的各个解决函数
//---------
extern void get_status(void);
extern void clear_feature(void);
extern void set_feature(void);
extern void set_address(void);
extern void get_descriptor(void);
extern void get_configuration(void);
extern void set_configuration(void);
extern void get_interface(void);
extern void set_interface(void);

extern void reserved(void);
extern void read_write_register(void);


extern void single_transmit(uchar * pData, uchar len);
extern void stall_ep0(void);
extern void code_transmit(uchar code * pRomData, unsigned short len);

extern void init_config(void);
extern void init_unconfig(void);

//main_loop.c

extern void reconnect_USB(void);
extern void usb_interrupt_transmit(void);
extern void control_handler(void);
extern void setup_dma(void);
extern void disconnect_USB(void);


//外部功能函数
extern void KillD12(void);
extern uchar getkey_usb(uint);
extern void show_pc_key(uchar show_key);
//////////////////////////////////////////////////////
////			变量声明
/////////////////////////////////////////////////////
extern xdata EPPFLAGS bEPPflags;
extern xdata CONTROL_XFER ControlData;
//extern xdata IO_REQUEST ioRequest;
extern xdata USB_DEMO usbDemo;			//USB实验程序辅助结构体



extern xdata unsigned long ClockTicks;
extern xdata uchar GenEpBuf[];
//extern xdata IO_REQUEST ioRequest;

//extern xdata uchar ioSize, ioCount;
//extern xdata uchar MainEpBuf[];
extern xdata uchar EpBufIN[];
extern xdata uchar EpBufOUT[];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -