📄 chap9.c
字号:
#include <macros.h>
#include <stdio.h>
#include <string.h>
#include "D12CI.H"
#include "MAIN.H"
#include "USB100.H"
#include "CHAP9.H"
extern void single_transmit(unsigned char *buf,unsigned char len);
extern void code_transmit(const unsigned char * pRomData,unsigned short len);
extern void stall_ep0(void);
extern void init_unconfig(void);
extern void init_config(void);
#define NUM_ENDPOINTS 4
#define CONFIG_DESCRIPTOR_LENGTH sizeof(USB_CONFIGURATION_DESCRIPTOR)\
+sizeof(USB_INTERFACE_DESCRIPTOR)\
+(NUM_ENDPOINTS*sizeof(USB_ENDPOINT_DESCRIPTOR))
extern CONTROL_XFER ControlData;
extern IO_REQUEST ioRequest;
extern EPPFLAGS bEPPflags;
const USB_DEVICE_DESCRIPTOR DeviceDescr=
{
sizeof(USB_DEVICE_DESCRIPTOR),
USB_DEVICE_DESCRIPTOR_TYPE,
0x0001,//SWAP(0x0100),
0,//USB_CLASS_CODE_TEST_CLASS_DEVICE,
0,
0,
EP0_PACKET_SIZE,
0x8405,//SWAP(0x0471),
0x0100,//SWAP(0x0666),
0x0001,//SWAP(0x0100),
0,
0,
0,
0x01
};
const USB_CONFIGURATION_DESCRIPTOR ConfigDescr=
{
sizeof(USB_CONFIGURATION_DESCRIPTOR),
USB_CONFIGURATION_DESCRIPTOR_TYPE,
CONFIG_DESCRIPTOR_LENGTH,//SWAP(CONFIG_DESCRIPTOR_LENGTH),
1,
1,
0,
0x80,
0xfa
};
const USB_INTERFACE_DESCRIPTOR InterfaceDescr=
{
sizeof(USB_INTERFACE_DESCRIPTOR),
USB_INTERFACE_DESCRIPTOR_TYPE,
0,
0,
NUM_ENDPOINTS,
USB_DEVICE_CLASS_STORAGE,
0x06,//SCSI
0x50,//bulk only Transport
0
};
const USB_ENDPOINT_DESCRIPTOR EP1_TXDescr=
{
sizeof(USB_ENDPOINT_DESCRIPTOR),
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x81,
USB_ENDPOINT_TYPE_INTERRUPT,
EP1_PACKET_SIZE,//SWAP(EP1_PACKET_SIZE),
10
};
const USB_ENDPOINT_DESCRIPTOR EP1_RXDescr=
{
sizeof(USB_ENDPOINT_DESCRIPTOR),
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x1,
USB_ENDPOINT_TYPE_INTERRUPT,
EP1_PACKET_SIZE,//SWAP(EP1_PACKET_SIZE),
10
};
const USB_ENDPOINT_DESCRIPTOR EP2_TXDescr=
{
sizeof(USB_ENDPOINT_DESCRIPTOR),
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x82,
USB_ENDPOINT_TYPE_BULK,
EP2_PACKET_SIZE,//SWAP(EP2_PACKET_SIZE),
10
};
const USB_ENDPOINT_DESCRIPTOR EP2_RXDescr=
{
sizeof(USB_ENDPOINT_DESCRIPTOR),
USB_ENDPOINT_DESCRIPTOR_TYPE,
0x2,
USB_ENDPOINT_TYPE_BULK,
EP2_PACKET_SIZE,//SWAP(EP2_PACKET_SIZE),
10
};
//USB Protocol layer
void reserved(void)
{
stall_ep0();
}
//USB standard device requests
void get_status(void)
{
unsigned char endp,txdat[2];
unsigned char bRecipient=ControlData.DeviceRequest.bmRequestType&USB_RECIPIENT;
unsigned char c;
if(bRecipient==USB_RECIPIENT_DEVICE)
{
if(bEPPflags.bits.remote_wakeup==1)
txdat[0]=3;
else
txdat[0]=1;
txdat[1]=0;
single_transmit(txdat,2);
}
else if(bRecipient==USB_RECIPIENT_INTERFACE)
{
txdat[0]=0;
txdat[1]=0;
single_transmit(txdat,2);
}
else if(bRecipient==USB_RECIPIENT_ENDPOINT)
{
endp=(unsigned char)(ControlData.DeviceRequest.wIndex&MAX_ENDPOINTS);
if(ControlData.DeviceRequest.wIndex&(unsigned char)USB_ENDPOINT_DIRECTION_MASK)
c=D12_SelectEndpoint(endp*2+1);
else
c=D12_SelectEndpoint(endp*2);
if(c&D12_STALL)
txdat[0]=1;
else
txdat[0]=0;
txdat[1]=0;
single_transmit(txdat,2);
}
else stall_ep0();
}
void clear_feature(void)
{
unsigned char endp;
unsigned char bRecipient=ControlData.DeviceRequest.bmRequestType&USB_RECIPIENT;
if(bRecipient==USB_RECIPIENT_DEVICE
&&ControlData.DeviceRequest.wValue==USB_FEATURE_REMOTE_WAKEUP)
{
DISABLE;
bEPPflags.bits.remote_wakeup=0;
ENABLE;
single_transmit(0,0);
}
else if(bRecipient==USB_RECIPIENT_ENDPOINT
&&ControlData.DeviceRequest.wValue==USB_FEATURE_ENDPOINT_STALL)
{
endp=(unsigned char)(ControlData.DeviceRequest.wIndex&MAX_ENDPOINTS);
if(ControlData.DeviceRequest.wIndex&(unsigned char)USB_ENDPOINT_DIRECTION_MASK)
D12_SetEndpointStatus(endp*2+1,0);
else
D12_SetEndpointStatus(endp*2,0);
single_transmit(0,0);
}
else stall_ep0();
}
void set_feature(void)
{
unsigned char endp;
unsigned char bRecipient=ControlData.DeviceRequest.bmRequestType&USB_RECIPIENT;
if(bRecipient==USB_RECIPIENT_DEVICE
&&ControlData.DeviceRequest.wValue==USB_FEATURE_REMOTE_WAKEUP)
{
DISABLE;
bEPPflags.bits.remote_wakeup=1;
ENABLE;
single_transmit(0,0);
}
else if(bRecipient==USB_RECIPIENT_ENDPOINT
&&ControlData.DeviceRequest.wValue==USB_FEATURE_ENDPOINT_STALL)
{
endp=(unsigned char)(ControlData.DeviceRequest.wIndex&MAX_ENDPOINTS);
if(ControlData.DeviceRequest.wIndex&(unsigned char)USB_ENDPOINT_DIRECTION_MASK)
D12_SetEndpointStatus(endp*2+1,1);
else
D12_SetEndpointStatus(endp*2,1);
single_transmit(0,0);
}
else stall_ep0();
}
void set_address(void)
{
D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue&DEVICE_ADDRESS_MASK),1);
single_transmit(0,0);
}
void get_descriptor(void)
{
unsigned char bDescriptor=MSB(ControlData.DeviceRequest.wValue);
if(bDescriptor==USB_DEVICE_DESCRIPTOR_TYPE)
{
code_transmit((unsigned char*)&DeviceDescr,sizeof(USB_DEVICE_DESCRIPTOR));
}
else if(bDescriptor==USB_CONFIGURATION_DESCRIPTOR_TYPE)
{
code_transmit((unsigned char *)&ConfigDescr,CONFIG_DESCRIPTOR_LENGTH);
}
else stall_ep0();
}
void get_configuration(void)
{
unsigned char c=bEPPflags.bits.configuration;
single_transmit(&c,1);
}
void set_configuration(void)
{
if(ControlData.DeviceRequest.wValue==0)
{
single_transmit(0,0);
DISABLE;
bEPPflags.bits.configuration=0;
ENABLE;
init_unconfig();
}
else if(ControlData.DeviceRequest.wValue==1)
{
single_transmit(0,0);
init_unconfig();
init_config();
DISABLE;
bEPPflags.bits.configuration=1;
ENABLE;
}
else stall_ep0();
}
void get_interface(void)
{
unsigned char txdat=0;
single_transmit(&txdat,1);
}
void set_interface(void)
{
if(ControlData.DeviceRequest.wValue==0&&ControlData.DeviceRequest.wIndex==0)
single_transmit(0,0);
else stall_ep0();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -