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

📄 fusb200.c

📁 faraday_USB芯片的固件
💻 C
字号:
#include "FUSB200.h"
#include "type.h"
#include "reg51.h"
#include "absacc.h"
#include <stdio.h>
#include <string.h>

//for testing TX data
//const char code tdata[] = {0x55,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x55};

struct  dev_req_s dev_req;

//Initialize M8051EW
void init_m8051ew()
{
	//Enable global interrupt
	EA = 1;
	//Enable external interrput0
	EX0 = 1;
	//Edge 
	IT0 = 1;
//	//Interrput priority
//	PX0 = 1;
}

//Initialize USB controller
void init_fusb()
{
	//int gTest = 0;
	//int a,b,c;
	//gTest = XBYTE[FUSB_REG_MAIN_CTL];
	
/* Initialize control register */
	//Turn on D+/D- & Turn off UNPLUG
	XBYTE[FUSB_REG_PHY_TMS] = 0x00;	
	//Test mode--Loop Back Test of CX
	//XBYTE[FUSB_REG_TEST_EP] = 0x02;
	//set CHIP_EN/SFRST/Global Interrupt
	XBYTE[FUSB_REG_MAIN_CTL] = 0x34;
	//Turn off SFRST
	XBYTE[FUSB_REG_MAIN_CTL] = 0x24;
	//Unmask group interruput(MINT_SCR0~MINT_SCR7)
	XBYTE[FUSB_REG_INT_MGRP] = 0x00;
	//Unmask CX interruput                      
	XBYTE[FUSB_REG_INT_MSKB0] = 0x00;
	//set suspend delay = 5ms
	XBYTE[FUSB_REG_IDLE_CNT] |= 0x05;
}

//Initialize interrupt
void init_interrupt()
{
	/* Initialize FIFO register */
	XBYTE[FUSB_REG_EP1_MAP] 	= 0xf0;	//EP1 IN map to FIFO0
	XBYTE[FUSB_REG_EP2_MAP] 	= 0x6f;	//EP2 OUT map to FIFO6
	XBYTE[FUSB_REG_FIFO0_MAP]   = 0x11;	//FIFO0 map to EP1 IN
	XBYTE[FUSB_REG_FIFO6_MAP]   = 0x02;	//FIFO6 map to EP2 OUT
	XBYTE[FUSB_REG_IEP1_XPSZ_L] = 0x00;	//EP1 IN Max Packet Size (L)
	XBYTE[FUSB_REG_IEP1_XPSZ_H] = 0x64;	//EP1 IN Max Packet Size (H) = 1024 TX_NUM_HBW = 3
	XBYTE[FUSB_REG_OEP2_XPSZ_L] = 0x00;	//EP2 OUT Max Packet Size(L)
	XBYTE[FUSB_REG_OEP2_XPSZ_H] = 0x04;	//EP2 OUT Max Packet Size(H) = 1024
	XBYTE[FUSB_REG_FIFO0_CFG] 	= 0x9a;	//Set FIFO0 Size <= 1024, Triple buffer, bulk type
	//revision
	XBYTE[FUSB_REG_FIFO2_CFG] 	= 0x1a;	//Set FIFO2 Size <= 1024, Triple buffer, bulk type
	XBYTE[FUSB_REG_FIFO4_CFG] 	= 0x1a;	//Set FIFO4 Size <= 1024, Triple buffer, bulk type
	
	XBYTE[FUSB_REG_FIFO6_CFG] 	= 0x82;	//Set FIFO6 Size <= 1024, Single buffer, bulk type
	XBYTE[FUSB_REG_INT_MSKB0]  |= 0x40; //FW read masked status of interrupt
}
//Delay function 30us
void delay(void)
{
	u8 i = 0;

	for (i=0;i<0x7f;i++)
	{
		//for(i=0;i<0x7fff;i++)
		//{
			;
		//}
	}
	return;
}

