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

📄 usbdrv.h

📁 杭州立宇泰arm7的bootloader程序
💻 H
字号:
/*<<<-------------------------------------------------------------------------
 * File Contents:
 *	usb.c - USB related definitions
 *
 *  Project: USB Demo firmware
 *  Author : Yan Nosovitsky
 *  Date   : Jan 2001
 *----------------------------------------------------------------------->>>*/
#include "Usb.h"

#ifndef __usbdrv_h__
#define __usbdrv_h__

#define RAM_ADDRESS  0x0c008000
/*--------------------------------------------------------------------------*/
/*-------------------------------   Macros   -------------------------------*/
/*--------------------------------------------------------------------------*/

/* Flush and disable the USB TX 0/1/2 **************************************/
#define FLUSHTX0 {write_usb(TXC0,FLUSH);} 
#define FLUSHTX1 {write_usb(TXC1,FLUSH);}
#define FLUSHTX2 {write_usb(TXC2,FLUSH);}
#define FLUSHTX3 {write_usb(TXC3,FLUSH);}


/* Flush and disable the USB RX 0/1/2 **************************************/
#define FLUSHRX0 {write_usb(RXC0,FLUSH);}
#define FLUSHRX1 {write_usb(RXC1,FLUSH);}
#define FLUSHRX2 {write_usb(RXC2,FLUSH);}

#define ENABLE_RX0 write_usb(RXC0,RX_EN);
#define ENABLE_RX1 write_usb(RXC1,RX_EN);
#define ENABLE_RX2 write_usb(RXC2,RX_EN);

#define ENABLE_TX0 write_usb(TXC0,TX_EN);
#define ENABLE_TX1 write_usb(TXC1,TX_EN);
#define ENABLE_TX2 write_usb(TXC2,TX_EN);

#define FLUSH_TXEP(ep_num)		write_usb(EP_TXC(ep_num), FLUSH)
#define FLUSH_RXEP(ep_num)		write_usb(EP_RXC(ep_num), FLUSH)

#define ENABLE_RX(ep_num)		write_usb(EP_RXC(ep_num), RX_EN)
#define DISABLE_RX(ep_num)		write_usb(EP_RXC(ep_num), read_usb(EP_RXC(ep_num)) & ~RX_EN)
#define ENABLE_TX(ep_num)		write_usb(EP_TXC(ep_num), TX_EN)
#define DISABLE_TX(ep_num)		write_usb(EP_TXC(ep_num), read_usb(EP_TXC(ep_num)) & ~TX_EN)


#define GOTO_STATE(state)		       write_usb(NFSR, (state));
 
#define ATTACH_NODE	 			write_usb(MCNTRL, read_usb(MCNTRL) | NAT);
#define DETACH_NODE 			       write_usb(MCNTRL, read_usb(MCNTRL) & ~NAT);

#define ENABLE_NODE_INTS(intr)	       write_usb(MAMSK, (intr));
#define DISABLE_NODE_INTS		       write_usb(MAMSK, 0);

#define ENABLE_ALT_INTS(intr)      	write_usb(ALTMSK, (intr));
#define DISABLE_ALT_INTS(intr)	       write_usb(ALTMSK, read_usb(ALTMSK)&~(intr));

#define ENABLE_NAK_INTS(intr)	       write_usb(NAKMSK, (intr));
#define DISABLE_NAK_INTS(intr)	       write_usb(NAKMSK, read_usb(NAKMSK)&~(intr));

#define ENABLE_TX_INTS(intr)		       write_usb(TXMSK, read_usb(TXMSK)|(intr));
#define DISABLE_TX_INTS(intr)		write_usb(TXMSK, read_usb(TXMSK)&~(intr));

#define ENABLE_RX_INTS(intr)		       write_usb(RXMSK, read_usb(RXMSK)|(intr));
#define DISABLE_RX_INTS(intr)		write_usb(RXMSK, read_usb(RXMSK)&~(intr));


#define ENABLE_VGE	 		                            write_usb(MCNTRL, read_usb(MCNTRL) | VGE);

#define SET_EP_ADDRESS(ep, addr)		       write_usb((ep), (addr));

