📄 fusb200.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 + -