//EndPoint0 interrupt service
void ep0_int_service(void)
{
	if(XBYTE[FUSB_REG_INT_SOURCE0] & FUSB_INT_SOURCE0_CX_SETUP_INT)
	{
		//u8 dev_configuration;
		u8 meg[8];
		//Clear CX_COM_INT
		XBYTE[FUSB_REG_INT_SOURCE0] &= 0x7f;
			
		//Device request, read EndPoint0 FIFO 8bit each time
		meg[0] = XBYTE[FUSB_REG_EP0_DATA];
		meg[1] = XBYTE[FUSB_REG_EP0_DATA];
		meg[2] = XBYTE[FUSB_REG_EP0_DATA];
		meg[3] = XBYTE[FUSB_REG_EP0_DATA];
		meg[4] = XBYTE[FUSB_REG_EP0_DATA];
		meg[5] = XBYTE[FUSB_REG_EP0_DATA];
		meg[6] = XBYTE[FUSB_REG_EP0_DATA];
		meg[7] = XBYTE[FUSB_REG_EP0_DATA];
		
		//Get descriptor value to struct	
		dev_req.bmRequestType = meg[0];
		dev_req.bRequest = meg[1];
		dev_req.wValue = BYTE_TO_WORD(meg[3],meg[2]);
		dev_req.wIndex = BYTE_TO_WORD(meg[5],meg[4]);
		dev_req.wLength = BYTE_TO_WORD(meg[7],meg[6]);
  	
		//GetDescriptor request
		if(dev_req.bmRequestType == 0x80 && dev_req.bRequest == 0x06)
		{
			if(dev_req.wValue == 0x0100)//Type--device descriptor
			{
				//Clear EndPoint0 FIFO
				 XBYTE[FUSB_REG_CX_CSR] |= 0x08;
				//Check EndPoint0 FIFO empty
				if(XBYTE[FUSB_REG_CX_CSR] & 0x20)
				{
					//Device descriptor for host
					XBYTE[FUSB_REG_EP0_DATA] = 0x12;//DeviceDscr.bLength;
					XBYTE[FUSB_REG_EP0_DATA] = 0x01;//DeviceDscr.bDescriptorType;
					XBYTE[FUSB_REG_EP0_DATA] = 0x00;//GET_LOW(DeviceDscr.bcdUSB);
					XBYTE[FUSB_REG_EP0_DATA] = 0x02;//GET_HIGH(DeviceDscr.bcdUSB);
					XBYTE[FUSB_REG_EP0_DATA] = 0x00;//DeviceDscr.bDeviceClass; /*Means config the class in interface description*/
					XBYTE[FUSB_REG_EP0_DATA] = 0x00;//DeviceDscr.bDeviceSubClass;
					XBYTE[FUSB_REG_EP0_DATA] = 0x00;//DeviceDscr.bDeviceProtocol;
					XBYTE[FUSB_REG_EP0_DATA] = 0x40;//DeviceDscr.bMaxPacketSize0;
					XBYTE[FUSB_REG_EP0_DATA] = 0x51;//GET_LOW(DeviceDscr.idVendor);/*Apply on www.usb.org*/
					XBYTE[FUSB_REG_EP0_DATA] = 0x19;//GET_HIGH(DeviceDscr.idVendor);
					XBYTE[FUSB_REG_EP0_DATA] = 0x03;//GET_LOW(DeviceDscr.idProduct);/*Defined by user*/
					XBYTE[FUSB_REG_EP0_DATA] = 0x16;//GET_HIGH(DeviceDscr.idProduct);
					XBYTE[FUSB_REG_EP0_DATA] = 0x00;//GET_LOW(DeviceDscr.bcdDevice);/**/
					XBYTE[FUSB_REG_EP0_DATA] = 0x02;//GET_HIGH(DeviceDscr.bcdDevice);
					XBYTE[FUSB_REG_EP0_DATA] = 0x00;//DeviceDscr.iManufacturer;
					XBYTE[FUSB_REG_EP0_DATA] = 0x00;//DeviceDscr.iSerialNumber;
					XBYTE[FUSB_REG_EP0_DATA] = 0x00;//DeviceDscr.serialnum_str;
					XBYTE[FUSB_REG_EP0_DATA] = 0x01;//DeviceDscr.bNumberConfigurations;
					//CX writen done
				   	XBYTE[FUSB_REG_CX_CSR] |= 0x01;
				}
			}
			else if(dev_req.wValue == 0x0200)//Type--configuration descriptor
			{
				if(dev_req.wLength == 0x0009)
				{
					//Clear EndPoint0 FIFO
					XBYTE[FUSB_REG_CX_CSR] |= 0x08;
					//Check EndPoint0 FIFO empty
					if(XBYTE[FUSB_REG_CX_CSR] & 0x20)
					{
						XBYTE[FUSB_REG_EP0_DATA] = 0x09;//ConfigurationDscr.bLength;
						XBYTE[FUSB_REG_EP0_DATA] = 0x02;//ConfigurationDscr.bDescriptorType;
						XBYTE[FUSB_REG_EP0_DATA] = 0x20;//GET_LOW(ConfigurationDscr.wTotalLength);
						XBYTE[FUSB_REG_EP0_DATA] = 0x00;//GET_HIGH(ConfigurationDscr.wTotalLength);
						XBYTE[FUSB_REG_EP0_DATA] = 0x01;//ConfigurationDscr.bNumInterfaces;
						XBYTE[FUSB_REG_EP0_DATA] = 0x01;//ConfigurationDscr.bConfigurationValue;
						XBYTE[FUSB_REG_EP0_DATA] = 0x00;//ConfigurationDscr.iConfiguration;
						XBYTE[FUSB_REG_EP0_DATA] = 0xc0;//ConfigurationDscr.bmAttributes;
						XBYTE[FUSB_REG_EP0_DATA] = 0x00;//ConfigurationDscr.bMaxpower;
						
						//CX writen done
				   	XBYTE[FUSB_REG_CX_CSR] |= 0x01;
					}
				}
				else
				{
					//Clear EndPoint0 FIFO
					XBYTE[FUSB_REG_CX_CSR] |= 0x08;
					//Check EndPoint0 FIFO empty
					if(XBYTE[FUSB_REG_CX_CSR] & 0x20)
					{
						//Configuration description
						XBYTE[FUSB_REG_EP0_DATA] = 0x09;//ConfigurationDscr.bLength;
						XBYTE[FUSB_REG_EP0_DATA] = 0x02;//ConfigurationDscr.bDescriptorType;
						XBYTE[FUSB_REG_EP0_DATA] = 0x20;//GET_LOW(ConfigurationDscr.wTotalLength);
						XBYTE[FUSB_REG_EP0_DATA] = 0x00;//GET_HIGH(ConfigurationDscr.wTotalLength);
						XBYTE[FUSB_REG_EP0_DATA] = 0x01;//ConfigurationDscr.bNumInterfaces;
						XBYTE[FUSB_REG_EP0_DATA] = 0x01;//ConfigurationDscr.bConfigurationValue;
						XBYTE[FUSB_REG_EP0_DATA] = 0x00;//ConfigurationDscr.iConfiguration;
						XBYTE[FUSB_REG_EP0_DATA] = 0xc0;//ConfigurationDscr.bmAttributes;
						XBYTE[FUSB_REG_EP0_DATA] = 0x00;//ConfigurationDscr.bMaxpower;
						
						//Interface description
						XBYTE[FUSB_REG_EP0_DATA] = 0x09;//InterfaceDscr.bLength;
						XBYTE[FUSB_REG_EP0_DATA] = 0x04;//InterfaceDscr.bDescriptorType;
						XBYTE[FUSB_REG_EP0_DATA] = 0x00;//InterfaceDscr.bInterfaceNumber
						XBYTE[FUSB_REG_EP0_DATA] = 0x00;//InterfaceDscr.bAlternateSetting
						XBYTE[FUSB_REG_EP0_DATA] = 0x02;//InterfaceDscr.bNumEndPoints;
						XBYTE[FUSB_REG_EP0_DATA] = 0x08;//InterfaceDscr.bInterfaceClass; /*Storage class*/
						XBYTE[FUSB_REG_EP0_DATA] = 0x01;//InterfaceDscr.bInterfaceSubClass;/*Flash device*/
						XBYTE[FUSB_REG_EP0_DATA] = 0x00;//InterfaceDscr.bInterfaceProtocol;/*Control/Bulk/Interrupt protocol with command*/
						XBYTE[FUSB_REG_EP0_DATA] = 0x00;//InterfaceDscr.iInterface;
  	
						//EndPoint1 description(IN) 
						XBYTE[FUSB_REG_EP0_DATA] = 0x07;//InterfaceDscr.bLength;
						XBYTE[FUSB_REG_EP0_DATA] = 0x05;//InterfaceDscr.bDescriptorType;
						XBYTE[FUSB_REG_EP0_DATA] = 0x81;//InterfaceDscr.bEndPointAddress;
						XBYTE[FUSB_REG_EP0_DATA] = 0x02;//InterfaceDscr.bmAttributes;
						XBYTE[FUSB_REG_EP0_DATA] = 0x00;//GET_LOW(InterfaceDscr.wMaxPacketSize);
						XBYTE[FUSB_REG_EP0_DATA] = 0x02;//GET_HIGH(InterfaceDscr.wMaxPacketSize);						
						XBYTE[FUSB_REG_EP0_DATA] = 0x01;//InterfaceDscr.bIntervel;					
						//EndPoint2 description(OUT)
						XBYTE[FUSB_REG_EP0_DATA] = 0x07;//InterfaceDscr.bLength;
						XBYTE[FUSB_REG_EP0_DATA] = 0x05;//InterfaceDscr.bDescriptorType;
						XBYTE[FUSB_REG_EP0_DATA] = 0x02;//InterfaceDscr.bEndPointAddress;
						XBYTE[FUSB_REG_EP0_DATA] = 0x02;//InterfaceDscr.bmAttributes;
						XBYTE[FUSB_REG_EP0_DATA] = 0x00;//GET_LOW(InterfaceDscr.wMaxPacketSize);
						XBYTE[FUSB_REG_EP0_DATA] = 0x02;//GET_HIGH(InterfaceDscr.wMaxPacketSize);						
						XBYTE[FUSB_REG_EP0_DATA] = 0x01;//InterfaceDscr.bIntervel;
  	
						///Interface AlternateSetting
						//XBYTE[FUSB_REG_EP0_DATA] = 0x09;//InterfaceDscr.bLength;
						//XBYTE[FUSB_REG_EP0_DATA] = 0x04;//InterfaceDscr.bDescriptorType;
						//XBYTE[FUSB_REG_EP0_DATA] = 0x01;//InterfaceDscr.bInterfaceNumber
						//XBYTE[FUSB_REG_EP0_DATA] = 0x00;//InterfaceDscr.bAlternateSetting
						//XBYTE[FUSB_REG_EP0_DATA] = 0x02;//InterfaceDscr.bNumEndPoints;
						//XBYTE[FUSB_REG_EP0_DATA] = 0x08;//InterfaceDscr.bInterfaceClass; /*Storage class*/
						//XBYTE[FUSB_REG_EP0_DATA] = 0x01;//InterfaceDscr.bInterfaceSubClass;/*Flash device*/
						//XBYTE[FUSB_REG_EP0_DATA] = 0x00;//InterfaceDscr.bInterfaceProtocol;/*Control/Bulk/Interrupt protocol with command*/
						//XBYTE[FUSB_REG_EP0_DATA] = 0x00;//InterfaceDscr.iInterface;
					
						//DeviceTypeDefinition descriptions
							
						//VendorDefinition description
						
						//CX writen done
				   		XBYTE[FUSB_REG_CX_CSR] |= 0x01;
					}					
				}
			}
			else if(dev_req.wValue == 0x0300)//Type--string descriptor
			{
				;	
			}
		}
		//SetAddress request
		else if(dev_req.bmRequestType == 0x00 && dev_req.bRequest == 0x05)
		{
			if(dev_req.wValue != 0x0000)	     
			{	
				//Clear EndPoint0 FIFO
				XBYTE[FUSB_REG_CX_CSR] |= 0x08;
				
				//Write new address to the device address register
				XBYTE[FUSB_REG_DEVICE_ADDR] = (meg[2] & 0x7f);
				
				//CX writen done
				XBYTE[FUSB_REG_CX_CSR] |= 0x01;
			}		
		}
		//SetConfiguration request
		else if(dev_req.bmRequestType == 0x00 && dev_req.bRequest == 0x09)
		{
			if(dev_req.wValue == 0x01)
			{
 				//CX writen done
				XBYTE[FUSB_REG_CX_CSR] |= 0x01;
				//Delay 30us
					delay();
					delay();
					XBYTE[FUSB_REG_INT_MSKB5] 	= 0xfd;	//Unmask FIFO1 interrupt for EP1 IN
	        XBYTE[FUSB_REG_INT_MSKB1]	= 0x3f;	//Unmask FIFO3 OUT&Short Packetinterrupt for EP2 OUT
	        XBYTE[FUSB_REG_INT_MSKB7] 	= 0x3d; //Unmask RX0, TX0 and RST INT
			}
		}
	}
}