#define USB_DEVICE_ADDRESS_ENABLE		write_usb(FAR, read_usb(FAR) | AD_EN);
#define USB_DEVICE_ADDRESS_DISABLE		write_usb(FAR, read_usb(FAR) & ~AD_EN);
#define SET_USB_DEVICE_ADDRESS(addr)    	write_usb(FAR, read_usb(FAR) | addr);//((addr) & ~AD_EN));

#define ENABLE_DEFAULT_ADDRESS             	write_usb(EPC0, read_usb(EPC0) | DEF);
#define CLEAR_DEFAULT_ADDRESS                	write_usb(EPC0, read_usb(EPC0) & ~DEF);

#define SET_DEVICE_STATE(dev, st)	(dev.state = st)
#define DEVICE_STATE(dev)		dev.state
#define SET_DEVICE_ADDRESS(dev, addr)	(dev.address = addr)
#define DEVICE_ADDRESS(dev)		dev.address

#define EP_FIFO_WRITE(ep_num, data)	write_usb(EP_TXD(ep_num), (data))
#define EP_FIFO_READ(ep_num)		read_usb(EP_RXD(ep_num))


#define CLEAR_STALL_EP0			write_usb(EPC0, read_usb(EPC0) & ~STALL)
#define IS_EP0_STALLED  		((read_usb(EPC0) & STALL) == STALL)

/* The macro may be used only for ENDPOINT_1 .. ENDPOINT_6 endpoints,
 * It's assumpted that diff between two EPC# and EPC#+1 is 4 bytes */
#define EPC_ADDR(ep_num)		EPC1 + (((ep_num) - ENDPOINT_1) << 2)
#define STALL_EP(ep_num) 		write_usb(EPC_ADDR(ep_num), read_usb(EPC_ADDR(ep_num)) | STALL)
#define CLEAR_STALL_EP(ep_num)  	write_usb(EPC_ADDR(ep_num), read_usb(EPC_ADDR(ep_num)) & ~STALL)
#define IS_EP_STALLED(ep_num)   	((read_usb(EPC_ADDR(ep_num)) & STALL) == STALL)

#define IS_EP_ISO(ep_num)			((read_usb(EPC_ADDR(ep_num)) & ISO) == ISO)
#define IS_EP_IN(ep_num)			(ep_num%2)
#define ENABLE_EP(ep_num)   		write_usb(EPC_ADDR(ep_num), read_usb(EPC_ADDR(ep_num)) | EP_EN)
#define DISABLE_EP(ep_num)   		write_usb(EPC_ADDR(ep_num), read_usb(EPC_ADDR(ep_num)) & ~EP_EN)

#define EP_TXSTATUS(ep_num)		read_usb(EP_TXS(ep_num))
#define EP_RXSTATUS(ep_num)		read_usb(EP_RXS(ep_num))

#define ALT_EVENTS			read_usb(ALTEV)
#define DMA_EVENTS			read_usb(DMAEV)
#define NAK_EVENTS			read_usb(NAKEV)
#define TX_EVENTS			read_usb(TXEV)
#define RX_EVENTS			read_usb(RXEV)

#define IS_REQ_INDEX_NOT_ZERO(req)  (((REQ_INDEX(req)>>8) != 0x0) &&  ((REQ_INDEX(req)&0xff) != 0x0))   
#define IS_REQ_VALUE_NOT_ZERO(req)  (((REQ_VALUE(req)>>8)/*.as_bytes.msb*/ != 0x0) &&  ((REQ_VALUE(req)&0xff)/*.as_bytes.lsb*/ != 0x0))   

#define IS_TX_ENABLE(ep_num)	(read_usb(EP_TXC(ep_num) & TX_EN))
#define IS_RX_ENABLE(ep_num)	(read_usb(EP_RXC(ep_num) & RX_EN))

#define REFILL_FIFO(ep_num)	write_usb(EP_TXC(ep_num), read_usb(EP_TXC(ep_num) | RFF))	
#define	SET_LAST(ep_num) write_usb(EP_TXC(ep_num), read_usb(EP_TXC(ep_num) | LAST))
/*=======================================================================*/
//gain the register address for responding EndPoint
#define TXEP_ADDR(ep_num)		usbn9604_tx_endpoint_addr[(ep_num)]//save the address of EPx TXDx register (0,1,3,5)
#define RXEP_ADDR(ep_num)		usbn9604_rx_endpoint_addr[(ep_num)]

