📄 usbcore.c
字号:
case USB_ENDPOINT_DESCRIPTOR_TYPE:
if (alt == 0) {
n = ((USB_ENDPOINT_DESCRIPTOR *)pD)->bEndpointAddress & 0x8F;
m = (n & 0x80) ? ((1 << 16) << (n & 0x0F)) : (1 << n);
USB_EndPointMask |= m;
USB_ConfigEP((USB_ENDPOINT_DESCRIPTOR *)pD);
USB_EnableEP(n);
USB_ResetEP(n);
}
break;
}
(BYTE *)pD += pD->bLength;
}
}
else {
USB_Configuration = 0;
for (n = 1; n < 16; n++) {
if (USB_EndPointMask & (1 << n)) {
USB_DisableEP(n);
}
if (USB_EndPointMask & ((1 << 16) << n)) {
USB_DisableEP(n | 0x80);
}
}
USB_EndPointMask = 0x00010001;
USB_EndPointHalt = 0x00000000;
USB_Configure(FALSE);
}
if (USB_Configuration == SetupPacket.wValue.WB.L) {
return (TRUE);
} else {
return (FALSE);
}
}
/*
* Set Interface USB Request
* Parameters: None (global SetupPacket)
* Return Value: TRUE - Success, FALSE - Error
*/
__inline BOOL USB_SetInterface (void) //激活设备的某个接口
{
USB_COMMON_DESCRIPTOR *pD;
DWORD ifn, alt, old, msk, n, m;
BOOL set;
if (USB_Configuration == 0) return (FALSE);
set = FALSE;
pD = (USB_COMMON_DESCRIPTOR *)USB_ConfigDescriptor;
while (pD->bLength)
{
switch (pD->bDescriptorType)
{
case USB_CONFIGURATION_DESCRIPTOR_TYPE: //配置层
if (((USB_CONFIGURATION_DESCRIPTOR *)pD)->bConfigurationValue != USB_Configuration)
//当前配置值与预定配置值不相同
{
(BYTE *)pD += ((USB_CONFIGURATION_DESCRIPTOR *)pD)->wTotalLength;
continue;
}
break;
case USB_INTERFACE_DESCRIPTOR_TYPE:
ifn = ((USB_INTERFACE_DESCRIPTOR *)pD)->bInterfaceNumber; //接口号
alt = ((USB_INTERFACE_DESCRIPTOR *)pD)->bAlternateSetting; //设置索引值
msk = 0;
if ((ifn == SetupPacket.wIndex.WB.L) && (alt == SetupPacket.wValue.WB.L)) //判断是否是同一个
{
set = TRUE;
old = USB_AltSetting[ifn]; //以前的配置索引值
USB_AltSetting[ifn] = (BYTE)alt; //当前索引值
}
break;
case USB_ENDPOINT_DESCRIPTOR_TYPE: //端点层
if (ifn == SetupPacket.wIndex.WB.L) //正确的接口
{
n = ((USB_ENDPOINT_DESCRIPTOR *)pD)->bEndpointAddress & 0x8F;
m = (n & 0x80) ? ((1 << 16) << (n & 0x0F)) : (1 << n);
if (alt == SetupPacket.wValue.WB.L) //正确的配置
{
USB_EndPointMask |= m;
USB_EndPointHalt &= ~m;
USB_ConfigEP((USB_ENDPOINT_DESCRIPTOR *)pD); //配置端点 (只是配置最大包长度)
USB_EnableEP(n);
USB_ResetEP(n);
msk |= m;
}
else if ((alt == old) && ((msk & m) == 0))
{
USB_EndPointMask &= ~m;
USB_EndPointHalt &= ~m;
USB_DisableEP(n);
}
}
break;
}
(BYTE *)pD += pD->bLength;
}
return (set);
}
/*
* USB Endpoint 0 Event Callback
* Parameter: event
*/
void USB_EndPoint0 (DWORD event) //端点0命令和数据处理
{
switch (event) {
case USB_EVT_SETUP:
USB_SetupStage();
USB_DirCtrlEP(SetupPacket.bmRequestType.BM.Dir);
EP0Data.Count = SetupPacket.wLength;
switch (SetupPacket.bmRequestType.BM.Type)
{
case REQUEST_STANDARD: //是否为标准命令
switch (SetupPacket.bRequest)
{
case USB_REQUEST_GET_STATUS:
if (!USB_GetStatus())
{
goto stall_i;
}
break;
case USB_REQUEST_CLEAR_FEATURE:
if (!USB_SetClrFeature(0))
{
goto stall_i;
}
USB_StatusInStage();
#if USB_FEATURE_EVENT
USB_Feature_Event();
#endif
break;
case USB_REQUEST_SET_FEATURE:
if (!USB_SetClrFeature(1))
{
goto stall_i;
}
USB_StatusInStage();
#if USB_FEATURE_EVENT
USB_Feature_Event();
#endif
break;
case USB_REQUEST_SET_ADDRESS:
switch (SetupPacket.bmRequestType.BM.Recipient)
{
case REQUEST_TO_DEVICE:
USB_DeviceAddress = 0x80 | SetupPacket.wValue.WB.L;
USB_StatusInStage();
break;
default:
goto stall_i;
}
break;
case USB_REQUEST_GET_DESCRIPTOR:
if (!USB_GetDescriptor())
{
goto stall_i;
}
break;
case USB_REQUEST_SET_DESCRIPTOR: //为设备新增一个描述符或更改一个已经存在的描述符
USB_SetStallEP(0x00);
EP0Data.Count = 0;
break;
case USB_REQUEST_GET_CONFIGURATION: //获得指定设备当前配置的值 表示配置是否已完成
switch (SetupPacket.bmRequestType.BM.Recipient)
{
case REQUEST_TO_DEVICE:
EP0Data.pData = &USB_Configuration;
USB_DataInStage();
break;
default:
goto stall_i;
}
break;
case USB_REQUEST_SET_CONFIGURATION: //激活某一配置
switch (SetupPacket.bmRequestType.BM.Recipient)
{
case REQUEST_TO_DEVICE:
if (!USB_SetConfiguration())
{
goto stall_i;
}
USB_StatusInStage();
#if USB_CONFIGURE_EVENT
USB_Configure_Event();
#endif
break;
default:
goto stall_i;
}
break;
case USB_REQUEST_GET_INTERFACE:
switch (SetupPacket.bmRequestType.BM.Recipient)
{
case REQUEST_TO_INTERFACE:
if ((USB_Configuration != 0) &&
(SetupPacket.wIndex.WB.L < USB_NumInterfaces))
{
EP0Data.pData = USB_AltSetting + SetupPacket.wIndex.WB.L;
USB_DataInStage();
}
else
{
goto stall_i;
}
break;
default:
goto stall_i;
}
break;
case USB_REQUEST_SET_INTERFACE:
switch (SetupPacket.bmRequestType.BM.Recipient)
{
case REQUEST_TO_INTERFACE:
if (!USB_SetInterface())
{
goto stall_i;
}
USB_StatusInStage();
#if USB_INTERFACE_EVENT
USB_Interface_Event();
#endif
break;
default:
goto stall_i;
}
break;
default:
goto stall_i;
}
break;
case REQUEST_CLASS:
#if USB_CLASS
switch (SetupPacket.bmRequestType.BM.Recipient)
{
case REQUEST_TO_INTERFACE:
#if USB_HID
if (SetupPacket.wIndex.WB.L == USB_HID_IF_NUM)
{
switch (SetupPacket.bRequest) //HID命令
{
case HID_REQUEST_GET_REPORT: //主机接受HID设备发送来的报告(必需的)
if (HID_GetReport())
{
EP0Data.pData = EP0Buf;
USB_DataInStage();
goto class_ok;
}
break;
case HID_REQUEST_SET_REPORT: //主机想HID设备发送报告
EP0Data.pData = EP0Buf;
goto class_ok;
case HID_REQUEST_GET_IDLE: //读取HID设备当前空前速率
if (HID_GetIdle())
{
EP0Data.pData = EP0Buf;
USB_DataInStage();
goto class_ok;
}
break;
case HID_REQUEST_SET_IDLE: //设置HID设备的空闲速率
if (HID_SetIdle())
{
USB_StatusInStage();
goto class_ok;
}
break;
case HID_REQUEST_GET_PROTOCOL: //读取HID设备的协议值
if (HID_GetProtocol())
{
EP0Data.pData = EP0Buf;
USB_DataInStage();
goto class_ok;
}
break;
case HID_REQUEST_SET_PROTOCOL: //设置HID设备协议值
if (HID_SetProtocol()) {
USB_StatusInStage();
goto class_ok;
}
break;
}
}
#endif /* USB_HID */
goto stall_i;
default:
goto stall_i;
}
class_ok: break;
#else
goto stall_i;
#endif /* USB_CLASS */
case REQUEST_VENDOR: //厂家定义标准
goto stall_i;
default:
stall_i: USB_SetStallEP(0x80);
EP0Data.Count = 0;
break;
}
break;
case USB_EVT_OUT: //应该是数据的传输
if (SetupPacket.bmRequestType.BM.Dir == 0) //确定传输方向 输出
{
if (EP0Data.Count) //判断有无数据需要传送
{
USB_DataOutStage();
if (EP0Data.Count == 0)
{
switch (SetupPacket.bmRequestType.BM.Type)
{
case REQUEST_STANDARD: //标准命令
goto stall_i;
#if (USB_CLASS)
case REQUEST_CLASS: //类命令
switch (SetupPacket.bmRequestType.BM.Recipient) //判断是往哪一层
{
case REQUEST_TO_INTERFACE:
#if USB_HID
if (SetupPacket.wIndex.WB.L == USB_HID_IF_NUM) // 接口是否为同一个
{
if (!HID_SetReport())
{
goto stall_i;
}
break;
}
#endif
goto stall_i;
case REQUEST_TO_ENDPOINT:
goto stall_i;
default:
goto stall_i;
}
break;
#endif
default:
goto stall_i;
}
USB_StatusInStage();
}
}
} else {
USB_StatusOutStage();
}
break;
case USB_EVT_IN:
if (SetupPacket.bmRequestType.BM.Dir == 1)
{
USB_DataInStage();
}
else
{
if (USB_DeviceAddress & 0x80)
{
USB_DeviceAddress &= 0x7F;
USB_SetAddress(USB_DeviceAddress);
}
}
break;
case USB_EVT_IN_STALL:
USB_ClrStallEP(0x80);
break;
case USB_EVT_OUT_STALL:
USB_ClrStallEP(0x00);
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -