📄 usbd.c
字号:
USBDEBUG_SENDCHAR(ucBuf[i]);
}
} else {
for (i = 2; i < usLen; i++) {
USBDEBUG_SENDCHAR(ucBuf[i]);
}
}
}
}
}
/*********************************************************************************************************
以下为 USB 协议中的标准请求
*********************************************************************************************************/
/*********************************************************************************************************
** Function name: usbGetStatus
** Descriptions: 读取状态请求
** input parameters: ucType 要读取的状态的对象类型,指设备(0),接口(1),或端点(2)
** wIndex 索引,设备号(固定为0),或接口号,或端点号
** output parameters: pucData 接收数据缓冲区,用于存放读取到的状态值
** Returned value: 传输错误码 成功 : USB_ERR_SUCESS, 其余为错误
*********************************************************************************************************/
USB_INT8U usbGetStatus (USB_INT8U ucType , USB_INT16U wIndex, USB_INT8U *pucData)
{
USB_DEV_REQ usbDeviceRequest;
USBDEBUG_SENDSTR("...usbGetStatus\r\n");
usbMemSet(&usbDeviceRequest, 0, sizeof (USB_DEV_REQ)); /* 清零usbDeviceRequest */
usbDeviceRequest.bmRequestType = (USB_INT8U)(__USB_DEVICE_TO_HOST | __USB_STANDARD_REQUEST | ucType);
/* 请求类型 */
usbDeviceRequest.bRequest = __USB_REQUEST_GET_STATUS; /* 请求号 */
usbDeviceRequest.wValue = 0;
usbDeviceRequest.wIndex = wIndex;
usbDeviceRequest.wLength = 2; /* 返回的数据长度固定为2字节 */
return usbStandardReqTransfer(&usbDeviceRequest, pucData); /* 发送请求,并取得设备返回值 */
}
/*********************************************************************************************************
** Function name: usbClearFeature
** Descriptions: 清除特性
** input parameters: ucType 要读取的状态的对象类型,指设备(0),接口(1),或端点(2)
** wValue 特性选择符
** wIndex 索引,设备号(固定为0),或接口号,或端点号
** output parameters: None
** Returned value: 传输错误码 成功 : USB_ERR_SUCESS, 其余为错误
*********************************************************************************************************/
USB_INT8U usbClearFeature (USB_INT8U ucType, USB_INT16U wValue, USB_INT16U wIndex)
{
USB_DEV_REQ usbDeviceRequest;
USBDEBUG_SENDSTR("...usbClearFeature\r\n");
usbMemSet(&usbDeviceRequest, 0, sizeof (USB_DEV_REQ));
usbDeviceRequest.bmRequestType = (USB_INT8U)(__USB_HOST_TO_DEVICE | __USB_STANDARD_REQUEST | ucType);
usbDeviceRequest.bRequest = __USB_REQUEST_CLEAR_FEATURE;
usbDeviceRequest.wValue = wValue;
usbDeviceRequest.wIndex = wIndex;
usbDeviceRequest.wLength = 0;
return usbStandardReqTransfer(&usbDeviceRequest, NULL);
}
/*********************************************************************************************************
** Function name: usbSetFeature
** Descriptions: 设置特性
** input parameters: ucType 要读取的状态的对象类型,指设备(0),接口(1),或端点(2)
** wValue 特性选择符
** wIndex 索引,设备号(固定为0),或接口号,或端点号
** output parameters: None
** Returned value: 传输错误码 成功 : USB_ERR_SUCESS, 其余为错误
*********************************************************************************************************/
USB_INT8U usbSetFeature (USB_INT8U ucType, USB_INT16U wValue, USB_INT16U wIndex)
{
USB_DEV_REQ usbDeviceRequest;
USBDEBUG_SENDSTR("...usbSetFeature\r\n");
usbMemSet(&usbDeviceRequest, 0, sizeof (USB_DEV_REQ));
usbDeviceRequest.bmRequestType = (USB_INT8U)(__USB_HOST_TO_DEVICE | __USB_STANDARD_REQUEST | ucType);
usbDeviceRequest.bRequest = __USB_REQUEST_SET_FEATURE;
usbDeviceRequest.wValue = wValue;
usbDeviceRequest.wIndex = wIndex;
usbDeviceRequest.wLength = 0;
return usbStandardReqTransfer(&usbDeviceRequest, NULL);
}
/*********************************************************************************************************
** Function name: usbSetAddress
** Descriptions: 设置地址
** input parameters: wValue 地址值
** output parameters: None
** Returned value: 传输错误码 成功 : USB_ERR_SUCESS, 其余为错误
*********************************************************************************************************/
USB_INT8U usbSetAddress (USB_INT16U wValue)
{
USB_DEV_REQ usbDeviceRequest;
USBDEBUG_SENDSTR("...usbSetAddress: Address: ");
USBDEBUG_SENDCHAR((USB_INT8U)(wValue + 0x30));
USBDEBUG_SENDSTR("\r\n");
usbMemSet(&usbDeviceRequest, 0, sizeof (USB_DEV_REQ));
usbDeviceRequest.bmRequestType = (USB_INT8U)(__USB_HOST_TO_DEVICE | __USB_STANDARD_REQUEST |
__USB_RECIPIENT_DEVICE);
usbDeviceRequest.bRequest = __USB_REQUEST_SET_ADDRESS;
usbDeviceRequest.wValue = wValue;
usbDeviceRequest.wIndex = 0;
usbDeviceRequest.wLength = 0;
return usbStandardReqTransfer(&usbDeviceRequest, NULL);
}
/*********************************************************************************************************
** Function name: usbGetDescription
** Descriptions: 获取描述符
** input parameters: wValue 类型和索引
** wIndex 0 或语言 ID
** wLength 描述符长度
** output parameters: pucData 接收描述符的缓冲区
** Returned value: 传输错误码 成功 : USB_ERR_SUCESS, 其余为错误
*********************************************************************************************************/
USB_INT8U usbGetDescription (USB_INT16U wValue,
USB_INT16U wIndex,
USB_INT16U wLength,
USB_INT8U *pucData)
{
USB_DEV_REQ usbDeviceRequest;
USBDEBUG_SENDSTR("\r\n...usbGetDescription. wValue: ");
USBDEBUG_SENDCHAR((USB_INT8U)((wValue >> 8) + 0x30));
USBDEBUG_SENDSTR("\r\n");
usbMemSet(&usbDeviceRequest, 0, sizeof (USB_DEV_REQ));
usbDeviceRequest.bmRequestType = (USB_INT8U)(__USB_DEVICE_TO_HOST | __USB_STANDARD_REQUEST |
__USB_RECIPIENT_DEVICE);
usbDeviceRequest.bRequest = __USB_REQUEST_GET_DESCRIPTOR;
usbDeviceRequest.wValue = wValue;
usbDeviceRequest.wIndex = wIndex;
usbDeviceRequest.wLength = wLength;
return usbStandardReqTransfer(&usbDeviceRequest, pucData);
}
/*********************************************************************************************************
** Function name: usbSetDescription
** Descriptions: 设置描述符
** input parameters: wValue 类型和索引
** wIndex 0 或语言ID
** wLength 描述符长度
** output parameters: pucData 接收描述符的缓冲区
** Returned value: 传输错误码 成功 : USB_ERR_SUCESS, 其余为错误
*********************************************************************************************************/
USB_INT8U usbSetDescription (USB_INT16U wValue,
USB_INT16U wIndex,
USB_INT16U wLength,
USB_INT8U *pucData)
{
USBDEBUG_SENDSTR("...usbSetDescription\r\n");
return USB_ERR_SOFT_NOT_SUPPORT;
}
/*********************************************************************************************************
** Function name: usbGetConfiguratiton
** Descriptions: 读取配置值请求
** input parameters: None
** output parameters: pucData 配置值
** Returned value: 传输错误码 成功 : USB_ERR_SUCESS, 其余为错误
*********************************************************************************************************/
USB_INT8U usbGetConfiguratiton (USB_INT8U *pucData)
{
USB_DEV_REQ usbDeviceRequest;
USBDEBUG_SENDSTR("...usbGetConfiguratiton\r\n");
usbMemSet(&usbDeviceRequest, 0, sizeof (USB_DEV_REQ));
usbDeviceRequest.bmRequestType = (USB_INT8U)(__USB_DEVICE_TO_HOST | __USB_STANDARD_REQUEST |
__USB_RECIPIENT_DEVICE);
usbDeviceRequest.bRequest = __USB_REQUEST_GET_CONFIGURATION;
usbDeviceRequest.wValue = 0;
usbDeviceRequest.wIndex = 0;
usbDeviceRequest.wLength = 1;
return usbStandardReqTransfer(&usbDeviceRequest, pucData);
}
/*********************************************************************************************************
** Function name: usbSetConfiguratiton
** Descriptions: 设置配置值请求
** input parameters: None
** output parameters: None
** Returned value: 传输错误码 成功 : USB_ERR_SUCESS, 其余为错误
*********************************************************************************************************/
USB_INT8U usbSetConfiguratiton (void)
{
USB_INT8U ucErrCode;
USB_DEV_REQ usbDeviceRequest;
USBDEBUG_SENDSTR("...usbSetConfiguratiton : ");
usbMemSet(&usbDeviceRequest, 0, sizeof (USB_DEV_REQ));
usbDeviceRequest.bmRequestType = (USB_INT8U)(__USB_HOST_TO_DEVICE | __USB_STANDARD_REQUEST |
__USB_RECIPIENT_DEVICE);
usbDeviceRequest.bRequest = __USB_REQUEST_SET_CONFIGURATION;
usbDeviceRequest.wValue = GusbConfigDescr.bConfigurationValue;
usbDeviceRequest.wIndex = 0;
usbDeviceRequest.wLength = 0;
ucErrCode = usbStandardReqTransfer(&usbDeviceRequest, NULL);
if (ucErrCode) {
USBDEBUG_SENDSTR("...usbSetConfiguratiton failed!");
return ucErrCode;
}
USBDEBUG_SENDCHAR((USB_INT8U)(usbDeviceRequest.wValue + 0x30));
USBDEBUG_SENDSTR("\r\n");
GusbHostFlags.ucConfiged = 1; /* 标记设备已配置 */
return USB_ERR_SUCESS;
}
/*********************************************************************************************************
** Function name: usbGetInterface
** Descriptions: 读取指定接口的设置值,即接口描述符中的bAlternateSetting字段值
** input parameters: wIndex 接口号
** output parameters: pucData 返回的bAlternateSetting字段值
** Returned value: 传输错误码 成功 : USB_ERR_SUCESS, 其余为错误
*********************************************************************************************************/
USB_INT8U usbGetInterface (USB_INT16U wIndex, USB_INT8U *pucData)
{
/*
* 此函数尚未测试
*/
USB_DEV_REQ usbDeviceRequest;
USBDEBUG_SENDSTR("...usbGetInterface\r\n");
usbMemSet(&usbDeviceRequest, 0, sizeof (USB_DEV_REQ));
usbDeviceRequest.bmRequestType = (USB_INT8U)(__USB_DEVICE_TO_HOST | __USB_STANDARD_REQUEST |
__USB_RECIPIENT_DEVICE);
usbDeviceRequest.bRequest = __USB_REQUEST_GET_INTERFACE;
usbDeviceRequest.wValue = 0;
usbDeviceRequest.wIndex = wIndex;
usbDeviceRequest.wLength = 1;
return usbStandardReqTransfer(&usbDeviceRequest, pucData);
}
/*********************************************************************************************************
** Function name: usbSetInterface
** Descriptions: 设置接口请求,与usbGetInterface相对应
** input parameters: wValue 可替换的设置值
** wIndex 接口号
** output parameters: None
** Returned value: 传输错误码 成功 : USB_ERR_SUCESS, 其余为错误
*********************************************************************************************************/
USB_INT8U usbSetInterface (USB_INT16U wValue, USB_INT16U wIndex)
{
/*
* 此函数尚未测试
*/
USB_DEV_REQ usbDeviceRequest;
if (GusbHostFlags.ucConfiged == 0) { /* 仅在USB设备处在配置状态时 */
return FALSE; /* ...才能设置接口 */
}
USBDEBUG_SENDSTR("...usbSetInterface\r\n");
usbMemSet(&usbDeviceRequest, 0, sizeof (USB_DEV_REQ));
usbDeviceRequest.bmRequestType = (USB_INT8U)(__USB_HOST_TO_DEVICE | __USB_STANDARD_REQUEST |
__USB_RECIPIENT_INTERFACE);
usbDeviceRequest.bRequest = __USB_REQUEST_SET_INTERFACE;
usbDeviceRequest.wValue = wValue;
usbDeviceRequest.wIndex = wIndex;
usbDeviceRequest.wLength = 0;
return usbStandardReqTransfer(&usbDeviceRequest, NULL);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -