📄 copy of usb.h
字号:
//中断类型
#define USB_INT_SPINT 0x01
#define USB_INT_SOFINT 0x08
#define USB_INT_EORINT 0x10
#define USB_INT_WUPCPU 0x20
#define USB_INT_EP0 0x01
#define USB_INT_EP1 0x02
#define USB_INT_EP2 0x04
#define USB_INT_TXCMP 0x01
#define USB_INT_RXOUTB0 0x02
#define USB_INT_RXOUTB1 0x40
#define USB_INT_RXSETUP 0x04
#define USB_INT_STLCRC 0x08
#define USB_INT_NAKOUT 0x20
#define USB_INT_NAKIN 0x10
//EndPoint模式
#define USB_EPMOD_DISABLE 0x00
#define USB_EPMOD_COLTROL 0xC0
#define USB_EPMOD_BULK_IN 0xC6
#define USB_EPMOD_BULK_OUT 0xC2
#define USB_EPMOD_INTERRUPT_IN 0x87
#define USB_EPMOD_INTERRUPT_OUT 0x85
#define USB_EPMOD_ISOCHRONOUS_IN 0x83
#define USB_EPMOD_ISOCHRONOUS_OUT 0x81
//中断控制
#define USB_ENABLE_INT_USB SET_BIT_6(IEN1)
#define USB_DISABLE_INT_USB CLEAR_BIT_6(IEN1)
#define USB_ENABLE_INT_WUPCPU SET_BIT_5(USBIEN)
#define USB_DISABLE_INT_WUPCPU CLEAR_BIT_5(USBIEN)
#define USB_ENABLE_INT_EORINT SET_BIT_4(USBIEN)
#define USB_DISABLE_INT_EORINT CLEAR_BIT_4(USBIEN)
#define USB_ENABLE_INT_SOFINT SET_BIT_3(USBIEN)
#define USB_DISABLE_INT_SOFINT CLEAR_BIT_3(USBIEN)
#define USB_ENABLE_INT_SPINT SET_BIT_0(USBIEN)
#define USB_DISABLE_INT_SPINT CLEAR_BIT_0(USBIEN)
#define USB_ENABLE_INT_NAK SET_BIT_6(UEPCONX)
#define USB_DISABLE_INT_NAK CLEAR_BIT_6(UEPCONX)
#define USB_ENABLE_INT_EP0 SET_BIT_0(UEPIEN)
#define USB_DISABLE_INT_EP0 CLEAR_BIT_0(UEPIEN)
#define USB_ENABLE_INT_EP1 SET_BIT_1(UEPIEN)
#define USB_DISABLE_INT_EP1 CLEAR_BIT_1(UEPIEN)
#define USB_ENABLE_INT_EP2 SET_BIT_2(UEPIEN)
#define USB_DISABLE_INT_EP2 CLEAR_BIT_2(UEPIEN)
//Endpoint reset
#define USB_EP0_RESET SET_BIT_0(UEPRST);CLEAR_BIT_0(UEPRST)
#define USB_EP1_RESET SET_BIT_1(UEPRST);CLEAR_BIT_1(UEPRST)
#define USB_EP2_RESET SET_BIT_2(UEPRST);CLEAR_BIT_2(UEPRST)
#define USB_GET_STATUS 0x00
#define USB_CLEAR_FEATURE 0x01
#define USB_SET_FEATURE 0x03
#define USB_SET_ADDRESS 0x05
#define USB_GET_DESCRIPTOR 0x06
#define USB_SET_DESCRIPTOR 0x07
#define USB_GET_CONFIGURATION 0x08
#define USB_SET_CONFIGURATION 0x09
#define USB_GET_INTERFACE 0x0a
#define USB_SET_INTERFACE 0x0b
#define USB_SYNCH_FRAME 0x0c
#define USB_GET_DESC_DEVICE 0x01
#define USB_GET_DESC_CONFIGURATION 0x02
#define USB_GET_DESC_STRING 0x03
#define USB_GET_DESC_INTERFACE 0x04
#define USB_GET_DESC_ENDPOINT 0x05
//类代码
#define USB_CLASS_RESERVED 0x00
#define USB_CLASS_AUDIO 0x01
#define USB_CLASS_COMMUNICATIONS 0x02
#define USB_CLASS_HUMAN_INTERFACE 0x03
#define USB_CLASS_MONITOR 0x04
#define USB_CLASS_PHYSICAL_INTERFACE 0x05
#define USB_CLASS_POWER 0x06
#define USB_CLASS_PRINTER 0x07
#define USB_CLASS_STORAGE 0x08
#define USB_CLASS_HUB 0x09
#define USB_CLASS_VENDOR_SPECIFIC 0xFF
//子类代码
#define USB_SUBCLASS_RBC 0x01
#define USB_SUBCLASS_SFF8020I 0x02
#define USB_SUBCLASS_QIC157 0x03
#define USB_SUBCLASS_UFI 0x04
#define USB_SUBCLASS_SFF8070I 0x05
#define USB_SUBCLASS_SCSI 0x06
//协议代码
#define USB_PROTOCOL_CBI0 0x00
#define USB_PROTOCOL_CBI1 0x01
#define USB_PROTOCOL_BULK 0x50
#define USB_SEND_ZERO_PACKET SET_BIT_4(UEPSTAX);/*设置TXRDY*/while(!( UEPSTAX & 0x01 ));/*等待TXCM*/ CLEAR_BIT_0(UEPSTAX)/*清除TXCMP*/
#define USB_SEND_STALL_PACKET CLEAR_BIT_2(UEPSTAX);/*RXSETUP*/CLEAR_BIT_4(UEPSTAX);/*TXRDY*/CLEAR_BIT_0(UEPSTAX);/*TXCMPL*/CLEAR_BIT_1(UEPSTAX);/*RXOUTB0*/CLEAR_BIT_6(UEPSTAX);/*RXOUTB1*/SET_BIT_5(UEPSTAX)/*SET STALLRQ*/
code BYTE USBDeviceDescriptor[] = //设备描述符
{
0x12, //bLength 描述表大小 (18 bytes)
0x01, //bDescriptorType 设备描述表类型
0x10, 0x01, //bcdUSB 兼容设备版本号(BCD码)
0x00, //bDeviceClass 设备类码
0x00, //bDeviceSubClass 子类码
0x00, //bDeviceProtocol 协议码
0x20, //bMaxPacketSize0 端点0最大包大小(8,16,32,64)
0x00, 0x03, //idVendor 厂商ID
0x01, 0x00, //idProduct 产品ID
0x00, 0x01, //bcdDevice 设备发行号(BCD码)
0x00, //iManuFacturer 厂商信息字符串索引
0x00, //iProduct 产品信息字符串索引
0x00, //iSerialNumber 设备序列号字符串索引(不支持设为0)
0x01 //bNumConfiguration 配置数
};
code BYTE USBConfigurationDescriptor[]= //配置描述符
{
0x09, //bLength 描述表达小9 bytes
0x02, //bDescriptorType 描述表类型
0x20,0x00 , //wTotalLength 描述表总长度
0x01, //bNumInterfaces 设备支持的接口数
0x01, //bConfiguration Configuration 标志
0x00, //iConfiguration 字符串描述指针
0xc0, //bmAttributes 供电设置
0x64 //MaxPower 最大电流
};
code BYTE USBInterfaceDescriptor[]= //接口描述符
{
0x09, //bLlength 描述表达小9 bytes
0x04, //bDescriptorType 描述表类型
0x00, //bInterfaceNumber 接口号
0x00, //bAlternateSetting 可替换的设置接口
0x02, //bNumEndpoints 端口数
USB_CLASS_STORAGE, //bInterfaceClass 类代码
USB_SUBCLASS_SCSI, //bInterfaceSubClass子类
USB_PROTOCOL_BULK, //bInterfaceProtocol协议
0x00 //bInterface 字符串描述符指针
};
code BYTE USBEndpoint1Descriptor[]= //终端1描述符
{
0x07, //bLength 描述符长度 7 bytes
0x05, //bDescriptorType 描述符类型
0x01, //bEndpointAddress 终端号和方向 终端 OUT 方式
0x02, //bmAttributes 传输类型 BULK方式
0x40,0x00, //wMaxPacketSize 最大包尺寸
0x00 //bInterval 查询间隔时间
};
code BYTE USBEndpoint2Descriptor[]= //终端2描述符
{
0x07, //bLength 描述符长度 7 bytes
0x05, //bDescriptorType 描述符类型
0x82, //bEndpointAddress 终端号和方向 终端2 IN 方式
0x02, //bmAttributes 传输类型 BULK方式
0x40,0x00, //wMaxPacketSize 最大包尺寸
0x00 //bInterval 查询间隔时间
};
code char USBString1Descriptor[]=
{
0x04, //bLength
0x03, //bDescriptorType
0x09,04 //bLANGID
};
code char USBString2Descriptor[]=
{
0x10, //bLength
0x03, //bDescriptorType
'U',0,'S',0,'B',0,' ',0,'M',0,'P',0,'3',0 //bLANGID
};
code char USBString3Descriptor[]=
{
0x10, //bLength
0x03, //bDescriptorType
0,'U',0,'S',0,'B',0,' ',0,'M',0,'P',0,'3' //bLANGID
};
code char USBString4Descriptor[]=
{
0x10, //bLength
0x03, //bDescriptorType
'U',0,'S',0,'B',0,' ',0,'M',0,'P',0,'3',0 //bLANGID
};
code BYTE USBStringDescriptor[]=
{
0x10, //bLength 描述符长度
0x03, //bDescriptorType 描述符类型
"asfasdfasdfasdf" //bSTRING 字符串
};
struct SetupStr
{
BYTE bmRequestType;
BYTE bRequest;
WORD wValue;
WORD wIndex;
WORD wLength;
};
struct USBBufferStr
{
BYTE In[64];
BYTE *Out;
BYTE InLength;
BYTE OutLength;
};
xdata struct USBBufferStr USBBuffer;
xdata struct SetupStr *USBSetup=(struct SetupStr *)USBBuffer.In;
void InitUSB(void);
void InitUSB(void)
{
USBCON=0x40; //停止USB
USBCLK=0x03; //set USB clock 192/4=48MHz
USBCON=0xc0; //启动USB
USBCON=0x80; //启动USB
// USB_EP0_RESET; //Endpoint复位
// USB_EP1_RESET;
// USB_EP2_RESET;
USBADDR=0x80;
// UEPNUM=0x00; //设置Endpoint0
// UEPCONX=USB_EPMOD_COLTROL; //设置控制传输
UEPNUM=0x01; //设置Endpoint1
UEPCONX=USB_EPMOD_BULK_OUT;
UEPNUM=0x02; //设置Endpoint2
UEPCONX=USB_EPMOD_BULK_IN;
UEPRST = 0x07;
UEPRST = 0x00;
USB_ENABLE_INT_EP0; //开EndPoint0中断
USB_ENABLE_INT_EP1; //开EndPoint0中断
USB_ENABLE_INT_EP2; //开EndPoint0中断
USBINT=0x00; //清除所有中断标记
// USBIEN=0x39; //开全局中断
SET_BIT_6(IEN1); //开USB总中断
}
void USBReadPacket(void)
{
register i;
USBBuffer.InLength=UBYCTX;
printf("STA:%02bx UBYCTLX:%02bx\n",UEPSTAX,USBBuffer.InLength);
for(i=0;i<USBBuffer.InLength;i++)
{ USBBuffer.In[i]=UEPDATX;
printf("%02bx ",USBBuffer.In[i]);}
printf("\n");
}
void USBWritePacket(void)
{
register i;
SET_BIT_7(UEPSTAX); //设置DIR
for(i=0;i<USBBuffer.OutLength;i++)
{ UEPDATX=USBBuffer.Out[i];
printf("%02bx ",USBBuffer.Out[i]);}
printf("\n");
SET_BIT_4(UEPSTAX); //设置TXRDY
while(!( UEPSTAX & 0x01 )); //等待TXCMP
CLEAR_BIT_0(UEPSTAX); //清除TXCMP
}
void USBSetAddress(void)
{
// USB_SEND_ZERO_PACKET;
// SET_BIT_7(UEPSTAX);
SET_BIT_4(UEPSTAX); //设置TXRDY
while(!( UEPSTAX & 0x01 )); //等待TXCMP
CLEAR_BIT_0(UEPSTAX); //清除TXCMP
USBADDR = 0x80|(USBSetup->wValue>>8); //设置地址
SET_BIT_0(USBCON); //设置地址有效
printf("Address:%02bx\n",USBADDR);
}
void USBGetDescriptor(void)
{
switch (USBSetup->wValue&0x00ff)
{
case USB_GET_DESC_DEVICE :
USBBuffer.Out=USBDeviceDescriptor;
USBBuffer.OutLength=USBDeviceDescriptor[0]; //设备描述表长度
break;
case USB_GET_DESC_CONFIGURATION :
USBBuffer.Out=USBConfigurationDescriptor;
if (USBSetup->wLength>0x1800) //配置描述标的长度
USBBuffer.OutLength=sizeof(USBConfigurationDescriptor)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -