📄 usbchap9.c
字号:
txdat[0] = 0; // 端点有效
txdat[1] = 0;
UsbSingleTransmit(txdat, 2); // 发送数据
printf("\r\nGetStatus Endpoint");
}
else
UsbStallEp0(); // 非标准请求,发送STALL
}
/********************************************************************************************************
*类型:0000-0000,0001,0010 *
*请求:清除特性 *
*值 :特性选择符 *
*索引:设备,接口,端点 *
*长度:0 *
*数据:无 *
********************************************************************************************************/
void UsbClassRequestClearFeature(void)
{
unsigned char endp;
// 读取请求类型中的接收方
unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT_MASK;
printf("\r\nClear Request");
if (bRecipient == USB_RECIPIENT_DEVICE && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
{ // 清除远程唤醒功能
if(bUSBFlags.bits.bIn_ISR == 0) USB_DISABLE_INTERRUPT;
bUSBFlags.bits.bRemote_Wakeup = 0;
if(bUSBFlags.bits.bIn_ISR == 0) USB_ENABLE_INTERRUPT;
UsbSingleTransmit(0, 0); // 恢复应答
}
else if (bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)
{ // 清除端点禁止特性,恢复其使用
endp = (unsigned char)(ControlData.DeviceRequest.wIndex & USB_ENDPOINT_NUMBER_MASK);
if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
UsbSetEndpointStatus(endp*2 + 1, 0); // 清除输入端点STALL特性
else
UsbSetEndpointStatus(endp*2, 0); // 清除输出端点STALL特性
UsbSingleTransmit(0, 0); // 发送应答
}
else
UsbStallEp0(); // 没有该请求,返回STALL
}
/********************************************************************************************************
*类型:1000-0000,0001,0010 *
*请求:设置特性 *
*值 :特性选择符 *
*索引:设备,接口,端点 *
*长度:0 *
*数据:无 *
********************************************************************************************************/
void UsbClassRequestSetFeature(void)
{
unsigned char endp;
// 读取请求类型中的接收方
unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT_MASK;
printf("\r\nSet Feature");
if (bRecipient == USB_RECIPIENT_DEVICE && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
{ // 设置远程唤醒特性
if(bUSBFlags.bits.bIn_ISR == 0) USB_DISABLE_INTERRUPT;
bUSBFlags.bits.bRemote_Wakeup = 1;
if(bUSBFlags.bits.bIn_ISR == 0) USB_ENABLE_INTERRUPT;
UsbSingleTransmit(0, 0); // 发送应答
}
else if (bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)
{ // 设置端点禁止特性
endp = (unsigned char)(ControlData.DeviceRequest.wIndex & USB_ENDPOINT_NUMBER_MASK);
if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
UsbSetEndpointStatus(endp*2 + 1, 1); // 设置输入端点禁止
else
UsbSetEndpointStatus(endp*2, 1); // 设置输出端点禁止
UsbSingleTransmit(0, 0); // 发送应答
}
else
UsbStallEp0(); // 没有该请求,返回STALL
}
/********************************************************************************************************
*类型:0000-0000 *
*请求:设置地址 *
*值 :设备地址 *
*索引:0 *
*长度:0 *
*数据:无 *
********************************************************************************************************/
void UsbClassRequestSetAddress(void)
{
printf("\r\nSet Address");
UsbSetAddressEnable((unsigned char)(ControlData.DeviceRequest.wValue & USB_DEVICE_ADDRESS_MASK), 1);
UsbSingleTransmit(0, 0); // 发送应答
}
/********************************************************************************************************
*类型:1000-0000 *
*请求:获取描述符 *
*值 :描述符的类型和索引 *
*索引:0或语言ID *
*长度:描述符长度 *
*数据:描述符 *
********************************************************************************************************/
void UsbClassRequestGetDescriptor(void)
{ // 获取请求的描述符的类型
unsigned char bDescriptor = MSB(ControlData.DeviceRequest.wValue);
if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE)
{ // 获取设备描述符
printf("\r\nGet Descriptor--Device");
UsbCodeTransmit((unsigned char *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
}
else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE)
{ // 获取配置描述符+接口描述符+端点描述符
printf("\r\nGet Descriptor--Configuration");
UsbCodeTransmit((unsigned char *)&TotalDescriptor, CONFIG_DESCRIPTOR_LENGTH);
}
else
UsbStallEp0(); // 没有该请求,返回STALL
}
/********************************************************************************************************
*类型:1000-0000 *
*请求:获取配置 *
*值 :0 *
*索引:0 *
*长度:1 *
*数据:配置值 *
********************************************************************************************************/
void UsbClassRequestGetConfiguration(void)
{
unsigned char c = bUSBFlags.bits.bConfiguration;
printf("\r\nGet Configuration");
UsbSingleTransmit(&c, 1); // 返回配置值
}
/********************************************************************************************************
*类型:0000-0000 *
*请求:设置配置 *
*值 :配置值 *
*索引:0 *
*长度:0 *
*数据:无 *
********************************************************************************************************/
void UsbClassRequestSetConfiguration(void)
{
printf("\r\nSet Configuration");
if (ControlData.DeviceRequest.wValue == 0)
{ // 配置值不对,设备进入未配置状态
UsbSingleTransmit(0, 0); // 发送应答
if(bUSBFlags.bits.bIn_ISR == 0) USB_DISABLE_INTERRUPT;
bUSBFlags.bits.bConfiguration = 0; // 标记未配置
if(bUSBFlags.bits.bIn_ISR == 0) USB_ENABLE_INTERRUPT;
UsbInitUnconfig(); // 进入地址状态,禁止0除外的所有端点
}
else if (ControlData.DeviceRequest.wValue == 1)
{ // 配置设备
UsbSingleTransmit(0, 0); // 发送应答
UsbInitUnconfig(); // 进入地址状态,禁止0除外的所有端点
UsbInitConfig(); // 配置处理,允许端点收发
if(bUSBFlags.bits.bIn_ISR == 0) USB_DISABLE_INTERRUPT;
bUSBFlags.bits.bConfiguration = 1; // 标记已配置
if(bUSBFlags.bits.bIn_ISR == 0) USB_ENABLE_INTERRUPT;
}
else
UsbStallEp0(); // 没有该请求,返回STALL
}
/********************************************************************************************************
*类型:1000-0000 *
*请求:获取接口信息 *
*值 :0 *
*索引:接口 *
*长度:1 *
*数据:可选的接口 *
********************************************************************************************************/
void UsbClassRequestGetInterface(void)
{
unsigned char txdat = 0; // 本设备只有一个接口
printf("\r\nGet Interface");
UsbSingleTransmit(&txdat, 1);
}
/********************************************************************************************************
*类型:0000-0000 *
*请求:设置接口 *
*值 :可选设置 *
*索引:接口 *
*长度:0 *
*数据:无 *
********************************************************************************************************/
void UsbClassRequestSetInterface(void)
{
printf("\r\nSet Interface");
if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
UsbSingleTransmit(0, 0); // 发送应答
else
UsbStallEp0(); // 没有该请求,返回STALL
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -