📄 chap_9._c
字号:
if(ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
/*Get Endpoint Index*/
{
/*Clear TX stall for IN on EPn*/
D12_SetEndpointStatus(endp*2+1,0);
}
else
{
/*Clear RX stall for OUT on EPn.*/
D12_SetEndpointStatus(endp*2,0);
}
/*Transmit ACK*/
single_transmit(0,0);
}
/*No Request,Return STALL*/
else
{
stall_ep0();
}
}
/*********************************************************************
Function: set_feature
Description: the Function is opposite of clear_feature()
Calls: CLI(); SEI(); D12_SetEndpointStatus(); single_transmit(); stall_ep0();
Called By: StandardDeviceRequest();
Input: void
Output:
Return: void
Others:
*********************************************************************/
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)
{
CLI(); //DisableInterrupts;
bEPPflags.bits.remote_wakeup=1; //Set Remote Wakeup
SEI(); //EnableInterrupts;
single_transmit(0,0); //Transmit Acknowledge
}
else if (bRecipient == USB_RECIPIENT_ENDPOINT
&& ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)
{
endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS); //Return Endpoint
if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
{
/*Set TX stall for IN on EPn*/
D12_SetEndpointStatus(endp * 2 + 1, 1);
}
else
{
/*Set RX stall for OUT on EPn*/
D12_SetEndpointStatus(endp * 2, 1);
}
/*Transmit ACK*/
single_transmit(0, 0);
}
else
{
/*No Request,Return STALL*/
stall_ep0();
}
}
/*********************************************************************
Function: set_address
Description: set_address
Calls: D12_SetAddressEnable(); single_transmit();
Called By: StandardDeviceRequest();
Input: void
Output:
Return: void
Others:
*********************************************************************/
void set_address(void)
{
D12_SetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue &
DEVICE_ADDRESS_MASK), 1);
/*Transmit Acknowledge*/
single_transmit(0,0);
}
/*********************************************************************
Function: get_descriptor
Description: get_descriptor
Calls: code_transmit(); stall_ep0();
Called By: StandardDeviceRequest();
Input: void
Output:
Return: void
Others:
*********************************************************************/
void get_descriptor(void)
{
unsigned char bDescriptor,i;
unsigned char temp;
const unsigned char *pt;
bDescriptor = (ControlData.DeviceRequest.wValue >> 8) & 0xFF;
if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE) /*Get Device Descriptor*/
{
pt = (const unsigned char *) &DeviceDescr;
temp = ControlData.DeviceRequest.wLength;
for (i = 0; i < temp; i++)
{
DescrData[i] = *(pt + i);
}
code_transmit(DescrData, sizeof (DeviceDescr));
}
/*Get Configuration Descriptor*/
else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE)
{
if (ControlData.DeviceRequest.wLength > CONFIG_DESCRIPTOR_LENGTH)
{
ControlData.DeviceRequest.wLength = CONFIG_DESCRIPTOR_LENGTH;
}
/*Get Config Descriptor=Config Descriptor+Interface Descriptor+Endp Descriptor*/
pt = (const unsigned char *) &ConfigDescr;
temp = ControlData.DeviceRequest.wLength;
for(i = 0; i < temp; i++)
{
DescrData[i] = *(pt + i);
}
code_transmit(DescrData, ControlData.DeviceRequest.wLength);
}
else
{
stall_ep0();
}
}
/*********************************************************************
Function: set_configuration
Description: set_configuration
Calls: CLI(); SEI(); init_unconfig(); init_config(); stall_ep0();
Called By: StandardDeviceRequest();
Input: void
Output:
Return: void
Others:
*********************************************************************/
void set_configuration(void)
{
if (ControlData.DeviceRequest.wValue == 0)
{
single_transmit(0, 0);
CLI();
bEPPflags.bits.configuration = 0;
SEI();
/*Enter Address Status ,Stall all endp exclude ep0*/
init_unconfig();
}
else if(ControlData.DeviceRequest.wValue == 1)
{
/*Transmit ACK*/
single_transmit(0, 0);
init_unconfig();
/*Config Process ,Enable Endp Transmit and Receive*/
init_config();
CLI();
bEPPflags.bits.configuration = 1;
SEI();
}
else
{
stall_ep0();
}
}
/*********************************************************************
Function: get_configuration
Description: Get Information of Config,Return 1 if configuration or Return 0
Calls: single_transmit();
Called By: StandardDeviceRequest();
Input: void
Output:
Return: void
Others:
*********************************************************************/
void get_configuration(void)
{
unsigned char c = bEPPflags.bits.configuration;
/*Return Configuration Value*/
single_transmit(&c, 1);
}
/*********************************************************************
Function: get_interface
Description: Get Interface Status
Calls: single_transmit();
Called By: StandardDeviceRequest();
Input: void
Output:
Return: void
Others:
*********************************************************************/
/*Get Interface Status*/
void get_interface(void)
{
/*Only Current Interface = 0*/
unsigned char txdat = 0;
single_transmit(&txdat, 1);
}
/*********************************************************************
Function: set_interface
Description: set interface
Calls: single_transmit(); stall_ep0();
Called By: StandardDeviceRequest();
Input: void
Output:
Return: void
Others:
*********************************************************************/
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 + -