⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbchap9.c

📁 Philips PIDUSBP11 驱动代码
💻 C
📖 第 1 页 / 共 2 页
字号:
			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 + -