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

📄 descriptor.c

📁 USB通信测试软件 -- 与S3C44B0的下位机通信的软件. XP驱动------------ PDIUSBD12的PC机驱动程序.USB_Test---------S3C44B0X板的USB固件程
💻 C
📖 第 1 页 / 共 2 页
字号:
	}
	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 + -