📄 usbdevprotocol.c
字号:
__usbDevSetAddressEnable((INT8U)(ControlData.DeviceRequest.wValue & DEVICE_ADDRESS_MASK),1);
__usbDevSingleTransmit(0, 0); /* 返回一个空包 */
}
/*********************************************************************************************************
** Function name: __usbDevGetDescriptor
** Descriptions: 获取描述符
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevGetDescriptor (void)
{
INT8U ucDescriptor =(INT8U)(MSB(ControlData.DeviceRequest.wValue)); /* 取得描述符类型 */
if (ucDescriptor == USB_DEVICE_DESCRIPTOR_TYPE) {
/* 获取设备描述符 */
__usbDevCodeTransmit((INT8U *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
} else if (ucDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE) {
if (ControlData.DeviceRequest.wLength > CONFIG_DESCRIPTOR_LENGTH) {
ControlData.DeviceRequest.wLength = CONFIG_DESCRIPTOR_LENGTH;
}
/* 传输描述符内容 */
__usbDevCodeTransmit((INT8U *)&(usb_descr.ConfigDescr),ControlData.DeviceRequest.wLength);
} else {
__usbDevStallEp0(); /* 禁止逻辑端点0 */
}
}
/*********************************************************************************************************
** Function name: __usbDevGetConfiguration
** Descriptions: 获取配置
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevGetConfiguration (void)
{
INT8U ucTmp = (INT8U)bEPPflags.bits.configuration; /* 取得配置值 */
__usbDevSingleTransmit(&ucTmp, 1); /* 传输配置值 */
}
/*********************************************************************************************************
** Function name: __usbDevSetConfiguration
** Descriptions: 设置配置
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevSetConfiguration (void)
{
if (ControlData.DeviceRequest.wValue == 0) {
__usbDevSingleTransmit(0, 0); /* 传输一个空包 */
IRQ_DISABLE();
bEPPflags.bits.configuration = 0; /* 标识设备未配置 */
IRQ_ENABLE();
__usbDevInitConfig(); /* 禁止除0外的所有逻辑端点 */
} else if (ControlData.DeviceRequest.wValue == 1) {
__usbDevSingleTransmit(0, 0); /* 传输一个空包 */
__usbDevInitUnconfig(); /* 禁止除0外的所有逻辑端点 */
__usbDevInitConfig(); /* 使能全部端点 */
IRQ_DISABLE();
bEPPflags.bits.configuration = 1; /* 标识设备已被配置 */
IRQ_ENABLE();
} else {
__usbDevStallEp0(); /* 禁止逻辑端点0 */
}
}
/*********************************************************************************************************
** Function name: __usbDevGetInterface
** Descriptions: 获取接口信息
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevGetInterface (void)
{
INT8U ucTxData = 0; /* 只有一个接口 */
__usbDevSingleTransmit(&ucTxData, 1); /* 传输一个字节 */
}
/*********************************************************************************************************
** Function name: __usbDevSetInterface
** Descriptions: 设置接口信息
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevSetInterface (void)
{
if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0) {
__usbDevSingleTransmit(0, 0); /* 返回一个空包,表示执行成功 */
} else {
__usbDevStallEp0(); /* 禁止逻辑端点0 */
}
}
/*********************************************************************************************************
** Function name: StandardDeviceRequest
** Descriptions: USB 标准设备请求入口地址指针表
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void (*StandardDeviceRequest[]) (void) =
{
__usbDevGetStatus,
__usbDevClearFeature,
__usbDevReserved,
__usbDevSetFeature,
__usbDevReserved,
__usbDevSetAddress,
__usbDevGetDescriptor,
__usbDevReserved,
__usbDevGetConfiguration,
__usbDevSetConfiguration,
__usbDevGetInterface,
__usbDevSetInterface,
__usbDevReserved,
__usbDevReserved,
__usbDevReserved,
__usbDevReserved
};
/*********************************************************************************************************
** Function name: __usbDevEp0RxDone
** Descriptions: 通过端点索引 0 接收数据
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevEp0RxDone (void)
{
INT8U ucEpState = 0;
INT8U ucReadLen = 0;
INT8U req[sizeof(DEVICE_REQUEST)];
ucEpState = __usbDevSelectClrIntEndpoint(0); /* 清除该端点的中断 */
if (ucEpState & USB_SETUPPACKET) { /* 接收到SETUP包 */
ControlData.wLength = 0;
ControlData.wCount = 0;
if(usbDevReadEndpoint(0,req,sizeof(ControlData.DeviceRequest))
!= sizeof(DEVICE_REQUEST)) { /* 从端点 0 读取数据 */
__usbDevSetEndpointStatus(0, 1); /* 禁止控制端点0 */
__usbDevSetEndpointStatus(1, 1); /* 禁止控制端点1 */
bEPPflags.bits.control_state = USB_IDLE; /* 标识空闲状态 */
return;
}
/*
* 接收 SETUP 包成功
*/
ControlData.DeviceRequest.bmRequestType = req[0];
ControlData.DeviceRequest.bRequest = req[1];
ControlData.DeviceRequest.wValue = (INT16U)(req[3] * 256 + req[2]);
ControlData.DeviceRequest.wIndex = (INT16U)(req[5] * 256 + req[4]);
ControlData.DeviceRequest.wLength = (INT16U)(req[7] * 256 + req[6]);
ControlData.wLength = ControlData.DeviceRequest.wLength;
if (ControlData.DeviceRequest.bmRequestType & (INT8U)USB_ENDPOINT_DIRECTION_MASK) {
/* 如果为控制读取 */
bEPPflags.bits.setup_packet = 1;
bEPPflags.bits.control_state = USB_TRANSMIT;
} else { /* 如果为控制写 */
if (ControlData.DeviceRequest.wLength == 0) {
bEPPflags.bits.setup_packet = 1;
bEPPflags.bits.control_state = USB_IDLE;
} else {
if (ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) {
bEPPflags.bits.control_state = USB_IDLE;
__usbDevSetEndpointStatus(0, 1); /* 禁止控制端点0 */
__usbDevSetEndpointStatus(1, 1); /* 禁止控制端点1 */
} else {
bEPPflags.bits.control_state = USB_RECEIVE; /* 标识接收状态 */
}
}
}
}
/*
* 下面为控制接收数据阶段
*/
else if (bEPPflags.bits.control_state == USB_RECEIVE) {
/* 如果当前为接收状态 */
ucReadLen = usbDevReadEndpoint(0,
ControlData.dataBuffer + ControlData.wCount,
EP0_PACKET_SIZE); /* 从端点 0 读取数据 */
ControlData.wCount = (INT16U)(ControlData.wCount+ucReadLen);
if( ucReadLen != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) {
/* 完成接收数据 */
bEPPflags.bits.setup_packet = 1;
bEPPflags.bits.control_state = USB_IDLE;
}
} else {
bEPPflags.bits.control_state = USB_IDLE;
}
}
/*********************************************************************************************************
** Function name: __usbDevEp0TxDone
** Descriptions: 通过物理端点 0 发送数据
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevEp0TxDone(void)
{
INT16S i = (INT16S)(ControlData.wLength - ControlData.wCount);
__usbDevSelectClrIntEndpoint(1); /* 清除端点中断标志 */
if (bEPPflags.bits.control_state != USB_TRANSMIT) {
/* 非发送状态 */
__usbDevSingleTransmit(0, 0);
return; /* 直接返回 */
}
if( i >= EP0_PACKET_SIZE) {
/* 未发送字节数大于64 */
usbDevWriteEndpoint(1,
ControlData.pData + ControlData.wCount,
EP0_PACKET_SIZE);
ControlData.wCount += EP0_PACKET_SIZE;
bEPPflags.bits.control_state = USB_TRANSMIT;
} else if( i != 0) {
/* 发送所有未发送的字节 */
usbDevWriteEndpoint(1, ControlData.pData + ControlData.wCount,(INT8U)i);
ControlData.wCount =(INT16U)(ControlData.wCount+i);
bEPPflags.bits.control_state = USB_IDLE; /* 置状态为等待状态 */
} else if (i == 0) {
usbDevWriteEndpoint(1, 0, 0); /* 完成发送,再发送一个空包 */
bEPPflags.bits.control_state = USB_IDLE;
}
}
/*********************************************************************************************************
** Function name: __usbDevControlHandler
** Descriptions: 控制传输
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevControlHandler (void)
{
INT8U ucRequesttype = 0;
INT8U ucRequestindex = 0;
ucRequesttype = (INT8U)(ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK);
/* 读请求类型码 */
ucRequestindex = (INT8U)(ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK);
if (ucRequesttype == USB_STANDARD_REQUEST)
(*StandardDeviceRequest[ucRequestindex])(); /* 标准请求 */
//else if (ucRequesttype == USB_VENDOR_REQUEST) /* 厂商请求 */
// (*VendorDeviceRequest[ucRequestindex])();
//else if(ucRequesttype == USB_CLASS_REQUEST)
// (*ClassDeviceRequest[ucRequestindex])(); /* 类请求 */
else {
__usbDevStallEp0(); /* 禁止逻辑端点0 */
}
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -