📄 main.c
字号:
#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 + -