📄 chap9.c
字号:
#include <iom16v.h>
#include <macros.h>
#include "define.h"
#include "initial.h"
#include "pdiusbd12.h"
#include "endpointfun.h"
#include "descriptor.h"
#include "chap9.h"
void (*StandardDeviceRequest[])(void) =
{
get_status,
clear_feature,
reserved,
set_feature,
reserved,
set_address,
get_descriptor,
reserved,
get_configuration,
set_configuration,
get_interface,
set_interface,
reserved,
reserved,
reserved,
reserved
};
void stall_ep0(void)
{
D12_SetEndpointStatus(0, 1);
D12_SetEndpointStatus(1, 1);
}
//*************
void reserved(void)
{
stall_ep0();
}
//*****************
void init_unconfig(void)
{
D12_SetEndpointEnable(0);
}
//************************
void init_config(void)
{
D12_SetEndpointEnable(1);
}
//*************************
void single_transmit(uchar * buf, uchar len)
{
if( len <= 16)
{
D12_WriteEndpoint(1, len, buf);
}
}
//****************
void code_transmit(const uchar *pRomData, uint len)
{
ControlData.wCount = 0;
if(ControlData.wLength > len)
ControlData.wLength = len;
ControlData.pData = pRomData;
if( ControlData.wLength >= 16) {
const_WriteEndpoint(1, 16, ControlData.pData);
ControlData.wCount += 16;
DISABLE; //EA=0;
bEPPflags.bits.control_state = USB_TRANSMIT;
ENABLE; //EA=1;
}
else {
const_WriteEndpoint(1, ControlData.wLength, pRomData);
ControlData.wCount += ControlData.wLength;
DISABLE; //EA=0;
bEPPflags.bits.control_state = USB_IDLE;
ENABLE; //EA=1;
}
}
void get_status(void)
{
uchar endp, txdat[2], c;
uchar bRecipient = ControlData.DeviceRequest.bmRequestType & 0x1F;
if(bRecipient ==0x00)
{
if(bEPPflags.bits.remote_wakeup == 1)
txdat[0] = 3;
else
txdat[0] = 1;
txdat[1]=0;
single_transmit(txdat, 2);
}
else if(bRecipient ==0x01)
{
txdat[0]=0;
txdat[1]=0;
single_transmit(txdat, 2);
}
else if(bRecipient ==0x02)
{
endp = (uchar)(ControlData.DeviceRequest.wIndex & 0x03);
if(ControlData.DeviceRequest.wIndex & 0x80)
c = D12_SelectEndpoint(endp*2 + 1);
else
c = D12_SelectEndpoint(endp*2);
if(c & 0x02)
txdat[0] = 1;
else
txdat[0] = 0;
txdat[1] = 0;
single_transmit(txdat, 2);
}
else
stall_ep0();
}
void clear_feature(void)
{
uchar endp;
uchar bRecipient = ControlData.DeviceRequest.bmRequestType & 0x1F ;
if(bRecipient ==0x00 && ControlData.DeviceRequest.wValue == 0x0001)
{
DISABLE; //EA=0;
bEPPflags.bits.remote_wakeup = 0;
ENABLE; //EA=1;
single_transmit(0, 0);
}
else if(bRecipient == 0x02 && ControlData.DeviceRequest.wValue == 0x0000)
{
endp = (uchar)(ControlData.DeviceRequest.wIndex & 0x03);
if(ControlData.DeviceRequest.wIndex & 0x80)
D12_SetEndpointStatus(endp*2 + 1, 0);
else
D12_SetEndpointStatus(endp*2, 0);
single_transmit(0, 0);
}
else
stall_ep0();
}
*
void set_feature(void)
{
uchar endp;
uchar bRecipient = ControlData.DeviceRequest.bmRequestType & 0x1F;
if(bRecipient ==0x00 && ControlData.DeviceRequest.wValue == 0x0001)
{
DISABLE; //EA=0;
bEPPflags.bits.remote_wakeup = 1;
ENABLE ; //EA=1;
single_transmit(0, 0);
}
else if(bRecipient ==0x02 && ControlData.DeviceRequest.wValue == 0x0000)
{
endp = (uchar)(ControlData.DeviceRequest.wIndex & 0x03);
if (ControlData.DeviceRequest.wIndex & 0x80)
D12_SetEndpointStatus(endp*2 + 1, 1);
else
D12_SetEndpointStatus(endp*2, 1);
single_transmit(0, 0);
}
else
stall_ep0();
}
void set_address(void)
{
D12_SetAddress((uchar)(ControlData.DeviceRequest.wValue & 0x7F), 1);
single_transmit(0, 0);
}
void get_descriptor(void)
{
uchar bDescriptor = MSB(ControlData.DeviceRequest.wValue);
if (bDescriptor == 0x01)
{
code_transmit((const uchar *) & DeviceDescr, 0x12);
}
else if (bDescriptor == 0x02)
{
if (ControlData.DeviceRequest.wLength > 0x2E)
{
ControlData.DeviceRequest.wLength = 0x2E;
}
code_transmit((const uchar *) & (usb_descr.ConfigDescr), ControlData.DeviceRequest.wLength);
}
else
stall_ep0();
}
void get_configuration(void)
{
uchar c = bEPPflags.bits.configuration;
single_transmit( &c, 1);
}
void set_configuration(void)
{
if (ControlData.DeviceRequest.wValue == 0)
{
single_transmit(0, 0);
DISABLE ; //EA=0;
bEPPflags.bits.configuration = 0;
ENABLE ; //EA=1;
init_unconfig();
}
else if(ControlData.DeviceRequest.wValue == 1)
{
single_transmit(0, 0);
init_unconfig();
init_config();
DISABLE ; //EA=0;
bEPPflags.bits.configuration = 1;
ENABLE ; //EA=1;
}
else
stall_ep0();
}
void control_handler(void)
{
uchar type, req;
type = ControlData.DeviceRequest.bmRequestType & 0x60;
req = ControlData.DeviceRequest.bRequest & 0x0F;
if (type == 0)
(*StandardDeviceRequest[req])();
else
stall_ep0();
}
void get_interface(void)
{
uchar 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 + -