#define EP_TXD(ep_num)			TXEP_ADDR(ep_num)
/* It's assumpted that TXS# is TXD#+1 */
#define EP_TXS(ep_num)			TXEP_ADDR(ep_num) + 1
/* It's assumpted that TXC# is TXD#+2 */
#define EP_TXC(ep_num)			TXEP_ADDR(ep_num) + 2

#define EP_RXD(ep_num)			RXEP_ADDR(ep_num)
/* It's assumpted that RXS# is RXD#+1 */
#define EP_RXS(ep_num)			RXEP_ADDR(ep_num) + 1
/* It's assumpted that RXC# is RXD#+2 */
#define EP_RXC(ep_num)			RXEP_ADDR(ep_num) + 2

								//20 MHz
								//4 cycles takes single for loop 
								//10s waiting threshold
#define WAITING_THRESHOLD		50000000

#define TX_EP_COUNTER(ep_num)	(read_usb(EP_TXS(ep_num)) & 0x1F)//20)
#define RX_EP_COUNTER(ep_num)	(read_usb(EP_RXS(ep_num)) & 0xF) //10)

#define NUM_OF_ENDPOINTS	7


#define RX_INTR_EP_FIFO_SIZE		1
#define TX_INTR_EP_FIFO_SIZE		1

#define BZERO(buf) memset(&(buf), 0, sizeof(buf))
//#ifdef TMON
//byte 			buffer[1024];
//#else
//byte 			buffer[2*1024];
//#endif
//byte 			*readPtr = buffer;
//byte 			*writePtr = buffer;


/*============================================================================
 *					Definitons
 *============================================================================*/
typedef enum {
    ENDPOINT_0,
    ENDPOINT_1,
    ENDPOINT_2,
    ENDPOINT_3,
    ENDPOINT_4,
    ENDPOINT_5,
    ENDPOINT_6,
    ENDPOINT_LAST
} endpoint_t;

typedef struct {
	byte *data;
	unsigned int bytes_counter;//counter of data bytes currently stored in the buffer
}control_buffer_t;

typedef enum {
		EMPTY, 
		FULL, 
		WAIT_FOR_ACK
}FIFO_status_t;

typedef struct {
	FIFO_status_t FIFO_status;//FIFO_status可能取的值为FIFO_status_t中的3个值
	byte toggle_bit;
}endpoint_status_t;//包括FIFO的状态和toggle_bit

typedef struct {
	byte fn_dlflg;
	char file_name[50];
	char suffix[10];
	unsigned int file_len;
}file_status_t;
/*--------------------------------------------------------------------------*/
/*------------------------------- External Interface -----------------------*/
/*--------------------------------------------------------------------------*/
byte USB_Receive_Data (byte* data_ptr,endpoint_t ep_num);
byte USB_Transmit_Data (int data_size, byte* data_ptr, endpoint_t ep_num); 
void USB_init_dma(endpoint_t endPoint);
void USB_start_dma(int DCOUNT);


/*====================================================================
 *							Prototypes
 *====================================================================*/
void __irq usb_node_handler(void);
//void usb_drq_handler(void);
void reset_usb(void);
void usb_device_reset(void);	

void clear_control_buffer(control_buffer_t* control_buff);
void fill_control_fifo(void);
/*__inline*/ void USBN9604_tx_event_handler(void);
void USBN9604_alt_event_handler(void);
/*__inline*/ void USBN9604_rx_event_handler(void);
void USB_device_req_handler(void);

void usbn9604_tx_enable(int ep_num);
void usbn9604_tx_retransmit_enable(int ep_num);
void endpoint_status_init(void);
void send_control_data(byte *data_ptr, int data_size);
void zero_length_data_response(endpoint_t ep_num);
/*__inline*/ void STALL_EP0(void);
void Bulk_Parser(USB_request_t *req);
void Gen_Parser(USB_request_t *req);
/*__inline*/ void BulkReceiveEvent(void);
/*__inline*/ void BulkTransmitEvent(void);
/*__inline*/ void USB_fast_read(byte data_size, byte *data_ptr, endpoint_t ep_num);
/*__inline*/ void USB_write_data (int data_size, byte data, endpoint_t ep_num);
/*__inline*/ int USB_read_compare(byte data_size, byte data, endpoint_t ep_num );

#endif //__usbdrv_h__

⌨️ 快捷键说明

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