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

📄 main.c

📁 USB与FPGA接口的程序设计。里面是所有的源文件都经本人测试可以用
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "usb100.h"#define SWAP(x)   					((((x) & 0xFF) << 8) | (((x) >> 8) & 0xFF))#define CONFIG_DESCRIPTOR_LENGTH    (sizeof(USB_CONFIGURATION_DESCRIPTOR) + sizeof(USB_INTERFACE_DESCRIPTOR) + (NUM_ENDPOINTS * sizeof(USB_ENDPOINT_DESCRIPTOR)))#define SETDATA						*(volatile unsigned char*)0x30000000#define SETADDR						*(volatile unsigned char*)0x30000001#define MAX_STD_REQUEST     		12#define MAX_CLASS_REQUEST   		2#define MAX_VENDOR_REQUEST  		1#define GET_STATUS                  0#define CLEAR_FEATURE               1#define SET_FEATURE                 3#define SET_ADDRESS                 5#define GET_DESCRIPTOR              6#define SET_DESCRIPTOR              7#define GET_CONFIGURATION           8#define SET_CONFIGURATION           9#define GET_INTERFACE               10#define SET_INTERFACE               11#define SYNCH_FRAME                 12 /*Descriptor Types */#define DEVICE                      1#define CONFIGURATION               2#define XSTRING                     3#define INTERFACE                   4#define ENDPOINT                    5FLEXI_INT32 tempvars4UsbReq;#define BYTE	INT8typedef struct{  unsigned char b[8];  unsigned char out;  unsigned char in;  unsigned char wrLength;  unsigned char pNum;  unsigned char *p;}TRANSMIT_STRUCT;TRANSMIT_STRUCT XmtBuff;typedef struct{  BYTE length;			// HID descriptor length ( = sizeof(HIDDSCR) )  BYTE type;			// Descriptor type (HID = 21h)  BYTE specl;			// HID spec # low byte  BYTE spech;			// HID spec # high byte  BYTE country;			// Country localization (0 = none)   BYTE num_dscr;		// Number of descriptors to follow  BYTE dscr_type;		// Descriptor type to follow (22h = report)  BYTE reportlength;		// Report descriptor length}HIDDSCR;unsigned char device_descriptor[] = {  0x12,				// 描述表大小 (18 bytes) */  0x01,				// 设备描述表类型  0x10, 0x01,			// 兼容设备版本号(BCD码)  0x00,				// class code (each interface specifies class information) */  0x00,				// device sub-class (must be set to 0 because class code is 0) */  0x00,				// device protocol (no class specific protocol) */  0x10,				// 端点0最大包大小(8,16,32,64)  0x84, 0x05,			// 厂商ID  0x01, 0x00,			// 产品ID  0x00, 0x01,			// 设备发行号(BCD码)  0x00,				// 厂商信息字符串索引  0x00,				// 产品信息字符串索引  0x00,				// 设备序列号字符串索引(不支持设为0)  0x01				// 可能配置数};unsigned char Configuration_Descriptor[] = {  0x09,				// 配置描述表长度  0x02,				// 配置描述表类型  0x22, 0x00,			// 配置描述表及附带表长度  0x01,				// 接口配置数  0x01,				// 配置描述表标识  0x00,				// 配置描述表字符串描述表索引  0xc0,				// 配置属性  0x32				// 总线供电最大值(*2mA)};unsigned char Interface_Descriptor[] = {  0x09,				// 接口描述表长度(9)  0x04,				// 接口描述表类型  0x00,				// 接口号(0)  0x00,				// 轮寻设置(0 号端点)  0x01,				// 端点数 (1)  0x03,				// 接口类属  0x00,				// 子类码  0x00,				// 协议码  0x00				// 接口字符串描述表索引(不支持)};unsigned char HIDDscr[] = {  0x09,  0x21,  0x00, 0x01,  0x00,  0x01,  0x22,  0x34,  0};unsigned char Endpoint1_out_Descriptor[] = {  0x07,				// 端点描述表长度(7)  0x05,				// 端点描述表类型  0x81,				// OUT 端点(1)  0x03,				// 传输模式(0 控制、1 同步、2 批、3 中断传输)  0x10, 0x00,			// 最大包大小(16)  0x0A				// 轮寻时间 (10ms)};unsigned char ReportDscr[] = {  0x06, 0xA0, 0xFF,  0x09, 0xA5,  0xA1, 0x01,  0x06, 0xA0, 0xFF,  0x09, 0xA6,  0xA1, 0x02,  0x09, 0xA7,  0x75, 0x08,  0x95, 0x01,  0x15, 0x00,  0x25, 0x7f,  0x81, 0x02,  0x09, 0xA8,  0x75, 0x08,  0x95, 0x07,  0x81, 0x02,//  0x09, 0xA7,  0x75, 0x08,  0x95, 0x01,  0x91, 0x02,  0x09, 0xA8,  0x75, 0x08,  0x95, 0x07,  0x91, 0x02,  //  0xC0,				// End Collection (Physical)  0xC0				// End Collection (Physical)};unsigned char TotalConf[] = {  0x09,				// 配置描述表长度  0x02,				// 配置描述表类型  0x22, 0x00,			// 配置描述表及附带表长度  0x01,				// 接口配置数  0x01,				// 配置描述表标识  0x00,				// 配置描述表字符串描述表索引  0xc0,				// 配置属性  0x32,				// 总线供电最大值(*2mA)//  0x09,				// 接口描述表长度(9)  0x04,				// 接口描述表类型  0x00,				// 接口号(0)  0x00,				// 轮寻设置(0 号端点)  0x01,				// 端点数 (1)  0x03,				// 接口类属  0x00,				// 子类码  0x00,				// 协议码  0x00,				// 接口字符串描述表索引(不支持)//  0x09,  0x21,  0x00, 0x01,  0x00,  0x01,  0x22,  0x34,  0,//  0x07,				// 端点描述表长度(7)  0x05,				// 端点描述表类型  0x81,				// OUT 端点(1)  0x03,				// 传输模式(0 控制、1 同步、2 批、3 中断传输)  0x10, 0x00,			// 最大包大小(16)  0x0A};unsigned char USBStringLanguageDescription[] = {  0x04,				// 字符串描述表长度  0x03,				// 字符串描述表类型  0x09,				// 语言标识(9 英语)  0x04				// 子语言标识: Default};unsigned char USBStringDescription1[] = {  16,  0x03,  'C', 0, 'y', 0, 'p', 0, 'r', 0, 'e', 0, 's', 0, 's', 0, ' '};unsigned char USBStringDescription2[] = {  16,  0x03,  'C', 0, 'y', 0, 'p', 0, 'r', 0, 'e', 0, 's', 0, 's', 0, ' '};//HID code startunsigned char HIDData[8] = {  0xFF,  0xFF,  0xFF,  0xFF,  0xFF,  0xFF,  0xFF,  0xFF};INT8 idle;INT8 protocol;INT8 bSetReport = 0;char chData[8];//HID code end#if	1void GetStatus (void);void ClearFeature (void);void MLsup_StallEP0 (void);void SetFeature (void);void SetAddress (void);void GetDescriptor (void);void GetConfiguration (void);void SetConfiguration (void);void GetInterface (void);void SetInterface (void);void InitD12 ();void rx_0 ();void tx_0 ();void usb_isr ();void tx_1 ();void read_out ();void SetReport ();void GetReport ();void SetIdle ();void GetIdle ();void SetProtocol ();void GetProtocol ();// _syscall0(int, lowerirq)// _syscall0(int, raiseirq)#endifvoid (*StandardDeviceRequest[]) (void) ={  GetStatus,    ClearFeature,    MLsup_StallEP0,    SetFeature,    MLsup_StallEP0,    SetAddress,    GetDescriptor,    MLsup_StallEP0,    GetConfiguration,    SetConfiguration,    GetInterface, SetInterface, MLsup_StallEP0};void (*NonStandardDeviceRequest[]) (void) ={  MLsup_StallEP0,    GetReport,    GetIdle,    GetProtocol,    MLsup_StallEP0,    MLsup_StallEP0,    MLsup_StallEP0,    MLsup_StallEP0, MLsup_StallEP0, SetReport, SetIdle, SetProtocol};DEVICE_REQUEST DCPDeviceRequest;INT16 DCPXfer_wResidue;INT8 UsbReq_Recipient;INT8 UsbReq_Type;INT8 UsbReq_Request;INT8 D12BF_SetupOverwritten = 0;INT8 REQBF_StallDCPRequest = 0;INT8 DCPFSMstate = 0;INT16 DCPXfer_wResidue;INT8 *DCPXfer_pData;INT8 Xfer_Space;//HID code startINT16 pReportDscr;INT8 reportlen;//HID code endunsigned char *tmpBuf;unsigned short desc_typ;unsigned short desc_idx;unsigned short desc_sze;unsigned char bIsOrig = 1;void usb_interrupt();voidc_entry (){	*(volatile unsigned short *)0x80000280 |= 0x0020;	*(volatile unsigned short *)0x80002200 = 0x0020;	*(volatile unsigned short *)0x800004c0 = 0;  InitD12();  usb_interrupt();}void usb_interrupt(){  unsigned short lIrq;  char iIrqUsb;  unsigned char tmp;  int i;	while (1)    {		lIrq = *(unsigned short*)0x80000240;		lIrq &= 0x0020; 		if (lIrq == 0x0020)	{	  if (bIsOrig)	    {	      XmtBuff.pNum = 16;	    }	  SETADDR = 0xF4;	//Read IRQ register	  iIrqUsb = SETDATA;	  tmp = SETDATA; 	  if (iIrqUsb & 0x01)	//EP0 OUT	    {	      XmtBuff.out = 0;	      XmtBuff.in = 1;	      SETADDR = 0x40;	      tmp = SETDATA;	      if (tmp & 0x20)		{		  tx_0 ();		}	      else		{		  SETADDR = 0x00;	// 选择端点0(指针指向0位置)		  SETADDR = 0xF0;	// 读标准控制码		  tmp = SETDATA;		  tmp = SETDATA;		  for (i = 0; i < 8; i++)		    {		      XmtBuff.b[i] = SETDATA;		    }		  if (bSetReport)		    {		      for (i = 0; i < 8; i++)			{			  HIDData[i] = XmtBuff.b[i];			}			      bSetReport = 0;		    }		  SETADDR = 0xF1;	// 应答SETUP包,使能(清 OUT 缓冲区、使能 IN 缓冲区)命令		  SETADDR = 0xF2;	// 清 OUT 缓冲区		  SETADDR = 0x01;	// 选择端点 1(指针指向0位置)		  SETADDR = 0xF1;	// 应答SETUP包,使能(清 OUT 缓冲区、使能 IN 缓冲区)命令		}	    }	  else if (iIrqUsb & 0x02)	//EP0 IN	    {	      XmtBuff.in = 1;	      SETADDR = 0x41;	//读 in 最后状态 	      tmp = SETDATA;	      rx_0 ();	    }	  else if (iIrqUsb & 0x04)	//EP1 OUT	    {	      XmtBuff.out = 2;	      XmtBuff.in = 3;	      SETADDR = 0x42;	//读 out 最后状态	      tmp = SETDATA;	      tx_1 ();	    }	  else if (iIrqUsb & 0x08)	//ENDP1_IN	    {	      XmtBuff.in = 3;	      SETADDR = 0x43;	//读 in 最后状态	      tmp = SETDATA;	      XmtBuff.b[0] = 5;	      XmtBuff.wrLength = 8;	      XmtBuff.p = HIDData;	      rx_0 ();	    }	  else if (iIrqUsb & 0x10)	//EP2 OUT	    {	      XmtBuff.pNum = 64;	      XmtBuff.out = 4;	      XmtBuff.in = 5;	      SETADDR = 0x44;	//读 out 最后状态	      tmp = SETDATA;	      read_out ();

⌨️ 快捷键说明

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