//EndPoint1 interrupt service(IN)
void ep1_int_service(void)
{
	//Mask interrupt of FIFO0
	XBYTE[FUSB_REG_INT_MSKB5] = 0x01;

	P0_0 = 0;
	P0_0 = 1;
    
	//while(1)
	//{
	//	if(IE0)
	//	{
	//		//FIFO1 Written done
	//		XBYTE[FUSB_REG_FIFO1_INS] |= 0x08;
	//		break;
	//	}
	//}

//	//TX0BYTE_IEP1
//	XBYTE[FUSB_REG_IEP1_XPSZ_H] |= 0x80;
	
	//XBYTE[FUSB_REG_INT_SOURCE7] = 0x40;	
	//FIFO1 Written done
	//XBYTE[FUSB_REG_FIFO1_INS] |= 0x08;
	
	//Unmask interrupt of FIFO0
	XBYTE[FUSB_REG_INT_MSKB5] &= 0xfe;
	
}

//EndPoint2 interrupt service(OUT)
void ep2_int_service(void)
{
	u8 		i;
	u8		rdata[16];
	u16		byte_cnt;
	
	//Mask interrupt of FIFO2
	XBYTE[FUSB_REG_INT_MSKB1]	= 0xff;
	
	//Short packet interrupt
	if(XBYTE[FUSB_REG_INT_SOURCE2] & 0x20)
	{
		//Read byte counter
		byte_cnt = BYTE_TO_WORD((XBYTE[FUSB_REG_FIFO0_INS] & 0x07), (XBYTE[FUSB_REG_FIFO0_BCNT]));//??
	}
	//Normal packet interrupt
	else
	{
		//Max packet size
		byte_cnt = FUSB_EP2_SIZE;
	}
	
	//Read data from FIFO
	//rx_data();
	for(i=0;i<byte_cnt;i++)
	{
		rdata[i] = XBYTE[FUSB_REG_FIFO2_DP];
	}
	
	//For testing OUT data
	if(rdata[0] == 0x55)
	{
		byte_cnt = 0x00;
		i = 0xaa;	
	}
	
	//Clear the byte counter
	XBYTE[FUSB_REG_FIFO0_INS] &= 0xf8;//??
	XBYTE[FUSB_REG_FIFO0_BCNT] = 0x00;//??
	//Unmask interrupt of FIFO2
	XBYTE[FUSB_REG_INT_MSKB1] = 0xcf;
}

//void EX0_int(void) interrupt 0
//{
//	//TX0BYTE_IEP1
//	XBYTE[FUSB_REG_IEP1_XPSZ_H] |= 0x80;
//}
//void rx_data()
//{
//	;	
//}
//
//void tx_data()
//{
//	;	
//}

⌨️ 快捷键说明

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