📄 descriptor.c
字号:
}
else
{
stall_ep0(); //没有该请求,返加STALL
return STATUS_ERR;
}
D12_WriteEndpoint(1,0,0); //发送一个空的数据响应表示结束
return STATUS_OK;
}
/*
*************************************************************************************************************
- 函数名称 : USB_Set_Feature(void)
- 函数说明 : 设定或允许一个指定的特性. 函数中使用了外部变量sDeviceRequest
- 输入参数 : sDeviceRequest:设备请求数据包指针
- 输出参数 : 返回一个状态.STATUS_OK表示正常,STATUS_ERR表示异常
*************************************************************************************************************
*/
INT8U USB_Set_Feature(USB_DEVICE_REQUEST *sDeviceRequest)
{
INT8U endp;
INT8U bRecipient=(*sDeviceRequest).bmRequestType&USB_RT_RECIPIENT_MASK; //读取请求类型中的接收方
#if USB_DEBUG
printf(" USB_Set_Feature() ");
#endif
//设备请求
if(bRecipient==USB_RT_RECIPIENT_DEVICE && (*sDeviceRequest).wValue==USB_FEATURE_REMOTE_WAKEUP)
{
usb_remote_wake=1; //清0 远程唤醒标志
}
//对端点请求
else if(bRecipient==USB_RT_RECIPIENT_ENDPOINT && (*sDeviceRequest).wValue==USB_FEATURE_ENDPOINT_STALL)
{
endp=(INT8U)((*sDeviceRequest).wIndex & MAX_ENPOINTS);
if((*sDeviceRequest).wIndex & (INT8U) USB_ENDPOINT_DIRECTION_MASK)
D12_SetEndpointStatus(endp*2+1,1); //清除控制输入端点STALL特性
else
D12_SetEndpointStatus(endp*2,1); //清除控制输出端点STALL特性
}
else
{
stall_ep0(); //没有该请求,返加STALL
return STATUS_ERR;
}
D12_WriteEndpoint(1,0,0); //发送一个空的数据响应表示结束
return STATUS_OK;
}
/*
*************************************************************************************************************
- 函数名称 : USB_Set_Address(void)
- 函数说明 : 给设备设置地址. 函数中使用了外部变量sDeviceRequest
- 输入参数 : sDeviceRequest:设备请求数据包指针
- 输出参数 : 返回一个状态.STATUS_OK表示正常,STATUS_ERR表示异常
*************************************************************************************************************
*/
INT8U USB_Set_Address(USB_DEVICE_REQUEST *sDeviceRequest)
{
#if USB_DEBUG
printf("\nUSB_Set_Address():%x ",((INT8U)((*sDeviceRequest).wValue ) & USB_ENDPOINT_ADDRESS_MASK));
#endif
D12_SetAddressEnable(((INT8U)((*sDeviceRequest).wValue ) & USB_ENDPOINT_ADDRESS_MASK),1);
D12_WriteEndpoint(1,0,0); //发送一个空的数据响应表示结束
return STATUS_OK;
}
/*
*************************************************************************************************************
- 函数名称 : USB_Get_Descriptor(void)
- 函数说明 : 获取USB设备相对应的描述符的一个请求.函数中使用了外部变量sDeviceRequest
- 输入参数 : sDeviceRequest:设备请求数据包指针
- 输出参数 : 返回一个状态.STATUS_OK表示正常,STATUS_ERR表示异常
*************************************************************************************************************
*/
INT8U USB_Get_Descriptor(USB_DEVICE_REQUEST *sDeviceRequest)
{
INT16U bRecipient=(*sDeviceRequest).wValue & USB_DESCRIPTOR_TYPE_MASK; //读取请求描述符类型
INT16U TotalLength;
#if USB_DEBUG
printf("\nUSB_Get_Descriptor() ");
#endif
if(bRecipient==USB_DESCRIPTOR_DEVICE) //获取设备描述符
{
#if USB_DEBUG
printf(":USB_DESCRIPTOR_DEVICE");
#endif
usb_send_ptr=(INT8U *)&DeviceDescr;
usb_send_remain=sizeof(USB_DEVICE_DESCRIPTOR);
}
else if(bRecipient==USB_DESCRIPTOR_CONFIGURATION) //获取配置描述符
{
#if USB_DEBUG
printf(":USB_DESCRIPTOR_CONFIGURATION");
#endif
usb_send_ptr=(INT8U *)&usb_descr;
//构建发送描述符数据的总长度.
TotalLength=(usb_descr.ConfigDescr.wTotalLengthH<<8)+usb_descr.ConfigDescr.wTotalLengthL;
if((*sDeviceRequest).wLength>TotalLength) //要求发送的长度大于描述符的总长度
(*sDeviceRequest).wLength=TotalLength;
usb_send_remain=(*sDeviceRequest).wLength;
}
else
{
#if USB_DEBUG
printf(":OTHERS");
#endif
stall_ep0(); //没有该请求,返加STALL
return STATUS_ERR;
}
Usb_Send_Desc();
return STATUS_OK;
}
/*
*************************************************************************************************************
- 函数名称 : USB_Set_Configuration(void)
- 函数说明 : 用来选择设备的工作配置.函数中使用了外部变量sDeviceRequest
- 输入参数 : sDeviceRequest:设备请求数据包指针
- 输出参数 : 返回一个状态.STATUS_OK表示正常,STATUS_ERR表示异常
*************************************************************************************************************
*/
INT8U USB_Set_Configuration(USB_DEVICE_REQUEST *sDeviceRequest)
{
#if USB_DEBUG
printf(" USB_Set_Configuration() ");
#endif
if((*sDeviceRequest).wValue==0) //配置值不对,设备进入求配置状态
{
D12_WriteEndpoint(1,0,0); //发送一个空的数据响应表示结束
usb_ISconfig=0; //标记未配置
D12_init_Unconfig(); //进入地址状态,禁止0除外的所有端点
}
else if((*sDeviceRequest).wValue==1) //配置设备
{
D12_WriteEndpoint(1,0,0); //发送一个空的数据响应表示结束
D12_init_Unconfig(); //进入地址状态,禁止0除外的所有端点
D12_init_Config(); //配置处理,允许端点收发
usb_ISconfig=1; //设置配置标记
}
else
{
stall_ep0(); //没有该请求,返加STALL
return STATUS_ERR;
}
return STATUS_OK;
}
/*
*************************************************************************************************************
- 函数名称 : USB_Get_Configuration(void)
- 函数说明 : 获取当前的配置信息.
- 输入参数 : sDeviceRequest:设备请求数据包指针
- 输出参数 : 返回一个状态.STATUS_OK表示正常,STATUS_ERR表示异常
*************************************************************************************************************
*/
INT8U USB_Get_Configuration(USB_DEVICE_REQUEST *sDeviceRequest)
{
INT8U c=usb_ISconfig; //取出配置值
#if USB_DEBUG
printf(" USB_Get_Configuration() ");
#endif
D12_WriteEndpoint(1,1,&c); //发送配置值
return STATUS_OK;
}
/*
*************************************************************************************************************
- 函数名称 : USB_Get_Interface(USB_DEVICE_REQUEST *sDeviceRequest)
- 函数说明 : 返回当前的接口号
- 输入参数 : sDeviceRequest:设备请求数据包指针
- 输出参数 : 返回一个状态.STATUS_OK表示正常,STATUS_ERR表示异常
*************************************************************************************************************
*/
INT8U USB_Get_Interface(USB_DEVICE_REQUEST *sDeviceRequest)
{
INT8U txdat=0; //本设备只有1个接口
#if USB_DEBUG
printf(" USB_Get_Interface() ");
#endif
D12_WriteEndpoint(1,1,&txdat); //发送1个字节
return STATUS_OK;
}
/*
*************************************************************************************************************
- 函数名称 : USB_Set_Interface(USB_DEVICE_REQUEST *sDeviceRequest)
- 函数说明 : 设备选择一个接口.函数中使用了外部变量sDeviceRequest
- 输入参数 : sDeviceRequest:设备请求数据包指针
- 输出参数 : 返回一个状态.STATUS_OK表示正常,STATUS_ERR表示异常
*************************************************************************************************************
*/
INT8U USB_Set_Interface(USB_DEVICE_REQUEST *sDeviceRequest)
{
#if USB_DEBUG
printf(" USB_Set_Interface() ");
#endif
if((*sDeviceRequest).wValue==0 && (*sDeviceRequest).wIndex==0)
D12_WriteEndpoint(1,0,0);
else
{
stall_ep0(); //没有该请求,返加STALL
return STATUS_ERR;
}
return STATUS_OK;
}
/*
*************************************************************************************************************
- 函数名称 : USB_Reserved(USB_DEVICE_REQUEST *sDeviceRequest)
- 函数说明 : USB操作保留函数
- 输入参数 : sDeviceRequest:设备请求数据包指针
- 输出参数 : 返回一个状态.STATUS_OK表示正常,STATUS_ERR表示异常
*************************************************************************************************************
*/
INT8U USB_Reserved(USB_DEVICE_REQUEST *sDeviceRequest)
{
#if USB_DEBUG
printf(" USB_Reserved() ");
#endif
stall_ep0(); //没有该请求,返加STALL
return STATUS_ERR;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -