📄 usb-jb8.c
字号:
#include=20 <hidef.h> /* for EnableInterrupts macro */
#include=20 <MC68HC908JB8.h> /* include peripheral declarations */
#include = "descriptor.h"
static byte qbf @0x80;
void=20 usb_init()
{
UADDR_USBEN=3D1;//=C6=F4=D3=C3USB
//UIR= 0_TXD2IE=3D1;//=B6=CB=B5=E32=B7=A2=CB=CD=D6=D0=B6=CF
UIR0_RXD2IE= =3D1;//=B6=CB=B5=E32=BD=D3=CA=D5=D6=D0=B6=CF
//UIR0_RXD1IE=3D1;/= /=B6=CB=B5=E31=BD=D3=CA=D5=D6=D0=B6=CF
UIR0_RXD0IE=3D1;//=B6=CB=B5= =E30=BD=D3=CA=D5=D6=D0=B6=CF
//------------------------//
&nb= sp;UCR0_RX0E=3D1;//=B6=CB=B5=E30=BD=D3=CA=D5=D4=CA=D0=ED
//-----= -------------------//
UCR1_STALL1=3D1;//=B6=CB=B5=E31=C7=BF=D6=C6= =BD=FB=D6=B9
//------------------------//
UCR2_STALL=3D= 1;//=B6=CB=B5=E32=C7=BF=D6=C6=BD=FB=D6=B9//=BB=B3=D2=C9Motorola=B8=E3=B4=ED= =C1=CB=A3=AC=CB=E3=C1=CB=C0=C1=B5=C3=B8=C4=C1=CB
//-------------= -----------//
UCR3_OSTALL0=3D1;//=B6=CB=B5=E30OUT=CA=C2=CE=F1=C7= =BF=D6=C6=B7=B5=BB=D8STALL
UCR3_ISTALL0=3D1;//=B6=CB=B5=E30IN=CA= =C2=CE=F1=C7=BF=D6=C6=B7=B5=BB=D8STALL
}
void=20 usb_EOP()
{
UIR2_EOPFR=3D1;//=BD=ABEOPF=C7=E50
}
void=20 setup_in_device()
{
switch(REQUEST_REQ)
{
= case=20 USB_REQUEST_GET_STATUS:
break;
case=20 USB_REQUEST_GET_DESCRIPTOR:
break;
case=20 USB_REQUEST_GET_CONFIGURATION:
= break;
}
}
void=20 setup_in_interface()
{
switch(REQUEST_REQ)
{
&nbs= p; case=20 USB_REQUEST_GET_STATUS:
break;
case=20 USB_REQUEST_GET_INTERFACE:
= break;
}
}
void=20 setup_in_endpoint()
{
switch(REQUEST_REQ)
{
= ; case=20 USB_REQUEST_GET_STATUS:
break;
case=20 USB_REQUEST_SYNC_FRAME:
break;
}
}
void=20 setup_out_device()
{
byte=20 temp;
switch(REQUEST_REQ)
{
case=20 USB_REQUEST_CLEAR_FEATURE:
=20 if(REQUEST_VAL=3D=3DUSB_DEVICE_REMOTE_WAKEUP)
=20 {
= //=C7=E5=B3=FD=D4=B6=B3=CC=BB=BD=D0=D1
}
= break;
case USB_REQUEST_SET_FEATURE:
=20 if(REQUEST_VAL=3D=3DUSB_DEVICE_REMOTE_WAKEUP)
=20 {
= //=BB=D6=B8=B4=D4=B6=B3=CC=BB=BD=D0=D1
}
= break;
case USB_REQUEST_SET_ADDRESS:
=20 temp=3DREQUEST_VAL;
UADDR_UADD=3Dtemp;
=20 break;
case USB_REQUEST_SET_DESCRIPTOR:
=20 break;
case USB_REQUEST_SET_CONFIGURATION:
=20 break;
}
}
void=20 setup_out_interface()
{
switch(REQUEST_REQ)
{
&nb= sp;=20 case USB_REQUEST_CLEAR_FEATURE:
break;
case=20 USB_REQUEST_SET_FEATURE:
break;
case=20 USB_REQUEST_SET_INTERFACE:
= break;
}
}
void=20 setup_out_endpoint()
{
switch(REQUEST_REQ)
{
&nbs= p; case=20 USB_REQUEST_CLEAR_FEATURE:
= break;
}
}
void=20 usb_do_setup()
{
switch(REQUEST_REQTYPE)
{
= case=20 0x00:setup_out_device(); =20 break;//=CA=FD=BE=DD=B7=BD=CF=F2=A3=BA=D6=F7=BB=FA=B5=BD=C9=E8=B1=B8=A3=AC= =B1=EA=D7=BC=C7=EB=C7=F3=C3=FC=C1=EE=A3=AC=BD=D3=CA=D5=D5=DF=A3=BA=C9=E8=B1= =B8
case=20 0x01:setup_out_interface(); = break;//=CA=FD=BE=DD=B7=BD=CF=F2=A3=BA=D6=F7=BB=FA=B5=BD=C9=E8=B1=B8=A3=AC= =B1=EA=D7=BC=C7=EB=C7=F3=C3=FC=C1=EE=A3=AC=BD=D3=CA=D5=D5=DF=A3=BA=BD=D3=BF= =DA
=20 case 0x02:setup_out_endpoint(); =20 break;//=CA=FD=BE=DD=B7=BD=CF=F2=A3=BA=D6=F7=BB=FA=B5=BD=C9=E8=B1=B8=A3=AC= =B1=EA=D7=BC=C7=EB=C7=F3=C3=FC=C1=EE=A3=AC=BD=D3=CA=D5=D5=DF=A3=BA=B6=CB=BF= =DA
case=20 0x80:setup_in_device(); =20 break;//=CA=FD=BE=DD=B7=BD=CF=F2=A3=BA=C9=E8=B1=B8=B5=BD=D6=F7=BB=FA=A3=AC= =B1=EA=D7=BC=C7=EB=C7=F3=C3=FC=C1=EE=A3=AC=BD=D3=CA=D5=D5=DF=A3=BA=C9=E8=B1= =B8
case=20 0x81:setup_in_interface(); =20 break;//=CA=FD=BE=DD=B7=BD=CF=F2=A3=BA=C9=E8=B1=B8=B5=BD=D6=F7=BB=FA=A3=AC= =B1=EA=D7=BC=C7=EB=C7=F3=C3=FC=C1=EE=A3=AC=BD=D3=CA=D5=D5=DF=A3=BA=BD=D3=BF= =DA
case=20 0x82:setup_in_endpoint(); =20 break;//=CA=FD=BE=DD=B7=BD=CF=F2=A3=BA=C9=E8=B1=B8=B5=BD=D6=F7=BB=FA=A3=AC= =B1=EA=D7=BC=C7=EB=C7=F3=C3=FC=C1=EE=A3=AC=BD=D3=CA=D5=D5=DF=A3=BA=B6=CB=BF= =DA
default =20 : = =20 break;
}
}
void=20 usb_RX0()
{
if(USR0_SETUP=3D=3D1)//=B6=CB=B5=E30=BD=D3=CA=D5=B5= =BD=C1=CBSETUP=C1=EE=C5=C6
{
=20 //=B4=A6=C0=EDSETUP=C1=EE=C5=C6
= REQUEST_REQTYPE=3DUE0D0;
=20 REQUEST_REQ=3DUE0D1;
REQUEST_VAL=3DUE0D2;
=20 REQUEST_VAL=3DREQUEST_VAL<<8;
=20 REQUEST_VAL=3DREQUEST_VAL+UE0D3;
= REQUEST_IND=3DUE0D4;
=20 REQUEST_IND=3DREQUEST_IND<<8;
=20 REQUEST_IND=3DREQUEST_IND+UE0D5;
= REQUEST_LEN=3DUE0D6;
=20 REQUEST_LEN=3DREQUEST_LEN<<8;
=20 REQUEST_LEN=3DREQUEST_LEN+UE0D7;
=20 usb_do_setup();
}
UIR2_RXD0FR=3D1;
}
void=20 main(void)
{
CONFIG_COPD=3D1; =20 //=BD=FB=D6=B9=BF=B4=C3=C5=B9=B7
usb_init();
= qbf=3D0x55;
EnableInte= rrupts;
for(;;);
}
void=20 interrupt 2=20 usb_int()
{
qbf=3D0xaa;
if(UIR1_EOPF=3D=3D1)//=BC=EC= =B2=E2=B5=BDEOP
{
=20 usb_EOP();
}
if(UIR1_RXD0F=3D=3D1)//=BC=EC=B2=E2=B5=BD=B6= =CB=B5=E30=BD=D3=CA=D5=B5=BD=CA=FD=BE=DD
{
=20 usb_RX0();
}
}
=CE=D2=B5=C4descrip= tor.h=CE=C4=BC=FE
/*
**********************************************= ***********************************************
* &nb= sp; =20 USB=20 =C3=E8=CA=F6=B7=FB=BD=E1=B9=B9=CC=E5=BC=B0=C6=E4=B3=C9=D4=B1=C8=A1=D6=B5=BA= =EA=B6=A8=D2=E5
******************************************************= ***************************************
*/
typedef=20 unsigned char =20 INT8U; = /*=20 =CE=DE=B7=FB=BA=C58=CE=BB=D5=FB=D0=CD=B1=E4=C1=BF */
typedef = unsigned int =20 INT16U; /*=20 =CE=DE=B7=FB=BA=C516=CE=BB=D5=FB=D0=CD=B1=E4=C1=BF */
typedef = unsigned long =20 INT32U; /*=20 =CE=DE=B7=FB=BA=C532=CE=BB=D5=FB=D0=CD=B1=E4=C1=BF = */
/*********** USB = =C9=E8=B1=B8=C3=E8=CA=F6=B7=FB=BD=E1=B9=B9=CC=E5 =20 ****************/
typedef struct _USB_DEVICE_DESCRIPTOR=20 {
INT8U bLength;
INT8U=20 bDescriptorType;
INT8U = bcdUSB0;
=20 INT8U bcdUSB1;
INT8U = bDeviceClass;
=20 INT8U bDeviceSubClass;
INT8U=20 bDeviceProtocol;
INT8U=20 bMaxPacketSize0;
INT8U = idVendor0;
=20 INT8U idVendor1;
INT8U = idProduct0;
=20 INT8U idProduct1;
INT8U = bcdDevice0;
=20 INT8U bcdDevice1;
INT8U=20 iManufacturer;
INT8U = iProduct;
INT8U=20 iSerialNumber;
INT8U bNumConfigurations;
}=20 USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR;
/*********** = USB =20 =C5=E4=D6=C3=C3=E8=CA=F6=B7=FB=BD=E1=B9=B9=CC=E5 = ****************/
typedef struct _USB_CONFIGURATION_DESCRIPTOR=20 {
INT8U bLength;
INT8U=20 bDescriptorType;
INT8U=20 wTotalLength0;
INT8U = wTotalLength1;
=20 INT8U bNumInterfaces;
INT8U=20 bConfigurationValue;
INT8U=20 iConfiguration;
INT8U = bmAttributes;
=20 INT8U MaxPower;
} USB_CONFIGURATION_DESCRIPTOR,=20 *PUSB_CONFIGURATION_DESCRIPTOR;
/*********** USB = =BD=D3=BF=DA=C3=E8=CA=F6=B7=FB=BD=E1=B9=B9=CC=E5 =20 ****************/
typedef struct _USB_INTERFACE_DESCRIPTOR=20 {
INT8U bLength;
INT8U=20 bDescriptorType;
INT8U=20 bInterfaceNumber;
INT8U=20 bAlternateSetting;
INT8U=20 bNumEndpoints;
INT8U=20 bInterfaceClass;
INT8U=20 bInterfaceSubClass;
INT8U=20 bInterfaceProtocol;
INT8U iInterface;
}=20 USB_INTERFACE_DESCRIPTOR, = *PUSB_INTERFACE_DESCRIPTOR;
/*********** =20 USB =B6=CB=B5=E3=C3=E8=CA=F6=B7=FB=BD=E1=B9=B9=CC=E5 = ****************/
typedef struct=20 _USB_ENDPOINT_DESCRIPTOR {
INT8U=20 bLength;
INT8U = bDescriptorType;
=20 INT8U bEndpointAddress;
INT8U=20 bmAttributes;
INT8U = wMaxPacketSize0;
=20 INT8U wMaxPacketSize1;
INT8U bInterval;
}=20 USB_ENDPOINT_DESCRIPTOR, *PUSB_ENDPOINT_DESCRIPTOR;
/*********** USB=20 =D7=D6=B7=FB=B4=AE=C3=E8=CA=F6=B7=FB=BD=E1=B9=B9=CC=E5 = ****************/
typedef struct _USB_STRING_DESCRIPTOR=20 {
INT8U bLength;
INT8U=20 bDescriptorType;
INT8U bString[3];
}=20 USB_STRING_DESCRIPTOR, = *PUSB_STRING_DESCRIPTOR;
//USB=D7=EE=B4=F3=D7=D6=B7=FB=B3=A4=B6=C8
= #define=20 MAXIMUM_USB_STRING_LENGTH=20 255
/*******************************************************
= **=20 USB=20 =C9=E8=B1=B8=C7=EB=C7=F3=C0=E0=D0=CD
***************************= *****************************/
#define=20 USB_DEVICE_DESCRIPTOR_TYPE = ; =20 0x01
#define=20 USB_CONFIGURATION_DESCRIPTOR_TYPE &nbs= p; =20 0x02
#define=20 USB_STRING_DESCRIPTOR_TYPE = ; =20 0x03
#define=20 USB_INTERFACE_DESCRIPTOR_TYPE &n= bsp; =20 0x04
#define=20 USB_ENDPOINT_DESCRIPTOR_TYPE &nb= sp; =20 0x05
//#define=20 USB_POWER_DESCRIPTOR_TYPE = =20 0x06
/******************************************************* ** =20 =CF=C2=C3=E6=CE=AA=BB=F9=D3=DAUSB=20 1.0=B9=E6=B7=B6=B5=C4=D5=FD=C8=B7=D6=B5
************************= ********************************/
#define=20 USB_REQUEST_GET_STATUS &nb= sp; =20 0x00
#define=20 USB_REQUEST_CLEAR_FEATURE = =20 0x01
#define=20 USB_REQUEST_SET_FEATURE &n= bsp; =20 0x03
#define=20 USB_REQUEST_SET_ADDRESS &n= bsp; =20 0x05
#define=20 USB_REQUEST_GET_DESCRIPTOR = ; =20 0x06
#define=20 USB_REQUEST_SET_DESCRIPTOR = ; =20 0x07
#define=20 USB_REQUEST_GET_CONFIGURATION &n= bsp; =20 0x08
#define=20 USB_REQUEST_SET_CONFIGURATION &n= bsp; =20 0x09
#define=20 USB_REQUEST_GET_INTERFACE = =20 0x0A
#define=20 USB_REQUEST_SET_INTERFACE = =20 0x0B
#define=20 USB_REQUEST_SYNC_FRAME &nb= sp; =20 0x0C
/******************************************************* **=20 USB =20 =C9=E8=B1=B8=C0=E0
*********************************************= ***********/
#define=20 USB_DEVICE_CLASS_RESERVED = =20 0x00
#define=20 USB_DEVICE_CLASS_AUDIO &nb= sp; =20 0x01
#define USB_DEVICE_CLASS_COMMUNICATIONS =20 0x02
#define USB_DEVICE_CLASS_HUMAN_INTERFACE =20 0x03
//#define=20 USB_DEVICE_CLASS_MONITOR &= nbsp; =20 0x04
#define USB_DEVICE_CLASS_PHYSICAL_INTERFACE 0x05
#define=20 USB_DEVICE_CLASS_POWER &nb= sp; =20 0x06
#define=20 USB_DEVICE_CLASS_PRINTER &= nbsp; =20 0x07
#define=20 USB_DEVICE_CLASS_STORAGE &= nbsp; =20 0x08
#define=20 USB_DEVICE_CLASS_HUB = ; =20 0x09
#define USB_DEVICE_CLASS_VENDOR_SPECIFIC =20 0xFF
/******************************************************* **=20 USB=20 =CC=D8=D0=D4=D1=A1=D4=F1=B7=FB
*********************************= ***********************/
#define=20 USB_ENDPOINT_STALL &= nbsp; =20 0x0000
#define=20 USB_DEVICE_REMOTE_WAKEUP &= nbsp; =20 0x0001
/*******************************************************<= BR> **=20 USB =B6=CB=B5=E3=C3=E8=CA=F6=B7=FB=BD=E1=B9=B9=CC=E5:=20 =B6=CB=B5=E3=CA=F4=D0=D4
***************************************= *****************/
#define=20 USB_ENDPOINT_TYPE_CONTROL = =20 0x00
#define=20 USB_ENDPOINT_TYPE_ISOCHRONOUS &n= bsp; =20 0x01
#define=20 USB_ENDPOINT_TYPE_BULK &nb= sp; =20 0x02
#define=20 USB_ENDPOINT_TYPE_INTERRUPT &nbs= p; =20 0x03
/****************************************************************= ******/
#define=20 USB_ENDPOINT1_IN &nb= sp; =20 0x81
#define=20 USB_ENDPOINT2_IN &nb= sp; =20 0x82
#define=20 USB_ENDPOINT1_OUT &n= bsp;=20 0x01
#define=20 USB_ENDPOINT2_OUT &n= bsp;=20 0x02
typedef struct _USB_REQUEST {
INT8U=20 bmRequestType;
INT8U = bRequest;
=20 INT16U wValue;
INT16U = wIndex;
INT16U=20 wLength;
} USB_REQUEST;
static USB_REQUEST _REQUEST;
#define = REQUEST=20 _REQUEST
#define REQUEST_REQTYPE _REQUEST.bmRequestType
#define=20 REQUEST_REQ _REQUEST.bRequest
#define REQUEST_VAL = _REQUEST.wValue
#define=20 REQUEST_IND _REQUEST.wIndex
#define REQUEST_LEN = _REQUEST.wLength
/*********** USB =20 =C9=E8=B1=B8=C3=E8=CA=F6=B7=FB=B5=C4=CA=B5=C0=FD = ****************/
static USB_DEVICE_DESCRIPTOR=20 Device_Descriptor=3D
{
=20 0x12,//bLength;
=20 0x01,//bDescriptorType;
=20 0x10,//bcdUSB0;
= 0x01,//bcdUSB1;
=20 0x00,//bDeviceClass;
=20 0x00,//bDeviceSubClass;
=20 0x00,//bDeviceProtocol;
=20 0x08,//bMaxPacketSize0;
=20 0x81,//idVendor0;
= 0x07,//idVendor1;
=20 0x13,//idProduct0;
=20 0x71,//idProduct1;
=20 0x05,//bcdDevice0;
=20 0x0a,//bcdDevice1;
=20 0x02,//iManufacturer;
=20 0x00,//iProduct;
=20 0x04,//iSerialNumber;
0x01=20 //bNumConfigurations;
};
/*********** USB = =C5=E4=D6=C3=C3=E8=CA=F6=B7=FB=B5=C4=CA=B5=C0=FD =20 ****************/
static USB_CONFIGURATION_DESCRIPTOR=20 Configuration_Descriptor=3D
{
=20 0x09,//bLength;
=20 0x02,//bDescriptorType;
=20 0x27,//wTotalLength0;
=20 0x00,//wTotalLength1;
=20 0x01,//bNumInterfaces;
=20 0x01,//bConfigurationValue;
=20 0x00,//iConfiguration;
=20 0x80,//bmAttributes//=D7=DC=CF=DF=B9=A9=B5=E7,=B2=BB=D6=A7=B3=D6=D4=B6=B3= =CC=BB=BD=D0=D1
0xfa=20 //MaxPower;250*2=3D500mA
};
/*********** USB = =BD=D3=BF=DA=C3=E8=CA=F6=B7=FB=B5=C4=CA=B5=C0=FD =20 ****************/
static USB_INTERFACE_DESCRIPTOR=20 Interface_Descriptor=3D
{
=20 0x09,//bLength;
=20 0x04,//bDescriptorType;
=20 0x00,//bInterfaceNumber;
=20 0x00,//bAlternateSetting;
=20 0x02,//bNumEndpoints;
=20 0xff,//bInterfaceClass;
=20 0xff,//bInterfaceSubClass;
=20 0x00,//bInterfaceProtocol;
0x00=20 //iInterface;
};
/*********** USB = =B6=CB=B5=E3=C3=E8=CA=F6=B7=FB=B5=C4=CA=B5=C0=FD =20 ****************/
static USB_ENDPOINT_DESCRIPTOR=20 Endpoint_Descriptor[4]=3D
{
/* = =B6=CB=B5=E31=CA=E4=C8=EB=C3=E8=CA=F6=B7=FB=20 */
{
=20 0x07,//bLength;
=20 0x05,//bDescriptorType;
=20 USB_ENDPOINT1_IN,//bEndpointAddress;
=20 USB_ENDPOINT_TYPE_INTERRUPT,//bmAttributes;
=20 0x08,//wMaxPacketSize0;
=20 0x00,//wMaxPacketSize1;
0x10=20 //bInterval;
},
/* = =B6=CB=B5=E31=CA=E4=B3=F6=C3=E8=CA=F6=B7=FB=20 */
{
=20 0x07,//bLength;
=20 0x05,//bDescriptorType;
=20 USB_ENDPOINT1_OUT,//bEndpointAddress;
=20 USB_ENDPOINT_TYPE_INTERRUPT,//bmAttributes;
=20 0x08,//wMaxPacketSize0;
=20 0x00,//wMaxPacketSize1;
0x10=20 //bInterval;
},
/* = =B6=CB=B5=E32=CA=E4=C8=EB=C3=E8=CA=F6=B7=FB=20 */
{
=20 0x07,//bLength;
=20 0x05,//bDescriptorType;
=20 USB_ENDPOINT1_IN,//bEndpointAddress;
=20 USB_ENDPOINT_TYPE_BULK,//bmAttributes;
=20 0x08,//wMaxPacketSize0;
=20 0x00,//wMaxPacketSize1;
0x00=20 //bInterval;
},
/* = =B6=CB=B5=E32=CA=E4=B3=F6=C3=E8=CA=F6=B7=FB=20 */
{
=20 0x07,//bLength;
=20 0x05,//bDescriptorType;
=20 USB_ENDPOINT1_IN,//bEndpointAddress;
=20 USB_ENDPOINT_TYPE_BULK,//bmAttributes;
=20 0x08,//wMaxPacketSize0;
=20 0x00,//wMaxPacketSize1;
0x00=20 //bInterval;
}
};
/*********** USB=20 =D7=D6=B7=FB=B4=AE=C3=E8=CA=F6=B7=FB=B5=C4=CA=B5=C0=FD = ****************/
static USB_STRING_DESCRIPTOR=20 String_Descriptor=3D
{
=20 0x05,//bLength;
=20 0x03,//bDescriptorType;
"OK"=20 //bString[3];
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -